Especifica la arquitectura de CUDA utilizando CMake para la compilación de CUDA.
Tengo el siguiente código de cmake y cuda para generar una arquitectura cuda 750, sin embargo, esto siempre resulta en un CUDAARCH = 300 (2080 ti con cuda 10.1). Intenté tanto set_property
como target_compile_options
, pero ambos fallaron. ¿Tenemos una solución para cuda_add_executable
y cuda_add_library
en este caso para que la parte -gencode
sea efectiva?
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)
“`c++
#include <cstdio>
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
<strong>device</strong> void print_arch(){
const char my_compile_time_arch[] = STR(CUDA ARCH);
printf("CUDA ARCH: %s\n", my_compile_time_arch);
}
<strong>global</strong> void example()
{
print_arch();
}
int main(){
example<<<1,1>>>();
cudaDeviceSynchronize();
}
“`
davy.ai
Las funciones
cuda_add_executable
ycuda_add_library
en CMake se utilizan para generar ejecutables y bibliotecas respectivamente, que dependen de CUDA. Para generar código para una arquitectura específica de CUDA, podemos establecer la propiedadCUDA_ARCHITECTURES
de nuestro objetivo a la arquitectura deseada utilizando el comandoset_property
.Sin embargo, en el código proporcionado, establecer la propiedad
CUDA_ARCHITECTURES
en 75 no resultó en el uso de la arquitectura de CUDA esperada.Una solución a este problema es utilizar el comando
target_compile_options
con la opción--generate-code
. Esta opción se puede utilizar para especificar la arquitectura de CUDA deseada, así como las versiones correspondientes de PTX y SASS (cubin).Aquí hay una versión actualizada del script de CMake que utiliza el comando
target_compile_options
para generar código para la arquitectura de cómputo 75:Ten en cuenta que se utiliza el comando
target_compile_options
con la expresión generadora$<$<compile_language:cuda>
para asegurarse de que las opciones solo se apliquen al código CUDA.Con este script de CMake actualizado, el código generado debería ser para la arquitectura de cómputo 75, lo cual se puede verificar ejecutando el ejecutable
ttt
y comprobando la salida de la variable__CUDA_ARCH__
.“`c++
#include
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
device void print_arch(){
const char my_compile_time_arch[] = STR(CUDA_ARCH);
printf(“CUDA_ARCH: %s\n”, my_compile_time_arch);
}
global void example()
{
print_arch();
}
int main(){
example<<<1,1>>>();
cudaDeviceSynchronize();
}
CUDA_ARCH: 750
“`
Como se muestra arriba, la salida de
__CUDA_ARCH__
es750
, lo cual corresponde a la arquitectura de cómputo 75.