ホームページ >バックエンド開発 >C++ >OpenMP 並列 For ループの `std::vector` に代わる最良の選択肢は何ですか?

OpenMP 並列 For ループの `std::vector` に代わる最良の選択肢は何ですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-05 12:30:11822ブラウズ

What are the Best Alternatives to `std::vector` in OpenMP Parallel For Loops?

C OpenMP 並列 For ループ: std::vector の代替

OpenMP の並列 for ループは、コードを並列化する便利な方法を提供します。ただし、これらのループ内で共有データ構造を使用すると、パフォーマンスのボトルネックが発生する可能性があります。一般的に使用されるデータ構造の 1 つである std::vector は、並列ループでの共有使用には最適な選択ではない可能性があります。

std::vector の代替

並列 for ループで最適なパフォーマンスとスレッドの安全性を実現するには、次の代替案を検討してください。 std::vector:

ユーザー定義のリダクションを使用した std::vector

OpenMP 4.0 ではユーザー定義のリダクションが導入され、カスタム データのカスタム リダクション操作を定義できるようになりました。構造物。このアプローチでは、共有データのロックのオーバーヘッドを回避することでパフォーマンスを向上させることができます。

例:

#pragma omp declare reduction(merge : std::vector<int> : omp_out.insert(omp_out.end(), omp_in.begin(), omp_in.end()))

std::vector<int> vec;
#pragma omp parallel for reduction(merge: vec)
for (int i = 0; i < 100; i++) vec.push_back(i);

順序ベクトル

共有ベクトル内の要素の順序が重要な場合は、次の点を考慮してください。アプローチ:

std::vector<int> vec;
#pragma omp parallel
{
    std::vector<int> vec_private;
    #pragma omp for schedule(static) nowait
    for (int i = 0; i < N; i++) vec_private.push_back(i);

    #pragma omp for schedule(static) ordered
    for (int i = 0; i < omp_get_num_threads(); i++) {
        #pragma omp ordered
        vec.insert(vec.end(), vec_private.begin(), vec_private.end());
    }
}

カスタム並列ベクトル クラス

複雑な共有データ構造の場合、ループ中のサイズ変更を処理するために、カスタム並列ベクトル クラスを実装する必要がある場合があります。スレッドの安全性と効率性パフォーマンス。

例:

class ParallelVector {
private:
    std::vector<int> data;
    std::atomic<size_t> size;

public:
    void push_back(int value) {
        size++;
        data.push_back(value);
    }

    size_t getSize() {
        return size.load();
    }
};

ParallelVector vec;

#pragma omp parallel
{
    #pragma omp for
    for (int i = 0; i < 100; i++) vec.push_back(i);
}

std::vector の代替手段の選択は、並列ループの特定の要件によって異なります。スレッドの安全性、パフォーマンス、実装の容易さなどの要素を考慮して、アプリケーションに最適なソリューションを選択してください。

以上がOpenMP 並列 For ループの `std::vector` に代わる最良の選択肢は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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