¿Se puede usar C ++ 17 junto con CUDA usando clang?

 C Programming >> Programación C >  >> Tags >> Clang
¿Se puede usar C ++ 17 junto con CUDA usando clang?

Sí, como ya habrás adivinado, la interfaz de CUDA clang está realmente a la cabeza en compatibilidad con funciones de C++, incluso en el código del dispositivo. Ya estaba en el pasado, introduciendo funciones de C++ 14 antes que NVCC, lo que pasó desapercibido para la comunidad.

Toma este C++17, innecesariamente modificado if constexpr , fragmento:Fibo

#include <cuda_runtime.h>
#include <cstdio>

constexpr unsigned
fibonacci(const unsigned x) {
    if constexpr (false)
    {
        return 0u;
    }
    if( x <= 1 )
        return 1;
    return fibonacci(x - 1) + fibonacci(x - 2);
}

__global__
void k()
{
    constexpr unsigned arg = fibonacci(5);
    printf("%u", arg);
}

int main()
{
    k<<<1,1>>>();
    return 0;
}

Ya se ejecuta con clang++ -std=c++17 -x cuda :https://cuda.godbolt.org/z/GcIqeW

Sin embargo, para este ejemplo específico, las lambdas extendidas de C++17 y la constexpr relajada de C++14 son tan importantes en el C++ moderno, que incluso en los modos C++11 y C++14 de NVCC 8.0+ se agregaron banderas para habilitar esas características ya:https://devblogs.nvidia.com/new-compiler-features-cuda-8/

Eso significa que el ejemplo anterior compila, por ejemplo, con NVCC 9.2 incluso sin __device__ calificadores al eliminar la demostración de C++17 if constexpr construir y agregar -std=c++14 --expt-relaxed-constexpr banderas.

Aquí hay una lista sobre el soporte estándar de C++ en el lado del dispositivo para nvcc y clang -x cuda :https://gist.github.com/ax3l/9489132#device-side-c-standard-support (NVCC 11.0 ahora es compatible con C++17 del lado del dispositivo).


Actualmente se admite hasta C++14 en el código del dispositivo (introducido en CUDA 9)

--std {c++03|c++11|c++14}

Opciones para especificar el comportamiento del compilador/vinculador

Sin embargo, si su host solo usa C ++ 17, debería ser posible usar una compilación separada y vincularlos con la biblioteca. Compilación y vinculación separadas del código de dispositivo CUDA C++

Actualización:formato y más información