Według OpenMP Memory Model, poniższe nie jest prawidłowe:Dostęp do prywatnej pamięci nitki w OpenMP
int *p0 = NULL, *p1 = NULL;
#pragma omp parallel shared(p0,p1)
{
int x;
// THREAD 0 // THREAD 1
p0 = &x; p1 = &x;
*p1 ... *p0 ...
}
Mój przykład wygląda następująco choć:
int *p0 = NULL, *p1 = NULL;
#pragma omp parallel shared(p0,p1)
{
int x;
// THREAD 0 // THREAD 1
p0 = &x; p1 = &x;
#pragma omp flush
#pragma omp barrier
*p1 ... *p0 ...
#pragma omp barrier
}
Mogłoby to być błędne? Nie mogę znaleźć czegoś w modelu pamięci, który by to uniemożliwił.
Zakładam, że mój przykład zabawki jest poprawny, ponieważ w modelu pamięci w wersji 3.1 pozwalają zadaniu na dostęp do zmiennej prywatnej, o ile programista zapewnia, że wciąż żyje. Biorąc pod uwagę, że zadania można odwiązać, mogą one teoretycznie wykonywać się w innym wątku roboczym, co pozwala na dostęp wątku OpenMP do pamięci prywatnej innego.
Próbuję napisać do przestrzeni adresowej wątku 0 z wątku 1 i na odwrót. Mogę wymyślić kilka interesujących aplikacji, ale nie mam jeszcze konkretnego przykładu. Po prostu eksperymentuj. Zauważ, że daję każdemu wątkowi dostęp do innej prywatnej pamięci wątków. Chcę tylko wiedzieć, czy jest to wyraźnie zabronione lub zniechęcone; model pamięci OpenMP nie jest krystalicznie czysty i jeśli rozumiem zawiłości z pragmą zadania, to może być tak, że model pamięci jest niekompletny. – ipapadop