Tôi đang triển khai chuyển đổi giữa các loại SSE và tôi thấy rằng việc triển khai chuyển đổi mở rộng int8-> int64 cho các mục tiêu trước SSE4.1 là cồng kềnh.Làm thế nào để thực hiện hiệu quả chuyển đổi int8/int64 với SSE?
Việc thực hiện đơn giản sẽ là:
inline __m128i convert_i8_i64(__m128i a)
{
#ifdef __SSE4_1__
return _mm_cvtepi8_epi64(a);
#else
a = _mm_unpacklo_epi8(a, a);
a = _mm_unpacklo_epi16(a, a);
a = _mm_unpacklo_epi32(a, a);
return _mm_srai_epi64(a, 56); // missing instrinsic!
#endif
}
Nhưng kể từ _mm_srai_epi64
không tồn tại cho đến khi AVX-512, có hai tùy chọn vào thời điểm này:
- thực hiện
_mm_srai_epi64
, hoặc - triển khai
convert_i8_i64
theo cách khác.
Tôi không chắc giải pháp nào là giải pháp hiệu quả nhất. Bất kỳ ý tưởng?