原文作者: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为例。输入以下命令

      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了~

注:

  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已经在目录中):

         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 写法学习的更多相关文章

  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. leetcode:Unique Binary Search Trees

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  2. URAL1057. Amount of Degrees(DP)

    1057 简单的数位DP  刚开始全以2进制来算的 后来发现要找最接近x,y值的那个基于b进制的0,1组合 #include <iostream> #include<cstdio&g ...

  3. Git基础(三)

    本章 就开始和大家一起学习第三块内容:远程仓储的使用操作.要参与任何一个 Git 项目的协作,必须要了解该如何管理远程仓库.远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有 ...

  4. 【温故知新】c#异步编程模型(APM)--使用委托进行异步编程

    当我们用到C#类许多耗时的函数XXX时,总会存在同名的类似BeginXXX,EndXXX这样的函数. 例如Stream抽象类的Read函数就有 public abstract int Read(byt ...

  5. cocos2dx Android 环境搭建 以及 ndk调试

    最近在学习cocos2dx,真的很强大,使我们更专注于游戏趣味,免去了繁琐的底层框架代码. cocos2dx的最强大之处当然在于跨平台.跨平台首选当然是Android,好记性不如烂笔头,记下本文分享给 ...

  6. poj2891

    这道题就是扩展的中国剩余定理(模数不互质) 首先我们回忆一下中国剩余定理对于给定n个方程组x≡ai(mod pi) 令m=∏pi wi=m/pi,然后求解关于hi,ri的方程wi*hi+pi*ri=1 ...

  7. [ionic开源项目教程] - 手把手教你使用移动跨平台开发框架Ionic开发一个新闻阅读APP

    前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. 关注订阅号:TongeBlog ,查看移动端跨平台 ...

  8. 推荐 10 款最好的 Python IDE

    简述 Python 非常易学,强大的编程语言.Python 包括高效高级的数据结构,提供简单且高效的面向对象编程. Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器(IDE ...

  9. Qt环境搭建(Qt Creator)

    简述 上一节中介绍了如何进行Qt和Visual Studio的下载安装,随后演示了如何将Qt集成到Visual Studio中,并完成了我们第一个Qt小程序-Hello World.下面主要讲解如何利 ...

  10. 4.0之后的hibernate获取sessionFactory

    static{ Configuration config=new Configuration().configure(); ServiceRegistry resgistry = new Servic ...