12

アラインメント要件が満たされていることを確認する方法を理解するために、OpenCL p.no:157を使用したヘテロジニアスコンピューティングの本から次の文章を数回読みました。これは、画像の畳み込みの問題にパディングを配置する方法を示しています(16 x 16のワークグループサイズを想定)。

メモリアクセスの調整

NVIDIAとAMDGPUの両方でのパフォーマンスは、グローバルメモリでのデータアライメントの恩恵を受けます。特にNVIDIAの場合、128バイト境界でのアクセスの調整と128バイトセグメントへのアクセスは、メモリハードウェアに理想的にマッピングされます。ただし、この例では、16ワイドワークグループは64バイトセグメントにのみアクセスするため、データを調整する必要があります。 64バイトのアドレスに。これは、各ワークグループがアクセスする最初の列は、64バイトに整列されたアドレスで始まる必要があることを意味します。この例では、境界ピクセルに値を生成しないという選択により、すべてのワークグループのオフセットがワークグループの寸法の倍数になることが決まります(つまり、16 x 16ワークグループの場合、ワークグループは列N * 16でデータへのアクセスを開始します)。 。各ワークグループが適切に調整されるようにするには、

1-各ワークグループがアクセスする最初の列をパディングした後、64バイトに整列されたアドレスでどのように開始するかを理解するのに誰かが助けてくれますか(上記の文章で述べた要件ですよね?)?

2-また、図は正しいステートメントです。16x 16ワークグループの場合、ワークグループは列N*16でデータへのアクセスを開始します。

正しければ、図に示されているワークグループ1,2は、図に示されているものとは逆に、列1x16でデータへのアクセスを開始する必要があります。私は完全に混乱しています!:(

更新: Q-2は私には明らかです。 実際、図に示されているワークグループは2,1(openclの規則では、列が最初)なので、完全に正しいです。私が考えていた1x16ではなく2x16=32です。

しかし、質問はありません。1はまだ答えられていません。

ここに画像の説明を入力してください

4

1 に答える 1

8

畳み込みカーネルの場合、各領域(たとえば、領域(0,1)または領域(2,1)など)には、その周囲のデータの「ハロー」も含まれている必要があります。領域のエッジには、そのデータポイントでの畳み込みを計算するための、そのデータ要素の適切なネイバーのセットがあります。これは、左上隅にデータ要素(0,0)がある領域(0,0)の場合、畳み込みを計算するために要素(-1、0)、(-2、0)などが必要であることを意味します。要素(0,0)で。

ここで、画像を通常どおりに保存して、要素(0,0)がメモリ位置0(または他の64バイトに整列されたアドレス)にある場合、畳み込みのためにそのポイントより前の要素にアクセスすると、次のようになります。 64バイトの整列領域外のデータにアクセスします。したがって、画像の左端の列に追加のデータ要素を「左側」に「埋める」ことができます。つまり、以前のアドレスで、畳み込みカーネルがすべて64バイトの整列領域内にある値を取得します。 64バイトの境界にまたがっています。画像ストレージをメモリ位置0で開始するのではなく、ハローストレージをメモリ位置0で開始し、最初の画像データ要素は位置0+ハロー幅で開始します。このパディングは、他の領域のハロー境界を揃える効果もあります。

ここで、画像の幅が2の累乗ではないと仮定します(たとえば、HD画像の場合は1920ピクセル幅)。画像の右側(つまり、ピクセル行の終わり)にハロー幅をパディングとして含めるだけで、その直後に次のピクセル行のハロー領域を開始すると、次のようになります。また、次のピクセル行(ハローを含む)から始まる適切に位置合わせされた領域を持つ可能性は低いです。したがって、各行の最後に追加のパディングを配置して(畳み込み操作の影響を受けず、スペースが無駄になるだけです)、次のピクセル行のハロー領域を開始するときに、適切に配置されたアドレスから開始します。

この議論と方法(そして質問だと思います)は、実際には、各ワークグループのデータアクセスの開始アドレスが一致していることを確認することにのみ焦点を当てています。最初のワークグループの開始アドレスが(適切なパディングとメモリ内の画像ストレージの調整によって)整列され、ワー​​クグループが適切なサイズ(たとえば、幅16、ワーカーあたり4バイト)である限り、次のワークグループも調整されます。もちろん、隣接するワークグループのハロー領域が重複しているため、隣接するワークグループのデータアクセス間には重複があります。

ここで使用しているアライメントの定義はかなり単純です。アドレスの最下位nビットがすべてゼロの場合、メモリ内のアドレスは2**nバイト整列されます。したがって、64バイトで整列された領域には、6つの最下位ビットがすべてゼロの開始アドレスがあります。これは一般に、これらのアーキテクチャで、アーキテクチャ、特にそれらに含まれるDRAMサブシステムのメモリ負荷とストアの要件を満たすのに役立ちます。最新のDRAMメモリバンクアクセスは常に複数のバイトを返すため、コード内の同じ場所でこれらすべてのバイトを同時に使用する場合は、転送を最大限に活用できます。アラインメントとそれがデータアクセスの合体と改善に与える影響についての追加の報道については、このウェビナーに興味があるかもしれません(およびスライドnvidiaウェビナーページから。簡単に説明すると、このプレゼンテーションのスライド26〜33で基本的なアイデアを説明しています。

于 2012-11-01T05:09:07.183 に答える