1

カーネルとして実装する必要があるいくつかのサブルーチンを含む比較的複雑な画像処理アルゴリズムを実装するために、OpenCL を学習しています。

実装は、Mali T-6xx GPU で行うことを目的としています。

「OpenCL Programming by Example」の本と「Mali-T600 GPU での OpenCL カーネルの最適化」のドキュメントを読みました。

本の例では、グローバル サイズの作業項目を使用し、各作業項目は for ループで数ピクセルを処理します。

このドキュメントでは、カーネル内の作業項目ごとに 1 回の実行があるため、カーネルはループなしで記述されています。

Mali T-600 GPU でスポーンできるワークアイテムの最大グローバル サイズは 256 (単純なカーネルの場合) であるため、ほとんどの画像で処理するピクセルが明らかに多いため、私の理解では、ループのないカーネルがスポーンします。ワークアイテムのグローバルサイズがカーネルの実行を完了し、グローバルサイズが画像内のピクセルの量になるまで、できるだけ早く追加のワークアイテムスレッドを実行します。そうですか?それ自体が一種のスレッド生成ループであるように?

一方、本の中で。グローバル ワーク サイズは、処理するピクセルの量よりも小さくなりますが、カーネルには、カーネル コードの実行中に各ワーク アイテムを数ピクセル処理させるループがあります。

そのため、画像処理カーネルまたは OpenCL カーネルを記述する適切な方法と、両方の方法を正しく理解していると仮定して、どのような状況で一方の方法が他方よりも優れているかを知りたいです...

4

1 に答える 1

1

そうですか?それ自体が一種のスレッド生成ループであるように?

はい。

そのため、画像処理カーネルまたは OpenCL カーネルを記述する適切な方法と、どのような状況で

一般的に「正しい」答えはないと思います。複数のハードウェア ベンダーと複数のドライバーが存在するため、「最良の」アプローチはベンダーごとに異なると思われます。

特に Mali の場合、スレッドのスポーンはすべてハードウェアによって処理されるため、通常、処理に命令を受け取るシェーダー コードの明示的なループよりも高速です。

Mali-T600/700/800 GPU コアはベクトル演算アーキテクチャを使用するため、通常、少なくとも一部のベクトル化には利点があります。たとえば、ワークアイテムごとにピクセルの vec4 または vec8 ベクトルを 1 つだけではなく処理します。

于 2016-05-08T20:03:43.720 に答える