OpenCL上下文是什么意思?他们为什么有意义?

时间:2016-07-26 10:48:32

标签: opencl

OpenCL API涉及创建"执行上下文",许多API调用都需要上下文和设备ID。

但那些用途是什么?我们使用一系列设备创建上下文。它不是一个非常人为的结构吗?我的意思是,如果我们将所有设备共享一些共同的内存空间作为预定义的上下文,那么我想这是有道理的。但除此之外 - 为什么不只是让特定于设备的OpenCL API完全忽略上下文,而与平台级别相关的多设备相关API呢?

现在,如果你告诉我"哦,但是上下文有X或做Y,哪些设备和平台没有"#34; - 请解释为什么X或Y不应该在设备上下文或平台上下文中。 clCreateContext reference page(OpenCL 1.2)列出:

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

PS - CUDA也有" contexts",但这些是特定于线程和特定于设备的,并且在同步时这个线程是否会阻塞"等策略?"或者"这个线程应该在调度GPU工作后产生"等)

1 个答案:

答案 0 :(得分:2)

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

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

    • 一开始似乎没问题。但是尝试在8 GPU系统中进行显式复制。如果您不首先从特定GPU擦除缓冲区,则调用也可能会返回OutOfMemory并使您的应用崩溃。要么你的应用程序完全平衡,要么特定的GPU瓶颈和内存饱和的可能性非常高。让API为您处理所有副本要容易得多。
  • 缓冲区按平台: 这意味着,在单个GPU应用程序中,您需要指定缓冲区的复制位置。 解决方案可能再次是显式复制。与以前一样的问题。

此外,上下文提供与GL上下文相同的抽象,隔离所有" soft"您正在使用的资源,并在销毁时清理并销毁其中的所有内容。

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

另外:

  

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

内核已经是特定于设备的,因为它们是程序和给定设备中函数的特定实例。

您可以使用相同的程序生成任意数量的内核,但使用不同的参数。这非常有用并且有意义,而不是只有一个内核对象并在每次调用中更改其参数,使用多个内核实例更有意义。