在NVIDIA K5000上运行此代码时,我遇到了严重的性能问题:
while ( atomicMax(&iThreadSemaphore, 0) )
;
在GTX 650 ti或K2000上,设备功能在约2900毫秒内执行,包括上述代码。在K5000上,完全相同的设备功能在~5000毫秒内执行。当我移除while
循环时,K5000在~900毫秒内执行设备功能,这是K2000的1/3并且OK!
有人知道为什么atomicMax()
功能会使K5000慢下来吗?
我绝对可以隔离问题代码 - 它是while
循环。
谢谢。
答案 0 :(得分:1)
基本上,您的问题听起来像是代码中可扩展性限制的直接示例。
K5000有8个多处理器,而其他只有4个多处理器。假设您说您正在运行147个块(这足以在执行期间完成所有GPU的填充),您将遇到这样的情况:K5000在飞行中的线程数量将是K2000的两倍或者GF650Ti。从对代码的极其有限的描述来看,这意味着你有两倍的线程以原子方式争用同一个信号量。您拥有的争用越多,代码就越慢。我认为同一原子资源的争用次数至少要慢两倍。
总之,您的K5000似乎没有任何问题,只不过它足以暴露您的代码的严重可扩展性问题。