1

次のコードでは、openMP のタスク プラグマを使用したいと思います。

std::vector<Class*> myVectorClass;
#pragma omp parallel
{
    #pragma omp single nowait
    {
        for (std::list<Class*>::iterator it = myClass.begin(); it != myClass.end();) {
           #pragma omp task firstprivate(it) 
                (*it)->function(t, myVectorClass)) 
            ++it;
        }
    }
    #pragma omp taskwait
}

問題、またはその 1 つは、myVectorClass がオブジェクトへのポインターであることです。したがって、このベクターを共有として設定することはできません。関数によって myVectorClass が変更されます。前のコードがクラッシュします。では、前のコードを (for ループ プラグマを使用せずに) 変更する方法を教えていただけますか?

ありがとう

4

1 に答える 1

1

myVectorClassポインタのベクトルです。現在のコードでは、それを共有として設定します。myVectorClassコードがクラッシュするので、 inの長さを変更すると思いますfunction()。ただしstd::vector、スレッドセーフではないため、複数のスレッドで長さを変更すると、データ構造がクラッシュします。

正確に何をするかに応じてfunction()、簡単な解決策を得ることができます。基本的な考え方は、スレッドごとに 1 つのスレッドローカル ベクトルを使用してfunction()最初の結果を収集し、次にこれらのベクトルを 1 つのベクトルに連結/マージすることです。

ここに示すコードは良い例です。

C++ OpenMP Parallel For ループ - std::vector の代替

std::vector<int> vec;
#pragma omp parallel
{
    std::vector<int> vec_private;
    #pragma omp for nowait //fill vec_private in parallel
    for(int i=0; i<100; i++) {
        vec_private.push_back(i);
    }
    #pragma omp critical
    vec.insert(vec.end(), vec_private.begin(), vec_private.end());
}
于 2013-10-30T15:57:24.610 に答える