2013-05-12 184 views
4

我想使用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} 
+0

參見:[?加載64位整數爲雙精度SSE2寄存器的最佳方式](http://stackoverflow.com/q/ 15569015)。請注意,如果您不想對包裝雙向量中的位進行假設(或使用醜陋的修改),則始終可以執行兩個'CVTDQ2PD',一旦使用較低的32位,然後再使用較高位32位,最後將壓縮雙向量加在一起。 – rwong 2015-04-17 04:47:22

回答

5

所有的轉換 intrinsics執行按位轉換,這就是爲什麼你沒有看到有意義的結果。

不存在64位整數與64位浮點之間的矢量轉換(內部函數)。

+0

我猜這是事實,歡呼的確認。有時間以不同的方式解決問題。 – 2013-05-13 00:31:02

+0

另外,請注意,您不能用64位int和64位浮點數表示相同的數字。每種格式中的大多數數字在另一種格式中沒有相同的數字。 64位浮點數比int更大/更小,所以你甚至不能嘗試。從int到float可能是最好的方式(不是按位投),你會得到近似值,但不要做任何重要的事情。 – xaxxon 2013-05-13 00:55:53

2

爲了什麼是值得的,我查看了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); 
}