2016-12-25 70 views
1

我有一個內核,它不會輸入任何內容,而且其工作項目不會相互通信。每個工作項都根據其global_id在不同的參數上運行,但這不會傳入。我希望每個工作項都能處理其任務,根據某些條件篩選結果,並將結果寫回全局內存數組中符合這個標準。做這個的最好方式是什麼?我認爲是__global指數將開始在0和增量每個寫,但在此訪問無鎖和並行處理結束了一堆的比賽條件,所以我不知道在哪裏,告訴每一個工作項寫入輸出數組中。OpenCL中GPU與CPU通信的最佳方法

如果這是一個更高層次的語言,我希望能在一個共享的散列或東西來傳遞,只是推成功輸出到它,通過global_id key'd,但我有麻煩搞清楚什麼最合適的方式是在OpenCL領域。有什麼想法嗎?我使用的是香草C,而不是C++。

回答

1

This看起來正是我所需要的,我只是缺乏googlefu來達到它!

請回復,如果您有關於最佳做法的任何其他建議,但以供將來參考,再加上__global內存緩衝區上面會滿足我的需求。

+0

原子公司的確可以解決這個問題,但將是緩慢的,如果結果不是稀疏的(即,如果大多數工作項目訪問的原子,將有大量的序列化)。如果許多或者大部分工作項目返回結果,只是使它所以每一個工作項目結果的結果(有些可以爲空或空),然後CPU可以採取傳過來的結果,並拔出有效數據。或者在GPU上運行*減少*,如果這是值得的(性能方面)。 – Dithermaster

+0

謝謝!對於我的用例來說,只有8-10個工作項目需要訪問全球原子,大約有1000萬個,所以它非常適合。儘管如此,我會考慮減少,這聽起來像一個線程,我想拉上另一個項目... – jfo