2012-12-26 34 views
1

我打算寫一個OpenCL的程序,在處理任務級龐大的數據量(沒有進一步的並行是可能的,但數據量足夠高) 數據本身是從一個文件,讀結果應該寫入另一個文件。 現在我認爲它可能是最好的(最快)讓1線程讀取文件並將數據推送到內核,而另一個線程獲取完成的數據並將其寫入文件。 所以我實際上需要像ReadData-> CopyToDevice-> ExecuteKernel-> CopyToHost-> WriteData流中的OpenCL

有沒有任何例子,如何做到最好?我會從10個數組開始(隊列,InputMemory,OutputMemory,Events)。 第一個線程:讀取數據,等待下一個事件條目爲空,填入這個數組,下一個
第二個線程:事件!= null-> waitforevent,寫入數據,將事件設置爲空 或者可能使用10-信號量而不是檢查空

回答

0

我做了圖像處理的東西similar但考慮做什麼,你應該實際配置文件,看看瓶頸在哪裏之前。我不知道你的內核是如何計算密集型的,但你不應該低估I/O。

首先:是的,在總使用三個線程可能是一個好主意,隱藏I/O延遲。但是十個命令隊列太多了,每個GPU都足夠了。而且,如果你只有一個GPU,那麼給它提供十個不同的緩衝區是沒有意義的,如果它只能處理一個。所以你最好使用雙緩衝策略並阻止讀寫操作。

+0

內核本身處理固定大小和可變大小的輸出的數據重疊這些操作。一個CPU可以做每秒數據集10K左右(〜150B每個) 所以我想關於給大約10K的數據集上每組31個工作項(31由於受到本地內存的要求)和少數羣體分裂內核。 – Flamefire

+0

所以我想,當我將數據傳輸到內核時,我可以在內核中對以前的數據集進行計算,並從磁盤讀取下一個數據集的數據。所以它就像一個有四個階段的管道:從磁盤讀取,寫入設備,處理數據/從設備讀取,寫入磁盤。 有一個例子在一個隊列中進行計算,而另一個隊列正在傳輸數據,而不是相反。所以相同的內核被實例化2次,並在2個隊列中調用。內核甚至可以同時運行,給定足夠的CU不能? – Flamefire

+0

無法保證傳輸和執行如何以非阻塞模式(除了訂單)進行安排。所以你可以使用相同的隊列進行傳輸和執行。隊列僅僅是發送GPU信息的抽象(內核執行或數據)。但爲什麼不嘗試? – matthias

0

此外,使用上傳,處理和下載單獨的OpenCL命令隊列,clEvents創建它們之間的依賴關係。這將允許硬件當GPU支撐