我想将背景图像数据存储在 CUDA 中的设备上。稍后,当我从视频源读取新场景时,我想将新场景作为前景图像发送到 GPU 并从背景图像中减去它。我不想为每个场景都将背景图像重新发送到 GPU。我怎样才能做到这一点?
问问题
1110 次
2 回答
3
将背景图像存储在设备内存阵列中(即在 GPU 上)。然后,当您读取前景图像时cudaMemcpy
,将其复制到另一个设备内存阵列。然后启动一个内核,将两个设备内存数组作为参数并执行图像减法。应该很简单。
假设您使用默认上下文创建并且这一切都在同一个 CPU 线程中运行,您不必担心执行任何特定的操作来保持您的 CUDA 上下文“完整”,正如 Bart 评论的那样。但是,如果您进行任何 CPU 多线程处理,则需要进行一些上下文管理。
于 2012-04-22T23:16:27.483 回答
1
这是一个简单的例子..
int main(int argc, char **argv) {
uint *hostBackground, *hostForeground; //new uint[]..
uint *background, *foreground;
首先初始化你的后台和前台数据..
cudaMalloc(background, ..);
cudaMalloc(foreground, ..);
然后加载后台数据
cudaMemCpy(background, hostBackground, ..); //copy to device..
然后读取前台数据
while (applicationRuns) {
readImage(hostForeground); //read image..
cudaMemcpy(foreground, hostForeground, ..); //copy to device
//operate on foreground..
substruct_kernel<<<threads, blocks>>>(foreground, background, width, height);
cudaMemcpy(hostForeground, foreground, ..); //copy to host
//use hostForeground
}
释放他们
cudaFree(foreground);
cudaFree(background);
}
这是一个简单的子结构内核..
__global__ void substruct_kernel(uint *foreground, uint *backgroung, int width, int height)
{
int idx = threadIdx.x + threadDim.x * blockIdx.x;
int idy = threadIdx.y + threadDim.y * blockIdx.y;
if (idx < width && idy < height)
foreground[idx + idy * width] -= background[idx + idy * width]; //clamp may be required..
}
我确实建议使用库来进行这种简单的操作。Blas 库或 Thrust 库可能是选项。
于 2012-08-22T13:52:33.197 回答