在试图弄清楚我的代码的内部循环是否遇到了硬件设计障碍或对我的部分障碍缺乏理解。还有更多内容,但我能想到的最简单的问题如下:
如果我有以下代码:
float px[32768],py[32768],pz[32768];
float xref, yref, zref, deltax, deltay, deltaz;
initialize_with_random(px);
initialize_with_random(py);
initialize_with_random(pz);
for(i=0;i<32768-1;i++) {
xref=px[i];
yref=py[i];
zref=pz[i];
for(j=0;j<32768-1;j++ {
deltx=xref-px[j];
delty=yref-py[j];
deltz=zref-pz[j];
} }
在我完全控制代码(汇编、内在函数等)但无法控制架构以外的运行时环境(即它是一个多用户环境,所以我无法对操作系统内核如何为我的特定进程分配时间做任何事情)。
现在我看到我的代码速度提高了 3 倍,而我本以为使用 SSE 会给我带来比 3 倍加速所指示的更多的向量深度(大概 3 倍加速告诉我我有 4 倍的最大理论值)吞吐量)。(我尝试过让 deltx/delty/deltz 成为数组,以防编译器不够聪明而无法自动提升它们,但我仍然看到只有 3 倍的速度。)我正在使用英特尔 C 编译器用于矢量化的适当编译器标志,但显然没有内在函数。