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

标签 c++ multithreading openmp

我在 C++ 中使用 OpenMP。我想指定线程数 (16),然后运行 ​​ID 为 0 到 15 的每个线程。 我有一个包含 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 个参数中的每一个运行一个任务?

最佳答案

Each thread in the team executes all statements within a parallel region except for work-sharing constructs.

我试过这个简单的代码

#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++ - C++ 中 OpenMP 中的有序线程 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43403667/

相关文章:

c++ - 通过 openmp 在 C++ 中并行化 three_for_loop

c - 前缀和的并行化 (Openmp)

c++ - 如何在没有任何缓冲区的情况下将 stderr 重定向到文件?

c++ - 是否可以在引发异常时记录异常?

java - 无法从 CompletableFuture 中的异常传播自定义异常

c++ - ZMQ经销商-路由器-经销商模式

c - 数组 : "error: reduction variable must be shared on entry to this OpenMP pragma" 中的 OpenMP SIMD 缩减

c++ - 为什么每次都为局部范围内的变量分配相同的地址?

C++ 查找数组中不是特定值的最高元素

android - 在 Android Java 类中调用 "getContentResolver "