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
}

问题或其中之一是 myVectorClass 是指向对象的指针。因此无法将此向量设置为共享。myVectorClass 由函数修改。之前的代码崩溃。那么,你能告诉我如何修改之前的代码(不使用 for-loop pragma)吗?

谢谢

4

1 回答 1

1

myVectorClass是一个指针向量。在您当前的代码中,您将其设置为共享。myVectorClass由于您的代码崩溃,我想您更改了in的长度function()。但是std::vector不是线程安全的,所以在多个线程中修改长度会导致其数据结构崩溃。

根据具体做什么function(),您可以有简单的解决方案。基本思想是每个线程使用一个线程本地向量function()首先收集结果,然后将这些向量连接/合并为一个向量。

此处显示的代码提供了一个很好的示例。

C++ OpenMP 并行 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 回答