针对大数据的计算,很多程序通过搭建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. IBM、京东、携程、eBay 的 OpenStack 云

    我所了解的 IBM.京东.携程.eBay 的 OpenStack 云 参加过几次 OpenStack meetup 活动,听过这几家公司的Architect 讲他们公司的 OpenStack产品.本文 ...

  2. Backup and Recovery Strategies1

    2.1.Data Recovery Strategy Determines Backup Strategy 在设计备份策略.如若数据恢复需求和数据恢复战略启动.每种类型的数据恢复需要你采取相应的备份类 ...

  3. ASP.NET 5 Identity

    ASP.NET 5 Identity   “跌倒了”指的是这一篇博文:爱与恨的抉择:ASP.NET 5+EntityFramework 7 如果想了解 ASP.NET Identity 的“历史”及“ ...

  4. Codeforces 527C Glass Carving(Set)

    意甲冠军  片w*h玻璃  其n斯普利特倍  各事业部为垂直或水平  每个分割窗格区域的最大输出 用两个set存储每次分割的位置   就能够比較方便的把每次分割产生和消失的长宽存下来  每次分割后剩下 ...

  5. 探讨javascript面向对象编程

    (个人blog迁移文章.) 前言: 下面将探讨javascript面向对象编程的知识. 请不要刻意把javascript想成面向对象编程是理所当然的. javascript里面,对象思想不可少,但是不 ...

  6. JJG 623-2005 电阻应变仪计量检定规程

    JJG 623-2005 电阻应变仪计量检定规程 点击下载 JJG533-2007标准模拟应变量校准器检定规程 点击下载 JJG 533-1988标准(里面含有一些更具体的电路图供参考)

  7. How to write own add-in for SSMS 2012 (Final release version)

    原文 How to write own add-in for SSMS 2012 (Final release version) Reading internet forums I have noti ...

  8. Oracle笔试题库之问答题篇-总共60道

    1.把表A从表空间TSP1更改成表空间TSP2的方法 解答:alter table A move tablespace TSP2 2.删除表的列: 解答:alert table 表名 drop 列名 ...

  9. Http Pipeline详细分析(下)

    Http Pipeline详细分析(下) 文章内容 接上面的章节,我们这篇要讲解的是Pipeline是执行的各种事件,我们知道,在自定义的HttpModule的Init方法里,我们可以添加自己的事件, ...

  10. dcmtk常用命令

    dump2dcm 把普通文件转换成含有dcm头的文件,参数为源文件,目标文件 例:dump2dcm q1.txt query.dcm 表示把q1.txt文件转换为query.dcm dcmdump 阅 ...