我想转换4装64个整数4包装使用AVX 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}
所有剧组内部函数的执行按位演员,这就是为什么你没有看到与有意义的结果。
64位整数,64位浮点之间的矢量转换( 无级变速器内在)不存在。
对于它的价值,我看了昂纳雾的vectorclass看看他是怎么做的。 他简单地存储该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);
}