Pessimistiskt och optimistiskt om parallellism i java – Jfokus

Pessimistiskt och optimistiskt om parallellism i java – Jfokus
februari 6, 2013 squeedconfig

Numera är det antalet kärnor som ökar istället för klockfrekvenser hos våra processorer. Därför kan vi inte förvänta oss samma prestandaökningar som tidigare genom att skaffa ny processor endast. Prestandaökningar hos våra program begränsas nu ytterst av Amdahls lag och därför är det viktigt att parallellisera vår mjukvara istället. Martijn Verburg pratade om detta (Java and the Machine (samma föreläsning fast från 2012)) på Jfokus idag.

En nackdel som uppstår när man använder volatile, synchronized eller ännu hellre java.util.concurrent för att ordnat dela minne mellan trådar är att man inte kan dra någon större nytta av de extra kärnorna. Det är det som åskådliggörs av wikipedias diagram för Amdahls lag:

Martin hade egentligen endast en uppenbar lösning på detta: sun.misc.Unsafe, även om han i samma stund avråder från det. Biblioteket ”Highly Scalable Java” var dock intressant. Han pratade också om Fork/Join-tillägget till java.util.concurrent, men det hjälper ändå inte om det delade minnet behöver förändras.

sun.misc.Unsafe

Det skall dock vara lätt att göra fel med sun.misc.Unsafe, (redan namnet antyder ju något sådant). Tur då att Cliff Click har tagit fram biblioteket Highly Scalable Java – ”A collection of Concurrent and Highly Scalable Utilities. These are intended as direct replacements for the java.util.* or java.util.concurrent.* collections but with better performance when many CPUs are using the collection concurrently.”

Highly Scalable Java använder sun.misc.Unsafe och lyckas på så sätt skapa en ersättare till ConcurrentHashMap med NonBlockingHashMap. NonBlockingHashMap är ”A lock-free alternate implementation of ConcurrentHashMap with better scaling properties and generally lower costs to mutate the Map. It provides identical correctness properties as ConcurrentHashMap. All operations are non-blocking and multi-thread safe, including all update operations. NonBlockingHashMap scales substatially better than ConcurrentHashMap for high update rates, even with a large concurrency factor. Scaling is linear up to 768 CPUs on a 768-CPU Azul box, even with 100% updates or 100% reads or any fraction in-between. Linear scaling up to all cpus has been observed on a 32-way Sun US2 box, 32-way Sun Niagra box, 8-way Intel box and a 4-way Power box. This class obeys the same functional specification as Hashtable, and includes versions of methods corresponding to each method of Hashtable. However, even though all operations are thread-safe, operations do not entail locking and there is not any support for locking the entire table in a way that prevents all access. This class is fully interoperable with Hashtable in programs that rely on its thread safety but not on its synchronization details.” (från javadoc för NonBlockingHashMap).

Readme: https://github.com/boundary/high-scale-lib

Fork/Join

”Fork and Join does help with Amdahls law”, men utan delat föränderligt minne. Tanken är att dela upp problemet i oberoende uppgifter:  http://www.oracle.com/technetwork/articles/java/fork-join-422606.html

0 Kommentarer

Lämna ett svar

E-postadressen publiceras inte. Obligatoriska fält är märkta *

*

Denna webbplats använder Akismet för att minska skräppost. Lär dig hur din kommentardata bearbetas.