2011-08-02 57 views
0

我正在使用Totalview來嘗試調試CUDA內核。我選擇了在CUDA中調試內存錯誤的選項,並停止主機上的內存錯誤。「Lane User Stack Overflow」調試CUDA程序

我在這一行獲得一個OFMŸ內核停止:

d_test_filt[i*cols+j] = cuCmulf(cuCmulf(d_usKernel[i*cols + j],d_convolver[i*cols + j]),d_rr[i*cols + j]) ; 

錯誤酒吧「裏的用戶堆棧溢出說:」

這個錯誤是什麼意思到底是什麼?我如何解決這個問題?

在這種情況下,所有這些d_數組已被分配到設備上。 i * cols + j遠小於陣列的大小(1024 x 1024),其中i和j分別爲311和808

回答

1

A 堆棧溢出可能由許多因素引起。通常它意味着它所說的。調用堆棧中的內存量有限,並且已經超過了它。導致這種情況的一些常見錯誤是深層遞歸和無限循環,因爲在棧上有太多的調用超出了可用的內存。

這是從超出範圍出界例外,您試圖訪問內存到被分配什麼,可這可以通過索引過去的數組的末尾作爲造成的對象不同你在問題中描述。這裏不是這種情況。

我不知道什麼是Lane用戶是,但我懷疑這是與CUDA相關的術語,你可能在nvidia網站上查找某處。您需要更多地顯示周圍的代碼才能獲得更好的答案,因爲您所顯示的內容不足以確定可能導致此錯誤的原因。

3

的CUDA-GDB手冊說:

CUDA_EXCEPTION_2:「裏用戶堆棧溢出」

當一個線程超過它的棧存儲器限制出現這種情況。

爲了什麼車道的解釋是CUDA-GDB手冊說:

的設備線程屬於一個塊,這又屬於一個內核。 線程,塊和內核是焦點的軟件座標。設備線程在一條通道上運行。一條車道屬於一個經線,它屬於一個SM,它又屬於一個設備,它屬於 。 Lane,warp,SM和 設備是重點的硬件座標。軟件和 硬件座標可以互換並同時使用,因爲它們保持一致。

CUDA-gdb手冊有更多關於從車道中檢索信息的信息。對於這個錯誤,您超出了AJG85所說的最大堆棧內存限制。

+3

我建議你找到堆棧溢出的原因,但如果這是不可避免的,你可以使用['cudaDeviceSetLimit()'](http://developer.download.nvidia)來增加每線程堆棧大小。com/compute/DevZone/docs/html/C/doc/html/group__CUDART__DEVICE_gb8a22e29cc297634b0702db0b69f59e7.html) – harrism

+0

至於找到原因 - 我的意思是,唯一可以做的是可能刪除內核中的變量聲明,對吧? – Derek