Код OpenMP выполняется в пуле потоков - PullRequest
2 голосов
/ 28 января 2011

Я думаю о дизайне, в котором пул потоков будет выполнять блоки кода, которые могут содержать операторы OpenMP (в основном параллельные).(Похоже на Как бороться с конфликтом в пуле потоков OpenMP Полагаю).Мой вопрос: вызовет ли это проблемы или приведет к снижению производительности, если параллельная область OpenMP каждый раз будет выполняться другим потоком.

edit:

Целью будет Linux(gcc) и Windows (msvc).

Я сравню его, когда мой первый прототип будет готов (на что будут влиять ответы, которые я получу здесь).

Вот простой пример:

class Task
{
public:
    void doTask()
    {
        #pragma omp parallel
        {
            // do work in parallel
        }
    }
};

Теперь представьте, что вы создаете экземпляр Task и передаете его в пул потоков (thread-0, ..., thread-n).Один поток выполняет doTask().Позже вы снова передаете тот же объект Task в пул потоков, и снова ....Так что doTask() (и параллельная секция) будут выполняться разными потоками.Интересно, эффективно ли это обрабатывается OpenMP (например, потоки для раздела не воссоздаются каждый раз).

1 Ответ

4 голосов
/ 29 января 2011

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

Что я могу сказать, так это то, что вы можете или не сможете заставить это работать.Спецификация OpenMP, как и большинство других потоковых моделей, ничего не говорит о том, как или если модели будут «хорошо играть вместе».Например, хотя некоторые реализации OpenMP используют pthreads для базовой реализации, если реализация не выполнила какую-то работу, пользователь не может напрямую вызвать библиотеку pthreads и заставить ее работать вместе с OpenMP.Текущий пример этого - ошибка gcc 42616 (цикл OMP внутри pthread приводит к сбою).Другим примером является Intel, чей компилятор поддерживает множество параллельных моделей, но изо всех сил старается заставить их работать вместе.Поскольку вы еще не сказали, какой компилятор вы собираетесь использовать, все, что я могу сказать, это попробовать небольшой пример кода, чтобы увидеть, работает ли он, прежде чем совершать что-то большое.

Я пробовал что-то подобное впрошлое.Я использовал pthreads, которые затем использовали конструкции OpenMP.Я обнаружил, что для моего приложения все работает нормально.Каждый pthread считался исходным потоком при обнаружении параллельной области OpenMP.Затем среда выполнения OpenMP создала дополнительные потоки для региона и запустила регион.Поскольку большинство реализаций OpenMP не уничтожают потоки, а помещают их в свободный пул для повторного использования при обнаружении другого региона, накладные расходы выглядят хорошо - но тогда у меня было много работы в этом регионе.Так что это может сработать - но вы должны быть осторожны.

...