我是CUDA的新手,想了解更多关于优化内核启动条件以加速我的代码的知识。这是一个相当具体的场景,但我将尽可能地概括它,以便任何其他有类似问题的人在未来都能从中受益。
假设我有一个由300个元素组成的数组(数组A),它作为输入发送到内核。这个数组由几个重复的整数组成,每个整数都有一个特定于它的设备函数。例如,每次5出现在数组A中时,内核执行特定于5的函数。这些函数是设备函数。
我是如何并行化这个问题的:启动320个块(可能不是最好的数量),这样每个块将并行执行与其元素相关的设备功能。
CPU将以串行方式处理整个问题,其中它将逐个元素并逐个调用每个函数,而GPU将为每个块分配一个元素,以便所有320个块都可以访问相关的设备功能并同时计算。
从理论上讲,对于大量的元素,GPU应该更快--至少我是这样认为的,但在我的例子中并非如此,我的假设是,由于300个元素是一个很小的数字,CPU总是比GPU更快。
这是可以接受的,但我想知道的是如何减少至少一点的GPU执行时间。目前,CPU需要2.5毫秒,而GPU大约需要12毫秒。
问题1-如何选择在开始时启动的块/线程的最佳数量?首先,我尝试了320个块,每个块有一个线程。然后1个块,有320个线程。执行时间没有真正的变化。调整块/线程的数量会提高速度吗?
问题2-如果300个元素太小,为什么?大概需要多少个元素才能看到GPU的性能超过CPU?
问题3-我应该研究哪些优化技术?
如果有任何不清楚的地方,请告诉我,我将对其进行扩展。
提前谢谢。
发布于 2013-07-18 10:03:33
开始
https://stackoverflow.com/questions/17710644
复制相似问题