TIEA342 Modernien moniydinprosessoreiden ohjelmointi

Päivitetty 24.6.2016

Tilanne:

Kurssin materiaalit

  • Harjoitustehtävät: [1] [2] [3] [4-5]
  • Mallivastaukset ja arvostelukriteerit: [1] [2]
  • Luentokalvot:
    • 01: Rinnakkaisohjelmointi
    • 02: Vektorilaskenta (käsitellään jossain välissä)
    • 03: OpenMP
    • 04: Ensimmäinen kosketus GPU-ohjelmointiin
    • 05: Lisää GPU-ohjelmoinnista, Osa 1
    • 06: GPU-laitteisto ja tehokkaan ohjelmakoodin kirjoittaminen
    • 07: Lisää GPU-ohjelmoinnista, Osa 2
  • Esimerkkikoodit
    • Motivoiva CUDA-esimerkki (materiaalit)
    • Vahva ja heikko skaalautuvuus (materiaalit)
    • Ensimmäinen OpenCL 1.2 -ohjelma (materiaalit)
    • Ensimmäinen CUDA-ohjelma
    • Esimerkkejä vektorin summaamisesta rinnakkain (materiaalit)
    • Printf-esimerkkejä
    • 2D-taulukon käsittely (materiaalit)
    • Muistin mappaaminen (materiaalit)
    • Useamman komentojonon käyttäminen
    • Eventtien käyttäminen
    • OpenCL 2.0
    • Kehittyneempi CUDA
    • Vektorilaskentaesimerkit (materiaalit)
  • Muita materiaaleja:
    • FAQ

Viestintä

  • Kurssin slack: tiea342-2016.slack.com
    • Ilmoittakaa teknisistä ongelmista #tekniset_ongelmat-kanavalla. Pyrimme seuraamaan kanavaa parhaamme mukaan ja välitämme tiedot vikatilanteista eteenpäin.
    • Tarvitsee @jyu.fi tai @student.jyu.fi päätteisen sähköpostin tunnuksien luomiseen. Ilmoita sähköpostiosoitteesi mikäli käytät muun tyyppistä sähköpostia.
  • Kurssin yleinen sähköpostilista: tiea342yleinen2016@korppi.jyu.fi
    • [tiea342yleinen2016]-etuliite lisätään automaattisesti
  • Opettajat:
    • Mirko Myllykoski (mirko.myllykoski@jyu.fi)
    • Tuomo Rossi (tuomo.j.rossi@jyu.fi)
    • Aloittakaa sähköpostien otsikot koodilla [TIEA342]

Kurssin sisältö

Kurssin suunniteltu sisältö enemmän tai vähemmän kronologisessa järjestyksessä:

  • Rinnakkaisohjelmoinnin perusteet
  • GPU-ohjelmoinnin perusteet (OpenCL 1.2/2.0 ja CUDA)
  • Hieman tarkempi katsaus GPU-laitteistoon
  • Tehokkaan GPU-ohjelmakoodin kirjoittaminen
  • OpenCL:n ja CUDA:n kehittyneemmät ominaisuudet

Kurssilla ei käsitellä 3D-grafiikkaa. Kurssilla käsiteltäviä ohjelmointirajapintoja on mahdollista käyttää yhdessä OpenGL:n ja DirectX:n kanssa, mutta asiaa ei käsitellä kurssilla.

Oppimistavoitteet

Kurssin suoritettuaan opiskelija

  • hallitsee rinnakkaisohjelmoinnin perusteet,
  • osaa analysoida rinnakkaista ohjelmakoodia,
  • osaa tuottaa tehokasta OpenCL- ja CUDA-ohjelmakoodia ja
  • ymmärtää GPU-laitteiston toiminnan.

Esitiedot

  • TIEP111 Ohjelmointi 2
  • ITKA203 Käyttöjärjestelmät
  • C++ -ohjelmointikielen sisälukutaito
  • Linux-ympäristön käyttö
  • Kursseja, joista saattaa olla hyötyä kurssin suorittamisen kannalta (eivät pakollisia): ITKA201 Algoritmit 1, TIEA211 Algoritmit 2 ja TIEA381 Numeeriset menetelmät
  • Matematiikan perusopinnot (sisältäen kurssin tai pari lineaarialgebraa) olisi hyödyksi, mutta ei pakollinen

Opetusmuodot

  • Alussa luentoja rinnakkaisohjelmoinnin teoriasta, jonka jälkeen kontaktiopetusta "demoryhmissä" / pienryhmissä
  • Kontaktiopetukseen liittyvää materiaalia tulee olemaan vain niukasti saatavilla verkon välityksellä, joten paikalla oleminen on suositeltavaa

Pienryhmien aikataulu

Harjoitusryhmäaikojen sopivuus -kyselyn tulokset (kuinka monelle kellonaika ei sovi) ja aikataulu
Harjoitusryhmäaikojen sopivuus -kyselyn tulokset (kuinka monelle kellonaika ei sovi) ja aikataulu

Kurssin suorittaminen

  • Kurssi suoritetaan tekemällä riittävä määrä harjoitustehtäviä
  • Yhden viikon harjoitustehtävistä on mahdollista saada 4 pistettä (yhteensä 20)
  • Osa harjoitustehtävistä on pakollisia
  • Myöhässä palautetuista harjoitustehtävistä sakotetaan ja tarvittaessa kurssin suoritus hylätään mikäli pakollisia tehtäviä ei ole tehty tai pistemäärä ei riitä. Asian suhteen on hieman joustoa ja etukäteen neuvottelemalla välttää monet ongelmat.
  • Arvosteluasteikko:
Arvosana 1 2 3 4 5
Yhteispisteet harjoitustehtävistä 10 12 14 16 18
Osuus maksimipistemäärästä 50% 60% 70% 80% 90%

Harjoitustehtävien palautus

Kurssin harjoitustehtävät palautetaan Yousourceen gitin avulla. Tallenna N:nännen harjoitustehtäväsatsin M:mäs tehtävä repokansioon Harjoitus_N/Tehtava_M. Esimerkiksi kolmansien harjoitustehtävien toisen tehtävän vastaus tallennettaisiin kansioon Harjoitus_3/Tehtava_2. Vastaukset ladataan automaattisesti Yousourcesta takarajan sulkeuduttua.

Pikaohje (lisää tyypillisimmät tiedostotyypit seurantaa, committaa kaikki muutokset, puskee kaiken Yousourceen):

cd tiea342_sukunimi_etunimi/
git add --ignore-missing *.c *.cpp *.cu *.h *.cl *.txt *.pdf *.png *.svg Makefile README
git commit -a -m "Full commit `date +%F_%R`"
git push origin master
git status -u

Harjoitustehtäviin liittyvien ohjelmakoodien toimivuus tulee testata ainakin yhdellä yliopiston GPU-palvelimella ennen palautusta. Mainitse käytetty palvelin (ja tarvittaessa GPU) palauttaessasi ja liitä mukaan ohjelman tuloste (luo README tiedosto). Ohjelmakoodin mukana tulee toimittaa toimiva Makefile. Muista myöskin kommentoida koodisi!

Huomautus: GPU-palvelimet saattavat ruuhkautua, joten tehtävien tekemistä ei kannata jättää viimeiseen iltaan/yöhön. Tarvittaessa tulemme jakamaan kurssilaiset viikottain satunnaisiin ryhmiin ja jokaiselle ryhmälle annetaan eri takaraja tehtävien palauttamiseen. Ilmoittakaa teknisistä ongelmista kurssin slack'in #tekniset_ongelmat-kanavalla, kurssin yleisellä sähköpostilistalla (tiea342yleinen2016@korppi.jyu.fi) tai suoraan opettajille (mirko.myllykoski@jyu.fi, tuomo.j.rossi@jyu.fi).

OpenCL ja CUDA

  • Kurssilla käytetään OpenCL- ja CUDA-ympäristöjä
  • Eri GPU-valmistajien tuki näille ympäristöille vaihtelee:
alusta \ valmistaja Nvidia AMD Intel
OpenCL 1.2 Tuettu Tuettu Tuettu
OpenCL 2.0 Ei tuettu Tuettu Tuettu
CUDA Tuettu Ei tuettu Ei tuettu

OpenCL ja CUDA (jatkuu)

  • Suurin osa kurssilla käsiteltävista tekniikoista onnistuu OpenCL 1.2:lla
  • Esimerkeissä käytetään paljon CUDA:a, koska sen syntaksi on yksinkertaisempi
  • Kurssin loppupuolella olisi tarkoitus tutustua hieman tarkemmin CUDA:n ja OpenCL 2.0:n erityisominaisuuksiin
  • Harjoitustehtävät voi tehdä OpenCL:llä tai CUDA:lla ellei toisin mainita

GPU-palvelimet

  • Kurssin aikana on käytettävissä kolme GPU-palvelinta:
    • piraija.it.jyu.fi (Nvidia Tesla K40c; OpenCL 1.2 ja CUDA; CC 3.5)
    • mako.it.jyu.fi (4 \(\times\) Nvidia GeForce GTX580; OpenCL 1.1 ja CUDA; CC 2.0)
    • fisu.it.jyu.fi (AMD Radeon R9 390X; OpenCL 1.2/2.0; GCN 1.1)
  • Mako on hieman vanhempi, joten siitä ei onnistu ihan kaikki temput
  • Kirjaudu tarvittaessa palvelimen jalava.cc.jyu.fi (tai halava.cc.jyu.fi) kautta tai käytä yliopiston VPN:nää

Oman GPU:n käyttäminen

  • Oman GPU:n käyttäminen on tietenkin sallittua
  • Kortin pitäisi olla kuitenkin riittävän tuore:
    • Nvidian GTX400-sarjalainen / Fermi / CC 2.0 tai uudempi
    • AMD:n HD 7700 -sarjalainen tai uudempi GCN-kortti
    • Intelin integroidut GPU:t saattavat olla ok
  • Esimerkkikoodit on tarkoitettu ajettaviksi Linux-ympäristössä

Kirjallisuutta

  • Ohjelmointi 2 -kurssin C++ -materiaalit
  • Käyttöjärjestelmät-kurssin luentomoniste
  • Nvidian CUDA-ohjelmointiohje
  • Nvidian parhaat käytönnöt -ohje
  • Lisää Nvidian dokumentaatioita
  • AMD:n OpenCL-ohjelmointiohje
  • AMD:n optimointiohje
  • OpenCL 1.2 -määritykset
  • OpenCL 1.2 C++ -kääre ja sen dokumentaatio
  • OpenCL 2.0 -määritykset
  • OpenCL 2.0 C++ -kääre ja sen dokumentaatio