Cómo ejecutar CUDA C/C++ en una notebook Jupyter en Google Colaboratory

¿Qué es CUDA?  
CUDA es un modelo creado por Nvidia para la plataforma de computación paralela y la interfaz de programación de aplicaciones. CUDA es la arquitectura de computación paralela de NVIDIA que permite aumentos dramáticos en el rendimiento de la computación al aprovechar la potencia de la GPU. 
¿Qué es Google Colaborator?  
Google Colab es un servicio gratuito en la nube y la característica más importante que distingue a Colab de otros servicios gratuitos en la nube es: ¡Colab ofrece GPU y es completamente gratis! ¡Con Colab puedes trabajar en la GPU con CUDA C/C++ gratis!
El código CUDA no se ejecutará en CPU AMD o gráficos Intel HD a menos que tenga hardware NVIDIA dentro de su máquina. En Colab puede aprovechar la GPU Nvidia además de ser un portátil Jupyter totalmente funcional con Tensorflow preinstalado y algunos otros ML/DL instrumentos.
 

Supongo que he terminado con la introducción. Configuremos nuestro entorno de aprendizaje.

Paso 1: Vaya a https://colab.research.google.com en el navegador y haga clic en Nuevo cuaderno. 

Create new notebook

Paso 2: Necesitamos cambiar nuestro tiempo de ejecución de CPU a GPU. Haga clic en Tiempo de ejecución > Cambiar tipo de tiempo de ejecución > Acelerador de hardware > GPU > Guardar.
 

change runtime

gpu

Paso 3: Desinstale por completo cualquier versión anterior de CUDA. Necesitamos actualizar la Instancia en la nube de CUDA.
 

!apt-get --purge remove cuda nvidia* libnvidia-*
!dpkg -l | grep cuda- | awk '{print $2}' | xargs -n1 dpkg --purge
!apt-get remove cuda-*
!apt autoremove
!apt-get update

Escriba el código en un bloque de código separado y ejecute ese código. Cada línea que comience con ‘!’, se ejecutará como un comando de línea de comando. 
 

Paso 4: instale la versión 9 de CUDA (puede simplemente copiarla en un bloque de código separado).
 

!wget https://developer.nvidia.com/compute/cuda/9.2/Prod/local_installers/cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64 -O cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64.deb
!dpkg -i cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64.deb
!apt-key add /var/cuda-repo-9-2-local/7fa2af80.pub
!apt-get update
!apt-get install cuda-9.2

Paso 5: ahora puede verificar su instalación de CUDA ejecutando el comando que se indica a continuación:
 

!nvcc --version

La salida será algo como esto: 
 

vcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Wed_Apr_11_23:16:29_CDT_2018
Cuda compilation tools, release 9.2, V9.2.88

Paso 6: Ejecute el comando dado para instalar una pequeña extensión para ejecutar nvcc desde las celdas de Notebook.

!pip install git+https://github.com/andreinechaev/nvcc4jupyter.git

Paso 7: Cargue la extensión usando el código que se proporciona a continuación:

%load_ext nvcc_plugin

Paso 8: Ejecute el código que se proporciona a continuación para verificar si CUDA funciona o no.

Ahora estamos listos para ejecutar el código CUDA C/C++ directamente en su computadora portátil. 
 

Nota importante: para verificar que el siguiente código funcione o no, escríbalo en un bloque de código separado y ejecútelo solo nuevamente cuando actualice el código y vuelva a ejecutarlo. 
 

Para ejecutar el código en su cuaderno, agregue la extensión %%cu al comienzo de su código. 
 

CPP

%%cu
#include <iostream>
    int
    main()
{
    std::cout << "Welcome To GeeksforGeeks\n";
    return 0;
}

Producción: 
 

Welcome To GeeksforGeeks

Le sugiero que pruebe el programa de encontrar el elemento máximo del vector para verificar que todo funcione correctamente.
 

CPP

%%cu
#include <cstdio>
#include <iostream>
 
    using namespace std;
 
__global__ void maxi(int* a, int* b, int n)
{
    int block = 256 * blockIdx.x;
    int max = 0;
 
    for (int i = block; i < min(256 + block, n); i++) {
 
        if (max < a[i]) {
            max = a[i];
        }
    }
    b[blockIdx.x] = max;
}
 
int main()
{
 
    int n;
    n = 3 >> 2;
    int a[n];
 
    for (int i = 0; i < n; i++) {
        a[i] = rand() % n;
        cout << a[i] << "\t";
    }
 
    cudaEvent_t start, end;
    int *ad, *bd;
    int size = n * sizeof(int);
    cudaMalloc(&ad, size);
    cudaMemcpy(ad, a, size, cudaMemcpyHostToDevice);
    int grids = ceil(n * 1.0f / 256.0f);
    cudaMalloc(&bd, grids * sizeof(int));
 
    dim3 grid(grids, 1);
    dim3 block(1, 1);
 
    cudaEventCreate(&start);
    cudaEventCreate(&end);
    cudaEventRecord(start);
 
    while (n > 1) {
        maxi<<<grids, block> > >(ad, bd, n);
        n = ceil(n * 1.0f / 256.0f);
        cudaMemcpy(ad, bd, n * sizeof(int), cudaMemcpyDeviceToDevice);
    }
 
    cudaEventRecord(end);
    cudaEventSynchronize(end);
 
    float time = 0;
    cudaEventElapsedTime(&time, start, end);
 
    int ans[2];
    cudaMemcpy(ans, ad, 4, cudaMemcpyDeviceToHost);
 
    cout << "The maximum element is : " << ans[0] << endl;
 
    cout << "The time required : ";
    cout << time << endl;
}

Producción: 
 

The maximum element is : 1338278816
The time required : 0.003392

Espero que sea útil para alguien.

Publicación traducida automáticamente

Artículo escrito por NehaMali y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *