我启用了自动向量化。编译代码时,收到以下警告:

info C5002: loop not vectorized due to reason '1203'


MSDN指定


  循环主体包括对数组的非连续访问。


我已经研究了这些链接12以获得帮助,但是没有运气。

这是我的源代码:

for (int row = 0; row < size; ++row) {
    for (int col = 0; col < size; ++col) {
        float tmp = 0;
        for (int i = 0; i < size; ++i) { // This loop generates the warning above
            tmp += matrixA[row][i] * matrixB[i][col];
        }
        matrixResult[row][col] = tmp;
    }
}


欢迎任何帮助。

最佳答案

2D数组存储为单个连续的内存块,因此3x2元素2D数组实际上是6个元素首尾相连地布置。

[]索引运算符仅计算要访问的元素。

因此,这里发生的是从元素1到元素6依次访问了matrixA(即A1,A2,A3,B1,B2,B3)。

但是,正在“随机”访问matrixB,A1,B1,A2,B2等映射到实际存储中,作为访问元素依次为1、4、2、5。

您不能更改访问matrixB元素的顺序,但可以对其进行转置,以使元素按正确的顺序顺序访问。显然,如果只进行一次乘法,那么重新计算matrixBs的顺序可能不值得,但是如果重复执行此计算,那么付出的努力将是非常值得的。

10-06 01:03