我有代码:
float *mu_x_ptr;
__m128 *tmp;
__m128 *mm_mu_x;
mu_x_ptr = _aligned_malloc(4*sizeof(float), 16);
mm_mu_x = (__m128*) mu_x_ptr;
for(row = 0; row < ker_size; row++) {
tmp = (__m128*) &original[row*width + col];
*mm_mu_x = _mm_add_ps(*tmp, *mm_mu_x);
}
从这里我得到:
First-chance exception at 0x00ad192e in SSIM.exe: 0xC0000005: Access violation reading location 0x00000000.
Unhandled exception at 0x00ad192e in SSIM.exe: 0xC0000005: Access violation reading location 0x00000000.
The program '[4452] SSIM.exe: Native' has exited with code -1073741819 (0xc0000005)
运行程序时,错误发生在 _mm_add_ps 行。
original 使用 _aligned_malloc(..., 16); 以及传递给函数,所以就我对 sse 的理解而言,它不应该是不对齐的。
我想知道是否有人可以看到为什么会崩溃,因为我不明白为什么。
编辑:宽度和 col 始终是 4 的倍数。 Col 是 0 或 4,而 width 始终是 4 的倍数。
EDIT2:看起来我的原始数组未对齐。不会:
function(float *original);
.
.
.
orignal = _aligned_malloc(width*height*sizeof(float), 16);
function(original);
_aligned_free(original);
}
确保原件在函数内部对齐?
Edit3:这真的很奇怪。当我做:
float *orig;
orig = _aligned_malloc(width*height*sizeof(float), 16);
assert(isAligned(orig));
断言失败
#define isAligned(p) (((unsigned long)(p)) & 15 == 0)