2013-11-20 13 views
2

我在使用OpenCL的Intel CPU的所有內核上運行仿真。主進程代碼由一個循環組成,在該循環內可以重複調用opencl內核。沒有內存被分配到循環中,並且沒有使用事件。但是,除非我定期撥打clFinish()clFlush(),否則該程序的內存使用量會在模擬過程中穩步增加。爲什麼排隊執行OpenCL內核導致程序的內存使用增加?

任何人都可以解釋這裏發生了什麼?

+1

您是否收到任何來電回覆的活動?如果是這樣,你有責任釋放它們。 – Dithermaster

+0

謝謝!但我沒有使用任何事件。 –

+2

如果您以非阻塞方式在一個循環中排隊OpenCL調用(假設1000000x內核隊列)。然後,這些隊列必須存儲在其他地方。直到你「clflush()」到GPU,或者等待它到「clFinish()」,它纔會消耗內存。然而,它不應該無限增長,因爲司機應該在某個時候處理它。這是我最好的猜測。 – DarkZeros

回答

2

由於這是答案,我把它放在這裏的問題是:

如果你入隊的OpenCL在非阻塞方式循環調用。然後這些呼叫隊列必須存儲在某個地方。這消耗內存,直到你clflush()到GPU,或等待它到clFinish()。然而,它不應該無限增長,因爲司機應該在某個時候處理它。

+0

不是無限期的,但無論英特爾如何存儲這些東西似乎都不是非常有效:)在我能夠停止之前,它吃掉了8 GB的內存和大量的交換空間。 –

+2

規範中沒有說它不會無限增長,我也沒有看到任何供應商這樣做。我認爲OP的證據指出,至少有一個驅動程序不會限制主機端隊列的大小。一個簡單的解決方案是呼叫clFinish你排隊的每N個工作。如果你真的擔心不讓隊列變空,那麼在你的內核中使用固定數量的事件,並且在最老的一個完成之後,只排隊一個新的事件。 – Dithermaster