Я пытался распараллелить алгоритм с несбалансированными вложенными циклами с использованием OpenMP. Я не могу опубликовать исходный код, как это секретный проект неслыханного правительства, но вот игрушка пример:неуравновешенный вложенные петли в openmp
for (i = 0; i < 100; i++) {
#pragma omp parallel for private(j, k)
for (j = 0; j < 1000000; j++) {
for (k = 0; k < 2; k++) {
temp = i * j * k; /* dummy operation (don't mind the race) */
}
if (i % 2 == 0) temp = 0; /* so I can't use openmp collapse */
}
}
В настоящее время этот пример работает медленнее в нескольких потоках (~ 1 сек в одном потоке ~ 2,4 с в 2 потоках и т. Д.).
Things отметить:
Внешний цикл должно быть сделано для того, (в зависимости от предыдущего шага) (Насколько я знаю, OpenMP обрабатывает внутренние петли хорошо, поэтому потоки не получают созданные/уничтожены на каждом шаге, верно?)
Типичные номера индексов приведены в примере
(100, 1000000, 2)
операция пустышки состоит всего из нескольких операций
Есть некоторые условные операции за пределами внутренней большей петли, так Распад не вариант (не кажется, что это приведет к увеличению производительности в любом случае)
Похоже смущающий параллельному алгоритм, но я могу» t, похоже, получает ускорение за последние два дня. Что было бы лучшей стратегией здесь?
Ваш ответ был полезен в том смысле, что теперь я могу увеличить производительность этого примера игрушек, указав i и temp, а также частные переменные. Тем не менее, мой оригинальный код тоже не похож на этот подход. Я поговорю с несколькими парнями и посмотрю, смогу ли я опубликовать исходный код. – none