2009-10-22 8 views
10

Tôi muốn biên dịch một chương trình Cuda cấp độ hello cơ bản trên Linux. Tôi có ba tác phẩm:Làm thế nào nên một Makefile rất đơn giản trông giống như cho Cuda biên dịch theo linux

  • hạt nhân: helloWorld.cu
  • phương pháp chính: helloWorld.cpp
  • tiêu đề phổ biến: helloWorld.h

bạn có thể viết cho tôi một Makefile đơn giản để biên dịch này với nvcc và g ++?

Cảm ơn,
Gabor

+0

Xin vui lòng, thẻ câu hỏi make-liên quan của bạn với [làm cho] thẻ. Lý do: http://meta.stackexchange.com/questions/24030/why-do-they-specify-makefile-tag-instead-of-make/26567#26567 –

Trả lời

4

Chỉ trong trường hợp, đây là biến thể của tôi. Tôi sử dụng nó để biên dịch các dự án CUDA trên Mac, nhưng tôi nghĩ nó cũng phù hợp với Linux. Nó yêu cầu CUDA SDK.

BINDIR = ./ # places compiled binary in current directory 
EXECUTABLE := helloWorld 

CCFILES := helloWorld.cpp 
CUFILES := helloWorld.cu 

# an ugly part - setting rootdir for CUDA SDK makefile 
# look for common.mk - I don't know where SDK installs it on Linux - 
# and change ROOTDIR accordingly 
ROOTDIR := /Developer/GPU\ Computing/C/common 

include $(ROOTDIR)/../common/common.mk 
+0

Hrmm nó trông cho cutil.h lạ mà tôi không sử dụng .. – Nils

+1

Tôi biết tuổi của bài đăng này, nhưng thông tin này có thể có ích cho những người bắt đầu làm việc với CUDA <5.x. Trên thực tế, câu trả lời được chấp nhận là dựa vào tệp common.mk đang kéo phụ thuộc cutil là "-lcutil". Nhưng dù sao, đối với CUDA> = 5.x, việc sử dụng common.mk không còn được yêu cầu/khuyến khích, vì tất cả Makefiles được cho là tự chứa (s. Cũng là Changelog) – Shadow

8

Tôi chưa bao giờ nghe nói về CUDA trước đó, nhưng từ tài liệu trực tuyến có vẻ như nếu X.cu là vụ phải được biên dịch vào Xô, vì vậy có helloWorld.cu và HelloWorld. cpp không phải là một ý tưởng hay. Với sự cho phép của bạn tôi sẽ đổi tên "hạt nhân" helloKernel.cu, sau đó điều này sẽ làm việc:

 
NVCC = nvcc 

helloWorld.o: helloWorld.cpp helloWorld.h 
    $(NVCC) -c %< -o [email protected] 

helloKernel.o: helloKernel.cu 
    $(NVCC) -c %< -o [email protected] 

helloWorld: helloWorld.o helloKernel.o 
    $(NVCC) %^ -o [email protected] 

(. Lưu ý rằng những không gian hàng đầu là tab)

Nếu thành công, hãy thử một phiên bản tinh quái:

 
NVCC = nvcc 

helloWorld.o: %.o : %.cpp %.h 
helloKernel.o: %.o : %.cu 

%.o: 
    $(NVCC) -c %< -o [email protected] 

helloWorld: helloWorld.o helloKernel.o 
    $(NVCC) %^ -o [email protected] 
+0

Bạn có thể sử dụng nvcc trên các tệp cpp bình thường không? – teeks99

+0

Tôi không có quyền truy cập vào nvcc, vì vậy tôi không thể chắc chắn, nhưng theo tài liệu, có. Đối với các tác vụ trình biên dịch thông thường, nvcc đưa công việc cho một trình biên dịch chuẩn như g ++. – Beta

+0

@ teeks99 có, tôi có quyền truy cập vào nvcc và nó hoạt động hoàn hảo. –

2

phiên bản Mỹ, tiết nhưng trong suốt:

 
myapp: myapp.o 
    g++ -fPIC -o [email protected] $< -L /usr/local/cuda/lib -lcudart 

myapp.o: myapp.cu 
    /usr/local/cuda/bin/nvcc --compiler-options -fno-strict-aliasing \ 
    -I/usr/local/cuda/include \ 
    -DUNIX -O2 -o [email protected] -c $< 

matrixMul: matrixMul.o 
    g++ -fPIC -o [email protected] $< -L /usr/local/cuda/lib -lcudart 

# It MUST be named .cu or nvcc compiles as regular C !!! (no __global__) 
matrixMul.o: matrixMul.cu 
    /usr/local/cuda/bin/nvcc --compiler-options -fno-strict-aliasing \ 
    -I/usr/local/cuda/include \ 
    -DUNIX -O2 -o [email protected] -c $< 
1

Dưới đây là một ví dụ những gì dự án hiện tại của tôi trông như thế nào. Như bạn có thể thấy có một vài thư viện OpenGL

ce : cudaExample.c cudaExample.h 
    cp cudaExample.c cudaExample.cu 
    /usr/local/cuda/bin/nvcc -arch=sm_20 -o ce -lglut -lGL -lGLU -lXext -lXmu -lX11 -lm cudaExample.cu 

sau đó chạy make ce./ce