2016-07-26 49 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,那麼很容易取消分配資源或應用程序,而不會影響任何其他並行運行的應用程序。


另外:

程序和內核對象:這是爲什麼不是設備的具體情況? (或者 - ?設備和用戶特定的)

內核已經設備特定,因爲它們是一個程序內的功能和給定設備的特定實例。

您可能有任意數量的內核由相同的程序創建,但具有不同的參數。這非常有用並且有意義,而不是在每次調用中都有一個內核對象並更改其參數,因此使用多個內核實例更有意義。