-1

我有一组来自相机的图像,我需要将这些图像存储在 CUDA 设备内存中并使用 OpenGL 进行渲染。这些图像必须一个接一个地连续存储在缓冲区中。

我的问题是:

  1. 假设我需要将 10 张图像存储在缓冲区中,我该如何进行正确的线程分配?
  2. 我想知道我写的程序是否正确?

我只粘贴了内核代码;Buffer我分别为主机代码和主机代码分配了内存EnergyImg

const unsigned int tidx = blockDim.x * blockIdx.x + threadIdx.x;
const unsigned int tidy = blockDim.y * blockIdx.y + threadIdx.y;

const unsigned int adx =  tidx + tidy * blockDim.x * gridDim.x;

const unsigned int bdx = adx; 

int TotalFrames = 10;

for(int a = 1; a<=TotalFrames; a++)
{

    int SingleFrame = (m_ImageHeight * m_ImageWidth);

    int CurrentFrame = a * (m_ImageHeight * m_ImageWidth);  
    // (first/next) frame is stored till the end of this value

    int PreviousFrame = (a-1) * (m_ImageHeight * m_ImageWidth); 
    // next frame will be stored in memory from the end of previous frame

    if (  (a==1) )
    {               
        if (adx < CurrentFrame)
        {
            Buffer[adx] = EnergyImg[adx];                                                        
        }
    }

    else if((a > 1) && (a <= TotalFrames))
    {
        if( ((adx > PreviousFrame) && (adx <= CurrentFrame)) )
        {
            while ( bdx < SingleFrame)
            { 
                Buffer[adx] = EnergyImg[bdx];                                                                        
            }
        }
    }
}
4

1 回答 1

1

这段代码对我来说看起来很糟糕,但你可能也找错了树。

  1. 来自您未显示的另一段代码的访问冲突不太可能与此代码相关。这段代码没有做任何我可以看到的分配(而且我不希望 GPU 设备代码创建 OGL 将用于渲染的缓冲区)。此代码肯定会影响缓冲区中的数据,但不应影响可用缓冲区的大小或数量,或访问它们的能力。
  2. 我认为这段代码有很多可能的问题。举个例子,像这样的结构几乎肯定会被破坏:

        while ( bdx < SingleFrame)
        { 
            Buffer[adx] = EnergyImg[bdx];
        }
    

    请考虑此代码是否保证会导致无限循环。别管 CUDA 或 GPU。如果这是直接的 C 代码,在什么情况下while循环一旦进入,实际上会退出? bdx肯定是不可修改的,因为你已经用const. 如果bdx一次满足 while 条件,它将永远满足 while 条件(因为您的 while 循环或代码中的任何地方都不会修改SingleFrame,一旦它的值被建立。)

于 2013-07-26T22:35:51.590 回答