2017-09-22 5 views
0

J'ai 2 tableaux, l'un est tableau int et l'autre est tableau double, j'ai besoin de créer un tableau struct dans lequel je sauvegarde l'ID de thread, int, double valeurs de tableau. J'ai n éléments et n threads. J'ai écrit le code suivant, mais de toute façon il imprime les résultats dans l'ordre séquentiel, les résultats ne sont pas mélangés, donc je ne suis pas vraiment sûr que cela fonctionne en parallèle du tout. Code:C++ openMP array est séquentiel

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

} 

Et résultat console:

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 fil des valeurs changements, mais les données sont toujours dans l'ordre croissant.

Répondre

0

Il semble que la boucle soit en dehors de la partie parallélisée du code. La boucle suit séquentiellement les données. C'est ce que l'on pourrait attendre dans ce cas. Vous pouvez voir des artefacts du multithreading dans la colonne threadNumber, mais ce code:

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

assure que les valeurs seront les mêmes quel que soit le fil est en train d'écrire au tableau car ces valeurs sont juste en utilisant l'indice de l'intérieur la boucle (dans le fil).