アラインメント要件が満たされていることを確認する方法を理解するために、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はまだ答えられていません。