0

私はcudaを初めて使用し、このコードを使用してcudaでフレームを読み取ろうとしていますが、オーバースローエラーが発生し、黒い出力が表示されます..これが私のコードです..

BYTE *imageBuf = 0;
BYTE *maBuf = 0;
BYTE *fgBuf = 0;
BYTE *tempBuf = 0;

cudaMalloc((void **)&maBuf , m_imgWidth*m_imgHeight);
cudaMalloc((void **)&fgBuf , m_imgWidth*m_imgHeight);
cudaMalloc((void **)&imageBuf , m_imgWidth*m_imgHeight);
cudaMalloc((void **)&tempBuf , m_imgWidth*m_imgHeight);
cudaMalloc((void **)&m_pixel_ptr , m_imgWidth*m_imgHeight);

cudaMemcpy(m_pixel_ptr , m_pixelParam , m_imgWidth*m_imgHeight , cudaMemcpyHostToDevice);
cudaMemcpy(imageBuf , inImgBuf , m_imgWidth*m_imgHeight , cudaMemcpyHostToDevice);
cudaMemcpy(fgBuf , foregroundBUf , m_imgWidth*m_imgHeight , cudaMemcpyHostToDevice);
cudaMemcpy(maBuf , maskBuf , m_imgWidth*m_imgHeight , cudaMemcpyHostToDevice);
cudaMemcpy(tempBuf , foregroundBUf , m_imgWidth*m_imgHeight , cudaMemcpyHostToDevice);

kernel<<<16,20>>>(imageBuf, maBuf, fgBuf , 320 , 240 , m_pixel_ptr , tempBuf , 0);


cudaMemcpy (maskBuf, maBuf , m_imgWidth*m_imgHeight , cudaMemcpyDeviceToHost);
cudaMemcpy (foregroundBUf, fgBuf , m_imgWidth*m_imgHeight , cudaMemcpyDeviceToHost);
cudaMemcpy (inImgBuf, imageBuf , m_imgWidth*m_imgHeight , cudaMemcpyDeviceToHost);
cudaMemcpy (m_pixelParam , m_pixel_ptr , m_imgWidth*m_imgHeight , cudaMemcpyDeviceToHost);

cudaFree(m_pixel_ptr);
cudaFree(imageBuf);
cudaFree(maBuf);
cudaFree(tempBuf);
cudaFree(fgBuf);

これがカーネル関数の呼び出し方法であり、これがカーネル関数です

    __global__ void kernel(BYTE *inImgBuf, BYTE *maskBuf,  BYTE *foregroundBUf , int width , int height , PixelPara *m_pixelParam , BYTE *tmpBuffer , int j)
{


int m_IniWeight = 0.005;
int m_IniStd = 400.0;
int m_Threshold = 0.7;
int fgTh;

int thresholdRank;


for(int i = 0; i < width; i++)
{
        int tid = ((threadIdx.x + blockIdx.x * blockDim.x)*width + i);
        if (m_pixelParam[tid].m_validModels == 0) 
        {
            m_pixelParam[j*width+i].m_weight[0] = m_IniWeight;
            m_pixelParam[j*width+i].m_stdVar[0] = m_IniStd;
            m_pixelParam[j*width+i].m_priRank[0] = 0;
            m_pixelParam[j*width+i].m_mean[0] = (double)inImgBuf[j*width+i];
            m_pixelParam[j*width+i].m_validModels++;


        }
        else
        {
            thresholdRank = 0;
            fgTh = 0.0;             
            while (true)
            {
                fgTh += m_pixelParam[j*width+i].m_weight[m_pixelParam[j*width+i].m_priRank[thresholdRank]];                 

                if ((fgTh > m_Threshold) || (thresholdRank >= m_pixelParam[j*width+i].m_validModels - 1)) 
                    break;      

                thresholdRank++;
            }

                gmmImplementation (inImgBuf, maskBuf, foregroundBUf ,width , height , m_pixelParam , (j*width+i) ,tmpBuffer ,thresholdRank );




            foregroundBUf = tmpBuffer;


        }

}






}

cuda で 320* 240 フレームを処理する方法を教えてください。cuda で GMM を実装しようとしていますが、失敗しています。

4

1 に答える 1

1

問題は、 m_pixel_ptr をサイズで割り当てているm_imgWidth*m_imgHeightように見えますが、そうであるように見えますm_imgWidth*m_imgHeight * sizeof(PixelPara)。これにより、バッファ オーバーランが発生する理由が説明されます。おそらく、配列の末尾を超えて読み書きしようとしています。もちろん、m_pixel_ptr の cudaMemcpy 呼び出しもm_imgWidth*m_imgHeight * sizeof(PixelParam)、デバイスとの間でバッファー全体をコピーするために長さが必要です。

また、imageBuf には double または 1 バイトのみが含まれているはずですか? 現在、コードは からピクセルごとに 1 バイトを読み取り、inImgBufそれを double にキャストしてから に格納しm_pixelParam[j*width+i].m_mean[0]ます。double を読み取ることが想定されている場合は、imageBuf をサイズで割り当ててコピーする必要があり、カーネル パラメーター リストで としてではなくとしてm_imgWidth*m_imgHeight * sizeof(double)宣言する必要があります。inImgBufdouble *BYTE *

于 2012-12-13T17:05:44.820 に答える