如何将整数数组转换为SIMD向量

时间:2016-03-22 16:44:10

标签: c++ casting simd icc

我尝试将__int16数组表示为__m128i元素。 将__m128i元素转换为__int16数组非常有效。 我的示例代码:

void example() {
   __m128i v = _mm_set_epi16(1, 2, 3, 4, 5, 6, 7, 8);
   __int16 *p_i = (__int16 *)&v; 
   for (int i = 0; i < 8; i++)
       std::cout <<p_i[i] << " "; // 8 7 6 5 4 3 2 1
   std::cout << "\n";

   __int16 i2[8] = {1, 2, 3, 4, 5, 6, 7, 8};
   __m128i *p_v2 = (__m128i *) i2;
   std::cout << __m128i_toString<__int16>(p_v2[0])<< "\n"; //error here
}
来自this

__m128i_toString<>()

我错过了什么?

1 个答案:

答案 0 :(得分:3)

在C ++ 11中,您可以使用alignas(16) int16_t i2[8] = ...可移植方式获得16B对齐,而无需__attribute__((aligned(16)))或{{1}等任何特定于编译器的扩展}。

请参阅the code on godbolt compiled with alignas

请注意,通常应避免使用相同长度的短整数数组来对__declspec(align(16))进行别名。以这种方式将数据导入向量会导致存储转发失败。通过存储到数组然后使用标量代码sucks compared to SIMD进行水平操作。

使用__m128i可能会产生更好的代码,因为编译器不必优化实际的数组和指针操作。在这种情况下,它能够(只是从只读常量中执行_mm_set_epi16(),而不首先存储到数组)。如果初始化程序不是编译时常量,则可能无法获得如此好的结果。