请告诉我如何从相同类型的向量中添加值,但这些值本身被这些向量中不同数量的字节占用。
这是一个例子:
int main()
{
//--------------------------------------------------------------
int my_int_sequence[16] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
__m128i my_int_sequence_m128i_1 = _mm_loadu_si128((__m128i*) & my_int_sequence[0]);
__m128i my_int_sequence_m128i_2 = _mm_loadu_si128((__m128i*) & my_int_sequence[4]);
__m128i my_int_sequence_m128i_3 = _mm_loadu_si128((__m128i*) & my_int_sequence[8]);
__m128i my_int_sequence_m128i_4 = _mm_loadu_si128((__m128i*) & my_int_sequence[12]);
//--------------------------------------------------------------
//-----------------------------------------------------------------------
char my_char_mask[16] = { 1,0,1,1,0,1,0,1,1,1,0,1,0,1,0,1 };
__m128i my_char_mask_my_m128i = _mm_loadu_si128((__m128i*) &my_char_mask[0]);
//-----------------------------------------------------------------------
}
也就是说,我在 my_int_sequence 数组中有一个 int 值数组——并且由于所有 16 个 int 值都无法放入一个 __m128i 向量中,因此我将这些值 4 个值加载到第 4 个 __m128i 向量中。
我还有一个 16 字节的数组,我也将它加载到 my_char_mask_my_m128i 向量中。
现在我想添加到 my_int_sequence_m128i_x 向量的每个 4 字节值,就好像来自 my_char_mask_my_m128i 向量的相应一字节值一样。
问题显然是我需要把不同的维度加起来。可能吗?
也许我需要向量 my_char_mask_my_m128i 的每个字节 - 如何将其转换为 4 个字节?
我看到你已经部分回答了:这个 SIMD 指令是做什么的?.
但我仍然建议在这里使用它
_mm_cvtepi8_epi32
,因为签名int
和签名在这里加起来char
。原理很简单:展开
char
为int
,相加,掩码右移4个字节。等4次。