轉來的 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了~

注:

  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簡直就是讓計算機爲人服務的一個典範。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章