看板 C_and_CPP 關於我們 聯絡資訊
修改了一下你的 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