鉴于此代码:
void foo(cv::gpu::GpuMat const &src, cv::gpu::GpuMat *dst[], cv::Size const dst_size[], size_t numImages)
{
cudaStream_t streams[numImages];
for (size_t image = 0; image < numImages; ++image)
{
cudaStreamCreateWithFlags(&streams[image], cudaStreamNonBlocking);
dim3 Threads(32, 16);
dim3 Blocks((dst_size[image].width + Threads.x - 1)/Threads.x,
(dst_size[image].height + Threads.y - 1)/Threads.y);
myKernel<<<Blocks, Threads, 0, streams[image]>>>(src, dst[image], dst_size[image]);
}
for (size_t image = 0; image < numImages; ++image)
{
cudaStreamSynchronize(streams[image]);
cudaStreamDestroy(streams[image]);
}
}
查看 的输出nvvp
,我看到几乎完美的串行执行,即使第一个流是一个冗长的过程,其他流应该能够与之重叠。
请注意,我的内核使用了 30 个寄存器,并且都报告了大约 0.87 的“Achieved Occupancy”。对于最小的图像,网格大小为 [10,15,1],块大小为 [32, 16,1]。