Re: [問題] 幾個CUDA的問題

看板C_and_CPP (C/C++)作者時間16年前 (2009/11/29 17:13), 編輯推噓2(204)
留言6則, 2人參與, 最新討論串4/4 (看更多)
※ 引述《gaiger (hallowed be my name)》之銘言: : 我又有問題嚕,我把上次的DFT函數 : ,為了利用到 block 改成這樣 : : _global__ static void DFT(int n, float *input, float : *outputRe, float *outputIm ) : { : int k, j; : const float pi = 4.0*atanf(1.0f); : float phase = (-1.0)*(2*pi/n); : int tid = threadIdx.x ; : int bdim = blockDim.x; : int gdim = gridDim.x; : for(k = bdim*gdim + tid; k< n; k += bdim*gdim){ : outputRe[k] = 0.0f; : outputIm[k] = 0.0f; : for(j = 0; j< n ; j++){ : outputRe[k] += input[j]*cosf(phase*j*k); : outputIm[k] += input[j]*sinf(phase*j*k); : }/*for j*/ : }/*for k*/ : }/*_global__ static void DFT*/ : 外面呼叫他就是 DFT<<< numBlock, numThread>>>(n,inputGPU, outputReGPU, : outputImGPU ); : numThread 固定設成16 : 程式到這裡看似沒問題: 當numBlock = 1時 :答案正確 : 但是當 numBlock =2 或四時,答案就像亂數製造機一樣 : 會亂跳一通(特別是在array boundary跳特別利害) : 我在想是不是我程式寫錯,但check半天 似乎也沒錯啊QQ : 還請大牛幫忙 謝謝 : PS : 我的 device 是用 GeForce 9600gt _global__ static void DFT(int n, float *input, float *outputRe, float *outputIm ) { int k, j; const float pi = 4.0f*atanf(1.0f); float phase = (-1.0f)*(2*pi/n); int tid = threadIdx.x; int bid = blockIdx.x; int bdim = blockDim.x; int gdim = gridDim.x; for(k = bid*bdim+tid; k < n; k += gdim*bdim){ outputRe[k] = 0.0f; outputIm[k] = 0.0f; for(j = 0; j< n ; j++){ outputRe[k] += input[j]*cosf(j*k*phase); outputIm[k] += input[j]*sinf(j*k*phase); }/*for j*/ }/*for k*/ }/*_global__ static void DFT*/ gridDim blockIdx blockDim threadIdx 這四個內建變數很重要 好好了解一下使用方法吧 想了解的更詳細請參照 CUDA Programming Guide Appendix B -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.120.36.59

11/29 17:53, , 1F
謝謝 原來是for的起點錯誤。
11/29 17:53, 1F

11/29 17:53, , 2F
剛剛還不知道有blockIdx這個指令
11/29 17:53, 2F

11/29 17:59, , 3F
還有請問大大,你是怎上色的啊? 有什麼網站或軟體可幫上色
11/29 17:59, 3F

11/29 17:59, , 4F
嗎?
11/29 17:59, 4F

11/29 18:21, , 5F
置底文有
11/29 18:21, 5F

11/29 21:32, , 6F
感恩 又多學一招了
11/29 21:32, 6F
文章代碼(AID): #1B4ZiSlU (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1B4ZiSlU (C_and_CPP)