试图找出我的代码的内部循环是否遇到硬件设计障碍,或者对我的部分障碍缺乏理解。还有一点,但我能想到的最简单的问题是:
如果我有以下代码:
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];
} }
在我完全控制代码的情况下,我可以在SSE指令上看到什么类型的最大理论速度(程序集、子进程),但除了体系结构(即,这是一个多用户环境,所以我不能做任何关于操作系统内核如何为我的特定进程分配时间的事情)之外,对运行时环境没有任何控制。
现在我看到我的代码的速度为3X,当我想使用SSE会给我比矢量3X提速更多的向量深度(大概是3X的速度告诉我,我有一个最大的4倍理论吞吐量)。(我尝试过让deltx/delty/deltz成为数组,以防编译器不够聪明,无法自动升级它们,但我仍然看到只有3倍的速度提高。)我正在使用带有适当编译器标志的英特尔C编译器进行矢量化,但显然没有内部函数。
最佳答案
这取决于CPU。但理论上的最大值不会超过4倍,我不知道一个CPU每时钟周期能执行多条SSE指令,也就是说它每时钟周期最多能计算4个值。
大多数CPU的每个周期至少可以执行一个浮点标量指令,因此在本例中,理论上的最大加速为4倍。
但是,您必须查找正在运行的cpu的特定指令吞吐量。
不过,3倍的实际加速效果还是不错的。