我有代码:
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的理解而言,它不应该是未对齐的。
我想知道有没有人知道为什么它会崩溃,因为我不知道为什么。
编辑:宽度和列始终是4的倍数。列是0或4,而宽度始终是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)发布于 2010-08-03 16:49:30
我认为你需要使用
__m128 tmp = _mm_load_ps( &original[row * width + col] );而不是
tmp = (__m128 *)&original[row * width + col];编辑:如果你得到的访问冲突错误是在某个偏移量之后,那么你的步幅可能没有对齐。无论采用哪种方式,都会分配__m128元素(表示4个浮点数)。这会处理对齐问题。
此外,您还可以通过消除算术行*宽度+列获得一些额外的性能。确定你的步幅并相应地增加你的指针。
发布于 2010-08-03 16:30:15
除非width和col具有合适的值,否则tmp将不会对齐。理想情况下,width和col都应该是4的倍数。
您可能希望添加一些断言来检查对齐情况,例如
#define IsAligned(p) ((((unsigned long)(p)) & 15) == 0)
float *mu_x_ptr;
__m128 *tmp;
__m128 *mm_mu_x;
assert(original != NULL && IsAligned(original));
mu_x_ptr = _aligned_malloc(4 * sizeof(float), 16);
assert(mu_x_ptr != NULL && IsAligned(mu_x_ptr));
mm_mu_x = (__m128 *)mu_x_ptr;
assert(IsAligned(mm_mu_x));
for (row = 0; row < ker_size; row++)
{
tmp = (__m128 *)&original[row * width + col];
assert(IsAligned(tmp));
*mm_mu_x = _mm_add_ps(*tmp, *mm_mu_x);
}https://stackoverflow.com/questions/3394808
复制相似问题