ホームページ  >  記事  >  バックエンド開発  >  C++ コードの並列計算を実行するにはどうすればよいですか?

C++ コードの並列計算を実行するにはどうすればよいですか?

WBOY
WBOYオリジナル
2023-11-03 10:15:331100ブラウズ

C++ コードの並列計算を実行するにはどうすればよいですか?

コンピューター ハードウェアのパフォーマンスが継続的に向上するにつれて、マルチコア プロセッサーの並列コンピューティングがプログラミングの分野で重要なトピックになっています。効率的なプログラミング言語である C には、当然、並列コンピューティングを実装するためのさまざまな方法があります。この記事では、一般的に使用される C 並列コンピューティング手法をいくつか紹介し、それぞれのコード実装と使用シナリオを示します。

  1. OpenMP

OpenMP は、共有メモリに基づく並列コンピューティング API であり、C プログラムに並列化コードを簡単に追加できます。 #pragma ディレクティブを使用して並列化する必要があるコード セグメントを識別し、並列コンピューティングを実装するための一連のライブラリ関数を提供します。以下は、単純な OpenMP サンプル プログラムです。

#include <iostream>
#include <omp.h>

using namespace std;

int main() {
    int data[1000], i, sum = 0;
    for (i=0;i<1000;i++){
        data[i] = i+1;
    }

    #pragma omp parallel for reduction(+:sum)
    for (i=0;i<1000;i++){
        sum += data[i];
    }
    cout << "Sum: " << sum << endl;
    return 0;
}

この例では、#pragma omp ディレクティブを使用して for ループを並列化します。同時に、reduction(:sum) 命令を使用して、OpenMP に sum 変数を追加するように指示します。このプログラムを 4 コアを使用するコンピューターで実行すると、シングルスレッド バージョンよりも実行時間が 3 ~ 4 倍高速であることがわかります。

  1. MPI

MPI は、複数のコンピューター間の分散並列コンピューティングを可能にするメッセージ パッシング インターフェイスです。 MPI プログラムの基本単位はプロセスであり、各プロセスは独立したメモリ空間で実行されます。 MPI プログラムは 1 台のコンピュータでも複数のコンピュータでも実行できます。以下は、基本的な MPI サンプル プログラムです。

#include <iostream>
#include <mpi.h>

using namespace std;

int main(int argc, char** argv) {
    int rank, size;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    cout << "Hello world from rank " << rank << " of " << size << endl;

    MPI_Finalize();
    return 0;
}

この例では、MPI 環境は MPI_Init() 関数によって初期化され、MPI_Comm_rank() 関数と MPI_Comm_size() 関数を使用してプロセス番号を取得します。単一のプロセスとプロセスの総数。ここでは単純に文章を出力していますが、mpirun -np 4コマンドを実行することで、このプログラムを4つのプロセスで実行することができます。

  1. TBB

Intel Threading Building Blocks (TBB) は、並列コンピューティングを簡素化するツールを提供する C ライブラリです。 TBB の主な概念はタスクであり、ノードとタスク間のコラボレーションを通じて一部の作業を並列化します。以下は TBB サンプル プログラムです:

#include <iostream>
#include <tbb/tbb.h>

using namespace std;

class Sum {
public:
    Sum() : sum(0) {}
    Sum(Sum& s, tbb::split) : sum(0) {}
    void operator()(const tbb::blocked_range<int>& r) {
        for (int i=r.begin();i!=r.end();i++){
            sum += i;
        }
    }
    void join(Sum&s) {
        sum += s.sum;
    }
    int getSum() const {
        return sum;
    }

private:
    int sum;
};

int main() {
    Sum s;
    tbb::parallel_reduce(tbb::blocked_range<int>(0, 1000), s);
    cout << "Sum: " << s.getSum() << endl;
    return 0;
}

この例では、並列計算を実装するために Sum クラスが定義されており、tbb::blocked_range を使用してタスクを分割し、tbb::Parallel_reduce( ) 関数により並列化が完了します。このプログラムを 4 コアを使用するコンピューターで実行すると、シングルスレッド バージョンよりも実行時間が 3 ~ 4 倍高速であることがわかります。

これら 3 つの方法にはそれぞれ長所と短所があり、どの方法を選択するかは主に特定のアプリケーション シナリオによって異なります。 OpenMP は共有メモリを備えた単一マシンでの使用に適しており、既存の C プログラムに並列化コードを簡単に追加してプログラムの実行を高速化できます。 MPI は分散コンピューティング クラスターでの使用に適しており、複数のコンピューター間でメッセージを渡すことによって並列化を実現できます。 TBB は、並列コンピューティングを簡素化するための効率的なツールを提供するクロスプラットフォーム C ライブラリです。

要約すると、並列コンピューティングを必要とするアプリケーションに対して、C は効率的な並列化のためのさまざまなオプションを提供します。開発者は、独自のニーズとアプリケーション シナリオに基づいてタスクを達成するための 1 つ以上の方法を選択し、プログラムのパフォーマンスを新しいレベルに向上させることができます。

以上がC++ コードの並列計算を実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。