プログラミング
並列プログラミングの禅:カーネルの姿勢
The Zen of Parallel Programming: The Posture of a Kernel (smolnero.com)
要約
この記事は、GPUカーネルの並列プログラミングにおける「姿勢」について論じています。AMDのGPUアーキテクチャを例に、HipKittens論文で紹介された8-waveピンポン・スケジューリングを紹介し、計算とメモリ移動を交互に行うことで効率を高める手法を解説します。これは、禅の教えにある「独立と依存」の関係性や、過去の経験が現在の行動に与える影響にも通じるものとして考察されています。
全文翻訳
並列プログラミングの旅を続ける中で、私の注意はGPUカーネルへと移ります。そして、HipKittens: Fast and Furious AMD Kernels という論文から始めるのが最良でしょう。GPUカーネルとは、GPU上で何度も起動される特殊な関数です。各呼び出しは、それぞれ固有の位置とデータの一部を受け取りながら、同じ一般的な操作に従います。カーネル自体は単純に見えるかもしれませんが、その実行はスレッド、ウェーブフロント、スレッドブロック、タイル、レジスタ、メモリ、そしてそれらすべての活動をまとめるアーキテクチャを通じて展開されます。論文で研究されたAMDのハードウェアでは、スレッドは64スレッドのウェーブにグループ化され、複数のウェーブがGPUのコンピュートユニット上のスレッドブロック内で一緒にスケジューリングされます。厳しい真実は、それが表現するスレッド、変換対象となるデータ、そしてその変換が物理的にどのように行われるかを決定するハードウェアに依存するということです。同じタイルベースの抽象化がNVIDIAからAMDに移行しても、HipKittensは、その抽象化を表現するために使用されるアルゴリズムはAMDのアーキテクチャに合わせて再設計する必要があることを発見しました。抽象化は移動できますが、受け入れる条件に触れずにいることはできません。この論文の中心的な貢献の一つは、計算とメモリ移動をオーバーラップさせるために設計された8-waveピンポン・スケジューリングです。8つのウェーブがスレッドブロック内に配置され、4つのSIMDユニットそれぞれに2つのウェーブが常駐します。各ペア内で、一方のウェーブが行列計算を実行し、もう一方が次のステージに必要なデータをプリフェッチします。その後、役割を交換し、どちらかのアイデンティティに permanently attached されるのではなく、計算とメモリの間を行き来します。
これは私を『禅心、初心者心』の「姿勢」の章に立ち返らせました。鈴木宗শিল্পは私たちを独立とも依存とも、「二つでもなく、一つでもない」と描写しています。ペアになったウェーブは区別されたままです。一方は計算を実行し、もう一方はメモリを移動しており、それぞれが一時的な責任を負っています。しかし、どちらの役割も単独では完全な活動を説明できません。計算ウェーブはデータの到着に依存し、メモリウェーブは後続の計算を通じてその価値が可視化される作業を実行します。私が最も興味を引かれるのは、どちらのウェーブもその役割に permanently attached されないということです。一方が準備し、もう一方が行動し、そしてそれらは位置を交換します。それらの責任は現実ですが、一時的です。より大きな活動は、各ウェーブがタスクを実行することに依存するだけでなく、関係性が異なるものを要求するときに、各ウェーブがそのタスクを解放できることにも依存します。おそらく、姿勢とは、私たちが占める位置だけでなく、その位置が変化する間に維持する関係性なのでしょう。
これは『並列プログラミング入門』のより一般的な教訓に私を立ち返らせます。並列活動には、別々の作業が同時に行われるのに十分な独立性が必要ですが、それらの別々の行動が1つの計算の一部であり続けるのに十分な依存性も必要です。完全な独立性は、決して全体にならない孤立した作業を残すでしょう。もう一方の極端では、すべての参加者が進歩する前にすべての他の参加者に依存する場合、並列移動は待機に崩壊します。人間は同じ緊張感の中で生きているのかもしれません。
私たちは、それを完全に理解する前に状況に遭遇します。私たちは記憶を運び、家族のパターン、期待、恐れ、そして時には依存症やうつ病への潜在的な素因を相続します。元の条件が過ぎ去った後も、体と心が特定の姿勢を保つように教える出来事を経験することもできます。これらの経験は現実であり、過去に属するからといってその影響を単純に無視すべきではありません。かつて私たちを守ってくれた役割が、後に私たちの移動を妨げる可能性があります。かつて生き残るのに役立った見方は、最終的にすべての新しい状況をそれを生み出した状況に似ているように見せるかもしれません。システムが一つの方法で行動することを学んだからといって、それが常に同じ姿勢で実行されなければならないと信じ始めるかもしれません。人間はGPUカーネルではなく、トラウマは命令スケジューリングに還元することはできません。私が興味を引かれるのは、ある条件の下で学んだ姿勢が、それらの条件が変わったときに利用可能な唯一の姿勢ではないかもしれないという可能性です。
HipKittensは、抽象化の目的が認識可能であっても、それが異なる条件に入るときにその表現が変わる必要があるかもしれないことを私に思い出させます。答えは、新しいアーキテクチャが古いものと同一であると偽ることではありません。また、それ以前のすべてを捨て去ることでもありません。仕事は、何が移動できるか、何が再編成される必要があるか、そして現在の実行に何がもはや属さないかを理解することです。おそらく、内面を見ることは、もはや存在しない条件の下で形成された命令をまだ実行している私たちの一部を認識しようとする試みの一部なのでしょう。それは、私たちの前の人生や経験を消去するためではなく、それらの影響が私たちに利用可能な唯一の姿勢であり続けなければならないわけではないようにするためです。過去はシステムのままであり続けますが、それが常にそのスケジューラであり続けなければならないわけではありません。