簡體   English   中英

為什么OpenMP“ simd”比“ parallel for simd”具有更好的性能?

[英]Why OpenMP 'simd' has better performance than 'parallel for simd'?

我正在使用英特爾編譯器OpenMP 4.0開發Intel E5(6核,12線程)

為什么這段代碼SIMD版本比並行SIMD版本更快?

for (int suppv = 0; suppv < sSize; suppv++) {
  Value *gptr = &grid[gind];
  const Value * cptr = &C[cind];

  #pragma omp simd // vs. #pragma omp parallel for simd
  for (int suppu = 0; suppu < sSize; suppu++)
    gptr[suppu] += d * cptr[suppu];

  gind += gSize;
  cind += sSize;
}

隨着線程的增加,它變得更慢。


編輯1:* grid是4096 * 4096矩陣,數據結構: vector<complex<double>> * C2112*129*129矩陣,數據結構: vector<complex<double>> * gSize = 4096 * sSize = 129。

  • 編譯器標志:icpc -march = native -std = c ++ 11 -qopt-report-phase = vec -qopt-report = 3 -O2 -openmp
  • 計時器:使用POSIX times()API的返回值diff。 (它確實使用掛鍾進行並發,我做了檢查)

  • E5線程1 SIMD需要:291.520000(s)

  • E5線程2 for-SIMD需要:1039.220000(s)
  • E5線程12 for-SIMD需要:1684.270000(s)

如果sSize = 129(如您在編輯中一樣),則並行化循環的開銷不會得到回報。 如果您將向我們顯示順序實現(無SIMD)和純並行實現(即對於#pragma omp parallel for但不包含SIMD)的數量,將更容易確認。

可能發生的是,即使是純並行版本也比順序版本慢。 在為最外層循環的每次迭代啟動/創建並行區域時,不僅減小了循環大小。

對於SIMD版本,此問題本質上是針對此問題而量身定制的:您具有高度可矢量化的內核,該內核太小而無法在線程之間分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM