我正在优化一个应用程序而且我一直陷入困境。我只想对一个循环进行矢量化,这是一个嵌套循环。这个循环到底做的只是将两个数组的值相乘并加起来。然后,找出结果中的最小值。原始代码如下所示。
float min = 0xffffffff;
for(i=0; i<limit_x; i++){
for(j=0; j<limit_y; j++){
for(k=0; k<limit_z; k++){
temp += x[i][k] * y[j][k];
}
if(min > temp){
min = temp;
}
}
}
当然,矢量化发生在最内层循环,并且保证x和y通过矢量化寄存器宽度对齐。在这段代码中,我认为矢量化不是连续的,因为比较和设置最小值。所以我修改了这个代码,如下所示。
float min = 0xffffffff;
for(i=0; i<limit_x; i++){
for(j=0; j<limit_y; j++){
for(k=0; k<limit_z; k++){
temps[i] += x[i][k] * y[i][k];
}
}
}
for(i=0; i<limit_x; i++){
if(min > temps[i]){
min = temps[i];
}
}
我期望这样做可以提高性能,因为它会继续对整个数据进行矢量化乘法,而不会因为比较和获得最小值而受到干扰。但执行时间与我的预期不同。前一个稍微好于新代码。
有没有人可以解释原因?