转来的 cuda makefile 写法学习
最近在学习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为例。输入以下命令
gcc -c -I /usr/local/cuda/include simpleMultiGPU.cpp
nvcc -c simpleMultiGPU_kernel.cu
gcc -o simpleMultiGPU -L /usr/local/cuda/lib64 -lcuda -lcudart simpleMultiGPU.o simpleMultiGPU_kernel.o
第一行的-I是标明头文件的目录。编译生成simpleMultiGPU.o的文件。
第二行生成simpleMultiGPU_kernel.o的文件
第三行,对两个文件进行连接,生成simpleMultiGPU。之后,就可以运行./ simpleMultiGPU了~
注:
- 为了方便,我提前将/root/NVIDIA_GPU_Computing_SDK/shared/inc中shrUtils.h和shrQATest.h头文件移动到simpleMultiGPU目录中。
- 第三行-lcudart不能少
好了,下面读者可以先自己试试simpleAtomicIntrinsics。只要记住在编译.cu的时候,在nvcc –c后加-arch compute_11,貌似是对原子函数的要求吧,找了好久找的一个英文论坛上的。
我是这么写的(同样:shrQATest.h shrUtils.h已经在目录中):

nvcc -c -arch compute_11 -I /usr/local/cuda/include simpleAtomicIntrinsics.cu
nvcc -c -arch compute_11 -I /usr/local/cuda/include/ simpleAtomicIntrinsics_kernel.cu
gcc -c simpleAtomicIntrinsics_gold.cpp
nvcc -o simple -L /usr/local/cuda/lib64/ -lcuda -lcudart simpleAtomicIntrinsics.o simpleAtomicIntrinsics_gold.o

后来又有试过,用*号可以缩略一下,将前两句变为
nvcc -c -arch compute_11 -I /usr/local/cuda/include *.cu
好了,手动编译部分过了,最难的那部分已经过去了,剩下的就是写一个makefile的文件了,现在再看makefile,你会惊叹,原来就这么简单。
先给出simpleMultiGPU的makefile

# Makefile example for compiling cuda and linking cuda to cpp:
SOURCELOC =
UTILITYLOC =
NEWMOD =
PROGRAM = simpleMultiGPU
INCDIR= .
#
# Define the C compile flags
CCFLAGS = -I /usr/local/cuda/include
CC = gcc
# Define the Cuda compile flags
#
CUDAFLAGS=
CUDACC= nvcc
# Define Cuda objects
#
CUDA = simpleMultiGPU_kernel.o
# Define the libraries
SYSLIBS= -lc
USRLIB = -lcudart
# Define all object files
OBJECTS = \
simpleMultiGPU.o
install: simpleMultiGPU
# Define Task Function Program
all: simpleMultiGPU
# Define what Modtools is
simpleMultiGPU: $(OBJECTS) $(CUDA)
-$(CC) $(CCFLAGS) -o simpleMultiGPU -L/usr/local/cuda/lib64 -lcuda $(OBJECTS) $(CUDA) $(USRLIB) $(SYSLIBS)
# Modtools_Object codes
simpleMultiGPU.o: simpleMultiGPU.cpp
$(CC) $(CCFLAGS) -c simpleMultiGPU.cpp
.c.o:
$(CC) $(CFLAGS) -c $<
CUDAINCDIR= /usr/local/cuda/include
simpleMultiGPU_kernel.o: simpleMultiGPU_kernel.cu
$(CUDACC) -arch sm_13 $(CUDAFLAGS) -c simpleMultiGPU_kernel.cu
# end

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

# Makefile example for compiling cuda and linking cuda to cpp:
SOURCELOC =
UTILITYLOC =
NEWMOD =
PROGRAM = simpleAtomicIntrinsics
INCDIR= .
#
# Define the C compile flags
CCFLAGS=
CC= gcc
# Define the Cuda compile flags
#
CUDAFLAGS=
CUDACC= nvcc
# Define Cuda objects
#
CUDA = simpleAtomicIntrinsics.o
# simpleAtomicIntrinsics_kernel.o
# Define the libraries
SYSLIBS= -lc
USRLIB = -lcudart
# Define all object files
OBJECTS = \
simpleAtomicIntrinsics_gold.o
install: simpleAtomicIntrinsics
# Define Task Function Program
all: simpleAtomicIntrinsics
# Define what Modtools is
simpleAtomicIntrinsics: $(CUDA) $(OBJECTS)
-$(CUDACC) $(CUDAFLAGS) -o simple -L/usr/local/cuda/lib64 -lcuda $(CUDA) $(OBJECTS) $(USRLIB) $(SYSLIBS)
# Modtools_Object codes
simpleAtomicIntrinsics_gold.o: simpleAtomicIntrinsics_gold.cpp
$(CC) $(CCFLAGS) -c simpleAtomicIntrinsics_gold.cpp
.c.o:
$(CC) $(CCFLAGS) -c $<
CUDAINCDIR= /usr/local/cuda/include
simpleAtomicIntrinsics.o: simpleAtomicIntrinsics.cu
$(CUDACC) -arch compute_11 $(CUDAFLAGS) -c simpleAtomicIntrinsics.cu
simpleAtomicIntrinsics_kernel.o: simpleAtomicIntrinsics_kernel.cu
$(CUDACC) -arch compute_11 $(CUDAFLAGS) -c simpleAtomicIntrinsics_kernel.cu
# end

是不是突然觉得很简单了?到这里会不会突然觉得,Makefile简直就是让计算机为人服务的一个典范。
转来的 cuda makefile 写法学习的更多相关文章
- 【APUE】Chapter16 Network IPC: Sockets & makefile写法学习
16.1 Introduction Chapter15讲的是同一个machine之间不同进程的通信,这一章内容是不同machine之间通过network通信,切入点是socket. 16.2 Sock ...
- Makefile基础学习
Makefile基础学习 理论知识 makefile关系到了整个工程的编译规则.一个工程中的源文件不计其数,并且按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文 ...
- Makefile之写demo时的通用Makefile写法
Makefile之写demo时的通用Makefile写法[日期:2013-05-22] 来源:CSDN 作者:gqb666 [字体:大 中 小] 前面的一篇文章Makefile之大型工程项目子目录M ...
- Makefile的学习笔记
Makefile的学习笔记 标签: makefilewildcard扩展includeshellfile 2012-01-03 00:07 9586人阅读 评论(2) 收藏 举报 分类: Linux ...
- theos的makefile写法
theos的makefile写法与其他linux/unix环境下的makefile写法大同小异,但是对于makefile不熟悉的在导入一些dylib或者framework的时候就会变得很蛋疼. 对于f ...
- 运用Autoconf和Automake生成Makefile的学习之路
作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的M ...
- 大型工程多个目录下的Makefile写法
1.前言 目前从事于linux下程序开发,涉及到多个文件,多个目录,这时候编译文件的任务量比较大,需要写Makefile.关于Makefile的详细内容可以参考网上流传非常广泛的<跟我一起写Ma ...
- [笔记] 基于nvidia/cuda的深度学习基础镜像构建流程 V0.2
之前的[笔记] 基于nvidia/cuda的深度学习基础镜像构建流程已经Out了,以这篇为准. 基于NVidia官方的nvidia/cuda image,构建适用于Deep Learning的基础im ...
- CUDA上深度学习模型量化的自动化优化
CUDA上深度学习模型量化的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参数 ...
随机推荐
- Java:网络编程之UDP的使用
java.net 类 DatagramSocket 此类表示用来发送和接收数据报包的套接字,数据报套接字是包投递服务的发送或接收点. java.net 类 DatagramPacket 此类表示数 ...
- Java:网络编程之IP、URL
java.net 类 InetAddress 此类表示互联网协议 (IP) 地址. 会抛出异常 UnknownHostException 直接已知子类: Inet4Address ...
- C++:构造函数的默认参数知识拓展
和普通函数一样,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值. 例9.3的问题也可以使用包含默认参数的构造函数来处理. [例9 ...
- 【转载】【JQuery学习】jQuery插件开发
JQuery做得最好的就是他的闭包和扩展性.超级简单的扩展方法,让更多的人可以轻松的开发定制自己的jQuery插件.下面的东西是转载过来当做学习材料的.虽然貌似有点古老,但是jQuery的变更一直都不 ...
- Docker基础技术:DeviceMapper
在上一篇介绍AUFS的文章中,大家可以看到,Docker的分层镜像是怎么通过UnionFS这种文件系统做到的,但是,因为Docker首选的AUFS并不在Linux的内核主干里,所以,对于非Ubuntu ...
- Vi Usage
标签: linux 编辑工具 md 快捷键以及常用命令(前面带:的是命令) h -> 左移一个字符 j -> 下移一行 k -> 上移一行 l -> 右移一个字符 w或Shif ...
- [原]poj-3009-Curling 2.0-dfs
题目太长就不贴了,题意: 上下左右四联通块,2表示起点,3表示终点,1为block,0为空地,每动一次冰壶,冰壶就会向推动的方向一直移动,直到碰到block或出界,如果碰到block就在block前停 ...
- 每天一个小算法(Shell Sort2)
希尔排序: 伪代码: input: an array a of length n with array elements numbered 0 to n − 1 inc ← round(n/2) wh ...
- Android ListView不响应OnItemClickListener解决办法
有时候,当ListView中的每一个item是自定义的View时,有可能会导致ListView的OnItemClickListener的listener无法调用,请看如下情况: 如果你的自定义List ...
- android 事件处理机制之requestDisallowInterceptTouchEvent
当手指触摸到屏幕时,系统就会调用相应View的onTouchEvent,并传入一系列的action.当有多个层级的View时,在父层级允许的情 况下,这个action会一直向下传递直到遇到最深层的Vi ...