我正在使用SSE內在函數優化用於Intel x86 Nehalem微體系結構的一些代碼。使用SSE內在函數將4點產品存儲到C中的連續數組中的最有效方法
我的程序的一部分計算4點積,並將每個結果添加到數組的連續塊中的先前值。更具體地講,
tmp0 = _mm_dp_ps(A_0m, B_0m, 0xF1);
tmp1 = _mm_dp_ps(A_1m, B_0m, 0xF2);
tmp2 = _mm_dp_ps(A_2m, B_0m, 0xF4);
tmp3 = _mm_dp_ps(A_3m, B_0m, 0xF8);
tmp0 = _mm_add_ps(tmp0, tmp1);
tmp0 = _mm_add_ps(tmp0, tmp2);
tmp0 = _mm_add_ps(tmp0, tmp3);
tmp0 = _mm_add_ps(tmp0, C_0n);
_mm_storeu_ps(C_2, tmp0);
請注意,我用4個臨時XMM要對這個寄存器來保存每個點積的結果。在每個xmm寄存器中,該結果被置入一個唯一的32個比特相對於另一個臨時XMM寄存器,使得最終結果看起來像這樣:
TMP0 = R0-零零零
TMP1 =零-R1-零零
TMP2 =零零-R2-零
TMP3 =零零零R3
我通過包含在每個變量TMP的值組合成一個XMM可變請按照以下說明對其進行總結:
tmp0 = _mm_add_ps(tmp0, tmp1);
tmp0 = _mm_add_ps(tmp0, tmp2);
tmp0 = _mm_add_ps(tmp0, tmp3);
最後,我添加含所有4個結果的點的產品,以陣列的連續的部分,使得該陣列的索引是由點積增加,像這樣的寄存器(C_0n是4個值目前在要更新的數組; C_2是指向這4個值)地址:我想知道是否有采取點產品的結果,並把它們添加到的連續的大塊不太迂迴的,更有效的方式
tmp0 = _mm_add_ps(tmp0, C_0n);
_mm_storeu_ps(C_2, tmp0);
陣列。這樣,我在兩個只有1個非零值的寄存器之間進行了3次添加。似乎應該有一個更有效的方法來解決這個問題。
我感謝所有幫助。謝謝。
您仍然必須在存儲之前將舊值(C_0n)添加到每個點積。他們都是獨立的,所以它可能不會太慢,但它不會更漂亮:) – celion 2010-11-13 09:37:27