-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[matsumiya] メモ #10
Comments
通信周りについて読んでみる |
ncclAllReduce()辺りは行数がかなり短い。 |
|
|
Channelという概念を使っている。リングバッファを使っていると思っていたが違うようだ。
この辺りの構造体や関数がかなり重要そうだが、よくわからない。
proxyはchannelを持っていて、ChannelがCollを持っているようだ。 |
computeColl()を読んでたら、Chunk辺りの概念が出始めてきた。 |
Chunk辺りについてはy1r先生が読んでた |
llModeとtreeModeというのに依存してchunkの大きさが決まるらしい。
色々ツッコミどころのありそうなコードだ…… |
LL is 何…… |
enumに順序関係を持たせるのはアンチパターンだと思っているのだが、それは一旦おいておく。 |
treeModeのときはチャンクの大きさを小さくしているようだ。lastChunkSizeに入るのは要素数?
スライス数を変更せずにproxyArgsに入れているのはsliceとchunkの違いを知る手がかりになりそう。 |
ツリー型の通信とリング型の通信ではProxyを生成し、パイプライン式では条件次第のようだ。 |
バッファにProxyArgsを打ち込んで終了する。 |
このバッファはpersistentThreadといういかにもな別スレッドよう関数で読み込まれている。 |
この行で通信しているのでしょう |
通信の実態はncclTransportCommのproxyであって、それは通信相手による(ネットワーク経由なのか、shmなのか、p2pなのか)。 |
つまるところ、Proxyとは「あらゆる通信方法(経路や送受信)に対応するインターフェース」であると。 |
p2pやshmだとsliceやchunkの概念が登場しない。
IDEで調べた限りでは、ncclProxyOpProgressが使われているのはここだけ。 |
LLModeでは特殊なバッファから送っているようだ |
循環バッファの1単位がstepっぽい。 |
netSendConnect()の後半
ここでピンダウンしている。devHostRecvMemを使っているということは、もしかしてGDRを使わなかった時用のメモリ領域? |
LLというのは、GPUとの通信的な意味でのLow-Latencyということっぽい。 |
Linked-Listなのにstd::listとかを使っていない理由はこういう事情っぽい。 |
LLを使いそうな何かを一式見つけたけど、今は使われていないっぽい……? |
Proxyは他rankとの通信で使われる構造で、ChannelはGPUとのやりとりで使われる構造。 |
reduceのコードだが、ブロック毎にアクセスパターンが変わるように見える |
GPUメモリ側のバッファ領域と、それ以外の領域からのコピーのためにChannelが使われているということは分かった。どういう方法でコピーしているのか(どのスレッドがどの部分をコピーしているのか)がよく分からない…… |
AllReduceのカーネルを読むと、Chunkは1スレッドブロックあたりが担当するコピーサイズっぽい?
コピーを行うメインの関数は
だが、色々工夫しすぎていてぱっと見ただけでは細かくはわからない。
|
Proxyとは: あらゆる通信方法(経路や送受信)に対応するインターフェース |
プリミティブはprimitive.hにて一通り定義。
|
テンプレート引数は1と0のみが引き渡されている。Booleanのようだ。 |
Booleanとしてだけでなく、計算にも使っている。
recvPtr等はバッファのポインタを返す関数
NSEND/NRECVはクラステンプレート引数 |
postSend/waitSend、postRecv/postSendはそれぞれ対応している。
|
クラステンプレート引数やインスタンス変数が多すぎて色々と分からない。 |
プリミティブのコンストラクタ
|
プリミティブはこんな感じで、集約通信系のカーネルの最初の方で初期化されている
プリミティブのテンプレート引数はこんなかんじ
IDEによれば、FUNCはunusedなようだが……? |
↑のソースコードの対応やカーネルの中身から、Tはコピーするデータの型であることはわかる。 |
各カーネルを呼び出すグローバル関数はcommon.hのマクロで定義されている
|
Asyncの場合、関数呼び出しがされているのはncclBarrierEnqueWait() <- ncclGroupEnd() |
つまり、ncclGroupEnd()が呼び出されることによって、はじめてGPU内メモリコピーが行われる |
ncclGroupEnd()内のコメント
|
ncclBarrierEnque()でもグローバル関数呼び出しが発生する
|
ncclBarrierEnqueueWait()の中で通信待ち系のスレッドがresumeされる。
|
Async環境において、ncclAllReduce()等では通信は一切発生しない。saveKernel()で通信キューにenqueされるだけ。 ncclGroupEnd()にてGPU側のコピー処理が走り、それらが全部完了するとp2pやshm、IBを使った通信が発生する。 |
GPU内の集約しょりについて調査中……
FuncSumはどこで定義されているんだろう。 |
reduce_kernel.hに普通に定義されていた…… |
GPUメモリコピー(or Reduce)はこんな感じか?
|
No description provided.
The text was updated successfully, but these errors were encountered: