Я экспериментировал с картой openmp и обнаружил некоторые нечетные результаты. Я не уверен, что знаю, как объяснить.
Моя цель - создать эту огромную матрицу, а затем заполнить ее значениями. Я сделал некоторые части своего кода как параллельные петли, чтобы получить производительность из моей многопоточной среды. Я запускаю это на машине с двумя четырехъядерными процессорами xeon, поэтому я могу безопасно разместить до 8 параллельных потоков.
Все работает так, как ожидалось, но по какой-то причине цикл for, фактически выделяющий строки моей матрицы, имеет нечетную максимальную производительность при работе только с тремя потоками. Оттуда добавление нескольких потоков просто заставляет мой цикл занимать больше времени. С 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 (как я полагаю, это метод изменения размера класса векторного шаблона на самом деле) в многопоточной среде? Я нашел несколько статей, говорящих о потерях производительности при освобождении пространства кучи в мутированной среде, но ничего конкретного о распределении нового пространства, как в этом случае.
Чтобы дать вам пример, я помещаю ниже графика времени, которое требуется для завершения цикла в зависимости от количества потоков как для цикла выделения, так и для нормального цикла, который просто считывает данные из эта огромная матрица позже.
Оба раза, когда измеряется с помощью функции gettimeofday и, похоже, возвращают очень похожие и точные результаты в разных экземплярах исполнения. Итак, у кого есть хорошее объяснение?