Re: [問題] cuda C, error : unsupported operation

看板C_and_CPP (C/C++)作者 (嚕嚕嚕)時間13年前 (2013/03/27 10:52), 編輯推噓2(206)
留言8則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《iHakka (iHakka)》之銘言: : __global__ void kernel(float* V,float* VNew,float* rho) { : int step = 0; : int n = 0; : double error =0; : int i = blockIdx.x; : int j = blockIdx.y; 這邊應該是用thread的x, y 你這樣寫所有的thread都會用同樣的i, j, 也就是每一個thread 都做同樣的事情 : for(int t=0;t<5000;t=t+1) : { : if(i > 0 && i < N-1 && j > 0 && j < N-1 ) : VNew[i+j*N]=0.25*(V[i+j*N+1]+V[i+j*N-1]+ : V[i+j*N+N]+V[i+j*N-N]+h*h*rho[i+j*N]); : //error=err(V,VNew); : //if (error < accuracy) : //break; : if(i > 0 && i < N-1 && j > 0 && j < N-1 ) : V[i+j*N]=VNew[i+j*N]; : } 這邊的 for loop 的 index 是t, 但是你裡面完全沒用到t 所以每一次loop也都做一樣的事情, 所以這個code看起來 你只會針對block的最角落的元素做 5000次一樣的運算 每一次都還同時多個thread 讀取同一個位置。 : } -- ζ  幹 遜咖... ξ / -● )> /( ﹊﹊﹊ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.58.34

03/27 12:40, , 1F
我是用kernel<<<grid,1>>>(dev_V,dev_VNew,dev_rho);
03/27 12:40, 1F

03/27 12:41, , 2F
這樣不是表示thread都是1然後是bolck在算嗎?
03/27 12:41, 2F

03/27 12:42, , 3F
即使我把i,j改成blockIdx*blockDim+threadIdx結果還是一樣
03/27 12:42, 3F

03/27 12:42, , 4F
後來我單獨測試只作VNew[i+j*N]=V[i+J*N+1]讀出來的值會錯
03/27 12:42, 4F

03/27 12:44, , 5F
至於t是因為err計算要用atomic操作可是VS邊譯有問題所以我
03/27 12:44, 5F

03/27 12:44, , 6F
先改成給定一定數量的跌代次數來變通
03/27 12:44, 6F

03/27 12:48, , 7F
然後參考GPU跑出來的結果GPU似乎還是有一部分有作運算
03/27 12:48, 7F

03/27 12:49, , 8F
至於同步問題我測過VN=V-->V=VN如果idx是i+j*N是沒問題的
03/27 12:49, 8F
文章代碼(AID): #1HKbxrtG (C_and_CPP)
文章代碼(AID): #1HKbxrtG (C_and_CPP)