我是循环矢量化的新手。但是,通过几天的互联网搜索,我找不到简单任务的答案。
我有一个二维数组,第一维有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;
}
答案 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.