【发布时间】:2014-01-13 00:55:18
【问题描述】:
我尝试从 __m256i 寄存器中提取 64 位。 我当前的提取函数示例:
byte 31 16 15 0
byte_result_vec 000D 000C 000B 000A 000H 000G 000F 000E
_mm256_packs_epi32 -> 0D0C 0B0A 0D0C 0B0A 0H0G 0F0E 0H0G 0F0E
_mm256_packus_epi16 -> DCBA DCBA DCBA DCBA HGFE HGFE HGFE HGFE
^^^^ ^^^^
_mm256_castsi256_si128 -> HGFE HGFE HGFE HGFE
_mm256_extracti128_si256 -> DCBA DCBA DCBA DCBA
_mm_cvtsi128_si32(byte_result_vec1) -> ABCD
_mm_cvtsi128_si32(byte_result_vec2) -> EFGH
以下代码将 4x8 位移动到寄存器位置 0-3,而不是提取 32 位。
byte_result_vec = _mm256_packs_epi32(byte_result_vec, byte_result_vec);
byte_result_vec = _mm256_packus_epi16(byte_result_vec, byte_result_vec);
__m128i byte_result_vec1 = _mm256_castsi256_si128(byte_result_vec);
__m128i byte_result_vec2 = _mm256_extracti128_si256(byte_result_vec,1);
const int res1 = _mm_cvtsi128_si32(byte_result_vec1);
const int res2 = _mm_cvtsi128_si32(byte_result_vec2);
result_array[j] = res1;
result_array[j+1] = res2;
代码运行正常,但速度很慢。 看起来将 res1 和 res2 复制到 result_array 需要的时间最多。 有办法优化吗?
【问题讨论】: