Ich schreibe ein paralleles Programm mit Pthreads und Eigenbibliothek. Mein Programm sieht wie folgt aus:Definieren globalen Vektor mit Eigenbibliothek in 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, ...);
...
}
Ich brauche im Grunde die Vektoren und die Matrix globale Variablen in der Lage sein, um sie in der Funktion zuzugreifen. Das Programm kompiliert, aber wenn ich es ausführen bekomme ich folgende Fehlermeldung:
Assertion failed: (startRow >= 0 && blockRows >= 0 && startRow <= xpr.rows() - blockRows && startCol >= 0 && blockCols >= 0 && startCol <= xpr.cols() - blockCols), function Block, file ...
Zuerst dachte ich, ich einen illegalen Teil des Vektors zuzugreifen versuche, aber ich änderte dann den „power_method“ -Funktion für:
void *power_method(int rank){
v1(0); // I can do this from main with no problem
}
und ich bekomme immer noch den gleichen Fehler. Meine Vermutung ist, dass die Art, wie ich den Vektor und die Matrix definiere, falsch ist, aber ich konnte nichts finden, was sagt, was der richtige Weg ist.