0
我有以下代碼在執行反向FFT時存在錯誤。正向FFT在打印輸出並對其進行驗證時起作用。但似乎並非如此。有任何想法嗎?這看起來像是我錯過了一個概念嗎?CUDA反向FFT錯誤
碼 - http://pastebin.com/iZYtdcqR
編輯 - 我已經基本上重寫自帶的CUDA工具包樣品代碼。我試圖使用FFT執行卷積,但使用了修改後的算法(實際上是DIF)。
EDIT2 - 對問題的dding代碼。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <cuda_runtime.h>
#include <cufft.h>
typedef enum signaltype {REAL, COMPLEX} signal;
typedef float2 Complex;
void
printData(Complex *a, int size, char *msg) {
if (msg == "") printf("\n");
else printf("%s\n", msg);
for (int i = 0; i < size; i++)
printf("%f %f\n", a[i].x, a[i].y);
}
void
normData(Complex *a, int size, float norm) {
for (int i = 0; i < size; i++) {
a[i].x /= norm;
a[i].y /= norm;
}
}
void
randomFill(Complex *h_signal, int size, int flag) {
// Real signal.
if (flag == REAL) {
for (int i = 0; i < size; i++) {
h_signal[i].x = rand()/(float) RAND_MAX;
h_signal[i].y = 0;
}
}
}
// FFT a signal that's on the _DEVICE_.
void
signalFFT(Complex *d_signal, int signal_size) {
cufftHandle plan;
if (cufftPlan1d(&plan, signal_size, CUFFT_C2C, 1) != CUFFT_SUCCESS) {
printf("Failed to plan FFT\n");
exit(0);
}
// Execute the plan.
if (cufftExecC2C(plan, (cufftComplex *) d_signal, (cufftComplex *) d_signal, CUFFT_FORWARD) != CUFFT_SUCCESS) {
printf ("Failed Executing FFT\n");
exit(0);
}
}
void
signalIFFT(Complex *d_signal, int signal_size) {
cufftHandle plan;
if (cufftPlan1d(&plan, signal_size, CUFFT_C2C, 1) != CUFFT_SUCCESS) {
printf("Failed to plan IFFT\n");
exit(0);
}
// Execute the plan.
if (cufftExecC2C(plan, (cufftComplex *) d_signal, (cufftComplex *) d_signal, CUFFT_INVERSE) != CUFFT_SUCCESS) {
printf ("Failed Executing IFFT\n");
exit(0);
}
}
int main()
{
Complex *h_signal, *d_signal1;
int alloc_size, i;
alloc_size = 16;
// Kernel Block and Grid Size.
const dim3 blockSize(16, 16, 1);
const dim3 gridSize(alloc_size/16 + 1, alloc_size/16 + 1, 1);
h_signal = (Complex *) malloc(sizeof(Complex) * alloc_size);
cudaMalloc(&d_signal1, sizeof(Complex) * alloc_size);
if (cudaGetLastError() != cudaSuccess){
printf("Cuda error: Failed to allocate\n");
exit(0);
}
//cudaMalloc(&d_signal2, sizeof(Complex) * alloc_size);
// Add random data to signal.
randomFill(h_signal, alloc_size, REAL);
printData(h_signal, alloc_size, "Random H1");
cudaMemcpy(d_signal1, h_signal, sizeof(Complex) * alloc_size, cudaMemcpyHostToDevice);
signalFFT(d_signal1, alloc_size);
signalIFFT(d_signal1, alloc_size);
cudaDeviceSynchronize();
cudaMemcpy(h_signal, d_signal1, sizeof(Complex) * alloc_size, cudaMemcpyDeviceToHost);
printData(h_signal, alloc_size, "IFFT");
return 0;
}
謝謝你的發現。不是一個真正的數學人員,cuda文件讓我不知所措。將修復代碼鏈接和數據,以及你的真棒答案:D –
似乎有什麼好笑的事情發生。我不斷收到這些瞬態運行時邏輯錯誤。很多時候,當我嘗試向信號添加填充數據並嘗試fft時,我得到了奇怪的答案,當我回來一段時間後再次運行該程序時,它運行並匹配了我的參考輸出。任何重置內存的提示或沿着這些線的東西? –
除非你有一些片狀的設置(片狀硬件,軟件損壞),否則不需要重置內存或類似的東西。可能最好發表一個新問題將您的意見和問題。試圖在這樣的評論中深入研究是困難的。 –