Optimization CUDA优化-内核启动条件

Optimization CUDA优化-内核启动条件,optimization,cuda,Optimization,Cuda,我是CUDA的新手,希望了解更多关于优化内核启动条件以加快代码速度的信息。这是一个非常具体的场景,但我将尽可能地概括它,以便将来任何有类似问题的人都可以从中获益 假设我有一个300个元素的数组(数组A),作为输入发送到内核。这个数组由几个重复的整数组成,每个整数都有一个特定于它的设备函数。例如,每次5出现在数组A中时,内核都会执行特定于5的函数。这些功能是设备功能 我如何并行处理这个问题是通过启动320个块(可能不是最好的数目),这样每个块将并行执行与其元素相关的设备功能 CPU将以串行方式处理

我是CUDA的新手,希望了解更多关于优化内核启动条件以加快代码速度的信息。这是一个非常具体的场景,但我将尽可能地概括它,以便将来任何有类似问题的人都可以从中获益

假设我有一个300个元素的数组(数组A),作为输入发送到内核。这个数组由几个重复的整数组成,每个整数都有一个特定于它的设备函数。例如,每次5出现在数组A中时,内核都会执行特定于5的函数。这些功能是设备功能

我如何并行处理这个问题是通过启动320个块(可能不是最好的数目),这样每个块将并行执行与其元素相关的设备功能

CPU将以串行方式处理整个问题,它将逐个元素并逐个调用每个函数,而GPU将为每个块分配一个元素,以便所有320个块都可以访问相关设备函数并同时计算

从理论上讲,对于大量的元素来说,GPU应该更快——至少我认为是这样,但在我的情况下不是这样。我的假设是,由于300个元素是一个小数字,CPU总是比GPU快

这是可以接受的,但我想知道的是,我如何可以减少GPU的执行时间至少一点。目前,CPU需要2.5毫秒,GPU大约需要12毫秒

问题1-如何选择在启动时启动的最佳块/线程数? 首先,我尝试了320个块,每个块有1个线程。然后使用320个螺纹的1个块。执行时间没有实际变化。调整块/线程的数量会提高速度吗

问题2-如果300个元素太小,为什么会这样?我需要多少元素才能看到GPU的性能超过CPU

问题3-我应该研究哪些优化技术

请让我知道,如果有任何这是不是很清楚,我会扩大它

提前谢谢

  • 在内部,CUDA以32个线程为一组管理线程(所谓的warp)。如果每个块有1个线程,设备仍将执行其中的32个线程,那么31个线程将处于发散状态。这可能是一个占用问题,尽管您可能无法在您的设备上观察到它,并且您的问题大小也不确定。多处理器(SM)可以执行的块数也有限制。AFAIR、GeForce 4x可在一个SM上运行多达8个区块。因此,如果您的设备具有8条SMs,那么如果块大小为1,您可以同时运行64个线程。您可以使用一个名为占用率计算器的工具来估计更好的块大小,也可以使用可视化探查器
  • 这只能通过分析来决定。有太多的未知数-例如,您的内存访问与实际计算的比率是多少,任务的并行性如何,等等
  • 我真的建议你从一开始

  • @talonmies的可能复制感谢我在硬件的硬限制下一直在工作的链接。据我所知,块/线程数没有简单的答案,它更多的是一个尝试和错误的东西?我已将所有输入元素保存在恒定内存中,因此访问时间应该很快。对于新手来说,我还应该研究其他一些基本的优化技术吗?这听起来像是一个大不相同的任务。例如,如果在同一个扭曲中得到不同的数字,那么扭曲基本上必须按顺序处理这些数字。这将对性能产生真正的负面影响。有一件事我要考虑的是有特定任务的扭曲(甚至内核)(例如,线程0 - WARPESIZE将专门用于处理5),然后尝试设计该方案来将这些任务分配给这些线程。1。
    的内核启动配置不太可能接近于完全利用机器。2.如果你能先对数组进行排序,你可能会得到更好的GPU结果。