Рабочие потоки через мгновение прекращают свою работу
-
20-09-2019 - |
Вопрос
У меня есть последовательное приложение, которое я распараллелил с помощью OpenMP.Я просто добавил следующее в свой основной цикл:
#pragma omp parallel for default(shared)
for (int i = 0; i < numberOfEmitters; ++i)
{
computeTrajectoryParams* params = new computeTrajectoryParams;
// defining params...
outputs[i] = (int*) ComputeTrajectory(params);
delete params;
}
Кажется, это работает хорошо:в начале все мои рабочие потоки выполняют итерацию цикла, все происходит быстро, и у меня 100% загрузка процессора (на четырехъядерной машине).Однако через некоторое время один из рабочих потоков останавливается и остается в функции с именем _vcomp::PersistentThreadFunc
от vcomp90.dll
(файл vctools\openmprt\src\ttpool.cpp
), а потом еще и т. д.пока работает только основной поток.
Есть ли у кого-нибудь идеи, почему это происходит?Это начинает происходить после того, как будет выполнена примерно половина итераций.
Решение
Это может зависеть от схемы планирования и размера вычислений в каждом цикле.Если планирование статическое — каждому потоку назначается работа до его запуска.Каждый поток получит 1/4 индексов.Возможно, некоторые потоки завершаются раньше других, потому что их работа проще, чем у других потоков (а может быть, они просто меньше загружены другими делами).
Попробуйте поработать с динамическим планированием и посмотрите, будет ли оно работать лучше.
Другие советы
Небольшой комментарий к вашему коду:Если время выполнения вашего ComputeTrajectory измеряется в мс и у вас более нескольких итераций, вам действительно следует убедиться, что у вас есть распределитель памяти, оптимизированный для MP, потому что вы распределяете память на каждой итерации, и (до сих пор) большинство распределителей имеют глобальный пул. с глобальной блокировкой.
Вы также можете попытаться полностью исключить выделение из цикла, но недостаточно информации, чтобы знать, возможно ли это здесь.