widzę jaskrawo różne czasy pracy, gdy biorę pętli for w g ++ 4.7.0 i korzystania
std::vector<double> x;
std::vector<double> y;
std::vector<double> prod;
for (int i = 0; i < 5000000; i++)
{
double r1 = ((double)rand()/double(RAND_MAX)) * 5;
double r2 = ((double)rand()/double(RAND_MAX)) * 5;
x.push_back(r1);
y.push_back(r2);
}
int sz = x.size();
#pragma omp parallel for
for (int i = 0; i< sz; i++)
prod[i] = x[i] * y[i];
kod seryjny (bez openmp
) przebiega w 79 ms. kod "równoległy dla" działa w 29 ms. Jeśli pominę for
i użyję #pragma omp parallel
, środowisko wykonawcze wykona do 179 ms, , co jest wolniejsze niż kod seryjny. (Maszyna ma hw współbieżności z 8)
łącza kod do libgomp
W moim kodzie używam tej właśnie struktury. Jednak gdy używam klauzuli 'schedule (static, chunk)' dla dyrektywy, pojawia się problem. Kod działa dobrze, ale kiedy wywołuję ten kod z programu MPI, uruchamia się on w nieskończoną pętlę. Licznik pętli wynosi zero we wszystkich iteracjach tej pętli. Licznik pętli jest zdefiniowany jako prywatny w dyrektywie '#pragma omp parallel'. Nie mam pojęcia, dlaczego zawodzi tylko wtedy, gdy MPI wywołuje kod. Jestem pewien, że każdy proces MPI działa na innym procesorze klastra, jeśli to ma znaczenie. Nie wiem, czy przyczyną problemu jest harmonogram. –
To samo działa dobrze, gdy używam dyrektywy '#pragma omp parallel dla'. Powinna istnieć jakaś różnica. –
Aktualizacja: Jak się okazuje, obserwuję ten problem tylko wtedy, gdy używam klauzuli harmonogramu, więc myślę, że to nie zależy od tego, czy używam połączonego paralela dla dwóch różnych dyrektyw. –