将八个字节的数组转换为八个整数

时间:2018-11-24 14:25:08

标签: x86 avx2 xeon-phi avx512 knights-landing

我正在与至强披披骑士登陆公司合作。我需要从双打数组中进行收集操作。索引列表来自一个字符数组。收集操作为_mm512_i32gather_pd_mm512_i64gather_pd。据我了解,我要么需要将8个字符转换为8个32位整数,要么将8个字符转换为64位整数。我选择了_mm512_i32gather_pd的首选。

我创建了两个函数get_indexget_index2来将八个字符转换为__m256iget_index的汇编比get_index2的汇编要简单,请参见https://godbolt.org/z/lhg9fX。但是,在我的代码中get_index2明显更快。 为什么?我正在使用ICC18。也许有比这两个功能更好的解决方案?

#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;
}

0 个答案:

没有答案