使用推力执行傅里叶变换
Posted
技术标签:
【中文标题】使用推力执行傅里叶变换【英文标题】:Performing Fourier Transform with Thrust 【发布时间】:2012-11-20 01:53:25 【问题描述】:Thrust 是一个用于开始 CUDA 编程的惊人包装器。 我想知道有什么东西可以用推力封装 NVIDIA CUFFT 还是我们需要自己实现?
【问题讨论】:
为什么不使用一个库中包含所有内容的 ArrayFire? 另一篇文章是关于如何使用推力计算外积。我希望下一篇文章是如何在推力中实现 Dijkstra 算法))为什么人们一直在问这个问题? 我也想使用 ArrayFire,实际上我必须使用才能与其他库进行比较。有什么办法吗? 您也可以使用 cudafft 并直接访问代码的 FFT 部分,然后在 Thrust 中执行其他所有操作。或者为它编写一个简单的基于迭代器/容器的包装器。 【参考方案1】:这是一个很晚的答案,只是为了将此问题从未回答列表中删除。
使用带有推力的 cuFFT 应该非常简单,唯一要做的就是将 thrust::device_vector
转换为原始指针。下面报告一个非常简单的例子:
#include <iostream>
#include <cufft.h>
#include <stdlib.h>
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/generate.h>
#include <thrust/transform.h>
int main(void)
int N=4;
// --- Setting up input device vector
thrust::device_vector<cuFloatComplex> d_in(N,make_cuComplex(1.f,2.f)), d_out(N);
cufftHandle plan;
cufftPlan1d(&plan, N, CUFFT_C2C, 1);
cufftExecC2C(plan, thrust::raw_pointer_cast(d_in.data()), thrust::raw_pointer_cast(d_out.data()), CUFFT_FORWARD);
// --- Setting up output host vector
thrust::host_vector<cuFloatComplex> h_out(d_out);
for (int i=0; i<N; i++) printf("Element #%i; Real part = %f; Imaginary part: %f\n",i,h_out[i].x,h_out[i].y);
getchar();
【讨论】:
以上是关于使用推力执行傅里叶变换的主要内容,如果未能解决你的问题,请参考以下文章
数字信号处理傅里叶变换性质 ( 序列傅里叶变换共轭对称性质 | 序列实偶 傅里叶变换 实偶 | 序列实奇 傅里叶变换 虚奇 | 证明 “ 序列实奇 傅里叶变换 虚奇 “ )