uct_md_query()
関数を使って、Memory DomainのAttributesを取ってみました。
https://gist.github.com/keisukefukuda/cf55bf8aaf9f343f529c25ff46487ce0
Resources: self component name: self max alloc: 0 (0[GiB]) max reg: 18446744073709551615 (17179869184[GiB]) rkey packed size: 8 Devices: self/self tcp component name: tcp max alloc: 0 (0[GiB]) max reg: 0 (0[GiB]) rkey packed size: 8 Devices: ib0/tcp eth0/tcp eth1/tcp ib/mlx4_0 component name: ib max alloc: 18446744073709551615 (17179869184[GiB]) max reg: 18446744073709551615 (17179869184[GiB]) rkey packed size: 16 Devices: mlx4_0:1/rc mlx4_0:1/ud cuda_cpy component name: cuda_cpy max alloc: 0 (0[GiB]) max reg: 18446744073709551615 (17179869184[GiB]) rkey packed size: 8 Devices: cudacopy0/cuda_copy sysv component name: sysv max alloc: 18446744073709551615 (17179869184[GiB]) max reg: 0 (0[GiB]) rkey packed size: 32 Devices: sysv/mm posix component name: posix max alloc: 18446744073709551615 (17179869184[GiB]) max reg: 0 (0[GiB]) rkey packed size: 37 Devices: posix/mm cma component name: cma max alloc: 0 (0[GiB]) max reg: 18446744073709551615 (17179869184[GiB]) rkey packed size: 8 Devices: cma/cma Using rc/mlx4_0:1
max_alloc
とか、 max_reg
の2つは今のところ意味のある値は出ていないっぽいですね(なお、18446744073709551615
というのはUINT64_MAX
です)。
rkey packed size
というのは、まだ意味がよくわかりません。
上で出力していない値に、
* uct_linear_growth_t reg_cost
* cpu_set_t local_cpus
というフィールドが2つあります。これもちょっとおもしろそうではありますが、正しい値が出るかどうかは次回のお楽しみ。
reg_cost
というのは、メモリ領域のRegistrationにかかるコストだと思われます。高速通信、特にRDMAを実現するためには、メモリ領域がディスクにスワップされては困りますし、ネットワークデバイスがメモリに直接書き込む際に物理アドレスを知っている必要があります。そこで、LinuxではPage Locked Memory(CUDAでいうPinned Memory)という機能を使って、特定のメモリ領域がSwap Outされないようにするわけですね。その操作をRegistrationと呼びます。
次に、local_cpus
というのは、デバイスとCPUのトポロジのことを言っていると思われます。ネットワークデバイスから見てどのCPU(あるいはNUMAノード)が一番近いかというのは重要で、下手をするとQPIなどを通って通信するハメになるので、どのCPU(正確にはメモリ)を送信/受信バッファにするかというのは慎重に決める必要があります。この情報は hwloc
などのライブラリを使っても知ることが出来ますが、UCXでどの程度の情報を返してくれるのかは興味があります。