c - 用 int 乘以并添加到 C 中的 int 数组的最快方法?

标签 c arrays parallel-processing pthreads

我在用 C 编程时学习了一些关于 pthreads 和性能的知识,我想知道最好的方法是将单个 int 添加到数组中的所有元素(相当包含大约 5000 个元素的大数组)以及将 int 与数组中的所有元素相乘的最佳方法。

我尝试并行执行此操作,但没有太大改进。我的并行方法是传递一个 struct,其中包含要加/乘的值以及指向数组的指针。我将其作为参数传递给 pthread_create。在被调用的函数中,我将给定值与数组中的所有元素相加/相乘。

我觉得好像有更好的方法可以将一个数字乘以或添加到数组中的所有 5000 个(或更多)元素。我也听说过那些 SIMD 命令。这对这种情况有帮助吗?

最佳答案

如果您可以使用 x86 CPU,那么您可以使用 Intel 的 SSE SIMD 扩展一次处理 4 个元素。

例如向数组的所有元素添加一个值:

#include "emmintrin.h"

// ...

const __m128i vinc = _mm_set1_epi32(inc);  // init vector containing value to add
for (int i = 0; i < N; i += 4)
{
    __m128i v = _mm_loadu_si128(&a[i]);    // load 4 elements from array a
    v = _mm_add_epi32(v, vinc);            // add increment to each element
    _mm_storeu_si128(&a[i], v);            // save 4 modified elements back to a
}

在较新的 CPU 上,例如Haswell,您可以使用 AVX2 以类似的方式每次迭代处理 8 个元素。

请注意,一些编译器已经为您向量化此代码,例如gcc、clang、ICC,甚至是最新版本的 Visual Studio(如果天气好的话),因此您甚至可能不需要使用 SSE 内在函数对此进行显式编码。

还有优化的库可以为您执行此类操作,例如Intel 的 IPP,或 Apple 的 Accelerate 框架,以及许多其他开源库。

当然,关于过早优化的常见警告也适用:您应该首先对现有代码进行基准测试,并确定它是性能瓶颈,然后再尝试对其进行优化。

关于c - 用 int 乘以并添加到 C 中的 int 数组的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30306064/

相关文章:

java - 最大独立 JVM 进程数

c - 如何默认定义所有 winapi 以将字符串视为 UNICODE?

c - C 程序中的字长频率

使用 strcmp 比较 C 中的字符串

c - 无法理解为什么在某些特定测试用例上它显示段错误,而在其他测试用例上它被成功接受

java - 返回 null 和 0.0 的文本文件

java - 在多核集群节点上并行运行 java 应用程序

ruby-on-rails - 按 bool 值分组但在 ruby​​ on rails 中更改键

javascript - 对对象数组内的数组进行排序

r - 如何让R使用计算机的所有核心?