OpenCL:工作项、处理元素、NDRange

OpenCL:工作项、处理元素、NDRange,opencl,n-dimensional,Opencl,N Dimensional,我和我的同学第一次面对OpenCL。正如所料,我们遇到了一些问题。下面我总结了我们遇到的问题和找到的答案。然而,我们不确定我们是否做得好,所以如果你们能看看我们的答案和下面的问题,那就太好了 我们为什么不把它分成几个问题呢 它们部分地相互关联 我们认为这些是典型的初学者问题。我们咨询的那些同学都回答说:“嗯,我也不明白。” 工作项与处理元素 在我所看到的大多数关于OpenCL的讲座中,他们使用相同的插图介绍计算单元和处理元素以及工作组和工作项。这导致我和我的同学不断混淆这些概念。因此,我们现在提

我和我的同学第一次面对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
    问题2:再一次,这是正确的吗

    问题3:这些维度只是为了方便起见,对吗?可以简单地将图像的每个像素的颜色值存储在大小
    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)。如果你赶时间,至少第二章是词汇表