是否可以与OpenMP并行处理一个列表,该列表可以在每次迭代时添加新元素?

有什么办法可以使用openmP将循环与可能在每次迭代中添加更多元素的列表并行化?据我了解,openmP可以通过将每个线程的范围分成多个块来并行化for循环,但是在这种情况下,范围会改变,对于一种情况,循环可能有10次迭代,而对于另外100次,则是列出我通常会有大约10-20个元素。

这是我要并行化的示例(请注意,将事物插入到vectorOfResults中的顺序无关紧要)

while(!list.empty()) {
 vectorOfResults.push_back(performExpensiveFunction());
 if (conditions) {
   add new elements to the list;
 }
}

我一直在考虑在while循环内执行类似的操作,使用列表中当前“批处理”元素的for循环(将它们复制到临时列表中),然后下一次while迭代将使用新添加的元素,但是我在考虑是否有一种方法可以使用其他openmp构造。 (我现在只介绍一下openmp)。

感谢您的帮助。

wshguofeng 回答:是否可以与OpenMP并行处理一个列表,该列表可以在每次迭代时添加新元素?

我认为一旦启动并行for循环,就不可能增大其大小。

您可以一个接一个地运行多个并行for循环,直到按照this answer中的建议处理完所有数据为止。像这样:

Data proccessInParallel(Data d) {
    Data newData
    #pragma omp parellel for
    for (int i = 0; i < d.size i++) {
        // Do some processing
        if (create_new) {
            #pragma omp critical
            {
                newData.push_back(data)
            }
        }
    }
    return newData;
}

int main() {
   Data data;
   // Process data in batches until no new data is created
   do {
       data = proccessInParallel(data);
   } while (!data.empty());

不利的一面是,某些线程可能在处理“批处理”之间时未被使用。


您也可以尝试使用tasks分析新的列表项,而不必等待启动另一个for循环。

也许像这样:


#pragma omp parallel for
for (int i = 0; i < N; i++) {
    process(data[i]);
    if (new_data) {
        #pragma omp task
        {
        process(new_data);
        }
    }
}

该任务将在有可用线程执行时立即执行。

本文链接:https://www.f2er.com/3150459.html

大家都在问