C ++ AMP ARRAY_VIEW在matlab中慢速GPU

时间:2014-03-22 21:33:26

标签: c++ arrays matlab visual-studio-2012 c++-amp

void Addx(float *z, float *x, float *y, size_t m, size_t n)
{
vector<float > vx(m*n); 
vector<float > vy(m*n);
vector<float > vz(m*n);

vx.assign(x, x + n*m);
vy.assign(y, y + n*m);
pick_accelerator();

extent<2> e(m, n);
array_view<const float, 2> xg(e, vx), yg(e, vy);
array_view<float, 2> zg(e, vz);
zg.discard_data();
parallel_for_each(e, [=](index<2> idx) restrict(amp)
{
zg[idx] = xg[idx] + yg[idx];
});

zg.synchronize();

for (int count = 0; count < m*n; count++)
{
    z[count] = vz[count];

}
}

我的GPU是HD 7790,该程序是用matlab mex实现的。 C ++ AMP。 我看到程序比CPU Phenom II X6(1055T)2.8GHZ慢。

Size Array 1024x1024
GPU Elapsed time is 0.026684 seconds. 
CPU Elapsed time is 0.004970 seconds.

我看到程序比CPU Phenom II X6(1055T)800MHZ(慢4倍)慢。

Size Array 1024x1024
GPU Elapsed time is 0.064891 seconds.
CPU Elapsed time is 0.009650 seconds.

CPU和GPU之间的关系传输内存。 我如何加速GPU程序?

CPU 130 Gflops AIDA64x FP (Phenom II X6 1055T)
GPU 1820 Gflops AIDA64x FP (HD 7790 OC)

1 个答案:

答案 0 :(得分:0)

我不认为你在GPU上做足够的计算来抵消复制数据的额外成本。您正在为每个阵列复制4Mb数据,并且仅在GPU上执行1024 * 1024个附加操作。对于这样一种简单的算法,也没有机会利用瓦片静态存储器(比全局存储器快得多)。所以在几种方面,这对于任何GPU解决方案来说都是最糟糕的情况。

由于额外的复制时间,这可能永远不会比在CPU上执行更快。我假设这只是一个'hello world'测试程序,你实际上要实现更复杂的东西。在这种情况下,您应该看到更好的结果。

注意:您正在使用discard_data()array_view<const float, 2>,因此您已经最小化了所需的副本数量。

确保使用适当的编译器优化标记测试发布版本,以获得最佳时序。

MEX

关于MEX(我从未使用过),我不确定它是否有任何特殊功能允许您访问GPU内存或资源,而不是通过像C ++ AMP或CUDA这样的API。以下文章可能有用,Accelerating MATLAB Code Using GPUs。如果您的应用程序使用另一个也在GPU上运行的框架,则可以映射到DirectX缓冲区和C ++ AMP array实例。 Interoperability between Direct 3D and C++ AMPC++ AMP Book的第11章中介绍了这一点。