it-swarm.com.de

Sind bereits C++ 17-Parallelalgorithmen implementiert?

Ich habe versucht, mit den neuen Funktionen der parallelen Bibliothek, die im C++ 17-Standard vorgeschlagen werden, herumzuspielen, konnte es aber nicht zum Laufen bringen. Ich habe versucht, mit den aktuellen Versionen von g++ 8.1.1 und clang++-6.0 und -std=c++17 zu kompilieren, jedoch schien keine der beiden Versionen #include <execution>, std::execution::par oder ähnliches zu unterstützen. 

Bei der Betrachtung von cppreference für parallele Algorithmen gibt es eine lange Liste von Algorithmen, die behaupten 

Die technische Spezifikation bietet parallelisierte Versionen der folgenden 69 Algorithmen aus algorithm, numeric und memory: (... lange Liste ...)

was klingt, als wären die Algorithmen bereit 'on paper', aber noch nicht einsatzbereit?

In dieser SO Frage von vor über einem Jahr behaupten die Antworten, dass diese Funktionen noch nicht implementiert wurden. Aber bis jetzt hätte ich eine Implementierung erwartet. Gibt es etwas, was wir schon verwenden können?

13
Romeo Valentin

Intel hat eine Parallel STL-Bibliothek veröffentlicht, die dem C++ 17-Standard entspricht:

Es wird in GCC zusammengeführt .

11
Florian Weimer

GCC 9 wird sie haben

Erwähnt unter https://gcc.gnu.org/gcc-9/changes.html

Parallele Algorithmen und (erfordert Thread Building Blocks 2018 oder neuer).

Wenn es ein Release-Tag bekommt, werde ich es ausprobieren. Ich frage mich, was für "Thread Building Blocks 2018" erforderlich sein wird.

Gcc implementiert den Parallelismus-TS noch nicht (siehe https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2017 )

Libstdc ++ (mit gcc) hat jedoch einen experimentellen Modus für einige gleichwertige parallele Algorithmen. Siehe https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html

So funktioniert es:

Jede Verwendung der parallelen Funktionalität erfordert einen zusätzlichen Compiler und Laufzeitunterstützung, insbesondere Unterstützung für OpenMP. Hinzufügen dieser Unterstützung ist nicht schwer: kompilieren Sie einfach Ihre Anwendung mit dem Compiler-Flag -fopenmp. Dadurch wird in libgomp die GNU -Laufzeitbibliothek für das Entladen und Multi-Processing verknüpft, deren Anwesenheit obligatorisch ist.

Code-Beispiel

#include <vector>
#include <parallel/algorithm>

int main()
{
  std::vector<int> v(100);

  // ...

  // Explicitly force a call to parallel sort.
  __gnu_parallel::sort(v.begin(), v.end());
  return 0;
}
3
KarlM

Sie können auf https://de.cppreference.com/w/cpp/compiler_support verweisen, um den Status aller C++-Feature-Implementierungen zu überprüfen. Suchen Sie in Ihrem Fall einfach nach "Standardization of Parallelism TS", und Sie werden feststellen, dass nur MSVC und Intel C++-Compiler diese Funktion jetzt unterstützen.

0
Nan Xiao