2017-04-01 18 views
2

私は、何百万もの浮動小数点数からなる大きなファイルを持っています。C++ parallel std :: sort to floating values

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

が、私のシステム上で利用可能な複数のコアを活用してどのstd::sortのバージョンまたは類似のアルゴリズムがあります - 私は簡単に例えば、今のvectorにファイルを読み込むことでstd::sortを使用してそれらを並べ替えることができますか?これは多くの時間を要する唯一のタスクなので、私は> 1コアのCPUを持つことでperfの改善を探しています。

最新のコンパイラは、x64 Linuxサーバで使用でき、-std=c++1zでコンパイルすることもできます。

+1

http://stackoverflow.com/questions/28520720/c-parallel-sort –

答えて

2

あなたは運がいいです。並列化技術仕様書のC++拡張機能には、std::sortを含む多くの標準アルゴリズムの並列化バージョンが追加されました。これらはC++で利用できます。 GCCはこれをサポートしており、あなたはそのページをhereで見ることができます。 OpenMPをマルチスレッドに利用しているかのように見えます。

GCC前提条件コンパイラフラグ

並列機能の使用は、OpenMPのための特定のサポートには、追加のコンパイラとランタイムのサポートが必要です。このサポートを追加することは難しいことではありません。アプリケーションをコンパイラフラグ-fopenmpでコンパイルするだけです。これはlibgomp、GNU OffloadingとMulti Processing Runtime Libraryにリンクします。その存在は必須です。

さらに、アトミック操作をサポートするハードウェアと、アトミック操作を生成できるコンパイラは必須です.GCCでは、一部の一般的なハードウェアアーキテクチャではアトミック操作がサポートされていません。アトミック操作を有効にするには、-march = i686、-march = native、-mcpu = v9など、一部のターゲット(sparcやx86など)で明示的なコンパイラフラグが必要な場合があります。詳細については、GCCマニュアルを参照してください。


私はあなたがLinuxを使用しているが、私はまたMSVS、starting with version 2013 RTMは、また、並列処理技術仕様をサポートしています表示されていることを含めたいと知っています。

+0

「-fopenmp」の必要性について言及することもできますが、 '-D_GLIBCXX_PARALLEL'も必要なようです。 –

+1

私はこの回答が少し誤解を招くことがわかりました。リンクした並列モードは、並列化技術仕様書のC++拡張の前にGCCで長年利用可能でした。これはコンパイラ固有の拡張であり、異なるアルゴリズムが利用できます(C++拡張仕様と共通するものはありますが)。もし私が間違っていると教えてください、しかし私が知る限り、GCCはまだ並列化技術仕様のC++拡張をサポートしていません。 – Pyves

+0

@Pyves今は実験的なサポートです。 – NathanOliver