2013-05-04 37 views
3

我正在實施一個使用OpenCL的解決方案,並且我想要做以下事情,比如說你有一大堆你想要在GPU中複製的數據,並且有許多內核進程將其批量並將結果存儲在其特定的輸出緩衝區中。OpenCL Copy-Once分享了很多

真正的問題是在哪裏更快?每個內核都需要擁有它所需要的數組部分,或者在每個內核(在相同的上下文中)處理所需的批處理之前傳出整個數組,因爲它們具有相同的地址空間並且每個映射陣列併發。當然,這個數組是隻讀的,但並不是一成不變的,因爲每次執行內核時它都會發生變化......(所以我可以使用全局內存緩衝區來緩存它)。

另外,如果第二種方式實際上更快,您可以指示我如何實現這個方向,因爲我還沒有找到具體的東西(雖然我仍在搜索:))。

乾杯。

+0

刪除cuda標記 – 2013-05-04 22:56:01

+0

是的,對不起。 – jtimz 2013-05-05 01:41:57

回答

2

我正常使用第二個內存。共享內存很容易。只需將相同的緩衝區傳遞給每個內核。我在我的實時射線追蹤器中執行此操作。我用一個內核渲染,後處理(圖像處理)與另一個渲染。

使用C++綁定,它看起來像這樣

cl_input_mem = cl::Buffer(context, CL_MEM_WRITE_ONLY, sizeof(cl_uchar4)*npixels, NULL, &err); 

kernel_render.setArg(0, cl_input_mem); 
kernel_postprocess.setArg(0, cl_input_mem); 

如果你想要一個內核到陣列/內存的不同部分進行操作可以偏移值傳遞給內核參數,並添加到例如每個內核的全局內存指針。

如果數組(實際上是每個緩衝區的總和 - 包括輸出)不適合內存,我會使用第一種方法。使用第一種方法的另一個原因是如果您在多個設備上運行。在我的光線追蹤器中,當我在多個設備上渲染時,我使用第一種方法。例如,我有一個GTX 580渲染屏幕的上半部分,另一個GTX 580渲染下半部分(實際上我動態地這樣做,所以一個設備可以渲染30%,而另一個設備可以渲染30%,但除此之外)。我有每個設備只渲染它的輸出的一小部分,然後我彙編輸出在CPU上。對於PCI 3.0,在CPU和GPU之間來回傳輸(多次)對幀速率的影響甚至可以忽略不計,即使對於1920x1080圖像也是如此。

+0

我甚至不能向你投票,你需要rep> = 15><! – jtimz 2013-05-06 16:37:10

+1

我向他提供了upvoted for;; – Trax 2013-05-07 09:46:31

+0

只是一個評論:傳輸的一個問題是緩衝區被鎖定。使用雙緩衝可以獲得稍好的性能。 – Trax 2013-05-07 09:47:30