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

Posted

技术标签:

【中文标题】OpenMP指定for循环迭代的线程号【英文标题】:OpenMP specify thread number of a for loop iteration 【发布时间】:2015-04-29 09:36:49 【问题描述】:

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

#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()。这可能吗?

【问题讨论】:

【参考方案1】:

在这种特殊情况下,使用循环会浪费资源。只需使用omp_get_thread_num():

#include <omp.h>

#pragma omp parallel num_threads(threads)

    int i = omp_get_thread_num();
    array[i] = calculateStuff(i,...);

【讨论】:

感谢您的提示。我会这样做,但我不能选择这个作为正确答案,因为这不能回答问题。 这不是一个答案,而是一个改进代码的建议。有时我希望 Stack Overflow 上的 cmets 在格式化方面可以更精细一些。【参考方案2】:

试试

#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

【讨论】:

我认为你是对的。显然 openmp 默认情况下会这样做。我的程序中有一个错误,使我看不到这一点。谢谢。 §2.7.1 循环构造:“当指定schedule(static, chunk_size)时,迭代被分成大小为chunk_size的块,并且这些块以循环的方式分配给团队中的线程按照线程编号的顺序进行时尚。” IE。标准确实需要它。

以上是关于OpenMP指定for循环迭代的线程号的主要内容,如果未能解决你的问题,请参考以下文章

OpenMP 无法使用映射迭代器并行化 for 循环

如何使用 OpenMP 通过 C++ std::list 并行化 for 循环?

OpenMP:在每个线程中都有一个完整的“for”循环

用一个线程做一个部分,用多个线程做一个 for 循环

在 OpenMP 中并行化嵌套循环并使用更多线程执行内部循环

OpenMP 中的线程任务调度