2015-03-11 2 views
0

J'essaye d'utiliser STXXL pour construire une grande matrice et être capable d'effectuer plusieurs opérations différentes sur la matrice. Actuellement, j'utilise stxxl::vector comme un moyen de stocker des sous-matrices de ma grande matrice. Ce que je tente de faire est de normaliser chaque colonne de la matrice. Donc, ma seule dépendance aux données devrait être dans les colonnes. Lorsque je tente d'utiliser OpenMP pour paralléliser l'accès aux sous-matrices que je reçois le message d'erreurParalléliser le conteneur STXXL

[STXXL-ERRMSG] demande ECRITURE soumis à un BID avec READ en attente demande

encore et encore. Ai-je mal compris quelque chose sur la sécurité des fils de STXXL? Parce que ce que je fais ne devrait jamais accéder à la même sous-matrice. Voici le code exemple, je suis en train de déboguer et d'exécuter:

#include <iostream> 
#include <stxxl/vector> 

#define FEATURE_LENGTH 128 
#define PARTITION_SIZE 16 

typedef stxxl::VECTOR_GENERATOR<int>::result vec; 

using namespace std; 

struct MyMatrix 
{ 
    float A[FEATURE_LENGTH*PARTITION_SIZE]; 
}; 

int main() 
{ 
    const int N = (1 << 20); 
    stxxl::vector<MyMatrix> C; 
    for (int n = 0; n < N; ++n) { 
     MyMatrix A; 
     for (size_t j = 0; j < PARTITION_SIZE; ++j) { 
      for (size_t i = 0; i < FEATURE_LENGTH; ++i) { 
       A.A[j*FEATURE_LENGTH + i] = n; 
      } 
     } 
     if (n == 0) { 
      std::cout << "sizeof(A) = " << sizeof(A) << std::endl; 
     } 
     C.push_back(A); 
    } 

    #pragma omp parallel for shared(C) 
    for (unsigned long long m = 0; m < C.size(); ++m) { 
     for (int j = 0; j < PARTITION_SIZE; ++j) { 
      MyMatrix& C_m = C[m]; 
      float sum = 0; 
      for (int i = 0; i < FEATURE_LENGTH; ++i) { 
       sum += C_m.A[j*FEATURE_LENGTH + i]; 
      } 
      if (sum != 0) { 
       for (int i = 0; i < FEATURE_LENGTH; ++i) { 
        C_m.A[j*FEATURE_LENGTH + i] /= sum; 
       } 
      } 
     } 
    } 
    return 0; 
} 

Les drapeaux CXX Je suis en cours d'exécution sont

-fopenmp -W -Wall std = C++ 11 -O3

Répondre

1

L'accès au même vecteur n'est pas sécurisé. Pensez à ce que fait le vecteur: c'est un système de pagination complexe, qui n'est pas sûr pour les threads.

+0

Très bien, comment exactement le système de radiomessagerie n'est pas sûr pour les threads. Je suppose que mon interprétation de la sécurité du thread des gestionnaires de blocs est incorrecte à partir de . Cela répond à ma question, mais cela ne m'aide pas vraiment à comprendre. – mculp