Извините, OpenMP просто не поддерживает это в настоящее время.К сожалению, вам нужно выполнить параллельное сокращение безобразным образом, как вы уже описали.
Однако, если такое параллельное сокращение действительно часто, я хотел бы сделать конструктор, аналогичный parallel_reduce
в TBB.Реализация такой конструкции довольно проста.В Cilk plus есть более мощный объект-редуктор, но я не проверял, поддерживает ли он не POD.
FYI, такого рода ограничения также можно найти в прагме threadprivate
.Я тестировал с VC ++ 2008/2010 и компиляторами Intel (icc).VC ++ не может поддерживать threadprivate
со структурой / классом, который имеет конструктор или деструктор (или скалярную переменную, для которой требуется инициализация вызова функции), выдавая ошибку: error C3057 , "динамическая инициализация"из "частных" символов ".Вы можете прочитать эту ссылку MSDN .Тем не менее, ICC в порядке с C3057.Вы можете видеть, по крайней мере, две основные реализации такие разные.
Я предполагаю, что поддержка параллельного сокращения на не POD будет иметь аналогичную проблему выше.Чтобы поддерживать параллельное сокращение, каждый параллельный раздел должен выделять локальную переменную потока для переменной сокращения.Таким образом, если заданная редукционная переменная не является POD, им может потребоваться вызвать определяемый пользователем конструктор. Это создает ту же проблему, что я упоминал в случае C3057.