我试图将内核执行与memcpyasync重叠,但它不起作用。我遵循编程指南中的所有建议,使用固定内存,不同的流等。我看到内核执行确实重叠,但它不与mem传输。我知道我的卡只有一个复制引擎和一个执行引擎,但执行和传输应该重叠,对吗?
似乎“复制引擎”和“执行引擎”总是强制执行我调用函数的顺序。工作包括执行[HtoD x2,Kernel,DtoH]的4个流。如果我在每个流上发出HtoDx2,Kernel,DtoH系列,我在profiler中看到像stream2 HtoD第一个操作在第一个DtoH操作结束之前不会启动。如果我首先在每个流上发布HtoD,那么第二个HtoD,然后是内核,然后是DtoH(广度),我看不到重叠,并且GPU也强制执行问题顺序。
我尝试过使用CUDA SDK中给出的simpleStreams示例,我也看到了相同的行为。
我附加了一些屏幕截图,显示了VS2008的visual profiler和Nsight中的问题。
PS。我没有设置CUDA_LAUNCH_BLOCKING env
Simple Streams Visual Profiler
MyApp Nsight时间轴广度
MyApp Nsight时间轴深度优先
修改:
添加额外的x4内核(每个流总共2HtoD,5个内核,1DtoH) - > 如果我使用和不使用--concurrent-kernels-off运行nvprof,则经过的时间是相同的。如果我设置env CUDA_LAUNCH_BLOCKING = 1,那么我看到7.5%的性能改进(来自命令行)!
系统规范:
答案 0 :(得分:0)
正如我在评论中所说,确实存在一个带有CUDA驱动程序的BUG,它使得流式传输无法与我的安装程序一起使用。我已经测试了1.1功能卡(8800 GTS)和3.5功能卡(GTX Titan),两种卡工作正常。一些费米卡似乎存在问题(我的GTX 480不起作用)。
答案 1 :(得分:0)
我刚刚遇到同样的问题。我同意你的说法有一个BUG。我认为该错误可能是用于Windows的CUDA驱动程序,也可能是Windows本身。我测试了我的代码,它在Linux中运行良好(重叠)。
实际上,您可以在SDK中测试“simpleStreams”示例。我发现在Windows中运行的“simpleStreams”根本没有内核和内存副本之间的重叠,但是在Linux中它运行得很好。
我使用的是CUDA 5.0和Fermi GTX570。通过对8800GT和GTX Titan的测试,我同意这是Windows的CUDA驱动程序中的一个错误。希望很快就能解决。
答案 2 :(得分:0)
TL; DR:问题是由Nsight Monitor中的WDDM TDR延迟选项引起的!设置为false时,会出现问题。相反,如果你设置了 TDR延迟值到一个非常高的数字,"启用"选项 是的,问题就消失了。 请尝试下面介绍的选项(更常见),因为它们也与问题有关!
请阅读下面的其他(较旧)步骤,直到我找到上述解决方案,以及其他一些可能的原因。
我最近才能部分解决这个问题!我认为它特定于windows和aero。请尝试这些步骤并发布结果以帮助其他人!我在GTX 650和GT 640上尝试过它。
在您执行任何操作之前,请考虑using both onboard gpu(as display) and the discrete gpu (for computations),因为nvidia驱动程序已经验证了Windows的问题!当你使用板载gpu时,说驱动程序没有满载,所以很多bug都被规避了。此外,在工作时保持系统响应能力!
这将禁用空气动力学和几乎所有视觉效果。如果此配置有效,您可以尝试逐个启用视觉效果框,直到找到导致问题的精确框!
或者,您可以:
这也可以如上所述,但启用了更多可视化选项。对于我的两个设备,此设置也有效,所以我保留了它。
当您尝试这些解决方案时,请回到此处并发布您的发现!
对我来说, 解决了大多数情况下的问题(我做过平铺的dgemm) ,但请注意我仍然无法运行&#34 ; simpleStreams"正确并实现并发......
更新 <问题通过新的Windows安装完全解决 !!前面的步骤改进了某些情况下的行为,但是全新安装解决了所有问题!
我会尝试找一种解决这个问题的不那么激进的方法,也许只需恢复注册表即可。