【问题标题】:Load 64 bit integers in AVX vector在 AVX 向量中加载 64 位整数
【发布时间】:2019-03-02 20:55:35
【问题描述】:

我想加载一个带有 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));  
 }

我哪里错了?

【问题讨论】:

  • 您是否只是打算用整数加载一个 256 位寄存器,或者专门将整数加载到一个 256 位寄存器中,同时在代码中将它们键入为__m256(反映打包单-precision 浮点值)而不是 __m256i 等?
  • @SevenStarConstellation 所以这是我对 AVX 指令的第一次体验,我相信是后者,即专门将整数加载到 256 位寄存器中,同时在代码中将它们键入为 __m256
  • 如果您设置为使用 64 位整数键值而不是 32 位填充寄存器,您应该能够使用 _mm256_castsi256_ps(_mm256_set1_epi64x(key)) 填充向量然后进行转换。不过,从语义上讲,将 64 位整数键转换为一对单精度浮点数似乎确实有点奇怪。
  • @SevenStarConstellation- 我有 64 位 geohash 存储在跳过列表中。我在范围查询的上下文中使用这些 AVX 指令

标签: c vector simd avx


【解决方案1】:

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

  • __m256float 的向量,与 _mm..._ps 内在函数一起使用
  • __m256ddouble 的向量,与 _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位整数。

【讨论】:

  • 很好的答案,感谢您在 AVX 内在函数方面指导我!
  • 对此答案的最后澄清。由于我可以访问 AVX2,我可以继续使用 _m512d。然后我可以在一个寄存器中存储 8 个 64 位整数,而不是现在的四个。对吗?
  • @gansub:不,AVX1 是 256 位浮点/双精度,AVX2 是 256 位整数运算。 512 位向量需要 AVX512。
  • 非常感谢。目前在这个盒子上我没有 AVX512 支持,根据 cat /proc/cpuinfo | grep avx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 2016-08-09
  • 2021-06-26
  • 2017-04-26
  • 1970-01-01
  • 2014-06-23
  • 2016-09-02
相关资源
最近更新 更多