在NVIDIA K5000上运行原子功能的重型性能问题

时间:2014-05-20 08:23:41

标签: performance cuda nvidia atomic

在NVIDIA K5000上运行此代码时,我遇到了严重的性能问题:

while ( atomicMax(&iThreadSemaphore, 0) ) ;

在GTX 650 ti或K2000上,设备功能在约2900毫秒内执行,包括上述代码。在K5000上,完全相同的设备功能在~5000毫秒内执行。当我移除while循环时,K5000在~900毫秒内执行设备功能,这是K2000的1/3并且OK!

有人知道为什么atomicMax()功能会使K5000慢下来吗?

我绝对可以隔离问题代码 - 它是while循环。

谢谢。

1 个答案:

答案 0 :(得分:1)

基本上,您的问题听起来像是代码中可扩展性限制的直接示例。

K5000有8个多处理器,而其他只有4个多处理器。假设您说您正在运行147个块(这足以在执行期间完成所有GPU的填充),您将遇到这样的情况:K5000在飞行中的线程数量将是K2000的两倍或者GF650Ti。从对代码的极其有限的描述来看,这意味着你有两倍的线程以原子方式争用同一个信号量。您拥有的争用越多,代码就越慢。我认为同一原子资源的争用次数至少要慢两倍。

总之,您的K5000似乎没有任何问题,只不过它足​​以暴露您的代码的严重可扩展性问题。