作者lgen7604 ()
看板C_and_CPP
標題Re: [問題] 幾個CUDA的問題
時間Thu Nov 26 19:45:17 2009
修改了一下你的 function
/*這程式用CPU製造 sin波*/
void GenerateDATA( int n, float *data, float freq )
{
float dt = 1.0f / (n-1);
const float pi = 4 * atanf(1.0f);
for(int i = 0; i < n; i++) {
data[i] = sinf(2*pi*freq*i*dt);
}/*for */
} /*GenerateNumbers*/
/* 用 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 */
這樣應該就能執行出接近正確的結果了吧
numThread最多只能設256 因為resource的問題
至於精確度...沒辦法 float差不多就只能這樣了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.114.75.239
※ 編輯: lgen7604 來自: 140.114.75.239 (11/26 19:48)
→ WPC001:CUDA不是已經支援64bits浮點數了嗎? 11/26 19:58
→ lgen7604:還要看硬體啊 9600GT的相容性是不能用double的 11/26 20:05
推 gaiger:謝謝legen7604大大,那請問 (float)atan(1.0)與 atanf(1.0) 11/26 21:34
→ gaiger:有什麼本值上的不同啊? 11/26 21:34
→ gaiger:不都是強轉double為 float嗎? QQ 11/26 21:34
→ lgen7604:atanf(1.0f)的輸入,運算,回傳值都是float 而atan(1.0)的 11/26 21:49
→ lgen7604:輸入,運算,回傳值都是double 只有在最後才將回傳值轉為 11/26 21:49
→ lgen7604:float 精確度會比較高 11/26 21:49
推 sunneo:你其實可以用GetLastError看kernel有沒有成功 11/27 02:25
→ sunneo:另外GPU的memory不會全部給CUDA使用,桌面環境會挖掉一些 11/27 02:27