Udostępnij za pośrednictwem


2.4.1 dla konstrukcji

Dla dyrektywy identyfikuje iteracyjne konstrukcja podziału pracy określająca, że iteracji pętli skojarzone będzie wykonywane równolegle.Liczba iteracji, z dla pętli są rozłożone na wątki, które już istnieją w zespole wykonywane równolegle konstrukcja, która wiąże.Składnia dla konstrukcja jest w następujący sposób:

#pragma omp for [clause[[,] clause] ... ] new-line
   for-loop

Klauzula jest jedną z następujących czynności:

prywatne (listy zmiennej)

firstprivate (listy zmiennej)

lastprivate (listy zmiennej)

reduction(operator : variable-list)

Zamówione

schedule(kind, chunk_size)

nowait

Dla dyrektywy nakłada ograniczenia na strukturę odpowiadającą mu dla pętli.W szczególności odpowiednie dla pętli musi mieć kształt kanonicznym:

for (init-expr;b logiczne op var.incr-expr)

  • init wyrażenie
    Jedną z następujących czynności:

    var = lb

    Typ Integer var. = lb

  • wyrażenie incr
    Jedną z następujących czynności:

    ++var

    var ++

    -- var

    var --

    var += incr

    var -= incr

    var = var + incr

    var = incr + var

    var = var - incr

  • var
    Zmienna liczba całkowita ze znakiem.Jeśli ta zmienna, w przeciwnym razie byłyby udostępniony, niejawnie staje się prywatnych na czas trwania dla.Zmienna ta nie musi zostać zmodyfikowana w treści dla instrukcji.O ile nie jest określona zmienna lastprivate, jej wartość po pętli jest nieokreślony.

  • op logiczne
    Jedną z następujących czynności:

    <

    < =

    >

    > =

  • lb, b, and incr
    Pętla niezmienny całkowitą wyrażeń.Dochodzi do synchronizacji w trakcie oceny tych wyrażeń.W ten sposób wszelkich ocenione skutków ubocznych dawać wyniki nieokreślone.

Należy zauważyć, że w formie kanonicznej pozwala liczbę iteracji pętli należy obliczyć przy wjeździe do pętli.Obliczenie to jest wykonywane z wartościami w rodzaju var., po integralną promocji.W szczególności, jeśli wartość b - lb + incr nie może być reprezentowana w tym typ, wynik jest nieokreślony.Jeśli dalsze, op logiczne jest < lub < = następnie wyrażenie incr musi spowodować var. do zwiększenia w każdej iteracji pętli.Jeśli op logiczne jest > lub > = następnie wyrażenie incr musi spowodować var. do zmniejszenia w każdej iteracji pętli.

Harmonogramu określa klauzula jak iteracji z dla pętla są podzielone między wątki zespołu.Poprawność program nie może zależeć od na który wątek wykonuje konkretnej iteracji.Wartość chunk_size, jeśli określony, musi być wyrażenie niezmienny całkowitą pętli z wartością dodatnią.Dochodzi do synchronizacji podczas przeprowadzania oceny tego wyrażenia.W ten sposób wszelkich ocenione skutków ubocznych dawać wyniki nieokreślone.Harmonogram rodzaju może być jedną z następujących czynności:

Tabela 2-1 harmonogramu klauzuli rodzaju wartości

statyczne

Gdy harmonogramu (statyczny, chunk_size) jest określony, iteracji są podzielone na kawałki o rozmiarze określonym przez chunk_size.Fragmenty są przypisywane statycznie wątki w zespole w sposób okrężny w kolejności od liczby wątków.Gdy nie chunk_size jest określony obszar iteracji jest podzielony na fragmenty, które są w przybliżeniu równe wielkości, z jednym fragmencie, przypisany do każdego wątku.

dynamiczne

Gdy harmonogramu (dynamicznych, chunk_size) jest określony, iteracji są podzielone na szereg fragmentów, każdy zawierający chunk_size iteracji.Każdy fragment jest przypisany do wątku, który czeka na przypisanie.Wątek wykonuje fragmencie iteracji, a następnie czeka jej dalej przydziału, dopóki nie fragmenty pozostają ma być przypisany.Należy zauważyć, że ostatni fragment ma być przypisany może mieć mniejszej liczby iteracji.Gdy nie chunk_size jest określony, domyślnie przyjmuje wartość 1.

z przewodnikiem

Gdy harmonogramu (z przewodnikiem, chunk_size) jest określony, iteracji są przypisane do wątków w kawałkach o zmniejszenie rozmiarów.Po zakończeniu jej przypisane fragmencie iteracji wątku go jest dynamicznie przypisywany innego fragmentu, dopóki nie dotyczy pozostaną.Dla chunk_size 1, rozmiar każdego fragmentu jest około liczba iteracji nieprzypisane, podzielona przez liczbę wątków.Około wykładniczo zmniejszyć rozmiary do 1.Dla chunk_size z wartością k większy niż 1, wielkości około zmniejszyć wykładniczo do k, z wyjątkiem, że ostatni fragment może mieć mniej niż k iteracji.Gdy nie chunk_size jest określony, domyślnie przyjmuje wartość 1.

Runtime

Gdy schedule(runtime) jest określony, decyzji dotyczących planowania jest odroczone do czasu wykonywania.Harmonogram rodzaju i w czasie wykonywania można wybrać rozmiar fragmenty, ustawiając zmienną środowiskową OMP_SCHEDULE.Jeśli nie ustawiono tę zmienną środowiskową, harmonogram wynikowy jest zdefiniowane w implementacji.Gdy schedule(runtime) jest określony, chunk_size nie może być określony.

W przypadku braku jawnie zdefiniowane harmonogramu klauzuli, domyślnie harmonogramu jest zdefiniowane w implementacji.

Program zgodny z OpenMP nie powinny polegać na określonego harmonogramu za prawidłowe wykonanie.Program nie powinny polegać na harmonogram rodzaju odpowiadające precyzyjnego opisu podanego powyżej, ponieważ mają różnice w implementacjach tego samego harmonogramu rodzaju całej różnych kompilatorów.Opisy można wybrać harmonogram, który jest odpowiedni dla szczególnej sytuacji.

Uporządkowane klauzuli musi być obecny, gdy uporządkowane powiązać dyrektyw dla skonstruować.

Istnieje niejawna bariery na końcu dla konstruowania, chyba że nowait jest określony w klauzuli.

Ograniczenia do dla dyrektywy są w następujący sposób:

  • Dla pętli musi być structured bloku i, dodatkowo jego wykonanie nie musi być zakończona przez break instrukcji.

  • Wartości w pętli sterowania wyrażenia dla pętli związane z dla dyrektywy muszą być takie same dla wszystkich wątków w zespole.

  • Dla Zmienna iteracji pętli musi być typu Liczba całkowita ze znakiem.

  • Tylko jeden harmonogramu klauzula może pojawić się na do dyrektywy.

  • Tylko jeden uporządkowane klauzula może pojawić się na do dyrektywy.

  • Tylko jeden nowait klauzula może pojawić się na do dyrektywy.

  • Jest nieokreślony if lub jak często jakiejkolwiek stronie efekty w ramach chunk_size, lb, b, lub incr występują w wyrażeniach.

  • Wartość chunk_size wyrażenie musi być taka sama dla wszystkich wątków w zespole.

Odsyłacze:

  • prywatne, firstprivate, lastprivate, i redukcji klauzule, zobacz ppkt 2.7.2 na stronie 25.

  • OMP_SCHEDULE środowiska zmiennej, zobacz ppkt 4.1 na stronie 48.

  • uporządkowane konstruowania, zobacz sekcji 2.6.6 na stronie 22.

  • W dodatku d, strona 93, daje więcej informacji na temat używania klauzuli harmonogramu.