For loop 并行化OpenMP中的while/for-目录中的文件

For loop 并行化OpenMP中的while/for-目录中的文件,for-loop,parallel-processing,directory,openmp,For Loop,Parallel Processing,Directory,Openmp,我有一段代码,可以在某个目录中的文件中搜索模式。关键是如何将其并行化。我的第一个版本: DIR * dptr = opendir(DIRNAME); struct dirent *dir; while(dir = readdir(dptr)) != NULL) { // searching in dir -> d_name; } 因此,我将while转换为: #pragma omp parallel #pragma omp for for(;(dir = readdir(dptr

我有一段代码,可以在某个目录中的文件中搜索模式。关键是如何将其并行化。我的第一个版本:

DIR * dptr = opendir(DIRNAME);
struct dirent *dir;
while(dir = readdir(dptr)) != NULL) {
    // searching in dir -> d_name;
}
因此,我将while转换为:

#pragma omp parallel
#pragma omp for
for(;(dir = readdir(dptr)) !=NULL;) {
    // searching
}
但现在我有一个错误:

应在“;”之前进行迭代声明或初始化代币对于dir=readdirdptr=无效

您知道如何使用适当的for循环组织检查目录中的每个文件吗?

OpenMP parallel for directive在线程之间拆分迭代向量。为了做到这一点,它以所谓的规范形式进行循环。即预先陈述;表示表达式,则不能跳过循环的一部分。此外,绑定表达式应为以下形式之一:less-expr及其等价形式:less-equal-expr=

所以,要修复代码,您需要

在for循环中写入初始值设定项和增量 重写当前使用的绑定表达式ne expr=
这样的代码很可能是I/O绑定的,在这种情况下,即使并行化,也不会得到任何加速…即使是大型输入文件?尤其是大型输入文件!瓶颈可能是将数据从文件移动到内存中,而不是处理数据。对于大文件,您在内核中打开/关闭它们的时间会更少,但仍然需要移动所有数据。