构建 debug 版本的 openmpi with ucx; ucx with-CUDA

0,文件结构

./repo$ ls
build_openmpi.sh  build_ucx.sh

autoreconf: not found

sudo apt-get update
sudo apt-get install autoconf

sudo apt install libtool

sudo apt install valgrind valgrind-mpi  valgrind-dbg

1, DEBUG UCX

build_ucx.sh

git clone https://github.com/openucx/ucx.git
cd ucx
git checkout   v1.16.0
./autogen.sh
./autogen.sh
mkdir build
cd build
#../contrib/configure-opt --prefix=${PWD}/../../local_ucx  --without-knem --with-cuda=/usr/local/cuda  --without-java --witchout-rocm
#../contrib/configure-devel --prefix=${PWD}/../../local_ucx  --without-knem --with-cuda=/usr/local/cuda  --without-java --without-rocm
../contrib/configure-devel --prefix=${PWD}/../../local_ucx  --enable-debug   --enable-gtest  --enable-examples  --without-knem --with-cuda=/usr/local/cuda  --without-java --without-rocm
make -j
make install

--enable-debug

2,DEBUG OPENMPI

build_openmpi.sh 

git clone --recursive https://github.com/open-mpi/ompi.git
cd ompi
git checkout  v5.0.3
./autogen.pl
mkdir build  &&  cd build
../configure  --prefix=${PWD}/../../local_ompi --enable-debug --with-tests-examples --with-ucx=${PWD}/../../local_ucx  --without-verbs
make -j
//## 可能会出错

make install

make -j

##出错后,注释掉出错行,替换成为如下内容:


ompi/3rd-party/openpmix/test/util/convert.c 的出错行 line 50:
    //LL::asprintf(&tmp, "%s.v1", argv[1]);

size_t len = strlen(argv[1]) + 4; // 计算所需的长度(argv[1]的长度 + ".v1"的长度 + 1个结束符)
tmp = (char *)malloc(len); // 分配内存
if (tmp == NULL) {
    // 处理内存分配失败的情况
    perror("Failed to allocate memory");
    exit(EXIT_FAILURE);
}
snprintf(tmp, len, "%s.v1", argv[1]); // 格式化字符串

3,asprintf 解释

asprintf 是一个 C 语言函数,用于动态分配内存并格式化字符串。它的功能类似于 sprintf,但与 sprintf 不同的是,asprintf 会自动为生成的字符串分配足够的内存,并将指针返回给调用者。以下是对这行代码的详细解释和替代方法。
功能解释
;
&tmp: 这是一个指向字符指针的指针,asprintf 会在内部分配内存并将指向新字符串的指针存储在 tmp 中。
"%s.v1": 这是格式字符串,表示将 argv[1] 的内容与 .v1 连接在一起。
argv[1]: 这是一个字符串,通常是命令行参数中的第二个参数。
结果: 这行代码的作用是将 argv[1] 的内容与 .v1 连接起来,生成一个新的字符串,并将其指针存储在 tmp 中。


解释替代方法
1. 计算长度: 使用 strlen(argv[1]) 计算 argv[1] 的长度,并加上 .v1 的长度(4,包括结束符)。
内存分配: 使用 malloc 分配足够的内存来存储新字符串。
3. 格式化字符串: 使用 snprintf 将格式化的字符串写入 tmp 中。
错误处理: 检查 malloc 是否成功分配内存。
注意事项
使用 malloc 分配的内存需要在不再使用时通过 free(tmp) 释放,以避免内存泄漏。
asprintf 是 GNU 扩展,可能在某些平台上不可用,因此使用 snprintf 和 malloc 是更具可移植性的选择。

4,ucx 单测

git clone https://github.com/openucx/ucx.git && \
cd ucx && \
git checkout   v1.16.0 && \
./autogen.sh && \
./autogen.sh && \
mkdir build && \
cd build
../contrib/configure-devel --prefix=${PWD}/../../local_ucx   --enable-gtest  --enable-examples  --without-knem --with-cuda=/usr/local/cuda  --without-java --without-rocm
make -j
make install
make -C test/gtest test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值