我想将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)吗?
谢谢
答案 0 :(得分:1)
myVectorClass
是一个指针向量。在当前代码中,将其设置为共享。由于您的代码崩溃,我认为您更改了myVectorClass
中function()
的长度。但是std::vector
不是线程安全的,因此修改多个线程的长度会使其数据结构崩溃。
根据function()
的具体内容,您可以使用简单的解决方案。基本思想是每个线程使用一个线程局部向量来首先收集function()
的结果,然后将这些向量连接/合并为一个。
这里显示的代码给出了一个很好的例子。
C++ OpenMP Parallel For Loop - Alternatives to 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());
}