C ++ Auto-Vectorize矩阵乘法循环

时间:2015-11-27 22:03:15

标签: c++ matrix vector vectorization

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

public List<RoomData> getRoomDataList() {
    return list;
}

我已阅读MSDN提供的http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html#parseBoolean-java.lang.String-]资源说明:

  

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

     

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

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

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

非常感谢任何见解。

1 个答案:

答案 0 :(得分:2)

循环携带依赖性在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]有更多的read-after-write,应该可以帮助vectorizer做得更好。