首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当阵列为函数参数时,Gcc自矢量化矩阵中的奇异行为

当阵列为函数参数时,Gcc自矢量化矩阵中的奇异行为
EN

Stack Overflow用户
提问于 2019-06-20 09:14:19
回答 1查看 62关注 0票数 0

我用不同的优化级别(为了教学目的)基准不同的矩阵乘法形式,我在gcc自动矢量化中发现了一种奇怪的行为。当数组是参数时,它无法向量化(请参阅mxmp),但是当数组是全局变量时,它能够向矢量化(参见mxmg)。

gcc版本7.4.0 (Ubuntu 7.4.0-1 ubuntu1~18.04.1),但行为与较早的gcc版本相同

编译选项: gcc -O3 -mavx2 -mfma

代码语言:javascript
复制
#define N 1024
float A[N][N], B[N][N], C[N][N];

void mxmp(float A[N][N], float B[N][N], float C[N][N]) {
  int i,j,k;
  for (i=0; i<N; i++)
    for (j=0; j<N; j++)
      for (k=0; k<N; k++)
        C[i][j] = C[i][j] + A[i][k] * B[k][j];
}

void mxmg() {
  int i,j,k;
  for (i=0; i<N; i++)
    for (j=0; j<N; j++)
      for (k=0; k<N; k++)
        C[i][j] = C[i][j] + A[i][k] * B[k][j];
}

main(){
  mxmg();
  mxmp(A, B, C);
}

我预计编译器在这两个函数中都会执行相同的操作,但是mxmp所需的执行时间大约是mxmg的10倍。研究组装代码时,gcc能够自动对mxmg (当数组是全局变量)进行自动矢量化,但却无法将mxmp (其中的数组是参数)向量化。

对kij表单进行了同样的尝试,它能够将这两个函数矢量化。

我需要帮助,以了解为什么gcc有这种行为。以及如何帮助gcc (语用,编译选项,分配,.)若要正确地向量化mxmp函数,请执行以下操作。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-20 11:45:25

当数组是全局的时,编译器可以很容易地看到它们是不相交的内存区域。当它们是函数参数时,您可以调用mxmp(A,A,A),因此它必须假设向C写入可能修改A或B,这可能会影响以后的迭代,并使矢量化复杂化。当然,在特定情况下,编译器可以内联或做其他事情来了解它.

您可以显式地指定缺少与restrict的混叠。

代码语言:javascript
复制
void mxmp(float A[restrict N][N], float B[restrict N][N], float C[restrict N][N]) {
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56682708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档