写入数据时性能严重下降

时间:2012-05-14 15:11:23

标签: cuda

我在float *内存块的代码中做了一些计算。因为我正在处理图像,所以我必须使用宽度*高度点和180度旋转。我开始180个线程(每度旋转1个),因为这是代码中唯一可并行化的过程。 我旋转图像,并获得每个旋转,为每个点得到一个浮点值。 我有另一个浮点*块,它存储每个点的当前最大值。

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

使用resultMap存储当前最高值。 convrst是卷积的结果,如果当前结果高于之前的结果,它将保存该值,加上该点的半径(r0)和旋转(索引)。 r0最初是一个int,也是一个索引。 我是一个从0到imgsize-1

的计数器

如果没有{}部分中的赋值,整个代码将在2s内完成,分配时间为50s(这并没有考虑到在该代码中我省略了锁以避免同步问题)

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

1 个答案:

答案 0 :(得分:2)

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

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