许多矢量化具有较小的数据块而较少的矢量化具有较大的数据块

时间:2015-08-10 21:32:32

标签: c loops vector vectorization nested-loops

我正在优化一个应用程序而且我一直陷入困境。我只想对一个循环进行矢量化,这是一个嵌套循环。这个循环到底做的只是将两个数组的值相乘并加起来。然后,找出结果中的最小值。原始代码如下所示。

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];
    }
}

我期望这样做可以提高性能,因为它会继续对整个数据进行矢量化乘法,而不会因为比较和获得最小值而受到干扰。但执行时间与我的预期不同。前一个稍微好于新代码。

有没有人可以解释原因?

0 个答案:

没有答案