我在使用CUDA进行计算时,使用每个线程处理一定量的数据,当数据量增大时,我使用更多的线程(每个线程处理的数据量是不变的),也就是说数据量是与线程数据成正比的,我测试的结果是运行时间与数据量成正比(线性),请各们大牛给解释一下…
LZ您好:
您的测试结果是正确的,并且与您前述信息并不矛盾。
您可能想问的是,线程数量也同步上升了,为何时间不能保持恒定不变。
答案很简单,因为您的GPU已经跑满了。在您的问题中,保证每个线程处理的任务不变的前提下,如果N个线程足以跑满您的GPU,那么增加到2N个线程(同时总任务量也翻倍),您的GPU依然是满载运行,总时间也翻倍。
您不能假定启动的线程数量翻倍您的单位时间的计算量也随之翻倍的(在GPU没跑满的时候或许可以,跑满了就不行了),那样的话超算似乎也太好实现了一点,您说呢?
祝您好运~
谢谢您的回答,我确实是想着线程数量翻倍单位时间的计算量也随之翻倍,还是对GPU不是太了解啊!
还有几个问题想请教您一下
(1)我如何知道什么时候GPU达到饱满的状态呢?我的显卡是GeForce96000 GT
(2)Block和grid的尺寸如何设置才最合适呢?
(3)如何查看每个线程使用的local memory数量和寄存器数量,以及每个block的shared memory数量?我看好多都说查看cubin文件,我这里的这个文件打开之后是乱码啊
LZ您好:
1:简单地说,书写合理且规模不要太大的kernel+足够多的线程+没有其他明显的瓶颈,能大致跑满您的GPU。以及如果您需要测试,可以考虑跑下visual profiler看看相关的测试结果。
2:这两个参数都需要您根据您的实际问题确定。一般的建议是block内不少于192线程,以及用您的总线程数除以每个block的线程数得到block数量。至于block的形状和grid的形状,请您自行根据算法实现方便决定。
3:shared memory用量您是可以直接根据您的程序得到的,您的kernel有没有用shared memory,您看看代码就直接知道了。
此外,这三项指标都可以通过跑visual profiler得到。
大致如上,供您参考。
感谢您周末来访,祝您好运~
ICE您好,我运行了Visual profiler结果如下图所示:
[attach]3250[/attach][attach]3249[/attach]请问在这种情况下怎么积蓄改善呢?谢谢
LZ您好:
新问题请新开主题帖讨论,讨论程序优化请附上您的代码,感谢合作。
祝您好运~
[
好的,谢谢!
受益了。
亲~讨论区不支持无实质内容地顶别人的帖子的哟~