2010-07-14 84 views

回答

2

在理論上是的,你可以,CL API允許它。但平臺/實現必須支持它,而且我不認爲大多數CL實現都這樣做。

爲此,請獲取CPU設備和GPU設備的cl_device_id,並使用clCreateContext爲這兩個設備創建一個上下文。

+1

或者,在一個平臺上不支持兩個設備,但CPU有平臺且GPU有另一個平臺的系統上,您可以在兩者之間手動分割工作。將一些工作發送給CPU,並將一些工作發送給GPU。 – 2011-12-02 19:58:51

1

您不能跨越多個設備的內核。但是,如果您重新運行的代碼不依賴於其他結果(即:處理16kB數據塊,需要大量處理),則可以在GPU和CPU上啓動相同的內核。並把一些塊放在GPU上,一些放在CPU上。

這樣,它應該提高性能。

您可以這樣做,創建一個爲CPU和GPU共享的clContext,以及2個命令隊列。

這不適用於所有的內核。內核代碼有時適用於所有輸入數據,並且不能以部分或塊分隔。

+0

排隊大量工作項目是一種不好的做法。原因是你會導致渲染工作項目匱乏(導致令人噁心的屏幕更新),或者更糟的是,有一個看門狗會中止並重新加載視頻驅動程序(觸發掛起檢測)。一個更好的做法(當然可能的話)是要有一系列的工作,但是在項目排隊等待執行之後才能得到結果。這可以讓你扼殺GPU的使用,所以你不會壓倒屏幕繪圖工作。 – doug65536 2013-01-03 17:09:41

2

一個上下文只能用於一個平臺。如果您的多設備代碼需要跨平臺工作(例如,Intel平臺CPU OpenCL和NVidia GPU),那麼您需要單獨的上下文。然而,如果GPU和CPU碰巧在同一個平臺上,那麼你可以使用一個上下文。

如果您在同一個平臺上使用多個設備(兩個相同的GPU或來自同一製造商的兩個GPU),那麼您可以共享上下文 - 只要它們來自單個clGetDeviceIDs調用即可。

編輯: 我要補充一個GPU + CPU方面,並不意味着任何自動管理CPU + GPU執行。通常情況下,讓驅動程序分配一個內存緩衝區是最佳做法,該緩衝區可以由GPU進行DMA處理以獲得最佳性能。在CPU和GPU處於相同環境下的情況下,您可以在兩臺設備之間共享這些緩衝區。

您仍然必須自己分擔工作量。我最喜歡的負載平衡技術是使用事件。每n工作項,附加一個事件對象的命令(或排隊的標誌),並等待將N設置工作項前(現有的)事件。如果您不必等待,那麼您需要在該設備上增加n,如果您不得不等待,那麼您應該減少n。這將限制隊列深度,n將圍繞完美深度盤旋以保持設備繁忙。無論如何你都需要這樣做,以避免導致GUI渲染不足。只要保持在每個命令隊列(其中CPU和GPU具有單獨的n)的n個命令,這將完全分裂。