[英]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>>
* C
是2112*129*129
矩陣,數據結構: vector<complex<double>>
* gSize = 4096 * sSize = 129。
計時器:使用POSIX times()API的返回值diff。 (它確實使用掛鍾進行並發,我做了檢查)
E5線程1 SIMD需要:291.520000(s)
如果sSize
= 129(如您在編輯中一樣),則並行化循環的開銷不會得到回報。 如果您將向我們顯示順序實現(無SIMD)和純並行實現(即對於#pragma omp parallel for
但不包含SIMD)的數量,將更容易確認。
可能發生的是,即使是純並行版本也比順序版本慢。 在為最外層循環的每次迭代啟動/創建並行區域時,不僅減小了循環大小。
對於SIMD版本,此問題本質上是針對此問題而量身定制的:您具有高度可矢量化的內核,該內核太小而無法在線程之間分配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.