簡體   English   中英

C ++ openMP數組是順序的

[英]C++ openMP array is sequential

我有2個數組,一個是int數組,另一個是double數組,我需要創建一個struct數組,在其中保存線程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值會更改,但是數據始終按升序排列。

看起來循環在代碼的並行化部分之外。 循環依次瀏覽數據。 這就是這種情況下的期望。 您可以在threadNumber列中看到多線程的工件,但是此代碼:

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

確保無論哪個線程正在將數據寫入數組,這些值都將相同,因為這些值僅使用循環內(線程內)的索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM