2009-10-22 6 views
10

के तहत क्यूडा संकलन के लिए एक बहुत ही सरल मेकफ़ाइल कैसा दिखना चाहिए, मैं लिनक्स के तहत एक बहुत ही बुनियादी हैलो वर्ल्ड लेवल कूडा प्रोग्राम संकलित करना चाहता हूं।लिनक्स

  • गिरी: helloWorld.cu
  • मुख्य विधि: helloWorld.cpp
  • आम हैडर: मैं तीन फ़ाइलें helloWorld.h

तुम मुझे एक साधारण Makefile लिखा जा सका संकलित करने के लिए यह एनवीसीसी और जी ++ के साथ?

धन्यवाद,
गेबर

+0

कृपया चलाने के लिए, [बनाना] टैग के साथ अपने मेकअप से संबंधित प्रश्नों को टैग है। तर्क: http://meta.stackexchange.com/questions/24030/why-do-they-specify-makefile-tag-instead-of-make/26567#26567 –

उत्तर

4

बस मामले में, मेरा संस्करण यहां है। मैं मैक पर सीयूडीए परियोजनाओं को संकलित करने के लिए इसका उपयोग करता हूं, लेकिन मुझे लगता है कि यह लिनक्स के अनुरूप भी होगा। इसके लिए सीयूडीए एसडीके की आवश्यकता है।

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

हरम यह अजीब cutil.h के लिए देखता है जो मैं उपयोग नहीं करता .. – Nils

+1

मुझे इस पोस्ट की उम्र पता है, लेकिन यह जानकारी आसानी से CUDA <5.x के साथ काम करने के लिए आसान हो सकती है। असल में, स्वीकार्य उत्तर सामान्य.एमके फ़ाइल पर निर्भर है जो कटिल निर्भरता में "-क्टाइल" के रूप में खींच रहा है। किसी भी तरह, CUDA> = 5.x के लिए, common.mk का उपयोग अब आवश्यक/प्रोत्साहित नहीं किया जाता है, क्योंकि सभी मेकफ़ाइल स्वयं निहित (एस। चेंजलॉग) भी कहा जाता है। – Shadow

8

मैंने पहले Cuda की कभी नहीं सुना है, लेकिन ऑनलाइन प्रलेखन से यह रूप में अगर X.cu Xo में संकलित किया जा करने के लिए माना जाता है, इसलिए helloWorld.cu और HelloWorld होने लग रहा है। सीपीपी एक अच्छा विचार नहीं है। आपकी अनुमति के मैं नाम बदलने देंगे "कर्नेल" helloKernel.cu के साथ है, तो यह काम करना चाहिए:

 
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] 

(। ध्यान दें कि उन प्रमुख रिक्त स्थान टैब हैं)

अगर वह काम करता है, एक बरसाती कोट संस्करण का प्रयास करें:

 
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

क्या आप सामान्य सीपीपी फ़ाइलों पर एनवीसीसी का उपयोग कर सकते हैं? – teeks99

+0

मेरे पास एनवीसीसी तक पहुंच नहीं है, इसलिए मैं निश्चित नहीं हो सकता, लेकिन दस्तावेज़ीकरण के अनुसार, हाँ। सामान्य कंपाइलर कार्यों के लिए, एनवीसीसी ने जी ++ जैसे मानक कंपाइलर को नौकरी बंद कर दी है। – Beta

+0

@ teeks99 हाँ, मेरे पास एनवीसीसी तक पहुंच है और यह पूरी तरह से काम करता है। –

2

मेरे संस्करण, वर्बोज़ लेकिन पारदर्शी:

 
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

यहाँ एक उदाहरण मेरे वर्तमान परियोजना कैसा दिखता है। आप देख सकते हैं वहाँ कुछ ओपन पुस्तकालयों

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 

तो make ce और ./ce