2011-03-09 14 views
8

Me di cuenta de que una GPU puede tener cientos de núcleos, de modo que un cálculo en paralelo puede acelerarse en gran medida con ellos. Parece que en un kernel de sistema operativo, no se utilizan algoritmos paralelos para la aceleración.¿Tiene sentido ejecutar cálculos del nivel de kernel del sistema operativo en una GPU?

Las personas hacen cálculos paralelos en usuarios-ritmo con OpenMP, pero ¿por qué no en kernel-space? Supongo que hay muchas tareas dentro del SO que requieren procesamiento paralelo, como procesar múltiples conexiones de red y paquetes, realizar operaciones de criptografía, administrar la memoria, buscar ... Algunos firewalls filtran y monitorean los flujos de red al hacer coincidir patrones, sistemas operativos orientados a la investigación también puede analizar el programa antes de ejecutarlo, lo que lleva mucho tiempo y puede ser paralelizable.

¿Por qué los sistemas operativos no usan GPU para mejorar su rendimiento y rendimiento? ¿Tiene sentido ejecutar cálculos de sistema operativo en la GPU?

Respuesta

17

Las aplicaciones de procesamiento paralelo de GPU requieren que ejecute exactamente la misma operación cientos de veces. Además, está limitado en las operaciones que puede hacer: las sucursales generalmente no son una opción, ni están atravesando cadenas de punteros.

La mayoría de las operaciones del núcleo no encajan en este modelo; gran parte de lo que está haciendo el kernel es administrar recursos a través de indicadores, incluido el bloqueo. Esto no encaja en absoluto en el modelo GPU. En cuanto a las otras operaciones que citas:

  • Criptografía: GPU son grandes para tratar de grieta los códigos de cifrado, pero ese no es el trabajo del núcleo. Por lo general, ejecuta una operación de cifrado una vez. En este caso, la CPU es mucho más rápida, ya que solo necesita hacerlo una vez.
  • Procesamiento del tráfico de la red: los paquetes llegan en diferentes momentos y deben procesarse con baja latencia. La GPU puede ser capaz de hacer un procesamiento de cortafuegos sin estado, pero necesitaría agrupar paquetes y hacer que funcionen en unos pocos cientos a la vez para que haya un beneficio; esto perjudica la latencia y la inestabilidad, por lo que el trabajo queda en la CPU. Además, el seguimiento con estado requiere acceso compartido y bloqueado a las tablas de seguimiento de la conexión, algo que una GPU no es capaz de hacer.
  • Administración de la memoria: esta es una operación con mucho puntero con muchos bloqueos, por lo que no es algo para lo que una GPU sea remotamente adecuada. Además, la latencia es crítica, y enviar un trabajo a una GPU implica mucha latencia.
  • Buscando: Los núcleos de SO modernos no realizan búsquedas. Ese es un trabajo para el espacio de usuario, y de nuevo, es un trabajo muy puntero.

Las GPU son ideales para kernels matemáticos donde el rendimiento es primordial y la latencia es un problema menor: simulaciones numéricas, ese tipo de cosas. En general, no son adecuados para la administración de datos, o donde la latencia es crítica, que es exactamente el tipo de cosas que hacen los kernels de sistemas operativos. Esta es la razón por la que los sistemas operativos generalmente no hacen uso de la aceleración de GPU.

Existen otros tipos de aceleración de hardware que los núcleos de SO pueden usar, y lo hacen: algunas máquinas tienen núcleos de hardware criptográfico especiales diseñados específicamente para realizar cálculos de cifrado puntuales de forma rápida. El núcleo puede hacer un buen uso de estos, ya que se adaptan mejor a los problemas específicos que enfrenta el kernel.

+0

Gracias, acepto que la latencia es la debilidad de la computación GPU. El software PacketShader reclama una latencia de cientos de microsegundos, ¿no está seguro de si todavía es muy lento? La criptografía, no sé si los servidores de archivos utilizan cifrado fs/disco o no, la GPU puede ayudar en este tipo de casos. Acerca del puntero, parece que CUDA 4.0 tiene un espacio de dirección de memoria unificada que incluye no solo múltiples memorias GPU, sino también la memoria principal, ¿no sirve de nada? Tengo curiosidad de por qué las personas no ponen funcionalidades útiles en el kernel, especialmente las cosas de seguridad, creo que el kernel es lo único en lo que podemos confiar ... –

+0

Podemos confiar en el kernel porque la gente lo pone lo menos posible: Incluso si el servidor usa un disco encriptado, enviar un solo sector a la GPU para su descifrado es más lento que hacerlo en la CPU. Es difícil acumular suficientes operaciones para que el paralelismo de la GPU sea útil. E incluso si tiene un espacio de direcciones unificado, las GPU simplemente no están diseñadas para etapas de direccionamiento de múltiples punteros. Una vez más, las operaciones típicas en el kernel no son adecuadas para aprovechar las fortalezas de la GPU, por lo que obtienen el efecto completo de las debilidades de la GPU. – bdonlan

4

Su impresión de que los granos no se paralelizan es incorrecta. Los núcleos modernos se han adaptado bastante bien a las CPU multinúcleo/multihilo y se ocupan de casi todo de manera "paralela" en ese sentido.

En cuanto a las GPU, son muy diferentes en cuanto a las instrucciones que pueden procesar desde las CPU. Más adaptado para vector computaciones de punto flotante en particular. El kernel de Linux esencialmente nunca usa ese tipo de operación. Las excepciones son crypto y algún código de ataque que se pueda adaptar bien a operaciones de tipo vector (y probablemente a otras, pero aún muy limitadas).

Por lo tanto, en general, el kernel en sí no necesita realmente el tipo de operaciones que proporcionan las GPU. Para los tiempos que los necesita, encontrará núcleos de CPU modernos que incluyen conjuntos de instrucciones específicas (como SSE, AES-NI, etc.) o coprocesadores/motores de descarga dedicados (de nuevo para cálculos criptográficos y de raid, verificaciones de paquetes de red, etc. ...).

+0

Creo que los CPU modernos no tienen suficientes núcleos de procesamiento paralelo del sistema operativo. Un kernel de sistema operativo puede manejar múltiples colas de red con diferentes núcleos, pero el número de colas está limitado por los códigos #. Esto limitaría la escalabilidad y el rendimiento. Noté que hay un proyecto sobre redes GPU: PacketShader. Busca reenvío de IP en GPU y es muy rápido. Otro problema es que procesar solicitudes múltiples no es todo el procesamiento paralelo. En cálculos paralelos como OpenMP, es más frecuente dividir una única solicitud y manejar las tareas pequeñas en cada núcleo. –

-1

Sí, estoy de acuerdo con Mat. El cuello de botella del mundo de computación actual es el sistema operativo que se ejecuta en hilos virtuales. Esto crea una demanda en el espacio de usuario para crear aplicaciones que usan GPU. Sin embargo, el núcleo todavía ejecuta el sistema operativo secuencialmente. Por ejemplo, la búsqueda operativa está integrada como una característica del sistema operativo, que verifica secuencialmente la tabla del sistema de archivos o indexando y luego buscando utilizando algoritmos de búsqueda binarios. Ambas operaciones consumen mucho tiempo. ¿Por qué no enviar la tabla del sistema de archivos parcial a las GPU y bifurcar la operación de búsqueda? En el nivel de procesamiento, la mayoría de las operaciones del sistema operativo no son más que cálculos aritméticos y lógicos y, sin embargo, estas operaciones esperan CPU. El problema aquí es la latencia involucrada para enviar y recibir la operación/memoria de la CPU a la GPU y de vuelta a la CPU. Se necesita mucha investigación para disminuir esta latencia. Pero el problema en realidad aquí no es la latencia del hardware (entre la CPU y la GPU), sino para estimar esta latencia del sistema operativo. El sistema operativo debe estimar la latencia y decidir si el procesamiento en la CPU es mejor o si la GPU es mejor. De nuevo, esto depende de la plataforma de hardware. Estos problemas podrían abordarse e investigarse. Simplemente necesita una gran inversión para la investigación de las compañías de sistemas operativos.

0

Las GPU modernas se pueden utilizar para algo más que el procesamiento de gráficos; también pueden ejecutar programas de propósito general. Si bien no es adecuado para todos los tipos de programas, sobresalen en el código que puede hacer uso de su alto grado de paralelismo. La mayoría de los usos del denominado cómputo `` GPU de propósito general '' (GPGPU) han estado fuera del dominio del software de sistemas. Sin embargo, trabajos recientes sobre enrutadores de software y conexiones de red encriptadas han dado ejemplos de cómo las GPGPU se pueden aplicar a tareas más tradicionalmente dentro del ámbito de los sistemas operativos. Estos usos solo arañan la superficie. Otros ejemplos de tareas a nivel de sistema que pueden aprovechar las GPU incluyen la criptografía general, la coincidencia de patrones, el análisis de programas y la aceleración de algoritmos básicos comúnmente utilizados.

Citado de https://code.google.com/p/kgpu/

Cuestiones relacionadas