机器上的线程数和cuda核心数之间的关系(在CUDA C中)

Pus*_*ade 8 cuda

我的机器上安装了CUDA 2.1,它有一个带64个cuda核心的显卡.我编写了一个程序,我同时初始化30000个块(每个块1个线程).但是没有从gpu获得令人满意的结果(它的执行速度比cpu慢)

为了获得良好的性能,块的数量是否必须小于或等于内核的数量?或者是性能与块数无关

jop*_*rat 16

CUDA核心并不是您在传统CPU上称之为核心的核心.实际上,它们只能被视为ALU(算术和逻辑单元),它们只能计算就绪操作.

您可能知道在您定义的块内每个warp(32个线程组)处理线程.当在不同的SM(流式多处理器,它们是GPU 的实际核心)上调度块时,每个SM调度块内的warp,以优化获取线程输入数据所需的内存访问时间的计算时间.

问题是线程总是通过其所属的warp处理,因此如果每个块只有一个线程,则它运行的SM将无法通过warp进行调度,并且您将无法利用多个可用的CUDA核心.您的CUDA核心将等待数据处理,因为CUDA核心计算速度远远快于通过内存检索数据.

拥有大量具有少量线程的块并不是GPU正在等待的.在这种情况下,您将面对每个SM限制阻止(此数量取决于您的设备),这会强制您的GPU花费大量时间将块放在SM上,然后将其删除以处理下一个.您应该增加块中的线程数而不是应用程序中的块数.

  • @ Jeb11:在编辑帖子之前检查你的断言.开普勒的经线尺寸仍未改变.它与每个SM的CUDA核心数量完全无关,即192.有关详细信息,请参阅http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#simt-architecture. (3认同)

tal*_*ies 5

当前所有CUDA硬件中的扭曲大小为32。每个块使用少于32个线程(或者不使用每个块32个线程的整数倍)只会浪费周期。就目前而言,每个块使用1个线程会使GPU的95%的ALU周期闲置。这就是性能不佳的根本原因。