User Defined Reduction bei Vektoren unterschiedlicher Größe
Ich versuche, meine eigene Reduktion für Vektoren des komplexen <float> zu definieren, indem ich @ foldiese Antwort zur FrageArray in OpenMP reduzieren.
Aber die Größe meiner Vektoren ist zur Kompilierungszeit nicht festgelegt, daher weiß ich nicht, wie der Initialisierer für den Vektor im @ definiert wirdeclare reduction
Pragma. Das heißt, ich kann nicht nur @ hab
initializer( omp_priv=TComplexVector(10,0) )
Aber der Initialisierer wird für Vektoren benötigt.
Wie kann ich der Initialisierungsklausel die Größe des Vektors übergeben, den ich zur Laufzeit benötige? Was ich bisher habe 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];
}
}
}