【发布时间】:2017-04-20 07:25:07
【问题描述】:
我启用了自动矢量化。当我编译代码时,我收到以下警告:
info C5002: loop not vectorized due to reason '1203'
MSDN 指定
循环体包括对数组的非连续访问。
这是我的源代码:
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;
}
}
欢迎任何帮助。
【问题讨论】:
-
C++ 二维数组在内存中排列为一维数组 row1、row2 等。这个表达式
matrixB[i][col]导致索引在数组中跳转。这个表达式matrixA[row][i]没有。 -
您的矩阵是如何定义/分配的?如果他们是
double **,那么由于缓存位置问题,您的性能也会很差。 -
先转置 B(并交换索引),以便获得连续访问。
-
只是为了澄清一下:有一些答案(和 MSFT 编译器消息有点暗示相同)是不可能矢量化(使用编译器)给定循环以防万一或不同的访问顺序,并且由于不连续(非单位)步幅。这基本上是错误的。可以按原样对代码进行矢量化,但是(a)在许多平台上它可能是无利可图的(可能会变慢),特别是没有有效的收集指令导入,(b)某些编译器中的一些矢量化器可能是无法矢量化此类代码,但 gcc/icc 应该能够使用 omp4.x 显式矢量化它
-
但是我上面的评论自然只是为了完整性,并没有改变关键信息,即:在这段代码中保持内存访问是低效的。
标签: c++ matrix-multiplication visual-studio-2017 simd auto-vectorization