Tuesday 19 December 2017

Filtr cuda moving average


Co to jest CUDA Enroll dzisiaj Wprowadzenie do programowania równoległego Otwarty, internetowy kurs od instruktorów Udacity: Dr. John Owens, UC Davis i Dr. David Luebke, NVIDIA CUDA reg jest platformą obliczeniową równoległą i modelem programowania wymyślonym przez firmę NVIDIA. Umożliwia dramatyczne zwiększenie wydajności obliczeniowej dzięki wykorzystaniu mocy procesora graficznego (GPU). Ponieważ do tej pory sprzedano miliony procesorów graficznych obsługujących CUDA, twórcy oprogramowania, naukowcy i badacze znajdują szerokie zastosowanie w komputerach typu GPU z CUDA. Oto kilka przykładów: Zidentyfikuj ukrytą płytkę w tętnicach. Zawały serca są główną przyczyną śmierci na całym świecie. Harvard Engineering, Harvard Medical School i Brigham Womens Hospital połączyły siły, aby wykorzystać procesory graficzne do symulacji przepływu krwi i identyfikacji ukrytej płytki tętniczej bez inwazyjnych technik obrazowania lub operacji eksploracyjnej. Analizuj przepływ ruchu lotniczego. Krajowy system przestrzeni powietrznej zarządza ogólnokrajową koordynacją przepływu ruchu lotniczego. Modele komputerowe pomagają znaleźć nowe sposoby na zmniejszenie zatłoczenia i sprawne poruszanie się samolotu. Wykorzystując moc obliczeniową układów GPU, zespół NASA uzyskał duży wzrost wydajności, redukując czas analizy z dziesięciu minut do trzech sekund. Wizualizuj cząsteczki. Symulacja molekularna o nazwie NAMD (nanoskalowa dynamika molekularna) zapewnia duży wzrost wydajności dzięki procesorom graficznym. Przyspieszenie jest wynikiem równoległej architektury procesorów graficznych, która umożliwia programistom NAMD przenoszenie intensywnych obliczeniowo części aplikacji na GPU przy użyciu zestawu narzędzi CUDA Toolkit. Tło obliczeń GPU: rewolucja Masz do czynienia z imperatywami: popraw wydajność. Szybciej rozwiązuj problem. Równoległe przetwarzanie byłoby szybsze, ale krzywa uczenia się jest stroma, nie jest już. Dzięki CUDA możesz wysyłać kody C, C i Fortran bezpośrednio do procesora graficznego, bez konieczności używania języka asemblerowego. Programiści takich firm, jak Adobe, ANSYS, Autodesk, MathWorks i Wolfram Research budzą tego śpiącego giganta, GPU, aby wykonywać ogólne i naukowe obliczenia na różnych platformach. Korzystając z wysokopoziomowych języków, aplikacje akcelerowane przez GPU uruchamiają sekwencyjną część swojego obciążenia na procesorze, który jest zoptymalizowany pod kątem wydajności jednowątkowej przy jednoczesnym przyspieszeniu przetwarzania równoległego na GPU. Nazywa się to przetwarzaniem GPU. Obliczenia GPU są możliwe, ponieważ dzisiejszy GPU robi o wiele więcej niż renderowanie grafiki: Skwierczy z teraflopem wydajności zmiennoprzecinkowej i wykonuje zadania aplikacji przeznaczone do wszystkiego, od finansów po medycynę. CUDA jest szeroko wdrażana dzięki tysiącom aplikacji i opublikowanym materiałom badawczym oraz wspieranym przez zainstalowaną bazę ponad 375 milionów układów GPU z obsługą CUDA w notebookach, stacjach roboczych, klastrach obliczeniowych i superkomputerach. Odwiedź Strefę CUDA, gdzie znajdziesz przykłady aplikacji na różnych rynkach wertykalnych i przebudź swojego giganta GPU. Historia obliczeń GPU Pierwsze GPU zostały zaprojektowane jako akceleratory graficzne, obsługujące tylko określone rurociągi o ustalonej funkcji. Począwszy od końca lat 90., sprzęt stał się coraz bardziej programowalny, zakończony pierwszym procesorem graficznym NVIDIA w 1999 roku. Mniej niż rok po tym, jak firma NVIDIA wymyśliła termin GPU, artyści i twórcy gier nie byli jedynymi, którzy zajmowali się przełomową technologią: badacze wykorzystując doskonałą wydajność zmiennoprzecinkową. Rozpoczął się ruch GPU (GPGPU) ogólnego przeznaczenia. Ale GPGPU nie było wtedy łatwe, nawet dla tych, którzy znają języki programowania graficznego, takie jak OpenGL. Programiści musieli mapować obliczenia naukowe na problemy, które mogą być reprezentowane przez trójkąty i wielokąty. GPGPU było praktycznie niedostępne dla tych, którzy nie zapamiętali najnowszych interfejsów graficznych API, dopóki grupa naukowców ze Stanford University nie zdecydowała się na ponowne wyobrazić GPU jako procesora strumieniowego. W 2003 r. Zespół badaczy pod kierownictwem Iana Bucka zaprezentował Brook, pierwszy szeroko stosowany model programowania rozszerzający C o konstrukcje równoległe do danych. Korzystając z pojęć, takich jak strumienie, jądra i operatory redukcji, kompilator i system wykonawczy Brook ujawniły GPU jako procesor ogólnego przeznaczenia w języku wysokiego poziomu. Co ważniejsze, programy Brook były nie tylko łatwiejsze do napisania niż ręcznie dostrojony kod GPU, były siedmiokrotnie szybsze niż podobny istniejący kod. Firma NVIDIA wiedziała, że ​​niesamowicie szybki sprzęt musi być połączony z intuicyjnym oprogramowaniem i narzędziami sprzętowymi, i zaprosił Iana Bucka do przyłączenia się do firmy i rozpoczęcia prac nad rozwiązaniem, które pozwoli płynnie uruchomić C na GPU. Łącząc oprogramowanie i sprzęt, NVIDIA zaprezentowała CUDA w 2006 roku, pierwsze na świecie rozwiązanie do ogólnych obliczeń na GPU. Narzędzia i szkolenia Dzisiaj ekosystem CUDA rozwija się dynamicznie, ponieważ coraz więcej firm dostarcza światowej klasy narzędzia, usługi i rozwiązania. Jeśli chcesz napisać własny kod, najprostszym sposobem na wykorzystanie wydajności procesorów graficznych jest pakiet narzędziowy CUDA. który zapewnia kompleksowe środowisko programistyczne dla programistów C i C. Zestaw narzędzi CUDA zawiera kompilator, biblioteki matematyczne i narzędzia do debugowania i optymalizacji wydajności aplikacji. Znajdziesz tu również próbki kodu, przewodniki programowania, podręczniki użytkownika, odniesienia do API i inne dokumenty, które pomogą Ci rozpocząć. NVIDIA zapewnia to wszystko bezpłatnie, w tym NVIDIA Parallel Nsight dla Visual Studio, pierwszego w branży środowiska programistycznego dla masowo równoległych aplikacji korzystających zarówno z procesorów graficznych, jak i procesorów. Nauka korzystania z CUDA jest wygodna, dostępne są wszechstronne szkolenia online, a także inne zasoby, takie jak seminaria internetowe i książki. Ponad 400 uniwersytetów i szkół wyższych uczy programowania CUDA, w tym dziesiątki Centrów Doskonałości CUDA i Ośrodków Badawczo-Szkoleniowych CUDA. Dla programistów W innym podejściu można obciąć okno wykładniczej średniej ruchomej, a następnie obliczyć przefiltrowany sygnał, wykonując splot między sygnałem a wyskakującym wykładnikiem. Splot można obliczyć przy użyciu bezpłatnej biblioteki CUDA FFT (cuFFT), ponieważ, jak wiadomo, splot można wyrazić jako punktowe mnożenie dwóch sygnałów w domenie Fouriera (jest to trafne twierdzenie o sprzeciwie, który działa ze złożonością O (n log (n))). Tego typu podejście zminimalizuje kod jądra CUDA i działa bardzo szybko, nawet na GeForce 570 Szczególnie, jeśli możesz wykonać wszystkie swoje obliczenia w pojedynczej precyzji (zmiennoprzecinkowej). odpowiedziała 30 kwietnia 14 o 17:04 zaproponowałbym manipulację powyższym równaniem różnicy, jak wskazano poniżej, a następnie użycie prymitywów CUDA Thrust. MANIPULACJA RÓWNOLEGŁOŚCI RÓŻNICOWYCH - WYJAŚNIAJĄCA FORMA RÓWNEGO RÓWNOWARTOŚCI Za pomocą prostej algebry można znaleźć następujące: W związku z tym wyraźna forma jest następująca: CUDA THRUST IMPLEMENTATION Możesz zaimplementować powyższy jawny formularz, wykonując następujące kroki: Inicjalizuj przerwanie sekwencji wejściowej do alfa z wyjątkiem dinput0 1. Zdefiniuj wektor d1overbetatothen równy 1, 1beta, 1beta2, 1beta3. Pomnóż dinozaury elementarne przez d1overbetatothen Wykonaj inclusivescan, aby uzyskać sekwencję yn betan Podziel powyższą sekwencję na 1, 1beta, 1beta2, 1beta3. Powyższe podejście może być zalecane w systemach Liniowego Zmiennego Czasu (LTV). W przypadku liniowych systemów pomiaru czasu (LTI) można zalecić podejście FFT wymienione przez Paula. Podam przykład tego podejścia, używając CUDA Thrust i cuffT w mojej odpowiedzi na filtr FIR w CUDA. Filtr Avant to okienkowany filtr klasy liniowej, który wygładza sygnał (obraz). Filtr działa jako dolnoprzepustowy. Podstawową zasadą kryjącą się za filtrem jest to, że dowolny element sygnału (obrazu) przyjmuje średnią w swoim sąsiedztwie. Jeśli mamy macierz mxn i chcemy zastosować filtr średni o wielkości k, to dla każdego punktu macierzy p: (i, j) wartość punktu będzie średnią wszystkich punktów na kwadracie Ta liczba jest dla jądra kwadratu filtrującego o rozmiarze 2., że żółte pole jest uśrednionym pikselem, a cała siatka jest kwadratem sąsiednich pikseli, że nowa wartość pikseli będzie średnią z nich. Problem polega na tym, że ten algorytm działa bardzo wolno, szczególnie na dużych obrazach, więc pomyślałem o użyciu GPGPU. Teraz jest pytanie. Jak to zrobić w cuda, jeśli to możliwe Jest to klasyczny przypadek kłopotliwego problemu z przetwarzaniem równoległego obrazu, który można bardzo łatwo zmapować do środowiska CUDA. Filtr uśredniający jest znany jako filtr skrzynkowy w domenach przetwarzania obrazu. Najprostszym sposobem byłoby użycie tekstur CUDA do procesu filtrowania, ponieważ warunki brzegowe mogą być obsługiwane bardzo łatwo za pomocą tekstur. Zakładając, że masz wyznaczone wskaźniki źródłowe i docelowe na hoście. Procedura byłaby podobna do tej. Przydziel wystarczającą ilość pamięci do przechowywania obrazów źródłowych i docelowych na urządzeniu. Skopiuj obraz źródłowy z hosta na urządzenie. Przypisz wskaźnik urządzenia obrazu źródłowego do tekstury. Określ odpowiedni rozmiar bloku i siatkę wystarczająco dużą, aby pokryć każdy piksel obrazu. Uruchom jądro filtrujące, używając określonego rozmiaru siatki i bloku. Skopiuj wyniki z powrotem do hosta. Usuń powiązanie tekstury Bezpłatne wskaźniki urządzeń. Przykładowa implementacja filtra pudełkowego Dobrą wiadomością jest to, że nie musisz sam implementować filtra. Zestaw narzędzi CUDA zawiera bezpłatną bibliotekę przetwarzania sygnałów i obrazów o nazwie NVIDIA Performance Primitives (NPP), opracowaną przez firmę NVIDIA. NPP wykorzystuje GPU z obsługą CUDA, aby przyspieszyć przetwarzanie. Filtr uśredniający jest już zaimplementowany w NPP. Aktualna wersja NPP (5.0) obsługuje obrazy 8-bitowe, 1-kanałowe i 4-kanałowe. Dostępne są następujące funkcje: nppiFilterBox8uC1R dla obrazu 1-kanałowego. nppiFilterBox8uC4R dla obrazu 4-kanałowego. odpowiedziała 15 stycznia 13 o 10:50 Twoja odpowiedź wydaje się być bardzo dobra, ale nie jestem naprawdę świadoma tego, co opisujesz tam na górze, ponieważ programuję głównie na Matlab, i mam dobrą znajomość programowania C, Czego potrzebuję pomocy kodu, myślę, że prototyp funkcji jądra będzie: globalny void ApplyAverageFilter (int Image, int Wynik, int filterSize). Potrzebuję pomocy z kodem. ndash Sameh Kamal Jan 15 13 o 10:56 Oh. Zaktualizowałem moją odpowiedź i dodałem link do jądra CUDA do filtrowania skrzynek. Ale musisz najpierw nauczyć się CUDA, aby go użyć. W przeciwnym razie NPP jest lepszą opcją, jeśli nie masz dużego zaplecza CUDA. ndash sgarizvi Jan 15 13 o 10:59 Jeśli rozmiar filtrów jest normalny i nie jest wielkogabarytowy, średni filtr jest bardzo dobrym przykładem do implementacji z CUDA. Możesz to ustawić za pomocą kwadratowych bloków, a każdy wątek bloku jest odpowiedzialny za obliczenie wartości jednego piksela, sumując i uśredniając sąsiadów. Jeśli przechowujesz obraz w pamięci globalnej, możesz go łatwo zaprogramować, ale będziesz miał wiele konfliktów bankowych. Jedną z możliwych optymalizacji jest ładowanie bloków obrazu do bloków pamięci współużytkowanej. Korzystając z elementów fantomowych (aby nie przekraczać wymiarów bloków wspólnych podczas wyszukiwania sąsiednich pikseli), można obliczyć średnią pikseli w bloku. Jedyne, co musisz zrobić, to uważać na to, w jaki sposób zostaną zakończone szwy, ponieważ bloki pamięci współużytkowanej będą się nakładać (ze względu na dodatkowe piksele wypełnienia) i nie będziesz chciał obliczać ich wartości dwukrotnie. odpowiedz 15 sty 13 o 9:27 Your Answer 2017 Stack Exchange, Inc

No comments:

Post a Comment