CUDA haladó ismeretek

Méret: px
Mutatás kezdődik a ... oldaltól:

Download "CUDA haladó ismeretek"

Átírás

1 CUDA haladó ismeretek CUDA környezet részletei Többdimenziós indextér használata Megosztott memória használata Atomi műveletek használata Optimalizálás Hatékonyság mérése Megfelelő blokkméret kiválasztása

2 CUDA haladó ismeretek CUDA környezet részletei Többdimenziós indextér használata Megosztott memória használata Atomi műveletek használata Optimalizálás Hatékonyság és mérése Megfelelő blokkméret kiválasztása

3 Mátrix szorzó alkalmazás elkészítése Feladat 3.1 Készítsünk CUDA alkalmazást, amelyik kétdimenziós (NxN méretű, egyszeres lebegőpontos számokat tartalmazó) mátrixok szorzását tudja elvégezni a GPU segítségével: A kód tartalmazzon egy N konstanst, ami a mátrixok méretét tartalmazza Foglaljon le 3 darab NxN méretű mátrixot (A, B, C) Töltse fel az A mátrixot tetszőleges adatokkal (pl. a i,j = i + j) Töltse fel a B mátrixot tetszőleges adatokkal (pl. b i,j = i - j) Foglaljon le 3 darab NxN méretű memóriaterületet a grafikus kártya memóriájában (deva, devb, devc) Végezze el a bemenő adatok másolását: A deva, B devb Indítson el egy kernelt, ami kiszámítja a devc = deva * devb eredményt Végezze el a kimenő adatok másolását: devc C Írja ki az így kapott C vektor elemeinek értékét a képernyőre 3

4 Többdimenziós mátrix a memóriában Többdimenziós mátrix lineáris memória Bár a C programunkban tudunk többdimenziós tömböket lefoglalni, ezek elemei a memóriában értelemszerűen lineárisan helyezkednek el Egy egyszerű 4x4-es mátrix elhelyezkedése: A mátrix a 0,0 a 0,1 a 0,2 a 0,3 A = a 0,0 A kétdimenziós tömb a 1,0 a 1,1 a 1,2 a 1,3 a 2,0 a 2,1 a 2,2 a 2,3 a 3,0 a 3,1 a 3,2 a 3, a 0,0 a 0,1 a 0,2 a 0,3 a 1,0 a 1,1 a 1,2 a 1,3 a 2,0 a 2,1 a 2,2 a 2,3 a 3,0 a 3,1 a 3,2 a 3, Többdimenziós mátrix elemeihez való hozzáférés Amennyiben tehát ismert a mátrix kezdőcíme, a dimenziói, illetve az elemek méretei, a mátrix bármelyik elemének címe egyszerűen kiszámítható: a sor,oszlop = a 0,0 + (sor * oszlopszám + oszlop) * elemméret Mivel a CUDA kernelnek csak a mátrixokat tartalmazó memóriaterületek kezdőcímét adjuk át, a fenti képlettel érhetjük el az egyes elemeket 4

5 Többdimenziós mátrix a memóriában Blokkok használata Többdimenziós mátrixok esetén már egy 30x30-as méret is 900 darab szálat igényelne, amit nem tudunk egy blokkban elhelyezni Emiatt célszerű a programot tetszőleges méretű blokkok kezelésére felkészíteni, ennek megfelelően a blokk azonosítót is kezelni kell Egy lehetséges kernel devc = deva * devb mátrixszorzás kódja: global static void MatrixMul(float *deva, float *devb, float *devc) { int indx = blockidx.x * blockdim.x + threadidx.x; int indy = blockidx.y * blockdim.y + threadidx.y; } if (indx < N && indy < N) { float sum = 0; for(int i = 0; i < N; i++) { sum += deva[indy * N + i] * devb[i * N + indx]; } devc[indy * N + indx] = sum; } 5

6 Többdimenziós mátrix a memóriában Hoszt oldali kód Inicializálás, memóriaterületek lefoglalása Bemenő adatok átmásolása 6 7 cudamemcpy(deva, A, sizeof(float) * N * N, cudamemcpyhosttodevice); cudamemcpy(devb, B, sizeof(float) * N * N, cudamemcpyhosttodevice); Kernel indítása dim3 grid((n - 1) / BlockN + 1, (N - 1) / BlockN + 1); dim3 block(blockn, BlockN); MatrixMul<<<grid, block>>>(deva, devb, devc); cudathreadsynchronize(); Eredmények másolása, memória felszabadítása cudasetdevice(0); float A[N][N], B[N][N], C[N][N]; float *deva, *devb, *devc; cudamalloc((void**) &deva, sizeof(float) * N * N); cudamalloc((void**) &devb, sizeof(float) * N * N); cudamalloc((void**) &devc, sizeof(float) * N * N); cudamemcpy(c, devc, sizeof(float) * N * N, cudamemcpydevicetohost); cudafree(deva); cudafree(devb); cudafree(devc); verzió Szenasi.sandor@nik.uni-obuda.hu

7 Igazított elhelyezés Többdimenziós mátrix igazított tárolása Néha célszerű elválasztani egymástól a mátrix egy sorában található oszlopok számát és a memóriában tárolt tömb sorainak tényleges méretét (pl. kettes számrendszerbeli számokkal gyorsabban számítható a szorzása, illetve a CUDA végrehajtó egységek memóriakezelése is gyorsítható így) Egy egyszerű 5x5-ös mátrix elhelyezkedése, 8 elemes igazítással: A mátrix a 0,0 a 0,1 a 0,2 a 0,3 a 0,4 A = a 0,0 A kétdimenziós tömb a 1,0 a 1,1 a 1,2 a 1,3 a 1,4 a 2,0 a 2,1 a 2,2 a 2,3 a 2,4 a 3,0 a 3,1 a 3,2 a 3,3 a 3,4 a 4,0 a 4,1 a 4,2 a 4,3 a 4, a 0,0 a 0,1 a 0,2 a 0,3 a 0, a 1,0 a 1,1 a 1,2 a 1,3 a 1, a 2,0 a 2,1 a 2,2 a 2,3 a 2, a 3,0 a 3,1 a 3,2 a 3,3 a 3, a 4,0 a 4,1 a 4,2 a 4,3 a 4, Igazított tárolás esetén a hozzáférés A képlet hasonló, csak nem a tényleges oszlopszámmal szorzunk: a sor,oszlop = a 0,0 + (sor * igazított_oszlopszám + oszlop) * elemméret 7

8 Igazított memóriakezelés Memória lefoglalása A CUDA osztálykönyvtár rendelkezik egy memóriafoglaló rutinnal, ami automatikusan a legoptimálisabb igazítással foglalja le a megadott kétdimenziós memóriaterületet: cudamallocpitch(void** devptr, size_t *pitch, size_t width, size_t height) devptr lefoglalt memóriára mutató pointer (címszerinti paraméter) pitch igazítás mértéke (címszerinti paraméter) width mátrix egy sorának a mérete height mátrix sorainak száma A lineáris foglaláshoz hasonlóan a devptr tartalmazza majd a memóriacímet Az igazítás méretét tehát nem a függvény hívásakor kell megadni, hanem azt az osztálykönyvtár fogja megállapítani, és az így kiszámított értéket fogja visszaadni a pitch paraméterként átadott változóban A mátrix egy sorának méreténél (width) ügyeljünk rá, hogy bájtban kell megadni a méretet, hiszen a függvény nem tudhatja, hogy mekkora elemeket akarunk majd eltárolni 8

9 Igazított memóriakezelés Memória másolás Az igazított memóriakezelés során nem használható az egyszerű lineáris memória másolás, hiszen a cél és a forrás igazítása különböző is lehet A másolásra jól használható az alábbi függvény, ami kezeli ezt a problémát: cudamemcpy2d(void* dst, size_t dpitch, const void* src, size_t spitch, size_t width, size_t height, enum cudamemcpyking kind) dst másolás célját mutató pointer dpitch a cél adatszerkezet által használt igazítás mérete src másolás forrását mutató pointer spitch a forrás adatszerkezet által használt igazítás mérete width a 2 dimenziós adatszerkezet egy sorának a mérete (bájtban) heigh a 2 dimenziós adatszerkezet sorainak a száma Kind másolás iránya (értékei azonosak a lineáris másolásnál látottakkal) hoszt hoszt (cudamemcpyhosttohost) hoszt eszköz (cudamemcpyhosttodevice) eszköz hoszt (cudamemcpydevicetohost) eszköz eszköz (cudamemcpydevicetodevice) Amennyiben egy egyszerű igazítás nélküli tömböt használunk, akkor ne felejtsük el, hogy az igazítás mérete = tömb sorának mérete (és nem 0) 9

10 Mátrix szorzó alkalmazás elkészítése Feladat 3.2 Készítsünk CUDA alkalmazást, amelyik kétdimenziós (NxN méretű, egyszeres lebegőpontos számokat tartalmazó) mátrixok szorzását tudja elvégezni a GPU segítségével: A kód tartalmazzon egy N konstanst, ami a mátrixok méretét tartalmazza Foglaljon le 3 darab NxN méretű mátrixot (A, B, C) Töltse fel az A mátrixot tetszőleges adatokkal (pl. a i,j = i + j) Töltse fel a B mátrixot tetszőleges adatokkal (pl. b i,j = i - j) Foglaljon le 3 darab NxN méretű memóriaterületet a grafikus kártya memóriájában a kártya által választott igazítással (deva, devb, devc) Végezze el a bemenő adatok másolását: A deva, B devb Indítson el egy kernelt, ami kiszámítja a devc = deva * devb eredményt Végezze el a kimenő adatok másolását: devc C Írja ki az így kapott C vektor elemeinek értékét a képernyőre 10

11 Kernel igazított memóriakezeléssel Módosítások A kernel a paraméterként átadott igazítás mérettel végzi a szorzást N helyett Az igazítás mérete bájtban van megadva, így típusos mutatók esetén a értékét osztani kell az elem méretével (a példában feltételeztük hogy ez megtehető, amennyiben a igazítás nem lenne osztható az elemmérettel, akkor pl. típus nélküli mutatókkal tudjuk az elemek helyeit kiszámítani) Egy lehetséges kernel devc = deva * devb mátrixszorzás kódja: global static void MatrixMul(float *deva, float *devb, float *devc, size_t pitch) { int indx = blockidx.x * blockdim.x + threadidx.x; int indy = blockidx.y * blockdim.y + threadidx.y; } if (indx < N && indy < N) { float sum = 0; for(int i = 0; i < N; i++) { sum += deva[indy * pitch/sizeof(float) + i] * devb[i * pitch/sizeof(float) + indx]; } devc[indy * pitch/sizeof(float) + indx] = sum; } 11

12 Kernel igazított memóriakezeléssel Hoszt oldali kód Inicializálás, memóriaterületek lefoglalása Bemenő adatok átmásolása (feltételezzük, hogy a pitch azonos lett) cudamemcpy2d(deva, pitch, A, sizeof(float) * N, sizeof(float) * N, N, cudamemcpyhosttodevice); cudamemcpy2d(devb, pitch, B, sizeof(float) * N, sizeof(float) * N, N, cudamemcpyhosttodevice); Kernel indítása cudasetdevice(0); float A[N][N], B[N][N], C[N][N]; float *deva, *devb, *devc; size_t pitch; cudamallocpitch((void**) &deva, &pitch, sizeof(float) * N, N); cudamallocpitch((void**) &devb, &pitch, sizeof(float) * N, N); cudamallocpitch((void**) &devc, &pitch, sizeof(float) * N, N); dim3 grid((n - 1) / BlockN + 1, (N - 1) / BlockN + 1); dim3 block(blockn, BlockN); MatrixMul<<<grid, block>>>(deva, devb, devc, pitch); cudathreadsynchronize(); Eredmények másolása, memória felszabadítása cudamemcpy2d(c, sizeof(float) * N, devc, pitch, sizeof(float) * N, N, cudamemcpydevicetohost); cudafree(deva); cudafree(devb); cudafree(devc); verzió Szenasi.sandor@nik.uni-obuda.hu 12

13 CUDA haladó ismeretek CUDA környezet részletei Többdimenziós indextér használata Megosztott memória használata Atomi műveletek használata Optimalizálás Hatékonyság és mérése Megfelelő blokkméret kiválasztása

14 Megosztott memória kezelése Előző megoldások gyengesége A mátrix szorzás meglehetősen kevés aritmetikai műveletet tartalmaz a memóriamozgatások számához képest A GPU a memóriakezelésből származó várakozási időket nem gyorsítótárral, hanem a végrehajtóegységek átütemezésével próbálja elrejteni. Ha azonban nincs végrehajtandó művelet, akkor ezt nem tudja megoldani A CUDA környezetben megvalósított algoritmusok jóságának összehasonlítására emiatt gyakran használatos az aritmetikai műveletek száma/memóriahozzáférések száma hányados Megoldási lehetőségek Párhuzamosság növelése, amennyiben a feladat ezt lehetővé teszi (jelen esetben erre nem látunk lehetőséget) Memóriahozzáférések számának csökkentése (tulajdonképpen programozott gyorsítótár kezelés) minél több változó regiszterekben tartása megosztott memóriaterület használata Egyéb megoldások keresése, esetenként az algoritmusok áttervezése 14

15 Ötlet a mátrix szorzás gyorsítására Csempe technika Mivel a bemenő mátrixok egyes elemei több kimenő elem számításához is szükségesek, így a nem optimalizált változatban több szál is betölti őket egymástól függetlenül Célszerű lenne ezen szálak működését összehangolni: a teljes kimenő mátrixot régiókra bontjuk (csempe) a régióknak megfelelő méretű megosztott memóriaterületet lefoglalunk a két bemenő mátrix elemeinek ideiglenes betöltéséhez a régiókban található minden szál betölti az ő poziciójának megfelelő elemet a két bemenő mátrixból a megosztott memóriába a szál a saját és a többi szál által betöltött adatok segítségével kiszámítja az eredmény mátrix rá eső értékét A megosztott memória mérete meglehetősen korlátos, emiatt elképzelhető, hogy a fenti műveletet csak több lépésben, a bemenő mátrixokat több csempével lefedve, majd ezek értékét összeadva lehet végrehajtani Ez utóbbi esetben lényeges a szinkronizálás is, hogy egyik szál se kezdje el betölteni a következő csempe adatait, miközben a vele egy régióban lévő szálak még dolgoznak a részeredményeken 15

16 Mátrix szorzó alkalmazás elkészítése Feladat 3.3 Készítsünk CUDA alkalmazást, amelyik kétdimenziós (NxN méretű, egyszeres lebegőpontos számokat tartalmazó) mátrixok szorzását tudja elvégezni a GPU segítségével: A kód tartalmazzon egy N konstanst, ami a mátrixok méretét tartalmazza Foglaljon le 3 darab NxN méretű mátrixot (A, B, C) Töltse fel az A mátrixot tetszőleges adatokkal (pl. a i,j = i + j) Töltse fel a B mátrixot tetszőleges adatokkal (pl. b i,j = i - j) Foglaljon le 3 darab NxN méretű memóriaterületet a grafikus kártya memóriájában (deva, devb, devc) Végezze el a bemenő adatok másolását: A deva, B devb Indítson el egy kernelt, ami kiszámítja a devc = deva * devb eredményt, az előzőleg megismert csempe technika segítségével Végezze el a kimenő adatok másolását: devc C Írja ki az így kapott C vektor elemeinek értékét a képernyőre 16

17 Mátrix szorzás gyorsítása As Bs c B 1. Csempékre bontás 3x3 db régió, ezekben 3x3 db szál 2. Minden szál átmásol egy-egy elemet a megosztott memóriába 3. Szinkronizáció A Globális memória 17 C

18 Mátrix szorzás gyorsítása Szál 0,0 As Bs c B 4. Minden szál a saját részeredményét kiszámolja a megosztott memória tartalma alapján 5. Szinkronizáció A C Globális memória 18

19 Szál 0,0 + Mátrix szorzás gyorsítása As Bs c B 6. Következő csempék adatainak betöltése 7. Szinkronizálás 8. Szálak újra elvégzik a szorzást. A szorzatot hozzáadják az előző részeredményhez 9. Szinkronizálás A Globális memória 19 C

20 Szál 0,0 + Mátrix szorzás gyorsítása As Bs c B 6. Következő csempék adatainak betöltése 7. Szinkronizálás 8. Szálak újra elvégzik a szorzást. A szorzatot hozzáadják az előző részeredményhez 9. Szinkronizálás A Globális memória 20 C

21 Mátrix szorzás gyorsítása As Bs c B 10. Minden szál az általa kiszámított elemet bemásolja a C-be 11. Az összes blokk és A szál lefutása után az eredmény mátrix minden eleme a helyére kerül Globális memória 21 C

22 Optimalizált mátrix szorzás kernel A kernel meghívása és az adatok másolása megegyezik az első mátrix szorzásnál megismerttel global static void MatrixMul(float *deva, float *devb, float *devc) { shared float Ashared[BlockN][BlockN]; shared float Bshared[BlockN][BlockN]; } int indx = blockidx.x * blockdim.x + threadidx.x; int indy = blockidx.y * blockdim.y + threadidx.y; float c = 0; for(int k = 0; k < N / BlockN; k++) { Ashared[threadIdx.y][threadIdx.x] = deva[k * BlockN + threadidx.x + indy * N]; Bshared[threadIdx.y][threadIdx.x] = devb[indx + (k * BlockN + threadidx.y) * N]; syncthreads(); for(int i = 0; i < BlockN; i++) { c += Ashared[threadIdx.y][i] * Bshared[i][threadIdx.x]; } syncthreads(); } devc[indx + indy * N] = c; 22

23 Összehasonlító vizsgálat Eredeti és optimalizált kód összehasonlítása Vízszintes tengely: mátrix mérete (N) Függőleges tengely: futási idő (másodperc) 1 0,9 0,8 0,7 0,6 0,5 0,4 Eredeti Optimalizált 0,3 0,2 0,

24 CUDA haladó ismeretek CUDA környezet részletei Többdimenziós indextér használata Megosztott memória használata Atomi műveletek használata Optimalizálás Hatékonyság és mérése Megfelelő blokkméret kiválasztása

25 Atomi műveletek szükségessége Atomiság igénye Az adatpárhuzamos feladatok készítésekor ideális esetben a végeredmény kiszámításához nincs szükség az indextér egymástól független pontjain végzett műveletekre (pl. két mátrix összeadása), esetleg csak az olvasásra van szükség (pl. két mátrix szorzása) Bizonyos feladatoknál azonban ez nem kerülhető el, mint például a gyakori aggregációs műveleteknél: adatszerkezet elemeinek az összege/átlaga adatszerkezet legkisebb/legnagyobb eleme adatszerkezetben megadott tulajdonságú elemek száma stb. Lehetséges megoldások Ezen feladatok egy része egyszerűen megoldható adatpárhuzamos környezetben is (pl. van-e T tulajdonságú elem) A feladatok egy része azonban csak (részben) szekvenciális megoldással oldható meg (pl. legkisebb elem megkeresése) 25

26 CUDA atomi műveletek CUDA lehetőségek A CUDA által nyújtott atomi műveletek segítenek kiküszöbölni a versenyhelyzet okozta problémákat. A hardver garantálja, hogy az így elvégzett műveletek a szálak számától függetlenül szekvenciálisan fognak végrehajtódni (vagy legalábbis úgy tűnnek) Operandusok lehetnek Változó a globális memóriában Változó a megosztott memóriában Operandusok mérete 32 bites egész (1.1 számítási képesség) 64 bites egész (1.2 számítási képesség) Teljesítmény megfontolások Az atomi műveletek jellegüknél fogva nem párhuzamosíthatók, ennek megfelelően jelentősen rontják minden kernel teljesítményét Bizonyos feladatoknál azonban nem lehet őket teljesen kiküszöbölni, azonban ilyenkor is célszerű esetleg előzetes párhuzamos feldolgozásokkal csökkenteni a szükséges atomi műveletek számát 26

27 CUDA atomi műveletek Aritmetikai függvények Az atomi műveletek egyik paramétere általában egy memóriacím (globális vagy megosztott memóriában), második paramétere pedig egy egész szám int atomicadd(int* address, int val) Az első paraméterként címszerint átadott változó értékéhez hozzáadja a második paraméterben átadott értéket. Visszatérési értéke az eredeti szám int atomicsub(int* address, int val) Az első paraméterként címszerint átadott változó értékéből kivonja a második paraméterben átadott értéket. Visszatérési értéke az eredeti szám int atomicexch(int* address, int val); Az első paraméterként címszerint átadott változónak értékül adja a második paraméterként átadott értéket. Visszatérési értéke az eredeti szám int atomicmin(int* address, int val); Ha a második paraméterként átadott szám értéke kisebb mint az első címszerinti paraméterként átadott változó értéke, akkor ez utóbbit felülírja az előbbivel. Visszatérési értéke az eredeti szám 27

28 CUDA atomi műveletek Aritmetikai függvények folyt. int atomicmax(int* address, int val); Ha a második paraméterként átadott szám értéke nagyobb, mint az első címszerinti paraméterként átadott változó értéke, akkor ez utóbbit felülírja az előbbivel. Visszatérési értéke az eredeti szám unsigned int atomicinc(unsigned int* address, unsigned int val) Ha az első paraméterként címszerint átadott változó értéke kisebb, mint a második paraméter, akkor az előbbi értékét növeli 1-el, különben 0-t ad neki értékül. Visszatérési értéke az eredeti szám unsigned int atomicdec(unsigned int* address, unsigned int val) Ha az első paraméterként címszerint átadott változó értéke nagyobb, mint 0, akkor az előbbi értékét növeli 1-el, különben a második paraméterben átadott értéket másolja bele. Visszatérési értéke az eredeti szám int atomiccas(int* address, int compare, int val) Ha az elő paraméterként címszerint átadott változó értéke egyenlő a második paraméterrel, akkor az előbbinek értékül adja a harmadik paraméter értékét. Visszatérési értéke az eredeti érték 28

29 CUDA atomi műveletek Logikai függvények int atomicand(int* address, int val) Az első paraméterként címszerint átadott változó értékéül adja a második változóval vett ÉS művelet eredményét. Visszatérési értéke az eredeti szám int atomicor(int* address, int val) Az első paraméterként címszerint átadott változó értékéül adja a második változóval vett VAGY művelet eredményét. Visszatérési értéke az eredeti szám int atomicxor(int* address, int val) Az első paraméterként címszerint átadott változó értékéül adja a második változóval vett KIZÁRÓVAGY művelet eredményét. Visszatérési értéke az eredeti szám Feladat 3.4 Készítsünk CUDA alkalmazást, amelyik egy (hoszt oldalon) véletlenszerű számokkal feltöltött vektorból kiválasztja a minimális értéket. A feladat megoldása során használja a megismert atomi műveleteket 29

30 Vektor legkisebb elemének értéke Megoldás a globális memória használatával Az alap megoldás meglehetősen egyszerű, minden szál az általa indexelt elemre és a vektor első elemére meghívja a minimumot értékül adó függvényt A kernel lefutását követően tehát a vektor legelső eleme tartalmazza a legkisebb elem értékét global static void MinSearch(float *deva) { int indx = blockidx.x * blockdim.x + threadidx.x; atomicmin(deva, deva[indx]); } Érdemes megfigyelni, hogy a kernel eleve több blokkos indításra lett tervezve, tehát az atomi műveletek nem csak blokkon belül, hanem blokkok között is biztosítják a versenyhelyzetek megoldását Feladat 3.5 Sejthető, hogy a globális memóriában végzett atomi műveletek meglehetősen lassúak, ezért próbáljunk egy olyan változatot, amelyik először a blokk minimumát keresi meg, majd ezzel számol globális minimumot 30

31 Memóriahozzáférések csökkentése Megosztott memória használata A blokkon belül az első szál feladata, hogy beállítsa a lokális minimumot tároló változó kezdőértékét Ezt követően az összes szál elvégzi a hozzá rendelt értékkel a minimum ellenőrzést Végül az első szál az így kiszámított lokális minimummal elvégzi a globális minimum ellenőrzést is Szintén ügyeljünk a szinkronizációs pontokra, nehogy rossz sorrendben fussanak le az utasítások az egyes szálakban global static void MinSearch(float *deva) { shared int localmin; int indx = blockidx.x * blockdim.x + threadidx.x; if (threadidx.x == 0) localmin = deva[blockidx.x * blockdim.x]; syncthreads(); atomicmin(&localmin, deva[indx]); syncthreads(); if (threadidx.x == 0) atomicmin(deva, localmin); } 31

32 Összehasonlító vizsgálat Eredeti és optimalizált kód összehasonlítása Vízszintes tengely: vektor mérete (N) Függőleges tengely: futási idő (másodperc) Eredeti Optimalizált verzió Szenasi.sandor@nik.uni-obuda.hu 32

33 Blokkon belüli párhuzamosítás Atomi műveletek teljesítménye Célszerű lenne a megoldást olyan formában keresni, hogy kihasználhassuk a párhuzamosságból eredő előnyöket is: blokkon belül is kisebb részfeladatokra kell bontani a minimum kiválasztást Párhuzamosított változat A megosztott memóriába betöltjük a globális memória egy szeletét: minden szál beolvassa a globális memória két elemét, majd ezek közül a kisebbiket eltárolja a megosztott memóriában Blokkon belül minden szál összehasonlít két elemet a megosztott memóriában, majd a kisebbiket eltárolja az alacsonyabb indexű helyen Következő iterációban már csak az előzőleg kisebbnek talált elemeket hasonlítják össze, így a vizsgálandó elemek száma mindig feleződik Miután megvan a blokk legkisebb eleme, az előzőleg megismert módon eldöntjük, hogy ezek közül melyik a globális minimum Feladat 3.6 Készítsük el a minimum kiválasztás fent leírt algoritmussal működő változatát 33

34 Megosztott memória Globális memória Párhuzamos minimum - betöltés 0 Egy példa N = 24 BlokkN = 4 (szálak száma) Minden blokk lefoglal BlokkN*2 méretű megosztott memóriát Minden blokk szálai BlokkN*4 méretű globális memóriából töltik be páronként a kisebb értékeket A blokkméret legyen 2 hatványa, így az üres helyeket feltöltjük: páratlanul maradt elem vektor bármelyik eleme Betöltés után szinkronizáció Blokk 1 Blokk 0 Min( A 0, A 1 ) Sz0 Min( A 2, A 3 ) Sz1 Min( A 4, A 5 ) Sz2 Min( A 6, A 7 ) Sz3 Min( A 8, A 9 ) Sz0 Min( A 10, A 11 ) Sz1 Min( A 12, A 13 ) Sz2 Min( A 14, A 15 ) Sz3 Min( A 16, A 17 ) Sz0 Min( A 18, A 19 ) Sz1 Min( A 20, A 21 ) Sz2 Min( A 22, A 23 ) Sz3 A 24 Sz0 A 0 Sz1 A 0 Sz2 A 0 Sz

35 Párhuzamos minimum blokk minimuma S 0 S 1 S 2 S 3 S 4 S 5 S 6 S 7 Min(S 0,S 1 ) Min(S 2,S 3 ) Min(S 4,S 5 ) Min(S 6,S 7 ) S 4 S 5 S 6 S 7 Min(S 0,S 1, S 2, S 3 ) Min(S 4,S 5, S 6, S 7 ) Min(S 4,S 5 ) Min(S 6,S 7 ) S 4 S 5 S 6 S 7 Blokk minimum Min(S 4,S 5, S 6, S 7 ) Min(S 4,S 5 ) Min(S 6,S 7 ) S 4 S 5 S 6 S 7 Minden szál log 2 BlokkN darab iterációt hajt végre, amely során az x indexű szál elvégzi az alábbi műveletet: S x = Min(S 2x, S 2x+1 ) A műveletek végén a vektor legelső eleme tartalmazza a blokk által feldolgozott elemek közüli legkisebb értékét Ezek közül kiválaszhatjuk a globális legkisebb elemet: atomi műveletek használatával a blokkok által kigyűjtött minimális elemeket egy másik vektorban gyűjtjük, majd ezekre ismét lefuttatjuk a fenti minimumkiválasztást (nagy elemszám esetén már érdemes lehet ezt a változatot használni) 35

36 Párhuzamos minimum - kernel Adatok betöltése globális memóriából (túlcímzés figyeléssel) global static void MinSearch(int *deva) { shared int localmin[blockn*2]; int blocksize = BlockN; int itemc1 = threadidx.x * 2; int itemc2 = threadidx.x * 2 + 1; for(int k = 0; k <= 1; k++) { int blockstart = blockidx.x * blockdim.x * 4 + k * blockdim.x * 2; int loadindx = threadidx.x + blockdim.x * k; if (blockstart + itemc2 < N) { int value1 = deva[blockstart + itemc1]; int value2 = deva[blockstart + itemc2]; localmin[loadindx] = value1 < value2? value1 : value2; } else if (blockstart + itemc1 < N) localmin[loadindx] = deva[blockstart + itemc1]; else localmin[loadindx] = deva[0]; } syncthreads(); 36

37 Párhuzamos minimum - kernel Lokális, majd globális minimum kiválasztása } while (blocksize > 0) { int locmin = localmin[itemc1] < localmin[itemc2]? localmin[itemc1] : localmin[itemc2]; syncthreads(); localmin[threadidx.x] = locmin; syncthreads(); blocksize = blocksize / 2; } if (threadidx.x == 0) atomicmin(deva, localmin[0]); Megjegyzések A blokkméret mindenképpen 2 hatványa legyen A k ciklus szerepe, hogy minden blokk kétszer futtassa le a globális memóriából megosztott memóriába való másolást. Ennek következtében a BlokkN darab szálat tartalmazó blokk 4*BlokkN elemet tölt be a globális memóriából, ebből 2*BlokkN elemet (páronként a kisebbet) ment el a megosztott memóriába, így a fenti ciklus első iterációjában mind a BlokkN darab szál össze tud hasonlítani egy párt 37

38 Összehasonlító vizsgálat Első és második optimalizált kód összehasonlítása Vízszintes tengely: vektor mérete (N) Függőleges tengely: futási idő (másodperc) 0,3 0,25 0,2 0,15 Optimalizált 1 Optimalizált 2 0,1 0, verzió Szenasi.sandor@nik.uni-obuda.hu 38

39 Összehasonlító vizsgálat Egyszerű CPU GPU kód összehasonlítása Vízszintes tengely: vektor mérete (N) Függőleges tengely: futási idő (másodperc) 0,6 0,5 0,4 0,3 CPU Optimalizált 2 0,2 0, verzió a mérés során nem vettük figyelembe a bemenő adatok átmásolását a grafikus kártya memóriájába! Szenasi.sandor@nik.uni-obuda.hu 39

40 Irodalomjegyzék címsora [1] David B. Kirk, Wen-mei W. Hwu: Programming Massively Parallel Processors Elsevier Angol 258 o. [2] NVIDIA CUDA Programming Guide 3.0 CUDA környezet teljes leírása (referencia, mintapéldák) VIDIA_CUDA_ProgrammingGuide.pdf szerző, intézmény, évszám verzió dátum/idő 40

41

42

Videókártya - CUDA kompatibilitás: CUDA weboldal: Példaterületek:

Videókártya - CUDA kompatibilitás:   CUDA weboldal:   Példaterületek: Hasznos weboldalak Videókártya - CUDA kompatibilitás: https://developer.nvidia.com/cuda-gpus CUDA weboldal: https://developer.nvidia.com/cuda-zone Példaterületek: http://www.nvidia.com/object/imaging_comp

Részletesebben

Párhuzamos és Grid rendszerek

Párhuzamos és Grid rendszerek Párhuzamos és Grid rendszerek (10. ea) GPGPU Szeberényi Imre BME IIT Az ábrák egy része az NVIDIA oktató anyagaiból és dokumentációiból származik. Párhuzamos és Grid rendszerek BME-IIT

Részletesebben

8. gyakorlat Pointerek, dinamikus memóriakezelés

8. gyakorlat Pointerek, dinamikus memóriakezelés 8. gyakorlat Pointerek, dinamikus memóriakezelés Házi ellenőrzés Egy számtani sorozat első két tagja A1 és A2. Számítsa ki a sorozat N- dik tagját! (f0051) Egy mértani sorozat első két tagja A1 és A2.

Részletesebben

Magas szintű optimalizálás

Magas szintű optimalizálás Magas szintű optimalizálás Soros kód párhuzamosítása Mennyi a várható teljesítmény növekedés? Erős skálázódás (Amdahl törvény) Mennyire lineáris a skálázódás a párhuzamosítás növelésével? S 1 P 1 P N GPGPU

Részletesebben

GPGPU alapok. GPGPU alapok Grafikus kártyák evolúciója GPU programozás sajátosságai

GPGPU alapok. GPGPU alapok Grafikus kártyák evolúciója GPU programozás sajátosságai GPGPU alapok GPGPU alapok Grafikus kártyák evolúciója GPU programozás sajátosságai Szenasi.sandor@nik.uni-obuda.hu GPGPU alapok GPGPU alapok Grafikus kártyák evolúciója GPU programozás sajátosságai Szenasi.sandor@nik.uni-obuda.hu

Részletesebben

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre. C memóriakezelés Ez a kis segédanyag az adatszerkezetek órán használt eszközök megértését hivatott elősegíteni. A teljesség igénye nélkül kerül bemutatásra a mutató típus és a dinamikus memóriakezelés.

Részletesebben

Mutatók és mutató-aritmetika C-ben március 19.

Mutatók és mutató-aritmetika C-ben március 19. Mutatók és mutató-aritmetika C-ben 2018 március 19 Memória a Neumann-architektúrában Neumann-architektúra: a memória egységes a címzéshez a természetes számokat használjuk Ugyanabban a memóriában van:

Részletesebben

C programozási nyelv Pointerek, tömbök, pointer aritmetika

C programozási nyelv Pointerek, tömbök, pointer aritmetika C programozási nyelv Pointerek, tömbök, pointer aritmetika Dr. Schuster György 2011. június 16. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 1 / 15 Pointerek (mutatók) Pointerek

Részletesebben

Készítette: Trosztel Mátyás Konzulens: Hajós Gergely

Készítette: Trosztel Mátyás Konzulens: Hajós Gergely Készítette: Trosztel Mátyás Konzulens: Hajós Gergely Monte Carlo Markov Chain MCMC során egy megfelelően konstruált Markov-lánc segítségével mintákat generálunk. Ezek eloszlása követi a céleloszlást. A

Részletesebben

KÉPFELDOLGOZÓ ALGORITMUSOK FEJLESZTÉSE GRAFIKUS HARDVER KÖRNYEZETBEN

KÉPFELDOLGOZÓ ALGORITMUSOK FEJLESZTÉSE GRAFIKUS HARDVER KÖRNYEZETBEN KÉPFELDOLGOZÓ ALGORITMUSOK FEJLESZTÉSE GRAFIKUS HARDVER KÖRNYEZETBEN Takács Gábor Konzulens: Vajda Ferenc PhD, adjunktus 1 TARTALOMJEGYZÉK: Budapesti Műszaki és Gazdaságtudományi Egyetem A kutatási projekt

Részletesebben

Visszalépéses keresés

Visszalépéses keresés Visszalépéses keresés Backtracking előadás http://nik.uni-obuda.hu/prog2 Szénási Sándor szenasi.sandor@nik.uni-obuda.hu Óbudai Egyetem,Neumann János Informatikai Kar Alapvető működése Továbbfejlesztési

Részletesebben

CUDA alapok CUDA projektek. CUDA bemutató. Adatbányászat és Webes Keresés Kutatócsoport SZTAKI

CUDA alapok CUDA projektek. CUDA bemutató. Adatbányászat és Webes Keresés Kutatócsoport SZTAKI SZTAKI 2010 Tartalom 1 2 Tartalom 1 2 GPU-k és a CUDA El zmények grakus kártyák: nagy párhuzamos számítási kapacitás eredetileg csak grakus m veleteket tudtak végezni GPU-k és a CUDA El zmények grakus

Részletesebben

egy szisztolikus példa

egy szisztolikus példa Automatikus párhuzamosítás egy szisztolikus példa Áttekintés Bevezetés Példa konkrét szisztolikus algoritmus Automatikus párhuzamosítási módszer ötlet Áttekintés Bevezetés Példa konkrét szisztolikus algoritmus

Részletesebben

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok. Eötvös Loránd Tudományegyetem Informatikai Kar Alkalmazott modul: Programozás 4. előadás Procedurális programozás: iteratív és rekurzív alprogramok Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto

Részletesebben

1. Alapok. Programozás II

1. Alapok. Programozás II 1. Alapok Programozás II Elérhetőség Név: Smidla József Elérhetőség: smidla dcs.uni-pannon.hu Szoba: I916 2 Irodalom Bjarne Stroustrup: A C++ programozási nyelv 3 Irodalom Erich Gamma, Richard Helm, Ralph

Részletesebben

OpenCL - The open standard for parallel programming of heterogeneous systems

OpenCL - The open standard for parallel programming of heterogeneous systems OpenCL - The open standard for parallel programming of heterogeneous systems GPU-k általános számításokhoz GPU Graphics Processing Unit Képalkotás: sok, általában egyszerű és független művelet < 2006:

Részletesebben

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása A verem (stack) A verem egy olyan struktúra, aminek a tetejére betehetünk egy új (vagy sorban több) elemet a tetejéről kivehetünk egy (vagy sorban több) elemet A verem felhasználása Függvény visszatérési

Részletesebben

GPGPU-k és programozásuk

GPGPU-k és programozásuk GPGPU-k és programozásuk Szénási Sándor Augusztus 2013 (1.1 verzió) Szénási Sándor Tartalomjegyzék 1. Bevezetés 2. Programozási modell 1. CUDA környezet alapjai 2. Fordítás és szerkesztés 3. Platform modell

Részletesebben

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r Programozás alapjai (GKxB_INTM023) Széchenyi István Egyetem, Gy r 2019. augusztus 29. Feladat: írjuk ki az els 10 természetes szám négyzetét! #i n c l u d e i n t main ( v o i d ) { p r

Részletesebben

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

Felvételi vizsga mintatételsor Informatika írásbeli vizsga BABEȘ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR A. tételsor (30 pont) Felvételi vizsga mintatételsor Informatika írásbeli vizsga 1. (5p) Egy x biten tárolt egész adattípus (x szigorúan pozitív

Részletesebben

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar Programozás I. 3. gyakorlat Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 1 Primitív típusok Típus neve Érték Alap érték Foglalt tár Intervallum byte Előjeles egész 0 8 bit

Részletesebben

Felvételi tematika INFORMATIKA

Felvételi tematika INFORMATIKA Felvételi tematika INFORMATIKA 2016 FEJEZETEK 1. Természetes számok feldolgozása számjegyenként. 2. Számsorozatok feldolgozása elemenként. Egydimenziós tömbök. 3. Mátrixok feldolgozása elemenként/soronként/oszloponként.

Részletesebben

Programozás alapjai. 10. előadás

Programozás alapjai. 10. előadás 10. előadás Wagner György Általános Informatikai Tanszék Pointerek, dinamikus memóriakezelés A PC-s Pascal (is) az IBM PC memóriáját 4 fő részre osztja: kódszegmens adatszegmens stackszegmens heap Alapja:

Részletesebben

SAT probléma kielégíthetőségének vizsgálata. masszív parallel. mesterséges neurális hálózat alkalmazásával

SAT probléma kielégíthetőségének vizsgálata. masszív parallel. mesterséges neurális hálózat alkalmazásával SAT probléma kielégíthetőségének vizsgálata masszív parallel mesterséges neurális hálózat alkalmazásával Tajti Tibor, Bíró Csaba, Kusper Gábor {gkusper, birocs, tajti}@aries.ektf.hu Eszterházy Károly Főiskola

Részletesebben

Programozas 1. Strukturak, mutatok

Programozas 1. Strukturak, mutatok Programozas 1 Strukturak, mutatok Strukturak Tömb: több egyforma típusú változó együttese Struktúra: több különböző típusú de logikailag egybetartozó változó együttese, amelyet az egyszerű kezelhetőség

Részletesebben

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek Tömb Ugyanolyan típusú elemeket tárol A mérete előre definiált kell legyen és nem lehet megváltoztatni futás során Legyen n a tömb mérete. Ekkor:

Részletesebben

Számítógépek felépítése

Számítógépek felépítése Számítógépek felépítése Emil Vatai 2014-2015 Emil Vatai Számítógépek felépítése 2014-2015 1 / 14 Outline 1 Alap fogalmak Bit, Byte, Word 2 Számítógép részei A processzor részei Processzor architektúrák

Részletesebben

10. gyakorlat. Pointerek Tárolási osztályok

10. gyakorlat. Pointerek Tárolási osztályok 10. gyakorlat Pointerek Tárolási osztályok Pointer A pointer egy mutató egy memóriacellára, egyfajta "parancsikon", csak nem fájlokra, hanem változókra. Létrehozás: tipus * név;, ahol a típus a hivatkozott

Részletesebben

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r Programozás (GKxB_INTM021) Széchenyi István Egyetem, Gy r 2018. április 4. Számok rendezése Feladat: Fejlesszük tovább úgy a buborék rendez algoritmust bemutató példát, hogy a felhasználó adhassa meg a

Részletesebben

Hallgatói segédlet: Nvidia CUDA C programok debugolása Nvidia Optimus technológiás laptopokon. Készítette: Kovács Andor. 2011/2012 első félév

Hallgatói segédlet: Nvidia CUDA C programok debugolása Nvidia Optimus technológiás laptopokon. Készítette: Kovács Andor. 2011/2012 első félév Hallgatói segédlet: Nvidia CUDA C programok debugolása Nvidia Optimus technológiás laptopokon Készítette: Kovács Andor 2011/2012 első félév 1 A CUDA programok debugolásához kettő grafikus kártyára van

Részletesebben

Szimuláció RICHARD M. KARP és AVI WIGDERSON. (Készítette: Domoszlai László)

Szimuláció RICHARD M. KARP és AVI WIGDERSON. (Készítette: Domoszlai László) Szimuláció RICHARD M. KARP és AVI WIGDERSON A Fast Parallel Algorithm for the Maximal Independent Set Problem című cikke alapján (Készítette: Domoszlai László) 1. Bevezetés A következőkben megadott algoritmus

Részletesebben

Programozási segédlet

Programozási segédlet Programozási segédlet Programozási tételek Az alábbiakban leírtam néhány alap algoritmust, amit ismernie kell annak, aki programozásra adja a fejét. A lista korántsem teljes, ám ennyi elég kell legyen

Részletesebben

BME MOGI Gépészeti informatika 5.

BME MOGI Gépészeti informatika 5. BME MOGI Gépészeti informatika 5. 1. feladat Készítsen alkalmazást, mely feltölt egy egydimenziós tömböt adott tartományba eső, véletlenszerűen generált egész értékekkel! Határozza meg a legkisebb és a

Részletesebben

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása Pázmány Péter Katolikus Egyetem Információs Technológiai Kar Bevezetés a programozásba I 10. gyakorlat C++: alprogramok deklarációja és paraméterátadása 2011.11.22. Giachetta Roberto groberto@inf.elte.hu

Részletesebben

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés Eötvös Loránd Tudományegyetem Informatikai Kar Alkalmazott modul: Programozás 8. előadás Strukturált programozás: dinamikus memóriakezelés Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto

Részletesebben

Programozás I. 1. előadás: Algoritmusok alapjai. Sergyán Szabolcs

Programozás I. 1. előadás: Algoritmusok alapjai. Sergyán Szabolcs Programozás I. 1. előadás: Algoritmusok alapjai Sergyán Szabolcs sergyan.szabolcs@nik.uni-obuda.hu Óbudai Egyetem Neumann János Informatikai Kar Alkalmazott Informatikai Intézet 2015. szeptember 7. Sergyán

Részletesebben

Hatékony memóriakezelési technikák. Smidla József Operációkutatási Laboratórium január 16.

Hatékony memóriakezelési technikák. Smidla József Operációkutatási Laboratórium január 16. Hatékony memóriakezelési technikák Smidla József Operációkutatási Laboratórium 2014. január 16. 1 Tartalom A cache áthidalása Cache optimalizálás Adatszerkezetek tervezése A programkód szerkezete Prefetch

Részletesebben

Programozás alapjai. 7. előadás

Programozás alapjai. 7. előadás 7. előadás Wagner György Általános Informatikai Tanszék Jótanács (1) Tipikus hiba a feladat elkészítésekor: Jótanács (2) Szintén tipikus hiba: a file-ból való törléskor, illetve a file-nak új elemmel való

Részletesebben

Occam 1. Készítette: Szabó Éva

Occam 1. Készítette: Szabó Éva Occam 1. Készítette: Szabó Éva Párhuzamos programozás Egyes folyamatok (processzek) párhuzamosan futnak. Több processzor -> tényleges párhuzamosság Egy processzor -> Időosztásos szimuláció Folyamatok közötti

Részletesebben

Pénzügyi algoritmusok

Pénzügyi algoritmusok Pénzügyi algoritmusok A C++ programozás alapjai Tömbök (3. rész) Konstansok Kivételkezelés Tömbök 3. Többdimenziós tömbök Többdimenziós tömbök int a; Többdimenziós tömbök int a[5]; Többdimenziós tömbök

Részletesebben

B-fa. Felépítés, alapvető műveletek. Programozás II. előadás. Szénási Sándor.

B-fa. Felépítés, alapvető műveletek. Programozás II. előadás.  Szénási Sándor. B-fa Felépítés, alapvető műveletek előadás http://nik.uni-obuda.hu/prog2 Szénási Sándor szenasi.sandor@nik.uni-obuda.hu Óbudai Egyetem,Neumann János Informatikai Kar B-fa Felépítése Beszúrás művelete Törlés

Részletesebben

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

C programozás. 6 óra Függvények, függvényszerű makrók, globális és C programozás 6 óra Függvények, függvényszerű makrók, globális és lokális változók 1.Azonosítók A program bizonyos összetevőire névvel (azonosító) hivatkozunk Első karakter: _ vagy betű (csak ez lehet,

Részletesebben

Láncolt listák. Egyszerű, rendezett és speciális láncolt listák. Programozás II. előadás. Szénási Sándor

Láncolt listák. Egyszerű, rendezett és speciális láncolt listák. Programozás II. előadás.  Szénási Sándor Láncolt listák Egyszerű, rendezett és speciális láncolt listák előadás http://nik.uni-obuda.hu/prog2 Szénási Sándor szenasi.sandor@nik.uni-obuda.hu Óbudai Egyetem,Neumann János Informatikai Kar Láncolt

Részletesebben

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3 Darvay Zsolt Típusok és nevek a forráskódban Állandók és változók Hatókörök és az előfeldolgozó Bevitel és kivitel Kifejezések Utasítások Mutatók Függvények Struktúrák és típusok Állománykezelés C programozás

Részletesebben

SZÁMÍTÓGÉPEK BELSŐ FELÉPÍTÉSE - 1

SZÁMÍTÓGÉPEK BELSŐ FELÉPÍTÉSE - 1 INFORMATIKAI RENDSZEREK ALAPJAI (INFORMATIKA I.) 1 NEUMANN ARCHITEKTÚRÁJÚ GÉPEK MŰKÖDÉSE SZÁMÍTÓGÉPEK BELSŐ FELÉPÍTÉSE - 1 Ebben a feladatban a következőket fogjuk áttekinteni: Neumann rendszerű számítógép

Részletesebben

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések) Adatszerkezetek Nevezetes algoritmusok (Keresések, rendezések) Keresések A probléma általános megfogalmazása: Adott egy N elemű sorozat, keressük meg azt az elemet (határozzuk meg a helyét a sorozatban),

Részletesebben

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok 6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok 1. feladat: Az EURO árfolyamát egy negyedéven keresztül hetente nyilvántartjuk (HUF / EUR). Írjon C programokat az alábbi kérdések

Részletesebben

10. gyakorlat Struktúrák, uniók, típusdefiníciók

10. gyakorlat Struktúrák, uniók, típusdefiníciók 10. gyakorlat Struktúrák, uniók, típusdefiníciók Házi - (f0218) Olvass be 5 darab maximum 99 karakter hosszú szót úgy, hogy mindegyiknek pontosan annyi helyet foglalsz, amennyi kell! A sztringeket írasd

Részletesebben

Készítette: Nagy Tibor István

Készítette: Nagy Tibor István Készítette: Nagy Tibor István A változó Egy memóriában elhelyezkedő rekesz Egy értéket tárol Van azonosítója (vagyis neve) Van típusa (milyen értéket tárolhat) Az értéke értékadással módosítható Az értéke

Részletesebben

A MATLAB alapjai. Kezdő lépések. Változók. Aktuális mappa Parancs ablak. Előzmények. Részei. Atomerőművek üzemtana

A MATLAB alapjai. Kezdő lépések. Változók. Aktuális mappa Parancs ablak. Előzmények. Részei. Atomerőművek üzemtana A MATLAB alapjai Kezdő lépések - Matlab Promt: >> - Help: >> help sqrt >> doc sqrt - Kilépés: >> quit >> exit >> Futó script leállítása: >> ctrl+c - Változók listásása >> who >> whos - Változók törlése

Részletesebben

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter Adatszerkezetek Tömb, sor, verem Dr. Iványi Péter 1 Adat Adat minden, amit a számítógépünkben tárolunk és a külvilágból jön Az adatnak két fontos tulajdonsága van: Értéke Típusa 2 Adat típusa Az adatot

Részletesebben

Bevezetés a programozásba I.

Bevezetés a programozásba I. Bevezetés a programozásba I. 3. gyakorlat Tömbök, programozási tételek Surányi Márton PPKE-ITK 2010.09.21. ZH! PlanG-ból papír alapú zárthelyit írunk el reláthatólag október 5-én! Tömbök Tömbök Eddig egy-egy

Részletesebben

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon 1. Template (sablon) 1.1. Függvénysablon Maximum függvény megvalósítása függvénynév túlterheléssel. i n l i n e f l o a t Max ( f l o a t a, f l o a t b ) { return a>b? a : b ; i n l i n e double Max (

Részletesebben

Vezérlési szerkezetek

Vezérlési szerkezetek Vezérlési szerkezetek Szelekciós ok: if, else, switch If Segítségével valamely ok végrehajtását valamely feltétel teljesülése esetén végezzük el. Az if segítségével valamely tevékenység () végrehajtását

Részletesebben

Egyszerű programozási tételek

Egyszerű programozási tételek Egyszerű programozási tételek 2. előadás Sergyán Szabolcs sergyan.szabolcs@nik.uni-obuda.hu Óbudai Egyetem Neumann János Informatikai Kar 2011. szeptember 15. Sergyán (OE NIK) AAO 02 2011. szeptember 15.

Részletesebben

Algoritmusok és adatszerkezetek 2.

Algoritmusok és adatszerkezetek 2. Algoritmusok és adatszerkezetek 2. Varga Balázs gyakorlata alapján Készítette: Nagy Krisztián 1. gyakorlat Nyílt címzéses hash-elés A nyílt címzésű hash táblákban a láncolással ellentétben egy indexen

Részletesebben

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi. Függvények 1.Függvények...1 1.1.A függvény deníció szintaxisa... 1..Függvények érték visszatérítése...3 1.3.Környezettel kapcsolatos kérdések...4 1.4.Lokális változók használata...4 1.5.Rekurzív hívások...5.kód

Részletesebben

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió BME MOGI Gépészeti informatika 3. 1. feladat Végezze el a következő feladatokat! Kérjen be számokat 0 végjelig, és határozza meg az átlagukat! A feladat megoldásához írja meg a következő metódusokat! a.

Részletesebben

Az UPPAAL egyes modellezési lehetőségeinek összefoglalása. Majzik István BME Méréstechnika és Információs Rendszerek Tanszék

Az UPPAAL egyes modellezési lehetőségeinek összefoglalása. Majzik István BME Méréstechnika és Információs Rendszerek Tanszék Az UPPAAL egyes modellezési lehetőségeinek összefoglalása Majzik István BME Méréstechnika és Információs Rendszerek Tanszék Résztvevők együttműködése (1) Automaták interakciói üzenetküldéssel Szinkron

Részletesebben

elektronikus adattárolást memóriacím

elektronikus adattárolást memóriacím MEMÓRIA Feladata A memória elektronikus adattárolást valósít meg. A számítógép csak olyan műveletek elvégzésére és csak olyan adatok feldolgozására képes, melyek a memóriájában vannak. Az információ tárolása

Részletesebben

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism) Programozás alapjai C nyelv 8. gyakorlat Szeberényi Imre BME IIT Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.11.07. -1- Mutatók és címek (ism.) Minden változó és függvény

Részletesebben

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában Programozás alapjai C nyelv 8. gyakorlat Szeberényi mre BME T Programozás alapjai. (C nyelv, gyakorlat) BME-T Sz.. 2005.11.07. -1- Mutatók és címek (ism.) Minden változó és függvény

Részletesebben

SzA19. Az elágazások vizsgálata

SzA19. Az elágazások vizsgálata SzA19. Az elágazások vizsgálata (Az elágazások csoportosítása, a feltételes utasítások használata, a műveletek eredményének vizsgálata az állapottér módszerrel és közvetlen adatvizsgálattal, az elágazási

Részletesebben

Alkalmazott modul: Programozás 10. fejezet. Strukturált programozás: dinamikus memóriakezelés. Giachetta Roberto

Alkalmazott modul: Programozás 10. fejezet. Strukturált programozás: dinamikus memóriakezelés. Giachetta Roberto Eötvös Loránd Tudományegyetem Informatikai Kar Alkalmazott modul: Programozás 10. fejezet Strukturált programozás: dinamikus memóriakezelés Giachetta Roberto A jegyzet az ELTE Informatikai Karának 2015.

Részletesebben

Java II. I A Java programozási nyelv alapelemei

Java II. I A Java programozási nyelv alapelemei Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2008. 02. 19. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve az annak

Részletesebben

3 A C programozási nyelv szintaktikai egységei

3 A C programozási nyelv szintaktikai egységei 3 A C programozási nyelv szintaktikai egységei 3.1 Azonosítók Betűk és számjegyek sorozata, betűvel vagy _ (aláhúzás) karakterrel kell kezdődnie. A nagy- és kisbetűk különbözőek. Az azonosítók tetszőleges

Részletesebben

ELEMI PROGRAMOZÁSI TÉTELEK

ELEMI PROGRAMOZÁSI TÉTELEK ELEMI PROGRAMOZÁSI TÉTELEK 1. FELADATMEGOLDÁS PROGRAMOZÁSI TÉTELEKKEL 1.1 A programozási tétel fogalma A programozási tételek típusalgoritmusok, amelyek alkalmazásával garantáltan helyes megoldást adhatunk

Részletesebben

Struktúra nélküli adatszerkezetek

Struktúra nélküli adatszerkezetek Struktúra nélküli adatszerkezetek Homogén adatszerkezetek (minden adatelem azonos típusú) osztályozása Struktúra nélküli (Nincs kapcsolat az adatelemek között.) Halmaz Multihalmaz Asszociatív 20:24 1 A

Részletesebben

Láncolt Listák. Adat1 Adat2 Adat3 ø. Adat1 Adat2 ø Adat3

Láncolt Listák. Adat1 Adat2 Adat3 ø. Adat1 Adat2 ø Adat3 Láncolt Listák Adatszerkezetek Adatszerkezet: Az adatelemek egy olyan véges halmaza, amelyben az adatelemek között szerkezeti összefüggések vannak Megvalósítások: - Tömb, Láncolt lista, Fa, Kupac, Gráf,

Részletesebben

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r Programozás I. Széchenyi István Egyetem, Gy r 2014. november 16. Áttekintés kel kapcsolatos fogalmak deklaráció Több, kompatibilis változat is elképzelhet. Meg kell el znie a fv. hívását. Mindenképp rögzíti

Részletesebben

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása Tömbök kezelése Példa: Vonalkód ellenőrzőjegyének kiszámítása A számokkal jellemzett adatok, pl. személyi szám, adószám, taj-szám, vonalkód, bankszámlaszám esetében az elírásból származó hibát ún. ellenőrző

Részletesebben

GPU Lab. 14. fejezet. OpenCL textúra használat. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

GPU Lab. 14. fejezet. OpenCL textúra használat. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc 14. fejezet OpenCL textúra használat Grafikus Processzorok Tudományos Célú Programozása Textúrák A textúrák 1, 2, vagy 3D-s tömbök kifejezetten szín információk tárolására Főbb különbségek a bufferekhez

Részletesebben

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs Programozás I. 3. előadás Egyszerű programozási tételek Sergyán Szabolcs sergyan.szabolcs@nik.uni-obuda.hu Óbudai Egyetem Neumann János Informatikai Kar Alkalmazott Informatikai Intézet 2015. szeptember

Részletesebben

Programozás I. - 11. gyakorlat

Programozás I. - 11. gyakorlat Programozás I. - 11. gyakorlat Struktúrák, gyakorlás Tar Péter 1 Pannon Egyetem M szaki Informatikai Kar Rendszer- és Számítástudományi Tanszék Utolsó frissítés: November 16, 2009 1 tar@dcs.vein.hu Tar

Részletesebben

Programozási nyelvek Java

Programozási nyelvek Java Programozási nyelvek Java 2. gyakorlat Függvények Általános prototípus Módosítószavak Láthatóság: public, protected, private. Ha nem definiált, akkor úgynevezett package-private láthatóság. Lehet abstract

Részletesebben

Adatszerkezetek I. 8. előadás. (Horváth Gyula anyagai felhasználásával)

Adatszerkezetek I. 8. előadás. (Horváth Gyula anyagai felhasználásával) Adatszerkezetek I. 8. előadás (Horváth Gyula anyagai felhasználásával) Kereső- és rendezőfák Közös tulajdonságok: A gyökérelem (vagy kulcsértéke) nagyobb vagy egyenlő minden tőle balra levő elemnél. A

Részletesebben

Rekurzió. Dr. Iványi Péter

Rekurzió. Dr. Iványi Péter Rekurzió Dr. Iványi Péter 1 Függvényhívás void f3(int a3) { printf( %d,a3); } void f2(int a2) { f3(a2); a2 = (a2+1); } void f1() { int a1 = 1; int b1; b1 = f2(a1); } 2 Függvényhívás void f3(int a3) { printf(

Részletesebben

Bevezetés a programozásba. 5. Előadás: Tömbök

Bevezetés a programozásba. 5. Előadás: Tömbök Bevezetés a programozásba 5. Előadás: Tömbök ISMÉTLÉS Specifikáció Előfeltétel: milyen körülmények között követelünk helyes működést Utófeltétel: mit várunk a kimenettől, mi az összefüggés a kimenet és

Részletesebben

Pásztor Attila. Algoritmizálás és programozás tankönyv az emeltszintű érettségihez

Pásztor Attila. Algoritmizálás és programozás tankönyv az emeltszintű érettségihez Pásztor Attila Algoritmizálás és programozás tankönyv az emeltszintű érettségihez 3. ADATTÍPUSOK...26 3.1. AZ ADATOK LEGFONTOSABB JELLEMZŐI:...26 3.2. ELEMI ADATTÍPUSOK...27 3.3. ÖSSZETETT ADATTÍPUSOK...28

Részletesebben

Számítógép felépítése

Számítógép felépítése Alaplap, processzor Számítógép felépítése Az alaplap A számítógép teljesítményét alapvetően a CPU és belső busz sebessége (a belső kommunikáció sebessége), a memória mérete és típusa, a merevlemez sebessége

Részletesebben

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek Programozás alapjai II. (7. ea) C++ Kiegészítő anyag: speciális adatszerkezetek Szeberényi Imre BME IIT M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 1

Részletesebben

7. fejezet: Mutatók és tömbök

7. fejezet: Mutatók és tömbök 7. fejezet: Mutatók és tömbök Minden komolyabb programozási nyelvben vannak tömbök, amelyek gondos kezekben komoly fegyvert jelenthetnek. Először is tanuljunk meg tömböt deklarálni! //Tömbök használata

Részletesebben

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK, Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás OE-NIK, 2013 1 Hallgatói Tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk

Részletesebben

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök Programozás alapjai II. (8. ea) C++ Kiegészítő anyag: speciális adatszerkezetek Szeberényi Imre BME IIT Speciális adatszerkezetek A helyes adatábrázolás választása, a helyes adatszerkezet

Részletesebben

Operációs rendszerek. Az NT folyamatok kezelése

Operációs rendszerek. Az NT folyamatok kezelése Operációs rendszerek Az NT folyamatok kezelése Folyamatok logikai felépítése A folyamat modell: egy adott program kódját végrehajtó szál(ak)ból és, a szál(ak) által lefoglalt erőforrásokból állnak. Folyamatok

Részletesebben

Kiegészítő részelőadás 1. Az algoritmusok hatékonyságának mérése

Kiegészítő részelőadás 1. Az algoritmusok hatékonyságának mérése Kiegészítő részelőadás 1. Az algoritmusok hatékonyságának mérése Dr. Kallós Gábor 2014 2015 1 Az Ordó jelölés Azt mondjuk, hogy az f(n) függvény eleme az Ordó(g(n)) halmaznak, ha van olyan c konstans (c

Részletesebben

A C programozási nyelv III. Pointerek és tömbök.

A C programozási nyelv III. Pointerek és tömbök. A C programozási nyelv III. Pointerek és tömbök. Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 1 Mutató (pointer) fogalma A mutató olyan változó,

Részletesebben

GPU-Accelerated Collocation Pattern Discovery

GPU-Accelerated Collocation Pattern Discovery GPU-Accelerated Collocation Pattern Discovery Térbeli együttes előfordulási minták GPU-val gyorsított felismerése Gyenes Csilla Sallai Levente Szabó Andrea Eötvös Loránd Tudományegyetem Informatikai Kar

Részletesebben

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs sergyan.szabolcs@nik.uni-obuda.hu

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs sergyan.szabolcs@nik.uni-obuda.hu Programozás I. 3. előadás Egyszerű programozási tételek Sergyán Szabolcs sergyan.szabolcs@nik.uni-obuda.hu Óbudai Egyetem Neumann János Informatikai Kar Alkalmazott Informatikai Intézet 2015. szeptember

Részletesebben

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7. Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1 Vitéz András egyetemi adjunktus BME Híradástechnikai Tanszék vitez@hit.bme.hu Dinamikus memóriakezelés Dinamikus tömbök Dinamikus stringek Program kapcsolata a

Részletesebben

Készítette: Nagy Tibor István

Készítette: Nagy Tibor István Készítette: Nagy Tibor István Operátorok Műveletek Egy (vagy több) műveleti jellel írhatók le A műveletet operandusaikkal végzik Operátorok fajtái operandusok száma szerint: egyoperandusú operátorok (pl.:

Részletesebben

Mintavételes szabályozás mikrovezérlő segítségével

Mintavételes szabályozás mikrovezérlő segítségével Automatizálási Tanszék Mintavételes szabályozás mikrovezérlő segítségével Budai Tamás budai.tamas@sze.hu http://maxwell.sze.hu/~budait Tartalom Mikrovezérlőkről röviden Programozási alapismeretek ismétlés

Részletesebben

Flynn féle osztályozás Single Isntruction Multiple Instruction Single Data SISD SIMD Multiple Data MISD MIMD

Flynn féle osztályozás Single Isntruction Multiple Instruction Single Data SISD SIMD Multiple Data MISD MIMD M5-. A lineáris algebra párhuzamos algoritmusai. Ismertesse a párhuzamos gépi architektúrák Flynn-féle osztályozását. A párhuzamos lineáris algebrai algoritmusok között mi a BLAS csomag célja, melyek annak

Részletesebben

Programozás alapjai II. (7. ea) C++

Programozás alapjai II. (7. ea) C++ Programozás alapjai II. (7. ea) C++ Kiegészítő anyag: speciális adatszerkezetek Szeberényi Imre BME IIT M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 1

Részletesebben

Generikus osztályok, gyűjtemények és algoritmusok

Generikus osztályok, gyűjtemények és algoritmusok Programozási, gyűjtemények és algoritmusok bejárása Informatikai Kar Eötvös Loránd Tudományegyetem 1 Tartalom 1 bejárása 2 bejárása 2 Java-ban és UML-ben bejárása Az UML-beli paraméteres osztályok a Java

Részletesebben

1. Jelölje meg az összes igaz állítást a következők közül!

1. Jelölje meg az összes igaz állítást a következők közül! 1. Jelölje meg az összes igaz állítást a következők közül! a) A while ciklusban a feltétel teljesülése esetén végrehajtódik a ciklusmag. b) A do while ciklusban a ciklusmag után egy kilépési feltétel van.

Részletesebben

Programozási technológia

Programozási technológia Programozási technológia Generikus osztályok Gyűjtemények Dr. Szendrei Rudolf ELTE Informatikai Kar 2018. Generikus osztályok Javaban az UML paraméteres osztályainak a generikus (sablon) osztályok felelnek

Részletesebben

Egész számok. pozitív egész számok: 1; 2; 3; 4;... negatív egész számok: 1; 2; 3; 4;...

Egész számok. pozitív egész számok: 1; 2; 3; 4;... negatív egész számok: 1; 2; 3; 4;... Egész számok természetes számok ( ) pozitív egész számok: 1; 2; 3; 4;... 0 negatív egész számok: 1; 2; 3; 4;... egész számok ( ) 1. Írd a következõ számokat a halmazábra megfelelõ helyére! 3; 7; +6 ; (

Részletesebben

4. Funkcionális primitívek GPUn

4. Funkcionális primitívek GPUn 4. Funkcionális primitívek GPUn GPU API emlékeztető Jelenleg a következő eszközök állnak rendelkezésre GPUs kódok futtatására: DirectX vagy OpenGL vagy Vulkan Compute Shader Ez grafikai célokra van kitalálva,

Részletesebben

Hatékonyság 1. előadás

Hatékonyság 1. előadás Hatékonyság 1. előadás Mi a hatékonyság Bevezetés A hatékonyság helye a programkészítés folyamatában: csak HELYES programra Erőforrásigény: a felhasználó és a fejlesztő szempontjából A hatékonyság mérése

Részletesebben