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程序。
mpi和cuda混合编程的正确编译的更多相关文章
- CUDA C++编程接口:编译
CUDA C++编程接口:编译 一.概述 CUDA C++为熟悉C++编程语言的用户提供了一个简单的路径,以方便地编写程序以执行该设备. 它由一组最小的扩展到C++语言和运行库. 在编程模型中引入了核 ...
- c++和cuda混合编程 实现传统神经网络
直接放代码了... 实现的是x1+x2=y的预测,但梯度下降很慢...233333,gpu运行时间很快!! // // main.cpp // bp // // Created by jzc on 2 ...
- Microsoft.VisualC 命名空间包含支持用 c + + 语言的代码生成和编译的类。 混合编程中使用COM接口指针
Microsoft.VisualC 命名空间包含支持用 c + + 语言的代码生成和编译的类. Microsoft.VisualC.StlClr Unmanaged Code 和 Managed Co ...
- CUDA+OpenGL混合编程
CUDA+OpenGL混合编程示例: #include <stdio.h> #include <stdlib.h> #include "GL\glew.h" ...
- 如玫瑰一般的PHP与C#混合编程
故事背景是这样的,有一套项目,服务器端是用C#写的,为了完成某种事情,它需要使用到一个组件,这个组件很小但很重要,很不巧的是,这个这个组件是用PHP语言写的,如果为了使用这个组件而专门搭建一个PHP的 ...
- C#Matlab混合编程类 初始化问题解决方法
************** 异常文本 ************** System.TypeInitializationException: “myPlus.matClass”的类型初始值设定项引发异 ...
- 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...
- 玩转cocos2d-x lua-binding, 实现c++与lua混合编程
引言 城市精灵GO(http://csjl.teamtop3.com/)是一款基于cocos2d-x开发的LBS社交游戏, 通过真实地图的探索, 发现和抓捕隐匿于身边的野生精灵, 利用游戏中丰富的玩法 ...
- 用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(一)
本文为原创,如有转载,请注明出处:http://www.cnblogs.com/jackybu 前言 章节: 1.需求描述以及c/c++实现日期和月历的基本操作 2.ios实现自绘日期选择控件 3.a ...
随机推荐
- MVC验证07-自定义Model级别验证
原文:MVC验证07-自定义Model级别验证 在一般的自定义验证特性中,我们通过继承ValidationAttribute,实现IClientValidatable,只能完成对某个属性的自定义验证. ...
- rpm安装FAQ
1.error: cannot create %sourcedir /usr/src/redhat/SOURCES错误的解决方案 显现error: cannot create %sourcedir / ...
- 轻型ORM--Dapper
分享一个轻型ORM--Dapper选用理由 推荐理由:Dapper只有一个代码文件,完全开源,你可以放在项目里的任何位置,来实现数据到对象的ORM操作,体积小速度快:) Google Code下载地址 ...
- Visual Studio 单元测试之六---UI界面测试
原文:Visual Studio 单元测试之六---UI界面测试 UI界面测试其实就是录制操作路径(Mapping),然后按照路径还原操作顺序的一个过程.这个方法对于Winform和Webform都同 ...
- Android Studio之同一应用创建多个Activity(一)
1. 2. 3. 4. 本文主要是构建多个Activity的过程.
- Crystal Report 在 VS 2010 中的使用和发布
原文:Crystal Report 在 VS 2010 中的使用和发布 使用: 打开CrystalReport官网下载页 目前最新版本为13.0.4 选择“SAP Crystal Reports, v ...
- 【WebSocket初探
】
众所周知,socket是编写网络通信应用的基本技术,网络数据交换大多直接或间接通过socket进行.对于直接使用socket的client与服务端,一旦连接被建立则均可主动向对方传送数据,而对于使用更 ...
- hadoop编程技巧(3)---定义自己的区划类别Partitioner
Hadoop代码测试环境:Hadoop2.4 原则:在Hadoop的MapReduce过程.Mapper阅读过程完成后数据.它将数据发送到Partitioner.由Partitioner每个记录应当采 ...
- mysql通过字段注释查找字段名称
原文:mysql通过字段注释查找字段名称 有时候表的字段太多,只是大致记得表的注释,想通过字段注释查找字段名称,可以用如下语句: SELECT COLUMN_NAME,column_comment F ...
- Android中常用的颜色
代码: <?xml version=”″ ?> <resources> <color name=”white”>#ffffff</color><! ...