Czy OpenMP natywnie obsługuje redukcję zmiennej reprezentującej tablicę?Czy można dokonać redukcji w tablicy z OpenMP?
to będzie działać coś jak poniżej ...
float* a = (float*) calloc(4*sizeof(float));
omp_set_num_threads(13);
#pragma omp parallel reduction(+:a)
for(i=0;i<4;i++){
a[i] += 1; // Thread-local copy of a incremented by something interesting
}
// a now contains [13 13 13 13]
Idealnie byłoby coś podobnego do równoległej omp za, a jeśli mają wystarczająco dużą liczbę wątków na to sensu, kumulacja nastąpiłaby za pośrednictwem drzewa binarnego.
tylko w Fortranu – Anycorn
Może chcesz wyjaśnić nieco więcej, co chcesz zrobić dokładnie. Pomocny może okazać się kod seryjny. – FFox
Kopanie wokół trochę więcej, brzmi jak "tylko w fortran" jest odpowiedź.Skończyło się na tym, że przydzieliłem pojedynczą dużą liczbę lokalnych kopii poza pętlę, pozwalając wątkom gromadzić się na ich własne kopie wewnątrz pętli for, a następnie gromadząc się w globalnej tablicy po pętli for, wciąż wewnątrz równoległego regionu, wewnątrz krytyczny fragment. –