需要建立一个.c的MPI程序和一个.cu的CUDA程序,MPI程序中调用CUDA中的函数来完成并行与GPU的混合编程,我查询了很多资料和博客,最终得出结论,还是Google比较强大,百度什么的还是搜不到完整的讲解

MPI程序如下(文件名test.c)

#include<stdio.h>
#include<malloc.h>
#include<math.h>
#include<stdlib.h>
#include "mpi.h"
void fun ( float * vp_device , int  n , int  nz , int  is) ;
void cudaFun ( int is , FILE *fp, int nx , int nz ) ;
main( int argc, char  *argv[ ] )
{int myid , numprocs , count , is , nx , nz ;float * vp;nx = 1000 ; nz = 1000 ;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Barrier(MPI_COMM_WORLD);FILE *fp;fp=fopen( "test.dat" , "wb" );for ( is = myid ; is < 10 ; is = is    +    numprocs ){printf( " is== %d  \n "  , is ) ;cudaFun( is , fp , nx , nz );}MPI_Finalize( );
}

CUDA程序如下(文件名test_cuda.cu)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <cuda_runtime.h>
__device__  volatile  int  vint = 0;
//a#########################
extern "C"  __global__ void fun ( float  * vp_device , int n, int nz, int  is )
{int it=threadIdx.x blockDim.x*blockIdx.x;if  ( it < n ) {vp_device[it]=2000;if ( ( it > nz * 40 && it < 40 && it % nz < 60 ) ) vp_device [ it ] = 2500 * is * 100 ;}
}
//a########################
extern "C" void cudaFun ( int is , FILE  *fp ,  int  nx , int nz )
{int i ;float  * vp_device , * vp_host;cudaMalloc(&vp_device, nx*nz*sizeof(float));  cudaMemset(vp_device, 0, nx*nz*sizeof(float));vp_host=(float*)malloc(nx*nz*sizeof(float));float mstimer;cudaEvent_t start, stop;cudaEventCreate(&start);cudaEventCreate(&stop);fun <<<(  nx * nz   +   511 ) / 512, 512>>> ( vp_device ,  nx*nz , nz , is ) ;cudaMemcpy(vp_host, vp_device, nx*nz*sizeof(float),cudaMemcpyDeviceToHost); fseek(fp,is*nx*nz*sizeof(float),0);for (  i  =  0  ;  i  <  nx  *  nz   ;  i   ++   )fwrite( &vp_host[i] , sizeof(float) , 1 , fp);cudaEventRecord(stop);cudaEventSynchronize(stop);cudaEventElapsedTime(&mstimer, start, stop);printf( "CUDA : is = %d, time = %g (s)\ n " ,is, mstimer*1.e-3);cudaEventDestroy(start);cudaEventDestroy(stop);cudaFree(vp_device);free(vp_host);
}

Makefile如下(文件名Makefile)

CUDA_INSTALL_PATH = /usr/local/cuda-7.5
MPI_INSTALL_PATH = /home/leonvel/software/mpi/mpichNVCC = $(CUDA_INSTALL_PATH)/bin/nvcc
MPICC = $(MPI_INSTALL_PATH)/bin/mpiccLDFLAGS = -L$(CUDA_INSTALL_PATH)/lib64
LIB = -lcudart -lcurandCFILES = test.c
CUFILES = test_cuda.cu
OBJECTS = test.o test_cuda.o
EXECNAME = testall:$(MPICC) -c $(CFILES)$(NVCC) -c $(CUFILES)$(MPICC) -o $(EXECNAME) $(LDFLAGS) $(LIB) $(OBJECTS)clean:rm -f *.o $(EXECNAME)

我的环境是Linux,所以接下来make一下吧,

[Toa@AMAX test]$ make
/home/leonvel/software/mpi/mpich/bin/mpicc -c test.c
/usr/local/cuda-7.5/bin/nvcc -c test_cuda.cu
/home/leonvel/software/mpi/mpich/bin/mpicc -o test -L/usr/local/cuda-7.5/lib64 -lcudart -lcurand test.o test_cuda.o

然后我们在运行一下:

[Toa@AMAX test]$ ./test
is==0
CUDA:is=0, time= 0 (s)
is==1
CUDA:is=1, time= 0 (s)
is==2
CUDA:is=2, time= 0 (s)
is==3
CUDA:is=3, time= 0 (s)
is==4
CUDA:is=4, time= 0 (s)
is==5
CUDA:is=5, time= 0 (s)
is==6
CUDA:is=6, time= 0 (s)
is==7
CUDA:is=7, time= 0 (s)
is==8
CUDA:is=8, time= 0 (s)
is==9
CUDA:is=9, time= 0 (s)
[Toa@AMAX test]$

没错,你没看错,运行时间就是零秒钟,就是这么快,就是这么尿性。好的,我今天的工作就是这么多,等以后继续学习的时候我会继续更新的,拜拜了,伙计们。。。。。

Mpi与Cuda混合编程(Makefile)相关推荐

  1. Gtk与Cuda混合编程

    大家都知道,不同的编译器有不同的-L和-I,而在编译过程中要实现两种编译器的混合使用,利用Makefile是一个很好地解决方案,比如之前在mpi与cuda混合编程中讨论的那样,基于图形界面的GTK编程 ...

  2. C与CUDA混合编程的配置问题

    C与CUDA混合编程的配置问题 2015-10-05 19:58 526人阅读 评论(2) 收藏 举报 分类: CUDA(6) 目录(?)[+] 原文: http://blog.csdn.net/u0 ...

  3. MPI和OpenMP混合编程计算pi π值

    MPI和OpenMP混合编程,π #include "stdio.h" #include "mpi.h" #include "omp.h" ...

  4. c++和cuda混合编程记录(一)

    最近在用cuda将RT并行化. 很多人都说,最好使用c来写cuda,不要用类,尽量用struct代替.因为在cuda里面使用oo来套现在会有很多问题. 我也试过,确实很多问题,之前用cpp写的光线追踪 ...

  5. MPI和OpenMP混合编程实例

    MPI和OpenMP混合编程 计算pi值 大体思路就是先将计算区域划分成100000 份,然后将计算分成进程数nproc(nproc)份,每一份有nbin个计算. 步长为step = 1.0 / NB ...

  6. CUDA、SU、MPI和Madagascar混合编程的Makefile文件配置

    本人从事地震勘探的科研工作,在Ubuntu系统中用CUDA.SU.MPI和Madagascar做C语言的混合编程.多语言混合编程,关键之处在于Makefile文件的配置.在此给出一个简单的示例,供大家 ...

  7. Java与Cuda混合编程

    基本上和Java与C语言混合编程(链接)相同,就是在生成动态库的编译过程不同. 首先编写一个名为Main.java的文件,内容如下: class NativeMethod{public native ...

  8. mpi和openmp混合编程的优点_西门子PLC可编程控制器CPU1215C一级总代理

    西门子PLC可编程控制器CPU1215C一级总代理 上海峰萨自动化设备有限公司于2018年03月15日成立.法定代表人苏胜文,公司经营范围包括工业自动化设备,电子元器件,仪器仪表,电线电缆,通信设备及 ...

  9. mpi和openmp混合编程的优点_混合云:拥抱云计算的未来!

    云技术为公共云,私有云和混合云开辟了新的可能性.许多组织正在迁移到混合云以充分利用云计算. 什么是混合云?混合云基础架构是一种IT体系结构,在两个或多个环境中融合了一定程度的管理和工作负载可移植性.混 ...

最新文章

  1. AI一分钟 | 厉害了!英特尔正式发布电动飞行汽车;贝佐斯笑了,多家PC厂商结盟亚马逊Alexa,直怼微软Cortana
  2. linux问答学知识
  3. SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式
  4. python剑指offer跳台阶_【剑指offer】跳台阶I和II(Javapython)
  5. 阿里有一帮吃货工程师,在食堂玩起了“黑科技”
  6. 如何利用NLog输出结构化日志,并在Kibana优雅分析日志?
  7. 文本框宽度自动适应文本宽度
  8. webcast(利用sharepoint Designer 定制 Office SharePoint Server 2007)学习笔记
  9. ES6——Symbol
  10. TinyMind 和机器之心收藏
  11. Windows API GetLastError()函数返回值含义解释
  12. java文件名特殊字符_文件名不能包含哪些特殊字符
  13. 魔兽世界服务器同时在线人数,魔兽世界服务器人数,魔兽世界服务器人数查询...
  14. 如何进行计算机系统安装教程,电脑怎么重装系统:系统安装教程
  15. 如何将pdf转换成jpg图片的格式
  16. MRP计算之计划展望期、需求时界、计划时界及关系
  17. 前端笔记(03)——一文看懂flex布局
  18. Jupyter Notebook 删除不需要的 Kernels
  19. 搜索引擎排名都选乐云seo_百度官网排名-搜索引擎算法优化
  20. Java 9、10、11,谁才是Java程序员的本命?

热门文章

  1. H3C使用ping命令
  2. h5页面调用相机功能
  3. matplotlib(一):散点图
  4. Python学习笔记14(socket编程)
  5. SLF4J 与Log4J
  6. 2 _RESETFUL介绍
  7. [BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】
  8. 惊叹jQuery(解决jQuery对象到DOM的转换)
  9. 本年度读书计划-看几本必须好好琢磨的书
  10. hbase sqoop 实验_Hive/hbase/sqoop的基本使用教程~