Emulador de GPU para programación CUDA sin el hardware [cerrado]


111

Pregunta: ¿Existe un emulador para una tarjeta Geforce que me permita programar y probar CUDA sin tener el hardware real?


Info:

Estoy buscando acelerar algunas simulaciones mías en CUDA, pero mi problema es que no siempre estoy en mi escritorio para hacer este desarrollo. En su lugar, me gustaría trabajar un poco en mi netbook, pero mi netbook no tiene GPU. Hasta donde yo sé, necesitas una GPU con capacidad CUDA para ejecutar CUDA. ¿Hay alguna forma de evitar esto? Parecería que la única forma es un emulador de GPU (que obviamente sería tremendamente lento, pero funcionaría). Pero cualquiera que sea la forma de hacer esto, me gustaría escuchar.

Estoy programando en Ubuntu 10.04 LTS.


Respuestas:


39

Para aquellos que buscan la respuesta en 2016 (e incluso 2017) ...


Descargo de responsabilidad

  • Después de todo, no pude emular la GPU.
  • Podría ser posible usarlo gpuocelotsi satisface su lista de dependencias.

Intenté conseguir un emulador para BunsenLabs (Linux 3.16.0-4-686-pae # 1 SMP Debian 3.16.7-ckt20-1 + deb8u4 (2016-02-29) i686 GNU / Linux).

Te diré lo que he aprendido.


  1. nvccsolía tener una -deviceemuopción en CUDA Toolkit 3.0

    Descargué CUDA Toolkit 3.0, lo instalé e intenté ejecutar un programa simple:

    #include <stdio.h>
    
    __global__ void helloWorld() {
        printf("Hello world! I am %d (Warp %d) from %d.\n",
            threadIdx.x, threadIdx.x / warpSize, blockIdx.x);
    }
    
    int main() {
        int blocks, threads;
        scanf("%d%d", &blocks, &threads);
        helloWorld<<<blocks, threads>>>();
        cudaDeviceSynchronize();
        return 0;
    }

    Tenga en cuenta que en CUDA Toolkit 3.0 nvccestaba en formato /usr/local/cuda/bin/.

    Resultó que tuve dificultades para compilarlo:

    NOTE: device emulation mode is deprecated in this release
          and will be removed in a future release.
    
    /usr/include/i386-linux-gnu/bits/byteswap.h(47): error: identifier "__builtin_bswap32" is undefined
    
    /usr/include/i386-linux-gnu/bits/byteswap.h(111): error: identifier "__builtin_bswap64" is undefined
    
    /home/user/Downloads/helloworld.cu(12): error: identifier "cudaDeviceSynchronize" is undefined
    
    3 errors detected in the compilation of "/tmp/tmpxft_000011c2_00000000-4_helloworld.cpp1.ii".

    Descubrí en Internet que si usaba gcc-4.2o similar antiguo en lugar de gcc-4.9.2los errores podrían desaparecer. Me di por vencido.


  2. gpuocelot

    La respuesta de Stringer tiene un enlace a un gpuocelotsitio web de proyecto muy antiguo . Entonces, al principio pensé que el proyecto se abandonó en 2012 más o menos. En realidad, fue abandonado pocos años después.

    Aquí hay algunos sitios web actualizados:

    Intenté instalar gpuocelot siguiendo la guía . Sin embargo, tuve varios errores durante la instalación y me di por vencido nuevamente. gpuocelotya no es compatible y depende de un conjunto de versiones muy específicas de bibliotecas y software.

    Puede intentar seguir este tutorial de julio de 2015, pero no garantizo que funcione. No lo he probado.


  3. MCUDA

    El marco de traducción de MCUDA es una herramienta basada en Linux diseñada para compilar eficazmente el modelo de programación CUDA en una arquitectura de CPU.

    Puede ser útil. Aquí hay un enlace al sitio web .


  4. Residuos CUDA

    Es un emulador para usar en Windows 7 y 8. Sin embargo, no lo he probado. Ya no parece estar desarrollado (la última confirmación está fechada el 4 de julio de 2013).

    Aquí está el enlace al sitio web del proyecto: https://code.google.com/archive/p/cuda-waste/


  1. CU2CL

    Última actualización: 12.03.2017

    Como señaló Dashesy en los comentarios, CU2CL parece ser un proyecto interesante. Parece ser capaz de traducir código CUDA a código OpenCL. Entonces, si su GPU es capaz de ejecutar código OpenCL, entonces el proyecto CU2CL podría ser de su interés.

    Enlaces:


4
¡Es una vergüenza! Al no proporcionar una ruta lenta, es muy difícil crear y probar aplicaciones en cualquier máquina. Esto significa que los desarrolladores deben evitar agregar dependencia a Cuda. Todavía es utilizable por aficionados e investigadores, para proyectos únicos. No para aplicaciones reales para clientes.
dashesy

3
CU2CL parece estar activo, y también vale la pena analizarlo.
dashesy

1
1. nvcc -deviceemu
Nathan

2
4. se puso a CUDA Wastetrabajar
Nathan

2
5. se puso a CU2CLtrabajar
Nathan

41

Esta respuesta puede ser demasiado tarde, pero vale la pena señalarla de todos modos. GPU Ocelot ( de la cual soy uno de los principales contribuyentes ) se puede compilar sin los controladores de dispositivo CUDA (libcuda.so) instalados si desea utilizar el emulador o los backends LLVM. He demostrado el emulador en sistemas sin GPU NVIDIA.

El emulador intenta implementar fielmente las especificaciones PTX 1.4 y PTX 2.1 que pueden incluir características que las GPU más antiguas no admiten. El traductor LLVM se esfuerza por lograr una traducción correcta y eficiente de PTX a x86 que, con suerte, hará de CUDA una forma eficaz de programar tanto CPU multinúcleo como GPU. -deviceemuha sido una característica obsoleta de CUDA durante bastante tiempo, pero el traductor LLVM siempre ha sido más rápido.

Además, varios verificadores de corrección están integrados en el emulador para verificar: los accesos a la memoria alineados, los accesos a la memoria compartida están sincronizados correctamente y la desreferenciación de la memoria global accede a las regiones de memoria asignadas. También hemos implementado un depurador interactivo de línea de comandos inspirado en gran parte por gdb para realizar un solo paso a través de kernels CUDA, establecer puntos de interrupción y puntos de observación, etc. Estas herramientas fueron desarrolladas específicamente para acelerar la depuración de programas CUDA; puede resultarles útil.

Perdón por el aspecto exclusivo de Linux. Hemos comenzado una rama de Windows ( así como un puerto de Mac OS X ) pero la carga de ingeniería ya es lo suficientemente grande como para enfatizar nuestras búsquedas de investigación. Si alguien tiene tiempo e interés, ¡puede desear ayudarnos a brindar soporte para Windows!

Espero que esto ayude.


3
Hola, ¿sigues por aquí? ¿Existe alguna documentación sobre cómo se construye un programa con Ocelot en un entorno de construcción CUDA existente? Además, ¿Ocelot funciona con Thrust?
Kerrek SB

El código fuente de GPU Ocelot más reciente se puede encontrar a través de GitHub gtcasl / gpuocelot .
l --marc l

36

También puede consultar el proyecto gpuocelot , que es un verdadero emulador en el sentido de que se emulará PTX (código de bytes en el que se convierte el código CUDA).

También hay un traductor LLVM, sería interesante probar si es más rápido que cuando se usa -deviceemu.


La parte triste es que es solo para Linux. Lo cual, aunque soy un usuario de Linux por defecto. una pequeña parte del desarrollo que hago es en máquinas con Windows. El -deviceemu quedó obsoleto, por lo que la respuesta de jskaggz no encaja del todo. sobre todo, esta parece ser la mejor respuesta.
Narcolapser

14

El kit de herramientas de CUDA tenía uno integrado hasta el ciclo de lanzamiento de CUDA 3.0. Si usa una de estas versiones muy antiguas de CUDA, asegúrese de usar -deviceemu cuando compile con nvcc.


4
El emulador CUDA está obsoleto, probablemente sea mejor que mires gpuocelot.
Tom

1
Además, el emulador CUDA utiliza un hilo de SO nativo por hilo CUDA lógico, lo cual es terriblemente ineficiente.
Stringer

9

https://github.com/hughperkins/cuda-on-cl le permite ejecutar programas NVIDIA® CUDA ™ en GPU OpenCL 1.2 (divulgación completa: soy el autor)


¿Puedo ejecutarlo también en una CPU?
Mateusz Piotrowski

Solo GPU. Necesita OpenCL 1.2 GPU, o mejor.
Hugh Perkins

1
Probablemente pueda ejecutarlo en la CPU, usando jrprice.com/Oclgrind , pero supongo que probablemente no sea lo que quiso decir ;-). Supongo que Coriander (el nuevo nombre) probablemente también se puede ejecutar en CPU OpenCL, pero nunca lo he probado. Podría necesitar un poco de insistencia.
Hugh Perkins

3

Tenga cuidado cuando programe usando -deviceemu, ya que hay operaciones que nvcc aceptará mientras esté en modo de emulación, pero no cuando se ejecute en una GPU. Esto se encuentra principalmente en la interacción dispositivo-host.

Y como mencionaste, prepárate para una ejecución lenta.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.