AVX将64位整数转换为64位浮点数
我想使用AVX将4个打包的64位整数转换为4个打包的64位浮点数。我已经试过类似:AVX将64位整数转换为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}
所有的转换 intrinsics执行按位转换,这就是为什么你没有看到有意义的结果。
不存在64位整数与64位浮点之间的矢量转换(内部函数)。
我猜这是事实,欢呼的确认。有时间以不同的方式解决问题。 – 2013-05-13 00:31:02
另外,请注意,您不能用64位int和64位浮点数表示相同的数字。每种格式中的大多数数字在另一种格式中没有相同的数字。 64位浮点数比int更大/更小,所以你甚至不能尝试。从int到float可能是最好的方式(不是按位投),你会得到近似值,但不要做任何重要的事情。 – xaxxon 2013-05-13 00:55:53
为了什么是值得的,我查看了Agner Fog的vector类,看看他是如何做到的。他只是将64位整数存储到一个数组中,并将每个数组的值转换为double。这是低效的,但它的工作原理。
从文件 “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);
}
参见:[?加载64位整数为双精度SSE2寄存器的最佳方式](http://stackoverflow.com/q/ 15569015)。请注意,如果您不想对包装双向量中的位进行假设(或使用丑陋的修改),则始终可以执行两个'CVTDQ2PD',一旦使用较低的32位,然后再使用较高位32位,最后将压缩双向量加在一起。 – rwong 2015-04-17 04:47:22