如何在单个块内执行cuda线程?

时间:2014-10-07 09:29:28

标签: parallel-processing cuda gpu

我有几个关于cuda的问题。以下是一本关于并行编程的书。它显示了如何在设备中分配线程,以便将两个向量相乘,每个向量的长度为8192。

enter image description here

1)在threadblock 0中有15个SIMD线程。这15个线程是并行执行还是在特定时间只执行一个线程?

2)在这个例子中,每个块包含512个元素。这个数字取决于硬件还是程序员的决定?

2 个答案:

答案 0 :(得分:2)

1) 在这个特定的例子中,每个线程似乎被分配给向量中的32个元素。由单个线程执行的代码按顺序执行。

2) 线程块的大小取决于程序员。但是,在执行代码的硬件上,对线程块的数量和大小有限制。有关这方面的更多信息,请参阅此详细解答: Understanding CUDA grid dimensions, block dimensions and threads organization (simple explanation)

答案 1 :(得分:0)

从你的插图中看来:

  • 网格由16个线程块组成,编号从0到15。
  • 每个块由16" SIMD线程"组成,编号为0到15
  • 每个" SIMD线程"计算32个向量元素的乘积。

从图示中不一定明显是" SIMD线程"意味着,在CUDA(OpenCL)的说法中:

  • 32个线程的 warp wavefront 工作项

或:

  • 使用32个元素的线程工作项

我将假设前者(" SIMD线程" = warp / wavefront),因为它在性能方面是更合理的假设,但后者在技术上不正确,它是'只是次优设计(至少在当前的硬件上)。


  

1)在threadblock 0中有15个SIMD线程。这15个线程是并行执行还是在特定时间只执行一个线程?

如上所述,在线程块0中有 16 warp (从0到15,编号为16),每个都由 32个线程组成。这些线程同时并行地以锁步方式执行。经线依次或并行地彼此独立地执行,这取决于底层硬件的能力。例如,硬件可能能够调度多个warp以便同时执行。

  

2)在这个例子中,每个块包含512个元素。这个数字取决于硬件还是程序员的决定?

在这种情况下,它只是程序员的决定,但在某些情况下,还存在可能迫使程序员更改设计的硬件限制。例如,块可以处理的最大线程数,并且网格可以处理最大数量的块。