针对大数据的计算,很多程序通过搭建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程序。

mpi和cuda混合编程的正确编译的更多相关文章

  1. CUDA C++编程接口:编译

    CUDA C++编程接口:编译 一.概述 CUDA C++为熟悉C++编程语言的用户提供了一个简单的路径,以方便地编写程序以执行该设备. 它由一组最小的扩展到C++语言和运行库. 在编程模型中引入了核 ...

  2. c++和cuda混合编程 实现传统神经网络

    直接放代码了... 实现的是x1+x2=y的预测,但梯度下降很慢...233333,gpu运行时间很快!! // // main.cpp // bp // // Created by jzc on 2 ...

  3. Microsoft.VisualC 命名空间包含支持用 c + + 语言的代码生成和编译的类。 混合编程中使用COM接口指针

    Microsoft.VisualC 命名空间包含支持用 c + + 语言的代码生成和编译的类. Microsoft.VisualC.StlClr Unmanaged Code 和 Managed Co ...

  4. CUDA+OpenGL混合编程

    CUDA+OpenGL混合编程示例: #include <stdio.h> #include <stdlib.h> #include "GL\glew.h" ...

  5. 如玫瑰一般的PHP与C#混合编程

    故事背景是这样的,有一套项目,服务器端是用C#写的,为了完成某种事情,它需要使用到一个组件,这个组件很小但很重要,很不巧的是,这个这个组件是用PHP语言写的,如果为了使用这个组件而专门搭建一个PHP的 ...

  6. C#Matlab混合编程类 初始化问题解决方法

    ************** 异常文本 ************** System.TypeInitializationException: “myPlus.matClass”的类型初始值设定项引发异 ...

  7. 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...

  8. 玩转cocos2d-x lua-binding, 实现c++与lua混合编程

    引言 城市精灵GO(http://csjl.teamtop3.com/)是一款基于cocos2d-x开发的LBS社交游戏, 通过真实地图的探索, 发现和抓捕隐匿于身边的野生精灵, 利用游戏中丰富的玩法 ...

  9. 用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(一)

    本文为原创,如有转载,请注明出处:http://www.cnblogs.com/jackybu 前言 章节: 1.需求描述以及c/c++实现日期和月历的基本操作 2.ios实现自绘日期选择控件 3.a ...

随机推荐

  1. PHP版本的区别

    原文:PHP版本的区别 以为这个已经写过了,发现没有,赶紧补充下. PHP的版本,自从进入5以后,发布新版本速度明显提升很多,从PHP5.2开始,5.3 .5.4 .5.5,就快要6.0了. 注:ec ...

  2. C语言库函数大全及应用实例六

    原文:C语言库函数大全及应用实例六                                              [编程资料]C语言库函数大全及应用实例六 函数名: getlinesett ...

  3. Linux下tomcat管理查看控制台|杀死tomcat进程

    查看控制台 # tail -f catalina.out 脚本执行权限chmod u+x *.sh #看是否已经有tomcat在运行了 ps -ef |grep tomcat #如果有,用kill; ...

  4. J2EE

    随笔分类 - J2EE   关于SpringMVC Json使用 摘要: 很简单的一个东西,这里就不做过多介绍了,写一个小Demo,随手记录下.首先,在搭好SpringMVC工程环境之后,如果想用Sp ...

  5. bzoj 1799: [Ahoi2009]self 类似的分布 解读

    [原标题] 1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec  Memory Limit: 64 MB Submit: 554  Solved: 194 [id ...

  6. leetcode第12题--Integer to Roman

    Problem: Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range ...

  7. PhpStorm创建Drupal模块项目开发教程

    在PhpStorm开发工具中,创建Drupal开发项目有两种方式:整合Drupal到现有的项目中和直接创建一个新的Drupal模块. 接下来将展示这两种方式的具体操作! 整合Drupal到现有的项目 ...

  8. javaproject积累——java 反射 invoke

    铅: 在java工程,我们已经听到很多ORM的概念,我一直耿耿于怀,如何从上rs转换成了对象呢?难道要写非常多的推断吗?答案肯定是否定.我们就要探索怎么解决问题,刚好在研究我们系统底层架构的时候,挖掘 ...

  9. Dom解析xml源代码

    import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import ja ...

  10. Prototype,创建型模式

    读书笔记_探索式测试_混合探索式测试   一.测试场景 1.讲述用户故事 2.描述需求 3.演示产品功能 4.演示集成场景 5.描述设置和安装 6.描述警告和出错情况 二.使用基于场景的探索式测试 1 ...