Оптимальный размер параллели для тела петли
Предположим, у вас есть реализация цикла для параллельного цикла, например 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
, для чего тоже нужно что-то из памяти, объект в кеше изменяется и нужно вынести это из памяти.
Опять же - не уверен, что это так, очень сильно зависит от того, что вы делаете в этих методах. С первого взгляда - производительность не должна отличаться