原文作者:FreeAquar
  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  最近在学习cuda编程,看了一些资料后,觉得差不多可以通过看sdk中的例子学习学习多GPU的编程了。当打开sdk后,发现里面的代码往往是几个代码互相调用连接的。只能对里面的makefile进行make才能得到结果。于是开始了自学makefiled的艰辛道路。

  自己看了一些之后,能简单的编译运行多个c的程序了。但是关于main在cpp中的,并且调用cuda的文件还是不会写makefile(比如:simpleMultiGPU)。最后几经周折,在老师的帮助下,终于能直接编译出来了。然后自己研究研究,能弄出main函数在cuda中的文件了(比如:simpleAtomicIntrinsics)。晚上再去的时候,终于写出了两者的makefile。

  首先,要知道,makefile是做什么用的(相信对于多数windows用户都会很陌生)。

  简单说来,Makefile的文件来完成并自动维护编译工作,Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中记录有文件的信 息,在make时会决定在链接的时候需要重新编译哪些文件。

  所以,我们花精力去学习如何写makefile的原因也就很简单了,就是让编译过程简单化,毕竟总会碰到很多文件互相调用的情况。makefile带来的好处就是—“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译。

  Okay,通过上面的简介,我们可以知道,想要写makefile,能直接自己手动编译多个文件的程序是前提(当然,sdk中有makefile,虽然写法超简单,可惜的是挺难懂,网上也没有什么教程之类的,反正我是没有搜到)。

闲话少说,步入正题。

  本人使用的是红帽Linux,64位服务器,GPU性能1.3,cuda4.0

  首先,对main函数在cpp中,调用cu的文件,以sdk中的simpleMultiGPU为例。输入以下命令

  1.     gcc -c -I /usr/local/cuda/include simpleMultiGPU.cpp
  2.  
  3. nvcc -c simpleMultiGPU_kernel.cu
  4.  
  5. gcc -o simpleMultiGPU -L /usr/local/cuda/lib64 -lcuda -lcudart simpleMultiGPU.o simpleMultiGPU_kernel.o

第一行的-I是标明头文件的目录。编译生成simpleMultiGPU.o的文件。

第二行生成simpleMultiGPU_kernel.o的文件

第三行,对两个文件进行连接,生成simpleMultiGPU。之后,就可以运行./ simpleMultiGPU了~

注:

  1. 为了方便,我提前将/root/NVIDIA_GPU_Computing_SDK/shared/inc中shrUtils.h和shrQATest.h头文件移动到simpleMultiGPU目录中。
  2. 第三行-lcudart不能少

好了,下面读者可以先自己试试simpleAtomicIntrinsics。只要记住在编译.cu的时候,在nvcc –c后加-arch compute_11,貌似是对原子函数的要求吧,找了好久找的一个英文论坛上的。

我是这么写的(同样:shrQATest.h  shrUtils.h已经在目录中):

  1. nvcc -c -arch compute_11 -I /usr/local/cuda/include simpleAtomicIntrinsics.cu
  2.  
  3. nvcc -c -arch compute_11 -I /usr/local/cuda/include/ simpleAtomicIntrinsics_kernel.cu
  4.  
  5. gcc -c simpleAtomicIntrinsics_gold.cpp
  6.  
  7.     nvcc -o simple -L /usr/local/cuda/lib64/ -lcuda -lcudart simpleAtomicIntrinsics.o simpleAtomicIntrinsics_gold.o

后来又有试过,用*号可以缩略一下,将前两句变为

  1.     nvcc -c -arch compute_11 -I /usr/local/cuda/include *.cu

好了,手动编译部分过了,最难的那部分已经过去了,剩下的就是写一个makefile的文件了,现在再看makefile,你会惊叹,原来就这么简单。

先给出simpleMultiGPU的makefile

  1. # Makefile example for compiling cuda and linking cuda to cpp:
  2.  
  3. SOURCELOC =
  4.  
  5. UTILITYLOC =
  6.  
  7. NEWMOD =
  8.  
  9. PROGRAM = simpleMultiGPU
  10.  
  11. INCDIR= .
  12.  
  13. #
  14.  
  15. # Define the C compile flags
  16.  
  17. CCFLAGS = -I /usr/local/cuda/include
  18.  
  19. CC = gcc
  20.  
  21. # Define the Cuda compile flags
  22.  
  23. #
  24.  
  25. CUDAFLAGS=
  26.  
  27. CUDACC= nvcc
  28.  
  29. # Define Cuda objects
  30.  
  31. #
  32.  
  33. CUDA = simpleMultiGPU_kernel.o
  34.  
  35. # Define the libraries
  36.  
  37. SYSLIBS= -lc
  38.  
  39. USRLIB = -lcudart
  40.  
  41. # Define all object files
  42.  
  43. OBJECTS = \
  44.  
  45. simpleMultiGPU.o
  46.  
  47. install: simpleMultiGPU
  48.  
  49. # Define Task Function Program
  50.  
  51. all: simpleMultiGPU
  52.  
  53. # Define what Modtools is
  54.  
  55. simpleMultiGPU: $(OBJECTS) $(CUDA)
  56.  
  57. -$(CC) $(CCFLAGS) -o simpleMultiGPU -L/usr/local/cuda/lib64 -lcuda $(OBJECTS) $(CUDA) $(USRLIB) $(SYSLIBS)
  58.  
  59. # Modtools_Object codes
  60.  
  61. simpleMultiGPU.o: simpleMultiGPU.cpp
  62.  
  63. $(CC) $(CCFLAGS) -c simpleMultiGPU.cpp
  64.  
  65. .c.o:
  66.  
  67. $(CC) $(CFLAGS) -c $<
  68.  
  69. CUDAINCDIR= /usr/local/cuda/include
  70.  
  71. simpleMultiGPU_kernel.o: simpleMultiGPU_kernel.cu
  72.  
  73. $(CUDACC) -arch sm_13 $(CUDAFLAGS) -c simpleMultiGPU_kernel.cu
  74.  
  75. # end

然后试着自己写写simpleAtomicIntrinsics的。你会发现,只用改少许几个地方,就能编译通过~

  1.  
  2. # Makefile example for compiling cuda and linking cuda to cpp:
  3.  
  4. SOURCELOC =
  5.  
  6. UTILITYLOC =
  7.  
  8. NEWMOD =
  9.  
  10. PROGRAM = simpleAtomicIntrinsics
  11.  
  12. INCDIR= .
  13.  
  14. #
  15.  
  16. # Define the C compile flags
  17.  
  18. CCFLAGS=
  19.  
  20. CC= gcc
  21.  
  22. # Define the Cuda compile flags
  23.  
  24. #
  25.  
  26. CUDAFLAGS=
  27.  
  28. CUDACC= nvcc
  29.  
  30. # Define Cuda objects
  31.  
  32. #
  33.  
  34. CUDA = simpleAtomicIntrinsics.o
  35.  
  36. # simpleAtomicIntrinsics_kernel.o
  37.  
  38. # Define the libraries
  39.  
  40. SYSLIBS= -lc
  41.  
  42. USRLIB = -lcudart
  43.  
  44. # Define all object files
  45.  
  46. OBJECTS = \
  47.  
  48. simpleAtomicIntrinsics_gold.o
  49.  
  50. install: simpleAtomicIntrinsics
  51.  
  52. # Define Task Function Program
  53.  
  54. all: simpleAtomicIntrinsics
  55.  
  56. # Define what Modtools is
  57.  
  58. simpleAtomicIntrinsics: $(CUDA) $(OBJECTS)
  59.  
  60. -$(CUDACC) $(CUDAFLAGS) -o simple -L/usr/local/cuda/lib64 -lcuda $(CUDA) $(OBJECTS) $(USRLIB) $(SYSLIBS)
  61.  
  62. # Modtools_Object codes
  63.  
  64. simpleAtomicIntrinsics_gold.o: simpleAtomicIntrinsics_gold.cpp
  65.  
  66. $(CC) $(CCFLAGS) -c simpleAtomicIntrinsics_gold.cpp
  67.  
  68. .c.o:
  69.  
  70. $(CC) $(CCFLAGS) -c $<
  71.  
  72. CUDAINCDIR= /usr/local/cuda/include
  73.  
  74. simpleAtomicIntrinsics.o: simpleAtomicIntrinsics.cu
  75.  
  76. $(CUDACC) -arch compute_11 $(CUDAFLAGS) -c simpleAtomicIntrinsics.cu
  77.  
  78. simpleAtomicIntrinsics_kernel.o: simpleAtomicIntrinsics_kernel.cu
  79.  
  80. $(CUDACC) -arch compute_11 $(CUDAFLAGS) -c simpleAtomicIntrinsics_kernel.cu
  81.  
  82. # end

是不是突然觉得很简单了?到这里会不会突然觉得,Makefile简直就是让计算机为人服务的一个典范。

 

转来的 cuda makefile 写法学习的更多相关文章

  1. 【APUE】Chapter16 Network IPC: Sockets & makefile写法学习

    16.1 Introduction Chapter15讲的是同一个machine之间不同进程的通信,这一章内容是不同machine之间通过network通信,切入点是socket. 16.2 Sock ...

  2. Makefile基础学习

    Makefile基础学习 理论知识 makefile关系到了整个工程的编译规则.一个工程中的源文件不计其数,并且按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文 ...

  3. Makefile之写demo时的通用Makefile写法

    Makefile之写demo时的通用Makefile写法[日期:2013-05-22] 来源:CSDN  作者:gqb666 [字体:大 中 小] 前面的一篇文章Makefile之大型工程项目子目录M ...

  4. Makefile的学习笔记

    Makefile的学习笔记 标签: makefilewildcard扩展includeshellfile 2012-01-03 00:07 9586人阅读 评论(2) 收藏 举报  分类: Linux ...

  5. theos的makefile写法

    theos的makefile写法与其他linux/unix环境下的makefile写法大同小异,但是对于makefile不熟悉的在导入一些dylib或者framework的时候就会变得很蛋疼. 对于f ...

  6. 运用Autoconf和Automake生成Makefile的学习之路

    作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的M ...

  7. 大型工程多个目录下的Makefile写法

    1.前言 目前从事于linux下程序开发,涉及到多个文件,多个目录,这时候编译文件的任务量比较大,需要写Makefile.关于Makefile的详细内容可以参考网上流传非常广泛的<跟我一起写Ma ...

  8. [笔记] 基于nvidia/cuda的深度学习基础镜像构建流程 V0.2

    之前的[笔记] 基于nvidia/cuda的深度学习基础镜像构建流程已经Out了,以这篇为准. 基于NVidia官方的nvidia/cuda image,构建适用于Deep Learning的基础im ...

  9. CUDA上深度学习模型量化的自动化优化

    CUDA上深度学习模型量化的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参数 ...

随机推荐

  1. CodeForces484A——Bits(贪心算法)

    Bits Let's denote as the number of bits set ('1' bits) in the binary representation of the non-negat ...

  2. Fiddler如何抓取使用了SSL或TLS传输的Android App流量

    上篇文章介绍了Burpsuite如何抓取使用了SSL或TLS传输的Android App流量, 那么使用Fiddler的时候其实 也会出现与burpsuite同样的情况,解决方案同样是需要将Fiddl ...

  3. Android 【问题汇总】列表数组越界的问题

    遇到了一个诡异的问题,ListView发生数组越界(偶尔会),程序崩溃. 错误信息如下: W/dalvikvm( ): threadid=: thread exiting with uncaught ...

  4. [IT] 关闭笔记本的蜂鸣提示

    很久没有写什么了,今天开过workshop, 稍微放松些, 一时动念上来看看,没想到最近一篇都是2010年的了, 不得不感叹时光流逝之快啊. 那就写点什么吧. 现在每天工作用的DELL笔记本,性能差强 ...

  5. QQ2013手工去广告

    QQ的广告令人讨厌,虽然网上有很多去广告补丁或者是去广告版,但是总是害怕有被盗号的风险,那除了付费会员还有其他什么方法可以安全的去除qq广告吗?显然有,那就是手动去广告. 很简单,不会比使用去广告补丁 ...

  6. SQL分组查询group by

    注意:select 后的字段,必须要么包含在group by中,要么包含在having 后的聚合函数里. 1. GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用 group ...

  7. Android Touch(4)我不知道的MotionEvent(*)

    1,MotionEvent的复制或构造 有时候可能要保存一个MotionEvent, 它的构造方法是匿名的,不能直接创建,对外提供的获取对象的接口是静态的obtain方法,可以从一个MotionEve ...

  8. Android构建boot.img(一):root目录与ramdisk.img的生成

    以TCC88XX为例,当在Android顶层源码目录使用make编译完成后,会生成这样一个目录: out/target/product/tcc8800,该目录内部有我们需要的boot.img和syst ...

  9. UVA 11427 Expect the Expected (期望)

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=26&pa ...

  10. jstl的forEach使用和jstl变量实现自增

    <c:forEach items="${reallyChooseSubjectList}" var="reallyChooseSubject"> & ...