首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSE访问冲突

SSE访问冲突
EN

Stack Overflow用户
提问于 2010-08-03 16:24:34
回答 2查看 2.4K关注 0票数 4

我有代码:

代码语言:javascript
复制
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);
}

从这里我得到了:

代码语言:javascript
复制
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:看起来我的原始数组没有对齐。不会:

代码语言:javascript
复制
function(float *original);
.
.
.
    orignal = _aligned_malloc(width*height*sizeof(float), 16);
    function(original);
    _aligned_free(original);
}

确保原件在函数内部对齐?

Edit3:这真的很奇怪。当我这样做的时候:

代码语言:javascript
复制
float *orig;
orig = _aligned_malloc(width*height*sizeof(float), 16);
assert(isAligned(orig));

断言失败,错误为

代码语言:javascript
复制
#define isAligned(p) (((unsigned long)(p)) & 15 == 0)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-03 16:49:30

我认为你需要使用

代码语言:javascript
复制
__m128 tmp = _mm_load_ps( &original[row * width + col] );

而不是

代码语言:javascript
复制
tmp = (__m128 *)&original[row * width + col];

编辑:如果你得到的访问冲突错误是在某个偏移量之后,那么你的步幅可能没有对齐。无论采用哪种方式,都会分配__m128元素(表示4个浮点数)。这会处理对齐问题。

此外,您还可以通过消除算术行*宽度+列获得一些额外的性能。确定你的步幅并相应地增加你的指针。

票数 4
EN

Stack Overflow用户

发布于 2010-08-03 16:30:15

除非widthcol具有合适的值,否则tmp将不会对齐。理想情况下,widthcol都应该是4的倍数。

您可能希望添加一些断言来检查对齐情况,例如

代码语言:javascript
复制
#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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3394808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档