为什么CUDA和OpenCL中的GPU线程在网格中分配?

时间:2009-08-27 18:35:16

标签: multithreading opencl gpgpu

我只是在学习OpenCL,而我正试图启动内核。为什么GPU线程是在网格中管理的?

我将详细阅读有关此内容的更多信息,但通过简单的解释会很好。使用GPGPUs时,它总是这样吗?

4 个答案:

答案 0 :(得分:5)

这是一种常见的方法,用于CUDA,OpenCL,我认为是ATI流。

网格背后的想法是在正在处理的数据和执行数据处理的线程之间提供简单但灵活的映射。在简单版本的GPGPU执行模型中,为一维,二维或三维数据网格中的每个输出元素“分配”一个GPU线程。为了处理该输出元素,线程将从输入数据网格中的相应位置或相邻位置读取一个(或多个)元素。通过在网格中组织线程,线程更容易确定要读取的输入数据元素以及存储输出数据元素的位置。

这与常见的多核CPU线程模型形成对比,其中每个CPU核心分配一个线程,每个线程处理许多输入和输出元素(例如四核系统中1/4的数据)。

答案 1 :(得分:1)

简单的答案是GPU设计用于处理2D像素网格的图像和纹理。在DirectX或OpenGL中渲染三角形时,硬件会将其栅格化为像素网格。

答案 2 :(得分:1)

我将引用将方形钉子放入圆孔的经典类比。好吧,在这种情况下,GPU是一个非常方形的洞,并不像GP(通用)所暗示的那样全面。

以上解释提出了2D纹理等的思想.GPU的体系结构使得所有处理都在流中完成,每个流中的流水线相同,因此正在处理的数据需要像这样进行分段。

答案 3 :(得分:0)

这是一个很好的API的一个原因是,通常您正在使用具有多个嵌套循环的算法。如果你有一个,两个或三个循环,那么一个,两个或三个维度的网格很好地映射到问题,给你一个线程来表示每个索引的值。

因此,您在内核中需要的值(索引值)自然会在API中表示。