0

我在我的代码中对 float* 内存块进行了一些计算。由于我正在处理图像,因此我必须使用宽度 * 高度点和 180 次旋转来执行此操作。我正在启动 180 个线程(每度旋转 1 个),因为这是代码中唯一可并行化的过程。我旋转图像,并为每次旋转获取每个点的结果浮点值。我有另一个 float* 块,它存储每个点的当前最大值。

if(resultMap[i] < convrst)
{
    resultMap[i] = convrst;
    rMap[i] = (unsigned char)r0;
    oMap[i] = (unsigned char)index;
}

使用 resultMap 存储当前的最大值。convrst 是卷积的结果,如果当前结果高于之前的结果,则保存该值,加上该点的半径(r0)和旋转(索引)。r0 最初是一个 int,以及索引。i 是一个从 0 到 imgsize-1 的计数器

如果没有 { } 部分中的分配,整个代码将在 2 秒内完成,而分配则需要 50 秒(这没有考虑到在该代码中我省略了锁以避免同步问题)。

为什么该代码这么慢,我该怎么做才能让它更快完成?

4

1 回答 1

2

当您在内核中包含写入时大幅减速的原因与此问题相同(尽管它与 OpenCL 相关,但原理相同)。NVIDIA 编译器非常积极地优化掉“死”代码,即对共享内存或全局内存写入没有贡献的代码。所以我猜当你不包括对全局内存的写入时,如你的问题所示,编译器只是在优化大量内核,大大减少了执行时间。

所以,就像我链接的另一个问题一样,真正的问题应该是为什么你的内核需要 50 秒才能完成。这将需要有关代码和调用它的执行参数的更多信息,但如果如您所写,您只运行 180 个线程,那可能是罪魁祸首。GPU 需要更多的并行性才能实现峰值性能。

于 2012-05-14T16:10:01.670 回答