c语言指针对齐,告诉C指针数据是16字节对齐
我用靜態數組寫了一些代碼,它的向量化很好。
float data[1024] __attribute__((aligned(16)));
我想使數組動態分配。我試著做這樣的事情:
float *data = (float*) aligned_alloc(16, size*sizeof(float));
但編譯器(GCC 4.9.2),不再可以向量化代碼。我假設這是因為不知道指針數據是16字節對齊。我正在收到以下消息:
note: Unknown alignment for access: *_43
在使用數據之前,我已經嘗試添加了這一行,但似乎沒有做任何事情:
data = (float*) __builtin_assume_aligned(data, 16);
使用不同的變量和限制沒有幫助:
float* __restrict__ align_data = (float*) __builtin_assume_aligned(data,16);
例:
#include
#include
#include
#define SIZE 1024
#define DYNAMIC 0
#define A16 __attribute__((aligned(16)))
#define DA16 (float*) aligned_alloc(16, size*sizeof(float))
class Test{
public:
int size;
#if DYNAMIC
float *pos;
float *vel;
float *alpha;
float *k_inv;
float *osc_sin;
float *osc_cos;
float *dosc1;
float *dosc2;
#else
float pos[SIZE] A16;
float vel[SIZE] A16;
float alpha[SIZE] A16;
float k_inv[SIZE] A16;
float osc_sin[SIZE] A16;
float osc_cos[SIZE] A16;
float dosc1[SIZE] A16;
float dosc2[SIZE] A16;
#endif
Test(int arr_size){
size = arr_size;
#if DYNAMIC
pos = DA16;
vel = DA16;
alpha = DA16;
k_inv = DA16;
osc_sin = DA16;
osc_cos = DA16;
dosc1 = DA16;
dosc2 = DA16;
#endif
}
void compute(){
for (int i=0; i
float lambda = .67891*k_inv[i],
omega = (.89 - 2*alpha[i]*lambda)*k_inv[i],
diff2 = pos[i] - omega,
diff1 = vel[i] - lambda + alpha[i]*diff2;
pos[i] = osc_sin[i]*diff1 + osc_cos[i]*diff2 + lambda*.008 + omega;
vel[i] = dosc1[i]*diff1 - dosc2[i]*diff2 + lambda;
}
}
};
int main(int argc, char** argv){
Test t(SIZE);
t.compute();
std::cout << t.pos[10] << std::endl;
std::cout << t.vel[10] << std::endl;
}
這是我如何編譯:
g++ -o test test.cpp -O3 -march=native -ffast-math -fopt-info-optimized
當DYNAMIC設置為0時,它輸出:
test.cpp:46:4: note: loop vectorized
但是當它設置為1時,它不輸出任何內容。
總結
以上是生活随笔為你收集整理的c语言指针对齐,告诉C指针数据是16字节对齐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智能系统课件@丛爽老师-中国科学技术大学
- 下一篇: 中科大光电器件课件