2012-10-02 13 views
5

Jak mogę uzyskać dostęp do możliwości obliczeniowych CUDA (wersja) w czasie kompilacji przez #define? Na przykład, jeśli mogę użyć __ballot i skompilować zCzy mogę uzyskać obliczenia CUDA (wersja) w czasie kompilacji przez #define?

nvcc -c -gencode arch=compute_20,code=sm_20 \ 
     -gencode arch=compute_13,code=sm_13 
     source.cu 

mogę dostać wersję zdolności obliczeniowej w moim kodu przez #define do wyboru oddziału kodu z __ballot i bez?

Odpowiedz

15

Tak. Po pierwsze, najlepiej zrozumieć, co dzieje się podczas korzystania z -gencode. NVCC będzie kompilował twój kod urządzenia wejściowego wiele razy, raz dla każdej docelowej architektury urządzenia. W twoim przykładzie NVCC uruchomi kompilację 1 raz dla compute_20 i raz dla compute_13.

Gdy nvcc kompiluje plik .cu, definiuje dwa makra preprocesora: __CUDACC__ i __CUDA_ARCH__. __CUDACC__ nie ma wartości, jest po prostu zdefiniowane, jeśli jest to kompilator i nie jest zdefiniowane, jeśli nie jest.

__CUDA_ARCH__ jest zdefiniowana jako wartość całkowita reprezentująca kompilowaną wersję SM.

  • 100 = compute_10
  • 110 = compute_11
  • 200 = compute_20

itp Cytując dokumentacja nvcc dołączone CUDA Toolkit:

identyfikacji

architektura makro __CUDA_ARCH__ jest przypisany trzycyfrowy ciąg wartości xy0 (kończący się literalnym 0) podczas każdego nccc c ompilacja 1, która kompiluje się dla compute_xy. To makro może być używane w implementacji funkcji GPU do określania architektury wirtualnej, dla której jest aktualnie kompilowana. Kod hosta (kod inny niż GPU) nie może na nim polegać.

Tak, w przypadku, gdy chcesz używać __ballot(), można to zrobić:

.... 
#if __CUDA_ARCH__ >= 200 
    int b = __ballot(); 
    int p = popc(b & lanemask); 
#else 
    // do something else for earlier architectures 
#endif 
+0

Dzięki wielkie! Jego praca :) A co to znaczy: CUDA_VERSION? Czy jest równy numerowi wersji zestawu narzędzi CUDA? – Alex

+1

Tak, [patrz tutaj na przykład] (http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/docs/online/group__CUDA__TYPES_g3c09bba9b1547aa69f1e346b82bcdb50.html). W rzeczywistości jest to główna wersja razy 1000 + mniejsza wersja razy 10, więc 4.2 -> 4020. – harrism