2010-12-19 111 views
11

假設我有一個數組:索引與SSE陣列

uint8_t arr[256]; 

和元件包含16個字節,

x_1, x_2, ... x_16 

我想有效地填充一個

__m128i x 

__m128i元件

__m128i y 

與來自arr取決於值x值,使得:

y_1 = arr[x_1] 
y_2 = arr[x_2] 
    . 
    . 
    . 
y_16 = arr[x_16] 

的命令來實現,這將基本上可以從一個非連續組存儲器位置加載的寄存器。我對看到這樣一個命令的文檔有一個痛苦的模糊記憶,但現在找不到它。它存在嗎?在此先感謝您的幫助。

+0

修復了代碼格式化;在將來,請記住,如果要將文本塊格式化爲代碼,則必須用4個空格將其縮進,並在其之前保留一個空行(或者只需選中它並按'0101'按鈕)即可。 – 2010-12-19 16:24:34

+1

@Matteo:它不再是'101010'。它變成了'{}'... – thkala 2010-12-19 16:51:21

+0

@thkala:呃,我沒有注意到,一般我只是做CTRL-K或從我的編輯器複製粘貼,我可以添加4個空格按TAB(我可以受益於語法突出顯示)。 – 2010-12-19 16:58:09

回答

6

SIMD體系結構中的這種功能稱爲加載/存儲分散/聚集。不幸的是,SSE沒有它。來自英特爾的未來SIMD架構可能會有這種 - 命運多ill的Larrabee處理器就是一個例子。現在,雖然您只需要設計數據結構,但不需要這種功能。

請注意,您可以通過使用例如_mm_set_epi8:

y = _mm_set_epi8(arr[x_16], arr[x_15], arr[x_14], ..., arr[x_1]); 

儘管這當然會產生一堆標量代碼來加載你的y向量。如果你在任何性能關鍵的循環之外進行這種操作,這很好,例如,作爲循環之前的初始化的一部分,但是在循環內部,它很可能是性能殺手。

+0

感謝您的回答。 「聚集/散佈」顯然是我期待的術語。經過簡短的檢查,看起來像這樣的功能在GPU上可用。有關這些方面的建議? – Travis 2010-12-19 22:56:45

+0

即使在GPU上,這也可能是效率低下的,因爲從不同的存儲器地址加載/存儲將不可避免地意味着更多的總線週期。 – 2010-12-20 00:15:42