[問題] OpenMp for迴圈平行化?

看板C_and_CPP作者 (仁)時間14年前 (2012/01/29 23:29), 編輯推噓1(1014)
留言15則, 6人參與, 最新討論串1/1
開發環境:GCC Source Code: #include <omp.h> #include <iostream> using namespace std; #define WIDTH 2000 #define NUM_THREADS WIDTH*WIDTH #define NT 8 long int P; int main() { int i, j, k; omp_set_num_threads(NT); #pragma omp parallel { #pragma omp parallel for reduction( +:P) for (i = 0; i < WIDTH; ++i) { for (j = 0; j < WIDTH; ++j) { for (k = 0; k < WIDTH; ++k) { P+=1; } } } } return 0; } 上列是小弟我在做OpenMp的測試程式碼,本來是希望用這個方式減少運算時間,可是根據 目前的執行時間發現我如果不做paralle的會比parallel還快,所以我想請各位高手幫我 解決這個問題。還有就是當我坐parallel的時候,CPU%幾乎可以跑到800%,那這個意思是 我的程式碼的確有在做八個執行續的運算?那如果有的話怎麼會用單一個執行續運算的速 度還慢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.242.11.237

01/29 23:56, , 1F
P+=1 有 data dependence, 所以會花很多時間在 mutex
01/29 23:56, 1F

01/30 00:47, , 2F
歐,感謝樓上的解答,那如果我改成 int P[WIDTH]的矩陣,
01/30 00:47, 2F

01/30 00:47, , 3F
然後行用P[i] = i這樣的話就不會有data dependence了?
01/30 00:47, 3F

01/30 00:48, , 4F
而且我想問一下再g++的環境是不能用變數平行化的功能嗎?
01/30 00:48, 4F

01/30 08:36, , 5F
openmp不就在gcc內建了?記得要加什麼編譯參數
01/30 08:36, 5F

01/30 09:04, , 6F
-fopenmp
01/30 09:04, 6F

01/31 01:28, , 7F
P+=1這邊有針對P做縮減運算應該是不會有data dependence
01/31 01:28, 7F

01/31 01:36, , 8F
依照你的程式寫法,是因為i,j,k沒有寫入parallel區塊中
01/31 01:36, 8F

01/31 01:37, , 9F
造成i,j,k成共用變數產生race condition
01/31 01:37, 9F

01/31 10:08, , 10F
P也共用了...一直對p做累加
01/31 10:08, 10F

01/31 11:04, , 11F
http://0rz.tw/Ki6hU P有用reduction進入平行區塊會變成
01/31 11:04, 11F

01/31 11:05, , 12F
private給每一個執行序, 離開區快才將執行結果加回共用變數
01/31 11:05, 12F

01/31 11:09, , 13F
如果會變慢的話幹麻還需要設計這個縮簡運算
01/31 11:09, 13F

02/26 23:57, , 14F
i,j,k 不是應該default就已經private了嗎
02/26 23:57, 14F

02/26 23:57, , 15F
應該不是這個問題吧
02/26 23:57, 15F
文章代碼(AID): #1F9MNFwy (C_and_CPP)