让我们走nVidia Fermi Compute Architecture。它说:
第一款基于Fermi的GPU,采用30亿个晶体管实现,具有多达512个CUDA内核。 CUDA核心为每个线程执行浮点或整数指令。 512个CUDA内核由16个SM组成,每个内核32个内核。
[...]
每个CUDA处理器都有一个完全流水线整数算术逻辑单元(ALU)和浮点单元(FPU)。
[...]
在Fermi中,新设计的整数ALU支持所有指令的完整32位精度,符合标准编程语言要求。整数ALU也经过优化,可有效支持64位和扩展精度操作。 V
据我所知,以及我不清楚的是,GPU在所谓的 warps 中执行线程,每个warp由~32个线程组成。每个warp只分配给一个核心(是真的吗?)。那么这是否意味着单个SM的32个内核中的每一个都是SIMD处理器,其中单指令处理 32个数据部分?如果是这样,那么为什么我们说warp中有32个线程,而不是单个SIMD线程?为什么内核有时被称为标量处理器,而不是向量处理器?
答案 0 :(得分:14)
每个warp只分配给一个核心(是真的吗?)。
不,这不是真的。 warp是32个执行线程的逻辑组件。要从单个warp执行单个指令,warp调度程序通常必须安排 32 执行单元(或#34;内核",尽管" core"的定义;有点宽松)。
核心实际上是标量处理器,而不是矢量处理器。 32个核心(或执行单元)由warp调度程序编组,以跨32个线程执行单个指令,这是" SIMT"绰号来自。
答案 1 :(得分:4)
首先让我们回想一下,“CUDA核心”一词是nVIDIA营销说话。这些核心与CPU具有核心的核心不同。同样,“CUDA线程”与我们在CPU上知道的线程不同。
GPU上的CPU内核相当于"symmetric multiprocessor":它有自己的指令调度程序/调度程序,自己的L1缓存,自己的共享内存等。它是CUDA线程块而不是分配给GPU核心的 warps ,即分配给流式多处理器。在SM中,选择warp以针对整个warp安排指令。从CUDA的角度来看,这些是32个单独的线程,它们是指令锁定的;但这与说一个warp就像一个单独的线程没有什么不同,它只执行32通道的SIMD指令。当然这不是一个完美的类比,但我觉得它很合理。你在CPU SIMD通道上没有的东西掩盖了哪些通道正在执行,其中非活动通道不会影响有效通道的寄存器值设置,存储器写入等。
我希望这对你有直观的意义(或者你可能在过去的两年里自己想到了这一点)。