C++自动矢量化矩阵乘法循环

C++ Auto-Vectorize Matrix Multiplication loop

本文关键字:循环 矢量化 C++      更新时间:2023-10-16

在编译启用了自动矢量化和自动并行化的基本矩阵矩阵乘法源代码时,我在控制台中收到以下警告:

C5002: loop not vectorized due to reason '1200'
C5012: loop not parallelized due to reason'1000'

我已经阅读了MSDN提供的这个资源,其中写道:

原因代码1200:循环包含阻止向量化的循环携带的数据依赖项。循环的不同迭代相互干扰,使得对循环进行矢量化将产生错误的答案,并且自动矢量化器不能向自己证明不存在这种数据依赖性。

原因代码1000:编译器在循环体中检测到数据依赖项。

我不确定我的循环中是什么导致了问题。这是我的源代码的相关部分。

// int** A, int** B, int** result, const int dimension
for (int i = 0; i < dimension; ++i) {
    for (int j = 0; j < dimension; ++j) {
        for (int k = 0; k < dimension; ++k) {
            result[i][j] = result[i][j] + A[i][k] * B[k][j];
        }   
    }
}

如有任何见解,我们将不胜感激。

循环携带的依赖关系是在result[i][j]上。

你的问题的解决方案是在总结结果时使用一个临时变量,并在最内部的循环之外进行更新,如下所示:

for (int i = 0; i < dimension; ++i) {
    for (int j = 0; j < dimension; ++j) {
        auto tmp = 0;
        for (int k = 0; k < dimension; ++k) {
            tmp += A[i][k] * B[k][j];
        }
        result[i][j] = tmp;
    }
}

这将消除依赖性(因为result[i][j]的写入后有更多的读取,应该有助于矢量器做得更好。