在AVX向量中加载64位整数

时间:2018-09-27 02:34:21

标签: c vector simd avx

我想加载具有64位整数的__m256向量。但是我无法在具有gcc 7.3.0的Ubuntu 18.04 LTS上这样做

我按照以下说明进行了编译

gcc -mavx -o test test1.c

这里是重现我的问题的最小示例。我也尝试了-mavx2,但遇到了同样的问题。

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

当我使用32位整数时,没有编译错误。这是一个最小的例子

#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 个答案:

答案 0 :(得分:2)

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

  • __m256float的向量,与_mm..._ps内在函数一起使用
  • __m256ddouble的向量,与_mm..._pd内在函数一起使用
  • __m256i:整数向量,未指定元素宽度。 (由程序员以有用的方式混合和匹配不同的元素宽度操作。)与_mm..._epi8/16/32/64(带有元素的打包整数)或_mm..._si256(没有有意义的元素边界,例如{{1})一起使用})

因此对于整数向量,只有一种类型,但是对于FP向量,则有2种不同的类型。在asm中,它们使用相同的寄存器,但就像标量类型一样,对于不同的解释也有不同的类型。

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

xor

分配的右侧确实为您提供了error: incompatible types when assigning to type ‘__m256 {aka __vector(8) float}’ from type ‘__m256d {aka __vector(4) double}’ 向量,但是您正在尝试将其分配给__m256d变量。

大概您想要__m256,因此您有64位__m256d avx_sreg = blah blah_pd元素可以匹配您的64位整数。