Рабочие потоки прекращают свою работу через мгновение - PullRequest
2 голосов
/ 27 августа 2009

У меня есть последовательное приложение, которое я распараллелил с использованием 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), затем в другом и т. Д., Пока только основной поток не заработает. .

У кого-нибудь есть идея, почему это происходит? Это начинает происходить после выполнения примерно половины итераций.

Ответы [ 2 ]

6 голосов
/ 27 августа 2009

Это может зависеть от схемы планирования и размера вычислений в каждом цикле. Если планирование статично - каждому потоку назначается работа до его запуска. Каждый поток получит 1/4 индекса. Возможно, что некоторые потоки заканчиваются раньше других, потому что их работа проще, чем у других потоков (или, возможно, они просто менее загружены другими вещами).

Попробуйте поработать с динамическим планированием и посмотрите, работает ли он лучше.

2 голосов
/ 28 августа 2009

Небольшой комментарий к вашему коду: если время выполнения вашей ComputeTrajectory измеряется в миллисекундах и у вас больше нескольких итераций, вы должны убедиться, что у вас есть распределитель памяти, оптимизированный для MP, потому что вы выделяете в каждой итерации и ( до сих пор) большинство распределителей имеют глобальный пул с глобальной блокировкой.

Вы могли бы также изучить возможность полного выделения выделения из цикла, но недостаточно информации, чтобы узнать, возможно ли это здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...