我正在编写一个 CUDA 程序,它将尝试在基本图像中定位大约 35 个子图像或模式。每个子图像(图案)只能存在于基础图像的一小块区域(比如 10x10 像素窗口)中。子图像的大小从 1000 到 10000 像素不等。基本图像为 640x480 像素。
我通过将子图像与基本图像的子部分进行卷积来做到这一点,如果卷积结果小于阈值,则认为这是匹配的。我必须对每个子图像进行大约 100 次卷积(因为我只检查允许位置的 10x10 窗口)。
第一个问题:这是否已实施,是否在开源中可用?
第二个问题:哪个是更好的实施策略?
- 粗粒度:每个 CUDA 线程对基础图像中的子图像进行全卷积。每个子图像和位置都有一个 CUDA 线程。
- 细粒度:每个 CUDA 线程计算卷积的一个分量(像素):因此,CUDA 线程将子图像的像素乘以基础图像的适当像素。然后,使用 syncblock() 对这些倍数求和。
更新:我尝试了这两种方法。我认为最好的方法是方法一的变体,我将较大的子图像分成较小的子图像。现在所有子图像的大小大致相同(例如,1024 像素)。然后每个 CUDA 线程对单个位置进行完全卷积。完成后,我将所有结果发送给主机,主机负责将中间部分重新组合在一起(对于被分成较小部分的子图像)。优点是所有 CUDA 线程执行相同数量的工作。这似乎是第二种方法的两倍,这是有问题的,因为子图像的大小不同。