本当は怖いHPC

HPC屋の趣味&実益ブログ

UCXを試すメモ(2)

test/examples/uct_hello_world.c を参考にして、まずは Memory Domain, Device, Transport Layer の一覧を取得するコードを書いてみます。

https://gist.github.com/keisukefukuda/bfa28464b10d36ae2321b22db73f7b38

通信のためのデバイス/ハードウェアは、上記の3つの階層によって抽象化されています。Memory domain(MD)は、Memoryと名前はついていますが、通信のためのハードウェアリソースを抽象化したもの。ちょっとイマイチ具体的なイメージがわかない。TransportLayer(TL)は、MDの中でサポートされている通信モデル(?)を表し、それにDeviceもセットで付いてきます。基本的には、TLはデバイス依存です。Infinibandの場合はRCUD に対応するrcudが出力されています。

とりあえず、このコードでは、一覧取得までを書き、次に uct_md_attr を使った属性の取得は次回。

コンパイル&実行例(IBが接続されているマシン上で実行):

$ g++ -std=c++11 -g -o ucx_dev_query ucx_dev_query.cpp -Wall -Wextra -Werror -I${UCX}/install/include -L${UCX}/install/lib -pedantic  -lucs -luct -Wl,-rpath,${UCX}/install/lib

$ ./ucx_dev_query mlx4_0:1 rc
Resources:
    self
        self/self
    tcp
        ib0/tcp
        eth0/tcp
        eth1/tcp
    ib/mlx4_0
        mlx4_0:1/rc
        mlx4_0:1/ud
    cuda_cpy
        cudacopy0/cuda_copy
    sysv
        sysv/mm
    posix
        posix/mm
    cma
        cma/cma
Using rc/mlx4_0:1

UCXを試すメモ(1)

最近、ネットワークライブラリのUCXを試しています。

GitHub - openucx/ucx: Unified Communication X (mailing list - https://elist.ornl.gov/mailman/listinfo/ucx-group):

ドキュメントを生成

まずはドキュメントをビルドするために、手元のMacにリポジトリを落としてみます。

$  brew install autoreconf automake doxygen graphviz
# これ以外にpdflatexが必要

$ git clone https://github.com/openucx/ucx.git
$ cd ucx
$ ./autogen.sh
$ ./configure --with-docs-only
$ make docs

で、いくつかLatex関係のエラーが出るが、ひとまず全て q を入力して強引に通過。 doc/doxygen-doc/ucx.pdf にドキュメントのPDFが出力されている。ここまでに既に1時間くらい使ってしまった…

UCXの全体像

UCXは、乱立していた高速インターコネクトの抽象化ライブラリを統合する目的で開始されたプロジェクトです。 ハードウェア(と、そのネイティブAPI)と、構築される特定のプログラミングモデルのライブラリの中間を埋めるライブラリです。

ハードウェアとしては、Openfabricsベース製品(Infiniband、RoCE、iWARP)、Cray GEMINI、Intel Omni-Path(旧Qlogic)などがあります。一方で、特定のプログラミングモデルを提供するライブラリとしてはMPI、OpenSHMEM、GASNETなどがあります。

UCXは、これらの中間を埋める統一ライブラリとして作られています。

ライブラリは、3つのコンポーネントからなっています。

UCS

UCSは、Service layer と呼ばれ、UCXライブラリ全般に渡って使われるユーティリティを提供します。

  • Atomic操作
  • スレッド関連
  • メモリ管理
  • データ構造

UCT

UCT は、transport layer で、通信層を抽象化するコンポーネントです。メモリ間のデータの転送が抽象化され、メモリには、アクセラレーター(GPU)のメモリも含まれます。

UCP

UCP は、上位の高レベルライブラリによって使われるであろう機能を提供するコンポーネントです。

  • 初期化
  • AMO (Atomic memory operation)
  • Tag Matching(通信のタグ付け)
  • Stream
  • Active Message(メッセージの到着と共にコールバックが起動されるようなもの)
  • Collective(集団通信)

HPC向け高速通信ネットワークのAPI/ライブラリのメモ。

メモ

(この文章では、「ライブラリ」と「フレームワーク」は特に区別していません。)

スパコンを始めとするHPC環境では、インターコネクトとしてInfinibandやOmniPath、50G/100G Ethernetなどの高速ネットワークが利用されています。多くの場合、これらの環境上ではMPIを始めとする標準ライブラリが使用されるため、その下のAPIに注意を向けることは殆どありません。しかし、以下の様な場合は低レベルAPIや薄いラッパーライブラリを直接使うことを考える必要があります。

  • MPIでは不十分だったり目的に適さない場合
  • 性能を極限まで引き出したい場合
  • あるいは単に好奇心から勉強したい場合

以下が、高速インターコネクトハードウェアと、そのネイティブAPIの一覧です。

インターコネクト メーカー ネイティブAPI
Infiniband 標準 ib verbs
RoCE 標準 verbs
iWarp 標準 verbs
Tofu Fujitsu
Omni-Path Intel PSM2
GNI Cray GNI API
IBM Torus Network IBM PAMI

さらに、MPIやOpenSHMEMなどの高レベルライブラリと、上記の低レベルAPIの間には さらにラッパーライブラリが存在します。

ライブラリの一例

  • libfabric
    • verbs API群の置き換えを狙って開発されているフレームワーク。レイヤーとしては上記のネイティブAPIに近いかも
  • GASNET
    • PGAS言語への適用を念頭に置いたライブラリ。
  • UCX
    • いろいろ乱立しているネイティブAPIを低いオーバーヘッドで共通化することを狙っているフレームワーク。Open MPI、OpenSHMEM等での採用をスタート地点として開発されているらしい。個人的にはこれが有望っぽい。

ここらへん、ドキュメントが少なくて一握りの人間にしか使えないAPIが多くて、抽象度や依存関係の間隔が非常にわかりにくいですね。

【広告】