Sí. En primer lugar, es mejor comprender lo que sucede cuando usa -gencode
. NVCC compilará su código de dispositivo de entrada varias veces, una para cada arquitectura de destino del dispositivo. Entonces, en su ejemplo, NVCC ejecutará la etapa de compilación 1 una vez para compute_20 y una vez para compute_13.
Cuando nvcc compila un archivo .cu, define dos macros de preprocesador, __CUDACC__
y __CUDA_ARCH__
. __CUDACC__
no tiene un valor, simplemente se define si cudacc es el compilador, y no se define si no lo es.
__CUDA_ARCH__
se define con un valor entero que representa la versión SM que se está compilando.
- 100 = compute_10
- 110 = compute_11
- 200 = compute_20
etc. Para citar la documentación NVCC incluye con el CUDA Toolkit:
La arquitectura macro identificación __CUDA_ARCH__
se le asigna una cadena de valor de tres dígitos xy0
(que termina en un literal 0) durante cada nvcc c etapa de ompilación 1 que compila para compute_xy
. Esta macro se puede usar en la implementación de funciones de GPU para determinar la arquitectura virtual para la cual se está compilando actualmente. El código de host (el código que no es GPU) no debe depender de él.
Así, en su caso en el que desea utilizar __ballot()
, usted puede hacer esto:
....
#if __CUDA_ARCH__ >= 200
int b = __ballot();
int p = popc(b & lanemask);
#else
// do something else for earlier architectures
#endif
Muchas gracias! Su trabajo :) ¿Y qué significa: CUDA_VERSION? ¿Es igual al número de versión de CUDA Toolkit? – Alex
Sí, [consulte aquí, por ejemplo] (http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/docs/online/group__CUDA__TYPES_g3c09bba9b1547aa69f1e346b82bcdb50.html). En realidad, es la versión principal multiplicada por 1000 + versión menor por 10, entonces 4.2 -> 4020. – harrism