¿Qué proyectos podría hacer en el paralelismo a nivel de hilo?

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.

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 void ; 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.
  • 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!

Personalmente, no comenzaría tratando de hacer un problema específico en computación paralela … o supongo que lo que quiero decir es no pensar demasiado en los detalles de los problemas cubiertos en su curso. En cambio, diría que sería mucho más beneficioso y divertido pensar en un problema que le interese y que no sea inmediatamente obvio cómo paralelizar.

Por ejemplo, si le gusta ordenar algoritmos, puede intentar averiguar qué algoritmo sería el más sencillo para escribir código paralelo. Puede equilibrar ese criterio con lo que sería el algoritmo más rápido : puede pensar en términos de mayor velocidad o velocidad absoluta más rápida. Otra idea es pensar en algoritmos de optimización. Si te gusta la IA, este es un problema perfecto porque muchos problemas de IA se reducen a la optimización. Estoy pensando en algoritmos evolutivos, recocido simulado (y sus variantes), etc.

Una razón bastante buena para hacerlo de esta manera es que construye una comprensión del mundo real de cómo aplicar su conocimiento en computación paralela a problemas difíciles que deben hacerse más rápido.

De todos modos, los problemas que elija dependerán de cuánto sepa y cuáles sean sus intereses. En algún momento, estaba interesado en hacer un multiplicador binario paralelo. Sabía que no sería tan rápido, pero sería interesante entender cómo funcionaba y ver cuáles son las limitaciones analizando los datos de tiempo de ejecución. También ayuda intentar entrar en un estado mental similar al de un complejo de Mesías: tienes que salvar a todos de los males de los algoritmos lentos. Considera que todo tiene potencial para acelerar … para mí esto funciona muy bien y tengo muchas ideas cuando tengo esto en mente.

Puede ver varios conjuntos de pruebas de referencia utilizados actualmente para estudiar sistemas de memoria compartida / NUMA con esquemas de sincronización más finos / gruesos. Algunas de estas suites de referencia pueden tener una implementación de biblioteca subyacente para la biblioteca de subprocesos también.

Puedo señalar uno de los que se usa ampliamente,

a. El SELLO [1] de la Universidad de Stanford contiene un gran conjunto de programas de referencia escritos para evaluar la memoria transaccional de software (STM).

[1] Aplicaciones transaccionales de Stanford para multiprocesamiento

Trátelo como un problema de programación en los sistemas operativos.

¿Cómo programarías los hilos paralelizables?

Atacarlo con un compilador que optimiza el rendimiento de ejecutar la aplicación de software en una plataforma de hardware de destino al paralelizar los hilos es muy difícil. Lo mismo para abordar este desafío a nivel microarquitectura.

More Interesting

¿Qué debo especializar en sistemas inteligentes o computación en la nube?

¿Cuáles son los temas más candentes para la investigación en simulación y modelado de yacimientos?

¿Cuáles son algunos de los grandes proyectos implementados utilizando los conceptos de la teoría de gráficos?

Visión por computadora: ¿Por qué los mejores artículos rara vez son los más citados?

¿Cuáles son algunos de los documentos fundamentales en el diseño del lenguaje de programación?

¿Cuáles son los temas de actualidad en la investigación de Arquitectura de Computadores?

¿Qué experiencias de investigación de verano (REU) existen para la informática que se centran más en la teoría?

¿Quiénes son algunos doctores en informática líderes en la industria?

¿Cuál es la forma correcta de hacer una búsqueda bibliográfica exhaustiva de trabajos anteriores?

¿Qué se encuentra en la primera línea de Machine Learning Research?

¿Debo hacer un proyecto de investigación física o un proyecto de física computacional para mi último año de pregrado?

¿Cuál es un buen tema de investigación de pregrado en visión por computadora?

¿Cuáles son algunos problemas interesantes de PSPACE-complete?

¿Cuáles son los mejores recursos para aprender visión por computadora para alguien con experiencia en álgebra lineal y de probabilidad (y un poco en aprendizaje automático)? El libro "Visión por computadora: algoritmos y aplicaciones" no es muy amigable para principiantes.

¿Cómo determino el número de funciones hash necesarias mientras hago LSH?