C ++中OpenMP中的有序线程ID

Posted

技术标签:

【中文标题】C ++中OpenMP中的有序线程ID【英文标题】:Ordered thread ids in OpenMP in c++ 【发布时间】:2017-04-14 00:33:50 【问题描述】:

我在 C++ 中使用 OpenMP。我想指定线程数(16),然后以 0 到 15 的 id 运行每个线程。 我有一个包含 16 个数字的数组,我想在每个单独的线程中将其用作参数。所以我有

    omp_set_dynamic(0);
    omp_set_num_threads(16);
    int tid;
#pragma omp parallel shared(myvector) private(tid)

    tid = omp_get_thread_num();
    // Do some calculations using myvector[tid]

但是,(tid) 不是按 0 到 15 排序的,因为有些重复两次或更多次。 如何强制它使用 16 个参数中的每一个运行一个任务?

【问题讨论】:

您的计算需要多长时间?你的 CPU 支持多少线程?例如,每个 OMP 线程可能会运行您的两个计算,是否会重复这些 tid。你试过(for)循环吗? 我在集群上运行,因此每个节点有 16 个处理器。有没有办法强制他们每个线程运行一个计算,即使他们不需要很长时间? (根据数据集,它们需要一分钟到几小时不等) 恐怕这个问题不清楚,不可重复且非常广泛。你必须更准确地描述你所做的、你期望的和你观察到的。提供 minimal reproducible example 并准确描述您如何编译和执行它以及在什么环境下运行它(编译器!)。您是否在多个节点上运行?什么是“计算”? 【参考方案1】:

团队中的每个线程并行执行所有语句 工作共享结构除外。

我试过这个简单的代码

#include <omp.h>
#include <stdio.h>

int main()
    omp_set_dynamic(0);
    omp_set_num_threads(32);
    int tid;
    double *myvector;
#pragma omp parallel shared(myvector) private(tid)
    
        tid = omp_get_thread_num();
        printf("Thread number = %d\n",tid);
        // Do some calculations using myvector[tid]
    
    return 0;

得到了正确的结果:

Thread number = 3
Thread number = 4
Thread number = 0
Thread number = 5
Thread number = 6
Thread number = 7
Thread number = 8
Thread number = 9
Thread number = 10
Thread number = 11
Thread number = 12
Thread number = 13
Thread number = 14
Thread number = 15
Thread number = 1
Thread number = 2

请在您的机器上检查它或写下有关您尝试过的代码和输出的更多信息。

【讨论】:

以上是关于C ++中OpenMP中的有序线程ID的主要内容,如果未能解决你的问题,请参考以下文章

OpenMP C++ 中的线程

C ++中的QNX面向对象线程

循环C ++中的分段错误Openmp

并行任务中的 C++ OpenMP 变量可见性

C中的traceroute,响应中的ICMP id错误

搞懂Objective-C中的autorelease