1
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)
4

1 回答 1

0

我认为您在 GPU 上进行的计算不足以抵消复制数据的额外成本。您正在复制每个数组 4Mb 的数据,并且只在 GPU 上执行 1024 * 1024 加法操作。对于这样一个简单的算法,也没有机会使用 tile 静态内存(比全局内存快得多)。因此,在某些方面,这对于任何 GPU 解决方案来说都是最坏的情况。

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

注意:您正在使用discard_data()并且array_view<const float, 2>正确,因此您已经将所需的副本数量降至最低。

确保您正在使用适当的编译器优化标志测试发布版本,以获得最佳时机。

墨西哥

关于 MEX(我从未使用过),我不确定它是否有任何特殊功能可以让您访问 GPU 内存或资源,而不是通过 C++AMP 或 CUDA 等 API。以下论文可能有用,使用 GPU 加速 MATLAB 代码。如果您的应用程序使用同样在 GPU 上运行的另一个框架,则可以在 DirectX 缓冲区和 C++AMParray实例之间进行映射。这在 Direct 3D 和 C++ AMP 之间的互操作性和 C ++ AMP Book的第 11 章中有所介绍。

于 2014-03-23T06:50:15.813 回答