我正在尝试理解GPU的架构,并在不编译或运行的情况下估计一条算术语句的延迟。
我认为下面的代码将只使用一个线程/工作项,尽管我指定了local size = 32。这是正确的吗?
int k = 0;
for (; k < 32000; k++){
A = C * (B + D);
}如果我使用双精度单元( DPU )运行程序,并且NVIDIA Tesla GPU上的每个SM有1个DPU,那么翘曲的大小是多少?它仍然是32个线程(1个线程使用DPU,加上31个线程使用SP)吗?
还有一个问题:根据这个GPU architecture,在真正的图形处理器上没有线程。线程对于程序员来说是一个虚拟的概念吗?
发布于 2015-06-16 09:41:12
我正在尝试理解图形处理器的体系结构,并在不编译或运行的情况下估计一条算术语句的延迟。
我不相信这在任何地方都是公开指定的,而且它在供应商和型号之间有所不同。AMD和NVIDIA的现代独立GPU通常有大约20级的流水线。
我认为下面的代码将只使用一个线程/工作项,尽管我指定了local size = 32。这是正确的吗?
如果您指定32个工作项的NDRange,而不管本地大小如何,您将获得32个工作项。您还没有展示如何启动内核,所以这里的问题并不明确。
如果我使用双精度单元( DPU )运行程序,并且NVIDIA Tesla GPU上的每个SM有1个DPU,那么翘曲的大小是多少?
warp的大小不取决于要执行的指令的类型。翘曲是一个物理概念,类似于SIMD通道。您不能更改它。在NVIDIA硬件上,该值始终为32。
这与SPU和DPU无关。SPU和DPU的数量限制了可以在每个周期发出/停用的单精度和双精度指令的数量(确切的约束因硬件而异,在同一周期内并不总是可以同时发出两种类型的指令)。
假设一个虚构的SM具有32个DPU和1个DPU,这意味着您可以在每个周期发出32条单精度指令和1条双精度指令。
如果所有的32个线程都需要执行一条精度指令,那么它将在一个周期内发出。如果它们都需要执行双精度,它将在32个周期内发出。如果我们假设SM可以并行执行这两个操作,那么它也可以在一个周期内发出1条双精度指令和31条单精度指令。
对程序员来说线程是一个虚拟的概念吗?
是的,在CUDA的说法中,术语“线程”与通常的含义完全无关,它类似于"SIMD通道“。但是请注意,OpenCL没有使用术语线程,它是工作项。底层执行机制是未指定的,并且不需要映射到任何硬件概念。
https://stackoverflow.com/questions/30841358
复制相似问题