在 AVX 向量中加载 64 位整数
Load 64 bit integers in AVX vector
我想用 64 位整数加载 __m256 向量。但是我无法在 Ubuntu 18.04 LTS 和 gcc 7.3.0
上这样做
我使用以下指令编译它
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));
}
我哪里错了?
Intel 内部函数有 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}’
赋值的右侧确实给了你一个 __m256d
向量,但你试图将它赋给一个 __m256
变量。
大概你想要 __m256d avx_sreg = blah blah_pd
所以你有 64 位 double
元素来匹配你的 64 位整数。
我想用 64 位整数加载 __m256 向量。但是我无法在 Ubuntu 18.04 LTS 和 gcc 7.3.0
上这样做我使用以下指令编译它
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));
}
我哪里错了?
Intel 内部函数有 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}’
赋值的右侧确实给了你一个 __m256d
向量,但你试图将它赋给一个 __m256
变量。
大概你想要 __m256d avx_sreg = blah blah_pd
所以你有 64 位 double
元素来匹配你的 64 位整数。