Skrolli 2019.2: GPGPU-laskenta (GLSL)

GPGPU-laskenta (GLSL)

Listaukset

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)

Linkkejä

Rautatiedata (listaukseen 2)