OpenCL API涉及创建“执行上下文”,许多API调用都需要上下文和设备ID。OpenCL上下文是什么意思?他们为什么有道理?
但那些有什么用?我们使用一系列设备创建上下文。这不是一个非常人造的构造吗?我的意思是,如果我们可以说,所有共享一些公共内存空间的设备都是预定义的上下文,那么我认为这是有道理的。但除此之外 - 为什么不只是让设备特定的OpenCL API完全忽略上下文,而与设备相关的多个API则发生在平台级别?
现在,如果您告诉我“哦,但上下文有X或做了哪些设备和平台没有” - 请解释为什么X或Y不应该在设备上下文或平台上下文中。所述clCreateContext reference page(OpenCL的1.2)列出:特定设备:
- 命令队列。
- 内存:可能是多设备,但由于设备进入上下文的选择是任意的,所以它看起来不像是正确的抽象。
- 程序和内核对象:为什么这不是设备特定的? (或可能 - 设备和用户特定?)
- 用于“在上下文中指定的一个或多个设备上执行内核”:不清楚该设备特定的问题(或平台范围,如果我们关心同步化更多)。
PS-CUDA也有“上下文”,但它们是线程特定的和特定于设备的,并封装策略,例如“该线程在同步时是否应该阻塞?或者“在调度GPU工作后该线程是否合格”等)
CUDA一直有类似的上下文概念。控制级别由驱动程序api提供给您http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__CTX.html#group__CUDA__CTX_1g65dc0bc84810e2103a40d8e2cf。运行时API包含可由驱动程序API访问的单个上下文。多个上下文的使用是能够在不执行cudaDeviceReset的情况下销毁一个上下文。 –
@FlorentDUGUET:我会编辑我的答案,但这是一个按设备的上下文,即多个上下文<->一个设备,而不是多个像OpenCL中的多个<->多个。而且,这些CUDA上下文是线程特定的。 – einpoklum
那么,OpenCL是一个标准。我相信他们留下了会议期间讨论的一些功能,当双子座设计或其他实施者希望受益于某种程度的共享内存时。据我所知,这在CUDA上没有实现,但OpenCL是由其他人实现的。这变成讨论/意见。 –