2013-10-04 100 views
1

在一個性能關鍵的C++函數中,我想使用SSE內在函數來處理一些值。這個函數有一個整數模板參數N,它可以取值1到4,並給出我需要的XMM寄存器的數量。定義寄存器堆棧陣列

我可以寫這個函數四次,我會解決問題;然而,這個函數非常大,我希望通過避免代碼重複來保持良好的可維護性。我需要的是像

__m128d x[N]; 

即我想有N不同__m128d變量,如果我實例化它們的堆疊陣列,但上面的代碼不起作用,因爲它創造了雙打的堆疊陣列「將它映射到一些XMM寄存器。

換句話說,我想不喜歡一個循環:

for (int i = 0; i < N; ++i) { 
    k = _mm_add_pd(x[i], k); 
} 

(這只是一個例子,實際的代碼是一個很大的複合物),這是很好的I」的編譯器優化m,但是表達式x[i]並不是我想要的:生成的代碼從內存中讀取它,而我希望在XMM寄存器中具有永久性值,而無需從主內存讀取/寫入數據。

任何想法?謝謝。

+0

是否'x [0]'依賴於'x [1]'?或者'N = 3'的情況簡單地「對所有'x [i]'」獨立地做同樣的事情? – us2012

+0

你的意思是「依賴」嗎?通過從N到N + 1,可以提高函數的精度,並且x [i + 1]中的值將是其值爲x [i]的操作的「餘數」。如果你問是否可以並行化示例循環的迭代,否則:爲了填充x [i + 1],我需要剛存儲到x [i]中的值,因爲x [i + 1]表示下一個「準確度等級爲x [i]。 – Spiros

+0

我一直在[godbolt](http://gcc.godbolt.org/)(這是一個非常有用的工具,它是一個有很多可用編譯器的即時聯機程序集生成器)中使用這個場景,但是不能來滿意地解決您的問題。你確定這些多餘的商店是一個很大的性能問題嗎? – us2012

回答

1

通常和明顯的做法是使用預處理器。你可能知道##事情:

#define inc(n) x##n++ 

inc(1) 
inc(2) 

另一種可能性是模板和內聯函數。 C++編譯器通常儘可能內聯非常聰明,他們甚至可以將其放入大型結構的寄存器領域。他們唯一不喜歡的就是那些數組,可能是因爲他們的內容可能會被別名指針覆蓋。你可能試圖禁用指針別名,但我懷疑它會幫助