C++ amp 为什么对array_view::synchronize()的调用如此缓慢? 我已经开始用C++ AMP做实验了。我创建了一个简单的测试应用程序,只是为了看看它能做些什么,但是结果让我非常惊讶。考虑下面的代码: #include <amp.h> #include "Timer.h" using namespace concurrency; int main( int argc, char* argv[] ) { uint32_t u32Threads = 16; uint32_t u32DataRank = u32Threads * 256; uint32_t u32DataSize = (u32DataRank * u32DataRank) / u32Threads; uint32_t* pu32Data = new (std::nothrow) uint32_t[ u32DataRank * u32DataRank ]; for ( uint32_t i = 0; i < u32DataRank * u32DataRank; i++ ) { pu32Data[i] = 1; } uint32_t* pu32Sum = new (std::nothrow) uint32_t[ u32Threads ]; Timer tmr; tmr.Start(); array< uint32_t, 1 > source( u32DataRank * u32DataRank, pu32Data ); array_view< uint32_t, 1 > sum( u32Threads, pu32Sum ); printf( "Array<> deep copy time: %.6f\n", tmr.Stop() ); tmr.Start(); parallel_for_each( sum.extent, [=, &source](index<1> idx) restrict(amp) { uint32_t u32Sum = 0; uint32_t u32Start = idx[0] * u32DataSize; uint32_t u32End = (idx[0] * u32DataSize) + u32DataSize; for ( uint32_t i = u32Start; i < u32End; i++ ) { u32Sum += source[i]; } sum[idx] = u32Sum; } ); double dDuration = tmr.Stop(); printf( "gpu computation time: %.6f\n", dDuration ); tmr.Start(); sum.synchronize(); dDuration = tmr.Stop(); printf( "synchronize time: %.6f\n", dDuration ); printf( "first and second row sum = %u, %u\n", pu32Sum[0], pu32Sum[1] ); tmr.Start(); for ( uint32_t idx = 0; idx < u32Threads; idx++ ) { uint32_t u32Sum = 0; for ( uint32_t i = 0; i < u32DataSize; i++ ) { u32Sum += pu32Data[(idx * u32DataSize) + i]; } pu32Sum[idx] = u32Sum; } dDuration = tmr.Stop(); printf( "cpu computation time: %.6f\n", dDuration ); printf( "first and second row sum = %u, %u\n", pu32Sum[0], pu32Sum[1] ); delete [] pu32Sum; delete [] pu32Data; return 0; }

C++ amp 为什么对array_view::synchronize()的调用如此缓慢? 我已经开始用C++ AMP做实验了。我创建了一个简单的测试应用程序,只是为了看看它能做些什么,但是结果让我非常惊讶。考虑下面的代码: #include <amp.h> #include "Timer.h" using namespace concurrency; int main( int argc, char* argv[] ) { uint32_t u32Threads = 16; uint32_t u32DataRank = u32Threads * 256; uint32_t u32DataSize = (u32DataRank * u32DataRank) / u32Threads; uint32_t* pu32Data = new (std::nothrow) uint32_t[ u32DataRank * u32DataRank ]; for ( uint32_t i = 0; i < u32DataRank * u32DataRank; i++ ) { pu32Data[i] = 1; } uint32_t* pu32Sum = new (std::nothrow) uint32_t[ u32Threads ]; Timer tmr; tmr.Start(); array< uint32_t, 1 > source( u32DataRank * u32DataRank, pu32Data ); array_view< uint32_t, 1 > sum( u32Threads, pu32Sum ); printf( "Array<> deep copy time: %.6f\n", tmr.Stop() ); tmr.Start(); parallel_for_each( sum.extent, [=, &source](index<1> idx) restrict(amp) { uint32_t u32Sum = 0; uint32_t u32Start = idx[0] * u32DataSize; uint32_t u32End = (idx[0] * u32DataSize) + u32DataSize; for ( uint32_t i = u32Start; i < u32End; i++ ) { u32Sum += source[i]; } sum[idx] = u32Sum; } ); double dDuration = tmr.Stop(); printf( "gpu computation time: %.6f\n", dDuration ); tmr.Start(); sum.synchronize(); dDuration = tmr.Stop(); printf( "synchronize time: %.6f\n", dDuration ); printf( "first and second row sum = %u, %u\n", pu32Sum[0], pu32Sum[1] ); tmr.Start(); for ( uint32_t idx = 0; idx < u32Threads; idx++ ) { uint32_t u32Sum = 0; for ( uint32_t i = 0; i < u32DataSize; i++ ) { u32Sum += pu32Data[(idx * u32DataSize) + i]; } pu32Sum[idx] = u32Sum; } dDuration = tmr.Stop(); printf( "cpu computation time: %.6f\n", dDuration ); printf( "first and second row sum = %u, %u\n", pu32Sum[0], pu32Sum[1] ); delete [] pu32Sum; delete [] pu32Data; return 0; },c++-amp,C++ Amp,为什么调用synchronize()要花这么长时间?有没有办法绕过这个问题?除此之外,计算性能令人惊讶,但是synchronize()开销使其无法使用 也可能是我做错了什么,如果是,请告诉我。提前感谢。函数synchronize()可能需要很长时间,因为它正在等待实际内核完成其工作 发件人: 请注意,并行的_for_执行时好像与调用代码同步,但实际上是异步的。也就是说,一旦执行了并行_for_each调用,内核被传递到运行时,[并行_for_each后的代码]将继续由CPU线程立即执行,而内核则

为什么调用synchronize()要花这么长时间?有没有办法绕过这个问题?除此之外,计算性能令人惊讶,但是synchronize()开销使其无法使用

也可能是我做错了什么,如果是,请告诉我。提前感谢。

函数synchronize()可能需要很长时间,因为它正在等待实际内核完成其工作

发件人:

请注意,并行的_for_执行时好像与调用代码同步,但实际上是异步的。也就是说,一旦执行了并行_for_each调用,内核被传递到运行时,[并行_for_each后的代码]将继续由CPU线程立即执行,而内核则由GPU线程并行执行

因此,测量每个并行_花费的时间并不是特别有意义

编辑:以编写算法的方式,它不会从GPU加速中获得太多好处。源[i]的读取是非合并的,因此它将比合并读取慢近16倍。通过使用共享内存可以合并读取,但这并不是很简单。我建议大家多读GPU编程

如果您只需要一个简单的例子来说明C++的AMP实用性,那么尝试.< /P>


当然,您将观察到的性能也很大程度上取决于您的GPU硬件模型。

< P>除了Igor对您特定算法的响应之外,请注意,您通常在测量C++性能方面存在多个不正确的方面。(没有运行时初始化排除、没有丢弃初始JIT、没有数据预热,以及已经指出的p_f_e同步的假设),因此请遵循我们的指导原则:


这意味着GPU上的实际计算需要很长时间?如果是这样,有没有办法加快计算速度,使其与CPU一样快?我编辑了答案,解释了GPU计算速度慢的原因。谢谢!我们将进一步研究。嗨,丹尼尔,谢谢你的回复。我已经找到了你链接到的MSDN博客,我正在研究所有的问题你有令人困惑的例子。谢谢!
Array<> deep copy time: 0.089784
gpu computation time: 0.000449
synchronize time: 8.671081
first and second row sum = 1048576, 1048576
cpu computation time: 0.006647
first and second row sum = 1048576, 1048576