假設我想對大的固定對象執行並行計算,例如,一個固定的大型稀疏(定向)圖或任何類似的對象。OpenCL:如何在JOCL中使用本地內存
要對圖或對象進行任何合理的計算,例如圖中的隨機遊動,將圖放入全局內存大概不會出於速度原因的問題。
這會留下本地/私人內存。如果我理解GPU架構是正確的,那麼在本地或私有內存(只讀)訪問之間幾乎沒有速度差異,這是否正確?我不願意將圖形複製到私有內存中,因爲這意味着每個工作單元都必須存儲整個圖形,這可能會非常快速地消耗GPU的內存(對於非常大的圖形,甚至可以減少內核的數量可以被使用和/或使OS不穩定)。
因此,假設我在本地和私有的讀取速度上正確,我如何在實踐中做到這一點?如果例如爲了簡化我降低圖形到int[] from
和(存儲開始,每個有向邊的結束),我當然可以使內核這個樣子的
computeMe(__local const int *to, __local const int *from, __global int *result) {
//...
}
,但我不知道我應該怎麼調用這來自JOCL,因爲沒有私有/本地/全局修飾符。
本地變量是否會自動寫入每個本地工作組的內存?或者這是如何工作的?我根本不清楚應該如何正確地完成這種內存分配。
本地存儲器是否具有與常數相當的速度?我遍歷圖,所以我經常需要像for(edge = 0; edge
user1111929
2012-01-11 09:59:50
另外,我無法在任何地方找到任何解釋來向本地(非私有)內存寫入內容。那麼應該怎麼做呢?主機只能寫入全局和常量,內核只能寫入全局和私有。我如何在工作組中的所有工作單元之間共享內存?每個計算單元都有32K的LOCAL_MEM,我會覺得不會使用這個......在OpenCL中沒有辦法寫這些東西給這個空間嗎?或者,當我在每個內核中將const變量移動到私有時,OpenCL會自動執行此操作? – user1111929 2012-01-11 10:06:06
@ user1111929內核可以讀寫__本地內存,實際上這是數據進入本地內存的唯一途徑。常量內存不需要這個初始副本,這意味着您不需要額外的代碼就可以將全局副本複製到本地內存和內核中。我不知道__local和__constant內存之間的速度差異,但是如果它們是相似的,並且都比__ global更快,那麼我的猜測就是純粹的猜測。 – prunge 2012-01-11 21:42:56