0

ArrayFire に実装したばかりのビーム伝搬アルゴリズムがあります。GTX Titan カードで OpenCL バックエンドを使用していました。OpenCL では、毎分約 25,000 ステップで実行されていました。次に、それを CUDA バックエンドに切り替えたところ、パフォーマンスは毎分約 50,000 ステップまで上がりました。これは少し意外でしたが、OpenCL では利用できないより高度な機能を使用している可能性があると考えました。次に、GTX 960 カードを使用して同じテストを実行しました。OpenCL では 1 分あたり約 22,000 ステップ、CUDA では 23,000 ステップで実行されました。タイタンと同じパターンになると思っていたので、これは困惑しています。また、GT 730M を使用しているラップトップで 2 倍のパフォーマンスの変化を見たと思います。nvidia が一部のカードで OpenCL を遅くすると聞いたことがあります。彼らは700シリーズのためにこれをしますか?

4

1 に答える 1

3

コードを表示しなかったため、プロファイラーのみを提供できます。たとえば、私は amd の codexl を使用しており、すべての写真は、768x768 マトリックスで計算する 50x50 のブラシ領域を使用して、過度に同期された畳み込みアルゴリズムから取得されます。多くの整数とローカル整数配列と整数操作があり、最終的に同じ数の fp 操作があると、いくつかの問題が発生します (作業は 3 つのデバイスでバランスが取れています)。

nvidia には、アプリケーションの穴を検出する同様のソフトウェアがあるはずです。

  • 関数ごとの CPU 時間プロファイリングにより、ホスト側のホット スポットを知ることができます。最も時間のかかる上位 5 つの関数がここにリストされています。したがって、ホスト機能を最適化できます (機能の 1 つをクリックすると、コアごとの CPU 命令の詳細なパフォーマンス カウンターが表示されます)。

CPU時間

  • カーネル分析は、ベクトル単位、スカラー単位、メモリ操作、およびその他の多くのオプションによるボトルネックがあるかどうかを示します。ここではカーネルの占有率と波面の数を見ることができますが、右側には他にも何十ものものがあります。

カーネルアナライザー

kerneloccupancy セルをクリックすると、下の図のようにボトルネックの原因を詳細に確認できます。

ここに画像の説明を入力

  • アプリケーション タイムライン トレース プロファイリングは、ndRangeKernel、読み取り/書き込み操作、clFinish、およびその他の API メソッド間のギャップを明らかにするため、冗長な同期、マルチスレッド操作のボトルネック、およびメモリ リークがあるかどうかを確認できます。この例では、デバイスごとの非同期操作はなく、冗長な同期があります)

ここに画像の説明を入力

  • また、gtx 960 は、ワークロードが 960 に対して十分に大きく、titan に対して十分に小さい場合を除いて、titan を打ち負かすことはできません (おそらく、異なるデバイス処理によって引き起こされる API オーバーヘッド)。ユニットあたり 192 コアの titan (グループあたり 384 - 768 スレッドの場合に適しています) と、ユニットあたり 128 コアの gtx960 (グループあたり 256 - 512 -1024 スレッドの並列処理の方が優れています) の可能性があります。
  • 1 分あたり 25000 回の反復は 1 秒あたり 416 回で、ステップあたり約 2.5 ミリ秒です。2.5 ミリ秒は、このタイム スライスで 10 ~ 40 MB しか転送できないことを意味します。送信されるバッファのサイズは? 過剰な clFinish 関数は、カーネル時間が同等 (1 ~ 2 ミリ秒など) の場合に観察可能な遅延を伴う少なくとも数百マイクロ秒を引き起こします。

  • 最適なパフォーマンス (ピークではない) を達成するのに十分な量の titan がロードされるように、実行のスケールを増やします。

  • ワークロードが小さすぎる場合、R7-240 (320 コア) は HD7870 (1280 コア) よりも優れています。これは、計算ユニットあたりのウェーブフロントが多く、ALU に %100(占有) が供給されるため、カーネル占有率が r7 の方が高いためです。計算を準備する計算ユニットが少なくなり (オーバーヘッド)、ハードウェアでの同期が少なくなります (オーバーヘッド)。そのため、「パフォーマンス」や「極端」など、ベンチマークにさまざまなカテゴリがあります。また、新しいアーキテクチャは、ピーク パフォーマンスに近い状態で動作します。

  • おそらく、gtx 960 は、同時に実行されている 3 つの array-fire アプリケーション (@ 15000/m) を管理できない可能性がありますが、titan は 8 ~ 10 個のアプリ (たとえば、@ 15000/m) を同時に管理できます (アプリ レベルを選択した場合)。単純にステップごとの作業サイズを増やすのではなく、並列処理)。

編集:サンプルコードは実際に拡散のような相互作用を計算しています。円形の原料物質周辺の平衡状態:

ここに画像の説明を入力

カラー バンディングは、すべてのカラー チャネルで fp を 0 ~ 255 の範囲の整数に丸めることから発生します (rgba-各 1 バイト、float を使用する必要がありますが、十分な PCI バジェットがありません)。

于 2016-03-31T08:37:07.780 に答える