C++ C++;AMP性能问题-在没有任何数据移动的情况下,性能显著不一致

C++ C++;AMP性能问题-在没有任何数据移动的情况下,性能显著不一致,c++,c++-amp,C++,C++ Amp,我有一个算法,它依赖于大约15个不同的数组视图,每个AMP内核调用8个不同的for。该算法的本质是将所有数据复制到GPU,然后反复执行一组内核调用,直到达到某个阈值。注意:我还没有实现阈值逻辑——这需要将数据检索回CPU 完整的内核调用集称为循环。在每个周期之间,我不引用CPU上的任何阵列视图数据……因此,我不希望任何数据移动回CPU。然而,循环的性能并不规则。大多数情况下,周期需要10毫秒左右,但每第3或第4个周期(有时是背靠背)执行一次周期需要400或500毫秒。内核调用的内部逻辑基本上是相

我有一个算法,它依赖于大约15个不同的数组视图,每个AMP内核调用8个不同的for。该算法的本质是将所有数据复制到GPU,然后反复执行一组内核调用,直到达到某个阈值。注意:我还没有实现阈值逻辑——这需要将数据检索回CPU

完整的内核调用集称为循环。在每个周期之间,我不引用CPU上的任何阵列视图数据……因此,我不希望任何数据移动回CPU。然而,循环的性能并不规则。大多数情况下,周期需要10毫秒左右,但每第3或第4个周期(有时是背靠背)执行一次周期需要400或500毫秒。内核调用的内部逻辑基本上是相同的……因此,增加的执行时间不是由于GPU逻辑

是什么导致某些周期的时间急剧增加?请参见下面的示例计时

完成第一个循环的时间503.278(毫秒) 这一时间包括AMP初始化、内核编译和数据的开销 移动到GPU

完成1个以上循环的时间:11.3105(ms) 完成两个以上循环的时间:10.7455(ms) 完成3个以上循环的时间:538.668(ms) 完成4个以上循环的时间:13.3055(ms) 完成5个以上循环的时间:14.4544(ms) 完成6个以上循环的时间:12.353(毫秒) 完成7个以上循环的时间:17.5154(ms) 完成8个以上循环的时间:755.255(毫秒) 完成9个以上循环的时间:11.7461(毫秒) 完成10个以上循环的时间:14.6612(ms) 完成11个以上循环的时间:417.788(ms) 完成12个以上循环的时间:399.167(ms) 完成13个以上循环的时间:12.2898(毫秒) 完成14个以上循环的时间:16.9694(ms) 完成15个以上循环的时间:151.228(ms) 完成16个以上循环的时间:404.659(ms) 再完成17个循环的时间:10.4977(ms) 完成18个以上循环的时间:15.7178(ms) 完成19个以上循环的时间:207.768(ms) 完成20个以上循环的时间:511.538(ms) 完成21个以上循环的时间:14.4339(ms) 完成22个以上循环的时间:252.77(ms) 完成23个以上循环的时间:504.565(ms) 完成24个以上循环的时间:12.6931(ms) 完成25个以上循环的时间:15.5403(ms) 再完成26个循环的时间:303.68(ms) 完成27个以上循环的时间:440.331(ms) 完成28个以上循环的时间:8.63698(ms) 再完成29个循环的时间:13.9312(毫秒) 再完成30个循环的时间:755.637(ms) 退出。。。。。。
按任意键继续

你可以分享(至少一个伪代码)你是如何测量时间的,注意C++的AMP团队有一篇关于博客主题的帖子:还有一个有趣的问题是,您使用的GPU的品牌和型号,以及这个单元是专用于计算,还是在后台运行其他任何东西都可能使用它。图形卡是AMD Radeon HD 6130。关于计时方法……我用的是C++的AMP书中使用的方法。请参阅以下示例代码:for(i=1;仅使用50%的GPU专用内存,GPU同时用于我的计算和笔记本电脑的显示,尽管在计算运行时我没有在显示器上积极地执行任何操作。在AMPFuncs中,如何同步CPU和GPU-是否使用加速器_view::wait()在每一次通话中?除此之外,我们都观察到AMD表现出相当积极的功率步进,甚至在台式机系统上,我认为这在笔记本电脑上会被夸大-在这个程度上,你可以尝试调整Windows电源设置,或者在Catalyst Control Center中的一些选项。我已经说过~50x的跳跃声音对我来说太陡了,无法解释下面的例子说明了这一点。概述源代码(以及您的问题的一些重新格式化)在这里会很有帮助。我不想阅读您的性能计数器代码,但我没有看到flush()或wait()在您的评论中,您可能没有对每个调用单独计时。请记住,AMP内核执行不是真正的执行,而是排队。有关计时和排队的更多详细信息,请参阅。