Ik was laatst bezig met de tuintopia contest. Toen kwam ik een bekend onderwerp tegen, namelijk concurrency. Multithreading is geïmplementeerd door middel van een centrale datastructuur (een max-heap). Daar zijn 8 threads tegelijk mee aan het praten. Met een mutex wordt gegarandeerd dat hele verhaal thread safe is.
Probleem: de hierboven genoemde methode schaalt slecht. Niet noodzakelijk bij 2, 4 of 8 threads, maar bij een gegeven input zal er op een gegeven moment een punt komen waarbij het zinloos is om meer threads toe te voegen (Wikipedia: Amdahl's law). Zie 2 verschillende test cases met afwijkende input voor mijn tuintopia algoritme:


De maximale speedup is gelimiteerd aan de lengte van de kritische sectie. Bij een max-heap is dat best bagger, met een miljoen elementen duurt het inserten relatief lang, laat staan 100 mil. elementen.
Discussie: wat voor truuks kunnen we toepassen om de schaling van een dergelijke datastructuur (max-heap) te verbeteren?
Er bestaan een aantal quick fixes: we kunnen meerdere elementen in één keer plaatsen of verwijderen, maar dat levert geen inherent betere schaling op. Eigenlijk moeten we de max-heap decentraal maken zodat er geen probleem met scaling kan ontstaan, maar hoe je dat voor elkaar krijgt blijft een mysterie. Hoe verbeter je in dit soort situaties dan toch de concurrency?
Probleem: de hierboven genoemde methode schaalt slecht. Niet noodzakelijk bij 2, 4 of 8 threads, maar bij een gegeven input zal er op een gegeven moment een punt komen waarbij het zinloos is om meer threads toe te voegen (Wikipedia: Amdahl's law). Zie 2 verschillende test cases met afwijkende input voor mijn tuintopia algoritme:


De maximale speedup is gelimiteerd aan de lengte van de kritische sectie. Bij een max-heap is dat best bagger, met een miljoen elementen duurt het inserten relatief lang, laat staan 100 mil. elementen.
Discussie: wat voor truuks kunnen we toepassen om de schaling van een dergelijke datastructuur (max-heap) te verbeteren?
Er bestaan een aantal quick fixes: we kunnen meerdere elementen in één keer plaatsen of verwijderen, maar dat levert geen inherent betere schaling op. Eigenlijk moeten we de max-heap decentraal maken zodat er geen probleem met scaling kan ontstaan, maar hoe je dat voor elkaar krijgt blijft een mysterie. Hoe verbeter je in dit soort situaties dan toch de concurrency?