编译运行
介绍目录结构
样例代码目录结构如下所示:
1 2 3 4 5 6 | CommInitRootInfoConfig ├── bin │ └── CommInitTest ├── Makefile └── src └── main.cc |
- Makefile文件内容可参见配置Makefile文件。
- main.cc的样例代码可参见样例代码。
- bin目录下的CommInitTest为编译后生成的可执行文件。
配置环境变量
配置样例编译时依赖的环境变量:
1 2 3 | source /usr/local/Ascend/ascend-toolkit/set_env.sh export PATH=/usr/local/mpich-3.2.1/bin:$PATH export LD_LIBRARY_PATH=/usr/local/mpich-3.2.1/lib:$LD_LIBRARY_PATH |
- “/usr/local/Ascend”为CANN软件root用户的默认安装路径,如果使用普通用户安装,或指定路径安装,请自行替换。
- “/usr/local/mpich-3.2.1/lib”为安装后MPI的库文件所在路径,请根据实际情况替换。
配置Makefile文件
Makefile文件示例如下,请根据实际情况替换源文件及其所在路径。
# #loading path #-------------------------------------------------------------------------------------------------------------------------------------------------- CXXFLAGS := -std=c++11\ -Werror\ -fstack-protector-strong\ -fPIE -pie\ -O2\ -s\ -Wl,-z,relro\ -Wl,-z,now\ -Wl,-z,noexecstack\ -Wl,--copy-dt-needed-entries #path of the source file Common_DIR = ./src #source file Common_SRC = $(wildcard ${Common_DIR}/*.cc) HCCL_INC_DIR = ${ASCEND_DIR}/include HCCL_LIB_DIR = ${ASCEND_DIR}/lib64 ACL_INC_DIR = ${ASCEND_DIR}/include ACL_LIB_DIR = ${ASCEND_DIR}/lib64 MPI_INC_DIR = ${MPI_HOME}/include MPI_LIB_DIR = ${MPI_HOME}/lib LIST = CommInitTest # #library flags #-------------------------------------------------------------------------------------------------------------------------------------------------- LIBS = -L$(HCCL_LIB_DIR) -lhccl\ -L$(ACL_LIB_DIR) -lascendcl\ -L$(MPI_LIB_DIR) -lmpi INCLUDEDIRS = -I$(HCCL_INC_DIR)\ -I$(ACL_INC_DIR)\ -I$(MPI_INC_DIR)\ -I$(Common_DIR) # #make #-------------------------------------------------------------------------------------------------------------------------------------------------- all: @mkdir -p bin g++ $(CXXFLAGS) $(Common_SRC) $(INCLUDEDIRS) -o CommInitTest $(LIBS) @printf "\nCommInitTest compile completed\n" mv $(LIST) ./bin .PHONY: clean clean: rm -rf ./bin/*Test
编译样例
执行如下命令编译样例:
1 | make MPI_HOME=/usr/local/mpich-3.2.1/ ASCEND_DIR=/usr/local/Ascend/ascend-toolkit/latest |
编译成功后,会在执行编译命令的bin/目录下生成CommInitTest可执行文件。
执行样例
编译完成后,通过以下指令启动:
1 | mpirun -n <npu_num> ./bin/CommInitTest |
其中“-n”是需要启动的NPU总数。
结果示例
- HcclSend/HcclRecv代码样例中,接收数据的rank ID分别为4、5、6、7,每个rank分别接收8个数据(i0 ~ i8),数据为“tmpResBuff”的值“2”,输出结果示例如下:
rankId:4,i0 2 rankId:4,i1 2 rankId:4,i2 2 rankId:4,i3 2 rankId:4,i4 2 rankId:4,i5 2 rankId:4,i6 2 rankId:4,i7 2 ... rankId:7,i4 2 rankId:7,i5 2 rankId:7,i6 2 rankId:7,i7 2
- HcclAllReduce代码样例中,共8个rank,每个rank中有8个数据,每个数据的初始值为2,执行HCCL_REDUCE_SUM操作后,8个rank的数据相加,所以每个数据的值为16,输出结果打印出了每个rank的每个数据的值,结果示例如下:
rankId: 0, output: [ 16 16 16 16 16 16 16 16 ] rankId: 1, output: [ 16 16 16 16 16 16 16 16 ] rankId: 2, output: [ 16 16 16 16 16 16 16 16 ] rankId: 3, output: [ 16 16 16 16 16 16 16 16 ] rankId: 4, output: [ 16 16 16 16 16 16 16 16 ] rankId: 5, output: [ 16 16 16 16 16 16 16 16 ] rankId: 6, output: [ 16 16 16 16 16 16 16 16 ] rankId: 7, output: [ 16 16 16 16 16 16 16 16 ]
父主题: Device与业务进程一对一场景