UCX stands for Unified Communication X. UCX provides an optimized communication
layer for Message Passing (MPI), PGAS/OpenSHMEM libraries and RPC/data-centric
applications. UCX utilizes high-speed networks, such as RDMA (InfiniBand, RoCE,
etc), Cray Gemini or Aries, for inter-node communication. If no such network is
available, TCP is used instead. UCX supports efficient transfer of data in
either main memory (RAM) or GPU memory (through CUDA and ROCm libraries).
In addition, UCX provides efficient intra-node communication, by leveraging the
following shared memory mechanisms: posix, sysv, cma, knem, and xpmem.

### Running internal unit tests
```sh
$ ./autogen.sh
$ ./contrib/configure-devel
$ make
$ make -C test/gtest test
```

### Running UCX hello-world
Compile:

```sh
$ ./autogen.sh  
$ ./contrib/configure-release --prefix=$PWD/install
$ make
```
Start server:

```sh
$ ./src/tools/perf/ucx_perftest -c 0
```

Connect client:

```sh
$ ./src/tools/perf/ucx_perftest <server-hostname> -t tag_lat -c 0
```

### UCX high-level layout
UCX contains four main components:
- UCP - UCX Protocol. Implements high-level abstractions such as tag-matching,
  streams, connection negotiation and establishment, multi-rail, and handling 
  different memory types.
- UCT - UCX Transport. Implements low-level communication primitives such as
  active messages, remote memory access, and atomic operations.
- UCS - UCX Services. A collection of data structures, algorithms, and system
  utilities for common use.
- UCM - UCX Memory. Intercepts memory allocation and release events, used by
  memory registration cache.
