作者lgen7604 ()
看板C_and_CPP
標題Re: [問題] 幾個CUDA的問題
時間Sun Nov 29 17:12:56 2009
※ 引述《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