一个 CUDA 线程非常轻量级,可以在很少的惩罚下调度/停止。这与 CPU 线程不同,它有很多开销来切换执行和退出执行。因此,CPU 非常适合任务并行,而 GPU 则擅长数据并行。
在 CUDA 架构中,(NVIDIA)GPU 具有“流式多处理器”(SM),每个处理器都将执行一个线程块。每个 SM 都有一组流处理器 (SP),每个流处理器将在任何给定时刻(周期)为一个线程执行指令。
实际上,块内的最小线程数是 1。如果每个块只有一个线程,您的代码将正确执行。但是,将块设置为具有 32 个线程的倍数会更有效。这是由于硬件在 32 个线程的“warp”中调度操作的方式。
您可以交叉编译您的程序。您可以在仿真模式下运行它,即 CPU 正在“仿真”一个 CUDA GPU,但要在硬件上运行,您需要一个 NVIDIA GPU(启用 CUDA,任何最近的东西,2006 年以后左右都可以)。
当前一代高端 GPU 有 240 个内核 (SP),您可以将其视为在任何给定时刻执行 240 个线程,但将 GPU 视为同时执行数千个线程是有用的,因为多个线程的状态(上下文)已加载。
我认为重要的是要认识到 CPU 线程和 GPU 线程之间存在差异。它们确实具有相同的名称,但 GPU 线程是轻量级的,通常在一小部分数据上运行。考虑一个(一组)CPU线程执行非并行工作可能会有所帮助,然后每个CPU线程分叉成数千个GPU线程以进行数据并行工作,然后它们加入回CPU线程。显然,如果你能让 CPU 线程与 GPU 同时工作,那就更好了。
请记住,与 CPU 不同,GPU 是一种吞吐量架构,这意味着程序应该创建许多线程,而不是缓存来隐藏延迟,以便在一些线程等待数据从内存返回时,其他线程可以执行。我建议观看GPU 技术大会上的“Advanced C for CUDA”演讲以获取更多信息。