我有两个函数,第二个函数内有一个for循环。
category.posts.where(user_id: 2)
Post.my_scope
现在我想并行运行fun1() {
...
}
fun2() {
for(...) {
}
}
和fun1
(即使用单个线程的每个函数)。在fun2
里面,我希望我可以使用fun2
来执行for循环。
我试图像这样实现它。
omp parallel for
但它会多次调用fun1() {
}
fun2() {
#pragma omp for
for() {
}
}
int main() {
#pragma omp parallel
{
#pragma omp single
{
fun1();
}
fun2();
{
}
。
有没有办法做到这一点?
答案 0 :(得分:3)
您应该使用OpenMP部分和嵌套并行性的组合:
在main
:
omp_set_nested(1);
#pragma omp parallel sections num_threads(2)
{
#pragma omp section
fun1();
#pragma omp section
fun2();
}
在fun2
:
#pragma omp parallel for
for (...)
{
}
使用例如运行程序8个线程,做这样的事情:
OMP_NUM_THREADS=8 OMP_THREAD_LIMIT=8 ./program
这样,外部并行区域将以两个线程执行,fun2
中的嵌套并行区域将以七个线程执行。如果OMP_THREAD_LIMIT
未设置为8(或未设置),则OpenMP将为嵌套区域启动总共9个线程的8个线程,这可能是也可能不是。