Оптимальный размер параллели для тела петли

Предположим, у вас есть реализация цикла для параллельного цикла, например ConcRT parallel_for, всегда ли лучше помещать всю работу в один для тела цикла?

Возьмите следующий пример:

for(size_t i = 0; i < size(); ++i)
{
    DoSomething(a[i], b[i]);
}
for(size_t i = 0; i < size(); ++i)
{
    DoSomethingElse(a[i], b[i]);
}

по сравнению с

for(size_t i = 0; i < size(); ++i)
{
    DoSomething(a[i], b[i]);
    DoSomethingElse(a[i], b[i]);
}

второй вариант был бы очевидным путем, но когда дело доходит до параллельной обработки, могут быть другие соображения?

У меня только что вариант 1 был быстрее второго (в среднем от ~30 мс до ~38 мс) с параметром parallel_for. Но я не очень хорошо разбираюсь в параллельных алгоритмах, поэтому, возможно, я ошибся. В любом случае, к сожалению, я не могу опубликовать пример кода для этого наблюдения.

Есть ли какие-то практические правила, дополнительные соображения или просто попытка сравнительного анализа?

1 ответ

Все зависит от того, что вы делаете в DoSomething а также DoSomethingElse

Скажем так DoSomething нужно что-то из памяти, поэтому, когда вы запускаете это в цикле, объект будет в кеше, но при переключении из DoSomethin в DoSomethingElse, для чего тоже нужно что-то из памяти, объект в кеше изменяется и нужно вынести это из памяти.

Опять же - не уверен, что это так, очень сильно зависит от того, что вы делаете в этих методах. С первого взгляда - производительность не должна отличаться

Другие вопросы по тегам