11

CPU と GPU の両方で (iOS8 Metal 計算パイプラインを使用して) それぞれ 50 文字の 1.000.000 行 (50 mil char マップ) を検索する単純な char 検索アルゴリズムを実装することにより、簡単な実験を行いました。

CPU 実装は単純なループを使用し、Metal 実装は各カーネルに 1 行の処理を与えます (以下のソース コード)。

驚いたことに、Metal の実装は、単純な線形 CPU (1 つのコアを使用する場合) よりも平均で 2 ~ 3 倍遅く、2 つのコア (それぞれがデータベースの半分を検索する場合) を使用する場合は 3 ~ 4 倍遅くなります。グループごとに異なるスレッド (16、32、64、128、512) で実験しましたが、それでも非常によく似た結果が得られました。

iphone 6:

CPU 1 core:  approx 0.12 sec
CPU 2 cores: approx 0.075 sec
GPU: approx 0.35 sec (relEase mode, validation disabled)

Metal シェーダーがアクセス メモリの 90% 以上を消費していることがわかります (以下を参照)。

それを最適化するために何ができますか?

インターネットには (標準の Apple プログラミング ガイド以外に) 多くの情報源がなく、Metal フレームワークに固有のメモリ アクセスの内部とトレードオフに関する詳細を提供しているため、洞察をいただければ幸いです。

金属実装の詳細:

ホストコードの要点: https://gist.github.com/lukaszmargielewski/0a3b16d4661dd7d7e00d

カーネル (シェーダー) コード: https://gist.github.com/lukaszmargielewski/6b64d06d2d106d110126

GPU フレーム キャプチャ プロファイリングの結果:

ここに画像の説明を入力

4

2 に答える 2

3

GPU シェーダーもメモリを垂直に移動しますが、CPU は水平に移動します。charTable を読み取るときに、シェーダーのロックステップで実行されている各スレッドによって実際に多かれ少なかれ同時にアクセスされたアドレスを考慮してください。charTable 行列が転置されている場合、GPU はおそらくかなり高速に実行されます。

また、このコードは SIMD 方式で実行されるため、CPU はアーリー アウトを利用できるのに対し、各 GPU スレッドはおそらく検索フレーズ全体の長さまでループを実行する必要があります。アーリー アウトを削除してコードをシンプルに保つと、GPU コードは実際にはもう少し速く実行される可能性があります。検索フレーズの長さと一致の可能性に大きく依存します。

于 2016-06-18T17:01:04.433 に答える