2017-09-22 30 views
0

我有2個數組,一個是int數組,另一個是雙數組,我需要創建struct數組,其中我保存了線程id,int,數組中的double值。我有n個元素和n個線程。我寫了下面的代碼,但不知何故,它按順序打印結果,結果沒有混合,所以我不確定它是否可以並行工作。代碼:C++ openMP數組是連續的

#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值的變化,但數據總是按升序排列。

回答

0

看起來循環在代碼的並行化部分之外。循環依次通過數據。這是人們在這種情況下期望的。你可以看到在threadNumber列多線程的文物,但是這個代碼:

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

保證值將是相同的,無論因爲這些值都只是用指數從內哪個線程寫入到陣列循環(在線程內)。