CUDA - 线程使用 - 将一个图像一个接一个地复制到缓冲区中

时间:2013-07-26 21:24:51

标签: image cuda copy buffer

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

我的问题是:

  1. 让我需要存储10个图像存储在缓冲区中,如何正确分配线程?
  2. 我想知道我写的程序是否正确?
  3. 我只粘贴了内核代码;我分别在主机代码中为BufferEnergyImg分配了内存:

    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];                                                                        
                }
            }
        }
    }
    

1 个答案:

答案 0 :(得分:1)

这段代码看起来很破碎,但你可能也在咆哮错误的树。

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

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

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

    < / LI>