• mpi和cuda混合编程的正确编译


    针对大数据的计算,很多程序通过搭建mpi集群进行加速,并取得了很好的效果。算法内部的加速,当前的并行化趋势是利用GPU显卡进行算法加速。针对并行性非常好的算法,GPU加速效果将远大于集群带来的加速效果。所以,如果我们面临非常多的数据,针对数据的处理算法有具有很好的内部并行性,则我们可以将mpi和GPU结合,获得更大的加速比。

           将mpi和GPU结合的产物就是GPU集群。它可以为我们带来非常高的加速比。虽说NVIDIA的cuda为我们提供了类C语言的编程环境,但是cuda还不是C语言,这就为mpi和cuda编程的融合带来了难度。我们通过一个具体实例来说明mpi和cuda混合编程的编译方法。

           下面是要编译项目的Makefile文件,该项目有三个文件:mpi.cpp,cpp.cpp和cuda.cu,分别表示这三个文件是mpi文件,常规cpp和cuda文件。mpi文件通过调用cpp文件和cu文件来实现相应功能。

    all: target
    
    CC = mpic++
    NVCC = nvcc
    
    CFLAGS+= -O3
    
    LDFLAGS= -L/usr/local/cuda/lib64 -L/root/NVIDIA_GPU_Computing_SDK/C/lib
    LDFLAGS+= -lcutil_x86_64 -lm -lcufft -lcublas
    
    NVCCFLAGS= -I /usr/local/cuda/include  -I /root/NVIDIA_GPU_Computing_SDK/C/common/inc
    #NVCCFLAGS+= -arch sm_20
    
    target: mpi.o cpp.o cuda.o 
    	$(CC) $(LDFLAGS) -o $@ $^
    
    %.o : %.cu
    	$(NVCC) $(NVCCFLAGS) $(CFLAGS) -o $@ -c $^ 
    
    %.o: %.cpp
    	$(CC) $(NVCCFLAGS) $(CFLAGS) -o $@ -c $^
    
    clean:
    	$(RM) *.o *.s *.i target
    

    在编程的过程中,尽量不要用.c编写程序,而要用.cpp编写程序。在测试过程中发现,用.c编写程序会发生undefined reference to “symbols”错误。通过Makefile文件我们可以看出:常规的cpp文件不是利用g++进行编译,而是mpic++进行编译;cuda程序还是利用nvcc编译器进行编译;链接的时候要采用mpic++编译器。mpi在调用cuda程序的时候,虽然它没有显示调用cuda相关的头文件,但是它调用的cuda程序包含cuda相关的头文件,所以为了保证在编译mpi.cpp文件时不出现找不到头文件的错误,我们也需要包含相应cuda头文件的目录。链接过程中,即使是mpic++编译器,我们也需要包含相应cuda库的目录,否则也会报错。

           上述Makefile是一个测试模版,但是根据该模版的规则扩展就可以正确编译mpi和cuda程序。


  • 相关阅读:
    即将到来的“分布式云”(DPaaS):分布式计算+ DB +存储即服务
    【玩转MLS系列】基础教程
    【云速建站】微信公众平台中维护IP白名单
    基于华为云对话机器人技能平台的规则模板概述
    云享专家倪升武:微服务架构盛行的时代,你需要了解点 Spring Boot
    Python一秒搭建ftp服务器,帮助你在局域网共享文件
    华为担纲建设基础软硬件国家新一代AI开放创新平台
    基于华为云区块链服务快速部署和搭建链上应用
    protobuf代码生成
    python的str()和repr()的区别
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3192194.html
Copyright © 2020-2023  润新知