Instrukciju līmeņa paralelizācija

Līdz šim mēs runājām par paralelizāciju, izmantojot vairākus CPU jeb procesorus. Tas nozīmē, ka mēs sadalījām uzdevumu vairākos apakšuzdevumos un tos devām risināt vairākiem procesoriem. Mūsdienās procesori jau kļuvuši sarežģītāki un tajos nav vairs tikai viens skaitļošanas kodols, bet gan 2, 4 vai pat 8 kodoli un katrs no tiem var veikt uzdevumu. Mūsdienu CPU, no kuriem būvē HPC klasterus, jau ir pat 64 un vēl vairāk kodolu. Kodolu skaits jaunajos procesoros pakāpeniski palielinās. Tas nozīmē, ka šādiem CPU ar daudziem kodoliem var īstenot skaitļošanas paralelizāciju un to dara ar speciālām instrukcijām, kas paredzētas šādiem procesoriem.CPU kodoli veic virkni instrukciju, kad izpilda datorprogrammu. Piemēram, ielādē datus no galvenās atmiņas reģistra un no reģistra saglabā datus galvenajā atmiņā. Vai arī instrukcija uzdod veikt datu saskaitīšanu vai reizināšanu, vai kādu citu darbību.Instrukciju veikšanas ātrumu nosaka takts frekvence. Piemēram, ja CPU darbināts ar takts frekvenci 2 GHz, tad tas nozīmē, ka notiks 2 miljardi darbību vienā sekundē. Instrukciju līmeņa paralelizācija (angl. instruction-level parallelism) nozīmē to, ka CPU ar saviem skaitļošanas kodoliem vienā taktī paralēli veiks daudzas darbības.Piemēram, ja procesorā ir 2 kodoli un ir jāveic 2 neatkarīgas saskaitīšanas operācijas, tad tās var veikt paralēli vienā taktī. Programmētājam gan nav iespēja pašam tieši veikt šādu paralelizēšanu, bet tomēr ar programmas kodu var to tomēr noorganizēt.

Vektorizācija

Vektorizācija nozīmē spēju skaitļošanas elementam veikt darbības vienlaicīgi ar vairākiem skaitļiem. Iedomājieties, ka ir astoņu skaitļu kopa. Inženiermatemātikas valodā tas ir vektors, kas sastāv no astoņiem skaitļiem. Katrs no šiem astoņiem skaitļiem, kas var būt atšķirīgs viens no otra, pats par sevi tiek saukts par skalāru elementu. Skalāram var būt jebkāda vērtība, ko var lietot matemātiskajās operācijās ar citu skalāru elementu (vai arī vektoru, ja vēlaties). Tas īsumā ir viss, kas ir jāzin par Skalāriem un Vektoriem un ar vektoriem saistītām Operācijām.Pieņemsim, ka mums šis vektors būtu jāsasummē, vai jāsareizina, vai arī kā citādi jāoperē ar citu tikpat garu vektoru. Attēlā ir parādīta šāda Operācija. Piemēram, zaļais vektors tiek saskaitīts (vai reizināts, vai tiek veikta vēl kāda cita darbība) ar zilo vektoru. Rezultātā iegūst sarkano vektoru. Kreisājā pusē attēla redzams vektors ar izmēru 1. Labajā pusē ir piemērs ar vektoru, kura izmērs ir 8.

GPU jeb grafiskais procesors

Attīstību nosaka pieprasījums un tā attīstījās arī skaitļošanas elementi. Sākumā no vakuuma lampām pārgāja uz tranzistoriem un mikroshēmām, lai paaugstinātu datoru veiktspēju. Tad sāka mainīties datoru pielietojumi un arvien vairāk sāka parādīties jaunas datoru pielietojumu jomas. Grafiskie procesori sāka attīstīties tad, kad veidojās datorspēļu tirgus.Datorspēļu tirgus tagad ir ļoti plašs un tur ir vajadzīgi specializēti procesori - GPU, kas ļauj nodrošināt augstas kvalitātes 3D grafiku. GPU sāka attīstīties pagājušā gadsimta deviņdesmitajos gados. Sony firma 1994. gadā ieviesa terminu GPU jeb Graphical Processing Unit (grafiskais skaitļošanas mezgls) un gadsimta beigās tos sāka izmantot arī personālajos datoros. Šajā gadsimtā GPU sāka izmantot arī superskaitļošanā un radās pat termins GPGPU, kas nozīmē vispārēja lietojuma GPU (angl. General Purpose GPU). Zemāk attēlā ir salīdzināta CPU un GPU uzbūve.CPU ir ar sarežģītāku uzbūvi, bet ar elastīgāku pielietojumu. Tas ir ātrdarbīgs, var vadīt datora operētājsistēmu un risināt daudzveidīgus uzdevumus, tam ir labāka vadības loģika, kešatmiņas un tas ir veidots plašas jomas uzdevumu risināšanai. GPU savukārt ir specializēti veidots 3D attēlu apstrādei. Tajā ir vairāk skaitļošanas kodolu un pašiem jaunākajiem to skaits pat ir tūkstošos. GPU pašu kodolu veiktspēja ir daudz vājāka nekā CPU, bet to lielais skaits ļauj paralēlajā skaitļošanā pārspēt CPU. GPU ir arī lielāks piekļuves ātrums atmiņai un tiem ir labāka energoefektivitāte nekā CPU.Diemžēl vienkāršotie GPU kodoli neļauj risināt daudzveidīgus zinātnes uzdevumus, tāpēc tie ir jāapvieno ar CPU un ar programmatūru jāatrod efektīvākie risinājumi. Redzam, ka specializēto īpašību dēļ, GPU ir jāapvieno ar CPU.GPU nevar vadīt operētājsistēmu, tāpēc darbu sāk CPU. Kad skaitļošana ir uzsākta, tad ātrdarbībai pieslēdz GPU, un reizēm tos sauc par paātrinātājiem. Arī atmiņas CPU un GPU ir katram sava, tāpēc dati no CPU atmiņas ir jāpārkopē uz GPU atmiņu. Kad CPU veic datu apstrādi pēc GPU paveiktā, tad atkal dati ir jāpārkopē atpakaļ. Programmētājam tas ir jāņem vērā, jo datu pārkopēšana ir lēnāka, nekā pati skaitļošana.Neskatoties uz izaicinājumiem un ierobežojumiem, daudzos gadījumos tomēr izmanto GPU skaitļošanas procesu paātrināšanai. Piemēram, diezgan tipiski superdatoros lieto vienā skaitļošanas mezglā četrus vai sešus GPU un vienu vai divus CPU. Ja salīdzinām pielietojumus, kuros izmantoti arī GPU vai tikai CPU, tad ar GPU iegūstam paātrinājumu 4-6 reizes, dažkārt pat 10 reižu.GPU ir ļoti noderīgi tādos mašīnmācīšanās pielietojumos, kā neironu tīklu apmācība. Tas ir tāpēc, ka aritmētiskās skaitļošanas operācijas neironu tīklu apmācībā vairumā gadījumu ir paralēlas un tāpēc ļoti piemērotas GPU. Tāpēc šādos uzdevumos GPU ir pat līdz 30 reižu ātrāks nekā CPU.