Drafting Sheets · a film
Lighting the sheet…
Eight Little Suns
A GPU server drawn from its own TikZ, then run hot
A technical drawing of a GPU server that draws itself and then goes to work. It opens on its last moment, eight cards at full load with a sun over every fan, and winds back to an empty sheet. Then an orange spark reads a TikZ listing and drafts the server from it: a 2U chassis, eight cards with their fans, LEDs, heatsink fins and edge connectors, the PCIe bus with a bridge over every pair, and a trace from each card out through the wall. At three in the morning the night shift hands out a few small jobs. Then every card is given a training job, one after another; each climbs toward 95 °C, and as it passes 88 the pen draws a little sun over its fan. Every frame is rendered in your browser from that listing as it plays, and the score is code that reads the same plan.
- Tempo
- 96 BPM · 29 bars
- Picture
- The drafting engine, WebGL
- Program
- One TikZ listing, 72 lines
- Rack
- Load, power and heat, modelled
- Sound
- Original score, synthesised from the plan
Chapters7
The listing20 statements
The film is this TikZ: the listing of Server Room with its eight suns written in, drawn by the same engine as the other Drafting Sheets. Each sun’s step starts when its card passes 88 °C. Copied with one \tikzsetline for the sheet’s own keys, it compiles in any LaTeX document that loads TikZ.
% title: GPU server, eight cards% prompt: draw a GPU server in TikZ.\begin{tikzpicture} % the chassis, a 2U box, and its dimensions\draw[very thick] (-3.7,-2.1) rectangle (3.7,2.1);\draw[thick] (-3.7,1.82) -- (3.7,1.82);\foreach \x/\y in {-3.56/1.96,3.56/1.96,-3.56/-1.96,3.56/-1.96} \draw (\x,\y) circle (.055);\draw[|<->|] (-3.7,2.5) -- node[above] {7.40} (3.7,2.5);\draw[|<->|] (-4.1,-2.1) -- node[left] {4.20} (-4.1,2.1); % eight cards: a fan, a hub, a status LED, twelve fins, an edge connector\foreach \i in {0,...,7} { \draw[thick] (\i*.84-3.3,-1.35) rectangle ++(.72,3); \draw (\i*.84-2.94,.85) circle (.27); \draw (\i*.84-2.94,.85) circle (.06); \fill[signal] (\i*.84-2.72,1.46) circle (.035); \foreach \y in {.35,.23,...,-1} \draw (\i*.84-3.22,\y) -- ++(.56,0); \foreach \q in {0,...,7} \draw (\i*.84-3.2+\q*.075,-1.35) -- ++(0,-.17);} % the PCIe bus, and NVLink bridges over each pair\draw[thick] (-3.65,-1.72) -- (3.65,-1.72);\foreach \i in {0,...,6} { \draw (\i*.84-2.85,1.65) -- ++(0,.07) -- ++(.67,0) -- ++(0,-.07); \draw (\i*.84-2.92,1.65) -- ++(0,.12) -- ++(.81,0) -- ++(0,-.12);} % one trace a card, routed at 45 degrees out through the wall\foreach \i in {0,...,7} \draw[signal] ({\i*.84-2.94},-1.52) -- ({\i*.84-2.94},{-1.972+.036*\i}) -- ({\i*.84-2.87},{-2.042+.036*\i}) -- ({4.082-.036*\i},{-2.042+.036*\i}) -- ({4.152-.036*\i},{-1.972+.036*\i}) -- ({4.152-.036*\i},{-1.22+.13*\i});\foreach \i in {0,...,7} \draw ({4.152-.036*\i},{-1.22+.13*\i}) circle (.03); % GPU 0 runs hot\foreach \a in {0,30,...,330} \draw[signal,shift={(-2.94,.85)}] (\a:.31) -- (\a:.39); % GPU 1 runs hot\foreach \a in {0,30,...,330} \draw[signal,shift={(-2.1,.85)}] (\a:.31) -- (\a:.39); % GPU 2 runs hot\foreach \a in {0,30,...,330} \draw[signal,shift={(-1.26,.85)}] (\a:.31) -- (\a:.39); % GPU 3 runs hot\foreach \a in {0,30,...,330} \draw[signal,shift={(-0.42,.85)}] (\a:.31) -- (\a:.39); % GPU 4 runs hot\foreach \a in {0,30,...,330} \draw[signal,shift={(0.42,.85)}] (\a:.31) -- (\a:.39); % GPU 5 runs hot\foreach \a in {0,30,...,330} \draw[signal,shift={(1.26,.85)}] (\a:.31) -- (\a:.39); % GPU 6 runs hot\foreach \a in {0,30,...,330} \draw[signal,shift={(2.1,.85)}] (\a:.31) -- (\a:.39); % GPU 7 runs hot\foreach \a in {0,30,...,330} \draw[signal,shift={(2.94,.85)}] (\a:.31) -- (\a:.39); \end{tikzpicture}