c++ - studio - test cuda
Compilación de la biblioteca Eigen con nvcc(CUDA) (3)
Traté de compilar el siguiente programa (main.cu) con el nvcc (CUDA 5.0 RC):
#include <Eigen/Core>
#include <iostream>
int main( int argc, char** argv )
{
std::cout << "Pure CUDA" << std::endl;
}
Desafortunadamente, recibo un montón de advertencias y errores. Solo puedo explicar el uso de nvcc en lugar de la compilación de Microsoft.
¿Es esta suposición correcta? ¿Hay alguna forma de compilar Eigen con nvcc? (En realidad, no quiero transferir matrices Eigen a la GPU, solo accedo a sus miembros)?
Si no funciona la compilación de Eigen con nvcc, ¿hay alguna buena guía / tutorial sobre formas inteligentes de separar el código del host y del dispositivo?
Estoy usando CUDA 5.0 RC, Visual Studio 2008, Eigen 3.0.5. Para compilar el archivo .cu, utilicé ambos, el archivo de reglas incluido en CUDA, así como el paso de compilación personalizado producido por CMake. Utilizando el archivo de reglas CUDA, apunté a la compilación en la capacidad de cálculo 3.0.
Gracias por su consejo.
PD: Si compilo el mismo código con el compilador de host, funciona perfectamente.
Parece que uno de los principales contribuidores a Eigen es portarlo para que sea compatible con CUDA . La idea sería llamarlo desde el código del kernel.
Comenzando con Eigen 3.3, nvcc (7.5) tiene éxito al pasar correctamente el código Eigen a cl (MSVC 2013) (¿casi?). Por ejemplo, el siguiente código produce solo 11 advertencias:
#include <Eigen/Core>
#include <iostream>
int main()
{
std::cout << "Hello Eigen/t";
std::cout << EIGEN_WORLD_VERSION << "." << EIGEN_MAJOR_VERSION << "." << EIGEN_MINOR_VERSION << "/n";
std::cout << "Hello nvcc/t";
std::cout << __CUDACC_VER_MAJOR__ << "." << __CUDACC_VER_MINOR__ << "." << __CUDACC_VER_BUILD__ << "/n";
return 0;
}
Salida como se esperaba (Eigen 3.3rc1):
Hola Eigen 3.2.94
Hola nvcc 7.5.17
Pero una larga lista de advertencias (mira el historial de publicaciones si realmente quieres verlas).
Actualizar:
Desafortunadamente, el uso de CUDA 8.0 y VS2015 (con Eigen 3.2.9 y Eigen 3.3rc1) da como resultado errores de compilación nuevamente:
"operator =" ya ha sido declarado en el alcance actual eigen / src / Core / Block.h 111
"operator =" ya ha sido declarado en el alcance actual eigen / src / Core / Ref.h 89
Tan cerca...
Actualización 2:
Esto se ha corregido en la confirmación 59db051 y está disponible ya sea mediante el uso de la rama de desarrollo o esperando la salida de la v3.3 (o 3.3rc2).
NVCC invoca el compilador de host normal, pero no antes de que haya realizado un preprocesamiento, por lo que es probable que NVCC tenga dificultades para analizar el código de Eigen correctamente (especialmente si usa las características de C ++ 11, pero eso es poco probable ya que dice que VS2008 funciona).
Normalmente aconsejo separar el código del dispositivo y los contenedores en los archivos .cu
y dejar que el resto de la aplicación en .c
normales .c
/ .cpp
sea manejado por el compilador de host directamente. Consulte esta respuesta para obtener algunos consejos sobre cómo configurar esto con VS2008.