微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C5002 1204 自动向量化器原因代码是什么意思?

如何解决C5002 1204 自动向量化器原因代码是什么意思?

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

#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 由于原因:“1204”

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

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

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

解决方法

这个原因代码意味着循环嵌套太深

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?