Openmp:嵌套循环和分配
我想在另一个for循环中并行化一个for循环。 我可以直接在内部循环中使用“#pragma omp parallel for”指令,但是我担心每次创建一组新线程并不是最佳选择。 在外部循环(在内部循环之前)有分配和一些其他指令由单个线程完成(我分配一个矩阵在内部循环中共享,所以每个线程都应该有权访问它)。 我试图做这样的事情:
#pragma omp parallel
{
for (auto t=1;t<=time_step;++t){
#pragma omp single {
Matrix<unsigned int> newField(rows,cols);
//some instructions
}
unsigned int j;
#pragma omp for
for (unsigned int i = 2;i<=rows-1;++i){
for ( j = 1;j<=cols;++j){
//Work on NewField (i,j)
}
}
#pragma omp single {
//Instruction
}
}
}
此代码不起作用。 这样(如果我让它工作)比每次创建线程更有效率? 我做错了什么?
谢谢!
OpenMP的许多实现都保留了线程池,而不是在每个并行区域之前创建它们。
所以你可以随便走
for (auto t=1;t<=time_step;++t){
Matrix<unsigned int> newField(rows,cols);
//some instructions
unsigned int j;
#pragma omp parallel for
for (unsigned int i = 2;i<=rows-1;++i){
for ( j = 1;j<=cols;++j){
//Work on NewField (i,j)
}
}
//Instruction
}
而且由于缺少单个指令,甚至可能会更快。
你现在编写代码的方式会导致语法错误。 当您使用OpenMP指令(如单个或重要)时,大括号必须位于新行。
所以不是这个
#pragma omp single {
}
你需要这样做
#pragma omp single
{
}
链接地址: http://www.djcxy.com/p/79235.html
上一篇: Openmp: nested loops and allocation
下一篇: Nested openmp loop