gpt4 book ai didi

c - 使用结果 float 时 SSE SIMD 段错误

转载 作者:行者123 更新时间:2023-11-30 16:54:07 25 4
gpt4 key购买 nike

我正在尝试使用 Intel Intrinsics 在 float 数组上快速执行操作。操作本身似乎运行良好;然而,当我尝试将操作结果放入标准 C 变量时,我得到了 SEGFAULT。如果我注释掉下面指示的行,程序就会运行。如果我保存指示行的结果,但不以任何方式操作它,则程序运行正常。只有当我尝试(以任何方式)与 _mm_cvtss_f32(C) 的结果交互时,我的程序才会崩溃。有什么想法吗?

float proc(float *a, float *b, int n, int c, int width) {
// Operation: SUM: (A - B) ^ 2
__m128 A, B, C;
float total = 0;
for (int d = 0, k = 0; k < c; d += width, k++) {
for (int i = 0; i < n / 4 * 4; i += 4) {
A = _mm_load_ps(&a[i + d]);
B = _mm_load_ps(&b[i + d]);
C = _mm_sub_ps(A, B);
C = _mm_mul_ps(C, C);
C = _mm_hadd_ps(C, C);
C = _mm_hadd_ps(C, C);
total += _mm_cvtss_f32(C); // SEGFAULT HERE
}
for (int i = n / 4 * 4; i < n; i++) {
int diff = a[i + d] - b[i + d];
total += diff * diff;
}
}
return total;
}

最佳答案

您确定您的程序实际上在您引用的指令处崩溃了,或者如果您删除 _mm_cvtss_f32() 行,编译器是否只是优化循环的其余部分(它没有任何其他可见的副作用)?潜在的失败原因可能是 a 和 b 数组的不正确对齐,因为您使用的是对齐的加载指令。您确定它们是 16 字节对齐的吗?在当代 Intel 硬件上,16 字节对齐和未对齐负载之间的性能差异非常小(有关该问题的讨论,请参阅上述问题的评论)。

我在原来的评论中提到 movaps 的编码比 movups 更短。 这是不正确的。我在想,而不是 movapsmovapd ,它们执行相同的内存传输,只是它们被标记为用于分别为单精度和 double 据。实际上,它们做同样的事情,但 movaps 的编码更短。

关于c - 使用结果 float 时 SSE SIMD 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40640976/

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