Sto cercando di definire la mia riduzione per i vettori del complesso <float>, seguendo this answer alla domanda Reducing on array in OpenMP.Riduzione definita dall'utente su vettori di dimensioni variabili
Ma la dimensione dei miei vettori non è fissa al momento della compilazione, quindi non sono sicuro di come definire l'inizializzatore per il vettore nel pragma declare reduction
. Cioè, non posso semplicemente avere
initializer(omp_priv=TComplexVector(10,0))
Ma l'inizializzatore è necessario per i vettori.
Come posso passare alla clausola di inizializzazione la dimensione del vettore di cui ho bisogno in fase di esecuzione? Quello che ho finora è inferiore:
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];
}
}
}
vostre domande suona come potrei essere interessante, ma io davvero non so cosa sei chiedendo. Hai bisogno di più codice less less e il codice deve essere generale e non dovrebbe contenere dettagli di cui probabilmente sei a conoscenza. –
Per dargli la tua lunghezza invece di 'int S_private [10] = {0};' fai 'int * S_private = new int [n]()' e poi dopo la sezione critica fai 'delete [] S_private'. –
Anche io ottengo l'abbattimento per vettore non intendi un array dinamico (std :: vector) ma un vettore matematico. Hai taged [vector] (http://stackoverflow.com/questions/tagged/vector) che è per gli array dinamici. E 'davvero ciò che vuoi? La tua domanda non mi è chiara. –