- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 cuFFT 使用 C++ 和 Cuda 为学校作业编写频率过滤应用程序,但我无法让它工作。您可以找到完整的 Visual Studio 2010 解决方案 here . (需要 glut 。)
这是我认为相关的部分:(fourierUtils.cu/194)
//////////////////////////////////////////////////////////////////////////////
// Function to help invoking the kernel, creates the parameters and gets
// the result
__host__
void Process(
BitmapStruct& in_img, // these contain an image in an rgba byte array
BitmapStruct& out_img,
MaskGenerator maskGenerator, // this is a pointer to a device function
float param1, // mask parameters
float param2)
{
// Declare and allocate variables
cufftHandle plan;
cufftReal* img;
cufftReal* dev_img;
cufftComplex* dev_freq_img;
int imgsize = in_img.image_size();
int pixelcount = imgsize / 4;
img = new float[pixelcount];
checkResult(
cudaMalloc(&dev_img, sizeof(cufftReal) * pixelcount));
checkResult(
cudaMalloc(&dev_freq_img, sizeof(cufftComplex) * pixelcount));
// Optimize execution
cudaFuncAttributes attrs;
checkResult(
cudaFuncGetAttributes(&attrs, &Filter));
std::pair<dim3, dim3> params
= Optimizer::GetOptimalParameters(pixelcount, attrs);
// Process r, g, b channels
for(int chan = 0; chan <= 2; chan++)
{
// Init
for(int i = 0; i < pixelcount; i++)
{
img[i] = in_img.pixels[4 * i + chan];
}
checkResult(
cudaMemcpy(dev_img, img, pixelcount, cudaMemcpyHostToDevice));
// Create frequency image
checkResult(
cufftPlan1d(&plan, pixelcount, CUFFT_R2C, 1));
checkResult(
cufftExecR2C(plan, dev_img, dev_freq_img));
checkResult(
cudaThreadSynchronize());
checkResult(
cufftDestroy(plan));
// Mask frequency image
Filter<<<params.first, params.second>>>(
dev_freq_img, in_img.x, in_img.y, maskGenerator, param1, param2);
getLastCudaError("Filtering the image failed.");
// Get result
checkResult(
cufftPlan1d(&plan, pixelcount, CUFFT_C2R, 1));
checkResult(
cufftExecC2R(plan, dev_freq_img, dev_img));
checkResult(
cudaThreadSynchronize());
checkResult(
cufftDestroy(plan));
checkResult(
cudaMemcpy(img, dev_img, pixelcount, cudaMemcpyDeviceToHost));
for(int i = 0; i < pixelcount; i++)
{
out_img.pixels[4 * i + chan] = img[i];
}
}
// Copy alpha channel
for(int i = 0; i < pixelcount; i++)
{
out_img.pixels[4 * i + 3] = in_img.pixels[4 * i + 3];
}
// Free memory
checkResult(
cudaFree(dev_freq_img));
checkResult(
cudaFree(dev_img));
delete img;
getLastCudaError("An error occured during processing the image.");
}
与我见过的官方示例相比,我看不出任何实际差异,但是当我使用 Nsight 对其进行调试时,我的内核接收到的所有 cufftComplex 值都是 NaN,并且 input 之间的唯一区别是和 result图像是结果在底部有一个黑条,无论我使用哪个过滤掩码和什么参数。所有 Cuda 和 cuFFT 调用都返回成功,内核调用后也没有报错。
我做错了什么?
我试过用复杂的数组替换 img 和 dev_img 并使用 C2C 转换并就地进行它们,但它只改变了结果图像上黑条的大小。
感谢您的帮助。
编辑: here是一个不需要过剩的简化版本,也应该在 linux 上编译。
最佳答案
我没有编译和运行你的简化版本,但我认为问题出在 dev_img
的大小上。和 dev_freq_imag
.
考虑 CUFFT 库用户指南第 4.2 节中的示例。它执行就地实数到复数的转换,这与您首先执行的步骤相同。
#define NX 256
cufftHandle plan;
cufftComplex *data;
cudaMalloc((void**)&data, sizeof(cufftComplex)*(NX/2+1)*BATCH);
cufftPlan1d(&plan, NX, CUFFT_R2C, BATCH);
cufftExecR2C(plan, (cufftReal*)data, data);
由于变换的对称性,cufftExecR2C
仅填充 NX/2+1
输出元素,其中 NX
是输入数组的大小。
在您的情况下,您正在执行以下操作:
cufftHandle plan;
cufftReal* dev_img;
cufftComplex* dev_freq_img;
cudaMalloc(&dev_img, sizeof(cufftReal) * pixelcount);
cudaMalloc(&dev_freq_img, sizeof(cufftComplex) * pixelcount);
所以你正在分配一个 cufftReal
数组和一个 cufftComplex
相同大小的数组。当你使用
cufftPlan1d(&plan, pixelcount, CUFFT_R2C, 1);
cufftExecR2C(plan, dev_img, dev_freq_img);
然后只有一半dev_freq_img
由 cufftExecR2C
填充,其余部分包含垃圾。如果您使用 dev_freq_img
的完整范围在Filter
__global__
函数,那么这可能是你的 NaN
的原因秒。
关于c++ - cuFFT 的 NaN 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20265991/
我编写了一个快速程序来确保我可以正确使用袖口库。当我运行批量大小为“1”时,我得到了预期的结果。然而,当我增加批量大小时,我在数据缓冲区末尾得到了看似随机的字节。如果批量大小为 2,则最后三个条目是噪
我知道一个类似的问题是 asked before ,但我遇到了麻烦。这是我写的代码: void fft(const double *indata_real, const double *indata_
我正在使用以下宏进行 CUFFT 错误处理: #define cufftSafeCall(err) __cufftSafeCall(err, __FILE__, __LINE__) inli
我正在尝试使用流异步启动多个 CUDA FFT 内核。 为此,我正在创建我的流、cuFFT 正向和反向计划,如下所示: streams = (cudaStream_t*) malloc(sizeof(
我在使用 CUDA 的 FFT 库时遇到了一些问题。 我将输入声明为 cuDoubleComplex,但编译器返回此类型与 cufftComplex 类型的参数不兼容的错误。通过互联网搜索后,我找到了
我是一名业余爱好者,致力于并行 FFT 操作/同时执行多个文件。比如说,我有 1000 个文件,每个文件都有不同大小的实际数据,即如果一个文件有 22000 个值,其他文件可以有 15000 个值,下
我编写了一个简单的测试程序,我在其中执行 Complex to Complex FT,我只是生成了一些数据 1..50 并将其插入数组的每个索引的实部和虚部。 当我做这样的操作时 IFFT(FFT(A
所以我结合使用 cuFFT 和 CUDA 流功能。我遇到的问题是我似乎无法让 cuFFT 内核以完全并发的方式运行。以下是我从 nvvp 获得的结果。每个流都在 128 张大小为 128x128 的图
我正在尝试使用 CUFFT 计算图像的 fft。似乎 CUFFT 只提供 fft 的普通设备指针分配给 cudaMalloc。 我的输入图像是使用 cudaMallocPitch 分配的,但是没有用于
我在主机代码中使用 cuFFT 库调用,它们工作正常,但我想从内核调用 cuFFT 库。早期版本的 CUDA 没有这种支持,但有动态并行性这可能吗? 如果有关于如何实现这一目标的任何示例,那就太好了。
我正在尝试使用 cuFFT 的回调功能即时执行输入格式转换(例如,计算 8 位整数输入数据的 FFT,而无需先将输入缓冲区显式转换为 float )。在我的许多应用程序中,我需要计算输入缓冲区上的重叠
我对在 cuFFT 中转换音频信号以获得创建频谱图所需的数据很感兴趣。在转换之前尝试从 float 转换为 cufftReal 时,我似乎丢失了所有音频数据。另外,我认为我的实际方法对于获得正确的结果
我在分成多个 GPU 的 block (N*N/p) 上运行 CUFFT,我有一个关于计算性能的问题。首先,介绍一下我是如何做的: 向每个 GPU 发送 N*N/p 个 block 对 p 个 GPU
以下代码改编自here使用 cufftPlan1d 应用于单个一维变换。最终我想执行批处理就地 R2C 转换,但下面的代码使用单独的输入和输出数组执行单个转换。 如何调整此代码以就地执行转换,从而减少
我正在尝试使用 FFTW3 进行实数到复数的 FFT 变换。到目前为止,我已经设法使用异地转换来完成它,但是我在实现它的就地版本时遇到了麻烦。我的印象是,就地转换你唯一需要改变的是:1)确保你的数据数
下面的测试程序为每个 GPU 创建了一个宿主线程。每个主机线程创建一个 cuFFT 计划并执行 FFT。 大多数时候,程序似乎运行无误。但是,有时它会以多种方式失败(请参见下面的示例输出)。有人知道为
我有一个 CUDA 程序用于计算大小为 50000 的 FFT。目前,我将整个数组复制到 GPU 并执行 cuFFT。现在,我正在尝试优化程序,NVIDIA Visual Profiler 告诉我通过
我正在查看 Nvidia SDK 的卷积 FFT 示例(对于大型内核),我知道傅立叶变换背后的理论及其 FFT 实现(至少是基础知识),但我无法弄清楚以下代码的作用: const int fft
我正在使用 cuda 版本 7.5 cufft 来执行一些 FFT 和逆 FFT。使用 cufftExecC2R(.,.) 函数执行逆 FFT 时遇到问题。 实际上,当我在 cufftPlan1d(,
我正在使用 cuFFT 使用 C++ 和 Cuda 为学校作业编写频率过滤应用程序,但我无法让它工作。您可以找到完整的 Visual Studio 2010 解决方案 here . (需要 glut
我是一名优秀的程序员,十分优秀!