通过int在C中乘以和添加到int数组的最快方法?

时间:2015-05-18 14:35:59

标签: c arrays parallel-processing pthreads

我在使用C语言编程时学习了一些关于pthread和性能的知识,我想知道为数组中的所有元素添加单个int的最佳方法是什么一个大约有5000个元素的大型元素)以及将int乘以数组中所有元素的最佳方法。

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

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

2 个答案:

答案 0 :(得分:5)

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

E.g。向数组的所有元素添加值:

#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内在函数明确地编写它。

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

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

答案 1 :(得分:0)

您必须使用分而治之的方法拆分数组。创建多个线程并为每个线程提供数组的一部分。 因此创建5个线程并为线程提供元素0..999 1000..1999 ...

您必须使用多个线程来解决您的问题,否则将无法获得性能提升。

旁注:在我看来,数组太小,无法显示多线程实现相对于直接实现的任何改进。