私は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 を実装しようとしていますが、失敗しています。