【发布时间】:2014-12-18 19:17:20
【问题描述】:
我想将一个 C 数组数据复制到另一个,但需要在两者之间进行计算(即不仅仅是将相同的内容从一个复制到另一个,而是对数据进行修改):
int aaa;
int src[ARRAY_SIZE];
int dest[ARRAY_SIZE];
//fill src with data
for (aaa = 0; aaa < ARRAY_SIZE; aaa++)
{
dest[aaa] = src[aaa] * 30;
}
这是在大小为 520 或更大的缓冲区中完成的,因此 for 循环相当可观。
有什么方法可以提高编码方面的性能吗?
我对该主题进行了一些研究,但我找不到关于这个案例的任何具体内容,只有简单的缓冲区复制到缓冲区(例如:here、here 和 here)。
环境:使用嵌入式 Linux 的 ARM GCC。不过,上面的特定代码用于在专用处理器内运行的 C 项目中,用于 DSP 计算。通用处理器是 OMAP L138(DSP 处理器包含在 L138 中)。
【问题讨论】:
-
OpenMP/线程可以加速它的因素。
-
对于这样一个简单的情况,任何半体面的编译器都应该为您优化它。它将展开循环并使用 SIMD。除此之外是核心级别的并行化。例如上面提到的 OpenMP。
-
@EugeneSh。这是一个简单的复制和乘法循环。我认为 Duff 的设备只会混淆编译器,并减慢实际执行速度。
-
如果 ARRAY_SIZE 是固定的,您可以尝试手动展开循环。我假设你已经在编译器中打开了优化。
-
有很多可能的优化,具有不同程度的可移植性(例如 SIMD 可能是一个选项)和复杂性(尽管使用多核不太可能为 520 个整数带来回报)。有些,比如简单的展开,编译器可能会为你做。然而,对所有平台/编译器组合上所有可能的优化的调查过于广泛。如果你有一个实际的性能问题,也许你可以描述你的约束、平台和编译器。
标签: c arrays performance memory-management copy