簡體   English   中英

CUDA 內核的奇怪行為

[英]Strange behavior of CUDA kernel

我正在嘗試制作一個簡單的 Cuda 應用程序,它可以創建給定矩陣的積分圖像。 我需要做的步驟之一是創建每一行的完整圖像。 為了做到這一點,我想為每一行分配 1 個線程。 應該執行此操作的函數:

__global__ void IntegrateRows(const uchar* img, uchar* res)
{
    int x = blockIdx.x * blockDim.x + threadIdx.x;
    int y = blockIdx.y * blockDim.y + threadIdx.y;

    if (x >= Width || y >= Height)
        return;

    int sum = 0;
    int row = y * Width;
    for (int i = 0; i < Width - x; ++i)
    {
        res[row + i + x] = sum + img[row + i + x];
        sum += img[row + i + x];
    }
}

我使用一個大小為 3840x2160 的矩陣( cv::Mat::ones(Size(Width, Height), CV_8UC1) )進行測試。 當我嘗試打印結果的內容時,它總是返回從 1 到 255 的數字序列: 控制台輸出

執行配置為:

dim3 threadsPerBlock(1, 256);
dim3 numBlocks(1, 16);
IntegrateRows<<<numBlocks, threadsPerBlock >>>(img, res);

我的 GPU 是 Nvidia RTX 3090。

tl;dr:讓你的輸出矩陣有更大的元素

我對 CV 不太了解,但這似乎就是你在做什么:如果你對序列進行整合/前綴求和

1, 1, 1, 1, ...

你得到:

0, 1, 2, 3, ...

然后在達到元素類型的最大值時回繞。 在您的情況下,它是uchar ,即unsigned char 它的最大值是 255,再加上 1,得到 0。

如果您將輸出矩陣元素類型更改為unsigned short (或者可能只是unsigned int ) - 您將不會獲得環繞行為。 當然,如果你加起來是 255 而不是 1,和/或你的矩陣更大,那么類型的表示范圍可能不夠大。

暫無
暫無

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

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