在高性能计算中,数组C [] = A []*B []

xis*_*xis 1 c++ arrays performance

我相信通常在C++中使用这样的代码

for(size_t i=0;i<ARRAY_SIZE;++i)
    A[i]=B[i]*C[i];
Run Code Online (Sandbox Code Playgroud)

一个普遍提倡的变更是:

double* pA=A,pB=B,pC=C;
for(size_t i=0;i<ARRAY_SIZE;++i)
    *pA++=(*pB++)*(*pC++);
Run Code Online (Sandbox Code Playgroud)

我想知道的是,改进此代码的最佳方法,因为IMO需要考虑以下事项:

  1. CPU缓存.CPU如何填充缓存以获得最佳命中率?
  2. 我想SSE可以改善这个吗?
  3. 另一件事是,如果代码可以并行化怎么办?例如,使用OpenMP.在这种情况下,指针技巧可能不可用.

任何建议,将不胜感激!

Cub*_*bbi 5

我的g ++ 4.5.2为两个循环生成完全相同的代码(修复了错误double *pA=A, *pB=B, *pC=C;,它是

.L3:
    movapd  B(%rax), %xmm0
    mulpd   C(%rax), %xmm0
    movapd  %xmm0, A(%rax)
    addq    $16, %rax
    cmpq    $80000, %rax
    jne .L3
Run Code Online (Sandbox Code Playgroud)

(我的ARRAY_SIZE是10000)

编译器的作者已经知道了这些技巧.但是,OpenMP和其他并发解决方案值得研究.