zoukankan      html  css  js  c++  java
  • 转来的 cuda makefile 写法学习

      

      原文作者: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简直就是让计算机为人服务的一个典范。

     
    还记得有一个人在前面
  • 相关阅读:
    FEniCS 1.1.0 发布,计算算术模型
    Piwik 1.10 发布,增加社交网站统计
    淘宝褚霸谈做技术的心态
    CyanogenMod 10.1 M1 发布
    Druid 发布 0.2.11 版本,数据库连接池
    GNU Gatekeeper 3.2 发布
    Phalcon 0.9.0 BETA版本发布,新增大量功能
    EUGene 2.6.1 发布,UML 模型操作工具
    CVSps 3.10 发布,CVS 资料库更改收集
    Opera 移动版将采用 WebKit 引擎
  • 原文地址:https://www.cnblogs.com/zhaoyang10/p/4340118.html
Copyright © 2011-2022 走看看