博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过cuda的sdk学习makefile
阅读量:6413 次
发布时间:2019-06-23

本文共 4414 字,大约阅读时间需要 14 分钟。

  最近在学习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简直就是让计算机为人服务的一个典范。

转载于:https://www.cnblogs.com/FreeAquar/archive/2012/04/03/2430860.html

你可能感兴趣的文章
《深入理解Java虚拟机》第12章思维导图-Java内存模型与线程
查看>>
无限极分类原理与实现
查看>>
Spring Cloud 学习笔记 大纲
查看>>
前端工程师的方向性总结和建议
查看>>
我的年终总结
查看>>
go语言Json解析实用工具 - gjson
查看>>
75道程序员面试逻辑测试题(附答案)(2)
查看>>
vue学习笔记-个人博客(二)
查看>>
Generating Pods project failed
查看>>
搭建mysql主从复制教程
查看>>
Electron-如何保护源码?
查看>>
mysql索引
查看>>
高效 实现长连接保活:手把手教你实现 自适应的心跳保活机制
查看>>
webpack一些简单配置讲解
查看>>
18.11.1 - 基础(快速排序)
查看>>
ES6--var-let-const(ms)
查看>>
LeetCode 第 23 号问题:合并 K 个排序链表
查看>>
填坑-十万个为什么?(5)
查看>>
区块链软件公司:区块链中的签名怎样签?
查看>>
css百分比的应用
查看>>