本帖最后由 daxiaoyuyu 于 2013-11-3 19:13 编辑
引子:我之前发的一个帖子可能讲的不清楚(之前那个帖子 贴了代码),现在问题改述如下,望有人能解答,不胜感激。
我在程序中有很大量malloc(大概20次)和memcpy(大概50000次)的操作。这些操作封装在函数test()中。
问题: 1. GPU一个线程调用test()的速度比CPU调用test()的速度慢100倍。malloc,memcpy等函数在GPU中为什么会这么慢? 2.当线程量到一定量后(如400个),每个线程都调用操作test(),GPU上速度会比用CPU做400次test()调用快。但是如果开过多的线程(1000个),每个线程都调用test(),GPU会比单纯用CPU来调用1000次test还要慢,而且慢很多。是不是分配的线程过多后,会产生更多的显存碎片,从而会更慢?
我做了一组测试:
在cuda中:(block数 * thread 数) 1次test() 调用: 1*1: 4.3s 400次 test() 调用: 2*200: 10.9s, 4*100: 10.7s :GPU快1.8倍。GPU终于比CPU块了。 600次 test() 调用:3*200: 45.7.6s, 6*100: 47.03s 1000次test() 调用:5*200: 201.4s, 10 * 100: 197.3s, 1*1000: 203.5s
在CPU中: 1次test() 调用:0.047s,CPU快91倍。 400次test() 调用:20s,GPU快1.8倍。GPU终于比CPU块了。 600次test() 调用:31s,CPU快1.5倍 1000次 test() 调用:51s,CPU快4倍。
|