【发布时间】:2018-08-19 15:35:46
【问题描述】:
我对代码优化技术真的很陌生,我目前正在尝试优化一段代码的循环部分,这应该很容易。
for (int i = 0; i < N; i++)
{
array[i] = 0.0f;
array2[i] = 0.0f;
array3[i] = 0.0f;
}
我尝试如下实现矢量化和线程化:
int i;
int loop_unroll = (int) (N/4)*4;
#pragma omp parallel for shared(array,array2,array3)
for(int i = 0; i < loop_unroll; i+=4)
{
__m128 array_vector = _mm_load_ps(array+i);
array_vector = _mm_set1_ps(0.0f);
_mm_store_ps(array+i, array_vector);
_mm_store_ps(array2+i, array_vector);
_mm_store_ps(array3+i, array_vector);
}
for(;i<N;i++)
{
array[i] = 0.0f;
array2[i] = 0.0f;
array3[i] = 0.0f;
}
不管输入大小 N 我运行它,“优化”版本总是需要更长的时间。 我认为这是由于与设置线程和寄存器相关的开销,但是对于在程序变得太慢而无法使用之前的最大 N,更快的代码仍然不能减轻开销。
这让我怀疑所使用的优化技术是否实施不正确?
【问题讨论】:
-
为什么一定要同时设置3个数组?
-
这三个数组用于稍后在程序中计算力。这是第一步,只需将数组清零,以便稍后在程序中使用它们。为什么同时执行它们会对性能产生任何影响?肯定把它分成 3 个单独的 for 循环会更没有效率吗?
-
这段代码会破坏优化器所做的工作。它不会使用 for 循环。请务必查看 -O2 生成的机器码。
-
Somewhat related。我不知道。
-
@HansPassant 道歉,忘了提到优化器没有被用于编译代码,所有基于编译器的优化都被禁用了。但是,如果我要激活它,我将如何查看 -O2 输出呢?
标签: multithreading performance optimization openmp intrinsics