Ich versuche, meine eigene Reduktion für Vektoren des Komplexes <float>, nach this answer auf die Frage Reducing on array in OpenMP zu definieren.Benutzerdefinierte Reduktion auf Vektor unterschiedlicher Größe
Aber die Größe meiner Vektoren sind nicht zur Kompilierzeit festgelegt, so dass ich nicht sicher bin, wie Sie den Initialisierer für den Vektor im Pragma declare reduction
definieren. Das heißt, ich kann nicht einfach haben
initializer(omp_priv=TComplexVector(10,0))
Aber der Initialisierer wird für Vektoren benötigt.
Wie kann ich die Initializerklausel die Größe des Vektors, den ich zur Laufzeit brauche, übergeben? Was ich bis jetzt haben, ist unten:
typedef std::vector<complex<float>> TCmplxVec;
void ComplexAdd(TCmplxVec & x,TCmplxVec & y){
for (int i=0;i<x.size();i++)
{
x.real()+= y.real();
//... same for imaginary part and other operations
}
}
#pragma omp declare reduction(AddCmplx: TCmplxVec: \
ComplexAdd(&omp_out, &omp_in)) initializer(\
omp_priv={TCmplxVec(**here I want a variable length**,0})
void DoSomeOperation()
{
//TCmplxVec vec is empty and anotherVec not
//so each thread runs the inner loop serially
#pragma omp parallel for reduction(AddCmplx: vec)
for (n=0 ; n<10 ; ++n)
{
for (m=0; m<=someLength; ++m){
vec[m] += anotherVec[m+someOffset dependend on n and else];
}
}
}
Ihre Frage klingt wie ich interessant sein könnte, aber ich weiß, gibt es wirklich nicht, was du bist fragend. Sie benötigen mehr Code weniger Wörter und der Code muss allgemein sein und sollte keine Details enthalten, von denen Sie wahrscheinlich wissen werden. –
Geben Sie Ihrer eigenen Länge statt 'int S_private [10] = {0};' do 'int * S_private = new int [n]()' und dann nach dem kritischen Abschnitt 'delete [] S_private'. –
Auch ich bekomme das Fällen von Vektor Sie nicht ein dynamisches Array (Std :: Vector), sondern eine mathematische Vektor. Sie haben [vector] (http://stackoverflow.com/questions/tagged/vector) für dynamische Arrays eingegeben. Ist das wirklich was du willst? Deine Frage ist mir nicht klar. –