﻿# OpenMP 3\.0 и итераторы

Радостная новость ждет разработчиков, которые хотят одновременно использовать в своих программах итераторы и OpenMP\. До недавнего времени не то, чтобы эти технологии были не совместимы, но дополняющее использование этих двух технологий было невозможно\. Итераторы позволяют изящно организовывать перебор элементов, они более безопасны и так далее\. Про преимущество итераторов написано во многих книгах, и мы не будем здесь их вспоминать\. К сожалению, до недавнего времени, технология OpenMP накладывала существенные ограничения на типы, которые могли использоваться для организации параллельных циклов\. Причем это касалось не только итераторов\. В ряде реализаций не поддерживались даже такие простые беззнаковые типы, как unsigned/size\_t\. При этом ошибки может не возникать, просто цикл, написанный с использованием типа unsigned/size\_t, не распараллеливался и выполнялся только в одном потоке\.

Стандарт OpenMP 3\.0 меняет ситуацию и делает разработку параллельных приложений более простой и изящной\. Во\-первых, в циклах теперь можно использовать беззнаковые типы unsigned/size\_t\.

Во\-вторых, предприняты шаги по улучшению совместимости технологии OpenMP и использования STL\. Рассмотрим пример:

```cpp
for (it = list1.begin(); it != list1.end(); it++)
{
  it->compute();
}
```

Ранее такой код не мог быть распараллелен стандартными директивами OpenMP\. И его распараллеливание было возможно только с использованием специфических технологий, которые могли быть реализованы в компиляторе\. Например, при использовании компилятора Intel, можно было воспользоваться расширением OpenMP \- Intel's Taskqueuing:

```cpp
#pragma intel omp parallel taskq
{
  for (it = list1.begin(); it != list1.end(); it++)
  {
    #pragma intel omp task
    {
      it->compute();
    }
  }
}
```

Еще можно было перейти от контейнера к простому массиву, и написать код подобный следующему:

```cpp
int iSize = list1.size();
valarray items(lSize);
for (it = list1.begin(); it != list1.end(); it++)
{
  items[l] = &(*it);
  l++;
}
#pragma omp parallel for
for (int i = 0; i < iSize; i++);
}
```

Естественно и первый и второй способ имеют явные недостатки\. Первый использует специфические расширения, а второй излишне громоздок\.

С приходом OpenMP 3\.0 наконец можно стало написать:

```cpp
#pragma omp parallel for
for (it = list1.begin(); it != list1.end(); it++)
{
  it->compute();
}
```

Конечно, пройдет время, пока OpenMP 3\.0 будет реализован в большинстве компиляторов и будут выявлены и устранены многие ошибки в реализации \[[1](https://software.intel.com/content/www/us/en/develop/articles/retired-articles-intel-c-and-fortran-compilers.html)\]\. И все\-таки OpenMP 3\.0 важный шаг, который поможет разработчикам проще приступить к созданию надежных параллельных приложений\.

Библиографический список

1. [Brandon Hewitt\. OpenMP Loops with Function Calls for Bounds May Not Parallelize](https://software.intel.com/content/www/us/en/develop/articles/retired-articles-intel-c-and-fortran-compilers.html)