首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CUDA优化-内核启动条件

CUDA优化-内核启动条件
EN

Stack Overflow用户
提问于 2013-07-18 05:31:52
回答 1查看 372关注 0票数 0

我是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-我应该研究哪些优化技术?

如果有任何不清楚的地方,请告诉我,我将对其进行扩展。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-07-18 10:03:33

  1. 在内部,CUDA以32个线程为一组管理线程(所谓的warps)。如果每个块有一个线程,那么设备仍将执行其中的32个线程- 31个线程将只是处于不同的状态。这是一个潜在的占用问题,尽管你可能在你的设备上和你的问题大小中观察不到它。对于给定的多处理器(SM)可以执行的块的数量也有限制。此外,GeForce 4x可以在一个SM上运行多达8个数据块。因此,如果你有一个有8个SMs的设备,如果你的块大小是1,你可以同时运行64个线程。你可以使用一个叫做占用计算器的工具来估计一个更好的块大小-或者你可以使用一个可视化的分析器。
  2. 这只能通过分析来决定。有太多的未知数-例如,你的内存访问与实际计算的比率是多少,你的任务的并行化程度,等等。
  3. 我真的建议你从best practices guide.

开始

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17710644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档