2010-10-21 31 views
5

看起來像200萬的浮點數應該沒什麼大不了的,只有8MB的1GB GPU內存。我能夠有時分配那麼多,有時甚至比沒有麻煩的分配更多。當我做一個clEnqueueReadBuffer時,我得到了CL_OUT_OF_RESOURCES,這看起來很奇怪。我能嗅出麻煩真正開始的地方嗎? OpenCL不應該像clEnqueueReadBuffer這樣失敗吧?我應該在什麼時候分配數據?有沒有辦法獲得更多的細節,而不僅僅是錯誤代碼?如果我能看到OpenCL聲明CL_OUT_OF_RESOURCES時分配了多少VRAM,那將很酷。CL_OUT_OF_RESOURCES爲200萬浮點與1GB VRAM?

回答

3

並非所有可用內存都可能必須提供給單個獲取請求。閱讀堆碎片1,2,3以瞭解更多關於爲什麼可以成功的最大分配是爲了最大的連續內存塊以及由於使用內存而將塊分成小塊的原因。

這並不是說資源被耗盡......它只是無法找到一整塊大到足以滿足你的要求......

+0

這很有道理,謝謝指出。有沒有一種方法可以分析發生故障時堆內存碎片在GPU上的樣子? – smuggledPancakes 2010-10-21 16:28:48

+0

也許gDEBbugger? http://www.gremedy.com/我從來沒有用過它。 – 2010-10-21 16:41:43

+0

不知怎的,我懷疑這真的是問題所在,因爲gpu內存通常不會被分割得足夠多。畢竟8MB在1GB卡上並不算太多(特別是因爲驅動程序應該能夠將當前未使用的內存拉到主內存中),並且gpu內存的分配通常相對較矮。所以,如果你看到這些問題是由於碎片造成的,並且它是一個普通的基於圖形卡的系統(與例如特斯拉相反),那麼看起來你很可能接近內存限制。我懷疑那個驅動程序不會在那一刻干預(通過殺死一些情況)。 – Grizzly 2010-10-21 17:07:01

5

another source

- 調用clFinish()讓你的錯誤計算的狀態(而不是在您嘗試讀取數據時獲取)。
- 如果(NVidia)卡也被用作顯示器,則5秒超時也可能導致「資源不足」錯誤
- 當內核中存在指針錯誤時也會出現此錯誤。

後續建議先在CPU上運行內核,以確保不會超出內存訪問範圍。

7

我剛剛遇到了同樣的問題(花了我整整一天的時間修復)。 我相信有同樣問題的人會偶然發現這一點,這就是爲什麼我發佈這個老問題。

您可能沒有檢查內核的最大工作組大小。

這是你如何做到這一點:

size_t kernel_work_group_size; 
clGetKernelWorkGroupInfo(kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &kernel_work_group_size, NULL); 

我的設備(2×NVIDIA GTX 460 &英特爾i7處理器),支持1024的最大工作組大小,但上面的代碼返回的東西約500當我通過我的路徑跟蹤內核。 當我使用1024的工作組大小時,它明顯失敗,並給我CL_OUT_OF_RESOURCES錯誤。

內核越複雜,其最大工作組大小就越小(或者至少是我所經歷的)。

編輯:
我才意識到,你說 「clEnqueueReadBuffer」 而不是 「clEnqueueNDRangeKernel」 ...
我的回答是有關clEnqueueNDRangeKernel。
對不起。
我希望這對其他人仍然有用。

+0

嘿謝謝你。你是對的!我正在使用設備最大工作組大小,而不是內核最大工作組大小。改變了那個固定它:)。 – Gamer 2014-03-25 11:37:19

+0

沒問題。我很高興能夠提供幫助。 :D – Tara 2014-03-25 12:31:08

+1

有同樣的問題,thx! – 2017-04-05 14:55:55

1

越界內核中的進程通常是無聲的(因爲在內核排隊調用時仍然沒有錯誤)。

但是,如果您稍後嘗試使用clEnqueueReadBuffer()讀取內核結果。此錯誤將顯示。它表明內核執行過程中出現了問題。

檢查您的內核代碼是否出現讀/寫操作。