OpenCL API涉及创建"执行上下文",许多API调用都需要上下文和设备ID。
但那些用途是什么?我们使用一系列设备创建上下文。它不是一个非常人为的结构吗?我的意思是,如果我们将所有设备共享一些共同的内存空间作为预定义的上下文,那么我想这是有道理的。但除此之外 - 为什么不只是让特定于设备的OpenCL API完全忽略上下文,而与平台级别相关的多设备相关API呢?
现在,如果你告诉我"哦,但是上下文有X或做Y,哪些设备和平台没有"#34; - 请解释为什么X或Y不应该在设备上下文或平台上下文中。 clCreateContext reference page(OpenCL 1.2)列出:
PS - CUDA也有" contexts",但这些是特定于线程和特定于设备的,并且在同步时这个线程是否会阻塞"等策略?"或者"这个线程应该在调度GPU工作后产生"等)
答案 0 :(得分:2)
为什么上下文需要设备作为参数?因为某些平台有多个设备(即:AMD有CPU设备和GPU设备)。如果删除该功能,则唯一的选项是:
缓冲区仅适用于每台设备: 这意味着在CL程序中不可能使用多个设备。或者它是,但你需要在它们之间进行明确的复制。
缓冲区按平台: 这意味着,在单个GPU应用程序中,您需要指定缓冲区的复制位置。 解决方案可能再次是显式复制。与以前一样的问题。
此外,上下文提供与GL上下文相同的抽象,隔离所有" soft"您正在使用的资源,并在销毁时清理并销毁其中的所有内容。
如果创建上下文对象的应用程序被终止或SEG_FAULTS,则很容易取消分配资源或该应用程序,而不会影响并行运行的任何其他应用程序。
另外:
程序和内核对象:为什么这不是特定于设备的? (或者 - 设备和用户特定的?)
内核已经是特定于设备的,因为它们是程序和给定设备中函数的特定实例。
您可以使用相同的程序生成任意数量的内核,但使用不同的参数。这非常有用并且有意义,而不是只有一个内核对象并在每次调用中更改其参数,使用多个内核实例更有意义。