C5002 1204 自动矢量化原因码是啥意思?

Posted

技术标签:

【中文标题】C5002 1204 自动矢量化原因码是啥意思?【英文标题】:What does C5002 1204 auto-vectorizer reason code mean?C5002 1204 自动矢量化原因码是什么意思? 【发布时间】:2021-02-16 20:48:05 【问题描述】:

我是一名学生,正在学习矢量化技术。我正在尝试使编译器矢量化一个将两个矩阵相乘的函数(每个矩阵由大小相等的矩阵元素组成)。代码如下:

#define f_dim1 2000
#define f_dim2 240
#define s_dim1 240
#define s_dim2 2000

#define i_dim1 4
#define i_dim2 4

void automaticallyBuilt(float* firstMatrix, float* secondMatrix, float* result) 
    for (int i = 0; i < f_dim2; i++)  // rows in frist matrix
        for (int j = 0; j < s_dim1; j++)  // columns in second matrix
            for (int o = 0; o < f_dim1; o++)  // row element of first matrix = column element of second
                for (int k = 0; k < i_dim2; k++)  // rows in inner matrix
                    for (int l = 0; l < i_dim1; l++)  // columns in inner matrix
                        for (int h = 0; h < i_dim2; h++)  // row element of inner = column element of inner
                            *(result + i*s_dim1*i_dim2*i_dim1 + j*i_dim2*i_dim1 + k*i_dim1 + l) +=
                                *(firstMatrix + i*f_dim1*i_dim2*i_dim1 + o*i_dim2*i_dim1 + k*i_dim1 + h) *
                                *(secondMatrix + o*s_dim1*i_dim2*i_dim1 + j*i_dim2*i_dim1 + h*i_dim1 + l);
                            // smth like result[i][j][k][l] += firstMatrix[i][o][k][h] * secondMatrix[o][j][h][l];
                        
                    
                
            
        
    

为了让编译器对其进行矢量化,我将这段代码修改如下:

#define f_dim1 2000
#define f_dim2 240
#define s_dim1 240
#define s_dim2 2000

#define i_dim1 4
#define i_dim2 4

void automaticallyVectorized(float* firstMatrix, float*  secondMatrix, float* result) 
    for (int i = 0; i < f_dim2; i++)  // rows in frist matrix
        for (int o = 0; o < f_dim1; o++)  // row element of first matrix = column element of second
            for (int j = 0; j < s_dim1; j++)  // columns in second matrix
                for (int k = 0; k < i_dim2; k++)  // rows in inner matrix
                    for (int h = 0; h < i_dim2; h++)  // row element of inner = column element of inner
                        float firstMatrixInnerRowElement = *(firstMatrix + i*f_dim1*i_dim2*i_dim1 + o* i_dim2*i_dim1 + k*i_dim1 + h);
                        float* resultInnerRow = result + i*s_dim1*i_dim2*i_dim1 + j*i_dim2*i_dim1 + k*i_dim1;
                        float* secondMatrixInnerColumnElementRow = secondMatrix + o*s_dim1*i_dim2*i_dim1 + j*i_dim2*i_dim1 + h*i_dim1;
                        for (int l = 0; l < i_dim1; l++)  // columns in inner matrix
                            resultInnerRow[l] += firstMatrixInnerRowElement * secondMatrixInnerColumnElementRow[l];
                        
                    
                
            
        
    

在编译期间,编译器发出以下消息:

code.cpp(161) : info C5002: Loop not vectorized due to reason: "1204"

没有提到代码 1204 here。此外,我还没有在谷歌上找到任何关于它的信息。 我尝试使用 __restrict 修饰符但没有运气。

我使用 Visual Studio 2019,但我尝试使用 VS 2017 构建它,结果相同。

谁能解释一下这个原因码是什么意思?我不相信以前没有人遇到过这个问题。

【问题讨论】:

在您链接的 Microsoft 文档页面底部,单击 此页面 的反馈,并告诉他们1204 的遗漏。 @Eljay 感谢您的建议!我会在他们回答后立即在此处发布 github 问题的链接 GCC 或 clang 是否对其进行矢量化?他们的警告消息 (llvm.org/docs/Vectorizers.html#diagnostics) 可能更具描述性,并且至少是独立的,从不使用您应该在其他地方查找的数字代码。 (godbolt.org/z/4arMq5 显示 clang does 在所有 3 个指针上使用 __restrict 进行矢量化,但它不适用于您的源,说“需要运行时指针检查”。显然它选择不生成检查重叠与否的 asm,并在循环的 2 个版本之间进行选择。GCC 和 clang 有时会这样做。) @PeterCordes 感谢您的评论!我发现godbolt.org 是一个非常有趣且有用的工具。我会考虑开始使用 MSVC 以外的其他编译器 【参考方案1】:

这个原因码说明循环嵌套太深

正如 Eljay 所建议的,我使用文档页面底部的链接在 github 上发布了一个问题。这是答案的link。

【讨论】:

很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。

以上是关于C5002 1204 自动矢量化原因码是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Domain=kCFErrorDomainCFNetwork Code=303 这个错误码是啥意思?

400 BAD request HTTP错误码是啥意思?

perl 解释器的状态码是啥意思?

校验MD5码是啥意思呢?

pin是啥意思用法

wifi网络电话显示透传自定义错误码是啥意思