2017-07-06 2 views
0

J'écris un programme parallèle en utilisant pthreads et la bibliothèque propre. Mon programme ressemble à ceci:Définir un vecteur global en utilisant la bibliothèque propre en C++

#include <Eigen/...> 
#include <pthread.h> 
... 

typedef Eigen::SparseMatrix<long double> matrizLD; 
matrizLD mat; 
typedef Eigen::Matrix<long double, Dynamic, 1> VectorLD; 
VectorLD v1; 
VectorLD v2; 

void *power_method(int rank){ 
    ... 
    int from = from_array[rank] 
    int length = length_array[rank] 
    v1.segment(from,length) = mat.block(from,0,length,size)*v2; //something like this 
} 

int main(...){ 
    size = ...; //an input parameter 
    matrizLD mat(size,size) = ...; 
    VectorLD v1(size) = ...; 
    VectorLD v2(size) = ...; 
    ... 
    pthread_create(..., power_method, ...); 
    ... 
} 

J'ai besoin essentiellement les vecteurs et la matrice à des variables globales pour pouvoir y accéder à la fonction. Le programme compile mais quand je l'exécute je reçois l'erreur suivante:

Assertion failed: (startRow >= 0 && blockRows >= 0 && startRow <= xpr.rows() - blockRows && startCol >= 0 && blockCols >= 0 && startCol <= xpr.cols() - blockCols), function Block, file ...

Au début, je pensais que je tentais d'accéder à une partie illégale du vecteur, mais je puis changé la fonction « power_method » pour:

void *power_method(int rank){ 
    v1(0); // I can do this from main with no problem 
} 

et je reçois toujours la même erreur. Je pense que la façon dont je définis le vecteur et la matrice est incorrecte, mais je n'ai rien trouvé qui indique la bonne façon de procéder.

Répondre

0

Vous avez deux v1 variables:

VectorLD v1; //global 

void *power_method(int rank){ 
    v1.segment(from,length) = mat.block(from,0,length,size)*v2; //something like this 
} 

int main(...){ 
    size = ...; //an input parameter 
    VectorLD v1(size) = ...; //oops another one 
} 

Vos principaux besoins de la variable globale initialiser. Je présume quelque chose comme

int main(...){ 
    size = ...; //an input parameter 
    v1 = VectorLD(size);// global one 
}