使用了多少个线程/工作项?

时间:2015-06-15 09:11:06

标签: multithreading opencl gpu

我试图了解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上没有线程。线程是程序员的虚拟概念吗?

1 个答案:

答案 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 。底层执行机制未指定,无需映射到任何硬件概念。