代码之家  ›  专栏  ›  技术社区  ›  gansub

在AVX矢量中加载64位整数

  •  2
  • gansub  · 技术社区  · 6 年前

    我想加载一个带有64位整数的\uuum256向量。但是我不能在带有gcc 7.3.0的Ubuntu18.04 LTS上这么做

    我用下面的指令编译了它

    gcc -mavx -o test test1.c
    

    #include <immintrin.h>
    #include <stdio.h>
    #include <stdint.h>
    
    int main()
    {
    __m256 avx_sreg;
     uint64_t key;
    
     avx_sreg = _mm256_castsi256_pd(_mm256_set1_epi64x(key));
    }
    

    我得到了这些错误-

    error: incompatible types when assigning to type ‘__m256 {aka __vector(8) float}’ from type ‘__m256d {aka __vector(4) double}’
     avx_sreg = _mm256_castsi256_pd(_mm256_set1_epi64x(key));
    

    #include <immintrin.h>
    #include <stdio.h>
    #include <stdint.h>
    
    int main()
    {
     __m256 avx_sreg;
     uint32_t key;
    
     avx_sreg = _mm256_castsi256_ps(_mm256_set1_epi32(key));  
     }
    

    我哪里出错了?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Peter Cordes    6 年前

    英特尔内部函数有3种向量类型(以及相应的128位和512位版本):

    • __m256 :矢量 float _mm..._ps
    • __m256d :矢量 double ,与一起使用 _mm..._pd
    • __m256i _mm..._epi8/16/32/64 _mm..._si256 (没有有意义的元素边界,例如。 xor )

    所以对于整数向量,只有一种类型,但是对于FP向量,有两种不同的类型。在asm中,它们使用相同的寄存器,但与标量类型一样,有不同的类型用于不同的解释。

    一旦理解了这一点,错误消息就不言自明了:

    error: incompatible types when assigning to type ‘__m256 {aka __vector(8) float}’ from type ‘__m256d {aka __vector(4) double}’
    

    作业的右边确实给了你一个答案 向量,但你想把它分配给 __m256型 变量。

    __m256d avx_sreg = blah blah_pd 所以你有64位 双重的

    推荐文章