2012-02-23 27 views
36

CUDA'yı içeren bir projeye başlamak için yardım arıyorum. Amacım, doğal g ++ derleyicide derleyebileceğim ancak CUDA kodunu kullanabileceğim bir projeye sahip olmak. Benim CUDA kodumu nvcc derleyicisinde derlemem gerektiğini anlıyorum, fakat benim anlayışımdan bir şekilde CUDA kodunu bir cubin dosyasına veya bir ptx dosyasına derleyebilirim.CUDA kodunu nasıl derleyip C++ projesine bağlayabilirim?

İşte sorularım şunlardır:

  1. nasıl Cubin dosyası veya ptx dosyasına derlemek için nvcc kullanırım? -C'ye falan ihtiyacım yok mu?
  2. Hangi dosya türünü kullanmak isterim?
  3. Projeyi birlikte derlemek ve birbirine bağlamak için g ++ komutları nelerdir?

aşağıdaki varsayalım:

  1. da onunla ilgili bir ana işlevi vardır ve cuda.h. içeren "main.cpp" adlı bir dosya var
  2. İçinde CUDA kodu olan "cudaFunc.cu" adlı başka bir dosyam var. Örneğin, main.cpp'de var olan iki tamsayı dizisi eklemek istediğimi varsayalım.

cevap

39

Sorunumu, bunlar dahil olmak üzere birkaç farklı gönderiyle çözebildim. 64 bit kitaplığa bağlanmak için 64 bit bir makine kullanıyorsanız unutmayın! Belli ki belli ki, ama benim gibi palyaçolar için, unuttuğum bir şey. İşte şimdi kullanıyorum make dosyası ... eğer bu make dosyasını sindirebilirseniz, cuda kodunun ve diğer G ++ kodunun ayrı bir derlemesi olan, yapmaya çalıştığım şeyi yapabilmelisiniz. Ayrıca, bazı sürümleri de g ++ derleyiciler gcc sahip olduğunu akılda tutmak (kullanıyorum g ++ - 4.4 ve benim için çalışıyor) Neyse, burada yapmak dosyasıdır ...

all: program 

program: cudacode.o 
    g++ -o program -L/usr/local/cuda/lib64 -lcuda -lcudart main.cpp cudacode.o 

cudacode.o: 
    nvcc -c -arch=sm_20 cudacode.cu 

clean: rm -rf *o program 

Umarım sizi ilk işim (yani bir .cu olarak kaydedildi) nvcc derleyici ve -c seçeneği kullanılarak cudacode derleme olduğunu görebilirsiniz (ayrıca -ARCH = sm_20 kaldırmak isteyebilirsiniz unutmayın). Bu bir cudacode.o oluşturdu. Sonra lib64 kütüphaneye -o seçeneği ve bağlantı ile g ++ derleyici kullanmak ve benim main.cpp derleme ve ardından cudacode.o bağlantı ile birlikte lcuda ve lcudart dosyalarının bağlantısını. Umarım bu birisine yardım eder!

+0

Aynı zamanda test ettiğiniz bir minimal '.cu' ve' .cpp' dosyalarını da sağlayabilir misiniz? Kullanılanlar hakkında merak, cpp, özellikle de '__global__' kernel '.cu' işlevlerini nasıl göreceksiniz. –

+1

Orada dikkatli, temiz hedef 'o' ile biten tüm dosyaları kaldıracaktır. Muhtemelen temiz: rm -rf * .o programı ' – gerowam

+1

Teşekkür ederim [Matthew] (https://stackoverflow.com/users/1226843/matthew), bu çok yardımcı oldu. – SRG

8

Cevabım to this recent question muhtemelen neye ihtiyacınız olduğunu açıklar.

ek birkaç not: Bir .cubin veya .ptx dosyaya .cu derlemek gerekmez

  1. . Bir .o nesne dosyasına derlemeniz ve daha sonra,. ++ dosyaları ile. ++ dosyalarından g ++ ile derlenmiş olan dosyaları birleştirmeniz gerekir. cudaFunc.cu da cuda çekirdek kodlarını koyarak ek olarak
  2. , ayrıca olası değil önerilir Eğer CUDA sürücü API kullanarak sürece (çekirdek başlattı o dosya, bir C veya C++ sarıcı işlevi koymak gerekir). Ayrıca bu sarıcı işlevinin prototipini içeren bir başlık dosyası ekleyin, böylece CUDA kodunu çağırmanız gereken C++ kodunuza ekleyebilirsiniz. Daha sonra dosyaları standart g ++ link hattınızı kullanarak birbirine bağlarsınız.

other answer numaramı tekrarlamaya başladım, bu yüzden sadece okumayı öneriyorum. :)

+0

Harrism, Cevabınız için teşekkür ederiz. Şimdi daha yakınım. Ben nvcc derleyici ve ccucode.cu olarak yeniden adlandırılmış .cu dosyasını kullanarak derleyebilirim ve cudacode.o nesnesine sahibim, ama şimdi g ++ üzerinde derlemeye çalıştığımda cudacode.o olsun: wrapper (int *, int *, int *, int) ': tmpxft_00000d3a_00000000-1_cudacode.cudafe1.cpp :(. text + 0x30): undefined' cudaMalloc 'referansı – Matthew

+0

libcudart'ı bağlamanız gerekir. Önce libcudart.so'nun nerede olduğunu anlamaya çalışıyorum - varsayılan olarak/usr/local/bin/cuda'ya girdiğimi düşünüyorum, ancak bu yükleme ile değişir. Yolu bulduktan sonra bunu bağlantı hattınıza ekleyin: '-L -lcudart' yolu. – harrism

+0

sen benim kahramanımsın! teşekkür ederim. Ben vardı bir ek sorun ben 64 bit makinede olduğum, bu yüzden lib64 dosyasına bağlantı vardı. sadece üç saat önce nasıl g ++ kullanmayı bilmiyordum, bir make dosyasının ne olduğunu bilmiyordum ve nasıl bağlanacağını bilmiyordum. Sanırım pencerelerde büyüdüğüm şey bu. – Matthew

7

Derlenmiş cuda nesne kodunu g ++ ile ilişkilendirmenin sorun yaratabileceğini buldum. Bunu şöyle derleyin:

all: 
nvcc cudafile.cu mainfile.cpp -o executable 

clean: rm -rf *.o 
+0

rm -f yerine rm -rf kullanıyorum çünkü * .o dosyaları normal dosyalar olmalı ve ölümcül hata yapmaktan korkuyorum: https://www.theregister.co.uk/2015/01/17/scary_code_of_the_week_steam_cleans_linux_pcs / –