OpenCL, CUDA, etc.

Odpowiedz Nowy wątek
2019-06-19 10:06
0

Witam

Szukam informacji na temat technologii takich jak OpenCL, CUDA, itd.

Muszę przeprowadzić pewne bardzo czasochłonne obliczenia. Obliczenia dobrze
się zrównoleglają, więc wybór padł karty graficzne. Nie wiem jakie karty graficzne
zakupić i jaką technologią programowania się posłużyć. Mam pewne doświadczenie w
programowaniu i w optymalizowaniu programów na CPU, ale nigdy nic nie
napisałem na GPU, nawet hello world.

Z kart graficznych ciekawy stosunek ceny do wydajności mają nowe kartu ma
układzie NVIDI 16XX, np. 1650, 1660, 1660TI. Karta Radeon RX 460 też
wydaje się wydajna i tania, ale ma tylko 2GB pamięci.

Czy w sieci można znaleźć kilka przykładowych (najlepiej minimalnych) problemów
rozwiązanych na wiele sposobów w celu porównania? Ten sam problem
można rozwiązać w Javie na CPU, w C++ na CPU (z wykorzystaniem np.
długich rejestrów), ostatecznie w OpenCL, w CUDA i porównać czasy wykonania
a najlepiej także zużycie energii.

Z góry dziękuję za wszelką pomoc.

Pozostało 580 znaków

2019-06-25 08:35
0

Pisałem 7 lat temu i już nie pamiętam dokładnie. Ale wydaje mi się, że było zbliżone wydajnościowo. Ale w CUDA C przyjemniej mi się pisało i więcej materiałów miałem. Moja karta wtedy miała 96 rdzeni CUDA. Obecne Geforcy mają od 1000 wzwyż.

edytowany 1x, ostatnio: szydlak, 2019-06-25 08:36

Pozostało 580 znaków

2019-06-26 09:11
0

A inne pytanie, jakie były różnice w wydajności pomiędzy CPU a GPU?

Jeszcze taka moja mała dygresja. Mnożenie macierzy można zrealizować na wiele sposobów. Każdy sposób da
inne czasy (a nawet wyniki!) na innym sprzęcie i na innych wymiarach macierzy. Trudno wyciągać wnioski na
podstawie pomiarów. Podobno ATLAS (https://en.wikipedia.org/wiki[...]Tuned_Linear_Algebra_Software)
sam optymalizuje parametry. Ale czy umie zoptymalizować ilość transferów, dobór algorytmu, podział na kawałki
mieszczące się w pamięci cache i to wszystko w zależności od dostępnego sprzętu?

Pozdrawiam

Pozostało 580 znaków

2019-06-26 09:43
0
Lenos napisał(a):

A inne pytanie, jakie były różnice w wydajności pomiędzy CPU a GPU?

Kiedyś widziałem porównania (na stronie nvidii) między rozwiązaniami CUDA a CPU.
Różnica była x5 do x100 na korzyść CUDA.
Przy czym x100 to taski głównie zorientowane na mikro-dane (jak napisałem wyżej).
Ile w tym prawdy nie wiem.
Dzisiaj do zrównoleglania na CPU masz wiele rozwiązań i sprzęt ma coraz więcej rdzeni.
Kiedyś (2013) szałem były karty 57 rdzeniowe.
Dzisiaj u Intela dostaniesz 56 rdzeni na jednym CPU a u AMD 32.


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2019-06-26 11:13
1
Lenos napisał(a):

A inne pytanie, jakie były różnice w wydajności pomiędzy CPU a GPU?

Dobrałęm sie do mojej pracy i wyniki były takie:

mnożenie macierzy (A[3250][3250] * B[3250][3250] )

czas w sekundach:

CPU: 2455,28 s.
CUDA C: 23,382633 s
Open CL : 9,316559 s

Sortowanie: Rank Sort (enumeration sort) rozmiar tablicy: 100 000
czas w sekundach:
CPU: 53,135700
CUDA C: 4,169465
OPEN CL: 0,443835

edytowany 1x, ostatnio: szydlak, 2019-06-26 11:27
CPU to z opcją SIMD OpenMP? - vpiotr 2019-06-26 11:35
Nie, jeśli chodzi Ci o to czy zrównoleglałem algorytm na CPU - szydlak 2019-06-26 11:43
Tak, o to mi chodziło. Tnx - vpiotr 2019-06-26 12:50

Pozostało 580 znaków

2019-06-26 11:59
1

W mnozeniu macierzy zaleznie od wielkosci -> od 10x do 100-~120x jesli chodzi o high lvl api typu Pytorch, tensorflow, cupy etc.

Pozostało 580 znaków

2019-07-02 12:45
0
vpiotr napisał(a):
Lenos napisał(a):

A inne pytanie, jakie były różnice w wydajności pomiędzy CPU a GPU?

Kiedyś widziałem porównania (na stronie nvidii) między rozwiązaniami CUDA a CPU.
Różnica była x5 do x100 na korzyść CUDA.

Dzięki wszystkim za odpowiedzi, takie ogólne informacje dają dobry pogląd dla kogoś
takiego jak ja, czyli dla początkującego z GPU.

Przy czym x100 to taski głównie zorientowane na mikro-dane (jak napisałem wyżej).
Ile w tym prawdy nie wiem.

Co to są mikro-dane? Czy np. problem skoczka szachowego, który wymaga z 100-500
bajtów danych, będzie miał przyspieszenie 100 razy? Albo gdy danych jest więcej, ale
odczyt jest sekwencyjny, czy też można uzyskać przyspieszenie 100 razy? I kolejne
pytanie, gdy w danym okresie czasu porównujemy najlepsze na rykun GPU i CPU, to jest
100 razy względem pełnego wykorzystania procesora, czy względem jednego
wątku na CPU?

Dzisiaj do zrównoleglania na CPU masz wiele rozwiązań i sprzęt ma coraz więcej rdzeni.
Kiedyś (2013) szałem były karty 57 rdzeniowe.

XEON PHI To za droga zabawka dla mnie, ale faktycznie wygoda powala, można to
normalnie programować np. w OpenMP.

Dzisiaj u Intela dostaniesz 56 rdzeni na jednym CPU a u AMD 32.

A dziś widzę że karta ma w ogóle rożne rodzaje procesorów, albo czegoś nie rozumiem:
https://en.wikipedia.org/wiki/GeForce_16_series#Products

W kolumnie Core Config mamy np.: 896:56:32:14 (Shader Processors : Texture mapping units : Render output units : Streaming multi-processors)
I do tego tylko 75 wat :)

Z tego co wiem to przyspieszasz nie od ilosci danych ale od tego ile obliczen "rownolegle" robisz. Male dane raczej srednio dzialaja na GPU bo koszt
przeniesienia danych na GPU jest?(tutaj znak zapytania bo nie jestem pewien ale kiedys to testowalem i w moim wypadku byl) wiekszy

Weźmy dla uszczegółowienia kilka przypadków. W każdym przypadku pamięć algorytmu zawsze mieści się w pamięci karty grafiki, np. jeden
transfer do karty i potem długie 60 sekund obliczeń, albo nawet cała doba obliczeń.

1) Każdy wątek działa na swoich adresach pamięci, dane są małe, każdy wątek ma np. swoje 500 bajtów do odczytu i swoje 10 bajtów do zapisu.
2) Każdy wątek działa na swoich adresach pamięci, dane są duże każdy wątek ma np. swoje 5MB do odczytu i swoje 10 bajtów do zapisu - odczyt
sekwencyjny.
3) Każdy wątek działa na swoich adresach pamięci, dane są duże każdy wątek ma np. swoje 5MB do odczytu i swoje 10 bajtów do zapisu - odczyt
losowy po kilkaset bajtów.
4) Każdy wątek działa na wspólnej dużej (np. 4GB) pamięci do odczytu i na swoich danych do zapisu - odczyty sekwencyjne.
5) Każdy wątek działa na wspólnej dużej (np. 4GB) pamięci do odczytu i na swoich danych do zapisu - odczyty z losowych miejsc.

Który z powyższych przypadków lepiej a który gorzej się zrównolegli na GPU? Powiedzmy że teoretycznie problem zrównolegla się liniowo,
czyli N procesorów daje N-krotne przyspieszenie, problemem mogą być tylko wąskie gardła w dostępie do pamięci (ale już te dostępy
wewnątrz GPU, bo że transfery są wolne to wiadomo i to inna sprawa).

Pozdrawiam

Pozdrawiam

edytowany 1x, ostatnio: Lenos, 2019-07-02 23:51
Z tego co wiem to przyspieszasz nie od ilosci danych ale od tego ile obliczen "rownolegle" robisz. Male dane raczej srednio dzialaja na GPU bo koszt przeniesienia danych na GPU jest?(tutaj znak zapytania bo nie jestem pewien ale kiedys to testowalem i w moim wypadku byl) wiekszy - komuher 2019-07-02 18:13
Wyedytowałem odpowiedź, rozpisałem przypadki użycia pamięci jakie można analizować i jak to może wpływać na efektywność zrównoleglania. - Lenos 2019-07-03 23:30

Pozostało 580 znaków

2019-07-03 23:45
1

Jeśli nigdy nic nie robiłeś na GPU to warto odkopać jakąś dokumentacje, albo wykłady z jakiejś uczelni, bo niestety jest dużo pułapek po drodze. Poza tym ile danych przetwarzasz, zależy też jak je przetwarzasz


Spring? Ja tam wole mieć kontrole nad kodem ᕙ(ꔢ)ᕗ
Haste - mała biblioteka do testów z czasem.
Wykłady od podstaw by się przydały. - Lenos 2019-07-04 09:50
poszukaj po stronach uczelni przedmiotów w stylu "przetwarzanie równoległe" - danek 2019-07-04 09:59
W programowaniu równoległym i rozproszonym mam trochę (może nawet dużo) doświadczenia, tylko o programowaniu GPU nadal mało wiem. - Lenos 2019-07-04 10:05

Pozostało 580 znaków

2019-08-06 17:29
0

Warto sprawdzić i OpenCL i CUDA.
Problem z OpenCL jest taki, że nvidia wspiera tylko wersję 1.x (a nie 2.x) ... i tak już od ładnych paru lat. Jak masz kartę nvidia to sobie nie poszalejesz. Na kartach Nvidia CUDA powinno oferować więcej pod względem funkcjonalności, a także wydajności.

edytowany 2x, ostatnio: nalik, 2019-08-06 17:29

Pozostało 580 znaków

2019-08-16 17:01
0

Trzeba się po prostu zabrać za kodowanie i samemu się przekonać ;-)
Pobaw się z np.
www quantstart com/articles/Matrix-Matrix-Multiplication-on-the-GPU-with-Nvidia-CUDA
github com/CNugteren/myGEMM?files=1 (jest tam przykład nagłówka OpenCL -> CUDA)
Plus OpenCL to fakt że prawie każdy procesor Intel'a ma wbudowane GPU, nie są to może powalające ilości, ale zawsze kilka kerneli jest i można się pobawić.

Przy okazji nVidia ma całkiem sporo dokumentacji:
github com/NVIDIA/open-gpu-doc

Pozostało 580 znaków

2019-08-16 17:19
0

Przeglądnij Professional Cuda C programming oraz Cuda Handbook, obie są warte uwagi(zwróć uwagę na SIMD, cache coherence, divergence branch na warpach, shared vs global memory, pamięc textur).
Do debugowania wykorzystaj: Parallel Nsight
Jeżeli chodzi o optymalizację, poczytaj materiały od Vasilya Volkova, fajnie wprowadza w temat.
Jak masz jakieś pytania, łap mnie na pm.

edytowany 1x, ostatnio: elfisko, 2019-08-16 17:19

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0