【发布时间】: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 指令