我和我的同学第一次接触 OpenCL。正如预期的那样,我们遇到了一些问题。下面我总结了我们遇到的问题和我们找到的答案。但是,我们不确定我们是否一切顺利,所以如果你们能看看我们的答案和下面的问题,那就太好了。
为什么我们不把它分成单个问题?
- 它们部分地相互关联。
- 我们认为这些是典型的初学者问题。咨询过的同学都说:“嗯,我也不懂。”
工作项与处理元素
在我看过的大多数关于 OpenCL 的讲座中,他们都使用相同的插图来介绍计算单元和处理元素以及工作组和工作项。这导致我和我的同学们不断地混淆这些概念。因此,我们现在提出了一个定义,强调处理元素与工作项非常不同:
- 工作项是正在执行的内核,而处理元素是代表实际执行计算的事物的抽象模型。工作项是仅暂时存在于软件中的东西,而处理元素抽象出物理上存在于硬件中的东西。但是,取决于硬件,因此取决于 OpenCL 实现,工作项可能会映射到由所谓的处理元素表示的某个硬件并由其执行。
问题1:这是正确的吗?有没有更好的表达方式?
ND范围
这就是我们对NDRange概念的理解:
- NDRange 大小表示存在的工作项的数量。通常,这也被称为全局大小。但是,NDRange 可以是一维、二维或三维(“ND”):
- 一维问题将是一些线性向量的计算。如果向量的大小为 64,并且有 64 个工作项来处理该向量,则 NDRange 大小等于 64。
- 二维问题是对图像的一些计算。在 1024x768 图像的情况下,NDRange 大小 Gx 将为 1024,NDRange 大小 Gy 将为 768。这假设有 1024x768 个工作项来处理该图像的每个像素。NDRange 大小则等于 1024x768。
- 一个 3D 示例是在 3D 模型上进行一些计算。此外,还有 NDRange 大小 Gz。
问题2:再一次,这是正确的吗?
问题 3:这些尺寸只是为了方便,对吧?可以简单地将图像的每个像素的颜色值存储在大小为 的线性向量中width * height
。对于任何 3D 问题也是如此。
各种各样的
问题 4:我们被告知内核的执行(换句话说:工作项)可以使用barrier(CLK_LOCAL_MEM_FENCE);
Understood 在工作组内同步。我们还(一再)被告知工作组不能同步。好吧。但是那有什么用barrier(CLK_GLOBAL_MEM_FENCE);
呢?
问题 5:在我们的宿主程序中,我们指定了一个上下文,该上下文由来自一个可用平台的一个或多个设备组成。但是,我们只能将内核排入所谓的命令队列中,该队列恰好链接到一个设备(必须在上下文中)。同样:命令队列没有链接到先前定义的上下文,而是链接到单个设备。正确的?