2011-10-23 11 views
5

Mam pętlę #pragma omp parallel for wewnątrz metody klasy. Każdy wątek odczytuje tylko kilka zmiennych lokalnych metody, kilka prywatnych danych wywołania i parametr metody. Wszystkie one są zadeklarowane w klauzuli shared. Moje pytania:Współdzielenie OpenMP a pierwszorzędne poświadczenie wydajności

  • Wydajność mądry nie powinien żadnej różnicy zadeklarować te zmienne shared lub firstprivate. Dobrze?
  • Czy to samo dotyczy sytuacji, gdy nie uważam, aby zmienna nie współużytkowała tej samej linii pamięci podręcznej?
  • Jeśli jedną ze zmiennych współużytkowanych jest wskaźnik, a wewnątrz wątku odczytałem wartość przez nią, czy występuje problem z aliasingiem, jak w zwykłych pętlach?

Jutro spróbuję profilować mój kod. W międzyczasie dziękuję za radę!

Odpowiedz

9
  1. Cóż, to nie to samo. Dzięki shared są one dzielone między wszystkie wątki. Dzięki firstprivate każdy wątek otrzymuje własną kopię. Jeśli czytasz tylko zmienną, lepiej zostawić ją jako shared, aby uniknąć jej kopiowania. (W języku C++, firstprivate będzie pośrednio wywołać konstruktor kopiujący.)

  2. poprawne, wiele wątków czytanie i pisanie na wartościach, które siedzą na tym samym cacheline nazywa false sharing. Linia pamięci podręcznej będzie odbijać się pomiędzy rdzeniami, które uzyskują dostęp do niej - co może spowodować znaczne spowolnienie, jeśli zdarza się to często.

  3. Jeśli czytasz dane tylko we współużytkowanym wskaźniku, to nie powinno być problemu. Ale jeśli również piszesz do tego, musisz upewnić się, że nie masz warunków wyścigu.