【发布时间】:2012-05-17 16:01:48
【问题描述】:
当使用诸如PADDD(即_mm_add_epi32内在函数)等SSE2指令时,有没有办法检查是否有任何操作溢出?
我认为 MXCSR 控制寄存器上的标志可能会在溢出后被设置,但我没有看到这种情况发生。例如,_mm_getcsr() 在以下两种情况下打印相同的值 (8064):
#include <iostream>
#include <emmintrin.h>
using namespace std;
void main()
{
__m128i a = _mm_set_epi32(1, 0, 0, 0);
__m128i b = _mm_add_epi32(a, a);
cout << "MXCSR: " << _mm_getcsr() << endl;
cout << "Result: " << b.m128i_i32[3] << endl;
__m128i c = _mm_set_epi32((1<<31)-1, 3, 2, 1);
__m128i d = _mm_add_epi32(c, c);
cout << "MXCSR: " << _mm_getcsr() << endl;
cout << "Result: " << d.m128i_i32[3] << endl;
}
还有其他方法可以检查 SSE2 是否溢出?
【问题讨论】:
-
您可以在饱和模式 (PADDS) 下重复计算并比较结果。
-
您对有符号或无符号溢出感兴趣吗?
-
@Dmitri:SSE2 中没有 32 位饱和添加(只有 8 位和 16 位)
-
这可能有编译器的内部结构。我知道 Clang 正在添加它们,我想 gcc 已经有了它们,你检查了吗?
-
Alex:啊,好点子。我没有意识到这两种情况是不同的。理想情况下,我想为这两种情况提供解决方案。我正在研究与 SSE 相关的库,因此这两种情况都是相关的。