5

我想使用 AVX 将 4 个压缩的 64 位整数转换为 4 个压缩的 64 位浮点数。我试过类似的东西:

int_64t *ls = (int64_t *) _mm_malloc(256, 32);
ls[0] = a;
//...
ls[3] = d;

__mm256i packed = _mm256_load_si256((__m256i const *)ls);

这将显示在调试器中:

(gdb) print packed
$4 = {1234, 5678, 9012, 3456}

到目前为止还可以,但我能找到的唯一转换/转换操作是 _mm256i_castsi256_pd,它没有得到我想要的:

__m256d pd = _mm256_castsi256_pd(packed);

(gdb) print pd
$5 = {6.0967700696809824e-321, 2.8053047370865979e-320, 4.4525196003213139e-320, 1.7074908720273481e-320}

我真正想看到的是:

(gdb) print pd
$5 = {1234.0, 5678.0, 9012.0, 3456.0}
4

2 回答 2

5

所有强制转换内在函数都执行按位强制转换,这就是为什么您看不到有意义的结果的原因。

64 位整数和 64 位浮点数之间的向量转换(cvt内在函数)不存在。

于 2013-05-13T00:05:59.787 回答
2

对于它的价值,我查看了 Agner Fog 的矢量类,看看他是如何做到的。他只是将 64 位整数存储到一个数组中,并将每个数组值转换为一个双精度值。它效率低下,但它有效。

从文件“vectorf256.h”:

// function to_double: convert integer vector elements to double vector (inefficient)
static inline Vec4d to_double(Vec4q const & a) {
    int64_t aa[4];
    a.store(aa);
    return Vec4d(double(aa[0]), double(aa[1]), double(aa[2]), double(aa[3]));
}

// function to_double: convert integer vector to double vector
static inline Vec4d to_double(Vec4i const & a) {
    return _mm256_cvtepi32_pd(a);
}
于 2013-05-13T12:03:01.393 回答