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.
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
@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? –
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