※ 引述《lgen7604 ()》之銘言:
我又有問題嚕,我把上次的DFT函數
: /* 用 GPU算 DFT的函數 */
: __global__ static void DFT( int numThread, int n, float *input,
: float *outputRe, float *outputIm )
: {
: const int tid = threadIdx.x;
: const int size = n / numThread;
: const float pi = 4 * atanf(1.0f);
: int k, j;
: float phase = (-1) * (2*pi/n);
: for(k = tid * size; k < (tid + 1) * size; k++) {
: 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 i*/
: }/*__global__ static void 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
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.70.178.67