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 は、matlab mex で実装されたプログラムである HD 7790 です。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 の加算操作のみを実行しています。このような単純なアルゴリズムでは、タイルの静的メモリ (グローバル メモリよりもはるかに高速) を利用する機会もありません。したがって、いくつかの点で、これはあらゆる GPU ソリューションにとって最悪のシナリオです。

これはおそらく、追加のコピー時間がかかるため、CPU で実行するよりも高速になることはありません。これは単なる 'hello world' テスト プログラムであり、実際にはもっと複雑なものを実装しようとしていると思います。その場合、より良い結果が表示されるはずです。

注: discard_data()and をarray_view<const float, 2>正しく使用しているため、必要なコピーの数はすでに最小限に抑えられています。

最適なタイミングを得るために、適切なコンパイラ最適化フラグを使用してリリース ビルドをテストしていることを確認してください。

メキシコ

MEX (私は一度も使用したことがありません) に関しては、C++AMP や CUDA などの API 以外で GPU メモリやリソースにアクセスできる特別な機能があるかどうかはわかりません。GPU を使用した MATLAB コードの高速化 という論文が役立つ場合があります。アプリケーションが GPU 上で実行される別のフレームワークを使用している場合、DirectX バッファーおよび C++AMParrayインスタンスとの間でマッピングすることができます。これについては、Interoperability between Direct 3D and C++ AMPおよびC++ AMP Bookの第 11 章で説明されています。

于 2014-03-23T06:50:15.813 に答える