8

Intel GPU を対象とした OpenCL のオープンソース実装である Beignetの最適化ガイド

ワーク グループ サイズは 16 より大きく、16 の倍数にする必要があります。

Gen で可能な 2 つの SIMD レーンは 8 または 16 です。SIMD レーンを無駄にしないために、このルールに従う必要があります。

Intel Processor Graphics Gen7.5の Compute Architecture にも記載されています。

Gen7.5 ベースの製品の場合、各 EU には合計 28K バイトの汎用レジスタ ファイル (GRF) 用に7 つのスレッドがあります。

...

Gen7.5 コンピューティング アーキテクチャでは、ほとんどの SPMD プログラミング モデルで、このスタイルのコード生成と EU プロセッサの実行が採用されています。事実上、各SPMD カーネル インスタンスは、独自の SIMD レーン内でシリアルかつ独立して実行されているように見えます

実際には、各スレッドは SIMD 幅の数のカーネル インスタンスを同時に実行します。したがって、計算 カーネルの SIMD-16 コンパイルの場合、SIMD-16 x 7 スレッド = 112 個のカーネル インスタンス が単一の EU で同時に実行される可能性があります。同様に、SIMD-32 x 7 スレッドの場合、1 つの EU で同時に実行される 224 個のカーネル インスタンス。

例として使用して正しく理解した場合SIMD-16 x 7 threads = 112 kernel instances、1 つの EU で 224 のスレッドを実行するには、ワーク グループのサイズを 16 にする必要があります。その後、OpenCL コンパイラは 16 のカーネル インスタンスを 16 レーンの SIMD スレッドに折りたたみ、これを行います。 7 つの作業グループで 7 回、単一の EU で実行しますか?

質問 1:ここまでは正しいですか?

ただし、 OpenCL 仕様ではベクトル データ型も提供されます。そのため、従来の SIMD プログラミング (NEON や SSE など) によって、EU の SIMD-16 コンピューティング リソースを最大限に活用することが可能です。

質問 2:この場合、vector-16 データ型を使用すると、すでに SIMD-16 リソースが明示的に使用されているため、ワーク グループごとに少なくとも 16 項目の制限が削除されます。これは事実ですか?

質問 3:上記のすべてが当てはまる場合、2 つアプローチは互いにどのように比較されますか? 2) vector-16 データ型と SIMD-16 演算を明示的に使用するようにコード化された 7 つのネイティブ スレッド?

4

1 に答える 1

1
  1. ほとんど。ワークグループごとに 1 つのスレッドがあると仮定しています (このコンテキストでの NB スレッドは、CUDA が「ウェーブ」と呼ぶものです。Intel GPU では、作業項目は GPU スレッドの SIMD チャネルです)。サブグループがなければ、ワークグループのサイズを正確にスレッドにする方法はありません。たとえば、16 の WG サイズを選択した場合でも、コンパイラは自由に SIMD8 をコンパイルし、それを 2 つの SIMD8 スレッドに分散できます。コンパイラは、WG サイズが認識される前に SIMD 幅を選択することに注意してください ( clCompileProgramprecedes clEnqueueNDRange)。サブグループ拡張により、SIMD 幅を強制できる場合がありますが、GEN7.5 では実装されていません。

  2. OpenCL ベクトル型は、既に自動的に行われている暗黙的なベクトル化に加えて、オプションの明示的なベクトル化ステップです。float16たとえば、あなたは使用しますか。各作業項目はそれぞれ 16 個の float を処理しますが、コンパイラは少なくとも SIMD8 をコンパイルします。したがって、各 GPU スレッドは (8 * 16) float を (並列で) 処理します。それはちょっとやり過ぎかもしれません。理想的には、明示的な OpenCL ベクトル型を使用して CL を明示的にベクトル化する必要はありません。ただし、カーネルが十分な作業を行っていない場合に役立つ場合があります (短すぎるカーネルは問題になる可能性があります)。どこかで、float4 が良い経験則であると書かれています。

  3. 112個のワークアイテムを意味していたと思いますか? ネイティブ スレッドとは、CPU スレッドまたは GPU スレッドのことですか?

    • CPU スレッドを意味する場合は、GPU に関する通常の議論が適用されます。GPU は、プログラムがあまり発散せず (すべてのインスタンスが同様のパスをたどる)、GPU との間でデータを転送するコスト (算術密度) を軽減するのに十分な回数データを使用する場合に適しています。
    • GPU スレッド (GEN SIMD8 または SIMD16 クリッター) を意味する場合。現時点では、GPU スレッドを明示的にプログラムする (公開されている) 方法はありません (サブグループ拡張を参照してください( GEN7.5では使用できません))。できれば、アセンブリ言語と同様のトレードオフになります。仕事はより難しく、コンパイラーは私たちができるよりも良い仕事をすることもありますが、特定の問題を解決していて、ドメインの知識が豊富な場合は、通常、十分なプログラミング努力でより良い仕事をすることができます (ハードウェアが変更され、賢いプログラムの仮定が変わるまで)無効になります。)
于 2015-10-31T23:07:39.520 に答える