Performance CUDA内核性能随时间的变化

Performance CUDA内核性能随时间的变化,performance,cuda,Performance,Cuda,我一直在测试一些CUDA程序(2D和3D lattice boltzmann解算器),发现了一些不寻常的东西;我预计,随着时间的推移,解算器的性能会出现一些随机变化,但在各种不同的问题大小、块大小、操作系统和GPU(更不用说2D和3D代码是完全独立的,而不是同一程序的不同配置)上,我可以看到内核执行时间出现非常明显的正弦波动。对于我测试过的两个GPU(K5000m和K20c),变化的频率似乎在10-12Hz范围内 对此有什么已知的解释吗?我的想法是热/电管理,但我还没能证明这一点。还有其他人经历

我一直在测试一些CUDA程序(2D和3D lattice boltzmann解算器),发现了一些不寻常的东西;我预计,随着时间的推移,解算器的性能会出现一些随机变化,但在各种不同的问题大小、块大小、操作系统和GPU(更不用说2D和3D代码是完全独立的,而不是同一程序的不同配置)上,我可以看到内核执行时间出现非常明显的正弦波动。对于我测试过的两个GPU(K5000m和K20c),变化的频率似乎在10-12Hz范围内

对此有什么已知的解释吗?我的想法是热/电管理,但我还没能证明这一点。还有其他人经历过吗

更多信息和示例


MSVC2010项目的一个小示例代码可以在该项目中找到,该项目需要CUDA 5.0和sm_30设备,尽管只有一个文件,因此手动构建该项目将非常简单。这段代码是相当不言自明的,一个简单内核的100次迭代(默认情况下执行从多个数组读取和写入多个数组的内核)是定时的,其结果打印到一个文件中。对执行时间执行FFT可在K5000m上产生接近11Hz的可见峰值。我会发布一张图片,但我没有声誉。

Windows会对GPU内核执行的详细时间产生行为影响,尤其是在WDDM模式下运行GPU时。请最好在linux环境中重新运行您的观察和FFT,其中X不在GPU上运行。这将为您提供最一致的行为。WDDM设置中的CUDA驱动程序在某种程度上受制于windows操作系统

我在SM35设备CentOS 5.5和CUDA 5.5上运行了您的代码,并获得了以下Times.dat输出:

0.007648 0.0024 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.00192 0.001856 0.00192 0.001888 0.00192 0.001888 0.001888 0.001888 0.00192 0.001888 0.001888 0.001880.001888 0.001888 0.001880.001880.001856 0.001888 0.001888 0.001880.001880.001880.001880.0010.001880.001880.0010.001880.001880.0010.001880.0010.0018800.001888 0.00192 0.00192 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.001888 0.001856 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.003904 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.00192 0.001856 0.001888 0.001856 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001952 0.001888 0.001888 0.00192 0.00192 0.00192 0.001888 0.001888 0.001952 0.001888 0.00192 0.001888 0.001856 0.001888 0.00192 0.001888 0.001888 0.001888 0.00192 0.001856 0.001888 0.001888 0.001888 0.001888 0.00192 0.00192 0.001888 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.00192 0.001888 0.001888 0.00192 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.004448 0.001888 0.001952 0.001888 0.001888 0.001888 0.001888 0.001888 0.001856 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001856 0.001888 0.001888 0.001888 0.001888 0.001856 0.001888 0.001888 0.001856 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888

偶尔会有变化,但是不要忘记
cudaTime
变量捕获的时间以毫秒为单位。所以我在上面的数据中看到的变化主要是小于1微秒的变化,从一次到一次

抛开第一个数字,我看到的最大变化是在少数情况下大约2-3微秒。考虑到测量的执行时间通常小于2微秒,这是一个很大的变化,但仍然存在噪音,与您报告的10微秒不同


在我未经训练的眼中,我也看不到数据中的任何正弦模式,但如果你告诉我其中有一个11Hz的频率(甚至不知道这意味着什么,因为我看不到这些数据点的时间戳)——我相信你的话。

执行时间的变化幅度是多少?大约10微秒,我最初认为这是使用cudaEvents计时时的舍入误差,但它们的分辨率应该在0.5微秒左右。流体是否以正弦加速模式移动?如果内核中有这样的语句,并且性能随着条件变差(完全随机的跨线程分支)和变好(线程中有关于分支的顺序)而变化,则不,测试用例是一个盖子驱动的空腔。对于给定的域大小,由于边界而产生的分支量是恒定的。我自己写的代码,所以我相信这不是应用程序级别的问题。@Talonmes您有机会研究一下吗?我问英伟达DEV论坛和NoOne可以找到答案。时间戳是通过总结以前迭代的执行时间来进行的;这显然不准确,因为它忽略了内核计时所占用的时间,但我关心的是结果的一致性,而不是确切的频率。你的结果似乎没有表现出这种行为,我的印象是我一直使用的K20c没有使用x。也许我错了,我将在那台机器上运行我的样品并确认。至于变化的顺序,我不相信样品会产生这种变化,因为它非常精简,旨在再现正弦曲线行为而不是幅度。