2011-11-17 9 views
5

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.

Odpowiedz

1

To powinno zadziałać. Opcja Flush synchronizuje wszystkie zmienne współdzielone i gwarantuje, że środowisko MP ze wszystkimi wątkami jest nadal aktywne. Dopóki nie użyjesz p0 w przypisaniu p1s lub na odwrót, powinno być dobrze. Chociaż nie mogę sobie wyobrazić, dlaczego ktoś mógłby zrobić coś takiego. Może możesz powiedzieć więcej o uzasadnieniu stojącym za tą konstrukcją.

Od P0 i P1 są wciąż żywe po regionie równoległego, można zrobić wszystkie zadania również tam bez barier itp ..

+0

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

1

W myśl bocznej, jest analogiczna do próby odczytu lokalną zmienną wewnątrz niektórych funkcja, którą wywołałeś przypisując tę ​​zmienną lokalną do zmiennej globalnej, a następnie odczytując zmienną globalną.

Analogia jest taka, że ​​zmienna globalna działa jak wielodzielna zmienna w wielowątkowości, zasadniczo dając dostęp do tego, co miało być wątkiem prywatnym (jak zmienna lokalna, która powinna być widoczna tylko w funkcji).

Aby odpowiedzieć na pytanie, które zadałeś, wykonywanie dereferencji w prywatnej pamięci wątku jest całkowicie poprawne. Jest to dozwolone, ponieważ aliasowanie wskaźnika jest dozwolone (w tym przypadku 2 lub więcej zmiennych zapewnia dostęp do tej samej lokalizacji w pamięci, w twoim przypadku jedna jest prywatną prywatną liczbą całkowitą, a druga jest współdzielonym wskaźnikiem).

Chociaż jest to całkowicie poprawne, należy pamiętać, że może to spowodować trudne do wykrycia warunki wyścigu, ponieważ zwykle nie można użyć blokady do ochrony dostępu do prywatnych zmiennych wątku.

+0

+1 za podanie aliasingu wskaźnika. Jednak nadal nie jest jasne, czy to, co robię, jest ważne w modelu pamięci. Sprawdził się we wszystkich kompilatorach/platformach, z których korzystałem, ale to nie znaczy, że są poprawne. – ipapadop

Powiązane problemy