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
Dzięki wielkie! Jego praca :) A co to znaczy: CUDA_VERSION? Czy jest równy numerowi wersji zestawu narzędzi CUDA? – Alex
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