2010-12-13 72 views
3

兩個相關的問題。SSE:將__m128和__m128i轉換爲兩個__m128d

這是我的代碼需要處理大量數據。它在內部循環內完成,性能很重要。

  1. 將__int32和數組轉換爲雙精度(或將__m128i轉換爲兩個__m128d)。
  2. 將浮點數和浮點數轉換爲雙精度(或將__m128轉換爲兩個__m128d)。

基本上,我需要函數具有以下簽名:

void convert_int_to_double(__int32 const * input, double * output); 
void convert_float_to_double(float const * input, double * output); 

輸入和輸出指針對準和元件的數量是4的倍數的主要問題是如何快速解壓__m128成兩個__m128d。

+0

爲什麼,到底是什麼?我的意思是,我沒有看到預先計算整數和浮點數的雙重版本有什麼優勢。最終,由於有更多的數據被移動,所以FPU加載比浮點數或整數加倍更慢。 – Skizz 2010-12-13 16:19:17

+0

你爲什麼要在內循環內進行轉換?只需要在線性時間內將所有數據轉換爲「double」,在嵌套循環內部僅使用「double」(無需轉換),並在線性時間之後轉換爲結果類型。 – 2010-12-13 16:19:58

回答

6

內在函數_mm_cvtepi32_pd_mm_cvtps_pd將值轉換爲double。

這應該是循環:

__m128i* base_addr = ...; 
for(int i = 0; i < cnt; ++i) 
{ 
    __m128i epi32 = _mm_load_si128(base_addr + i); 
    __m128d v0 = _mm_cvtepi32_pd(epi32); 
    epi32 = _mm_srli_si128(epi32, 8); 
    __m128d v1 = _mm_cvtepi32_pd(epi32); 
    .... 
} 
+0

到_mm_cvtps_pd的鏈接已損壞,應該是http://msdn.microsoft.com/en-us/library/40x763ty.aspx – user9876 2010-12-13 19:05:35

+0

我認爲在正確投射後,即使使用__m128也能正常移動8位。 – watson1180 2010-12-14 01:59:28

+0

_mm_srli_si128按字節移位而不是位,是的,它會移動所有寄存器類型。 – Christopher 2010-12-14 10:19:19