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 つのネイティブ スレッド?