簡體   English   中英

為什么在 CUDA 中使用遞歸時會收到警告?

[英]Why do I get a warning when I use recursion in CUDA?

我必須使用CUDA解決 gpu 上的代碼問題,但我總是收到“函數名稱”無法靜態確定堆棧大小的警告。

這是我正在從事的一個學生項目,該項目是使用CUDA 9.0庫用C編寫的,它在NVIDIA Quadro K5000 gpu上運行。
每個線程都必須執行一個函數,在這個函數中,同一個函數有兩個遞歸調用,我之所以要使用這兩個遞歸調用,是因為它使代碼對我來說干凈簡單,但是如果有只有一個遞歸調用,堆棧大小問題不再存在。

這是我每次編譯代碼時得到的錯誤:

在此處輸入圖片說明

CUDA支持遞歸函數調用,但我不明白為什么在有兩個遞歸調用時會出現問題。

__device__ void bitonicMergeGPU(float *arr, int l, int indexT, int order) 
{
    int k,p;

    if(l > 1)
    {
        p = l/2;

        for(k=indexT;k<indexT+p;k++)
        {
            //Compare the values.
            compareAndExchange(arr,k,k+p,order);
        }

        //THIS IS WHERE I GET THE ERROR

        bitonicMergeGPU(arr,p,indexT,order);
        bitonicMergeGPU(arr,p,indexT+p,order);
    }
}

我只是想知道是否有可能解決遞歸調用的問題。

CUDA 支持遞歸。 當您在 CUDA 中使用遞歸時,會出現此警告,並且沒有 NVIDIA 記錄的方法可以使警告消失(除非不使用遞歸)。

如果您遞歸地使用函數,在大多數語言中,隨着遞歸深度的增加,它將使用更多的堆棧空間。 在 CUDA 中也是如此。 您需要考慮到這一點並為您預期的最大遞歸深度提供足夠的堆棧空間。 通常的做法是限制遞歸深度,以防止出現堆棧問題。

編譯器無法在編譯時發現最大運行時遞歸深度,警告是為了提醒您這一點。

無論您將堆棧大小增加多少,警告都不會消失。 警告是為了讓您知道您有責任確保您的遞歸設計以及分配的堆棧空間能夠正常工作。 編譯器不會以任何方式驗證堆棧大小的增加量是否足夠。

在 CUDA 中使用遞歸必須非常小心。 遞歸使用堆棧內存,其限制為 512 KB。 默認通常是 1KB,這很容易溢出並導致程序崩潰。 您可以使用 cudaThreadGetLimit() 獲取每個線程的堆棧大小。

建議:

  1. 使用非遞歸方法重新設計算法/函數。 效率通常非常相似。
  2. 使用 cudaThreadSetLimit() 增加每個線程的堆棧大小,不要超過限制,例如 512KB。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM