我的机器上安装了CUDA 2.1,它有一个带有64个cuda核心的显卡。 我编写了一个程序,我同时初始化30000个块(每个块1个线程)。但是没有从gpu获得令人满意的结果(它的执行速度比cpu慢)
为了获得良好性能,块数必须小于或等于内核数吗?或者是性能与块数无关
答案 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周期空闲。这是表现不佳的根本原因。