Я должен признать, что я еще не углубился в C ++ 0x, но, насколько я вижу, «просто» предлагает некоторые примитивы для общего распараллеливания.
С другой стороны, OpenMP - этоОтносительно высокоуровневая абстракция для распараллеливания кода с единственной целью: повысить производительность за счет распределения работы между несколькими ядрами ЦП (а не, скажем, улучшить отзывчивость пользовательского интерфейса или обмен данными по асинхронному каналу).
OpenMP делает этоэто очень просто, потому что он предлагает компактный синтаксис и выполняет многое автоматически, например, управление пулом потоков и планирование потоков для равномерного распределения работы.В лучшем случае это означает, что распараллеливание существующего алгоритма так же просто, как вставка в код следующего кода (в соответствующей позиции):
#pragma omp parallel for
(Конечно, обычно это немного сложнее.)
Однако это обходится в два раза:
OpenMP реализован с помощью прагм и плохо интегрируется с синтаксисом C ++.Например, следующий простой код недопустим:
void f() {
#pragma omp critical
{
return;
}
}
Это потому, что вы не можете преждевременно оставить OpenMP «блоки».Довольно облом.
OpenMP стремится быть максимально независимым от платформы.Как следствие, ему не хватает нескольких интересных примитивов.Например, в OpenMP нет ни команды yield
, ни примитива fetch_and_add
, ни compare_and_swap
или LL / CS.