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寄存器中具有永久性值,而無需從主內存讀取/寫入數據。
任何想法?謝謝。
是否'x [0]'依賴於'x [1]'?或者'N = 3'的情況簡單地「對所有'x [i]'」獨立地做同樣的事情? – us2012
你的意思是「依賴」嗎?通過從N到N + 1,可以提高函數的精度,並且x [i + 1]中的值將是其值爲x [i]的操作的「餘數」。如果你問是否可以並行化示例循環的迭代,否則:爲了填充x [i + 1],我需要剛存儲到x [i]中的值,因爲x [i + 1]表示下一個「準確度等級爲x [i]。 – Spiros
我一直在[godbolt](http://gcc.godbolt.org/)(這是一個非常有用的工具,它是一個有很多可用編譯器的即時聯機程序集生成器)中使用這個場景,但是不能來滿意地解決您的問題。你確定這些多餘的商店是一個很大的性能問題嗎? – us2012