He estado realizando algunos experimentos con el marco de OpenMAP y he encontrado algunos resultados extraños que no estoy seguro de saber explicar.Rendimiento de Malloc en un entorno multiproceso
Mi objetivo es crear esta enorme matriz y luego llenarla con valores. Hice algunas partes de mi código como bucles paralelos para obtener el rendimiento de mi entorno multiproceso. Estoy ejecutando esto en una máquina con 2 procesadores xeon de cuatro núcleos, por lo que puedo poner hasta 8 subprocesos de forma segura allí.
Todo funciona como se esperaba, pero por alguna razón el bucle for que realmente asigna las filas de mi matriz tiene un rendimiento máximo impar cuando se ejecuta con solo 3 hilos. A partir de ahí, agregar algunos hilos más hace que mi ciclo tarde más. Con 8 hilos que toman realmente más tiempo que necesitaría con solo uno.
Ésta es mi bucle paralelo:
int width = 11;
int height = 39916800;
vector<vector<int> > matrix;
matrix.resize(height);
#pragma omp parallel shared(matrix,width,height) private(i) num_threads(3)
{
#pragma omp for schedule(dynamic,chunk)
for(i = 0; i < height; i++){
matrix[i].resize(width);
}
} /* End of parallel block */
Esto me hizo pensar: ¿hay un problema de rendimiento conocido cuando se llama a malloc (que supongo que es lo que el método de cambio de tamaño de la clase de plantilla vector es realmente llamando) en un entorno multiproceso? Encontré algunos artículos que decían algo sobre la pérdida de rendimiento al liberar espacio en montón en un entorno multiproceso, pero nada específico acerca de la asignación de espacio nuevo como en este caso.
Solo para dar un ejemplo, coloco debajo de un gráfico el tiempo que le toma al bucle finalizar en función del número de subprocesos para el bucle de asignación, y un bucle normal que solo lee datos de esta gran matriz más adelante.
Las dos veces donde midieron utilizando la función gettimeofday y parecen volver resultados muy similares y precisos a través de diferentes instancias de ejecución. Entonces, ¿alguien tiene una buena explicación?
Me olvidé de decir, estoy ejecutando en Ubuntu 11.04 (64 bits). – Bilthon