修改一个kernel后其他kernel执行时间竟然会变??

请教大家一个问题,我现在的程序流程是这样的: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,其他的设置、编译环境、测时环境都没有变。。:dizzy::dizzy:
ice版主如果有时间可否远程协助下,万分感谢。。这问题已经困扰我3天了。。

LZ您好:

只负责论坛讨论哦,不负责远程调试的。

就您已给出的信息,我们已经尽了最大的想象力猜测您的问题了。
以及,2#,3#建议您给出的详细信息,您也没全部给出。

只能先到这个程度了。

只有等您进一步分离问题,提供具体细节,才能进一步讨论了。

祝您好运~

谢谢两位版主,我发现问题了,我在一个源文件中把Generate GPU Debug Informantion设成是了。万分感谢横扫千军。。