zoukankan      html  css  js  c++  java
  • 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程序。


  • 相关阅读:
    Java 位运算(移位、位与、或、异或、非)
    负数的二进制表示方法(正数:原码、负数:补码)
    MacOS X终端里SSH会话管理
    Mac软件分享:上小巧实用的GIF格式录屏软件 LICEcap
    问题追踪:ImageView执行缩放动画ScaleAnimation之后,图像显示不全的问题。
    自定义res/anim加载类,加载自定义Interpolator
    原文翻译 Android_Develop_API Guides_Animation Resources(动画资源)
    OAuth2.0详解
    Grails框架使用指南
    Groovy语言学习汇总
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3192194.html
Copyright © 2011-2022 走看看