P: “¿Por qué el código de paralelo de GPU es más complicado que el código de paralelo de CPU?”
TL; DR: Porque la programación GPGPU no es tan madura y estandarizada. Sin embargo, esto se está volviendo menos cierto a medida que se desarrollan nuevas bibliotecas de paralelización.
Los SMP han existido desde los años 60, e históricamente se convirtieron en una arquitectura convencional para la paralelización. Casi todos los sistemas de hoy los usan y tienen API de subprocesos como subprocesos POSIX. Herramientas de paralelización como Boost, OpenMP construido sobre las API de hilo. Desde que se crearon estas herramientas, se desarrollaron aún más bibliotecas abstractas, lo que facilita aún más la paralelización. Si intenta programar usando subprocesos sin procesar, la paralelización de la CPU no parecerá tan fácil (aunque sugeriría que lo intente, de esta manera sabrá lo que está sucediendo bajo el capó).
- ¿Cuál es la mejor herramienta para ejecutar un código de aprendizaje automático?
- En la clasificación binaria, ¿es una buena práctica siempre sobre / submuestrear su conjunto de datos para tener un número idéntico de muestras de las dos clases?
- ¿Cuál es un buen libro para estadísticas como una consideración de ML para principiantes?
- Cómo entrenar una red neuronal con grandes datos
- Visión por computadora: ¿cómo es la detección de objetos usando los puntos clave SIFT escala / rotacionalmente invariante?
Cuando se trata de GPU, históricamente se usaban principalmente para gráficos, de ahí su nombre. La paralelización manual no es necesaria si está realizando tareas gráficas comunes, solo puede usar bibliotecas como OpenGL. El uso de la programación de GPU de propósito general para otras tareas como HPC y la informática científica es una tendencia relativamente nueva. Las GPU no solo tienen una arquitectura de hardware diferente, sino que están diseñadas para la computación altamente orientada a SIMD. Esto significa que el paradigma de paralelización no es equivalente al de las CPU. Las GPU pueden realizar tareas específicas extremadamente rápido, pero no pueden realizar muchas otras tareas de programación comunes, especialmente aquellas con alta incertidumbre de ramificación. Es por eso que NVIDIA los llama aceleradores, en lugar de asesinos de CPU.
En 2011 tenía que ser doctorado y escribir un código CUDA complejo para acelerar la computación numérica, por ejemplo: cuda-convnet de Alex Krizhevsky. Hoy, puedes ser un estudiante de secundaria y escribir un programa acelerado por GPU más eficiente en 11 líneas de código Python. Hay muchas nuevas bibliotecas de aceleración de GPU en aumento que cubren más y más opciones de paralelización, por ejemplo: CuPY.
En resumen, las GPU no pueden hacer todas las tareas que las CPU pueden hacer, pero lo que pueden hacer, lo hacen mucho más rápido. Debido a sus diferencias de arquitectura, se necesita desarrollar nuevas abstracciones específicamente para la computación GPU. Hoy en día, hay muchas herramientas que puede usar para paralelizar / acelerar su código con facilidad, y en el futuro cada vez menos tareas requerirán una paralelización manual de bajo nivel.