2

私は OpenCL に飛び込むことを計画しており、OpenCL でできることについて (表面的な知識のみ) を読んでいますが、いくつか質問があります。

AMD Radeon 7750 があり、AMD Radeon 5870 を搭載した別のコンピューターがあり、Nvidia カードを搭載したコンピューターを使用する予定はないとします。特定のデバイス向けにコードを最適化すると、パフォーマンスが向上すると聞きました。最適化とは具体的に何を意味するのでしょうか?私が読んだことと少し推測したところ、GPU が好む方法 (一般的には AMD または Nvidia カードであることを気にせずに) でコードを書くことを意味しているように思えます。グラフィックカードがメモリを処理します(これはコンピューティングデバイス固有のものだと思いますか?または、これはブランド固有のみですか?)。

So if I write code and optimized it for the Radeon 7750, would I be able to bring that code to the other computer with the Radeon 5870 and, without changing any part of the code, still retain a reasonable amount of performance benefits from the optimization? In the event that the code doesn't work, would changing parts of the code be a minor issue or would it involve rewriting enough code that it would have been a better idea to have written an optimized code for the Radeon 5870 in the first place.

4

1 に答える 1

5

作成しようとしているアルゴリズムとアプリケーションに関する詳細情報がないと、質問は少し曖昧になります。しかし、これら 2 つの異なるプラットフォーム用のコードを開発する際に覚えておくべき、いくつかの高レベルの戦略を提供できると思います。

Radeon 7750 の設計は新しいGraphics Core Nextアーキテクチャですが、HD5780 は古いVLIW5 (RV770) アーキテクチャに基づいています。

コードが HD5780 ハードウェアで適切に動作するためには、パックされたプリミティブ データ型、特に , 型を可能な限り多用する必要がありint4ますfloat4。これは、OpenCL コンパイラが自動的に並列処理を検出し、データを広いベクターにパックするのに苦労するためです。これを考慮してコードを構成できれば、より多くの VLIW-5 スロットを埋めることができ、より多くのストリーム プロセッサを使用できるようになります。

GCN は NVidia の Fermi アーキテクチャに似ており、ストリーム プロセッサの機能ユニット (ALU など) へのコードのパスは、明示的にスケジュールされた VLIW 命令を経由しません。そのため、より多くの並列処理が実行時に自動的に検出され、それを実現する方法についてそれほど難しく考えることなく、機能ユニットを有効な作業に忙しく保つことができます。

私の要点を説明するために、単純化しすぎた例を次に示します。

// multiply four factors
// A[0] = B[0] * C[0]
// ...
// A[3] = B[3] * C[3];

float *A, *B, *C;

for (i = 0; i < 4; i ++) {
  A[i] = B[i] * C[i];
}

そのコードはおそらく GCN アーキテクチャ上で問題なく動作します (メモリ アクセス パフォーマンスが最適化されていない場合を除きます。これは高度なトピックです)。しかし、HD5870 では、これらの 4 つの乗算が 1 つではなく 4 つの VLIW5 命令を使用するため、惨事になります! したがって、float4タイプを使用して上記のコードを記述します。

float4 A, B, C;

A = B * C;

そして、それはあなたの両方のカードで本当にうまくいくでしょう. さらに、CPU OpenCL コンテキストでお尻をキックし、MMX/SSE ワイド レジスタを大いに活用します。これはおまけです。また、メモリ システムをより有効に使用することもできます。

簡単に言えば、パックされたプリミティブを使用することは、これら 2 つのシステムに同時にコードをデプロイする際に覚えておくことをお勧めできることの 1 つです。

HD5870 で注意する必要があることをより明確に示すもう 1 つの例を次に示します。別の作業単位を使用して前の例を実装したとします。

// multiply four factors
// as separate work units
// A = B * C

float A, B, C;

A = B * C;

また、1 つではなく 4 つの個別の作業単位がありました。これは、VLIW デバイスでは絶対的な惨事であり、GCN デバイスでは非常に優れたパフォーマンスを示します。これは、コードを書いているときにも探したいものです。float4型を使用して、同じ作業を行う作業単位の数を減らすことができますか? その場合、両方のプラットフォームで良好なパフォーマンスが得られます。

于 2012-09-19T18:30:56.980 に答える