Skrolli 2019.2: GPGPU-laskenta (GLSL)
GPGPU-laskenta (GLSL)
Listaukset
- GPGPU-laskenta_GLSL_Listaukset_Skrolli20192.zip
- Rautatieverkkodata listaukseen 2
- Ylikuutio-pelimoottori – https://github.com/nrz/ylikuutio
Saatesanat
GPGPU-ohjelmointi GLSL:llä on matalan tason ohjelmointia, kuten muukin OpenGL-ohjelmointi. Jos tekstuurin formaatin, sisäinen formaatin tai tyypin arvot ovat keskenään epäyhteensopivia, siitä saattaa seurata OpenGL-virhe tai laskennan tulokset voivat olla virheellisiä. Matalan tason ohjelmoinnissa kannattaa edetä askel kerrallaan alhaalta ylöspäin, ja aikaa kannattaa varata riittävästi.
Pelimoottori Ylikuutiosta (ks. GitHub-lähdekoodilinkki edellä) löytyy esimerkki GPGPU-toteutuksesta nimellä gpgpu-test. Kun Ylikuution kääntää GCC:llä tai Clangilla Ylikuution README.md:n ohjeiden mukaisesti, yhtenä käännöstuotteena käännetään myös gpgpu-test. Gpgpu-test sisältää useita eri laskentatehtäviä, mukaanlukien kaikki Skrollin artikkelissa mainitut laskentatehtävät, ja Floydin-Warshallin algoritmistä on toimiva toteutus sekä kokonaisluvuilla toteutettuna (tekstuurin formaattina GL_RED, sisäisenä formaattina GL_R16, tyyppinä GL_UNSIGNED_INT) että liukuluvuilla toteutettuna (tekstuurin formaattina GL_RED, sisäisenä formaattina GL_R32F, tyyppinä GL_FLOAT). Näiden kummankin välitulokset sekä lopputulokset tallennetaan tiedostoihin käyttäen juoksevaa numerointia. Kaikki laskentatehtävät on määritelty osana Scene-oliota tiedostossa gpgpu_test_scene.cpp.
Gpgpu-test:n tuloksia voi tarkastella esimerkiksi Ylikuution projektihakemiston alihakemistosta code/bash löytyvillä bash-skripteillä print_integer_results_of_width_32 ja print_float_results_of_width_32. Kuten skriptien nimistä voi päätellä, nämä skriptit olettavat tekstuurin leveydeksi 32, mutta skriptejä voi helposti muokata mieleisekseen. Kuvatiedostot voi avata esim. GIMPillä ("Raw image data, *.data"). Jos käyttää muuta kuin neljällä jaollista asemien lukumäärää eli tekstuurin leveyttä, kannattaa muistaa säätää GL_UNPACK_ALIGNMENT ja GL_PACK_ALIGNMENT, tai muulla tavoin pitää huoli siitä, että dataa siirrettäessä ei ilmene ylivuotoa.
Ylikuution lähdekoodi on kehittyy jatkuvasti, joten näihinkin ohjelmiin tulee jossain vaiheessa luultavasti muutoksia. Laskentatehtäväesimerkeissä ei esimerkiksi käytetä lainkaan PreIterateCallback- ja PostIterateCallback-takaisinkutsufunktioita, koska toteutetuissa laskentatehtävissä niille ei vielä ilmennyt käyttötarvetta.
Skrollit (artikkelissa mainitut)
- OpenGL-kurssi:
- Skrolli 2013.2 (ja pdf-lehti): https://skrolli.fi/numerot/2013-2/
- Skrolli 2013.3 (ja pdf-lehti): https://skrolli.fi/numerot/2013-3/
- Skrolli 2013.4 (ja pdf-lehti): https://skrolli.fi/numerot/2013-4/
- Skrolli 2014.1 (ja pdf-lehti): https://skrolli.fi/numerot/2014-1/
- Skrolli 2014.2 (ja pdf-lehti): https://skrolli.fi/numerot/2014-2/
- Näin syntyi Assembly-demo:
- Skrolli 2018.3: https://skrolli.fi/numerot/2018-3/
- Pelimoottori harrastusprojektina (Ylikuutio):
- Skrolli 2018.4: https://skrolli.fi/numerot/2018-4/
Linkkejä
- GPGPU:
- OpenGL:n primitiivit (GL_TRIANGLE_STRIP): https://www.khronos.org/opengl/wiki/Primitive
- LearnOpenGL - Framebuffers: https://learnopengl.com/Advanced-OpenGL/Framebuffers
- The OpenGL Framebuffer Object Extension: http://download.nvidia.com/developer/presentations/2005/GDC/OpenGL_Day/OpenGL_FrameBuffer_Object.pdf
- OpenGL-tutorial, osa 2 – The first triangle: http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/
- OpenGL-tutorial, osa 14 – Render to texture: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-14-render-to-texture/
- Fragmenttishaderit: https://www.khronos.org/opengl/wiki/Fragment_Shader
- Läpinäkymättömät tyypit (opaque types): https://www.khronos.org/opengl/wiki/Data_Type_(GLSL)#Opaque_types
- Läpinäkymättömät taulukot (opaque arrays): https://www.khronos.org/opengl/wiki/Data_Type_(GLSL)#Opaque_arrays
- Vakioilmaisut (constant expressions): https://www.khronos.org/opengl/wiki/Core_Language_(GLSL)#Constant_expression
- Näytteistin (sampler): https://www.khronos.org/opengl/wiki/Sampler_(GLSL)
- OpenGL:n formaatit: https://www.khronos.org/opengl/wiki/Image_Format
- glTexImage2D ja OpenGL-tekstuurien formaatit: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml
- glTexImage3D ja OpenGL-tekstuurien formaatit: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage3D.xhtml
- OpenGL:n muuttujatyypit: https://www.khronos.org/opengl/wiki/OpenGL_Type
- Yleisiä OpenGL:n kanssa tehtyjä virheitä: https://www.khronos.org/opengl/wiki/Common_Mistakes
- Offloading and CUDA: Parallelism in C++ #3/3 (also OpenMP, OpenACC, GPU & Coprocessors like Xeon Phi): https://www.youtube.com/watch?v=kIA_UtdVabQ (ei käsittele GLSL:ää, mutta kertoo GPU-laskennasta yleisesti sekä vaihtoehtoisista – pääosin uudemmista – tavoista hyödyntää GPU:ta laskennassa)
- Floyd-Warshall:
Rautatiedata (listaukseen 2)
- Rautatieverkkodata (asemat ovat aakkosjärjestyksessä):
- Kokonaislukuina: https://github.com/nrz/ylikuutio/blob/master/res/graphs/more_finnish_railway_stations_unsigned_integer.csv
- Liukulukuina: https://github.com/nrz/ylikuutio/blob/master/res/graphs/more_finnish_railway_stations_float.csv (liukulukutoteutusta ei mainita artikkelissa, mutta myös liukulukulaskenta on mahdollista OpenGL 3.0:lla)
- Zip-paketissa: GPGPU-laskenta_GLSL_Data_Skrolli20192.zip
- VR:n aikataulut:
- aikataulu 1: Helsinki - Turku - Turku Satama, Karjaa-Hanko
- aikataulu 4: Helsinki - Pori
- aikataulu 5: Helsinki - Vaasa
- aikataulu 7: Helsinki - Oulu - Kolari/Rovaniemi/Kemijärvi, Ylivieska-Iisalmi
- aikataulu 9: Joensuu - Jyväskylä - Tampere - Turku Satama
- aikataulu 11: Tampere - Haapamäki - Keuruu, Jyväskylä - Haapamäki - Seinäjoki
- aikataulu 12: Helsinki - Lahti - Kouvola - Kotkan satama
- aikataulu 12A: Helsinki - Riihimäki - Kouvola
- aikataulu 13: Helsinki - Kuopio - Oulu - Rovaniemi, Iisalmi - Ylivieska
- aikataulu 14: Helsinki - Savonlinna/Joensuu - Nurmes