OpenMP指定for循环迭代的线程号

时间:2015-04-29 09:36:49

标签: c++ multithreading parallel-processing openmp

我使用以下命令在程序的可用线程上并行化单个循环:

#pragma omp parallel for num_threads(threads)
for(long i = 0; i < threads; i++)
{
    array[i] = calculateStuff(i,...);
}

由于技术原因,我想保证第0号线程执行i=0,第1号线程执行i=1。换句话说,我总是想要i=omp_get_thread_num()。这可能吗?

2 个答案:

答案 0 :(得分:4)

尝试

#pragma omp parallel for num_threads(threads) schedule(static,1)

现在@Hristo Iliev已经出现了,我100%确信OpenMP标准要求静态计划将迭代0分配给线程0,1到1,

尝试一下,让我们知道你是怎么过的。

然后再次

#pragma omp parallel for num_threads(threads) schedule(dynamic,1)

也应该工作,因为你只有你拥有线程的迭代次数。但是,如果线程0在线程n开始之前完成其工作,则线程0将获取迭代n

答案 1 :(得分:4)

在特定情况下使用循环是浪费资源。只需使用omp_get_thread_num()

#include <omp.h>

#pragma omp parallel num_threads(threads)
{
    int i = omp_get_thread_num();
    array[i] = calculateStuff(i,...);
}