Производительность Malloc в многопоточной среде

Я провел несколько экспериментов с фреймворком openmp и нашел несколько странных результатов, которые я не уверен, что знаю, как их объяснить.

Моя цель - создать эту огромную матрицу, а затем заполнить ее значениями. Я сделал некоторые части своего кода, как параллельные циклы, чтобы получить производительность от многопоточной среды. Я выполняю это на машине с 2 четырёхъядерными процессорами xeon, так что я могу безопасно разместить туда до 8 параллельных потоков.

Все работает, как и ожидалось, но по каким-то причинам циклы фактического распределения строк моей матрицы имеют странный пик производительности при работе только с 3 потоками. С этого момента, добавление еще нескольких потоков просто делает мой цикл дольше. С 8 потоков занимает на самом деле больше времени, что он будет нужен только с одним.

Это мой параллельный цикл:

 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 */

Это заставило меня задуматься: есть ли известная проблема производительности при вызове malloc (что, я полагаю, на самом деле вызывает метод изменения размера класса векторных шаблонов) в многопоточной среде? Я нашел несколько статей, в которых говорилось о потере производительности при освобождении кучи пространства в многопоточной среде, но ничего конкретного о выделении нового пространства, как в данном случае.

Просто чтобы привести пример, я помещаю ниже график времени, которое требуется циклу для завершения, как функцию от количества потоков для цикла выделения, так и нормальный цикл, который просто читает данные из этой огромной матрицы позже.

Parallel region 1, where there is allocation

Parallel region 2, where there is no allocation

Оба раза, где измеряется с помощью функции gettimeofday и, кажется, возвращает очень похожие и точные результаты в различных экземплярах исполнения. Итак, у кого-нибудь есть хорошее объяснение?

10
задан Cœur 4 March 2017 в 09:54
поделиться