请教大家一个问题,我现在的程序流程是这样的:1)调用kernel1,将unsigned short转为cufftComplex数据类型
2)调用cufft库进行傅里叶变换,
3)调用kernel2,在频域进行图像处理;
4)调用cufft库进行傅里叶逆变换;
5)调用kernel3,将cufftcomplex数据类型转回为unsigned short类型。
现在遇到一个很奇怪的问题,我的第一次试验,kernel2里面使用了shared memory,执行时间15.181ms。第二次试验,不使用shared memory,执行时间反而缩短到2.489ms!怎么会缩短了7倍?而且kernel1和kernel3的执行时间也一并缩短了,这是怎么回事?我只动了kernel2,为何kernel1和kernel3的执行时间都变了?
楼主您好,
(1)关于您第一个为何使用shared memory反而不如不使用快的问题,其实:
使用shared memory不一定代表就快,不使用shared memory不一定就慢。
shared memory不是性能的代名词的。
(2)您怎么知道您的kernel 1和3的时间也缩短了?这个基本上应该是您的测时上的问题,也就是说:
实际上您只修改了2, 1和3的时间应该无变换的,您感到缩短几倍了,实际上是您测试本身的问题。建议您跑下profiler, 以profiler给出的时间为准。
感谢来访。皮特。
LZ您好:
在您各个kernel都正确执行并且计时无问题的前提下,您的问题事实上是两个问题:
1:为何kernel 2修改后速度变快。
2:为何其他kernel也变快。这和kernel 2有没有关系。
建议您分离这两个问题加以考虑。
对于1:这需要您实现的具体情况才能加以分析,以及您需要注意一下您的两个实现是否等效。
对于2:考虑到kernel 1是在kernel 2之前执行的,kernel2不可能非因果地影响kernel 1。您需要提供更多的信息,包括您有没有做其他设置,以及两次测时的条件是否一致等。
请您补充详细信息。
祝您编码顺利~
版主您好,我就是在profiler上跑的。。
kernel1和kernel3完全没变,kernel2的第一个版本使用了共享存储器,第二个版本不使用共享存储器。
第一个版本三个kernel的执行时间分别是6.181ms,20.497ms,10.909ms。第二个版本三个kernel的执行时间分别是1.796ms,2.968ms,2.066ms。真的很奇怪。并且不只3个kernel的执行时间发生了变化,kernel占用的寄存器的数量也从15,34,34降到了9,12,9。。。我就只动了kernel2而已,kernel1和kernel3完全没变啊。。
回ice版主,其他的设置都是相同的。。
虽然两次测试中我的kernel执行时间都变了,但是夹在3个kernel之间的2次傅里叶正反变换时间测出来是相同的(用的第三方cufft库函数)。。
LZ您好:
您两次都是同样的debug/release编译么?
release编译会比debug编译快很多,而且少用一些寄存器。
请您检查一下。
祝您好运~
您100%对kernel 1和3进行了改动了,例如您不小心改动了编译参数(例如以前是debug下,现在是release,有了-O2参数等等)。
因为您可能在完全不改动的情况下,让1和3号kernel的寄存器使用量从15个和34个,分别变成了9个和9个的。
您想想是吧?
(同样的代码+同样的编译参数,同样的编译器,如果能编译出截然不同的效果,那就诡异了)
两次都是debug版本。。我就只改了kernel2,其他的设置、编译环境、测时环境都没有变。。
ice版主如果有时间可否远程协助下,万分感谢。。这问题已经困扰我3天了。。
LZ您好:
只负责论坛讨论哦,不负责远程调试的。
就您已给出的信息,我们已经尽了最大的想象力猜测您的问题了。
以及,2#,3#建议您给出的详细信息,您也没全部给出。
只能先到这个程度了。
只有等您进一步分离问题,提供具体细节,才能进一步讨论了。
祝您好运~
谢谢两位版主,我发现问题了,我在一个源文件中把Generate GPU Debug Informantion设成是了。万分感谢横扫千军。。