OpenCL:工作项、处理元素、NDRange
我和我的同学第一次面对OpenCL。正如所料,我们遇到了一些问题。下面我总结了我们遇到的问题和找到的答案。然而,我们不确定我们是否做得好,所以如果你们能看看我们的答案和下面的问题,那就太好了 我们为什么不把它分成几个问题呢OpenCL:工作项、处理元素、NDRange,opencl,n-dimensional,Opencl,N Dimensional,我和我的同学第一次面对OpenCL。正如所料,我们遇到了一些问题。下面我总结了我们遇到的问题和找到的答案。然而,我们不确定我们是否做得好,所以如果你们能看看我们的答案和下面的问题,那就太好了 我们为什么不把它分成几个问题呢 它们部分地相互关联 我们认为这些是典型的初学者问题。我们咨询的那些同学都回答说:“嗯,我也不明白。” 工作项与处理元素 在我所看到的大多数关于OpenCL的讲座中,他们使用相同的插图介绍计算单元和处理元素以及工作组和工作项。这导致我和我的同学不断混淆这些概念。因此,我们现在提
- 工作项是一个正在执行的内核,而处理元素是一个抽象模型,表示实际执行计算的对象。工作项只是暂时存在于软件中,而处理元素抽象出物理上存在于硬件中的东西。然而,取决于硬件,因此也取决于OpenCL实现,工作项可能被映射到由所谓的处理元素表示的某个硬件并由其执行
问题1:这是正确的吗?有更好的表达方式吗 NDRange 这就是我们如何理解范围的概念:
- 存在的工作项数量由NDRange大小表示。通常,这也被称为全局大小。但是,NDRange可以是一维、二维或三维(“ND”):
- 一维问题是一个线性向量的计算。如果向量的大小为64,并且有64个工作项要处理该向量,则nRange大小等于64
- 二维问题是对图像的一些计算。对于1024x768图像,NDRange大小Gx为1024,NDRange大小Gy为768。这假设有1024x768个工作项用于处理该图像的每个像素。然后,nRange大小等于1024x768
- 一个三维的例子是在三维模型上进行一些计算。此外,还有NDRange size Gz
width*height
的线性向量中。任何3D问题也是如此
各种各样的
问题4:我们被告知,内核(换句话说:工作项)的执行可以使用屏障(CLK\u LOCAL\u MEM\u FENCE)在工作组内同步代码>理解。我们还(一再)被告知工作组不能同步。好吧但是,barrier(CLK\u GLOBAL\u MEM\u FENCE)有什么用呢代码>
问题5:在我们的宿主程序中,我们指定了一个由一个或多个可用平台上的设备组成的上下文。但是,我们只能将内核放入一个所谓的命令队列中,该队列只链接到一个设备(必须在上下文中)。同样:命令队列不链接到先前定义的上下文,而是链接到单个设备。对吗?问题1:几乎正确。工作项是内核的实例(见本标准第3.2节第2段)。另请参见标准中处理元素的定义:
处理元素:虚拟标量处理器。工作项可以是
在一个或多个处理元素上执行
另请参见我提供的答案
问题2和3:根据您的问题,使用多个维度或与数据元素数量完全相同的工作项。这取决于您以及开发过程的简单程度。还请注意,ocl 1.2和以下有一个约束,强制您将全局大小设置为工作组大小的倍数(使用ocl 2.0删除)
问题4:是的,由于障碍,内核执行期间的同步只能在工作组内进行。作为参数传递的标志之间的差异表示内存的类型。使用CLK_LOCAL_MEM_FENCE,所有工作项必须确保必须写入本地内存的数据对其他工作项可见。与CLK_GLOBAL_MEM_FENCE相同,但用于全局内存
问题5:在一个上下文中,您可以有多个设备拥有自己的多个命令队列。正如您所说的,命令队列链接到一个设备,但是您可以将内核从不同的设备排队到不同的命令队列中。请注意,如果两个命令队列尝试访问同一内存对象(不同步),则会出现未定义的行为。当它们各自的作业不相关时,通常会使用两个或多个命令队列
但是,您可以通过事件同步命令队列,事实上,您也可以创建自己的事件(称为用户事件),请参见第5.9节了解事件,第5.10节了解用户事件(标准)
我建议您至少阅读标准的前几章(1至5)。如果你赶时间,至少第二章是词汇表