2017-04-01 2 views
2

Ich habe eine große Datei bestehend aus> Millionen von Fließkommawerten. Ich kann sie leicht std::sort mit sortieren, indem Sie jetzt Datei in vector lesen, zB -C++ parallel std :: sort für Gleitkommawerte

std::vector<float> v; 
std::sort(v.begin(), v.end()); 

aber gibt es eine Version von std::sort oder ähnlichen Algorithmus, der die Vorteile von mehreren Kernen auf meinem System nimmt? Da dies die einzige Aufgabe ist, die viel Zeit in Anspruch nimmt, suche ich nach Perf-Verbesserungen, da ich> 1 Core-CPU habe.

Ich kann alle neuesten Versionen von Compilern auf einem x64-Linux-Server verwenden und die Binärdatei mit -std=c++1z auch kompilieren.

+1

Werfen Sie einen Blick auf: http://stackoverflow.com/questions/28520720/c-parallel-sort –

Antwort

2

Sie haben Glück. Die C++ Extensions for Parallelism Technical Specification fügte parallelisierte Versionen der vielen Standardalgorithmen hinzu, einschließlich std::sort. Sie sind in C++ 17 verfügbar. GCC hat Unterstützung dafür und Sie können ihre Seite darüber sehen here. Es scheint, dass sie OpenMP für Multi-Threading verwenden.

GCC Voraussetzung Compiler Flags

Jede Verwendung paralleler Funktionalität erfordert zusätzliche Compiler und Runtime-Unterstützung, insbesondere die Unterstützung für OpenMP. Das Hinzufügen dieser Unterstützung ist nicht schwierig: Kompilieren Sie einfach Ihre Anwendung mit dem Compiler-Flag -fopenmp. Dies wird in libgomp, der GNU Offloading und Multi Processing Runtime Library, verlinkt, deren Anwesenheit obligatorisch ist.

Darüber hinaus ist eine Hardware erforderlich, die atomare Operationen und einen Compiler unterstützt, der atomare Operationen erzeugen kann: GCC verwendet standardmäßig keine Unterstützung für atomare Operationen auf einigen gängigen Hardwarearchitekturen. Das Aktivieren atomarer Operationen erfordert möglicherweise explizite Compiler-Flags auf einigen Zielen (z. B. sparc und x86), z. B. -march = i686, -march = native oder -mcpu = v9. Weitere Informationen finden Sie im GCC-Handbuch.


Ich weiß, Sie sagten, Sie Linux verwenden, aber ich möchte auch enthalten, dass es MSVS erscheint, starting with version 2013 RTM, hat auch Unterstützung für die Parallelism Technische Spezifikation.

+0

Vielleicht könnten Sie die Notwendigkeit '-fopenmp' erwähnen und es sieht aus wie Sie' -D_GLIBCXX_PARALLEL' zu müssen? –

+1

Ich finde diese Antwort etwas irreführend. Der parallele Modus, den Sie verlinkt haben, ist seit vielen Jahren in GCC verfügbar, weit vor den C++ Extensions for Parallelism Technical Specification. Dies ist eine compilerspezifische Erweiterung, und verschiedene Algorithmen sind verfügbar (obwohl viele mit der C++ - Erweiterungsspezifikation gemeinsam sind). Sagen Sie mir, wenn ich falsch liege, aber soweit ich weiß, unterstützt GCC die C++ Extensions for Parallelism Technical Specification noch nicht. – Pyves

+0

@Pyves Es ist jetzt experimentelle Unterstützung. – NathanOliver

Verwandte Themen