# IPA projekt 2024 ## Cíl projektu Cílem projektu je optimalizovat algoritmus pro výpočet vln na vodě. Tento algoritmus je implementován v souboru `Ocean.cpp`, konkrétně ve funkci `updateVertices` a jejích volaných funkcích. Vaším úkolem bude vytvořit optimalizovanou verzi této funkce pomocí **SSE, AVX** nebo **AVX2**. Kód můžete implementovat pomocí **intrinsic funkcí** (změňte v `Ocean.h` makro `ASM_TYPE` na `INTRINSIC`) nebo čistě v **GCC inline assembly** v souboru `xlogin00.s` (změňte `ASM_TYPE` na `CLEAR_ASM`). ## Struktura dat V konstruktoru třídy `Ocean` se definují jednotlivé složky finální vlny, které se ukládají do **C++ vektoru**. Jednotlivé vlny se pak skládají do jednoho celku, přičemž s rostoucím počtem složek se zvyšuje i výpočetní náročnost. Váš projekt by měl podporovat **1 až N složek**. Každá jednotlivá vlna (složka) je definována pomocí následující struktury: ```cpp struct GerstnerWave { float amplitude; // Amplituda vlny (výška) float wavelength; // Vlnová délka (vzdálenost mezi hřebeny) float speed; // Rychlost vlny glm::vec2 direction; // Směr vlny (normalizovaný 2D vektor v XZ rovině) float phase; // Fázový posun }; ``` ## Dokumentace V dokumentaci **podrobně popište** postup optimalizace. Pro lepší přehlednost můžete využít: - Blokové diagramy - Popisy klíčových částí kódu - Vysvětlení způsobu zpracování dat Na závěr **uveďte dosažené zrychlení**. Pokud projekt provádíte v **několika iteracích**, uveďte výkon pro jednotlivé verze. ## Ovládání loďky Ačkoliv to není z hlediska projektů tohoto zadání potřeba, loďku na vlnách můžete ovládat pomocí ASWD a kameru na povrch vody pomocí pravého tlačíka myši. ## Odevzdání Odevzdávat budete následující soubory: - `Ocean.cpp` - `Ocean.h` - `xlogin00.s` - `dokumentace.pdf` ## Překlad a spuštění ### Windows + VS Code Projekt spusťte ve **VS Code** z **2. cvičení**, které obsahuje všechny potřebné knihovny. ### Linux Překlad můžete provádět pomocí **Makefile** nebo využít VS Code soubory pro spuštění. Na Linuxu je nutné mít nainstalované následující knihovny: Pro **Debian-based OS** (Ubuntu, Debian): ```sh sudo apt update sudo apt install freeglut3-dev libglew-dev libsoil-dev libgl-dev libglu-dev ```