本当は怖いHPC

HPC屋の外部記憶装置。メモ書き。ちゃんとしたものは別のところに書く予定です

UCXを試すメモ(3)

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でどの程度の情報を返してくれるのかは興味があります。