clpeak - peak performance of your opencl device
As an opencl developer, Β we all want to know peak capabilities of our device. I have been working on a small repo on githubΒ github.com/krrishnarraj/clpeakΒ to measure peak performance of opencl device
So what does it do? Measure peak bandwidth for all vector-widths of float. Measure single & double precision compute capacity for all vector-widths. Measure transfer bandwidth from host to device and kernel launch latency. A preview of cayman
Platform:βAMDβAcceleratedβParallelβProcessing
ββDevice:βCayman
ββββDriverβversion:β1348.4β(Linuxβx64)
ββββGlobalβmemoryβbandwidthβ(GBPS)
ββββββfloatβββ:β130.97
ββββββfloat2ββ:β131.36
ββββββfloat4ββ:β90.50
ββββββfloat8ββ:β69.91
ββββββfloat16β:β35.27
ββββSingle-precisionβcomputeβ(GFLOPS)
ββββββfloatβββ:β674.44
ββββββfloat2ββ:β1345.68
ββββββfloat4ββ:β2601.47
ββββββfloat8ββ:β2586.69
ββββββfloat16β:β2573.38
ββββDouble-precisionβcomputeβ(GFLOPS)
ββββββdoubleβββ:β671.24
ββββββdouble2ββ:β671.59
ββββββdouble4ββ:β670.93
ββββββdouble8ββ:β669.51
ββββββdouble16β:β666.50
ββββTransferβbandwidthβ(GBPS)
ββββββenqueueWriteBufferβββββββββ:β3.53
ββββββenqueueReadBufferβββββββββ:β4.43
ββββββenqueueMapBuffer(forβread)β:β152.89
ββββββββmemcpyβfromβmappedβptrβ:β4.40
ββββββenqueueUnmap(afterβwrite)ββ :β1781.26
ββββββββmemcpyβtoβmappedβptrβββ :β4.42
ββββKernelβlaunchβlatencyβ:β44.22βus ββββ
Continue Reading
Β Reached a max global bandwidth of 131 GBPS with float/float2
Β 2600 GFLOPS with float4, hardware peak being 2700. The VLIW4 architecture requires vector-code to utilize peak capacity. With scalar code, you only achieve 1/4th of capacity
Β Double doesn't require vector-code as 671 GFLOPS was achieved against hw peak of 675(1/4th of single fp) using scalar code
Β Transfer bandwidth, it actually depends on the host m/c specs. Map/unmap is doing a zero-copy for a buffer created usingΒ CL_MEM_ALLOC_HOST_PTR flag (or it could a bug in code which makes it appear as zero-copy)
There is something interesting about intel cpus on intel platform
Platform:βIntel(R)βOpenCLβββββββββββββββββββββββββββββββββPlatform:βIntel(R)βOpenCL
ββDevice:βIntel(R)βCore(TM)βi7-3630QMβCPUβ@β2.40GHzβββββDevice:βIntel(R)βCore(TM)βi7-3630QMβCPUβ@β2.40GHz
ββββDriverβversion:β1.2β(Win32)βββββββββββββββββββββββββββββββDriverβversion:β1.2β(Win64)
ββββSingle-precisionβcomputeβ(GFLOPS)βββββββββββββββββββββββββSingle-precisionβcomputeβ(GFLOPS)
ββββββfloatβββ:β25.44βββββββββββββββββββββββββββββββββββββββββββββfloatβββ:β25.41
ββββββfloat2ββ:β50.81βββββββββββββββββββββββββββββββββββββββββββββfloat2ββ:β101.06
ββββββfloat4ββ:β51.61βββββββββββββββββββββββββββββββββββββββββββββfloat4ββ:β171.80
ββββββfloat8ββ:β52.55βββββββββββββββββββββββββββββββββββββββββββββfloat8ββ:β81.04
ββββββfloat16β:β51.92βββββββββββββββββββββββββββββββββββββββββββββfloat16β:β95.44
ββββDouble-precisionβcomputeβ(GFLOPS)βββββββββββββββββββββββββDouble-precisionβcomputeβ(GFLOPS)
ββββββdoubleβββ:β25.45ββββββββββββββββββββββββββββββββββββββββββββdoubleβββ:β25.41
ββββββdouble2ββ:β25.47ββββββββββββββββββββββββββββββββββββββββββββdouble2ββ:β87.65
ββββββdouble4ββ:β25.71ββββββββββββββββββββββββββββββββββββββββββββdouble4ββ:β34.09
ββββββdouble8ββ:β26.23ββββββββββββββββββββββββββββββββββββββββββββdouble8ββ:β30.03
ββββββdouble16β:β27.16ββββββββββββββββββββββββββββββββββββββββββββdouble16β:β86.77
ββββTransferβbandwidthβ(GBPS)βββββββββββββββββββββββββββββββββTransferβbandwidthβ(GBPS)
ββββββenqueueWriteBufferββββββββββ:β2.30βββββββββββββββββββββββββenqueueWriteBufferβββββββββ:β2.26
ββββββenqueueReadBufferβββββββββββ:β6.47ββββββββββββββββββββββββenqueueReadBufferββββββββββ:β7.56
ββββββenqueueMapBuffer(forβread)ββ:β1.#JβββββββββββββββββββββββββenqueueMapBuffer(forβread)β:β1.#J
ββββββββmemcpyβfromβmappedβptrβ:β8.39βββββββββββββββββββββββββββmemcpyβfromβmappedβptrβ:β9.26
ββββββenqueueUnmap(afterβwrite)βββ:β1.#JβββββββββββββββββββββββββenqueueUnmap(afterβwrite)ββ:β1.#J
ββββββββmemcpyβtoβmappedβptrββββ:β8.13βββββββββββββββββββββββββββmemcpyβtoβmappedβptrβββ:β8.95
There is a huge compute performance difference in 32/64 modes. I got suspicious and went to intel forumΒ software.intel.com/en-us/forums/topic/495379Β . Compiler is exposed to more registers in x64. Running the same program in x64 is showing more than 3x performance!!! The hardware compute peak is 153.6 GFLOPS at 2.4GHz. Arik indicated that actual freq can go higher due to turbo mode. So 172 GFLOPS in x64 is possibly because of turbo mode
Coming to next device, Mali gpu in my laptop (yes yes its chromebook) exynos 5250 soc
Platform:βARMβPlatform
ββDevice:βMali-T604
ββββDriverβversion:β1.1β(LinuxβARM)
ββββGlobalβmemoryβbandwidthβ(GBPS)
ββββββfloatβββ:β1.56
ββββββfloat2ββ:β4.41
ββββββfloat4ββ:β5.75
ββββββfloat8ββ:βOutβofβresources!βSkipped
ββββSingle-precisionβcomputeβ(GFLOPS)
ββββββfloatβββ:β2.38
ββββββfloat2ββ:β16.40
ββββββfloat4ββ:β8.07
ββββββfloat8ββ:β21.84
ββββββfloat16β:β16.37
ββββNoβdoubleβprecisionβsupport!βSkipped
ββββTransferβbandwidthβ(GBPS)
ββββββenqueueWriteBufferβββββββββ:β5.84
ββββββenqueueReadBufferββββββββββ:β2.59
ββββββenqueueMapBuffer(forβread)β:β934.99
ββββββββmemcpyβfromβmappedβptrβββ:β2.83
ββββββenqueueUnmap(afterβwrite)ββ:β1813.75
ββββββββmemcpyβtoβmappedβptrβββββ:β2.85
ββββKernelβlaunchβlatencyβ:β149.46βus
Max bandwidth of around 5.75 GBPS
Compute peak of around 22 GFLOPS. Not sure of what is the real hardware peak. Could be 32 something
Around 6 GBPS of host->device bandwidth. This is relatively higher than standard x86 based pcie systems. Map & unmap buffers are zero-copy
kernel latency measures time b/w when the kernel was queued at host and when it started executing on device. 150 us is acceptable for gpu
Lets take a device and profile 3 different opencl runtimes on it.Β Device was IntelΒ i3-550 @ 3.2 GHz on linux x64. This is aΒ nehalem based device having peak compute capacity of
GFLOPS pocl is an opensource implementation of opencl specΒ
Β . Currently aims cpu devices. For this setup, pocl was compiled against llvm 3.2
Platformβββββββββββββββββββββββββββ:ββββAMDβββββββββββ IntelβββββββββββPOCL
Driverβversionβββββββββββββββββββββ:ββββ1214.3ββββββββββ1.2.0.76921βββββ0.9
Globalβmemoryβbandwidthβ(GBPS)
ββfloatβββββββββββββββββββββββββββββ:ββββ7.58ββββββββββββ8.28ββββββββββββ7.73
ββfloat2ββββββββββββββββββββββββββββ:ββββ8.63ββββββββββββ8.15ββββββββββββ8.70
ββfloat4ββββββββββββββββββββββββββββ:ββββ7.67ββββββββββββ7.34ββββββββββββ7.67
ββfloat8ββββββββββββββββββββββββββββ:ββββ7.82ββββββββββββ7.63ββββββββββββ7.81
ββfloat16βββββββββββββββββββββββββββ:ββββ7.51ββββββββββββ7.48ββββββββββββ7.64
Single-precisionβcomputeβ(GFLOPS)
ββfloatβββββββββββββββββββββββββββββ:ββββ3.64ββββββββββββ14.56βββββββββββ3.64
ββfloat2ββββββββββββββββββββββββββββ:ββββ7.26ββββββββββββ29.07βββββββββββ7.30
ββfloat4ββββββββββββββββββββββββββββ:ββββ14.45βββββββββββ46.65βββββββββββ14.58
ββfloat8ββββββββββββββββββββββββββββ:ββββ28.50βββββββββββ28.68βββββββββββ28.51
ββfloat16βββββββββββββββββββββββββββ:ββββ18.31βββββββββββ45.49βββββββββββ49.67
Double-precisionβcomputeβ(GFLOPS)
ββdoubleβββββββββββββββββββββββββββ:ββββ3.19ββββββββββββ12.56βββββββββββ3.19
ββdouble2ββββββββββββββββββββββββββ:ββββ6.37ββββββββββββ22.47βββββββββββ6.39
ββdouble4ββββββββββββββββββββββββββ:ββββ12.65βββββββββββ8.55ββββββββββββ12.70
ββdouble8ββββββββββββββββββββββββββ:ββββ21.19βββββββββββ21.26βββββββββββ19.98
ββdouble16βββββββββββββββββββββββββ:ββββ4.88ββββββββββββ10.25βββββββββββ6.73
Transferβbandwidthβ(GBPS)
ββenqueueWriteBufferβββββββββββββββ:ββββ6.59ββββββββββββ1.40ββββββββββββ6.60
ββenqueueReadBufferβββββββββββββββ:ββββ4.16ββββββββββββ4.13ββββββββββββ4.05
ββenqueueMapBuffer(forβread)ββββββ:ββββ8159.13βββββββββ1355.73βββββββββ28256.36
βββmemcpyβfromβmappedβptrβββββββ:ββββ4.17ββββββββββββ4.13ββββββββββββ4.05
ββenqueueUnmap(afterβwrite)ββββββββ:βββ8801.16βββββββββ1682.98βββββββββ51622.20
βββmemcpyβtoβmappedβptrββββββββββ:ββββ4.31ββββββββββββ4.26ββββββββββββ4.24
Kernelβlaunchβlatencyβ(us)βββββββββββ:ββββ11.36βββββββββββ5.33ββββββββββββ5.12
Bandwidth wise, all 3 platforms have performed almost equally. Although theoretical peak being 21 GBPS, only 1/2 was achieved because only 1 RAM slot was used. You need to place RAM in both slots to realize peak bandwidth
single fp compute, AMD reached only half of hardware peak. Intel decently peaked at float4, while pocl peaked at float16
github.com/krrishnarraj/clpeak/tree/master/results
for results of some more devices. Send in results of your device to [email protected] or send a pull request