C ++ openMP数组是顺序的

时间:2017-09-22 17:13:13

标签: c++ arrays multithreading openmp

我有2个数组,一个是int数组,另一个是double数组,我需要创建struct数组,其中我从数组中保存线程id,int,double值。我有n个元素和n个线程。我写了下面的代码,但不知怎的,它按顺序打印结果,结果没有混合,所以我不确定它是否并行工作。代码:

python -m pip install SomePackage

和控制台结果:

#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;

}

线程ID值发生变化,但数据始终按升序排列。

1 个答案:

答案 0 :(得分:0)

似乎循环在代码的并行化部分之外。循环按顺序遍历数据。这是人们在这种情况下所期望的。您可以在threadNumber列中看到多线程的工件,但是此代码:

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

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