15

クラスメートと私は初めて OpenCL に直面しています。予想通り、いくつかの問題が発生しました。以下に、私たちが抱えていた問題と見つけた答えをまとめました。ただし、すべてが正しいかどうかはわかりませんので、回答とその下の質問の両方をご覧いただければ幸いです。

それを単一の質問に分割しなかったのはなぜですか?

  1. それらは部分的に互いに関連しています。
  2. これらは典型的な初心者の質問だと思います。相談した同級生は皆「それは私も分からなかった」と答えていまし

作業項目と処理要素

私が見たほとんどの 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 つのデバイス (コンテキスト内にある必要があります) にリンクされている、いわゆるコマンド キューにカーネルをエンキューすることしかできません。繰り返しますが、コマンド キューは以前に定義されたコンテキストではなく、単一のデバイスにリンクされています。右?

4

1 に答える 1

8

問1:ほぼ正解。ワークアイテムはカーネルのインスタンスです (標準のセクション 3.2 のパラグラフ 2 を参照)。標準の処理要素の定義も参照してください。

処理要素: 仮想スカラー プロセッサ。作業項目は、1 つまたは複数の処理要素で実行できます。

その質問に対する私が提供した回答も参照してください。

質問 2 & 3:複数のディメンションを使用するか、処理するデータ要素とまったく同じ数の作業項目を使用するかは、問題によって異なります。それはあなた次第であり、開発がどれほど簡単になるかはあなた次第です。また、ocl 1.2 以下には制約があり、グローバル サイズをワーク グループ サイズの倍数にする必要があることにも注意してください (ocl 2.0 で削除されました)。

質問 4:はい、カーネルの実行中の同期は、バリアのおかげでワークグループ内でのみ可能です。パラメータとして渡すフラグの違いは、メモリのタイプを参照します。CLK_LOCAL_MEM_FENCE を使用すると、すべての作業項目は、ローカル メモリに書き込むデータが他の作業項目から見えるようにする必要があります。CLK_GLOBAL_MEM_FENCE の場合も同じですが、グローバル メモリ用です。

質問 5:コンテキスト内で、複数のコマンド キューを持つ複数のデバイスを持つことができます。あなたが述べたように、コマンドキューは1つのデバイスにリンクされていますが、異なるデバイスからの異なるコマンドキューにカーネルをエンキューできます. 2 つのコマンド キューが (同期せずに) 同じメモリ オブジェクトにアクセスしようとすると、未定義の動作が発生することに注意してください。それぞれのジョブが関連していない場合、通常は 2 つ以上のコマンド キューを使用します。

ただし、イベントを介してコマンドキューを同期できます。実際には、独自のイベント (ユーザーイベントと呼ばれます) を作成することもできます。イベントについてはセクション 5.9 を、ユーザーイベントについてはセクション 5.10 (標準の) を参照してください。

少なくとも標準の最初の章 (1 ~ 5) を読むことをお勧めします。お急ぎの場合は、少なくとも実際には用語集である第 2 章を参照してください。

于 2014-01-19T23:38:13.143 に答える