动态对齐的多维数组不被GCC编译器视为对齐

时间:2014-11-28 06:12:06

标签: c++ arrays memory-alignment

我是循环矢量化的新手。但是,通过几天的互联网搜索,我找不到简单任务的答案。

我有一个二维数组,第一维有4个双打。我想要对这4个元素进行矢量化。如果我在下面的代码中使用静态数组gas [32768] [4],并使用

编译代码
  

g ++ -O2 -ftree-vectorize -ftree-vectorizer-verbose = 7 stack.cpp

显示

  

vect_model_load_cost:align。

用于底部k循环。但是,如果我使用动态数组,如下所示,它显示

  

矢量化未对齐的访问

但是,我认为我的动态阵列确实是对齐的。 我想知道如何强制编译器知道数组确实是对齐的。

我也尝试过结构数组而不是二维数组。同样,如果它是静态数组,那就没问题。 但如果它是使用> new动态分配的结构数组,则编译器将无法识别对齐。

#include <iostream>
#include <time.h>
#include <new>
#include <malloc.h>
#include <stdio.h>

int main()
{
   clock_t t;
   double temp[4];
   int ng=32768;
   int i, j, k;

   double **gas;
   gas = (double **)memalign(__BIGGEST_ALIGNMENT__,32768*sizeof(double*));
   gas[0] = (double *)memalign(__BIGGEST_ALIGNMENT__,32768*4*sizeof(double));
   for (i=0; i<32768; i++){
     gas[i] = (double *)((unsigned char *)gas[0] + i*4*sizeof(double));
   }

/*
 replace above 7 lines with static assignment: double gas[32768][4]; then the compiler recoganize that the data are aligned
*/

   for (i=0; i<ng; i++){
     for (k=0; k<4; k++){
       gas[i][k]=i*1.0;
     }
   }
   for (j=0; j<10000; j++){
     for (k=0; k<4; k++){
        temp[k]=gas[j][k];
        temp[k]+=gas[j+1][k];
        temp[k]+=gas[j+2][k];
        temp[k]+=gas[j+13][k];
        temp[k]+=gas[j+14][k];
        temp[k]+=gas[j+15][k];
        temp[k]+=gas[j+16][k];
     }
   }
    std::cout<<temp[0]<<" "<<temp[1]<<" "<<temp[2]<<" "<<temp[3]<<std::endl;
}

1 个答案:

答案 0 :(得分:0)

如果使用__builtin_assume_aligned,它是否有效?见https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html。您可以使用它来告诉编译器您的指针已经充分对齐。例如


double *tmp = memalign (16, some_size);
double *ptr = __builtin_assume_aligned(tmp, 16);
// Now *ptr points to tmp and the compiler should be able to assume that *ptr 
// is 16 byte aligned.