Cómo probar y comparar implementaciones de mutex

12

Como dice el título: ¿Cómo prueba y compara adecuadamente diferentes implementaciones de mutexes en c ++?

Esencialmente escribí mi propia clase std :: mutex para un proyecto que se ejecuta en un núcleo 2, armv7 con el objetivo de minimizar la sobrecarga en el caso no disputado. Ahora estoy considerando usar dicho mutex en más lugares y también en arquitecturas diferentes, pero antes de hacer esto me gustaría asegurarme de que

  • en realidad es correcto
  • No hay ningún caso patológico en el que funcione mucho peor que un estándar std :: mutex.

Obviamente, escribí algunas pruebas unitarias básicas y micro puntos de referencia y todo parece funcionar, pero en el código multiproceso "parece funcionar" no me da una gran comodidad.

  • Entonces, ¿existen técnicas establecidas de análisis estático o dinámico?
  • ¿Cuáles son las dificultades comunes al escribir pruebas unitarias para clases mutex?
  • ¿Cuáles son los casos límite típicos que uno debe tener en cuenta (en cuanto al rendimiento)?

Solo estoy usando tipos de biblioteca estándar para la implementación, que incluye operaciones de carga y almacenamiento no secuenciales consistentes en atómicas. Sin embargo, estoy principalmente interesado en los consejos agnósticos de implementación, ya que también me gustaría usar el mismo arnés de prueba para otras implementaciones.

MikeMB
fuente
2
Sé que no es obligatorio, pero agradecería si los votantes negativos comentaran cuál es el problema con esta pregunta. Soy nuevo en SE y no estoy completamente familiarizado con los detalles específicos de este sitio.
MikeMB
3
No es el votante negativo, pero diré que este sitio es particularmente malo para los votos negativos anónimos sobre preguntas perfectamente buenas. Me parece que muchas personas votan en contra basándose en lo que yo denomino razones "religiosas". Dicho esto, una posibilidad es que estés pidiendo recomendaciones sobre herramientas, lo que creo que está mal visto aquí. Pero eso es solo una suposición. Y muchas personas han discutido tales herramientas en otras preguntas, así que haga de eso lo que quiera.
user1118321
44
De hecho, echa un vistazo a esta meta publicación titulada "Votación negativa porque no estamos de acuerdo con el enfoque o la lógica del autor de la pregunta".
user1118321
@ user1118321: esa meta publicación no se ajusta a esta pregunta ya que en mi humilde opinión no hay una suposición errónea en esta pregunta. Sin embargo, dos de los 3 votos cercanos que veo actualmente utilizan el motivo de cierre predefinido "solicitud de recursos de terceros". MikeMB, puedes intentar editar tu pregunta y eliminar esas partes de ella, sin embargo, en la forma actual, supongo que la comunidad también podría cerrarla por ser demasiado amplia. Si reduce el enfoque de la pregunta y pregunta específicamente qué quiere probar y qué intentó hasta ahora, puede aumentar la posibilidad de supervivencia de su pregunta.
Doc Brown
Un problema con esta pregunta es que "Las preguntas que nos solicitan encontrar o recomendar herramientas, bibliotecas, lenguajes de programación, recursos (incluidos libros, blogs, tutoriales y ejemplos), o proyectos a emprender están fuera de tema aquí ya que atraen respuestas obstinadas que no tendrá un valor duradero para los demás ".
David Hammen

Respuestas:

1

El problema es complejo:

Algunas fuentes de complejidad incluyen:

  • Cuántos cambios de contexto están teniendo lugar: esto es muy importante dependiendo de la plataforma en la que se ejecutan estas pruebas. Algunas plataformas manejan esto mejor que otras
  • Son las funciones en las que se prueban los mutexes en línea o no. es decir, el mutex funciona bien solo en código bien optimizado u optimizable.
  • Son estos mutexes diseñados para la localidad de caché. La pérdida de caché reducirá significativamente el rendimiento o causará más cambios de contexto. antes y después de ingresar el mutex.
  • ¿El mutex mismo causará la pérdida de la localidad de caché? es decir, los datos de estado mutex se asignan dinámicamente.
  • ¿Estos mutexes funcionarán bien cuando los cambios de contexto estén contenidos dentro del mutex? es decir, io, malloc, etc.
  • El mutex funcionará bien si el tiempo del núcleo está contenido en la asignación y desasignación de memoria dinámica mutex.ie.
  • ¿El rendimiento se mantiene cuando se ejecuta dentro de máquinas virtuales?
  • ¿Es costosa la destrucción o construcción del mutex?
Christiaan Pretorius
fuente
1
No estoy seguro si estoy de acuerdo con la parte de construcción / destrucción. Si un programa está creando y destruyendo sus mutexes todo el tiempo, hay (en mi humilde opinión) algo mal con el diseño del diseño. Pero por lo demás, gracias por los consejos.
MikeMB
-1

Su idea es muy interesante: un punto de referencia de cumplimiento con el que se podría probar una implementación de mutex.

Desafortunadamente, por lo que pude ver, no hay un punto de referencia de cumplimiento ampliamente conocido para las implementaciones de mutex. Entonces, supongo que tiene en sus manos el problema muy interesante de crear una propuesta para tal punto de referencia de cumplimiento.

Y, dado que ha estado involucrado en la creación de una implementación de referencia, usted es el tipo.

Si me permite una sugerencia, tal vez podría comenzar esta investigación con el estándar POSIX para hilos en un lado, y algún estudio de la literatura teórica del procesamiento concurrente, como CSP o procesos secuenciales de comunicación. Este tipo de documentos generalmente se ocupa de los problemas concurrentes clásicos, como los Dining Philosophers.

Supongo que una implementación de ellos podría ser una parte interesante de su punto de referencia de cumplimiento.

Hilton Fernandes
fuente
3
No te rechacé, pero esto no parece responder a ninguna de mis preguntas.
MikeMB
Gracias por no votar. Y perdón por no responder a sus preguntas. ¿Le importaría si le pregunto si está considerando crear un punto de referencia de cumplimiento para mutexes?
Hilton Fernandes
Improbable. E incluso si, el único estándar que me importa es el estándar c ++ (aunque eso podría ser lo mismo que posix con respecto a mutexes)
MikeMB
Para calificar mi afirmación anterior: si debo encontrar un buen conjunto de pruebas para mi propio mutex, lo más probable es que sea de código abierto, pero dudo mucho que tenga la calidad o sea lo suficientemente completo como para convertirse en un verdadero punto de referencia de "cumplimiento": de todos modos, eso podría ser algo que se maneja mejor mediante análisis estático.
MikeMB
Estoy de acuerdo con usted en que no hay un buen conjunto de pruebas para las primitivas mutex. Supongo que debería provenir de tres fuentes distintas: la teoría del procesamiento concurrente, la especificación de un mutex POSIX y los algoritmos concurrentes expresados ​​usando mutexes. Estás de acuerdo con eso ?
Hilton Fernandes