De gemiddelde GPU bevat tegenwoordig meer PK's dan de CPU. Naar aanleiding hiervan komen er steeds meer mogelijkheden om computationele problemen te verplaatsen van de CPU naar de GPU. Deze presentatie zal een inleiding zijn hoe je dit in Java kunt doen met behulp van Jogamp JoCL. Aan de hand van enkele simpele problemen wordt aangetoond wanneer een GPU beter ingezet kan worden dan een CPU en vice versa. Dit is ook een van de speerpunten in Java 9 (Project Sumatra) wat o.a. JoCL als inspiratie gebruikt.
10. Voorbeeld (MacBook Pro)
Platform name: Apple
Platform profile: FULL_PROFILE
Platform spec version: OpenCL 1.2
Platform vendor: Apple
Device 16925696 HD Graphics 4000
Driver:1.2(Aug 17 2014 20:29:07)
Max work group size:512
Global mem size: 1073741824
Local mem size: 65536
Max clock freq: 1200
Max compute units: 16
Device 16918272 GeForce GT 650M
Driver:8.26.28 310.40.55b01
Max work group size:1024
Global mem size: 1073741824
Local mem size: 49152
Max clock freq: 900
Max compute units: 2
Device 4294967295 Intel(R) Core(TM) i7-3720QM CPU @
2.60GHz
Driver:1.1
Max work group size:1024
Global mem size: 17179869184
Local mem size: 32768
Max clock freq: 2600
Max compute units: 8
24. Tips & tricks
● Unit testen
– Aparte test kernels
– Test cases in batches
kernel void testDifficultCalculation(const int testCount,
global const double* distance, global double* results) {
const int testId = get_global_id(0);
if (testId < testCount) {
results[testId] = difficultCalculation(distance[testId]);
}
}
25. Direct memory management
● -XX:MaxDirectMemorySize=??M
● ByteBuffer.allocateDirect(int capacity)
– Max 2GB per buffer
● Garbage collection te laat
– Getriggered door heap collection
– Handmatig vrijgeven
– ((sun.nio.ch.DirectBuffer)
myBuffer).cleaner().clean();
● VisualVM plugin voor direct buffers
26. GPU vs CPU
● GPU's checken minder dan CPU's
– Div by zero
– Out of bounds checks
– Test eerst op CPU
27. Portabiliteit
● OpenCL is portable, de performance
niet
– Memory sizes verschillen
– Memory latencies verschillen
– Work group sizes verschillen
– Compute devices verschillen
– OpenCL implementatie verschillen
● Develop dus voor de productie
hardware
28. Ten slotte
● Float vs Double
– Dubbele precisie
– Halve performance
– Double support optioneel
30. Conclusie
● Wanneer te gebruiken?
– Als performance echt nodig is
– Als probleem hoge concurrency heeft
– Als probleem partitioneerbaar is
31. Vragen?
Setting up OpenCL test on Intel(R) Core(TM) i7-3720QM CPU @ 2.60GHz
Warming up OpenCL test
[thread 32003 also had an error][thread 33027 also had an error]
##
A fatal error has been detected by the Java Runtime Environment:
##
SIGSEGV[thread 32515 also had an error]
(0xb)[thread 32771 also had an error]
[thread 32259 also had an error]
at pc=0x00000001250ded70, pid=99851, tid=29475
##
JRE version: Java(TM) SE Runtime Environment (8.0_20-b26) (build 1.8.0_20-b26)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.20-b23 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# [thread 17415 also had an error]
C [cl_kernels+0x1d70] sort_wrapper+0x1b0
##
Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
##
An error report file with more information is saved as:
# /Users/arjanl/Documents/opencl/workspace/opencl-test/jogamp/hs_err_pid99851.log
[thread 31763 also had an error]
##
If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
#
Notas do Editor
Wij zijn Arjan & Maarten
Arjan: software architect, schaalbaarheid en performance interesse
Maarten: senior developer, performance en concurrency, 3d interesse
PAS: programmatische aanpak stikstof
Balanceren van milieu en economische ontwikkelingen.
Rekeninstrument: monitoren doelstellingen en ondersteuning aanvraag vergunningen
Berekend concentraties/deposities
Exporteer voor vergunning aanvraag
Vergelijk meerdere situaties
OpenCL toepassing: wegverkeer
Snelheid van belang ivm wachten
Importeer set bronnen
Bereken per bron – rekenpunt
Tel resultaten op per rekenpunt
Emissie van de weg
Afstand tot de weg
Windsnelheid
Windrichting
Ozon concentratie
Locatie
Creatief met tekst files
OpenCL file inladen + pre-processen
Java constanten toevoegen dmv #define
Locale 1.0 vs 1,0
Configureerbare opties
Tijd voor testen!
Test kernels toevoegen, alleen in test mode.
Junit test functie:
Buffers met test waarden
Buffers met verwachtte resultaten
Test → &apos;Uitdagingen&apos; met direct memory
Niet genoeg geheugen → Direct memory size
Max 2 GB per buffer
Eerste run goed, tweede run faalt? → Garbage Collection getriggered op heap space.
Buffer release → geheugen handmatig vrijgeven
Sun classes → JVM specifiek
Handige tool: plugin voor VisualVM
Division by zero → geen probleem, resultaten waardeloos
Lezen/schrijven buiten gealloceerd geheugen?
CPU → Crash
GPU → Geen probleem
(Waarden veranderen per test run)
Test eerst op CPU! (Maar nog geen garantie)
Nog meer device verschillen...
“OpenCL is portable, de performance niet”
OpenCL ook niet altijd portable
“Write once, debug anywhere” ?
Develop voor productie hardware/drivers
Performance of precisie?
Is double echt nodig?
Double support optioneel, maar high end meestal wel.
Alleen als de performance nodig is EN
Het probleem hoge concurrency vertoont
Partioneerbaar meestal handig