我相信在C++中有这样的代码是很平常的
for(size_t i=0;i<ARRAY_SIZE;++i)
A[i]=B[i]*C[i];一个普遍主张的交替是:
double* pA=A,pB=B,pC=C;
for(size_t i=0;i<ARRAY_SIZE;++i)
*pA++=(*pB++)*(*pC++);我想知道的是,改进这一守则的最佳方法,因为海事组织需要考虑以下几点:
如有任何建议,将不胜感激!
发布于 2011-06-08 05:21:14
性能的规则是
对于现代处理器来说更是如此。关于你的问题:
发布于 2011-06-08 05:09:07
我的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(我的ARRAY_SIZE是10000)
编译器作者已经知道这些技巧了。不过,OpenMP和其他并发解决方案值得研究。
发布于 2011-06-08 05:14:56
第一种形式正是编译器将识别和优化的结构类型,几乎可以肯定地自动发出SSE指令。
对于这类琐碎的内部循环,缓存效果是不相关的,因为您正在遍历所有内容。如果您有嵌套循环或一系列操作(如g(f(A,B),C),那么您可能会尝试安排多次访问小内存块,以使其更易于缓存。
不要手动展开循环。如果这是一个好主意(它可能不在现代CPU上),那么编译器也会这样做的。
如果循环很大,而且内部的操作非常复杂,以至于您还没有被限制在内存中,那么OpenMP可能会有所帮助。
通常,以自然和直接的方式编写代码,因为这是优化编译器最有可能理解的。
https://stackoverflow.com/questions/6274390
复制相似问题