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是由其他人實現的。這變成討論/意見。 –