Khi sử dụng các chỉ lệnh SSE2 như PADDD
(tức là, _mm_add_epi32
nội tại), có cách nào để kiểm tra xem có bất kỳ thao tác nào bị tràn không?Kiểm tra tràn số nguyên SSE2
Tôi nghĩ rằng có thể một lá cờ trên thanh ghi điều khiển MXCSR có thể được đặt sau khi tràn, nhưng tôi không thấy điều đó xảy ra. Ví dụ, _mm_getcsr()
in giá trị như nhau trong cả hai trường hợp dưới đây (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;
}
Có một số cách khác để kiểm tra tràn với SSE2?
bạn có thể lặp lại tính toán ở chế độ bão hòa (PADDS) và so sánh kết quả. –
Bạn có quan tâm đến tràn hoặc đã ký không? –
@Dmitri: không có thêm 32 bit bão hòa trong SSE2 (chỉ 8 bit và 16 bit) –