2013-08-07 29 views
3

我正在使用OpenCL,並且我需要memset()全局設備內存中的一些數組。 CUDA具有類似memset()的API函數,但OpenCL不支持。我讀this,在那裏我發現了兩個可能的選擇:什麼是OpenCL最快的memset()替代品?

  1. 一些臨時緩衝區在主機上使用memset(),然後clEnqueueWriteBuffer()來複制到設備上的緩衝。
  2. 入隊(藻?)下面的內核:

    __kernel空隙memset_uint4(__全球uint4 * MEM,__私人uint4 VAL){ MEM [get_global_id(0)] = VAL; }

哪個更好?或者說,在哪種情況下/哪個平臺比另一個更好呢?

備註:如果零記憶的特殊情況值得特別處理,那也很好。

回答

5

您可以使用OpenCL v1.2中的clEnqueueFillBuffer()。這正是你需要的。而且在如何用模式填充緩衝區方面非常靈活。

這裏的文檔頁面:

http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillBuffer.html

如果你是在1.1或以下....那麼你應該再出現其他方法。

+1

由於OP提到CUDA,很可能他們正在使用NVidia的卡,目前只支持OpenCL 1.1。此外,您的答案並未解決兩個給定方法中哪一個「更好」的問題。 – xperroni

+1

開普勒或更高版本架構的NVIDIA®(英偉達™)卡從2015年開始支持OpenCL 1.2。[驅動程序發行說明](https://a248.e.akamai.net/f/248/10/10/us.download.nvidia.com /Windows/350.12/350.12-win8-win7-winvista-desktop-release-notes.pdf) – einpoklum

5

一個很好的方式來做到這一點非常快(如果你有額外的內存可用)是有一個預先大小的初始化數組(如一個填充全零),然後做任何需要的設備上覆制清零緩衝區。根據我的經驗,這比任何填寫OpenCL或CUDA的調用要快得多。很明顯,這是一個特例,但當我上次測試它時,速度要快得多。

+0

它比clEnqueueFillBuffer特別快嗎? – einpoklum

+0

@einpoklum我做了一個測試enqueueCopyBuffer比enqueueFillBuffer快,只是在10K嘗試:fillBuffer得到:00.000059,copyBuffer得到:00.000048 –

+1

@Jonno_FTW:這是幾秒鐘?另外,對於什麼內存大小?如果你已經開始測試(我現在還沒有開發OpenCL的東西),那麼可以一次運行1GB;這應該會讓您每次運行的執行時間更長以進行比較。此外,零情況可能與其他值的情況不同。 – einpoklum