From 5d8463699f0745756f35702dca35cc104e9ed041 Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Wed, 14 Jun 2023 17:41:41 +0200 Subject: [PATCH] Initial commit --- minecraft/flake.lock | 61 +++++++++++++++++++++++++++ minecraft/flake.nix | 25 +++++++++++ mpv/flake.nix | 24 +++++++++++ pandoc/flake.lock | 61 +++++++++++++++++++++++++++ pandoc/flake.nix | 33 +++++++++++++++ pandoc/header.yaml | 14 +++++++ pandoc/input.md | 90 ++++++++++++++++++++++++++++++++++++++++ pandoc/output.pdf | Bin 0 -> 51116 bytes spotify/flake.lock | 61 +++++++++++++++++++++++++++ spotify/flake.nix | 35 ++++++++++++++++ spotify/spotify-adblock | 1 + 11 files changed, 405 insertions(+) create mode 100644 minecraft/flake.lock create mode 100644 minecraft/flake.nix create mode 100644 mpv/flake.nix create mode 100644 pandoc/flake.lock create mode 100644 pandoc/flake.nix create mode 100644 pandoc/header.yaml create mode 100644 pandoc/input.md create mode 100644 pandoc/output.pdf create mode 100644 spotify/flake.lock create mode 100644 spotify/flake.nix create mode 160000 spotify/spotify-adblock diff --git a/minecraft/flake.lock b/minecraft/flake.lock new file mode 100644 index 0000000..3e9a197 --- /dev/null +++ b/minecraft/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1681202837, + "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "cfacdce06f30d2b68473a46042957675eebb3401", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1683777345, + "narHash": "sha256-V2p/A4RpEGqEZussOnHYMU6XglxBJGCODdzoyvcwig8=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "635a306fc8ede2e34cb3dd0d6d0a5d49362150ed", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/minecraft/flake.nix b/minecraft/flake.nix new file mode 100644 index 0000000..e39a04a --- /dev/null +++ b/minecraft/flake.nix @@ -0,0 +1,25 @@ +{ + description = "Minecraft flake"; + + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + + outputs = { self, nixpkgs, flake-utils}: + flake-utils.lib.eachDefaultSystem + (system: + let + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + }; + in { + devShells.default = pkgs.mkShell { + packages = with pkgs; [ + minecraft + libredirect # Can be removed? + glibc + ]; + }; + } + ); +} diff --git a/mpv/flake.nix b/mpv/flake.nix new file mode 100644 index 0000000..4855bff --- /dev/null +++ b/mpv/flake.nix @@ -0,0 +1,24 @@ +{ + description = "MPV flake"; + + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + + outputs = { self, nixpkgs, flake-utils}: + flake-utils.lib.eachDefaultSystem + (system: + let + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + }; + in { + devShells.default = pkgs.mkShell { + packages = with pkgs; [ + mpv + yt-dlp + ]; + }; + } + ); +} diff --git a/pandoc/flake.lock b/pandoc/flake.lock new file mode 100644 index 0000000..8233509 --- /dev/null +++ b/pandoc/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1681202837, + "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "cfacdce06f30d2b68473a46042957675eebb3401", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1684612454, + "narHash": "sha256-15vluZKXxC76FqAryST1QrUVE7Xlwkrs7lrPTQGYIz0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "8bf3e834daedadc6d0f4172616b2bdede1109c48", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/pandoc/flake.nix b/pandoc/flake.nix new file mode 100644 index 0000000..4592434 --- /dev/null +++ b/pandoc/flake.nix @@ -0,0 +1,33 @@ +{ + description = "Pandoc flake"; + + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + + outputs = { self, nixpkgs, flake-utils}: + flake-utils.lib.eachDefaultSystem + (system: + let + pkgs = import nixpkgs { + inherit system; + }; + in { + devShells.default = pkgs.mkShell { + packages = with pkgs; [ + pandoc + texlive.combined.scheme-full + ]; + shellHook = '' + pandoc \ + -s \ + -o output.pdf \ + -f markdown+smart+header_attributes+yaml_metadata_block+auto_identifiers+implicit_figures \ + --pdf-engine lualatex \ + --dpi=300 \ + header.yaml \ + input.md + ''; + }; + } + ); +} diff --git a/pandoc/header.yaml b/pandoc/header.yaml new file mode 100644 index 0000000..5581885 --- /dev/null +++ b/pandoc/header.yaml @@ -0,0 +1,14 @@ +--- +title: "Practicum 8: De geheugenhiƫrarchie" +author: "Tibo De Peuter, Mathis De Witte" +date: "21 Mei 2023" +# geometry: "left=2.54cm,right=2.54cm,top=1.91cm,bottom=1.91cm" +geometry: "left=2.54cm,right=2.54cm,top=2.54cm,bottom=2.54cm" +titlepage: true +titlepage-rule-height: 4 +toc: false +listings-disable-line-numbers: true +listings-no-page-break: false +subparagraph: true +lang: nl-BE +--- diff --git a/pandoc/input.md b/pandoc/input.md new file mode 100644 index 0000000..578c139 --- /dev/null +++ b/pandoc/input.md @@ -0,0 +1,90 @@ +## Cachegedrag van een dubbele lus + +### 2. Houd de cachegrootte constant op 128 bytes, en bedenk voor deze grootte een formule die de theoretische missrate (#missers / #toegangen) in functie van de blokgrootte voor een direct mapped cache kan bepalen. Je mag ervan uitgaan dat (i) de matrices geen conflictmissers veroorzaken binnen eenzelfde iteratie en (ii) het aantal toegangen een veelvoud is van de blokgrootte van de cache. Leg deze formule uit. + +$$ +\text{missrate} = \frac{4}{\text{blokgrootte}} \frac{\text{missers}}{\text{toegangen}} +$$ + +Als de blokgrootte groter wordt, dan duurt het langer voordat het programma tot buiten de grenzen van een blok terecht komt, dus duurt het langer voordat er een mis voorkomt. 4 bytes. + +### 3. Verifieer je formule door middel van de cachesimulator. Klopt je formule bij elke blokgrootte? Zoniet, leg uit. Denk hier in termen van koude missers, capaciteitsmissers, en conflictmissers. + +We willen zien dat de missrate halveert wanneer we de blokgrootte verdubbelen. + +``` +Blokgrootte: 32 bytes => Verwachte missrate = 1/8 <-> Effectieve missrate = 0.1250 => OK! +Blokgrootte: 64 bytes => Verwachte missrate = 1/16 <-> Effectieve missrate = 0.0625 => OK! +Blokgrootte: 128 bytes => Verwachte missrate = 1/32 <-> Effectieve missrate = 1.0000 => NIET OK! +``` + +Als er maar 1 blok is, dan treden er **conflictmissers** op doordat het programma afwisselend de eerste matrix en de tweede matrix opvraagt. Het programma zal eerste de eerste matrix in de cache steken, daarna de cache overschrijven met de tweede matrix, daarna weer overschrijven met de eerste matrix, ... + +### 4. Voor een vaste cachegrootte, wat is het effect van een toenemende associativiteit op de missrate in dit geval (dus als we van een direct mapped cache zouden overgaan naar een n-wegs associatieve cache)? Verklaar opnieuw in termen van de verschillende types van misser. + +Als we overschakelen op een n-wegs associatieve cache en de cachegrootte gelijk laten, dan daalt de missrate, doordat er minder conflictmissers zijn (door de natuur van n-wegs). + +Koude missers (de matrices staan nog altijd op dezelfde plaatsen in het geheugen en moeten nog altijd eens ingeladen worden) en capaciteitsmissers (de blokgroottes blijven gelijk) blijven gelijk. + +### 5. In sommige talen (Fortran) worden matrices niet rijgewijs, maar kolomsgewijs in het geheugen opgeslaan. Als we een dergelijke matrix overlopen met het bovenstaande programma, hoe zou de toegangsgrafiek er dan uit zien? Je kunt hiervoor opnieuw gebruik maken van de cachesimulator met dezelfde parameters als voorheen, maar ditmaal met toegangspatroon ColumnMajor. Wat is de missrate nu? Verklaar deze missrate. + +In plaats van 1 enkele rechte lijn, zien we op de grafiek meerdere stijlere lijnen die zich herhalen. De cacheblokken kunnen nu maar nuttig gebruikt worden voor 1 geheugentoegang, in vergelijking met 8 in het geval van rijgewijs. + +We verwachten $\text{missrate} = 1$ en kunnen dit ook bevestigen aan de hand van de simulator. + +Uitleg: + +Wanneer je een element uit een matrix haalt, dan wordt heel de rij van dat element in de cache geplaatst. Als je kolomgewijs elementen uit de matrix haalt, zal je telkens wanneer je een nieuw element uit de kolom haalt, een nieuwe rij in de cache moeten plaatsen. + +Specifieker; Bij de eerste iteratie wordt de hele eerste rij ingeladen. Bij de tweede iteratie wordt de tweede rij ingeladen enzovoort. Als het programma dan overgaat naar het verwerken van de tweede kolom, dan herhaalt zich dit opnieuw en moet de cache steeds opnieuw gevuld worden. + +### 6. Hoe verschilt de lokaliteit tussen de toegangspatronen RowMajor en ColumnMajor? + +De spatiale lokaliteit van RowMajor is best goed: De geheugenlocaties van een rij staan vlak naast elkaar, en het programma overloopt de matrix rij per rij. + +ColumnMajor heeft een bijzonder slechte spatiale lokaliteit: Het programma overloopt de matrix kolom per kolom, maar de matrix is rij per rij opeslagen, dus de geheugenlocaties liggen steeds op een rij-afstand van elkaar verwijderd. + +De temporele lokaliteit is voor beide toegangspatronen gelijk: Het programma berekent meteen wat het moet berekenen, en hoe dat gebeurt is niet afhankelijk van het toegangspatroon. + +## Matrixvermenigvuldiging C = AB + +### 1.a) Maak in deze vraag gebruik van een 4-wegs set-associatieve cache, met een blokgrootte van 32 bytes en een totale cachegrootte van 256 bytes. Hoeveel sets heeft deze cache? Leg je berekening uit. + +Formule: $\frac{\text{aantal blokken}}{n}$ + +We weten: $\text{aantal blokken} = \frac{ \text{totale cachegrootte} } { \text{ blokgrootte } }$ + +$$ +\begin{aligned} +& \frac{\text{aantal blokken}}{n} +\\ = & \frac{\text{totale cachegrootte}}{n * \text{blokgrootte}} +\\ = & \frac{265}{4 * 32} +\\ = & 2 +\end{aligned} +$$ + +### 1.b) Beredeneer de afzonderlijke missrates (#missers / #toegangen) voor de matrices A, B en C (met gegeven adressen). Bereken de totale missrate die hier uit volgt, en verifieer deze vervolgens, gebruik makend van de simulator. Om het toegangspatroon van Figuur 8.2 te verkrijgen (met de matrices op de gegeven adressen), maken jullie deze keer niet gebruik van jullie groepsnummer als argument. + +Omdat we matrix A rijgewijs overlopen zal de lokaliteit voor A goed zijn. We beredeneren + +$$ +\begin{aligned} +\text{missrate} = & \frac{4}{\text{blokgrootte}} \frac{\text{missers}}{\text{reads}} +\\ = & \frac{4}{32} \frac{\text{missers}}{\text{reads}} +\\ = & \frac{1}{8} \frac{\text{missers}}{\text{reads}} +\end{aligned} +$$ + +Omdat we matrix B kolomsgewijs overlopen hebben we hier een slechte lokaiteit. We beredeneren $\text{missrate} = 1$ volgens dezelfde [redenering als in vraag 5 in 8.2 (over Fortran)](#5-in-sommige-talen-fortran-worden-matrices-niet-rijgewijs-maar-kolomsgewijs-in-het-geheugen-opgeslaan-als-we-een-dergelijke-matrix-overlopen-met-het-bovenstaande-programma-hoe-zou-de-toegangsgrafiek-er-dan-uit-zien-je-kunt-hiervoor-opnieuw-gebruik-maken-van-de-cachesimulator-met-dezelfde-parameters-als-voorheen-maar-ditmaal-met-toegangspatroon-columnmajor-wat-is-de-missrate-nu-verklaar-deze-missrate). + +### 2. Welke matrix heeft de beste temporele lokaliteit? Hoe kun je dit afleiden uit het toegevoegde stukje code? + +We zien in de code dat matrix C de enigste matrix is die enkel anders uitgelezen wordt in de buitenste twee loops van de code. Voor de binnenste loop zal dus steeds hetzelfde element gelezen en geschreven worden. C heeft de beste temporele lokaliteit, want zowel A en B worden anders uitgelezen afhankelijk van de binnenste loop. + +### 4. Bespreek hoe klassieke en getegelde vermenigvuldiging verschillen van elkaar qua lokaliteit. + +De spatiale lokaliteit van matrices A en C zijn bij getegelde vermenigvuldiging iets minder goed dan bij klassieke vermenigvuldiging. Dat 'verlies' valt sterk mee in vergelijking met de opvallend betere spatiale lokaliteit van matrix B bij getegelde vermenigvuldiging. + +### 5. Indien er geen caches aanwezig zouden zijn, welke van de twee methodes van vermenigvuldiging zou het snelste uitvoeren? Hierbij moet je er van uitgaan dat het geheugen een uniforme, constante toegangstijd heeft voor alle geheugentoegangen. Verklaar je antwoord. Je kan er hierbij van uitgaan dat er voor beiden evenveel instructies uitgevoerd zullen worden. + +De implementatie van getegelde vermenigvuldiging gebruikt dubbel zo veel lussen om de berekening uit te voeren. We weten dat het programma steeds vanuit geheugen zal moeten lezen, want er zijn geen caches. Als we er dan vanuit gaan dat de toegangstijd constant is, dan verliest de getegelde vermenigvuldiging enkel nog tijd door de extra procestijd die nodig is voor het dubbele aantal lussen in de code. De getegelde vermenigvuldiging zal dus trager zijn dan de klassieke vermenigvuldiging. diff --git a/pandoc/output.pdf b/pandoc/output.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e9d0cea7a70da3a4fdb7297340e84ee3e0a3ee67 GIT binary patch literal 51116 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 LghW_Y1nU0)^Bv9& literal 0 HcmV?d00001 diff --git a/spotify/flake.lock b/spotify/flake.lock new file mode 100644 index 0000000..3e9a197 --- /dev/null +++ b/spotify/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1681202837, + "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "cfacdce06f30d2b68473a46042957675eebb3401", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1683777345, + "narHash": "sha256-V2p/A4RpEGqEZussOnHYMU6XglxBJGCODdzoyvcwig8=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "635a306fc8ede2e34cb3dd0d6d0a5d49362150ed", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/spotify/flake.nix b/spotify/flake.nix new file mode 100644 index 0000000..d99ad23 --- /dev/null +++ b/spotify/flake.nix @@ -0,0 +1,35 @@ +{ + description = "Spotify flake"; + + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + + outputs = { self, nixpkgs, flake-utils}: + flake-utils.lib.eachDefaultSystem + (system: + let + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + }; + spotify-adblock = pkgs.stdenv.mkDerivation { + name = "spotify-adblock"; + src = pkgs.fetchFromGitHub { + owner = "abba23"; + repo = "spotify-adblock"; + rev = "HEAD"; + sha256 = "sha256-5tZ+Y7dhzb6wmyQ+5FIJDHH0KqkXbiB259Yo7ATGjSU="; + }; + }; + in { + devShells.default = pkgs.mkShell { + buildInputs = with pkgs; [ + git + gnumake + rustc + cargo + ]; + }; + } + ); +} diff --git a/spotify/spotify-adblock b/spotify/spotify-adblock new file mode 160000 index 0000000..22847a7 --- /dev/null +++ b/spotify/spotify-adblock @@ -0,0 +1 @@ +Subproject commit 22847a7bfa87edf4ca58ee950fd8977d20f0d337