[英]Parallelize function using OpenMP
我正在尝试并行运行代码,但是我对与openmp相关的私有/共享等东西感到困惑。 我正在使用c ++(msvc12或gcc)和openmp。
代码遍历循环,循环由一个应并行运行的块,然后是在完成所有并行处理后应运行的块组成。 并行处理的顺序无关紧要。 代码如下:
// some X, M, N, Y, Z are some constant values
const int processes = 4;
std::vector<double> vct(X);
std::vector<std::vector<double> > stackVct(processes, std::vector<double>(Y));
std::vector<std::vector<std::string> > files(processes, M)
for(int i=0; i < N; ++i)
{
// parallel stuff
for(int process = 0; process < processes; ++process)
{
std::vector<double> &otherVct = stackVct[process];
const std::vector<std::string> &my_files = files[process];
for(int file = 0; file < my_files.size(); ++file)
{
// vct is read-only here, the value is not modified
doSomeOtherStuff(otherVct, vct);
// my_files[file] is read-only
std::vector<double> thirdVct(Y);
doSomeOtherStuff(my_files[file], thirdVct(Y));
// thirdVct and vct are read-only
doSomeOtherStuff2(thirdVct, otherVct, vct);
}
}
// when all the parallel stuff is done, do this job
// single thread stuff
// stackVct is read-only, vct is modified
doSingleTheadStuff(vct, stackVct)
}
如果对性能更好,则可以将“ doSingleThreadSuff(...)”移入并行循环,但是它需要由单个线程处理。 最内层循环中的功能顺序无法更改。
我应该如何声明#pragma omp内容才能使其正常工作? 谢谢!
要并行运行for循环,只需在for
循环语句上方使用#pragma omp parallel for
,并且在for
循环外声明的任何变量将由所有线程共享,而在for循环内声明的任何变量对每个线程都是私有的。
请注意,如果并行执行文件IO,则可能不会看到太多的加速(如果您仅做文件IO,则几乎没有加速),除非至少有一些文件位于不同的物理硬盘驱动器上。
也许是这样的(请注意,这只是一个草图,我没有验证它,但是您可以理解):
// some X, M, N, Y, Z are some constant values
const int processes = 4;
std::vector<double> vct(X);
std::vector<std::vector<double> > stackVct(processes, std::vector<double>(Y));
std::vector<std::vector<std::string> > files(processes, M)
for(int i=0; i < N; ++i)
{
// parallel stuff
#pragma omp parallel firstprivate(vct, files) shared(stackVct)
{
#pragma omp for
for(int process = 0; process < processes; ++process)
{
std::vector<double> &otherVct = stackVct[process];
const std::vector<std::string> &my_files = files[process];
for(int file = 0; file < my_files.size(); ++file)
{
// vct is read-only here, the value is not modified
doSomeOtherStuff(otherVct, vct);
// my_files[file] is read-only
std::vector<double> thirdVct(Y);
doSomeOtherStuff(my_files[file], thirdVct(Y));
// thirdVct and vct are read-only
doSomeOtherStuff2(thirdVct, otherVct, vct);
}
}
// when all the parallel stuff is done, do this job
// single thread stuff
// stackVct is read-only, vct is modified
#pragma omp single nowait
doSingleTheadStuff(vct, stackVct)
}
}
vct
和files
标记为第一个私有files
,因为它们是只读的,并且我假定不应对其进行修改,因此每个线程将为其自身获取这些变量的副本。 stackVct
被标记为在所有线程之间共享,因为它们会对其进行修改。 doSingleTheadStuff
函数,而不会强制其他线程等待。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.