昇腾社区首页
中文
注册

编译运行

介绍目录结构

样例代码目录结构如下所示:

1
2
3
4
5
6
CreateSubCommConfig
├── bin
   └── CommInitTest
├── Makefile
└── src
    └── main.cc
  • Makefile文件内容可参见配置Makefile文件
  • main.cc的样例代码可参见样例代码
  • bin目录下的CommInitTest为编译后生成的可执行文件。

配置环境变量

配置样例编译时依赖的环境变量:

1
2
3
4
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
export RANK_TABLE_FILE=/home/test/rank_table.json
  • “/usr/local/Ascend”为CANN软件root用户的默认安装路径,如果使用普通用户安装,或指定路径安装,请自行替换。
  • “/usr/local/mpich-3.2.1/lib”为安装后MPI的库文件所在路径,请根据实际情况替换。
  • “/home/test/rank_table.json”为样例准备章节准备的rank table文件所在路径。

配置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分别为2、3,每个rank分别接收4个数据(i0 ~ i3),数据为“tmpResBuff”的值“2”,输出结果示例如下:
    rankId:3,i0 2
    rankId:3,i1 2
    rankId:3,i2 2
    rankId:3,i3 2
    rankId:2,i0 2
    rankId:2,i1 2
    rankId:2,i2 2
    rankId:2,i3 2
  • HcclAllReduce代码样例中,共8个rank,每个rank中8个数据,每个数据的初始值为2。执行子通信域切分操作后,rank0~rank3切分为一个子通信域,rank4~rank7切分为一个子通信域,每个子通信域中的数据分别执行HCCL_REDUCE_SUM操作,所以最终每个rank的每个数据的值为2*4=8。
    输出结果打印出了每个rank的每个值,结果示例如下:
    rankId: 0, output: [ 8 8 8 8 8 8 8 8 ]
    rankId: 1, output: [ 8 8 8 8 8 8 8 8 ]
    rankId: 2, output: [ 8 8 8 8 8 8 8 8 ]
    rankId: 3, output: [ 8 8 8 8 8 8 8 8 ]
    rankId: 4, output: [ 8 8 8 8 8 8 8 8 ]
    rankId: 5, output: [ 8 8 8 8 8 8 8 8 ]
    rankId: 6, output: [ 8 8 8 8 8 8 8 8 ]
    rankId: 7, output: [ 8 8 8 8 8 8 8 8 ]