Próbuję zdefiniować własną redukcję dla wektorów złożonych <float>, po this answer na pytanie Reducing on array in OpenMP.Redukcja zdefiniowana przez użytkownika dla wektora o różnym rozmiarze
Ale rozmiar moich wektorów nie jest ustalony podczas kompilacji, więc nie jestem pewien jak zdefiniować inicjator dla wektora w pragma declare reduction
. Oznacza to, że nie mogę po prostu mieć tylko inicjatora dla wektorów.
Jak mogę przekazać klauzulę inicjalizującą o rozmiarze wektora potrzebnego w czasie wykonywania? To, co mam tak daleko jest poniżej:
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];
}
}
}
Twoje pytania brzmi jak mogę być ciekawe, ale ja naprawdę nie wiem, co masz pytając. Potrzebujesz więcej kodu, mniej słów i kod musi być ogólny i nie powinien zawierać szczegółów, o których prawdopodobnie będziesz wiedział. –
Aby nadać mu własną długość zamiast 'int S_private [10] = {0};' do 'int * S_private = new int [n]()', a następnie po sekcji krytycznej wykonaj 'delete [] S_private'. –
Również dostaję wyrąb przez wektor nie masz na myśli tablicy dynamicznej (std :: vector), ale wektor matematyki. Oszpeciłeś [wektor] (http://stackoverflow.com/questions/tagged/vector), który jest dla dynamicznych tablic. Czy to naprawdę jest to, czego chcesz? Twoje pytanie nie jest dla mnie jasne. –