私は自分のカーネル機能を最適化しようとしており、少し問題がありました。まず、これは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プログラムとカーネルがそのように動作する理由を知っています。
好奇心の高まりから、あなたはAVX-512をサポートするホストCPUとして何を使用していますか? –
Intel Xeon Phi 7230(Knights Landing) –
OpenCLカーネル(GPU内部)はまったく同じコードを実行し、ホストの天気は64/32です。 64ビットを使用するだけで37%のパフォーマンスを緩めることはできません。ポインタのサイズについてもデータ型も完全にはっきりしています。あなたは、バッファに緩やかに定義されたデータ型を使用していませんか?したがって、64ビットのケースではそれらを大きくしますか?ちょっと推測すると – DarkZeros