#c #for-loop #nested #openmp #load-balancing
#c #для цикла #вложенный #openmp #балансировка нагрузки
Вопрос:
У меня есть массив постоянного небольшого размера (в частности, количество используемых потоков), содержащий векторы int разных размеров. Рабочая нагрузка, которую будет выполнять каждая вложенная итерация, также варьируется от почти незначительной до относительно большой (но обычно не слишком большой). Код выглядит так:
for (int i = 0; i < num_of_threads; i)
for (int j = 0; j = array[i].size(); j)
doStuff(array[i][j]);
На мой взгляд, нет простого способа свернуть его и сообщить openmp реальный размер выполняемых задач, поскольку размер вложенного цикла может варьироваться. Поэтому, независимо от моей политики планирования, я беспокоюсь о случаях, подобных следующему:
Массив содержит 3 вектора размером 8, 8 и 48 соответственно и 3 рабочих потока. Насколько я понимаю, планировщик сначала примет решение для 8 задач, затем для остальных 8 и, наконец, для 48.
Есть ли эффективный способ, без выравнивания массива, сообщить планировщику openmp о балансировке нагрузки 64 задач вместо того, что я описал ранее?
Комментарии:
1. 1-м шагом может быть указание нам, какие недостатки вы продемонстрировали при тестировании настроек расписания и блоков, например, путем добавления расписания (время выполнения) и установки omp_schedule. Если у вас нет требований к numa affinity, этого может быть достаточно.
2. В зависимости от входных данных может изменяться как рабочая нагрузка, так и общий размер задачи. Кажется, что наилучшие результаты достигаются с использованием управляемого планирования. Для 14 потоков в наборе данных, от которых я ожидаю, что общий размер задачи будет относительно большим, я получаю ускорение в 10 раз, тогда как в наборе данных, который я ожидаю, общий размер задачи будет небольшим в 3 раза. Но мой вопрос заключается в том, что в принципе лучше знать полный размер задачи (причина использования ключевого слова collapse, когда это возможно именно так) для выполнения планирования, есть ли эффективный способ сделать это в случае, подобном описанному мной?