Suurteholaskennan ohjelmointikielet

Vuoden 2021 viisi suosituinta ohjelmointikieltä ovat Googlen ohjelmointikielten käyttöopastushakujen perusteella perusteella Python, Java, Javascript, C# ja C/C++. Suurteholaskennan yhteydessä Java-, Javascript- ja C#-kieliä ei kuitenkin käytetä käytännössä ollenkaan, vaan hallitsevia kieliä ovat Fortran ja C/C++. Lisäksi Pythonin käyttö, tavallisesti yhdessä C/C++:n kanssa, on jo pitkään lisääntynyt tasaisesti. Uusi tulokas, Julia, on myös herättänyt kiinnostusta.

Nykyisin yhdessä sovelluksessa käytetään yleisesti useita ohjelmointikieliä. Lisäksi kaikki mainitut kielet tukevat myös yhteentoimivuutta, joten eri ohjelmointikielellä kirjoitettuja aliohjelmia on mahdollista kutsua.



Perusohjelmointikielet tukevat yleensä ensisijaisesti peräkkäislaskentaa, ja rinnakkaisuus toteutetaan kielilaajennusten ja erityisten tiedonsiirtokirjastojen avulla. Tavallisesti käytetään myös erilaisia tehokkaita aliohjelmakirjastoja.


Fortran

Fortran (FORmula TRANslation) on tieteellisessä laskennassa perinteisesti käytetty ohjelmointikieli. IBM kehitti sen alun perin 1950-luvulla, ja se suunniteltiin numeerista laskentaa varten. Fortran on kehittynyt jatkuvasti ja saanut uusia ominaisuuksia. Se on edelleen erittäin tärkeä kieli tieteellisessä laskennassa. Uusin Fortran-standardi on Fortran 2018. Seuraava versio on suunniteltu julkaistavan vuosien 2021–2022 aikana.

Monien tieteellisten sovellusten tärkeimpiä tietorakenteita ovat suuret moniulotteiset numeeriset taulukot. Fortranin suuri etu on niiden käsittelemiseen tarjolla oleva kätevä ja tehokas työkaluvalikoima. Kielirakenne sopii hyvin myös kääntäjän optimointeihin, ja Fortran-ohjelmat tyypillisesti käyttävätkin suorittimia tehokkaasti.

Vaikka Fortran 2018 -standardi sisältää tuen ja rakenteita rinnakkaisohjelmoinnille, Fortran-rinnakkaisohjelmat käyttävät usein muita rinnakkaistamismenetelmiä tai -kirjastoja.

Alla oleva esimerkkikoodi laskee reaalilukuja välillä 0–99 sisältävän matriisin elementtien summan:

program fortran_example
 implicit none

 integer :: i
 real :: array(100) = [(i, i=0, 99)]

 write(*,*) 'sum of array', sum(array)

end program fortran_example

Fortran on käännettävä kieli. Tämä tarkoittaa, että lähdekooditiedosto syötetään ensin kääntäjälle, joka tuottaa konekielisen suoritettavan tiedoston, joka voidaan sitten ajaa tietokoneessa.

Yllä oleva koodi voidaan kääntää GNU Fortran -kääntäjällä (usein käytettävissä oletusarvoisesti Linux-järjestelmissä) ja suorittaa sitten seuraavasti:

$ gfortran -o sum sum.F90
$ ./sum
 sum of array   4950.00000

Fortran-ohjelmoijien käytössä on myös laaja kokoelma tieteellisiä ja numeerisia aliohjelmakirjastoja.

C/C++

C on toinen yleinen kieli, joka on ollut käytössä tieteellisen laskennan alkuajoista lähtien. Bell Labs on kehittänyt C-kielen 1970-luvun alussa yleiskieleksi Unix-käyttöjärjestelmälle ja sen apuohjelmille. C:n suosio lisääntyi 1980-luvulla, ja se on yksi nykypäivän suosituimmista ohjelmointikielistä. Sitä käytetään laajasti myös tieteellisessä laskennassa.

C++ kehitettiin C:n laajennuksena 1980-luvun alussa. Nykyään C++-kieltä voidaan pitää omana kielenä, vaikka sillä on yhteisiä ominaisuuksia C:n kanssa. Uusin C++-standardi on C++20 vuodelta 2020. Seuraava standardi on suunniteltu julkaistavan vuonna 2023.

C++ on yleiskäyttöinen, olioperustainen kieli, jossa data ja sitä käsittelevä koodi (menetelmät) pakataan niin kutsuttuihin olioihin. Tämä mahdollistaa datan käsittelyn paremman hallinnan ja vähentää ohjelmointivirheiden riskiä, erityisesti suurissa projekteissa, joissa useat ohjelmoijat osallistuvat saman ohjelmiston kehittämiseen.

C++-kielestä on tulossa entistä tärkeämpi tieteellisessä laskennassa. Monet uudet rinnakkaisohjelmointilaajennukset, kirjastot ja muut vastaavat otetaan ensin käyttöön C++-kielellä erityisesti käytettäessä grafiikkasuorittimia.

C++11-standardi sisältää säikeistämistoiminnallisuuden, jota voidaan käyttää yhteisen muistin rinnakkaistamiseen. Hajautetun muistin rinnakkaistus edellyttää kuitenkin muiden tiedonsiirtokirjastojen käyttöä.

C++-kielellä matriisin elementtien summan laskeva ohjelma näyttää seuraavalta:

#include <iostream>
#include <vector>

int main()
{
   auto array = std::vector<float>(100);

   for (int i=0; i < 100; ++i)
      array[i] = i;

   auto sum = array[0];
   for (int i=1; i < 100; ++i)
      sum += array[i];

   std::cout << "Sum of array " << sum << std::endl;
}

C ja C++ ovat Fortranin tavoin käännettyjä kieliä. Yllä oleva koodi voidaan kääntää GNU C++ -kääntäjällä ja suorittaa seuraavasti:

$ g++ -o sum sum.cpp
$ ./sum
Sum of array 4950



Python

Python on 1980-luvulla luotu korkean tason yleiskieli. Python tukee useita ohjelmointiparadigmoja, kuten rakenteisia, olioperustaisia ja funktionaalisia. Python on suunniteltu erittäin laajennettavaksi ja helppolukuiseksi. Siitä on tullut hyvin suosittu myös tieteellisessä laskennassa sen mahdollistaman nopean koodinkehityksen ansiosta. Pythonia käytetä��n erityisesti algoritmien korkean tason logiikan kirjoittamiseen.

Python on tulkattu kieli, joten erillistä kääntämisvaihetta ei tarvita. Osittain Pythonin tulkattavuudesta johtuen puhtaiden Python-ohjelmien suorituskyky ei kuitenkin aina ole optimaalinen. Tämän vuoksi tieteellisissä sovelluksissa Pythonin lisäksi käytetään tavallisesti C-, C++- tai Fortran-kieltä sovelluksen suorituskyvyn kannalta tärkeissä aliohjelmissa.

Pythonissa on useita laajennusmoduuleja numeeriseen ja tieteelliseen laskentaan sekä datatieteen sovelluksiin. Lisäksi monet nykyiset tekoälyohjelmistot tarjoavat Python-rajapinnan ongelman tai mallin määrittelyä varten.

Pythonin vakiokirjastossa on toiminnallisuus yhteisen muistin rinnakkaistamiseen, mutta hajautetun muistin rinnakkaistamiseen tarvitaan erilliset laajennukset.

Pythonissa matriisin summa voidaan laskea seuraavasti:

import numpy

array = numpy.arange(0, 100, dtype=float)
print("Sum of array {}".format(array.sum()))

Erillistä käännöstä ei tarvita vaan ohjelma voidaan ajaa seuraavasti:

$ python sum.py
Sum of array 4950.0



Julia

Julia on suhteellisen uusi ohjelmointikieli, joka on julkaistu vuonna 2012. Julia on joustava ja dynaaminen kieli, jonka tavoitteena on yhdistää nopea kehitys (kuten Pythonissa) C-/C++- ja Fortran-kieliä vastaavaan suorituskykyyn.

Julia suunniteltiin alusta alkaen numeerista ja suurteholaskentaa varten. Se on myös moniparadigmainen kieli, jossa yhdistyvät imperatiiviset, funktionaaliset ja olioperustaiset ohjelmointiominaisuudet. Pythonin tavoin Julia ei edellytä erillistä käännösvaihetta, vaan tarvittava käännös tehdään suorittamisen aikana.

Julia sisältää toimintoja sekä yhteisen että hajautetun muistin rinnakkaistamista varten, mutta myös laajennuspaketteja rinnakkaisohjelmointiin.

Matriisin summan laskentakoodi on Juliassa seuraava:

array = Array{Float32}(range(0, length=100))

println("Sum of array ", sum(array))

Ohjelma suoritetaan seuraavasti

$ julia sum.jl
Sum of array 4950.0