2012-10-02 9 views

Respuesta

15

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 
+0

Muchas gracias! Su trabajo :) ¿Y qué significa: CUDA_VERSION? ¿Es igual al número de versión de CUDA Toolkit? – Alex

+1

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

Cuestiones relacionadas