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