Распараллеливание только внутреннего цикла - PullRequest
0 голосов
/ 07 марта 2012

У меня есть цикл for, выполнение которого занимает около 16 мс, и он выполняется условно под другим циклом for 500 раз.

Формат серийного кода выглядит следующим образом:

//Outer for loop
for(i=0;i<500;i++){
//read some entity
//some conditions

// some function calls
    // some nested function calls
         // inner for loop
            for (j=0;some condition;j++){
            // work on the entity read in outer for loop

             }

}

Я хочу распараллелить внутренний цикл for. Возможно ли использование OpenMP для сокращения времени, необходимого для выполнения внутреннего цикла for, на 40% и, следовательно, общего времени, необходимого для запуска последовательного кода?

Я хочу общее сокращение времени выполнения кода. Распараллеливание внешнего цикла for в моем случае невозможно, так как код написан так, чтобы одновременно работать только с одной сущностью это во внутренней для цикла.

Пожалуйста, помогите.

Спасибо!

1 Ответ

0 голосов
/ 07 марта 2012

Openmp может парализовать такие маленькие задачи.Я сделал это один раз, чтобы сделать фильтр ядра 5x5 на видео 30 кадров в секунду.

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

В моем примере выше я разделил изображение на линии сканирования, каждоекоторый был рассчитан последовательно.Это работало нормально.

...