c - 在 AVX vector 中加载 64 位整数

标签 c vector simd avx

我想用 64 位整数加载一个 __m256 vector 。但是我无法在带有 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));  
 }

我哪里错了?

最佳答案

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

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

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

一旦你理解了这一点,错误信息就很清楚了:

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

赋值的右侧确实为您提供了一个 __m256d vector ,但您正试图将其分配给一个 __m256 变量。

大概你想要 __m256d avx_sreg = blah blah_pd 所以你有 64 位 double 元素来匹配你的 64 位整数。

关于c - 在 AVX vector 中加载 64 位整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52528574/

相关文章:

c - 尝试实现 Dijkstra,但存在毫无意义的段错误

c - 未找到 flycheck 头文件,但 makefile 是正确的

c++ - 如何创建一种变量的 vector ?

ARM Cortex-A8 : Whats the difference between VFP and NEON

c - 是否有 GNU ARM NEON 内在函数的 C 实现?

c - 不允许指向不完整类类型的指针 - 单链表

arrays - 初始化数组时遇到问题

c++ - 使用带有对象 vector 的迭代器 C++

c++ - 为什么我的代码没有将每个对象都添加到 vector 中?

c - 对 4 个整数大小的数组进行 SSE 操作