2012-01-07 32 views
1

假設我想對大的固定對象執行並行計算,例如,一個固定的大型稀疏(定向)圖或任何類似的對象。OpenCL:如何在JOCL中使用本地內存

要對圖或對象進行任何合理的計算,例如圖中的隨機遊動,將圖放入全局內存大概不會出於速度原因的問題。

這會留下本地/私人內存。如果我理解GPU架構是正確的,那麼在本地或私有內存(只讀)訪問之間幾乎沒有速度差異,這是否正確?我不願意將圖形複製到私有內存中,因爲這意味着每個工作單元都必須存儲整個圖形,這可能會非常快速地消耗GPU的內存(對於非常大的圖形,甚至可以減少內核的數量可以被使用和/或使OS不穩定)。

因此,假設我在本地和私有的讀取速度上正確,我如何在實踐中做到這一點?如果例如爲了簡化我降低圖形到int[] from和(存儲開始,每個有向邊的結束),我當然可以使內核這個樣子的

computeMe(__local const int *to, __local const int *from, __global int *result) { 
    //... 
} 

,但我不知道我應該怎麼調用這來自JOCL,因爲沒有私有/本地/全局修飾符。

本地變量是否會自動寫入每個本地工作組的內存?或者這是如何工作的?我根本不清楚應該如何正確地完成這種內存分配。

回答

3

您不能從主機傳遞本地內存參數的值。主機無法讀取/寫入本地內存。要使用本地內存,您仍然需要以全局方式傳遞數據,然後在使用前從全局複製到本地。如果您多次閱讀數據,這只是有益的。

恆定記憶如何?如果你的輸入數據沒有改變,但它不是太大,把你的輸入數據放到常量內存中可能會給你一個相當大的加速。可用的常量內存通常在16K到64K左右。

computeMe(__constant int *to, __constant int *from, __global int *result) { 
//... 
} 

編輯(添加的參考文獻):

對於OpenCL的一個例子使用__local存儲器的,見here

對於NVidia硬件,更多性能詳細信息是NVidia OpenCL best practices guide (PDF)。在那裏,有更多有關內存類型之間性能差異的信息。

+0

本地存儲器是否具有與常數相當的速度?我遍歷圖,所以我經常需要像for(edge = 0; edge user1111929 2012-01-11 09:59:50

+0

另外,我無法在任何地方找到任何解釋來向本地(非私有)內存寫入內容。那麼應該怎麼做呢?主機只能寫入全局和常量,內核只能寫入全局和私有。我如何在工作組中的所有工作單元之間共享內存?每個計算單元都有32K的LOCAL_MEM,我會覺得不會使用這個......在OpenCL中沒有辦法寫這些東西給這個空間嗎?或者,當我在每個內核中將const變量移動到私有時,OpenCL會自動執行此操作? – user1111929 2012-01-11 10:06:06

+0

@ user1111929內核可以讀寫__本地內存,實際上這是數據進入本地內存的唯一途徑。常量內存不需要這個初始副本,這意味着您不需要額外的代碼就可以將全局副本複製到本地內存和內核中。我不知道__local和__constant內存之間的速度差異,但是如果它們是相似的,並且都比__ global更快,那麼我的猜測就是純粹的猜測。 – prunge 2012-01-11 21:42:56

1

您寫道:「將圖形放入全局內存大概不會出於速度原因。」 - 你沒有太多其他選擇。我的意思是數據通常在全局內存中。 (如果元素格式合適的話)nvidia上所謂的'常量'內存針對'廣播'類型的操作進行了優化,這意味着所有線程從相同的位置閱讀,我認爲情況並非如此,我建議在開始時遠離這些類型。)

好吧,作爲建議,首先嚐試簡單地使用'全局內存'。 本地內存的「生命週期」僅在執行內核期間進行。只有當您多次重複使用同一個數據元素時纔有理由認爲它是一個高速緩存(在您明確預加載的地方)。

而且當地MEM限於約16-48kbytes,所以它只能存儲你的數據的一部分。嘗試在適合這些塊的子圖中分解圖。

在你表示你可以劃分邊緣(從[],爲[])成固定大小的組。

通用圖案是

步驟1.從全局複製到本地

your_local_array [get_local_id(0)] = input_global_mem [get_global_id(0)]

步驟2.確保每個線程是否 屏障(本地存儲圍欄)

現在,工作項(線程)可以在加載到本地內存的子圖上工作。

記住,本地MEM將包含整個圖表的只有有限的部分。 如果您需要從任何線程訪問任意節點,上述模式將不可用。

我建議開始進行與算法的實驗,而無需使用本地內存(直接從全球看),並確保其正常工作(通常有在道路上一些驚喜)。 稍後,您可以識別可能存儲在本地mem中的哪些數據部分,以加速它。

相關問題