C OpenMP阵列是顺序的

C++ openMP array is sequential

本文关键字:顺序 阵列 OpenMP      更新时间:2023-10-16

我有2个数组,一个是int数组,另一个是双阵列,我需要创建struct ranay,其中我在其中保存线程ID,int,double值。我有n个元素和n个线程。我编写了以下代码,但是它以某种方式按顺序打印结果,结果并不混杂,因此我不确定它是否完全可以并行起作用。代码:

#include <iostream>
#include <omp.h>
using namespace std;
struct Data {
    int threadNumber;
    double doubleNumber;
    int intNumber;
};
int main() {
    int numbOfThreads = 20;
    omp_set_num_threads(numbOfThreads);
    double s2[50];
    double s1[50];
    Data allArray[50];
    for (int i = 0; i < numbOfThreads; i++) {
        s2[i] = i * 0.15;
        s1[i] = i;
    }
    int threadNumber = 0;
#pragma omp parallel private(threadNumber)
    {
        threadNumber = omp_get_thread_num();
        for (int i = threadNumber; i < 20; i++) {
            allArray[i].threadNumber = threadNumber;
            allArray[i].intNumber = s1[i];
            allArray[i].doubleNumber = s2[i];
        }
    }
    for (int i = 0; i < numbOfThreads; i++) {
        cout << allArray[i].threadNumber << " " << allArray[i].intNumber << " " << allArray[i].doubleNumber << endl;
    }
    return 0;
}

和控制台结果:

0 0 0
1 1 0.15
2 2 0.3
1 3 0.45
1 4 0.6
1 5 0.75
6 6 0.9
7 7 1.05
8 8 1.2
9 9 1.35
10 10 1.5
11 11 1.65
12 12 1.8
13 13 1.95
14 14 2.1
15 15 2.25
16 16 2.4
17 17 2.55
18 18 2.7
19 19 2.85

线程ID值更改,但数据始终按顺序排列。

看来,循环在代码的并行部分之外。循环通过数据依次逐步逐步逐步逐步逐步逐步逐步逐步逐步逐步逐步逐步进行。在这种情况下,这就是人们所期望的。您可以在"线程"列中看到多线程的工件,但是此代码:

        allArray[i].intNumber = s1[i];
        allArray[i].doubleNumber = s2[i];

确保值无论哪个线程写入数组,这些值都将是相同的,因为这些值只是在循环中使用索引(线程内)。