gpt4 book ai didi

x86 - SSE访问违规

转载 作者:行者123 更新时间:2023-12-04 12:12:39 24 4
gpt4 key购买 nike

我有代码:

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 行。

原始是使用 _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)

最佳答案

我认为你需要使用

__m128 tmp = _mm_load_ps( &original[row * width + col] );

代替
tmp = (__m128 *)&original[row * width + col];

编辑:如果您在某个偏移之后遇到访问冲突错误,那么您的步幅可能未对齐。无论哪种方式,都分配 __m128 个元素(代表 4 个浮点数)。这负责对齐。

您还可以通过消除算术 [row * width + col] 来获得一些额外的性能。
确定您的步幅并相应地增加您的指针。

关于x86 - SSE访问违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3394808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com