V zadnjih štirih desetletjih so se nosilci procesiranja v digitalnih sistemih razvijali tako v smislu hitrosti delovanja, kot tudi v smislu miniaturizacije osnovnih procesnih entitet. Ob nadaljujočem se tovrstnem trendu bomo v bližnji prihodnosti dosegli nivo miniaturizacije, kjer bo vprašljivo zanesljivo obvladovanje dinamike osnovnih entitet zaradi drugačnih fizikalnih (kvantnih) zakonov, ki veljajo na tem nivoju. Ostali problemi, ki postajajo vse bolj pereči, so prevelika poraba električne energije na pridelano enote »koristne« informacije, slabe možnosti reciklaže računalniških sistemov, relativno velika cena procesnih naprav, itd. Vsi našteti problemi zavirajo prehod iz ere »namiznega« računalništva (angl. desktop computing), ki smo mu bili priča zadnjih 30 let, v ero »vseprisotnega« računalništva (angl. ubiquitous computing). Človek se že od izuma orodja obnaša analitično (angl. top-down approach). Slednje pomeni, da z orodji obdeluje materiale, s čimer troši energijo, zaloge materialov in ustvarja stranske – nekoristne produkte. Mnogi svetovni misleci opozarjajo, da je tak pristop preživet in da moramo preiti v sintezen odnos do razvoja dobrin (angl. bottom up approach), ki predvideva, da bomo produkte bodočnosti gradili iz primarnih entitet na osnovi avtomatiziranih postopkov. Vse navedeno daje področju računalništva neslutene možnosti razvoja na nova področja, kot so področja farmacije, medicine, gradbeništva, proizvodnje dobrin, itd. Iz slednjih razlogov se že danes iščejo alternativne procesne platforme, ki bi predhodno navedene probleme zaobšle in ponudile značilnosti sinteznega pristopa. V okviru predmeta bomo tako pregledali aktualne alternativne platforme procesiranja kot so kvantni celularni automati (angl. quantum dot cellular automata), DNK nosilci procesiranja, nanocevi (angl. nanotubes), optični nosilci procesiranja, itd. in pa tudi alternativne metode procesiranja, ki jih tovrstne platforme omogočajo. Med metodami si bomo ogledali kvantno procesiranje, reverzibilno procesiranje, večstanjsko procesiranje, amorfno procesiranje, itd.

Cilj predmeta je pridobiti znanja za razvoj inovativnih računalniških storitev in aplikacij, ki se izvajajo v oblaku (Cloud). Računalništvo v oblaku pomembno spreminja načine razvoja aplikacij in pri predmetu se bomo spoznali s koncepti, arhitekturami in tehnologijami za oblak – s tako imenovano cloud-native arhitekturo.
Poleg tega, da bomo osvojili poglobljeno znanje in poznavanje področja računalništva v oblaku in vseh nivojev storitvene usmerjenosti (XaaS; Iaas, PaaS in SaaS), bomo podrobno spoznali arhitekturni model, vzorce in najboljše prakse za razvoj cloud-native aplikacij, kar vključuje množico konceptov.
Začeli bomo z arhitekturo mikrostoritev in podrobno spoznali razvojne vzorce za mikrostoritve. To bomo združili z vsebniki (conatinerji) Docker (in ostalimi) ter mikro-kerneli. Spoznali se bomo z orodji za orkestracijo vsebnikov, predvsem Kubernetes (in ostalimi).
Nadaljevali bomo s spoznavanjem konceptov cloud-native arhitekture: storitvami, asinhronimi vzorci klicanja storitev, prekinjevalci toka, reaktivnim modelom razvoja mikrostoritev, pretočnimi dogodki (event streaming aka Apache Kafka), konfiguracijo, odkrivanjem storitev (service discovery), preverjanjem vitalnosti (health check), metrikami, varnostjo, odpornostjo na napake in drugimi.
Cilj bo razumeti in razviti oblačne aplikacije, ki se izvajajo na odporni in elastični (resilient and elastic) oblačni infrastrukturi in platformi in razumeti, kako te aplikacije delujejo in kako jih nameščamo na različne ponudnike oblačnih storitev (Amazon AWS, Google AppEngine, Microsoft Azure, Cloud Foundry in druge). V okviru predmeta se bomo spoznali z najpopularnejšimi PaaS platformami. Spoznali bomo koncepte zasebnih, javnih in hibridnih oblakov. Prav tako bomo vzpostavili lasten zasebni/hibridni računalniški oblak.
Obenem se bomo spoznali s praksami DevOps, ki so nujne za razvoj oblačnih rešitev ter spoznali koncepte in projekte CNCF (Cloud Native Computing Foundation), kot so Kubernetes, Prometheus, OpenTracing, Fluentd, Istio, Linkerd, gRPC in druge.
Predmet je praktično orientiran. V okviru vaj bodo študenti v skupinah razvijali inovativne oblačne rešitve z uporabo ogrodij, kot so Spring Boot, KumuluzEE, Node.js, Docker, Kubernetes, Prometheus ter oblake AWS, AppEngine, Azure in druge. Razumeli bodo pomen inovacij v oblaku.
Najboljši študenti bodo imeli možnost sodelovati na inovativnih projektih.

The aim of the course is to gain knowledge of the development of innovative cloud computing and cloud applications. Cloud computing is changing the way applications are developed. We will become familiar with concepts, architectures and cloud technologies - the cloud-native architecture.
In addition to gaining in-depth knowledge of cloud computing and all levels of service orientation (XaaS; Iaas, PaaS and SaaS), we will learn in detail the architectural model, patterns and best practices for the development of cloud-native applications, which includes a multitude of concepts.
We will begin with the microservice architecture and learn about the development patterns for microservice. We will combine this with Docker (and others) containers and micro-kernels. We will get familiar with container orchestration tools, especially Kubernetes (and others).
We will continue to explore the concepts of cloud-native architecture: services, asynchronous patterns of calling services, circuit breakers, reactive microservice development models, event streaming aka Apache Kafka, configuration, service discovery, health check, metrics, security, fault tolerance, and others.
The goal will be to understand and develop cloud applications that run on resilient and elastic cloud infrastructure and platforms and understand how these applications work and how to deploy them on different cloud services providers (Amazon AWS, Google AppEngine, Microsoft Azure, Cloud Foundry and others). As part of the course, we will get to know the most popular PaaS platforms. We will get familiar with the concepts of private, public and hybrid clouds. We will also set up our own private / hybrid computer cloud.
At the same time, we will become familiar with the DevOps practices that are essential for the development of cloud solutions and learn about the concepts and projects of the CNCF (Cloud Native Computing Foundation) such as Kubernetes, Prometheus, OpenTracing, Fluentd, Istio, Linkerd, gRPC and others. The course is practically oriented. Within the exercises, students in teams will develop innovative cloud solutions using framework such as Spring Boot, KumuluzEE, Node.js, Docker, Kubernetes, Prometheus and AWS, AppEngine, Azure clouds, and others. They will understand the importance of innovation in the cloud.
The best students will be able to participate in innovative projects.

Programiranje visoko zmogljivih računalniških sistemov je pomembno orodje na različnih področjih znanosti in inženirstva. Vendar pa je učinkovita uporaba zmogljivih računalniških sistemov v veliki meri odvisna od razumevanja njihove arhitekture. Pri tem predmetu bomo tako obravnavali arhitekture sodobnih visoko zmogljivih računalniških sistemov. Preučevali bomo različne vrste vzporednosti računanja (procesorjev, povezovalnih omrežij in pospeševalnikov) in obravnavali arhitekturne vidike razvoja vzporednih (paralelnih) računalnikov in skušali razumeti sodobne trende vzporednih arhitektur. Predmet je komplementaren s predmetom Visoko zmogljivo računanje - obravnava isto tematiko, vendar s stališča računalniške arhitekture. Spoznali bomo tudi visokonivojsko sintezo (High-level synthesis, HLS) za implementacijo v vezjih FPGA. Taka orodja iz visokonivojskega opisa funkcije v jeziku C samodejno sintetizirajo vezje. Poznavanje HDL jezikov za opis hardvera je zaželeno, ni pa nujno. Samodejna sinteza omogoča enostavnejšo implementacijo vezij, obenem pa omogoča načrtovalcu različne možnosti optimizacije, npr. cevovod, razvoj zank, preoblikovanje matrik, različni vmesniki, ipd.

  1. Vzporedno in porazdeljeno računanje: potreba po paralelizaciji
  2. Moderne paralelne arhitekture: sistemi z deljenim pomnilnikom, sistemi s porazdeljenim pomnilnikom, grafične kartice in drugi oprocesorji, vezja FPGA, heterogeni sistemi
  3. Vzporedni programski jeziki in okolja: OpenMP, OpenMPI, OpenCL
  4. Paralelni algoritmi, analiza in programiranje: podatkovni in funkcijski paralelizem, cevovod, raztegljivost, načini programiranja, vzorci, strategije, koncepti in primeri uporabe, analiza pohitritev, raztegljivost
  5. Implementacija tipičnih algoritmov s področja znanosti na omenjenih arhitekturah, izbira prave arhitekture za algoritem
  6. Zmogljivost paralelnih sistemov: uravnavanje obremenitve, razporejanje opravil, stroški komunikacije, vpliv predpomnilnika, prostorska in časovna lokalnost, energijska učinkovitost
  7. Uporaba nacionalne infrastrukture za visoko zmogljivo računanje: dostop, računski viri, shranjevanje podatkov, priprava okolij, izvajanje daljših simulacij
  8. Napredne teme: eksa račuananje, programiranje FPGA, pomen predstavitve podatkov na hitrost računanja