海南有智能家居系统嘛的四大优势有哪些

关于用CUDA对矩阵做FFT
来源:csdn
【如果我想对一个M*N的矩阵做行FFT或者列FFT,及一行一行的做FFT或者一列一列的做FFT,有什么有效的方法?】
用cuFFT好了,类似fftw的形式,1-n维的矩阵都可以,速度还可以的。
一行一行直接给地址和长度,一列一列你先把矩阵翻转一下吧。
chenmoumou:
CUDA中有没有按例做FFT的函数呢?
chenmoumou:
因为转置会影响效率,不知道CUDA中有没有既可以行变化也可以列变化的函数呢?
chenmoumou:
还有我想问一下,可不可以在kernel函数中用CUDA的FFT的函数做FFT?
没有啊,列里面显存不连续的,没有这样的函数啊。
你另外开一块显存,翻转一下不会花太多时间的。
下面这个我以前做图像带阻滤波的,你去看看sdk也行。
pSrc,pDst都是内存中图像(二维数组),一个原始图像,一个处理后图像。
int cuBandLimitPro(unsigned short* pSrc, unsigned short* pDst){
cuFloatComplex* hS
cuFloatComplex* hD
cuFloatComplex* dD
int imgSize = imgWidth * imgH
hSrc = (cuFloatComplex*)malloc(sizeof(cuFloatComplex) * imgSize);
hDst = (cuFloatComplex*)malloc(sizeof(cuFloatComplex) * imgSize);
cudaMalloc((void**) &dData, sizeof(cuFloatComplex) * imgSize);
cufftPlan2d(&plan, imgWidth, imgHeight, CUFFT_C2C);
for(int i = 0; i & imgS i ++)
hSrc[i].x = pSrc[i];
cudaMemcpy(dData, hSrc, sizeof(cuFloatComplex) * imgSize, cudaMemcpyHostToDevice);
cufftExecC2C(plan, (cuFloatComplex*)dData, (cuFloatComplex*)dData, CUFFT_FORWARD);
// Band-Stop Filter
// 这里按需求随便写点带阻、带通的东西。
cufftExecC2C(plan, (cuFloatComplex*)dData, (cuFloatComplex*)dData, CUFFT_INVERSE);
cudaMemcpy(hDst, dData, sizeof(cuFloatComplex) * imgSize, cudaMemcpyDeviceToHost);
for(int i = 0; i & imgS i ++){
temp = hDst[i].x / imgSize / 4;
//temp = pFFTR[i][0] / 2;
if(temp & 0)
pDst[i] = 0;
else if(temp & cuBLMaxValue)
pDst[i] = cuBLMaxV
pDst[i] = (unsigned short)(temp + 0.5f);
cudaFree(dData);
free(hSrc);
free(hDst);
chenmoumou:
你上面的程序是不是设置上有点小小的问题,图像应该是实数,而你将它转成复数,虚部为0,这样做应该会影响运行效率吧。你可以试试用实数转负数这个函数。
再问一个问题,在kernel函数中可以用cufftExecC2C做FFT?还有我感觉一个main函数中应该可以有好几个不同kernel函数吧。
实数FFT,是R2C和C2R吧,cuda里面也是提供的,你可以试试,我试过,但是有点什么问题,后来还是用C2C了。忘记了什么问题了。。
你说的kernel函数是指内核发射吗?这个C2C是做好直接用的,当然里面应该会有内核发射。
在FFT和iFFT之间的滤波,你可以自己做个内核发射的 __global__ 函数。
chenmoumou:
可能是我没有说清楚,我的意识是我先写一个 __global__ testkernle()函数,然后我想在testkernel{}里面调用cufftExecC2C做FFT,不知道这个方法是否可行。我问过其他人,有人说不能 __global__ 函数调用cufftExecC2C做FFT,只能在主机端做。但是我还是想多找个人来求证一下。
第二个问题是,我觉得一个主机端函数应该可以调用多个__global__ 函数,如一个main()里面可以调用testkernel1&&&&&&,testkernel2&&&&&&,testkernel3&&&&&&,我现在只是在验证,还没成功,不知道你有没有过这样的经历。
是啊,第一个不能的,而且这样做完全不符合逻辑。
kernelA&&&..&&&(..)
kernelB&&&..&&&(..)
这样的话,随便几次都可以啊。
hhjj881226:
您好,我也在做fft方面的问题,有几个问题想请教一下。我的东西要求生成dll之后,在其他地方调用,我试了一下,发现一调用我的程序就崩溃了。。。但是我用main()函数测试的时候结果都是好的,不知道你有没有遇到相似的情况
11楼,其他机器是否支持cuda的N卡,是否装了最新的驱动,是否装了vcredist?
如果均是,那你看看是不是少了cuda的dll,cuda目录下面的
cudart32_32_16.dll
cufft32_32_16.dll
也一起复制过去,便不会报错。
hhjj881226:
谢谢楼上的大哥,我去试试啊
问问,就是做了fft之后的数据是经过翻转后中心对称的数据吗
powerustc:
fftw怎么实现这种呢?
怎么用CUFFT实现对图像的FFT变化呢?
xiuxiudada:
楼主有源程序吗?给发一份。十分感谢。
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动CUFFT_Library_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
CUFFT_Library
上传于|0|0|文档简介
&&NAVIDA CUFFT LIBRARY USER'S GUIDE
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩45页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢利用matlab和NVIDIA Nsight进行cufft CUDA代码分析
利用matlab和NVIDIA Nsight进行cufft CUDA代码分析
cuda&VS&matlab&arrayfire&GPU
分析之前肯定得有需要分析的代码,这里以fft为例:
1、fft的C-mex cuda代码如下所示:
#include &mex.h&
#include &cuda_runtime.h&
#include &cufft.h&
void mexFunction (int nlhs,mxArray *plhs[],int nrhs,mxArray *prhs[])
& & if(nrhs != 1)
& & & & mexErrMsgTxt(&Invaid number of input arguments&);
& & if(! mxIsSingle(prhs[0])&&!mxIsSingle(prhs[1]))
& & & & mexErrMsgTxt(&input data type must be single&);
& & float* A=(float*)mxGetData(prhs[0]);
& & int numARows = mxGetM(prhs[0]);
int numACols =mxGetN(prhs[0]);
& & float *deviceA;
& & cudaMalloc(&deviceA,sizeof(float)*numARows*numACols);
& & cudaMemcpy(deviceA,A,numARows*numACols*sizeof(float),cudaMemcpyHostToDevice);
& & int outRows = numARows/2+1;
& & int outCols = numAC
& & cufftComplex * deviceO
& & cudaMalloc(&deviceOut,sizeof(cufftComplex)*outRows*outCols);
& & cufftH
& & cufftPlan2d(&plan,numACols,numARows,CUFFT_R2C);
& & cufftExecR2C(plan,deviceA,deviceOut);
& & float* out =(float*)mxMalloc(sizeof(cufftComplex)*outRows*outCols);
& & cudaMemcpy(out,deviceOut,outRows * outCols *sizeof(cufftComplex),cudaMemcpyDeviceToHost);
& & plhs[0] = mxCreateNumericMatrix(outRows,outCols,mxSINGLE_CLASS,mxCOMPLEX);
& & float* real = (float*)mxGetPr(plhs[0]);
& & float* imag = (float*)mxGetPi(plhs[0]);
& & float*complex =
& & for(int c=0;c&outC++c)
& & & & for(int r=0;r&outR++r)
& & & & & & *real++=*complex++;
& & & & & & *imag++=*complex++;
& & mxFree(out);
& & cufftDestroy(plan);
& & cudaFree(deviceA);
2、打开vs,找到如下所示的NSIGHT,点击下图红圈所示按键
3、选择matlab作为调试的application,注意如果是64位的操作系统,一定要去选择win64下面的matlab执行文件,不然后面会出错,另外,选择好测试文件的路径,如下所示:
4、往下滑动,找到activity type,选中如下所示的cuda application,我们发现application中的control的launch可以用了,点中它,那么就启动了matlab和vs。
5、执行测试文件,在matlab中执行m文件,或者command window中直接输入,执行前我们可以按下如上图所示的capture control中的start进行kernel捕获,可以多次进行尝试,完了得到如下所示的分析结果。
我的热门文章
即使是一小步也想与你分享本帖子已过去太久远了,不再提供回复功能。CUDA快速傅里叶变换(cuFFT)阅读笔记(一)
编写的程序能够运行在CUDA
GPU上。而CUFFT则是纯CUDA接口的快速傅里叶变换库。
#define NX 256
#define BATCH 10
cufftComplex *
cudaMalloc((void**)&data, sizeof(cufftComplex)*NX*BATCH);
cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH);
cufftExecC2C(plan, data, data, CUFFT_FORWARD);
cudaThreadSynchronize();
cufftDestroy(plan);
cudaFree(data);
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?

我要回帖

更多关于 智能家居系统的应用 的文章

 

随机推荐