es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>)
“`

Tags:  , , , ,

Answer

  1. Avatar for 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ón main() 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;
    }


    En este código actualizado, la función `example()` es código del dispositivo, que puede acceder a `__CUDA_ARCH__`. Observa la adición de `cudaDeviceSynchronize()` después del lanzamiento del kernel para asegurarse de que el kernel se haya completado antes de que el programa finalice. En cuanto al uso de `__CUDA_ARCH__` en un archivo de encabezado, no se recomienda. La variable `__CUDA_ARCH__` solo es válida durante la compilación del código del dispositivo, y el archivo de encabezado puede incluirse tanto en el código del host como en el código del dispositivo. Para evitar este problema, cualquier código que dependa de `__CUDA_ARCH__` debe colocarse en el código del dispositivo. En cuanto al uso de `set_property` o `target_compile_options` para establecer la arquitectura objetivo en 75, podría haber varias razones por las que esto falló. Una posibilidad es que la versión instalada de CUDA no admita la arquitectura 75. Otra posibilidad es que pueda haber configuraciones de arquitectura conflictivas en otros lugares del proyecto o del sistema de compilación. En general, se recomienda utilizar `set(CMAKE_CUDA_ARCHITECTURES)` para establecer las arquitecturas objetivo del proyecto, de la siguiente manera: ```cmake cmake_minimum_required(VERSION 3.18) project(Hello) find_package(CUDA REQUIRED) set(CMAKE_CUDA_ARCHITECTURES 75) cuda_add_executable(oounne ttt.cu)

    Esto debería establecer la arquitectura objetivo en 75 para todo el proyecto, incluido el archivo ttt.cu.

Comments are closed.