Emulador de GPU para programação CUDA sem o hardware [fechado]


111

Pergunta: Existe um emulador para uma placa Geforce que me permita programar e testar o CUDA sem ter o hardware real?


Info:

Estou tentando acelerar algumas simulações minhas em CUDA, mas meu problema é que nem sempre estou perto do meu desktop para fazer esse desenvolvimento. Eu gostaria de fazer algum trabalho no meu netbook, mas meu netbook não tem uma GPU. Até onde eu sei, você precisa de uma GPU com capacidade CUDA para executar o CUDA. Existe alguma forma de contornar isto? Parece que a única maneira é um emulador de GPU (que obviamente seria dolorosamente lento, mas funcionaria). Mas seja qual for a maneira de fazer isso, eu gostaria de ouvir.

Estou programando no Ubuntu 10.04 LTS.


Respostas:


39

Para quem busca a resposta em 2016 (e até 2017) ...


aviso Legal

  • Afinal, não consegui emular a GPU.
  • Pode ser possível usar gpuocelotse você satisfizer sua lista de dependências.

Tentei obter um 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).

Vou te contar o que aprendi.


  1. nvcccostumava ter uma -deviceemuopção no CUDA Toolkit 3.0

    Baixei o CUDA Toolkit 3.0, instalei-o e tentei executar um programa simples:

    #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;
    }

    Observe que no CUDA Toolkit 3.0 nvccestava no /usr/local/cuda/bin/.

    Descobri que tive dificuldades em compilá-lo:

    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".

    Descobri na Internet que se eu usar gcc-4.2ou similarmente antigo, gcc-4.9.2os erros podem desaparecer. Eu desisto.


  2. gpuocelot

    A resposta de Stringer tem um link para um gpuocelotsite de projeto muito antigo . Então, no início, pensei que o projeto estava abandonado em 2012 ou assim. Na verdade, foi abandonado alguns anos depois.

    Aqui estão alguns sites atualizados:

    Tentei instalar o gpuocelot seguindo o guia . No entanto, tive vários erros durante a instalação e desisti novamente. gpuocelotnão é mais compatível e depende de um conjunto de versões muito específicas de bibliotecas e software.

    Você pode tentar seguir este tutorial a partir de julho de 2015, mas não garanto que funcionará. Eu não testei.


  3. MCUDA

    A estrutura de tradução MCUDA é uma ferramenta baseada em Linux projetada para compilar efetivamente o modelo de programação CUDA para uma arquitetura de CPU.

    Pode ser útil. Aqui está um link para o site .


  4. Resíduos CUDA

    É um emulador para usar no Windows 7 e 8. Ainda não tentei. Parece que não está mais sendo desenvolvido (o último commit é de 4 de julho de 2013).

    Aqui está o link para o site do projeto: https://code.google.com/archive/p/cuda-waste/


  1. CU2CL

    Última atualização: 03/12/2017

    Como ashesy apontou nos comentários, CU2CL parece ser um projeto interessante. Parece ser capaz de traduzir o código CUDA em código OpenCL. Portanto, se sua GPU é capaz de executar código OpenCL, o projeto CU2CL pode ser do seu interesse.

    Links:


4
É uma vergonha! Por não fornecer um caminho lento, é muito difícil construir e testar aplicativos em qualquer máquina. Isso significa que os desenvolvedores devem evitar adicionar dependência ao Cuda. Ainda é utilizável por amadores e pesquisadores, para projetos pontuais. Não para aplicações reais para clientes.
precipitado

3
CU2CL parece estar ativo, e vale a pena dar uma olhada também.
precipitado de

1
1. nvcc -deviceemu
Nathan,

2
4. começou a CUDA Wastetrabalhar
Nathan

2
5. começou a CU2CLtrabalhar
Nathan,

41

Esta resposta pode ser tarde demais, mas vale a pena notar de qualquer maneira. O GPU Ocelot ( do qual eu sou um dos principais contribuidores ) pode ser compilado sem drivers de dispositivo CUDA (libcuda.so) instalados se você deseja usar o emulador ou backends LLVM. Eu demonstrei o emulador em sistemas sem GPUs NVIDIA.

O emulador tenta implementar fielmente as especificações PTX 1.4 e PTX 2.1, que podem incluir recursos que GPUs mais antigos não suportam. O tradutor LLVM se esforça para uma tradução correta e eficiente de PTX para x86, o que tornará o CUDA uma maneira eficaz de programar CPUs multicore, bem como GPUs. -deviceemutem sido um recurso obsoleto do CUDA há algum tempo, mas o tradutor LLVM sempre foi mais rápido.

Além disso, vários verificadores de correção são incorporados ao emulador para verificar: acessos de memória alinhados, acessos à memória compartilhada estão devidamente sincronizados e desreferenciamento de memória global acessa regiões alocadas de memória. Também implementamos um depurador interativo de linha de comando inspirado em grande parte pelo gdb para uma única etapa através de kernels CUDA, definir pontos de interrupção e pontos de controle, etc ... Essas ferramentas foram desenvolvidas especificamente para acelerar a depuração de programas CUDA; você pode achá-los úteis.

Desculpe pelo aspecto apenas do Linux. Começamos uma ramificação do Windows ( bem como uma porta do Mac OS X ), mas a carga de engenharia já é grande o suficiente para estressar nossas pesquisas. Se alguém tiver algum tempo e interesse, pode nos ajudar a fornecer suporte para o Windows!

Espero que isto ajude.


3
Oi - você ainda está por aí? Existe alguma documentação sobre como alguém constrói um programa com Ocelot em um ambiente de construção CUDA existente? Além disso, Ocelot funciona com Thrust?
Kerrek SB de

O código-fonte do GPU Ocelot mais recente pode ser encontrado no GitHub gtcasl / gpuocelot .
l --marc l

36

Você pode verificar também o projeto gpuocelot , que é um verdadeiro emulador no sentido de que PTX (bytecode no qual o código CUDA é convertido) será emulado.

Há também um tradutor LLVM, seria interessante testar se ele é mais rápido do que ao usar -deviceemu.


A parte triste é que é apenas para Linux. Que, embora eu seja um usuário Linux por padrão. uma pequena parte do desenvolvimento que faço é em máquinas Windows. O -deviceemu foi descontinuado, então a resposta jskaggz não se encaixa. no geral, essa parece ser a melhor resposta.
Narcolapser

14

O kit de ferramentas CUDA tinha um integrado até o ciclo de lançamento do CUDA 3.0. Se você usar uma dessas versões muito antigas do CUDA, certifique-se de usar -deviceemu ao compilar com nvcc.


4
O emulador CUDA está obsoleto, provavelmente é melhor você olhar para o gpuocelot.
Tom

1
Além disso, o emulador CUDA usa um encadeamento de sistema operacional nativo por encadeamento CUDA lógico que é terrivelmente ineficiente.
Stringer de

9

https://github.com/hughperkins/cuda-on-cl permite que você execute programas NVIDIA® CUDA ™ em GPUs OpenCL 1.2 (divulgação completa: sou o autor)


Posso executá-lo em uma CPU também?
Mateusz Piotrowski

GPU apenas. Necessita da GPU OpenCL 1.2 ou melhor.
Hugh Perkins

1
Você provavelmente pode executá-lo na CPU, usando jrprice.com/Oclgrind , mas acho que provavelmente não é o que você quis dizer ;-). Eu acho que o Coriander (o novo nome) provavelmente pode rodar na CPU OpenCL também, mas eu nunca testei isso. Pode precisar de um pouco de estímulo.
Hugh Perkins

3

Tenha cuidado ao programar usando -deviceemu, pois há operações que o nvcc aceitará enquanto estiver no modo de emulação, mas não quando realmente estiver sendo executado em uma GPU. Isso é encontrado principalmente na interação dispositivo-host.

E, como você mencionou, prepare-se para uma execução lenta.


0

GPGPU-Sim é um simulador de GPU que pode executar programas CUDA sem usar GPU. Eu criei uma imagem docker com GPGPU-Sim instalado para mim, caso isso seja útil.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.