2013-07-31 6 views
5

Próbuję skompilować trochę kodu z CUDA SDK 5.5 RC i g ++ 4.7 na MacOS X 10.8. Jeśli dobrze rozumiem, CUDA 5.5 powinna działać z g ++ 4.7. Patrząc na /usr/local/cuda/include/host_config.h powinien on działać nawet z g ++ 4.8.CUDA 5.5 RC z g ++ 4.7 i 4.8: __int128 błędy kompilacji

Odnośnie g ++ 4.8: Próbowałem skompilować następujący program:

// example.cu 
#include <stdio.h> 
int main(int argc, char** argv) { 
    printf("Hello World!\n"); 
    return 0; 
} 

Ale to się nie powiedzie:

$ nvcc example.cu -ccbin=g++-4.8 
/usr/local/Cellar/gcc48/4.8.1/gcc/include/c++/4.8.1/cstdlib(178): error: identifier "__int128" is undefined 
/usr/local/Cellar/gcc48/4.8.1/gcc/include/c++/4.8.1/cstdlib(179): error: identifier "__int128" is undefined 
2 errors detected in the compilation of "/tmp/tmpxft_00007af2_00000000-6_example.cpp1.ii". 

Ten sam program kompiluje i działa z g ++ 4.7:

$ nvcc example.cu -ccbin=g++-4.7 
$ ./a.out 
Hello World! 

Ale jeśli zawieram <ograniczenia> ...

// example_limits.cu 
#include <stdio.h> 
#include <limits> 
int main(int argc, char** argv) { 
    printf("Hello World!\n"); 
    return 0; 
} 

... nawet nie g ++ 4.7. Dziennik budowy znajduje się tutaj: https://gist.github.com/lysannschlegel/6121347
Tutaj można znaleźć również kilka innych błędów, nie jestem całkowicie pewien, czy wszystkie są związane z brakiem __int128.
Może się zdarzyć, że inna biblioteka standardowa zawiera również kompilację opartą na g ++ 4.7, której limity są tym, za które się potknąłem.

Próbowałem również g ++ 4.5, ponieważ zdarzyło mi się mieć go również na moim komputerze (nigdy nie możesz mieć zbyt wielu wersji kompilatora, prawda?) I to działa.

Czy mogę się spodziewać, że zostanie to naprawione w wydaniu CUDA 5.5? (Mam nadzieję, że NVIDIA po prostu nie wróci do obsługi gcc tylko do wersji 4.6.)
Czy jest jakiś sposób obejścia tego w międzyczasie?

UPDATE:

Jak @talonmies zaznacza poniżej, nie jest to ściśle błąd w CUDA 5.5 na MacOS jak gcc nie jest oficjalnie wspierany na MacOS. Ponieważ wiele bibliotek innych firm nie obsługuje poprawnie obsługiwanych bibliotek narzędzi, clang lub llvm-gcc (llvm-gcc z wersji 2007 ...), nadal istnieje potrzeba, aby gcc działał. gcc do 4.6 powinno działać poprawnie (testowałem tylko 4.5).
Można dokonać gcc 4.7 pracę używając sztuczki podkreślił @BenC w komentarzach:

$ cat compatibility.h 
#undef _GLIBCXX_ATOMIC_BUILTINS 
#undef _GLIBCXX_USE_INT128 

$ nvcc example_limits.cu -ccbin=g++-4.7 --pre-include compatibility.h 

nvcc z gcc 4.8 jeszcze dławiki na __int128 w cstdlib. Domyślam się, że cstdlib jest zawarty przed włączeniem plików -pre-include.

+0

Czy próbowałeś dodać '#undef _GLIBCXX_ATOMIC_BUILTINS' i' #undef _GLIBCXX_USE_INT128'? Jest to znany błąd CUDA dla GCC 4.8, a pakujący/programiści muszą poprawiać pliki CUDA lub ich projekty (patrz [tutaj] (https://projects.archlinux.org/svntogit/community.git/tree/trunk/PKGBUILD ? h = packages/cuda) na przykład). – BenC

+0

@BenC Gdzie należy umieścić te klucze? Próbowałem na końcu mojego cuda/include/host_config.h jak na wspomnianej poprawce, ale to nie pomaga. Kiedy mówisz, że to znany błąd, masz na myśli, że występuje on również na innych platformach? –

+0

Działa na Linuksie. Wystąpiły problemy z GCC 4.7 i 4.8. Jak zauważyli @talonmies, nie ma gwarancji, ale do tej pory łatki wydają się być dość proste do naprawienia tego problemu (przynajmniej w systemie Linux). Mniej inwazyjne rozwiązanie (testowane przy użyciu GCC 4.7) polega na dodaniu tych linii do osobnego nagłówka, który można dołączyć za pomocą '--pre-include your_header.h' podczas kompilacji (jak [this] (https://www.udacity.com/wiki/cs344/troubleshoot_gcc47)). Nie próbowałem jeszcze GCC 4.8, ale do tej pory nie miałem żadnego problemu z GCC 4.7 i CUDA 5.0/5.5. – BenC

Odpowiedz

4

Trzeba czytać MacOS podręczny przewodnik bardziej dokładnie:

Aby użyć CUDA w systemie, trzeba będzie zainstalowane następujące:

CUDA stanie GPU

‣ Mac OSX v. 10.7.5 lub nowszy

‣ gcc lub Clang kompilator i toolchain zainstalowany przy użyciu Xcode

‣ NVIDIA CUDA Toolkit (dostępne w http://developer.nvidia.com/cuda-downloads)

Oznacza to dokładnie to, co mówi - użyć kompilatora (s) dostarczane z Xcode. Nie używaj samodzielnie zbudowanej wersji gcc, ponieważ nie ma gwarancji, że działa, nawet jeśli ta wersja kompilatora jest wymieniona jako obsługiwana na innych platformach i jeśli wydaje się, że trywialny kod jest poprawnie skompilowany.

+2

Chociaż jest to technicznie poprawne, to nie rozwiązuje mojego problemu. Miałem problemy z kompilowaniem bibliotek innych firm (takich jak OpenCV) z nvcc i Xlv's llvm-gcc przez długi czas, co sprawiło, że przeniosłem się do "prawdziwego" gcc, który nie ma 6 lat i który rozumie nowe polecenie gcc opcje linii. Wygląda jednak na to, że dalsze posuwanie się dalej nie jest możliwe. –

+1

@LysannSchlegel: Czuję twój ból. Po prostu zrezygnowałem z próby wykonania poważnego rozwoju na OS X z tego powodu. Brak odpowiedniego nowoczesnego kompilatora C++ i kompilatora Fortran to dla mnie breakery. NVIDIA nie zapewni wsparcia ani nie przyjmie raportów o błędach w odniesieniu do kodu zbudowanego za pomocą innych elementów niż obsługiwane kompilatory systemowe. Skała, spotkaj twarde miejsce ... – talonmies

Powiązane problemy