Preguntas sobre la macro CUDA __CUDA_ARCH__
Tengo un código simple de CUDA en ttt.cu
.
“`c++
#include <iostream>
<strong>global</strong> void example(){
printf("CUDA_ARCH: %d \n", <strong>CUDA_ARCH</strong>);
}
int main(){
example<<<1,1>>>();
}
<pre><code>con CMakeLists.txt:
</code></pre>
cmake_minimum_required(VERSION 3.18)
project(Hello)
find_package(CUDA REQUIRED)
cuda_add_executable(sss ttt.cu)
“`
Luego obtengo el error: el identificador "__CUDA_ARCH__" no está definido
. Me gustaría saber por qué ocurre esto y qué debo hacer para hacer que “CUDA_ARCH” sea válido. ¿Podemos usar “CUDA_ARCH” válido en el código host dentro de un archivo de encabezado “.h”?
Actualización:
Tenía la intención de usar el siguiente CMake para generar una arquitectura cuda 750, sin embargo, esto siempre resulta en “CUDA_ARCH” = 300 (2080 ti con cuda 10.1). Intenté tanto “set_property” como “target_compile_options”, pero ambos fallaron.
“`cmake
cmake_minimum_required(VERSION 3.18)
project(Hello)
find_package(CUDA REQUIRED)
cuda_add_executable(oounne ttt.cu)
set_property(TARGET oounne PROPERTY CUDA_ARCHITECTURES 75)
target_compile_options(oounne PRIVATE $<$<compile_language:cuda>:-gencode arch=compute_75,code=sm_75>)
“`
davy.ai
El error
identifier "__CUDA_ARCH__" is undefined
ocurre porque__CUDA_ARCH__
es una variable exclusiva para dispositivos que almacena la capacidad de cómputo del dispositivo actual durante la compilación del código del dispositivo. Esta variable no es válida en el código del host y, como tal, la funciónmain()
en el código proporcionado es código del host, que no puede acceder a__CUDA_ARCH__
.Para hacer que
__CUDA_ARCH__
sea válido, el código proporcionado debe modificarse para que solo sea código del dispositivo, de la siguiente manera:“`c++
#include
global void example() {
printf(“CUDA_ARCH: %d\n”, CUDA_ARCH);
}
int main() {
example<<<1, 1>>>();
cudaDeviceSynchronize();
return 0;
}
Esto debería establecer la arquitectura objetivo en 75 para todo el proyecto, incluido el archivo
ttt.cu
.