【发布时间】:2014-12-01 16:36:20
【问题描述】:
我有几个关于 cuda 的问题。下图取自一本关于并行编程的书。它显示了如何在设备中为两个长度为 8192 的向量相乘分配线程。
1) 在线程块 0 中有 15 个 SIMD 线程。这 15 个线程是并行执行的,还是在特定时间只执行一个线程?
2) 在本例中,每个块包含 512 个元素。这个数字是取决于硬件还是程序员的决定?
【问题讨论】:
标签: parallel-processing cuda gpu
我有几个关于 cuda 的问题。下图取自一本关于并行编程的书。它显示了如何在设备中为两个长度为 8192 的向量相乘分配线程。
1) 在线程块 0 中有 15 个 SIMD 线程。这 15 个线程是并行执行的,还是在特定时间只执行一个线程?
2) 在本例中,每个块包含 512 个元素。这个数字是取决于硬件还是程序员的决定?
【问题讨论】:
标签: parallel-processing cuda gpu
1) 在这个特定的示例中,每个线程似乎都分配给了向量中的 32 个元素。由单个线程执行的代码按顺序执行。
2) 线程块的大小由程序员决定。但是,考虑到执行代码的硬件,线程块的数量和大小存在限制。有关这方面的更多信息,请参阅这个详尽的答案: Understanding CUDA grid dimensions, block dimensions and threads organization (simple explanation)
【讨论】:
从你的说明看来:
用 CUDA (OpenCL) 的说法,“SIMD 线程”是否意味着,从插图中不一定很明显:
或:
我会假设前者(“SIMD 线程”= warp/wavefront),因为从性能角度来说这是一个更合理的假设,但后者在技术上并不是不正确的,它只是次优设计(至少在当前硬件上) )。
1) 在线程块 0 中有 15 个 SIMD 线程。这 15 个线程是并行执行的,还是在特定时间只执行一个线程?
如上所述,线程块 0 中有 16 个线程(编号从 0 到 15,即 16 个),每个线程块由 32 个线程 组成。这些线程同步并行执行。根据底层硬件的功能,warp 彼此独立地执行,顺序或并行。例如,硬件可能能够调度多个 warp 以同时执行。
2) 在本例中,每个块包含 512 个元素。这个数字是取决于硬件还是程序员的决定?
在这种情况下,这只是程序员的决定,但在某些情况下,也存在可能迫使程序员更改设计的硬件限制。例如,一个块可以处理的最大线程数,一个网格可以处理的最大块数。
【讨论】: