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 フレーム キャプチャ プロファイリングの結果: