我有几个关于cuda的问题。以下是一本关于并行编程的书。它显示了如何在设备中分配线程,以便将两个向量相乘,每个向量的长度为8192。
1)在threadblock 0中有15个SIMD线程。这15个线程是并行执行还是在特定时间只执行一个线程?
2)在这个例子中,每个块包含512个元素。这个数字取决于硬件还是程序员的决定?
答案 0 :(得分:2)
1) 在这个特定的例子中,每个线程似乎被分配给向量中的32个元素。由单个线程执行的代码按顺序执行。
2) 线程块的大小取决于程序员。但是,在执行代码的硬件上,对线程块的数量和大小有限制。有关这方面的更多信息,请参阅此详细解答: Understanding CUDA grid dimensions, block dimensions and threads organization (simple explanation)
答案 1 :(得分:0)
从你的插图中看来:
从图示中不一定明显是" SIMD线程"意味着,在CUDA(OpenCL)的说法中:
或:
我将假设前者(" SIMD线程" = warp / wavefront),因为它在性能方面是更合理的假设,但后者在技术上不正确,它是'只是次优设计(至少在当前的硬件上)。
1)在threadblock 0中有15个SIMD线程。这15个线程是并行执行还是在特定时间只执行一个线程?
如上所述,在线程块0中有 16 warp (从0到15,编号为16),每个都由 32个线程组成。这些线程同时并行地以锁步方式执行。经线依次或并行地彼此独立地执行,这取决于底层硬件的能力。例如,硬件可能能够调度多个warp以便同时执行。
2)在这个例子中,每个块包含512个元素。这个数字取决于硬件还是程序员的决定?
在这种情况下,它只是程序员的决定,但在某些情况下,还存在可能迫使程序员更改设计的硬件限制。例如,块可以处理的最大线程数,并且网格可以处理最大数量的块。