Jag provade att göra två saker samtidigt häromdagen. Samtidigt som jag stängde bakluckan på bilen böjde jag mig ner för att plocka ut middagen jag handlat.

Känner ni igen det från er programmering när ni försöker utnyttja resurserna maximalt? Parallellisering är en ganska typisk ansats för optimering av resursutnyttjande, men det blir ofta problem när man skriver manuell kod för att ordna den.

Någon sa för några år sedan, som en enkel livsregel, att om du tror att du ska skriva ditt program parallellt med flera trådar, tänk igen. Många utvecklare känner nog igen sig i att de har lagt en och annan felsökningstimme på sådana problem.

Problemet gäller naturligtvis inte bara vår egen kod. För ett drygt decennium sedan skulle jag skriva en artikel om cacheminne på servrar och ville köra tester på en maskin med flera processorer.

När jag till slut fick tillgång till lämplig hårdvara och körde testerna visade det sig att några av lösningarna till och med var snabbare om det bara var en processor aktiv, medan en viss plattform regelmässigt kraschade om två processorer var aktiva.

Det är sju år sedan Herb Sutter publicerade artikeln ”The free lunch is over”. Den påtalade med kraft att det är hög tid att vi inte ska förvänta oss att allt sker seriellt då hårdvara sedan länge och snabbt gått mot ökad parallellism.

Vissa problem är extremt parallelliserbara relativt enkelt och ofarligt. Det är fallet om inget tillstånd delas eller ändras. Till exempel att man ska göra en mycket tung beräkning för varje element i en lista. I ett sådant fall, där det inte finns någon egentlig tävlan om delat tillstånd, kan man typiskt få nästan linjär skalbarhet i förhållande till antalet processorkärnor.

Det går att välja och vraka mellan olika lösningar för att till exempel starta lika många trådar som det finns processorkärnor i maskinen ifråga.

Om vi tittar vidare så ser vi att ramverket Node.js blir alltmer populärt, troligen i hög utsträckning tack vare att det är enkelt på många sätt. Skaparna av Node.js har tagit ställning vad gäller resursutnyttjande, de undviker parallella lösningar. Det fungerar i grunden asynkront, ungefär som Windows före NT. Det går i och för sig också att starta underprocesser för att dra nytta av flera processorkärnor, men de delar inte tillstånd.

En annan ansats är den som kallas LMAX som togs fram för ett handelssystem i finansbranschen. Genom noggrann design av lågnivåhanteringen för att låta programmet passa så bra som möjligt ihop med processor, cacheminnen och arbetsminne så går det att bearbeta 6 000 000 order per sekund på ordinär hårdvara och med en enda tråd. Det passar extra bra med en tråd eftersom varje order potentiellt påverkar alla efterföljande.

Det här är ett urval av ansatser, vilken är bäst? Viktigast att påpeka är att det som vanligt ”beror på”. Man måste prestandatesta och inte utgå från att man måste ha full samtidighet. Jag tror jag ska sluta försöka vara multitrådad själv i vissa situationer, jag kan kanske vara tillräckligt effektiv ändå. Lunchen är slut, men middagen är serverad.