【发布时间】:2014-05-05 21:47:29
【问题描述】:
我的机器上安装了 CUDA 2.1,它有一个带有 64 个 cuda 内核的显卡。 我编写了一个程序,在该程序中同时初始化 30000 个块(每个块 1 个线程)。但是从 gpu 中得到的结果并不令人满意(它的性能比 cpu 慢)
是不是块数必须小于或等于内核数才能获得良好的性能?还是说性能跟块数没有关系
【问题讨论】:
标签: cuda
我的机器上安装了 CUDA 2.1,它有一个带有 64 个 cuda 内核的显卡。 我编写了一个程序,在该程序中同时初始化 30000 个块(每个块 1 个线程)。但是从 gpu 中得到的结果并不令人满意(它的性能比 cpu 慢)
是不是块数必须小于或等于内核数才能获得良好的性能?还是说性能跟块数没有关系
【问题讨论】:
标签: cuda
CUDA 核心 并不完全是您所说的经典 CPU 上的核心。实际上,它们只能被视为ALU(算术和逻辑单元),它们只能计算准备好的运算。
您可能知道,在您定义的块内,线程是按 warp(32 个线程组)处理的。当您的块被分派到不同的 SM(流式多处理器,它们是 GPU 的实际 核心)上时,每个 SM 都会在一个块内调度 warp,以根据所需的内存访问时间优化计算时间获取线程的输入数据。
问题是线程总是通过它们所属的 warp 处理,所以如果你每个块只有一个线程,它运行的 SM 将无法通过 warp 进行调度,你也不会利用多个线程CUDA 内核可用。您的 CUDA 核心将等待数据处理,因为 CUDA 核心的计算速度比通过内存检索数据要快得多。
GPU 所期待的并不是拥有大量线程数少的块。在这种情况下,您将面临每个 SM 的块限制(此数字取决于您的设备),这迫使您的 GPU 花费大量时间将块放在 SM 上,然后将它们移除以处理下一个那些。您应该增加块中的线程数,而不是增加应用程序中的块数。
【讨论】:
当前所有 CUDA 硬件中的 warp 大小都是 32。每个块使用少于 32 个线程(或不使用每个块 32 个线程的整数倍)只会浪费周期。就目前而言,每个块使用 1 个线程会使 GPU 的 95% 的 ALU 周期处于空闲状态。这就是性能不佳的根本原因。
【讨论】: