我正在与 Xeon Phi Knights Landing 合作。我需要从一个双打数组中进行收集操作。索引列表来自一个字符数组。收集操作是_mm512_i32gather_pd
或_mm512_i64gather_pd
。据我了解,我要么需要将 8 个字符转换为 8 个 32 位整数,要么将 8 个字符转换为 64 位整数。我已经选择了_mm512_i32gather_pd
.
我创建了两个函数get_index
并将get_index2
八个字符转换为__m256i
. 的组装get_index
比get_index2
查看https://godbolt.org/z/lhg9fX更简单。但是,在我的代码get_index2
中要快得多。为什么是这样?我正在使用 ICC 18。也许有比这两个功能更好的解决方案?
#include <x86intrin.h>
#include <inttypes.h>
__m256i get_index(char *index) {
int64_t x = *(int64_t *)&index[0];
const __m256i t3 = _mm256_setr_epi8(
0,0x80,0x80,0x80,
1,0x80,0x80,0x80,
2,0x80,0x80,0x80,
3,0x80,0x80,0x80,
4,0x80,0x80,0x80,
5,0x80,0x80,0x80,
6,0x80,0x80,0x80,
7,0x80,0x80,0x80);
__m256i t2 = _mm256_set1_epi64x(x);
__m256i t4 = _mm256_shuffle_epi8(t2, t3);
return t4;
}
__m256i get_index2(char *index) {
const __m256i t3 = _mm256_setr_epi8(
0,0x80,0x80,0x80,
1,0x80,0x80,0x80,
2,0x80,0x80,0x80,
3,0x80,0x80,0x80,
4,0x80,0x80,0x80,
5,0x80,0x80,0x80,
6,0x80,0x80,0x80,
7,0x80,0x80,0x80);
__m128i t1 = _mm_loadl_epi64((__m128i*)index);
__m256i t2 = _mm256_inserti128_si256(_mm256_castsi128_si256(t1), t1, 1);
__m256i t4 = _mm256_shuffle_epi8(t2, t3);
return t4;
}