No tengo una idea profunda del proyecto perfecto, pero me pidieron que respondiera esto, y tengo algunas ideas sobre proyectos de subprocesos interesantes y una noción de las capacidades de un estudiante universitario, así que aquí vamos.
Proyecto: Diseñe e implemente una agrupación genérica de subprocesos que pueda utilizar el software de sistema arbitrario para el procesamiento de cierres definidos por el usuario que admitan la afinidad de subprocesos y subprocesos conscientes de la topología del procesador.
La última parte es el quid del proyecto, por lo que extender una agrupación de subprocesos existente para admitir la afinidad de subprocesos y subprocesos conscientes de la topología del procesador es una reducción de alcance adecuada.
- ¿Cuáles son algunos de los problemas de investigación más interesantes en los sistemas de recomendación?
- ¿Cuál es el algoritmo más eficiente para el mejor ajuste en el problema del embalaje del contenedor (bPP)?
- Doctorado en Informática: ¿Cuáles son las mejores ideas de temas de investigación de doctorado en HCI?
- ¿Cómo se compara la investigación de la industria como Google Deepmind con la academia?
- ¿Cómo puedo buscar solo documentos de transacciones IEEE?
Estos son los requisitos básicos del grupo de subprocesos (ignore si usa una implementación existente):
- Un objeto simple y autónomo con interfaces para la puesta en obra del trabajo en forma de cierres. La interfaz más simple sería “agregar trabajo”, pero puede imaginar el caso de uso de interfaces más complejas como “agregar trabajo después de N milisegundos”.
- Crea N subprocesos utilizando la biblioteca de subprocesos que elija. N puede ser proporcionado por el usuario o determinado automáticamente.
- Un objeto de cierre genérico. Esto puede ser tan simple como una función y un puntero
; lo que sea adecuado para tu idioma. Una solución completa permitiría el registro de una devolución de llamada más el enlace de cualquier variable arbitraria a esa devolución de llamada.void
- Los cierres agregados se almacenan en una cola.
- El grupo de subprocesos atiende los cierres primero en entrar, primero en salir de la cola.
Eso es bastante simple Si ya tiene interfaces de trabajo para los conceptos básicos (por ejemplo, una cola), entonces eso es solo aproximadamente medio día de trabajo.
Aquí está la parte divertida:
- Apoyar la afinidad del hilo. Es decir, agregue funcionalidad al grupo de subprocesos para permitir el enlace de un trabajo similar al mismo subproceso. Por ejemplo, es posible que desee vincular todos los cierres asociados con una solicitud determinada al mismo hilo. Hazlo de manera genérica; por ejemplo, opcionalmente, permite que se pase una clave arbitraria a los diversos métodos de “agregar trabajo” que se utilizan para “fragmentar” el trabajo en un hilo específico.
- Apoyar la afinidad central. Es decir, agregue funcionalidad para unir automáticamente hilos a núcleos. Utilizará la funcionalidad del sistema operativo existente para esto, por supuesto.
- Haga lo anterior con conocimiento de la topología del procesador del sistema. Esta es la parte divertida y un poco abierta. Algo de esto podría ser automático y otros podrían proporcionar interfaces para que el usuario de su grupo de subprocesos controle las cosas. Por ejemplo, ¿qué es más rápido, poner todos los hilos en el mismo paquete (en un sistema multinúcleo) o paquetes diferentes? ¿Cómo debe programar con respecto a hyperthreads? NUMA nodos? ¿Cuántos hilos por núcleo (si no 1, por qué)? ¿Cómo puede aprovechar la topología de caché? Además de la afinidad de subprocesos, ¿es útil proporcionar el inverso, es decir, permitir que el usuario denote el trabajo no relacionado para que su grupo de subprocesos pueda programarlo en un procesador “distante”? Probar varias estrategias a través de benchmarking.
Un proyecto abreviado es escribir una biblioteca para facilitar solo esa última viñeta. Es decir, diseñe e implemente una biblioteca que enumere los procesadores de un sistema y proporcione formas de consultar y devolver subconjuntos de esos procesadores que cumplan con los criterios proporcionados, tales como el mismo / diferente paquete (para multinúcleo), el mismo / diferente núcleo (para hyperthreading), mismo / nodo de memoria diferente (para NUMA), y así sucesivamente.
¡Buena suerte!