2014-09-23 126 views
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)。

+0

您是否可以不組織數據,使數據與結果一致?我不確定這些日子過得如何,但過去使用未對齊的商店來處理流式數據會非常糟糕。除此之外,不知道什麼建議。你有沒有看過編譯器生成的代碼?當gcc和clang傾向於生成相當體面的SIMD代碼時,編譯器能夠充分理解正在發生的事情以及如何翻譯它 - 而且這看起來並不複雜。 – 2014-09-23 21:52:36

+0

這是錯誤的。我不使用「storeu」固有的數據寫入內存。矩陣matrixIn和matrixOut都對齊到64字節。使用「storeu」時,當我複製代碼時它必須是一個錯誤。對不起。我用下面的代碼編譯程序:icc -mmic -O3 -openmp – JudgeDeath 2014-09-23 22:06:36

+0

嗯,我沒有配備正確指令集的機器,我也沒有icc(我曾經爲AMD工作過,並且還沒有購買Intel CPU對於我自己的機器來說有很多原因 - 而且我現在的機器是一個更老的處理器的備份,因爲我的另一臺機器已經有點兒了)。我仍然會檢查編譯器實際生成的代碼 - 完全有可能您的內部函數與編譯器已經完成的幾乎相同,因此「沒有區別」 - 我已經多次看到gcc和clang,並且icc被假定相當不錯。 – 2014-09-23 22:13:37

回答

0

有人(或許你)似乎在英特爾開發人員專區https://software.intel.com/en-us/forums/topic/531721上提出了一個相同的問題(至少,引用的代碼示例與您的相同),其中有答案(包括重寫性能提高了40% )。

也許閱讀會有用嗎?

(如果是你,我不反對在這兩個地方提問,但在這裏告訴人們你已經在那裏問過了,這樣他們就不會浪費時間來再現人們已經有的答案了在另一論壇中給出)。