クラスメートと私は初めて OpenCL に直面しています。予想通り、いくつかの問題が発生しました。以下に、私たちが抱えていた問題と見つけた答えをまとめました。ただし、すべてが正しいかどうかはわかりませんので、回答とその下の質問の両方をご覧いただければ幸いです。
それを単一の質問に分割しなかったのはなぜですか?
- それらは部分的に互いに関連しています。
- これらは典型的な初心者の質問だと思います。相談した同級生は皆「それは私も分からなかった」と答えていました。
作業項目と処理要素
私が見たほとんどの OpenCL に関する講義では、同じ図を使用して、コンピューティング ユニットと処理要素、およびワーク グループとワーク アイテムを紹介しています。これにより、クラスメートと私はこれらの概念を絶えず混乱させてきました。したがって、処理要素が作業項目とは大きく異なるという事実を強調する定義を思いつきました。
- ワークアイテムは実行中のカーネルですが、処理要素は実際に計算を行うものを表す抽象モデルです。ワークアイテムはソフトウェアに一時的に存在するものですが、処理要素はハードウェアに物理的に存在するものを抽象化します。ただし、ハードウェアによっては、したがって OpenCL の実装によっては、作業項目が、いわゆるプロセッシング エレメントによって表されるハードウェアの一部にマップされ、実行される場合があります。
質問 1:これは正しいですか? これを表現するより良い方法はありますか?
NDRange
NDRangeの概念を次のように認識します。
- そこにある作業項目の量は、NDRange サイズで表されています。一般に、これはグローバル サイズとも呼ばれます。ただし、NDRange は、1 次元、2 次元、または 3 次元 ("ND") のいずれかになります。
- 1次元の問題は、線形ベクトルの計算になります。ベクトルのサイズが 64 で、そのベクトルを処理する作業項目が 64 ある場合、NDRange のサイズは 64 になります。
- 2 次元の問題は、画像に対する何らかの計算になります。1024x768 の画像の場合、NDRange のサイズ Gx は 1024 になり、NDRange のサイズ Gy は 768 になります。これは、その画像の各ピクセルを処理するために 1024x768 の作業項目があることを前提としています。NDRange のサイズは 1024x768 になります。
- 3 次元の例は、3D モデルなどの計算です。さらに、NDRange サイズ Gz があります。
質問 2:もう一度言いますが、これは正しいですか?
質問 3:これらの寸法は、便宜上のものですよね? 画像の各ピクセルのカラー値を、サイズ の線形ベクトルに格納するだけですwidth * height。同じことが、3D の問題にも当てはまります。
様々
質問 4:カーネル (つまり、作業項目) の実行は、Understood を使用して作業グループ内で同期できると言われていましたbarrier(CLK_LOCAL_MEM_FENCE);。また、ワーク グループを同期できないと (繰り返し) 言われていました。大丈夫。しかし、その後、の使用はbarrier(CLK_GLOBAL_MEM_FENCE);何ですか?
質問 5:ホスト プログラムでは、利用可能なプラットフォームの1つからの 1 つまたは複数のデバイスで構成されるコンテキストを指定します。ただし、正確に1 つのデバイス (コンテキスト内にある必要があります) にリンクされている、いわゆるコマンド キューにカーネルをエンキューすることしかできません。繰り返しますが、コマンド キューは以前に定義されたコンテキストではなく、単一のデバイスにリンクされています。右?