turbo charge cpu utilization in fork/join using the ... devoxx in...– multiply in java biginteger...
TRANSCRIPT
![Page 1: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/1.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
Turbo Charge CPU Utilization in Fork/Join
Using the ManagedBlocker
Dr Heinz M. Kabutz Last Updated 2017-05-09
1
![Page 2: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/2.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
Regular
2
![Page 3: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/3.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
ManagedBlocker
3
![Page 4: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/4.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
l By Leonardo of Pisa – F0 = 0 – F1 = 1 – Fn = Fn-1 + Fn-2
l Thus the next number is equal to the sum of the two previous numbers
– e.g. 0, 1, 1, 2, 3, 5, 8, 13, 21, …
l The numbers get large quickly, like Australian rabbit population
Speeding Up Fibonacci
4
8
1321
2 3
5
![Page 5: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/5.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
l Taking our recursive definition – F0 = 0, F1 = 1 – Fn = Fn-1 + Fn-2
l Converting this into Java:
l But this has exponential time complexity, so gets terribly slow
Naive Implementation
5
public long f(int n) { if (n <= 1) return n; return f(n-1) + f(n-2); }
8
1321
2 3
5
![Page 6: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/6.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
l Iterative algorithm
l Linear time complexity – f(1_000_000_000) in 1.7 seconds
• However, long overflows so the result is incorrect • We can use BigInteger, but its add() is also linear, so time is quadratic
2nd Attempt at Coding Fibonacci
6
public static long f(int n) { long n0 = 0, n1 = 1; for (int i = 0; i < n; i++) { long temp = n1; n1 = n1 + n0; n0 = temp; } return n0; } 8
1321
2 3
5
![Page 7: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/7.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
l Dijkstra’s clever formula – F2n-1 = Fn-12 + Fn2
– F2n = (2 × Fn-1 + Fn) × Fn
l Logarithmic time complexity – Multiply in Java BigInteger
• Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465) • Prior to Java 8, multiply() had complexity O(n2) • BigInteger.multiply() single-threaded in Java - we’ll fix that later
3rd Attempt Dijkstra's Sum of Squares
7
8
1321
2 3
5
![Page 8: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/8.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
l We implement this algorithm using BigInteger – F2n-1 = Fn-12 + Fn2
– F2n = (2 × Fn-1 + Fn) × Fn
Demo 1: Dijkstra’s Sum of Squares
8
![Page 9: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/9.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
l We can parallelize by using common Fork/Join Pool – Next we fork() the 1st task, do the 2nd and then join 1st
Demo 2: Parallelize Our Algorithm
9
RecursiveTask<BigInteger> f0_task = new RecursiveTask<BigInteger>() { protected BigInteger compute() { return f(half - 1); }}; f0_task.fork();BigInteger f1 = f(half);BigInteger f0 = f0_task.join();
![Page 10: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/10.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
l Let’s hack fork/join into: – multiplyToomCook3() – squareToomCook3()
l These probably won’t reach the threshold – multiplyKaratsuba() – squareKaratsuba()
l Choose modified BigInteger with – -Xbootclasspath/p:<path_to_hack>
Demo 3: Parallelize BigInteger
10
![Page 11: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/11.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
Java Specialists Newsletter Say “hi” or subscribe
http://tinyurl.com/devoxxuk17
11
![Page 12: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/12.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
l Dijkstra's Sum of Squares needs to work out some values several times. Cache results to avoid this.
– Careful to avoid a memory leak • No static maps
Demo 4: Cache Results
12
![Page 13: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/13.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
l Instead of calculating same value twice: – Use putIfAbsent() to insert special placeholder – If result is null, we are first and start work – If result is the placeholder, we wait
Demo 5: Reserved Caching Scheme
13
![Page 14: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/14.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
l ForkJoinPool is configured with desired parallelism – Number of active threads – ForkJoinPool mostly used with CPU intensive tasks
l If one of the FJ Threads has to block, a new thread can be started to take its place
– This is done with the ManagedBlocker
l We use ManagedBlocker to keep parallelism high
Demo 6: ManagedBlocker
14
![Page 15: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/15.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
l Implement Fibonacci using – CompletableFuture with methods
• thenAcceptBothAsync() • complete()
– What happens with thread creation when you disable the common ForkJoinPool? • -Djava.util.concurrent.ForkJoinPool.common.parallelism=0
l Send me your answers here – http://tinyurl.com/devoxxuk17
Homework:
15
![Page 16: Turbo Charge CPU Utilization in Fork/Join Using the ... Devoxx in...– Multiply in Java BigInteger • Karatsuba complexity is O(n1.585) • 3-way Toom Cook complexity is O(n1.465)](https://reader034.vdocuments.net/reader034/viewer/2022043010/5fa015c053ffa555bf1e5649/html5/thumbnails/16.jpg)
Turbo Charge CPU Utilization in Fork/Join Using the ManagedBlocker©
2017 Heinz K
abutz, All R
ights Reserved
Java Specialists Newsletter Say “hi” or subscribe
http://tinyurl.com/devoxxuk17
16