system
2013 年11 月 14 日 07:29
1
新手,刚接触cuda,有很多问题不解,望大侠指教
有100M个数据, 我想在kernel中用100个block, 每个block 有1k个线程, 每个线程做1k个点的fft处理,然后问题出来了…
1.请问我这样处理的方式有没有问题,感觉和指南里面的操作方式差异很大…
2.关于block和thread的大小设置,我程序中thread最大512的时候(查看显卡block中最大线程数是1024),kernel就不运行了,这个是怎么回事…
3.我需要在kernel函数中开辟一定大小的内存用于存放数组或指针,kernel函数运算完成后,显卡对这些内存是怎么管理的
4.如果开辟内存的话,每个block中的开辟的总内存数会相当高,会对执行效率有多大的影响…
或者有没有其他好的处理方式,恳请各位大侠指教
system
2013 年11 月 14 日 07:41
2
因为fft只是众多处理环节中的一部分,如果用cufft的话必然要使用cudamemcpy进行多次的数据传输,因此上面的思路是否行的通,还请大家指教,谢谢
system
2013 年11 月 14 日 08:08
3
LZ您好:
先回答一下您的2#的问题,您将FFT过程嵌入到您的算法中,这个原则上是可以的,并非一定要使用cufft算好再复制。
下面回答您1#的问题:
1:你这样安排的话,估计还是可以跑的,但是一个线程做1000点的FFT计算,这个资源占用比较高,而且访存上可能不能合并访问,所以效果可能不好。
建议采取一组线程合作计算FFT的方式,或者您也可以评估一下您的FFT程序与cufft计算+copy的总时间相比,哪个更好。
2:这个也是正常现象的,虽然您block还没有达到最大允许线程数量,但是您的其他资源使用量,比如shared memory或者寄存器使用量已经超过了限值,导致kernel无法执行。
3:您写在kernel里面的变量是局部变量的,同时是每个线程私有的(__shared__为block共有),kernel结束以后(实际上该block结束以后)这些空间都会被释放掉。这一点和C/C++的函数的局部变量情况类似。如果您需要保存一些数据,请写到global memory中,这样即便kernel结束,只要没有主动释放该空间,且程序还没有结束的话,变量是一直存在的。
4:这个跟您的实际写法有关,不同写法差异很大,申请不同类型的存储空间差异也很大。
无法直接建议有没有其他的处理方式,您甚至都没有阐述您的具体算法什么的,而且我也不懂FFT的具体实现。
大致如此了,祝您好运~
system
2013 年11 月 14 日 10:26
4
非常感谢版主的答复,因为刚接触cuda,很多地方都不清楚,可能问题都比较浅显,望谅解
我的问题是有很长一段数据(相当长),需要挑选出其中的有用信号。因而需要将数据从时域转换到频率(fft),进行滤波,再将频率转换到时域(ifft),之后再做其他一系列相关的处理。
1.因为数据量相当大,而fft计算恰好又不方便使用多个线程一起处理,才考虑由每个线程单独处理一段数据(时域到频率,滤波,频率到时域,其他信号处理),然后再将多个线程的处理结果合并。。。
2.请问block和thread的大小设置有没有什么可以作为参考的依据,可以创建的最大线程数和硬件之间的关系是怎么样的。
3.还有每个block块占用的资源怎么统计,命令行中设置了–ptxas-options=-v之后,编译时显示的占用资源好像还好显卡的结构Architecture还有关系,这个有没有一个综合统计结果啊。
4.再请教下,在线程内部建立数组或指针的做法是否可取,还有这些数组或指针到底是分配到寄存器或者其他存储器的,与数组和指针的大小有关系么
谢谢
system
2013 年11 月 14 日 10:30
5
再次感谢版主的热心答复,我在其他几个论坛也发了帖子,不过都是一点动静都没有。。。以后就留这里了,希望版主不要烦我
system
2013 年11 月 14 日 10:41
6
LZ您好:
1:我不认同您的观点,GPU计算中大量情况都是线程协作实现的并行,一个线程处理一段连续的数据的话,访存效率一般都上不去的,还不要说其他的限制。实际上cufft就是多线程协作变换的,而绝非您所说的“fft不方便使用多个线程一起处理”。
此外,我建议您就先使用cufft吧,哪怕有复制开销,先把原型整出来,后面对整个CUDA编程更加了解了,再考虑设计一个定制的高效的fft代码并集成到您的代码中。
2:确切地说,您这两个参数,前者是the number of blocks per grid,后者叫the numbr of threads per block。这些参数根据您使用的硬件不同有不同的最大限值,以及后者常用的典型值为192,256,512等。
至于究竟如何选择,要考虑算法具体实现和各种限制,综合选定,没有一个一两句可以说清楚的普适回答。
各种硬件对应的限值请参考CUDA C Programming Guide的附录。
3:您可以看profiler的结果,以及确实在有些情况下和GPU的计算能力版本/architecture有关。以及,如果您熟悉这些参数的话,这就是一个“综合的结果”,不知道您还需要什么样的“综合结果”。
4:请参考3#的回答,以及一般请不要在kernel内直接定义较大的数组,和使用malloc来申请global memory。
大致如此,祝您好运~
system
2013 年11 月 14 日 10:46
7
欢迎您来到cudazone@China,这里的大门永远为您敞开~