2016-07-26 84 views
1

OpenCL API涉及创建“执行上下文”,许多API调用都需要上下文和设备ID。OpenCL上下文是什么意思?他们为什么有道理?

但那些有什么用?我们使用一系列设备创建上下文。这不是一个非常人造的构造吗?我的意思是,如果我们可以说,所有共享一些公共内存空间的设备都是预定义的上下文,那么我认为这是有道理的。但除此之外 - 为什么不只是让设备特定的OpenCL API完全忽略上下文,而与设备相关的多个API则发生在平台级别?

现在,如果您告诉我“哦,但上下文有X或做了哪些设备和平台没有” - 请解释为什么X或Y不应该在设备上下文或平台上下文中。所述clCreateContext reference page(OpenCL的1.2)列出:特定设备:

  • 命令队列
  • 内存:可能是多设备,但由于设备进入上下文的选择是任意的,所以它看起来不像是正确的抽象。
  • 程序和内核对象:为什么这不是设备特定的? (或可能 - 设备和用户特定?)
  • 用于“在上下文中指定的一个或多个设备上执行内核”:不清楚该设备特定的问题(或平台范围,如果我们关心同步化更多)。

PS-CUDA也有“上下文”,但它们是线程特定的和特定于设备的,并封装策略,例如“该线程在同步时是否应该阻塞?或者“在调度GPU工作后该线程是否合格”等)

+0

CUDA一直有类似的上下文概念。控制级别由驱动程序api提供给您http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__CTX.html#group__CUDA__CTX_1g65dc0bc84810e2103a40d8e2cf。运行时API包含可由驱动程序API访问的单个上下文。多个上下文的使用是能够在不执行cudaDeviceReset的情况下销毁一个上下文。 –

+0

@FlorentDUGUET:我会编辑我的答案,但这是一个按设备的上下文,即多个上下文<->一个设备,而不是多个像OpenCL中的多个<->多个。而且,这些CUDA上下文是线程特定的。 – einpoklum

+0

那么,OpenCL是一个标准。我相信他们留下了会议期间讨论的一些功能,当双子座设计或其他实施者希望受益于某种程度的共享内存时。据我所知,这在CUDA上没有实现,但OpenCL是由其他人实现的。这变成讨论/意见。 –

回答

1

为什么上下文需要设备作为参数?因为有些平台有多个设备(即:AMD有CPU设备,也有GPU设备)。如果删除的功能,那么唯一的选择是:

  • 缓冲区是每个设备仅: 这意味着,有没有可能在CL程序中使用多个设备。或者是,但你需要在它们之间进行明确的复制。

    • 看起来很好。但是尝试在8 GPU系统中进行显式拷贝。如果您不首先从特定GPU中删除缓冲区,调用也可能会返回OutOfMemory并导致应用程序崩溃。无论您的应用是完美平衡的,还是特定GPU瓶颈和饱和内存的可能性都非常高。让API处理所有副本更容易。
  • 缓冲区是每者平台: 这意味着,在单GPU的应用程序,你将需要指定缓冲区应该被复制。 解决方案可能会再次显式复制。和以前一样的问题。

此外,上下文提供相同的抽象,GL上下文,孤立你正在使用,清洁和销毁时破坏内部的他们的一切所有的“软”资源。

如果创建上下文对象的应用程序被终止或SEG_FAULTS,那么很容易取消分配资源或应用程序,而不会影响任何其他并行运行的应用程序。


另外:

程序和内核对象:这是为什么不是设备的具体情况? (或者 - ?设备和用户特定的)

内核已经设备特定,因为它们是一个程序内的功能和给定设备的特定实例。

您可能有任意数量的内核由相同的程序创建,但具有不同的参数。这非常有用并且有意义,而不是在每次调用中都有一个内核对象并更改其参数,因此使用多个内核实例更有意义。