我试图了解GPU的架构并估计一个算术语句的延迟而不编译或运行它。
我认为以下代码只使用一个线程/工作项,尽管我指定了本地大小= 32.它是否正确?
int k = 0;
for (; k < 32000; k++){
A = C * (B + D);
}
如果我使用双精度单元(DPU)运行程序,并且NVIDIA Tesla GPU上每个SM有1个DPU,那么warp的大小是多少?它仍然是32个线程(1个线程使用DPU,加上31个线程使用SP)?
还有一个问题:根据这个GPU architecture,真正的GPU上没有线程。线程是程序员的虚拟概念吗?
答案 0 :(得分:2)
我试图了解GPU的架构并估计一个算术语句的延迟而不编译或运行它。
我不认为这是在任何地方公开指定的,它在供应商和型号之间有所不同。 AMD和NVIDIA的现代独立GPU通常具有大约20个阶段的管道。
我认为以下代码只使用一个线程/工作项,尽管我指定了本地大小= 32.它是否正确?
如果指定32个工作项的NDRange,则无论本地大小如何,您都会获得32个工作项。您还没有展示如何启动内核,因此您的问题不明确。
如果我使用双精度单元(DPU)运行程序,并且NVIDIA Tesla GPU上每个SM有1个DPU,那么变形的大小是多少?
warp的大小不依赖于要执行的指令类型。 Warps是物理概念,类似于SIMD车道。你无法改变它。在NVIDIA硬件上,这总是32。
这与SPU和DPU无关。 SPU和DPU的数量限制了在每个周期可以发出/退出的单精度和双精度指令的数量(硬件之间的确切约束不同,并不总是可以在同一周期中发出两种类型的指令)。 / p>
假设虚拟SM具有32个SPU和1个DPU,这意味着您可以在每个周期发出32个单精度指令和1个双精度指令。
如果所有32个线程都需要执行单个精度指令,它将在一个周期内发出。如果它们都需要执行双精度,它将在32个周期内发出。如果我们假设SM可以并行执行,那么它也可以在一个周期内发出1个双精度指令和31个单精度指令。
线程是程序员的虚拟概念吗?
是的,用CUDA说法用“线程”这个术语与通常含义完全无关,它类似于“SIMD lane”。但请注意,OpenCL不使用术语thread,它是 work-item 。底层执行机制未指定,无需映射到任何硬件概念。