PMU para entornos de múltiples hilos

Estoy planeando medir los contadores de PMU para L1, L2, L3 falla en la predicción de sucursales, he leído documentos de Intel relacionados pero no estoy seguro de los siguientes escenarios. ¿Alguien puede aclarar?

//assume PMU reset and PERFEVTSELx configurtion done above ioctl(fd, IOCTL_MSR_CMDS, (long long)msr_start) //PMU start counters my_program(); ioctl(fd, IOCTL_MSR_CMDS, (long long)msr_stop) ///PMU stop //now reading PMU counters 

1. ¿Qué sucederá si mi proceso está progtwigdo cuando my_program () se está ejecutando, y está progtwigdo para otro núcleo?

2. ¿Qué ocurrirá si el proceso está progtwigdo y vuelve a progtwigrse en el mismo núcleo otra vez, mientras que algún otro proceso restablece los contadores de PMU?

¿Cómo asegurarnos de que estamos leyendo los valores correctos de los contadores de PMU?

Detalles de la máquina: CentOS con kernel de Linux 3.10.0-327.22.2.el7.x86_64, que se enciende con Intel (R) Core (TM) i7-3770 CPU @ 3.40GHz

Gracias

Resumen del hilo del foro de Intel iniciado por el OP:

  • El subsistema Linux perf virtualiza los contadores de rendimiento, pero esto significa que tiene que leerlos con una llamada al sistema, en lugar de rdpmc , para obtener el valor de 64 bits virtualizado completo en lugar de lo que está actualmente en el registro de contador de rendimiento arquitectónico.

  • Si desea usar rdpmc dentro de su propio código para que se pueda medir a sí mismo, fije cada hilo a un núcleo porque los cambios de contexto no guardan / restauran los PMC. No hay una manera fácil de evitar medir todo lo que sucede en el núcleo, incluidos los controladores de interrupción y otros procesos que se hacen más complejos. Esto puede ser bueno, ya que debe tener en cuenta el impacto de la sobrecarga del kernel.


Citas más útiles de John D. McCalpin, PhD (“Dr. Bandwidth”):

Para la instrumentación de código en línea, debe poder utilizar la API de “eventos perf”, pero la documentación es mínima. Algunos recursos están disponibles en http://web.eece.maine.edu/~vweaver/projects/perf_events/faq.html

Puede usar “pread ()” en los archivos del dispositivo / dev / cpu / * / msr para leer los MSR. Esto puede ser un poco más fácil de leer que el código basado en IOCTL. Los códigos “rdmsr.c” y “wrmsr.c” de “msr-tools-1.3” proporcionan excelentes ejemplos.

Ha habido una serie de enfoques para reservar y compartir los contadores de rendimiento, incluidos los enfoques de solo software y de hardware + software combinado, pero en este punto no existe un enfoque “estándar”. (Parece que Intel tiene un enfoque basado en hardware utilizando MSR 0x392 IA32_PERF_GLOBAL_INUSE, pero no sé qué plataformas lo admiten).


tus preguntas

¿Qué pasará si mi proceso está progtwigdo cuando my_program () se está ejecutando y está progtwigdo para otro núcleo?

Verá basura aleatoria, lo mismo si otro proceso restablece las PMC entre los intervalos de tiempo de su proceso.

Recibí las respuestas de algunos foros de Intel, el enlace está abajo.

https://software.intel.com/en-us/forums/intel-moderncode-for-parallel-architectures/topic/673602