2016-07-12 12 views
3

私は自分のカーネル機能を最適化しようとしており、少し問題がありました。まず、これはRadeon R9(Hawaii)に関連するかもしれませんが、他のGPUデバイスでも同様に起こるはずです。OpenCLクロスコンパイルx64/32ビットポインタGPU


私は2つのプラットフォームオプションがあります。 x86-プログラムとしてコンパイルして実行するか、x64-プログラムとして実行します。私が選んだプラットフォームによって、コンパイルされた別のカーネルが得られます。 1つは32ビットポインタとポインタ演算を使用し、もう1つは64ビットポインタを使用します。生成されたILコードは差を示し、最初のケースでは

prog kernel &__OpenCL_execute_kernel(
    kernarg_u32 %_.global_offset_0, 
    kernarg_u32 %_.global_offset_1, 
    ... 

であり、第二のケースでは:GPU上

prog kernel &__OpenCL_execute_kernel(
    kernarg_u64 %_.global_offset_0, 
    kernarg_u64 %_.global_offset_1, 
    ... 

64ビット演算はかなり高価であり、大量に消費します追加のVGPRの私の場合、64ビットのポインタバージョンでは8つのVGPRが必要で、CodeXLで示されているように、さらに多くのVALUInstsがあります。私のケースでは、パフォーマンスが全体的に37%悪いのは、64ビットの低速カーネルコードと32ビットの高速カーネルコードの間です。内部ポインタ演算以外のものは完全に同一です。私はこれを最適化しようとしましたが、プレーンオフセットでも、ISAコードではV_ADD_I32とV_ADDC_U32の2つの命令を生成する多くのADD_U64 IL命令が残っています。もちろん、すべてのポインタには2つのプライベートメモリ空間が必要です(したがってVGPRが増えます)。


今私の質問です:OpenCLのカーネル-compile「クロス」はそうx64のプログラムは、32ビット・ポインタのカーネルを作成することができますする方法はありますか?私はGPUでそのような多くのメモリに対処する必要はないので、4 GiB未満のメモリ空間のアドレッシングは問題ありません。私のホストは、x64モードでのみ利用可能な32個のzmmレジスタすべてでAVX-512命令を実行しているので、x86プログラムはオプションではありません。それは全体の状況を少し挑戦します。

私の代替手段は、共有メモリを使用してコンパイルゲートとして機能するx86子プロセスを生成することです。しかし、OpenCLの単純なフラグや(AMD固有の)設定がこのトリックを行うならば、私はむしろそれをやりたいと思います。


なぜこのような応答は返さないでください。私は完全にx64プログラムとカーネルがそのように動作する理由を知っています。

+0

好奇心の高まりから、あなたはAVX-512をサポートするホストCPUとして何を使用していますか? –

+0

Intel Xeon Phi 7230(Knights Landing) –

+0

OpenCLカーネル(GPU内部)はまったく同じコードを実行し、ホストの天気は64/32です。 64ビットを使用するだけで37%のパフォーマンスを緩めることはできません。ポインタのサイズについてもデータ型も完全にはっきりしています。あなたは、バッファに緩やかに定義されたデータ型を使用していませんか?したがって、64ビットのケースではそれらを大きくしますか?ちょっと推測すると – DarkZeros

答えて

1

私はいくつかのアイディアを持っていましたが、AMD GPU OpenCL実装の勇気に慣れていないので、私は暗闇の中で刺すようです。

  1. データを渡すことはできますか?インテルGPUでサンプラーを使用すると、別のパスが提供され、64ビットバージョンでも64ビット算術演算を回避できます。

  2. AMDには、読み取りと書き込みをブロックする拡張機能がありますか?これは、コンパイラがアドレスが均一であることを証明する場合に役立ちます(スカラー)。例えば。 Intel Subgroups(ブロックIOを有効にする)のようなものです。インテルでは、これは、分散/ギャザーのためにバス全体にSIMDの価値のあるアドレスを送るのを避けるのに役立ちます(レジスタスペースも節約できます)。

  3. (これはストレッチです)OpenCL 1.2またはそれ以下のコンパイルでコンパイルしますか?つまり、-cl-std=CL1.2と指定しますか?コンパイラがSVMが使用されていないことを知っている場合(> = OpenCL 2。0)、プログラムの保守的な分析を実行してポインタ演算で何かワイルドではないことを証明すると、32ビットで算術演算を実行し、64ビットの相対オフセットを暗黙的にGPUプログラムそれが32ビットアドレスを使用していると思います)。

AMDの詳細は何もわかりませんが、私はこの問題であなたの苦痛を感じます。

+0

返事をありがとう。 1.バッファの代わりに画像を使ってテストを行いました。これはパフォーマンスに重大な影響を与えます。私のカーネルの時間は0.7000μsecから1.1000μsecまでです。私はこれを調べなければなりません、レジスタ圧力はそれほどありません。多分それが解決策の一部です。 2.私が見つけた拡張子やオプションはありません。 3.効果はありません。その他のコンパイラオプション(AMD固有または汎用)は、まったく効果がありません。 私はAMDでサポートリクエストを開始しました。 OpenCLのコンパイルと処理を行うx86プロセスを生成するコンパイラゲートを使用しています。現時点ではかなりうまく動作します。 –

関連する問題