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

时间:2011-06-13 11:35:10

标签: cuda

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

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

2 个答案:

答案 0 :(得分:16)

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

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

问题是线程总是通过它们的属性warp来处理,所以如果每个块只有一个线程,那么它运行的SM将无法通过warp进行调度,你将无法利用多个线程提供CUDA核心。您的CUDA核心将等待数据处理,因为 CUDA核心计算速度比通过内存检索数据更快。

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

答案 1 :(得分:5)

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