Рабочие потоки через мгновение прекращают свою работу

StackOverflow https://stackoverflow.com/questions/1340099

  •  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, потому что вы распределяете память на каждой итерации, и (до сих пор) большинство распределителей имеют глобальный пул. с глобальной блокировкой.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top