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