Je funkce bez smyčky paralelizovatelné?

hlasů
3

s ohledem na níže uvedený kód, můžeme považovat za rovnoběžné, i když nejsou žádné smyčky?

#include <omp.h>

int main(void) {
  #pragma omp parallel
  {
    int a = 1;
    a = 0;
  }
  return 0;
}
Položena 27/11/2018 v 17:58
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
6

Přímá odpověď:

Ano, tady je část kódu,

int a = 1;
a = 0;

Běží souběžně, s časy, kde P je počet jader na vašem počítači.

Například na čtyři základní stroj, se vkládá kód (s příslušnými dovozu),

int main(void) {
    #pragma omp parallel
    {
        printf("Thread number %d", omp_get_thread_num());
    }
    return 0;
}

by výkon:

Thread number 0
Thread number 1
Thread number 2
Thread number 3

Všimněte si, že když běží paralelně, neexistuje žádná záruka na pořadí výstupu, takže výstup by mohl stejně pravděpodobné, že bude něco jako:

Thread number 1
Thread number 2
Thread number 0
Thread number 3

Navíc, pokud jste chtěli zadat počet vláken použitých v paralelní oblasti, místo #pragma omp parallelvás mohl psát #pragma omp parallel num_threads(4).


Další vysvětlení:

Pokud jste stále zmateni, může být užitečné k lepšímu pochopení rozdílu mezi paralelně k vedení a paralelní kód regionů.

#pragma omp parallelříká kompilátoru, že následující blok kódu je možno provádět paralelně. To zaručuje, že všechny kód v rámci paralelního regionu bude mít hotový popravu před pokračováním k následnému kódu.

V následujícím (hračka) Například programátor je zaručeno, že po paralelní oblasti, pole bude mít všechny položky nastavené na nulu.

int *arr = malloc(sizeof(int) * 128); 
const int P = omp_get_max_threads();

#pragma omp parallel num_threads(P)
{
    int local_start = omp_get_thread_num();
    int local_end = local_start + (100 / P);
    for (int i = local_start; i < local_end; ++i) {
        arr[i] = 0;
    }

}
// any code from here onward is guaranteed that arr contains all zeros!

Ignorování rozdíly v časovém rozvrhu, tento úkol mohl ekvivalentně provést za použití paralelní pro smyčku následujícím způsobem:

int *arr = malloc(sizeof(int) * 128); 
const int P = omp_get_max_threads();

#pragma omp parallel num_threads(P) for
for (int i = 0; i < 128; ++i) {
    arr[i] = 0;
}
// any code from here onward is guaranteed that arr contains all zeros!

V podstatě, #pragma omp parallelumožní vám popsat oblastí kódu, které mohou vykonávat paralelně - to může být mnohem pružnější než paralelně pro smyčce. Na rozdíl od toho #pragma omp parallel forby měla být obecně použity pro paralelizovat smyčky s nezávislými iterací.

I může dále zpracovat na rozdíly ve výkonnosti, pokud si přejete.

Odpovězeno 27/11/2018 v 18:13
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more