使用CUDA迭代多个图像会提高性能吗?

时间:2018-01-18 00:30:18

标签: c++ cuda nvidia

代码过于简单只是出于问题目的。 在我设置CUDA环境并对代码进行任何更改之前,我想获得一个输入,是否在GPU上执行下面的代码要快得多。

仅当相应的掩码值不为零时,代码才会基本遍历图像并将图像像素值复制到dst。图像数量可以高达10.图像的大小可以是2K左右2K左右。

如果我使用#pragma omp,它确实可以提高性能。所以,问题是如果我在GPU上执行这个代码(假设我有一个像GTX 1050这样的好图形卡),当每个线程处理一个单独的图像时,性能会显着提高吗?

for (int i = 0; i < images.size(); ++i)
{
    for (int y = 0; y < images[i].height; ++y)
    {
        for (int x = 0; x < images[i].width; ++x)
        {
            bool maskVal = masks[i][y][x];
            if (maskVal > 0)
            {
                dst[i][y][x] = images[i].data(x,y);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

在这种情况下,我猜不会。如果图像和目标已经存在于GPU内存中,那段代码可能会执行得更快。但是,如果您计划从主内存中获取图像和掩码,将其复制到pci总线上,执行gpu上的代码然后将结果传回cpu,那么只需运行此代码就可以了。中央处理器。但是,如果您认为您将对dst图像进行进一步的并行处理,那么您也可以将其转移到gpu,并在gpu上执行此操作,因为您无论如何都必须支付该惩罚。 openmp更快的原因是因为它使用了使用相同内存的cpu线程,并且不需要额外的复制。

在gpu上运行良好的一个例子是图像卷积或傅里叶变换,因为这些任务比你正在做的要重得多,所以内存传输的开销要小得多。