2
我想爲Xeon Phi(60核心)編寫基準。在我的程序中,我使用OpenMP標準和Intel內部函數。我實現了比標量算法快230倍以下算法的並行版本(5點模板計算)。我想添加SIMD到並行代碼。我的表現有問題。當我調用_m512_store_pd()時,計算性能下降,SIMD並行版本比沒有SIMD的版本慢。問題是什麼?我該怎麼做才能獲得更好的表現?Intrisic商店 - 性能不佳
for(int i=start; i<stop; i+=threadsPerCore)
{
for(int j=8; j<n+8; j+=8)
{
__m512d v_c = _mm512_load_pd(&matrixIn[i * n_real + j]);
__m512d v_g = _mm512_load_pd(&matrixIn[(i - 1) * n_real + j]);
__m512d v_d = _mm512_load_pd(&matrixIn[(i + 1) * n_real + j]);
__m512d v_l = _mm512_loadu_pd(&matrixIn[i * n_real + (j - 1)]);
__m512d v_p = _mm512_loadu_pd(&matrixIn[i * n_real + (j + 1)]);
__m512d v_max = _mm512_max_pd(v_c, v_g);
v_max = _mm512_max_pd(v_max, v_d);
v_max = _mm512_max_pd(v_max, v_l);
v_max = _mm512_max_pd(v_max, v_p);
_mm512_store_pd(&matrixOut[i * n_real + j], v_max);
}
}
我開始從8計算becouse我有在端部在開始一個矢量和一個矢量是鹵素元素。 n_real是向量的大小 - > n + 16。計算開始和結束,因爲60個核心的i分區矩陣和4個HM線程計算的部分(m/60)。
您是否可以不組織數據,使數據與結果一致?我不確定這些日子過得如何,但過去使用未對齊的商店來處理流式數據會非常糟糕。除此之外,不知道什麼建議。你有沒有看過編譯器生成的代碼?當gcc和clang傾向於生成相當體面的SIMD代碼時,編譯器能夠充分理解正在發生的事情以及如何翻譯它 - 而且這看起來並不複雜。 – 2014-09-23 21:52:36
這是錯誤的。我不使用「storeu」固有的數據寫入內存。矩陣matrixIn和matrixOut都對齊到64字節。使用「storeu」時,當我複製代碼時它必須是一個錯誤。對不起。我用下面的代碼編譯程序:icc -mmic -O3 -openmp – JudgeDeath 2014-09-23 22:06:36
嗯,我沒有配備正確指令集的機器,我也沒有icc(我曾經爲AMD工作過,並且還沒有購買Intel CPU對於我自己的機器來說有很多原因 - 而且我現在的機器是一個更老的處理器的備份,因爲我的另一臺機器已經有點兒了)。我仍然會檢查編譯器實際生成的代碼 - 完全有可能您的內部函數與編譯器已經完成的幾乎相同,因此「沒有區別」 - 我已經多次看到gcc和clang,並且icc被假定相當不錯。 – 2014-09-23 22:13:37