看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
gaiger:謝謝 原來是for的起點錯誤。 11/29 17:53
gaiger:剛剛還不知道有blockIdx這個指令 11/29 17:53
gaiger:還有請問大大,你是怎上色的啊? 有什麼網站或軟體可幫上色 11/29 17:59
gaiger:嗎? 11/29 17:59
james732:置底文有 11/29 18:21
gaiger:感恩 又多學一招了 11/29 21:32