2012-04-09 20 views
5

Mój program jest dobrze dostosowany do MPI. Każdy procesor wykonuje swoje własne, specyficzne (wyrafinowane) zadanie, generuje pojedyncze double, a następnie używam MPI_Reduce, aby pomnożyć wynik z każdego procesora.MPI + GPU: jak miksować obie techniki

Ale powtarzam to wiele, wiele razy (> 100 000). Tak więc przyszło mi do głowy, że GPU znacznie przyspieszyłoby działanie.

Mam google'd wokół, ale nie mogę znaleźć nic konkretnego. Jak radzisz sobie z mieszaniem MPI z procesorami graficznymi? Czy istnieje sposób na to, aby program zapytał i zweryfikował "oh, ten numer to procesor graficzny, a pozostałe to procesory"? Czy jest zalecany samouczek lub coś takiego?

Co ważne, nie chcę ani nie potrzebuję pełnego zestawu procesorów graficznych. Potrzebuję po prostu dużej liczby procesorów, a następnie pojedynczego procesora graficznego, aby przyspieszyć często używaną operację MPI_Reduce.

Oto schematyczny przykład tego, co mówię:

Załóżmy, że mam 500 procesorów. Każdy procesor w jakiś sposób wytwarza, powiedzmy, 50 double s. Muszę pomnożyć wszystkie 250,00 z tych double s razem. Powtarzam to od 10 000 do 1 miliona razy. Gdybym mógł mieć jedno GPU (oprócz 500 procesorów), to mogłoby być naprawdę wydajne. Każdy procesor będzie obliczał swoje 50 double s dla wszystkich ~ 1 miliona "stanów". Następnie wszystkie 500 procesorów wysłałoby swoje double s do GPU. GPU będzie następnie pomnożyć 250 000 double s dla każdego z 1 miliona "stanów", produkując 1 milion doubles.
Te liczby nie są dokładne. Obliczenia są rzeczywiście bardzo duże. Próbuję tylko przekazać ogólny problem.

+2

To nie brzmi jak bardzo dobre dopasowanie do obliczeń GPU Proponowany komponent GPU zawiera tylko kilkaset podwójnie precyzyjnych MFLops, to jest o rząd wielkości mniejszych niż jest to opłacalne dla GPU, i zostanie zasypane przez obciążenie sieci związane z transmisją danych przez kabel do węzła hostującego GPU i przez magistralę PCI-e do pamięci GPU – talonmies

+0

@talonmies Przepraszamy za zwodniczy przykład schematu .. Będę aktualizował na moje pytanie W rzeczywistości jest on nieznacznie bardziej skomplikowane.Muszę pomnożyć między * O * (10k) 'duble' razem.Każdy procesor będzie produkować kilka tych' duble' (nie tylko jeden.) Liczba stanów będzie między ~ 10.000 a kilka milionów (nie 100 000) Cały ten proces będzie często powtarzany – cmo

+1

Tak jak napisałem, to wciąż jest tylko kilkaset MFLops. ilość obliczeń, nawet dla procesora. – talonmies

Odpowiedz

2

To nie jest sposób myślenia o tych rzeczach.

Lubię powiedzieć, że pliki MPI i GPGPU są ortogonalne (*). Używasz MPI między zadaniami (dla których myślisz węzły, chociaż możesz mieć wiele zadań na węzeł), a każde zadanie może, ale nie musi używać akceleratora, takiego jak GPU, aby przyspieszyć obliczenia w ramach zadania. Nie ma rangi MPI na GPU.

Bez względu na to, Talonmies ma rację; ten konkretny przykład nie brzmi tak, jakby wiele zyskał na GPU. I nie będzie to pomocne dzięki dziesiątkom tysięcy podwójnych zadań; jeśli wykonujesz tylko jeden lub kilka FLOPów na podwójne, koszt wysłania danych do GPU przekroczy przewagę posiadania wszystkich tych rdzeni na nich działających.

(*) To było wyraźniej prawdziwe; teraz z, na przykład, GPUDirect zdolnością do kopiowania pamięci do zdalnych GPU przez infiniband, rozróżnienie jest bardziej niewyraźne. Niemniej jednak utrzymuję, że jest to nadal najbardziej przydatny sposób myślenia o rzeczach takich, jak RDMA do GPU, które są ważną optymalizacją, ale koncepcyjnie drobnym usprawnieniem.

+0

Przypuszczam, że nie doceniam szybkości mnożenia 'float' dla standardowego procesora? Pomyślałem: pomnożenie 10 000 "podwójnych" razem, a zrobienie tego ~ 1 milion razy brzmi jak helluva wielu obliczeń (10 miliardów). Czy nie jest? – cmo

+0

@CycoMatto: twoje 10 000 podwójnych razy pomnożone 1 milion razy ma taką samą liczbę trafień, jak pomnożenie pary grubych matryc 1800x1800. Pewnego razu. To kilka sekund procesora przy użyciu nawet skromnego procesora x86 z rozsądnie dostrojonym BLAS ..... – talonmies

+0

@talonmies OK. A jeśli jest jeszcze inny poziom gadów/pętli? tj. mam ~ 1 milion prób. Każda próba musi sumować ponad 1 milion państw. Każdy stan wymaga zwielokrotnienia ~ 10 000 debelów. Z tych powodów zostałem naprawiony na GPU + MPI – cmo

0

Here Znalazłem jakieś wiadomości o temacie:

"MPI, The Passing Interface Message, jest standardowym API do komunikacji danych za pośrednictwem komunikatów pomiędzy rozproszonymi procesów, które są powszechnie stosowane w HPC do budowania aplikacji, które mogą Skaluj do wielowęzłowych klastrów komputerowych MPI jest w pełni kompatybilny z CUDA, który jest przeznaczony do przetwarzania równoległego na pojedynczym komputerze lub węźle.Istnieje wiele powodów do połączenia dwóch równoległych metod programowania MPI i CUDA. Najczęstszym powodem jest umożliwienie rozwiązywania problemów z rozmiarem danych zbyt dużych, aby zmieścić się w pamięci pojedynczego procesora graficznego lub wymagałoby to nieuzasadnionego długiego czasu obliczeń na pojedynczym węźle.Innym powodem jest przyspieszenie istniejącej aplikacji MPI za pomocą procesorów graficznych lub umożliwienie istniejącej aplikacji z wieloma procesorami GPU do skalowania w wielu węzłach. Dzięki CUDA-aware MPI cele te można osiągnąć łatwo i wydajnie. W tym poście wyjaśnię, jak działa MPI działający w CUDA, dlaczego jest wydajny i jak z niego korzystać. "