- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 CUFFT 计算图像的 fft。似乎 CUFFT 只提供 fft 的普通设备指针分配给 cudaMalloc
。
我的输入图像是使用 cudaMallocPitch
分配的,但是没有用于处理图像指针间距的选项。
目前,我必须删除行的对齐方式,然后执行 fft,并将结果复制回倾斜指针。我目前的代码如下:
void fft_device(float* src, cufftComplex* dst, int width, int height, int srcPitch, int dstPitch)
{
//src and dst are device pointers allocated with cudaMallocPitch
//Convert them to plain pointers. No padding of rows.
float *plainSrc;
cufftComplex *plainDst;
cudaMalloc<float>(&plainSrc,width * height * sizeof(float));
cudaMalloc<cufftComplex>(&plainDst,width * height * sizeof(cufftComplex));
cudaMemcpy2D(plainSrc,width * sizeof(float),src,srcPitch,width * sizeof(float),height,cudaMemcpyDeviceToDevice);
cufftHandle handle;
cufftPlan2d(&handle,width,height,CUFFT_R2C);
cufftSetCompatibilityMode(handle,CUFFT_COMPATIBILITY_NATIVE);
cufftExecR2C(handle,plainSrc,plainDst);
cufftDestroy(handle);
cudaMemcpy2D(dst,dstPitch,plainDst,width * sizeof(cufftComplex),width * sizeof(cufftComplex),height,cudaMemcpyDeviceToDevice);
cudaFree(plainSrc);
cudaFree(plainDst);
}
它给出了正确的结果,但我不想在函数内部进行 2 次额外的内存分配和复制。我想做这样的事情:
void fft_device(float* src, cufftComplex* dst, int width, int height, int srcPitch, int dstPitch)
{
//src and dst are device pointers allocated with cudaMallocPitch
//Don't know how to handle pitch here???
cufftHandle handle;
cufftPlan2d(&handle,width,height,CUFFT_R2C);
cufftSetCompatibilityMode(handle,CUFFT_COMPATIBILITY_NATIVE);
cufftExecR2C(handle,src,dst);
cufftDestroy(handle);
}
如何使用CUFFT直接计算pitched pointer的fft?
最佳答案
我认为您可能对 cufftPlanMany
感兴趣,它可以让您使用音调进行 1D、2D 和 3D ffts。这里的关键是 inembed 和 onembed 参数。
您可以查看 CUDA_CUFFT_Users_Guide.pdf(第 23-24 页)以获取更多信息。但对于您的示例,您将执行如下操作。
void fft_device(float* src, cufftComplex* dst,
int width, int height,
int srcPitch, int dstPitch)
{
cufftHandle handle;
int rank = 2; // 2D fft
int n[] = {width, height}; // Size of the Fourier transform
int istride = 1, ostride = 1; // Stride lengths
int idist = 1, odist = 1; // Distance between batches
int inembed[] = {srcPitch, height}; // Input size with pitch
int onembed[] = {dstPitch, height}; // Output size with pitch
int batch = 1;
cufftPlanMany(&handle, rank, n,
inembed, istride, idist,
onembed, ostride, odist, CUFFT_R2C, batch);
cufftSetCompatibilityMode(handle,CUFFT_COMPATIBILITY_NATIVE);
cufftExecR2C(handle,src,dst);
cufftDestroy(handle);
}
附言为了这里的示例,我没有添加返回支票。始终检查代码中的返回值。
关于cuda - CUFFT:如何计算倾斜指针的 fft?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14026900/
我编写了一个快速程序来确保我可以正确使用袖口库。当我运行批量大小为“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
我是一名优秀的程序员,十分优秀!