From 465c1c02873f4261cb61de77dbbc62fcb791c342 Mon Sep 17 00:00:00 2001
From: foreman
Date: Thu, 13 Apr 2017 13:56:38 -0400
Subject: [PATCH] P4 to Git Change 1398097 by lmoriche@lmoriche_opencl_dev2 on
2017/04/13 13:01:56
SWDEV-102733 - [OCL-LC-ROCm] Cmake build Write CMakeLists.txt to enable building with and without the DK environment
- Change the coding convention of the runtime files. Use Google's Style (https://google.github.io/styleguide/cppguide.html).
Affected files ...
... //depot/stg/opencl/drivers/opencl/.clang-format#1 add
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_agent_amd.h#2 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_command.cpp#13 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_context.cpp#53 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_counter.cpp#2 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_d3d10.cpp#15 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_d3d11.cpp#22 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_d3d9.cpp#32 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_debugger_amd.cpp#8 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_debugger_amd.h#7 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_device.cpp#61 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_event.cpp#10 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_execute.cpp#23 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_gl.cpp#53 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_icd.cpp#27 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_icd_amd.h#18 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_kernel.h#24 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_kernel_info_amd.cpp#3 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_kernel_info_amd.h#4 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_lqdflash_amd.cpp#17 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_lqdflash_amd.h#6 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_memobj.cpp#81 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_object.cpp#3 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_pipe.cpp#6 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_platform_amd.cpp#2 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_platform_amd.h#2 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_profile_amd.cpp#3 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_profile_amd.h#2 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_program.cpp#41 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_sampler.cpp#6 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_sdi_amd.cpp#3 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_sdi_amd.h#2 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_semaphore_amd.h#3 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_svm.cpp#20 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_thread_trace_amd.cpp#8 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_thread_trace_amd.h#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/appprofile.cpp#17 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/appprofile.hpp#12 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/blit.cpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/blit.hpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/blitcl.cpp#11 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpubinary.cpp#11 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpubinary.hpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpubuiltins.cpp#13 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpubuiltins.hpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpucommand.cpp#66 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpucommand.hpp#40 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpudevice.cpp#280 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpudevice.hpp#96 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpufeat.hpp#3 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpukernel.hpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpumapping.cpp#6 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpumapping.hpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpuprogram.cpp#70 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpuprogram.hpp#14 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpusettings.cpp#33 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpusettings.hpp#2 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cputables.hpp#5 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpuvirtual.cpp#26 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpuvirtual.hpp#13 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/device.cpp#209 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/device.hpp#284 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuappprofile.cpp#12 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuappprofile.hpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpubinary.cpp#58 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpubinary.hpp#27 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpublit.cpp#126 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpublit.hpp#41 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpucompiler.cpp#156 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuconstbuf.cpp#10 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuconstbuf.hpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpucounters.cpp#12 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpucounters.hpp#9 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudebugger.hpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudebugmanager.cpp#10 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudebugmanager.hpp#6 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudefs.hpp#147 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudevice.cpp#567 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudevice.hpp#163 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpukernel.cpp#318 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpukernel.hpp#126 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpumemory.cpp#131 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpumemory.hpp#50 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuprintf.cpp#44 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuprintf.hpp#15 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuprogram.cpp#232 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuprogram.hpp#69 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuresource.cpp#238 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuresource.hpp#87 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpusched.hpp#19 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuschedcl.cpp#35 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuscsi.cpp#37 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpusettings.cpp#350 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpusettings.hpp#98 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gputhreadtrace.cpp#9 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gputhreadtrace.hpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gputimestamp.cpp#27 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gputimestamp.hpp#16 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gputrap.hpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuvirtual.cpp#410 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuvirtual.hpp#140 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuwavelimiter.cpp#13 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuwavelimiter.hpp#9 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/hwdebug.cpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/hwdebug.hpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palappprofile.cpp#2 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palappprofile.hpp#3 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palbinary.cpp#2 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palbinary.hpp#3 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palblit.cpp#13 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palblit.hpp#5 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palcompiler.cpp#15 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palconstbuf.cpp#2 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palconstbuf.hpp#3 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palcounters.cpp#11 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palcounters.hpp#9 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldebugger.hpp#3 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldebugmanager.cpp#2 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldebugmanager.hpp#3 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldefs.hpp#16 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.cpp#45 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.hpp#16 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldeviced3d10.cpp#2 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldeviced3d11.cpp#2 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldeviced3d9.cpp#2 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevicegl.cpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palkernel.cpp#34 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palkernel.hpp#11 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palmemory.cpp#13 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palmemory.hpp#3 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palprintf.cpp#5 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palprintf.hpp#3 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palprogram.cpp#39 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palprogram.hpp#17 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palresource.cpp#28 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palresource.hpp#12 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palsched.hpp#3 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palschedcl.cpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palsettings.cpp#24 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palsettings.hpp#10 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palthreadtrace.cpp#3 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palthreadtrace.hpp#5 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paltimestamp.cpp#2 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paltimestamp.hpp#3 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paltrap.hpp#2 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palvirtual.cpp#48 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palvirtual.hpp#21 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palwavelimiter.cpp#3 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palwavelimiter.hpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/mesa_glinterop.h#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocappprofile.cpp#6 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocappprofile.hpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocbinary.hpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocblit.cpp#17 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocblit.hpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/roccompiler.cpp#32 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/roccompilerlib.cpp#6 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/roccompilerlib.hpp#5 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocdefs.hpp#10 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocdevice.cpp#48 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocdevice.hpp#20 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocglinterop.cpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocglinterop.hpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rockernel.cpp#22 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rockernel.hpp#16 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocmemory.cpp#15 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocmemory.hpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprintf.cpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprintf.hpp#5 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprogram.cpp#64 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprogram.hpp#23 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocregisters.hpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocsettings.cpp#17 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocsettings.hpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocvirtual.cpp#34 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocvirtual.hpp#10 edit
... //depot/stg/opencl/drivers/opencl/runtime/os/alloc.cpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/os/alloc.hpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/os/os.cpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/os/os.hpp#30 edit
... //depot/stg/opencl/drivers/opencl/runtime/os/os_posix.cpp#42 edit
... //depot/stg/opencl/drivers/opencl/runtime/os/os_win32.cpp#47 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/agent.cpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/agent.hpp#6 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/command.cpp#78 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/command.hpp#83 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/commandqueue.cpp#23 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/commandqueue.hpp#18 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/context.cpp#42 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/context.hpp#26 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/counter.hpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/interop.hpp#12 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/kernel.cpp#23 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/kernel.hpp#18 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/memory.cpp#127 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/memory.hpp#100 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/ndrange.cpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/ndrange.hpp#9 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/object.cpp#2 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/object.hpp#17 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/perfctr.hpp#5 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/program.cpp#86 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/program.hpp#41 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/runtime.cpp#35 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/runtime.hpp#4 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/sampler.hpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/threadtrace.hpp#6 edit
... //depot/stg/opencl/drivers/opencl/runtime/thread/atomic.hpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/thread/monitor.cpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/thread/monitor.hpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/thread/semaphore.cpp#10 edit
... //depot/stg/opencl/drivers/opencl/runtime/thread/semaphore.hpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/thread/thread.cpp#14 edit
... //depot/stg/opencl/drivers/opencl/runtime/thread/thread.hpp#15 edit
... //depot/stg/opencl/drivers/opencl/runtime/top.hpp#26 edit
... //depot/stg/opencl/drivers/opencl/runtime/utils/concurrent.hpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/utils/debug.cpp#5 edit
... //depot/stg/opencl/drivers/opencl/runtime/utils/debug.hpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/utils/flags.cpp#16 edit
... //depot/stg/opencl/drivers/opencl/runtime/utils/flags.hpp#271 edit
... //depot/stg/opencl/drivers/opencl/runtime/utils/macros.hpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/utils/util.hpp#12 edit
... //depot/stg/opencl/drivers/opencl/runtime/utils/versions.hpp#2150 edit
---
rocclr/.clang-format | 10 +
rocclr/runtime/device/appprofile.cpp | 364 +-
rocclr/runtime/device/appprofile.hpp | 53 +-
rocclr/runtime/device/blit.cpp | 1239 ++--
rocclr/runtime/device/blit.hpp | 581 +-
rocclr/runtime/device/blitcl.cpp | 201 +-
rocclr/runtime/device/cpu/cpubinary.cpp | 259 +-
rocclr/runtime/device/cpu/cpubinary.hpp | 90 +-
rocclr/runtime/device/cpu/cpubuiltins.cpp | 67 +-
rocclr/runtime/device/cpu/cpubuiltins.hpp | 7 +-
rocclr/runtime/device/cpu/cpucommand.cpp | 1075 ++-
rocclr/runtime/device/cpu/cpucommand.hpp | 522 +-
rocclr/runtime/device/cpu/cpudevice.cpp | 1773 +++--
rocclr/runtime/device/cpu/cpudevice.hpp | 284 +-
rocclr/runtime/device/cpu/cpufeat.hpp | 2 +-
rocclr/runtime/device/cpu/cpukernel.hpp | 126 +-
rocclr/runtime/device/cpu/cpumapping.cpp | 729 +-
rocclr/runtime/device/cpu/cpumapping.hpp | 55 +-
rocclr/runtime/device/cpu/cpuprogram.cpp | 2197 +++---
rocclr/runtime/device/cpu/cpuprogram.hpp | 138 +-
rocclr/runtime/device/cpu/cpusettings.cpp | 143 +-
rocclr/runtime/device/cpu/cpusettings.hpp | 43 +-
rocclr/runtime/device/cpu/cputables.hpp | 3013 +++-----
rocclr/runtime/device/cpu/cpuvirtual.cpp | 844 +--
rocclr/runtime/device/cpu/cpuvirtual.hpp | 88 +-
rocclr/runtime/device/device.cpp | 3012 ++++----
rocclr/runtime/device/device.hpp | 2826 ++++---
rocclr/runtime/device/gpu/gpuappprofile.cpp | 15 +-
rocclr/runtime/device/gpu/gpuappprofile.hpp | 21 +-
rocclr/runtime/device/gpu/gpubinary.cpp | 937 ++-
rocclr/runtime/device/gpu/gpubinary.hpp | 187 +-
rocclr/runtime/device/gpu/gpublit.cpp | 4791 ++++++------
rocclr/runtime/device/gpu/gpublit.hpp | 692 +-
rocclr/runtime/device/gpu/gpucompiler.cpp | 753 +-
rocclr/runtime/device/gpu/gpuconstbuf.cpp | 133 +-
rocclr/runtime/device/gpu/gpuconstbuf.hpp | 77 +-
rocclr/runtime/device/gpu/gpucounters.cpp | 97 +-
rocclr/runtime/device/gpu/gpucounters.hpp | 181 +-
rocclr/runtime/device/gpu/gpudebugger.hpp | 106 +-
rocclr/runtime/device/gpu/gpudebugmanager.cpp | 561 +-
rocclr/runtime/device/gpu/gpudebugmanager.hpp | 119 +-
rocclr/runtime/device/gpu/gpudefs.hpp | 635 +-
rocclr/runtime/device/gpu/gpudevice.cpp | 3929 +++++-----
rocclr/runtime/device/gpu/gpudevice.hpp | 938 ++-
rocclr/runtime/device/gpu/gpukernel.cpp | 6604 ++++++++---------
rocclr/runtime/device/gpu/gpukernel.hpp | 1479 ++--
rocclr/runtime/device/gpu/gpumemory.cpp | 2159 +++---
rocclr/runtime/device/gpu/gpumemory.hpp | 408 +-
rocclr/runtime/device/gpu/gpuprintf.cpp | 1200 ++-
rocclr/runtime/device/gpu/gpuprintf.hpp | 239 +-
rocclr/runtime/device/gpu/gpuprogram.cpp | 4509 ++++++-----
rocclr/runtime/device/gpu/gpuprogram.hpp | 885 ++-
rocclr/runtime/device/gpu/gpuresource.cpp | 3246 ++++----
rocclr/runtime/device/gpu/gpuresource.hpp | 766 +-
rocclr/runtime/device/gpu/gpusched.hpp | 101 +-
rocclr/runtime/device/gpu/gpuschedcl.cpp | 2 +-
rocclr/runtime/device/gpu/gpuscsi.cpp | 315 +-
rocclr/runtime/device/gpu/gpusettings.cpp | 686 +-
rocclr/runtime/device/gpu/gpusettings.hpp | 191 +-
rocclr/runtime/device/gpu/gputhreadtrace.cpp | 76 +-
rocclr/runtime/device/gpu/gputhreadtrace.hpp | 181 +-
rocclr/runtime/device/gpu/gputimestamp.cpp | 159 +-
rocclr/runtime/device/gpu/gputimestamp.hpp | 160 +-
rocclr/runtime/device/gpu/gputrap.hpp | 84 +-
rocclr/runtime/device/gpu/gpuvirtual.cpp | 6564 ++++++++--------
rocclr/runtime/device/gpu/gpuvirtual.hpp | 966 ++-
rocclr/runtime/device/gpu/gpuwavelimiter.cpp | 477 +-
rocclr/runtime/device/gpu/gpuwavelimiter.hpp | 212 +-
rocclr/runtime/device/hwdebug.cpp | 179 +-
rocclr/runtime/device/hwdebug.hpp | 288 +-
rocclr/runtime/device/pal/palappprofile.cpp | 15 +-
rocclr/runtime/device/pal/palappprofile.hpp | 21 +-
rocclr/runtime/device/pal/palbinary.cpp | 5 +-
rocclr/runtime/device/pal/palbinary.hpp | 48 +-
rocclr/runtime/device/pal/palblit.cpp | 4760 ++++++------
rocclr/runtime/device/pal/palblit.hpp | 704 +-
rocclr/runtime/device/pal/palcompiler.cpp | 638 +-
rocclr/runtime/device/pal/palconstbuf.cpp | 133 +-
rocclr/runtime/device/pal/palconstbuf.hpp | 78 +-
rocclr/runtime/device/pal/palcounters.cpp | 1059 ++-
rocclr/runtime/device/pal/palcounters.hpp | 188 +-
rocclr/runtime/device/pal/paldebugger.hpp | 107 +-
rocclr/runtime/device/pal/paldebugmanager.cpp | 587 +-
rocclr/runtime/device/pal/paldebugmanager.hpp | 112 +-
rocclr/runtime/device/pal/paldefs.hpp | 917 ++-
rocclr/runtime/device/pal/paldevice.cpp | 3685 +++++----
rocclr/runtime/device/pal/paldevice.hpp | 918 ++-
rocclr/runtime/device/pal/paldeviced3d10.cpp | 187 +-
rocclr/runtime/device/pal/paldeviced3d11.cpp | 187 +-
rocclr/runtime/device/pal/paldeviced3d9.cpp | 55 +-
rocclr/runtime/device/pal/paldevicegl.cpp | 446 +-
rocclr/runtime/device/pal/palkernel.cpp | 2807 ++++---
rocclr/runtime/device/pal/palkernel.hpp | 448 +-
rocclr/runtime/device/pal/palmemory.cpp | 2153 +++---
rocclr/runtime/device/pal/palmemory.hpp | 370 +-
rocclr/runtime/device/pal/palprintf.cpp | 1190 ++-
rocclr/runtime/device/pal/palprintf.hpp | 235 +-
rocclr/runtime/device/pal/palprogram.cpp | 2908 ++++----
rocclr/runtime/device/pal/palprogram.hpp | 452 +-
rocclr/runtime/device/pal/palresource.cpp | 3753 +++++-----
rocclr/runtime/device/pal/palresource.hpp | 775 +-
rocclr/runtime/device/pal/palsched.hpp | 101 +-
rocclr/runtime/device/pal/palschedcl.cpp | 18 +-
rocclr/runtime/device/pal/palsettings.cpp | 696 +-
rocclr/runtime/device/pal/palsettings.hpp | 187 +-
rocclr/runtime/device/pal/palthreadtrace.cpp | 265 +-
rocclr/runtime/device/pal/palthreadtrace.hpp | 145 +-
rocclr/runtime/device/pal/paltimestamp.cpp | 180 +-
rocclr/runtime/device/pal/paltimestamp.hpp | 160 +-
rocclr/runtime/device/pal/paltrap.hpp | 84 +-
rocclr/runtime/device/pal/palvirtual.cpp | 6358 ++++++++--------
rocclr/runtime/device/pal/palvirtual.hpp | 1128 ++-
rocclr/runtime/device/pal/palwavelimiter.cpp | 538 +-
rocclr/runtime/device/pal/palwavelimiter.hpp | 212 +-
rocclr/runtime/device/rocm/mesa_glinterop.h | 224 +-
rocclr/runtime/device/rocm/rocappprofile.cpp | 33 +-
rocclr/runtime/device/rocm/rocappprofile.hpp | 15 +-
rocclr/runtime/device/rocm/rocbinary.hpp | 51 +-
rocclr/runtime/device/rocm/rocblit.cpp | 4268 +++++------
rocclr/runtime/device/rocm/rocblit.hpp | 733 +-
rocclr/runtime/device/rocm/roccompiler.cpp | 625 +-
rocclr/runtime/device/rocm/roccompilerlib.cpp | 78 +-
rocclr/runtime/device/rocm/roccompilerlib.hpp | 89 +-
rocclr/runtime/device/rocm/rocdefs.hpp | 57 +-
rocclr/runtime/device/rocm/rocdevice.cpp | 2488 +++----
rocclr/runtime/device/rocm/rocdevice.hpp | 591 +-
rocclr/runtime/device/rocm/rocglinterop.cpp | 96 +-
rocclr/runtime/device/rocm/rocglinterop.hpp | 228 +-
rocclr/runtime/device/rocm/rockernel.cpp | 1692 ++---
rocclr/runtime/device/rocm/rockernel.hpp | 296 +-
rocclr/runtime/device/rocm/rocmemory.cpp | 1752 ++---
rocclr/runtime/device/rocm/rocmemory.hpp | 245 +-
rocclr/runtime/device/rocm/rocprintf.cpp | 72 +-
rocclr/runtime/device/rocm/rocprintf.hpp | 19 +-
rocclr/runtime/device/rocm/rocprogram.cpp | 2524 +++----
rocclr/runtime/device/rocm/rocprogram.hpp | 225 +-
rocclr/runtime/device/rocm/rocregisters.hpp | 285 +-
rocclr/runtime/device/rocm/rocsettings.cpp | 254 +-
rocclr/runtime/device/rocm/rocsettings.hpp | 88 +-
rocclr/runtime/device/rocm/rocvirtual.cpp | 3005 ++++----
rocclr/runtime/device/rocm/rocvirtual.hpp | 436 +-
rocclr/runtime/os/alloc.cpp | 110 +-
rocclr/runtime/os/alloc.hpp | 20 +-
rocclr/runtime/os/os.cpp | 230 +-
rocclr/runtime/os/os.hpp | 716 +-
rocclr/runtime/os/os_posix.cpp | 1199 ++-
rocclr/runtime/os/os_win32.cpp | 1175 ++-
rocclr/runtime/platform/agent.cpp | 769 +-
rocclr/runtime/platform/agent.hpp | 212 +-
rocclr/runtime/platform/command.cpp | 1044 ++-
rocclr/runtime/platform/command.hpp | 2034 +++--
rocclr/runtime/platform/commandqueue.cpp | 286 +-
rocclr/runtime/platform/commandqueue.hpp | 336 +-
rocclr/runtime/platform/context.cpp | 602 +-
rocclr/runtime/platform/context.hpp | 296 +-
rocclr/runtime/platform/counter.hpp | 11 +-
rocclr/runtime/platform/interop.hpp | 44 +-
rocclr/runtime/platform/kernel.cpp | 374 +-
rocclr/runtime/platform/kernel.hpp | 320 +-
rocclr/runtime/platform/memory.cpp | 2378 +++---
rocclr/runtime/platform/memory.hpp | 984 ++-
rocclr/runtime/platform/ndrange.cpp | 82 +-
rocclr/runtime/platform/ndrange.hpp | 255 +-
rocclr/runtime/platform/object.cpp | 109 +-
rocclr/runtime/platform/object.hpp | 298 +-
rocclr/runtime/platform/perfctr.hpp | 56 +-
rocclr/runtime/platform/program.cpp | 1227 ++-
rocclr/runtime/platform/program.hpp | 234 +-
rocclr/runtime/platform/runtime.cpp | 186 +-
rocclr/runtime/platform/runtime.hpp | 31 +-
rocclr/runtime/platform/sampler.hpp | 286 +-
rocclr/runtime/platform/threadtrace.hpp | 191 +-
rocclr/runtime/thread/atomic.hpp | 611 +-
rocclr/runtime/thread/monitor.cpp | 501 +-
rocclr/runtime/thread/monitor.hpp | 344 +-
rocclr/runtime/thread/semaphore.cpp | 138 +-
rocclr/runtime/thread/semaphore.hpp | 42 +-
rocclr/runtime/thread/thread.cpp | 218 +-
rocclr/runtime/thread/thread.hpp | 258 +-
rocclr/runtime/top.hpp | 163 +-
rocclr/runtime/utils/concurrent.hpp | 260 +-
rocclr/runtime/utils/debug.cpp | 90 +-
rocclr/runtime/utils/debug.hpp | 154 +-
rocclr/runtime/utils/flags.cpp | 228 +-
rocclr/runtime/utils/flags.hpp | 63 +-
rocclr/runtime/utils/macros.hpp | 192 +-
rocclr/runtime/utils/util.hpp | 263 +-
rocclr/runtime/utils/versions.hpp | 30 +-
188 files changed, 68133 insertions(+), 78048 deletions(-)
create mode 100644 rocclr/.clang-format
diff --git a/rocclr/.clang-format b/rocclr/.clang-format
new file mode 100644
index 0000000000..5572a72cdd
--- /dev/null
+++ b/rocclr/.clang-format
@@ -0,0 +1,10 @@
+Language: Cpp
+BasedOnStyle: Google
+AlignEscapedNewlinesLeft: false
+AlignOperands: false
+ColumnLimit: 100
+AlwaysBreakTemplateDeclarations: false
+DerivePointerAlignment: false
+IndentFunctionDeclarationAfterType: false
+MaxEmptyLinesToKeep: 2
+SortIncludes: false
diff --git a/rocclr/runtime/device/appprofile.cpp b/rocclr/runtime/device/appprofile.cpp
index b9181478ca..5fd61619fe 100644
--- a/rocclr/runtime/device/appprofile.cpp
+++ b/rocclr/runtime/device/appprofile.cpp
@@ -11,239 +11,219 @@
#include
#ifdef BRAHMA
-extern int SearchProfileOfAnApplication(const wchar_t* fileName, ADLApplicationProfile ** lppProfile);
-#endif //BRAHMA
+extern int SearchProfileOfAnApplication(const wchar_t* fileName,
+ ADLApplicationProfile** lppProfile);
+#endif // BRAHMA
-static void* __stdcall adlMallocCallback(int n)
-{
- return malloc(n);
-}
+static void* __stdcall adlMallocCallback(int n) { return malloc(n); }
-#define GETPROCADDRESS(_adltype_, _adlfunc_) (_adltype_)amd::Os::getSymbol(adlHandle_, #_adlfunc_);
+#define GETPROCADDRESS(_adltype_, _adlfunc_) (_adltype_) amd::Os::getSymbol(adlHandle_, #_adlfunc_);
namespace amd {
#ifndef BRAHMA
class ADL {
-public:
- ADL();
- ~ADL();
+ public:
+ ADL();
+ ~ADL();
- bool init();
+ bool init();
- void* adlHandle() const { return adlHandle_; };
- ADL_CONTEXT_HANDLE adlContext() const { return adlContext_; }
+ void* adlHandle() const { return adlHandle_; };
+ ADL_CONTEXT_HANDLE adlContext() const { return adlContext_; }
- typedef int (*Adl2MainControlCreate)(ADL_MAIN_MALLOC_CALLBACK callback,
- int iEnumConnectedAdapters,
- ADL_CONTEXT_HANDLE* context);
- typedef int (*Adl2MainControlDestroy)(ADL_CONTEXT_HANDLE context);
- typedef int (*Adl2ConsoleModeFileDescriptorSet)(ADL_CONTEXT_HANDLE context, int fileDescriptor);
- typedef int (*Adl2MainControlRefresh)(ADL_CONTEXT_HANDLE context);
- typedef int (*Adl2ApplicationProfilesSystemReload)(ADL_CONTEXT_HANDLE context);
- typedef int (*Adl2ApplicationProfilesProfileOfApplicationx2Search)(ADL_CONTEXT_HANDLE context,
- const wchar_t* fileName,
- const wchar_t* path,
- const wchar_t* version,
- const wchar_t* appProfileArea,
- ADLApplicationProfile** lppProfile);
+ typedef int (*Adl2MainControlCreate)(ADL_MAIN_MALLOC_CALLBACK callback,
+ int iEnumConnectedAdapters, ADL_CONTEXT_HANDLE* context);
+ typedef int (*Adl2MainControlDestroy)(ADL_CONTEXT_HANDLE context);
+ typedef int (*Adl2ConsoleModeFileDescriptorSet)(ADL_CONTEXT_HANDLE context, int fileDescriptor);
+ typedef int (*Adl2MainControlRefresh)(ADL_CONTEXT_HANDLE context);
+ typedef int (*Adl2ApplicationProfilesSystemReload)(ADL_CONTEXT_HANDLE context);
+ typedef int (*Adl2ApplicationProfilesProfileOfApplicationx2Search)(
+ ADL_CONTEXT_HANDLE context, const wchar_t* fileName, const wchar_t* path,
+ const wchar_t* version, const wchar_t* appProfileArea, ADLApplicationProfile** lppProfile);
- Adl2MainControlCreate adl2MainControlCreate;
- Adl2MainControlDestroy adl2MainControlDestroy;
- Adl2ConsoleModeFileDescriptorSet adl2ConsoleModeFileDescriptorSet;
- Adl2MainControlRefresh adl2MainControlRefresh;
- Adl2ApplicationProfilesSystemReload adl2ApplicationProfilesSystemReload;
- Adl2ApplicationProfilesProfileOfApplicationx2Search adl2ApplicationProfilesProfileOfApplicationx2Search;
+ Adl2MainControlCreate adl2MainControlCreate;
+ Adl2MainControlDestroy adl2MainControlDestroy;
+ Adl2ConsoleModeFileDescriptorSet adl2ConsoleModeFileDescriptorSet;
+ Adl2MainControlRefresh adl2MainControlRefresh;
+ Adl2ApplicationProfilesSystemReload adl2ApplicationProfilesSystemReload;
+ Adl2ApplicationProfilesProfileOfApplicationx2Search
+ adl2ApplicationProfilesProfileOfApplicationx2Search;
-private:
- void* adlHandle_;
- ADL_CONTEXT_HANDLE adlContext_;
+ private:
+ void* adlHandle_;
+ ADL_CONTEXT_HANDLE adlContext_;
};
-ADL::ADL() : adlHandle_(NULL),
- adlContext_(NULL)
-{
- adl2MainControlCreate = NULL;
- adl2MainControlDestroy = NULL;
- adl2ConsoleModeFileDescriptorSet = NULL;
- adl2MainControlRefresh = NULL;
- adl2ApplicationProfilesSystemReload = NULL;
- adl2ApplicationProfilesProfileOfApplicationx2Search = NULL;
+ADL::ADL() : adlHandle_(NULL), adlContext_(NULL) {
+ adl2MainControlCreate = NULL;
+ adl2MainControlDestroy = NULL;
+ adl2ConsoleModeFileDescriptorSet = NULL;
+ adl2MainControlRefresh = NULL;
+ adl2ApplicationProfilesSystemReload = NULL;
+ adl2ApplicationProfilesProfileOfApplicationx2Search = NULL;
}
-ADL::~ADL()
-{
- if (adl2MainControlDestroy != NULL) {
- adl2MainControlDestroy(adlContext_);
- }
- adlContext_ = NULL;
+ADL::~ADL() {
+ if (adl2MainControlDestroy != NULL) {
+ adl2MainControlDestroy(adlContext_);
+ }
+ adlContext_ = NULL;
}
-bool ADL::init()
-{
- if (!adlHandle_) {
- adlHandle_ = amd::Os::loadLibrary("atiadl" LP64_SWITCH(LINUX_SWITCH("xx", "xy"), "xx"));
- }
+bool ADL::init() {
+ if (!adlHandle_) {
+ adlHandle_ = amd::Os::loadLibrary("atiadl" LP64_SWITCH(LINUX_SWITCH("xx", "xy"), "xx"));
+ }
- if (!adlHandle_) {
+ if (!adlHandle_) {
+ return false;
+ }
+
+ adl2MainControlCreate = GETPROCADDRESS(Adl2MainControlCreate, ADL2_Main_Control_Create);
+ adl2MainControlDestroy = GETPROCADDRESS(Adl2MainControlDestroy, ADL2_Main_Control_Destroy);
+ adl2ConsoleModeFileDescriptorSet =
+ GETPROCADDRESS(Adl2ConsoleModeFileDescriptorSet, ADL2_ConsoleMode_FileDescriptor_Set);
+ adl2MainControlRefresh = GETPROCADDRESS(Adl2MainControlRefresh, ADL2_Main_Control_Refresh);
+ adl2ApplicationProfilesSystemReload =
+ GETPROCADDRESS(Adl2ApplicationProfilesSystemReload, ADL2_ApplicationProfiles_System_Reload);
+ adl2ApplicationProfilesProfileOfApplicationx2Search =
+ GETPROCADDRESS(Adl2ApplicationProfilesProfileOfApplicationx2Search,
+ ADL2_ApplicationProfiles_ProfileOfAnApplicationX2_Search);
+
+ if (adl2MainControlCreate == NULL || adl2MainControlDestroy == NULL ||
+ adl2MainControlRefresh == NULL || adl2ApplicationProfilesSystemReload == NULL ||
+ adl2ApplicationProfilesProfileOfApplicationx2Search == NULL) {
+ return false;
+ }
+
+ int result = adl2MainControlCreate(adlMallocCallback, 1, &adlContext_);
+ if (result != ADL_OK) {
+ // ADL2 is expected to return ADL_ERR_NO_XDISPLAY in Linux Console mode environment
+ if (result == ADL_ERR_NO_XDISPLAY) {
+ if (adl2ConsoleModeFileDescriptorSet == NULL ||
+ adl2ConsoleModeFileDescriptorSet(adlContext_, ADL_UNSET) != ADL_OK) {
return false;
+ }
+ adl2MainControlRefresh(adlContext_);
+ } else {
+ return false;
}
+ }
- adl2MainControlCreate = GETPROCADDRESS(Adl2MainControlCreate, ADL2_Main_Control_Create);
- adl2MainControlDestroy = GETPROCADDRESS(Adl2MainControlDestroy, ADL2_Main_Control_Destroy);
- adl2ConsoleModeFileDescriptorSet = GETPROCADDRESS(Adl2ConsoleModeFileDescriptorSet, ADL2_ConsoleMode_FileDescriptor_Set);
- adl2MainControlRefresh = GETPROCADDRESS(Adl2MainControlRefresh, ADL2_Main_Control_Refresh);
- adl2ApplicationProfilesSystemReload = GETPROCADDRESS(Adl2ApplicationProfilesSystemReload,
- ADL2_ApplicationProfiles_System_Reload);
- adl2ApplicationProfilesProfileOfApplicationx2Search = GETPROCADDRESS(Adl2ApplicationProfilesProfileOfApplicationx2Search,
- ADL2_ApplicationProfiles_ProfileOfAnApplicationX2_Search);
+ // Reload is disabled in ADL with the change list 1198904 and ticket
+ // SWDEV-59442 - The ADL_ApplicationProfiles_System_Reload Function is not Re-entrant
+ // Returned value is ADL_ERR_NOT_SUPPORTED on Windows.
+ adl2ApplicationProfilesSystemReload(adlContext_);
- if (adl2MainControlCreate == NULL
- || adl2MainControlDestroy == NULL
- || adl2MainControlRefresh == NULL
- || adl2ApplicationProfilesSystemReload == NULL
- || adl2ApplicationProfilesProfileOfApplicationx2Search == NULL) {
- return false;
- }
-
- int result = adl2MainControlCreate(adlMallocCallback, 1, &adlContext_);
- if (result != ADL_OK) {
- // ADL2 is expected to return ADL_ERR_NO_XDISPLAY in Linux Console mode environment
- if (result == ADL_ERR_NO_XDISPLAY) {
- if(adl2ConsoleModeFileDescriptorSet == NULL
- || adl2ConsoleModeFileDescriptorSet(adlContext_, ADL_UNSET) != ADL_OK) {
- return false;
- }
- adl2MainControlRefresh(adlContext_);
- }
- else {
- return false;
- }
- }
-
- // Reload is disabled in ADL with the change list 1198904 and ticket
- // SWDEV-59442 - The ADL_ApplicationProfiles_System_Reload Function is not Re-entrant
- // Returned value is ADL_ERR_NOT_SUPPORTED on Windows.
- adl2ApplicationProfilesSystemReload(adlContext_);
-
- return true;
+ return true;
}
-#endif //BRAHMA
+#endif // BRAHMA
-AppProfile::AppProfile(): gpuvmHighAddr_(false),
- profileOverridesAllSettings_(false)
-{
- appFileName_ = amd::Os::getAppFileName();
- propertyDataMap_.insert(DataMap::value_type("BuildOptsAppend",
- PropertyData(DataType_String, &buildOptsAppend_)));
+AppProfile::AppProfile() : gpuvmHighAddr_(false), profileOverridesAllSettings_(false) {
+ appFileName_ = amd::Os::getAppFileName();
+ propertyDataMap_.insert(
+ DataMap::value_type("BuildOptsAppend", PropertyData(DataType_String, &buildOptsAppend_)));
}
-AppProfile::~AppProfile()
-{
+AppProfile::~AppProfile() {}
+bool AppProfile::init() {
+ if (appFileName_.empty()) {
+ return false;
+ }
+
+ // Convert appName to wide char for X2_Search ADL interface
+ size_t strLength = appFileName_.length() + 1;
+ wchar_t* appName = new wchar_t[strLength];
+
+ size_t success = mbstowcs(appName, appFileName_.c_str(), strLength);
+ if (success > 0) {
+ // mbstowcs was able to convert to wide character successfully.
+ appName[strLength - 1] = L'\0';
+ }
+
+ wsAppFileName_ = appName;
+
+ delete appName;
+
+ ParseApplicationProfile();
+
+ return true;
}
-bool AppProfile::init()
-{
- if (appFileName_.empty()){
- return false;
- }
-
- // Convert appName to wide char for X2_Search ADL interface
- size_t strLength = appFileName_.length() + 1;
- wchar_t *appName = new wchar_t[strLength];
-
- size_t success = mbstowcs(appName, appFileName_.c_str(), strLength);
- if (success > 0) {
- // mbstowcs was able to convert to wide character successfully.
- appName[strLength - 1] = L'\0';
- }
-
- wsAppFileName_ = appName;
-
- delete appName;
-
- ParseApplicationProfile();
-
- return true;
-}
-
-bool AppProfile::ParseApplicationProfile()
-{
- ADLApplicationProfile* pProfile = NULL;
+bool AppProfile::ParseApplicationProfile() {
+ ADLApplicationProfile* pProfile = NULL;
#ifndef BRAHMA
- amd::ADL* adl = new amd::ADL;
-
- if ((adl == NULL) || !adl->init()) {
- delete adl;
- return false;
- }
-
- // Apply blb configurations
- int result = adl->adl2ApplicationProfilesProfileOfApplicationx2Search(
- adl->adlContext(), wsAppFileName_.c_str(), NULL, NULL,
- L"OCL", &pProfile);
+ amd::ADL* adl = new amd::ADL;
+ if ((adl == NULL) || !adl->init()) {
delete adl;
+ return false;
+ }
-#else //BRAHMA
+ // Apply blb configurations
+ int result = adl->adl2ApplicationProfilesProfileOfApplicationx2Search(
+ adl->adlContext(), wsAppFileName_.c_str(), NULL, NULL, L"OCL", &pProfile);
- if (!SearchProfileOfAnApplication(wsAppFileName_.c_str(), &pProfile)) {
- return false;
+ delete adl;
+
+#else // BRAHMA
+
+ if (!SearchProfileOfAnApplication(wsAppFileName_.c_str(), &pProfile)) {
+ return false;
+ }
+
+#endif // BRAHMA
+
+ if (pProfile == NULL) {
+ return false;
+ }
+
+ PropertyRecord* firstProperty = pProfile->record;
+ uint32_t valueOffset = 0;
+ const int BUFSIZE = 1024;
+ wchar_t wbuffer[BUFSIZE];
+ char buffer[2 * BUFSIZE];
+
+ for (int index = 0; index < pProfile->iCount; index++) {
+ PropertyRecord* profileProperty =
+ reinterpret_cast((reinterpret_cast(firstProperty)) + valueOffset);
+
+ // Get property name
+ char* propertyName = profileProperty->strName;
+ auto entry = propertyDataMap_.find(std::string(propertyName));
+ if (entry == propertyDataMap_.end()) {
+ // unexpected name
+ valueOffset += (sizeof(PropertyRecord) + profileProperty->iDataSize - 4);
+ continue;
}
-#endif //BRAHMA
-
- if (pProfile == NULL) {
- return false;
+ // Get the property value
+ switch (entry->second.type_) {
+ case DataType_Boolean:
+ *(reinterpret_cast(entry->second.data_)) = profileProperty->uData[0] ? true : false;
+ break;
+ case DataType_String: {
+ assert((size_t)(profileProperty->iDataSize) < sizeof(wbuffer) - 2 &&
+ "app profile string too long");
+ memset(wbuffer, 0, sizeof(wbuffer));
+ memcpy(wbuffer, profileProperty->uData, profileProperty->iDataSize);
+ size_t len = wcstombs(buffer, wbuffer, sizeof(buffer));
+ assert(len < sizeof(buffer) - 1 && "app profile string too long");
+ *(reinterpret_cast(entry->second.data_)) = buffer;
+ break;
+ }
+ default:
+ break;
}
+ valueOffset += (sizeof(PropertyRecord) + profileProperty->iDataSize - 4);
+ }
- PropertyRecord* firstProperty = pProfile->record;
- uint32_t valueOffset = 0;
- const int BUFSIZE = 1024;
- wchar_t wbuffer[BUFSIZE];
- char buffer[2 * BUFSIZE];
-
- for (int index = 0; index < pProfile->iCount; index++) {
- PropertyRecord* profileProperty = reinterpret_cast
- ((reinterpret_cast(firstProperty)) + valueOffset);
-
- // Get property name
- char* propertyName = profileProperty->strName;
- auto entry = propertyDataMap_.find(std::string(propertyName));
- if (entry == propertyDataMap_.end()) {
- // unexpected name
- valueOffset += (sizeof(PropertyRecord) + profileProperty->iDataSize - 4);
- continue;
- }
-
- // Get the property value
- switch (entry->second.type_) {
- case DataType_Boolean:
- *(reinterpret_cast(entry->second.data_)) =
- profileProperty->uData[0] ? true : false;
- break;
- case DataType_String: {
- assert((size_t)(profileProperty->iDataSize) < sizeof(wbuffer) - 2 &&
- "app profile string too long");
- memset(wbuffer, 0, sizeof(wbuffer));
- memcpy(wbuffer, profileProperty->uData, profileProperty->iDataSize);
- size_t len = wcstombs(buffer, wbuffer, sizeof(buffer));
- assert(len < sizeof(buffer) - 1 && "app profile string too long");
- *(reinterpret_cast(entry->second.data_)) = buffer;
- break;
- }
- default:
- break;
- }
- valueOffset += (sizeof(PropertyRecord) + profileProperty->iDataSize - 4);
- }
-
- free(pProfile);
- return true;
+ free(pProfile);
+ return true;
}
-
}
diff --git a/rocclr/runtime/device/appprofile.hpp b/rocclr/runtime/device/appprofile.hpp
index c328419447..e2bca4a408 100644
--- a/rocclr/runtime/device/appprofile.hpp
+++ b/rocclr/runtime/device/appprofile.hpp
@@ -10,43 +10,40 @@
namespace amd {
class AppProfile {
-public:
- AppProfile();
- virtual ~AppProfile();
+ public:
+ AppProfile();
+ virtual ~AppProfile();
- bool init();
+ bool init();
- const std::string& GetBuildOptsAppend() const { return buildOptsAppend_; }
+ const std::string& GetBuildOptsAppend() const { return buildOptsAppend_; }
- const std::string& appFileName() const { return appFileName_; }
+ const std::string& appFileName() const { return appFileName_; }
-protected:
- enum DataTypes
- {
- DataType_Unknown = 0,
- DataType_Boolean,
- DataType_String,
- };
+ protected:
+ enum DataTypes {
+ DataType_Unknown = 0,
+ DataType_Boolean,
+ DataType_String,
+ };
- struct PropertyData {
- PropertyData(DataTypes type, void* data): type_(type), data_(data) {}
- DataTypes type_; //!< Data type
- void* data_; //!< Pointer to the data
- };
+ struct PropertyData {
+ PropertyData(DataTypes type, void* data) : type_(type), data_(data) {}
+ DataTypes type_; //!< Data type
+ void* data_; //!< Pointer to the data
+ };
- typedef std::map DataMap;
+ typedef std::map DataMap;
- DataMap propertyDataMap_;
- std::string appFileName_; // without extension
- std::wstring wsAppFileName_;
+ DataMap propertyDataMap_;
+ std::string appFileName_; // without extension
+ std::wstring wsAppFileName_;
- virtual bool ParseApplicationProfile();
+ virtual bool ParseApplicationProfile();
- bool gpuvmHighAddr_; // Currently not used.
- bool profileOverridesAllSettings_; // Overrides hint flags and env.var.
- std::string buildOptsAppend_;
+ bool gpuvmHighAddr_; // Currently not used.
+ bool profileOverridesAllSettings_; // Overrides hint flags and env.var.
+ std::string buildOptsAppend_;
};
-
}
#endif
-
diff --git a/rocclr/runtime/device/blit.cpp b/rocclr/runtime/device/blit.cpp
index b2fb94c278..dfb03972dc 100644
--- a/rocclr/runtime/device/blit.cpp
+++ b/rocclr/runtime/device/blit.cpp
@@ -10,766 +10,653 @@
namespace device {
HostBlitManager::HostBlitManager(VirtualDevice& vDev, Setup setup)
- : BlitManager(setup)
- , vDev_(vDev)
- , dev_(vDev.device())
-{ }
+ : BlitManager(setup), vDev_(vDev), dev_(vDev.device()) {}
-bool
-HostBlitManager::readBuffer(
- device::Memory& srcMemory,
- void* dstHost,
- const amd::Coord3D& origin,
- const amd::Coord3D& size,
- bool entire) const
-{
- // Map the device memory to CPU visible
- void* src = srcMemory.cpuMap(vDev_, Memory::CpuReadOnly);
- if (NULL == src) {
- LogError("Couldn't map device memory for host read");
- return false;
- }
+bool HostBlitManager::readBuffer(device::Memory& srcMemory, void* dstHost,
+ const amd::Coord3D& origin, const amd::Coord3D& size,
+ bool entire) const {
+ // Map the device memory to CPU visible
+ void* src = srcMemory.cpuMap(vDev_, Memory::CpuReadOnly);
+ if (NULL == src) {
+ LogError("Couldn't map device memory for host read");
+ return false;
+ }
- // Copy memory
- amd::Os::fastMemcpy(dstHost,
- reinterpret_cast(src) + origin[0], size[0]);
+ // Copy memory
+ amd::Os::fastMemcpy(dstHost, reinterpret_cast(src) + origin[0], size[0]);
- // Unmap device memory
- srcMemory.cpuUnmap(vDev_);
+ // Unmap device memory
+ srcMemory.cpuUnmap(vDev_);
- return true;
+ return true;
}
-bool
-HostBlitManager::readBufferRect(
- device::Memory& srcMemory,
- void* dstHost,
- const amd::BufferRect& bufRect,
- const amd::BufferRect& hostRect,
- const amd::Coord3D& size,
- bool entire) const
-{
- // Map source memory
- void *src = srcMemory.cpuMap(vDev_, Memory::CpuReadOnly);
- if (src == NULL) {
- LogError("Couldn't map source memory");
- return false;
+bool HostBlitManager::readBufferRect(device::Memory& srcMemory, void* dstHost,
+ const amd::BufferRect& bufRect,
+ const amd::BufferRect& hostRect, const amd::Coord3D& size,
+ bool entire) const {
+ // Map source memory
+ void* src = srcMemory.cpuMap(vDev_, Memory::CpuReadOnly);
+ if (src == NULL) {
+ LogError("Couldn't map source memory");
+ return false;
+ }
+
+ size_t srcOffset;
+ size_t dstOffset;
+
+ for (size_t z = 0; z < size[2]; ++z) {
+ for (size_t y = 0; y < size[1]; ++y) {
+ srcOffset = bufRect.offset(0, y, z);
+ dstOffset = hostRect.offset(0, y, z);
+
+ // Copy memory line by line
+ amd::Os::fastMemcpy((reinterpret_cast(dstHost) + dstOffset),
+ (reinterpret_cast(src) + srcOffset), size[0]);
}
+ }
- size_t srcOffset;
- size_t dstOffset;
+ // Unmap source memory
+ srcMemory.cpuUnmap(vDev_);
- for (size_t z = 0; z < size[2]; ++z) {
- for (size_t y = 0; y < size[1]; ++y) {
- srcOffset = bufRect.offset(0, y, z);
- dstOffset = hostRect.offset(0, y, z);
-
- // Copy memory line by line
- amd::Os::fastMemcpy(
- (reinterpret_cast(dstHost) + dstOffset),
- (reinterpret_cast(src) + srcOffset),
- size[0]);
- }
- }
-
- // Unmap source memory
- srcMemory.cpuUnmap(vDev_);
-
- return true;
+ return true;
}
-bool
-HostBlitManager::readImage(
- device::Memory& srcMemory,
- void* dstHost,
- const amd::Coord3D& origin,
- const amd::Coord3D& size,
- size_t rowPitch,
- size_t slicePitch,
- bool entire) const
-{
- size_t startLayer = origin[2];
- size_t numLayers = size[2];
- if (srcMemory.owner()->getType() == CL_MEM_OBJECT_IMAGE1D_ARRAY) {
- startLayer = origin[1];
- numLayers = size[1];
- }
+bool HostBlitManager::readImage(device::Memory& srcMemory, void* dstHost,
+ const amd::Coord3D& origin, const amd::Coord3D& size,
+ size_t rowPitch, size_t slicePitch, bool entire) const {
+ size_t startLayer = origin[2];
+ size_t numLayers = size[2];
+ if (srcMemory.owner()->getType() == CL_MEM_OBJECT_IMAGE1D_ARRAY) {
+ startLayer = origin[1];
+ numLayers = size[1];
+ }
- // rowPitch and slicePitch in bytes
- size_t srcRowPitch;
- size_t srcSlicePitch;
+ // rowPitch and slicePitch in bytes
+ size_t srcRowPitch;
+ size_t srcSlicePitch;
- // Get physical GPU memmory
- void* src = srcMemory.cpuMap(vDev_, Memory::CpuReadOnly,
- startLayer, numLayers, &srcRowPitch, &srcSlicePitch);
- if (NULL == src) {
- LogError("Couldn't map GPU memory for host read");
- return false;
- }
+ // Get physical GPU memmory
+ void* src = srcMemory.cpuMap(vDev_, Memory::CpuReadOnly, startLayer, numLayers, &srcRowPitch,
+ &srcSlicePitch);
+ if (NULL == src) {
+ LogError("Couldn't map GPU memory for host read");
+ return false;
+ }
- size_t elementSize = srcMemory.owner()->asImage()->getImageFormat().getElementSize();
- size_t srcOffsBase = origin[0] * elementSize;
- size_t copySize = size[0] * elementSize;
- size_t srcOffs;
- size_t dstOffs = 0;
+ size_t elementSize = srcMemory.owner()->asImage()->getImageFormat().getElementSize();
+ size_t srcOffsBase = origin[0] * elementSize;
+ size_t copySize = size[0] * elementSize;
+ size_t srcOffs;
+ size_t dstOffs = 0;
- // Make sure we use the right pitch if it's not specified
- if (rowPitch == 0) {
- rowPitch = size[0] * elementSize;
- }
+ // Make sure we use the right pitch if it's not specified
+ if (rowPitch == 0) {
+ rowPitch = size[0] * elementSize;
+ }
- // Make sure we use the right slice if it's not specified
- if (slicePitch == 0) {
- slicePitch = size[0] * size[1] * elementSize;
- }
+ // Make sure we use the right slice if it's not specified
+ if (slicePitch == 0) {
+ slicePitch = size[0] * size[1] * elementSize;
+ }
- // Adjust destination offset with Y dimension
- srcOffsBase += srcRowPitch * origin[1];
+ // Adjust destination offset with Y dimension
+ srcOffsBase += srcRowPitch * origin[1];
- // Adjust the destination offset with Z dimension
- srcOffsBase += srcSlicePitch * origin[2];
+ // Adjust the destination offset with Z dimension
+ srcOffsBase += srcSlicePitch * origin[2];
+
+ // Copy memory line by line
+ for (size_t slice = 0; slice < size[2]; ++slice) {
+ srcOffs = srcOffsBase + slice * srcSlicePitch;
+ dstOffs = slice * slicePitch;
// Copy memory line by line
- for (size_t slice = 0; slice < size[2]; ++slice) {
- srcOffs = srcOffsBase + slice * srcSlicePitch;
- dstOffs = slice * slicePitch;
+ for (size_t row = 0; row < size[1]; ++row) {
+ // Copy memory
+ amd::Os::fastMemcpy((reinterpret_cast(dstHost) + dstOffs),
+ (reinterpret_cast(src) + srcOffs), copySize);
- // Copy memory line by line
- for (size_t row = 0; row < size[1]; ++row) {
- // Copy memory
- amd::Os::fastMemcpy(
- (reinterpret_cast(dstHost) + dstOffs),
- (reinterpret_cast(src) + srcOffs),
- copySize);
-
- srcOffs += srcRowPitch;
- dstOffs += rowPitch;
- }
+ srcOffs += srcRowPitch;
+ dstOffs += rowPitch;
}
+ }
- // Unmap the device memory
- srcMemory.cpuUnmap(vDev_);
+ // Unmap the device memory
+ srcMemory.cpuUnmap(vDev_);
- return true;
+ return true;
}
-bool
-HostBlitManager::writeBuffer(
- const void* srcHost,
- device::Memory& dstMemory,
- const amd::Coord3D& origin,
- const amd::Coord3D& size,
- bool entire) const
-{
- uint flags = 0;
- if (entire) {
- flags = Memory::CpuWriteOnly;
- }
+bool HostBlitManager::writeBuffer(const void* srcHost, device::Memory& dstMemory,
+ const amd::Coord3D& origin, const amd::Coord3D& size,
+ bool entire) const {
+ uint flags = 0;
+ if (entire) {
+ flags = Memory::CpuWriteOnly;
+ }
- // Map the device memory to CPU visible
- void* dst = dstMemory.cpuMap(vDev_, flags);
- if (NULL == dst) {
- LogError("Couldn't map GPU memory for host write");
- return false;
- }
+ // Map the device memory to CPU visible
+ void* dst = dstMemory.cpuMap(vDev_, flags);
+ if (NULL == dst) {
+ LogError("Couldn't map GPU memory for host write");
+ return false;
+ }
- // Copy memory
- amd::Os::fastMemcpy(
- reinterpret_cast(dst) + origin[0], srcHost, size[0]);
+ // Copy memory
+ amd::Os::fastMemcpy(reinterpret_cast(dst) + origin[0], srcHost, size[0]);
- // Unmap the device memory
- dstMemory.cpuUnmap(vDev_);
+ // Unmap the device memory
+ dstMemory.cpuUnmap(vDev_);
- return true;
+ return true;
}
-bool
-HostBlitManager::writeBufferRect(
- const void* srcHost,
- device::Memory& dstMemory,
- const amd::BufferRect& hostRect,
- const amd::BufferRect& bufRect,
- const amd::Coord3D& size,
- bool entire) const
-{
- // Map destination memory
- void *dst = dstMemory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0);
- if (dst == NULL) {
- LogError("Couldn't map destination memory");
- return false;
+bool HostBlitManager::writeBufferRect(const void* srcHost, device::Memory& dstMemory,
+ const amd::BufferRect& hostRect,
+ const amd::BufferRect& bufRect, const amd::Coord3D& size,
+ bool entire) const {
+ // Map destination memory
+ void* dst = dstMemory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0);
+ if (dst == NULL) {
+ LogError("Couldn't map destination memory");
+ return false;
+ }
+
+ size_t srcOffset;
+ size_t dstOffset;
+
+ for (size_t z = 0; z < size[2]; ++z) {
+ for (size_t y = 0; y < size[1]; ++y) {
+ srcOffset = hostRect.offset(0, y, z);
+ dstOffset = bufRect.offset(0, y, z);
+
+ // Copy memory line by line
+ amd::Os::fastMemcpy((reinterpret_cast(dst) + dstOffset),
+ (reinterpret_cast(srcHost) + srcOffset), size[0]);
}
+ }
- size_t srcOffset;
- size_t dstOffset;
+ // Unmap destination memory
+ dstMemory.cpuUnmap(vDev_);
- for (size_t z = 0; z < size[2]; ++z) {
- for (size_t y = 0; y < size[1]; ++y) {
- srcOffset = hostRect.offset(0, y, z);
- dstOffset = bufRect.offset(0, y, z);
-
- // Copy memory line by line
- amd::Os::fastMemcpy(
- (reinterpret_cast(dst) + dstOffset),
- (reinterpret_cast(srcHost) + srcOffset),
- size[0]);
- }
- }
-
- // Unmap destination memory
- dstMemory.cpuUnmap(vDev_);
-
- return true;
+ return true;
}
-bool
-HostBlitManager::writeImage(
- const void* srcHost,
- device::Memory& dstMemory,
- const amd::Coord3D& origin,
- const amd::Coord3D& size,
- size_t rowPitch,
- size_t slicePitch,
- bool entire) const
-{
- uint flags = 0;
- if (entire) {
- flags = Memory::CpuWriteOnly;
+bool HostBlitManager::writeImage(const void* srcHost, device::Memory& dstMemory,
+ const amd::Coord3D& origin, const amd::Coord3D& size,
+ size_t rowPitch, size_t slicePitch, bool entire) const {
+ uint flags = 0;
+ if (entire) {
+ flags = Memory::CpuWriteOnly;
+ }
+
+ size_t startLayer = origin[2];
+ size_t numLayers = size[2];
+ if (dstMemory.owner()->getType() == CL_MEM_OBJECT_IMAGE1D_ARRAY) {
+ startLayer = origin[1];
+ numLayers = size[1];
+ }
+
+ // rowPitch and slicePitch in bytes
+ size_t dstRowPitch;
+ size_t dstSlicePitch;
+ // Map the device memory to CPU visible
+ void* dst = dstMemory.cpuMap(vDev_, flags, startLayer, numLayers, &dstRowPitch, &dstSlicePitch);
+ if (NULL == dst) {
+ LogError("Couldn't map GPU memory for host write");
+ return false;
+ }
+
+ size_t elementSize = dstMemory.owner()->asImage()->getImageFormat().getElementSize();
+ size_t srcOffs = 0;
+ size_t copySize = size[0] * elementSize;
+ size_t dstOffsBase = origin[0] * elementSize;
+ size_t dstOffs;
+
+ // Make sure we use the right pitch if it's not specified
+ if (rowPitch == 0) {
+ rowPitch = size[0] * elementSize;
+ }
+
+ // Make sure we use the right slice if it's not specified
+ if (slicePitch == 0) {
+ slicePitch = size[0] * size[1] * elementSize;
+ }
+
+ // Adjust the destination offset with Y dimension
+ dstOffsBase += dstRowPitch * origin[1];
+
+ // Adjust the destination offset with Z dimension
+ dstOffsBase += dstSlicePitch * origin[2];
+
+ // Copy memory slice by slice
+ for (size_t slice = 0; slice < size[2]; ++slice) {
+ dstOffs = dstOffsBase + slice * dstSlicePitch;
+ srcOffs = slice * slicePitch;
+
+ // Copy memory line by line
+ for (size_t row = 0; row < size[1]; ++row) {
+ // Copy memory
+ amd::Os::fastMemcpy((reinterpret_cast(dst) + dstOffs),
+ (reinterpret_cast(srcHost) + srcOffs), copySize);
+
+ dstOffs += dstRowPitch;
+ srcOffs += rowPitch;
}
+ }
- size_t startLayer = origin[2];
- size_t numLayers = size[2];
- if (dstMemory.owner()->getType() == CL_MEM_OBJECT_IMAGE1D_ARRAY) {
- startLayer = origin[1];
- numLayers = size[1];
- }
+ // Unmap the device memory
+ dstMemory.cpuUnmap(vDev_);
- // rowPitch and slicePitch in bytes
- size_t dstRowPitch;
- size_t dstSlicePitch;
- // Map the device memory to CPU visible
- void* dst = dstMemory.cpuMap(vDev_, flags,
- startLayer, numLayers, &dstRowPitch, &dstSlicePitch);
- if (NULL == dst) {
- LogError("Couldn't map GPU memory for host write");
- return false;
- }
-
- size_t elementSize = dstMemory.owner()->asImage()->getImageFormat().getElementSize();
- size_t srcOffs = 0;
- size_t copySize = size[0] * elementSize;
- size_t dstOffsBase = origin[0] * elementSize;
- size_t dstOffs;
-
- // Make sure we use the right pitch if it's not specified
- if (rowPitch == 0) {
- rowPitch = size[0] * elementSize;
- }
-
- // Make sure we use the right slice if it's not specified
- if (slicePitch == 0) {
- slicePitch = size[0] * size[1] * elementSize;
- }
-
- // Adjust the destination offset with Y dimension
- dstOffsBase += dstRowPitch * origin[1];
-
- // Adjust the destination offset with Z dimension
- dstOffsBase += dstSlicePitch * origin[2];
-
- // Copy memory slice by slice
- for (size_t slice = 0; slice < size[2]; ++slice) {
- dstOffs = dstOffsBase + slice * dstSlicePitch;
- srcOffs = slice * slicePitch;
-
- // Copy memory line by line
- for (size_t row = 0; row < size[1]; ++row) {
- // Copy memory
- amd::Os::fastMemcpy(
- (reinterpret_cast(dst) + dstOffs),
- (reinterpret_cast(srcHost) + srcOffs),
- copySize);
-
- dstOffs += dstRowPitch;
- srcOffs += rowPitch;
- }
- }
-
- // Unmap the device memory
- dstMemory.cpuUnmap(vDev_);
-
- return true;
+ return true;
}
-bool
-HostBlitManager::copyBuffer(
- device::Memory& srcMemory,
- device::Memory& dstMemory,
- const amd::Coord3D& srcOrigin,
- const amd::Coord3D& dstOrigin,
- const amd::Coord3D& size,
- bool entire) const
-{
- // Map source memory
- void *src = srcMemory.cpuMap(vDev_,
- // Overlap detection
- (&srcMemory == &dstMemory) ? 0 : Memory::CpuReadOnly);
- if (src == NULL) {
- LogError("Couldn't map source memory");
- return false;
- }
+bool HostBlitManager::copyBuffer(device::Memory& srcMemory, device::Memory& dstMemory,
+ const amd::Coord3D& srcOrigin, const amd::Coord3D& dstOrigin,
+ const amd::Coord3D& size, bool entire) const {
+ // Map source memory
+ void* src = srcMemory.cpuMap(vDev_,
+ // Overlap detection
+ (&srcMemory == &dstMemory) ? 0 : Memory::CpuReadOnly);
+ if (src == NULL) {
+ LogError("Couldn't map source memory");
+ return false;
+ }
- // Map destination memory
- void *dst = dstMemory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0);
- if (dst == NULL) {
- LogError("Couldn't map destination memory");
- return false;
- }
+ // Map destination memory
+ void* dst = dstMemory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0);
+ if (dst == NULL) {
+ LogError("Couldn't map destination memory");
+ return false;
+ }
- // Straight forward buffer copy
- amd::Os::fastMemcpy(
- (reinterpret_cast(dst) + dstOrigin[0]),
- (reinterpret_cast(src) + srcOrigin[0]),
- size[0]);
+ // Straight forward buffer copy
+ amd::Os::fastMemcpy((reinterpret_cast(dst) + dstOrigin[0]),
+ (reinterpret_cast(src) + srcOrigin[0]), size[0]);
- // Unmap source and destination memory
- dstMemory.cpuUnmap(vDev_);
- srcMemory.cpuUnmap(vDev_);
+ // Unmap source and destination memory
+ dstMemory.cpuUnmap(vDev_);
+ srcMemory.cpuUnmap(vDev_);
- return true;
+ return true;
}
-bool
-HostBlitManager::copyBufferRect(
- device::Memory& srcMemory,
- device::Memory& dstMemory,
- const amd::BufferRect& srcRect,
- const amd::BufferRect& dstRect,
- const amd::Coord3D& size,
- bool entire) const
-{
- // Map source memory
- void *src = srcMemory.cpuMap(vDev_,
- // Overlap detection
- (&srcMemory == &dstMemory) ? 0 : Memory::CpuReadOnly);
- if (src == NULL) {
- LogError("Couldn't map source memory");
- return false;
+bool HostBlitManager::copyBufferRect(device::Memory& srcMemory, device::Memory& dstMemory,
+ const amd::BufferRect& srcRect, const amd::BufferRect& dstRect,
+ const amd::Coord3D& size, bool entire) const {
+ // Map source memory
+ void* src = srcMemory.cpuMap(vDev_,
+ // Overlap detection
+ (&srcMemory == &dstMemory) ? 0 : Memory::CpuReadOnly);
+ if (src == NULL) {
+ LogError("Couldn't map source memory");
+ return false;
+ }
+
+ // Map destination memory
+ void* dst = dstMemory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0);
+ if (dst == NULL) {
+ LogError("Couldn't map destination memory");
+ return false;
+ }
+
+ for (size_t z = 0; z < size[2]; ++z) {
+ for (size_t y = 0; y < size[1]; ++y) {
+ size_t srcOffset = srcRect.offset(0, y, z);
+ size_t dstOffset = dstRect.offset(0, y, z);
+
+ // Copy memory line by line
+ amd::Os::fastMemcpy((reinterpret_cast(dst) + dstOffset),
+ (reinterpret_cast(src) + srcOffset), size[0]);
}
+ }
- // Map destination memory
- void *dst = dstMemory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0);
- if (dst == NULL) {
- LogError("Couldn't map destination memory");
- return false;
- }
+ // Unmap source and destination memory
+ dstMemory.cpuUnmap(vDev_);
+ srcMemory.cpuUnmap(vDev_);
- for (size_t z = 0; z < size[2]; ++z) {
- for (size_t y = 0; y < size[1]; ++y) {
- size_t srcOffset = srcRect.offset(0, y, z);
- size_t dstOffset = dstRect.offset(0, y, z);
-
- // Copy memory line by line
- amd::Os::fastMemcpy(
- (reinterpret_cast(dst) + dstOffset),
- (reinterpret_cast(src) + srcOffset),
- size[0]);
- }
- }
-
- // Unmap source and destination memory
- dstMemory.cpuUnmap(vDev_);
- srcMemory.cpuUnmap(vDev_);
-
- return true;
+ return true;
}
-bool
-HostBlitManager::copyImageToBuffer(
- device::Memory& srcMemory,
- device::Memory& dstMemory,
- const amd::Coord3D& srcOrigin,
- const amd::Coord3D& dstOrigin,
- const amd::Coord3D& size,
- bool entire,
- size_t rowPitch,
- size_t slicePitch) const
-{
- size_t startLayer = srcOrigin[2];
- size_t numLayers = size[2];
- if (srcMemory.owner()->getType() == CL_MEM_OBJECT_IMAGE1D_ARRAY) {
- startLayer = srcOrigin[1];
- numLayers = size[1];
+bool HostBlitManager::copyImageToBuffer(device::Memory& srcMemory, device::Memory& dstMemory,
+ const amd::Coord3D& srcOrigin,
+ const amd::Coord3D& dstOrigin, const amd::Coord3D& size,
+ bool entire, size_t rowPitch, size_t slicePitch) const {
+ size_t startLayer = srcOrigin[2];
+ size_t numLayers = size[2];
+ if (srcMemory.owner()->getType() == CL_MEM_OBJECT_IMAGE1D_ARRAY) {
+ startLayer = srcOrigin[1];
+ numLayers = size[1];
+ }
+ // rowPitch and slicePitch in bytes
+ size_t srcRowPitch;
+ size_t srcSlicePitch;
+ // Map source memory
+ void* src = srcMemory.cpuMap(vDev_, Memory::CpuReadOnly, startLayer, numLayers, &srcRowPitch,
+ &srcSlicePitch);
+ if (src == NULL) {
+ LogError("Couldn't map source memory");
+ return false;
+ }
+ size_t elementSize = srcMemory.owner()->asImage()->getImageFormat().getElementSize();
+
+ // Map destination memory
+ void* dst = dstMemory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0);
+ if (dst == NULL) {
+ LogError("Couldn't map destination memory");
+ return false;
+ }
+
+ size_t srcOffs = srcOrigin[0];
+ size_t dstOffs = dstOrigin[0];
+ size_t srcOffsOrg;
+ size_t copySize = size[0];
+
+ // Calculate the offset in bytes
+ srcOffs *= elementSize;
+ copySize *= elementSize;
+
+ // Adjust source offset with Y and Z dimensions
+ srcOffs += srcRowPitch * srcOrigin[1];
+ srcOffs += srcSlicePitch * srcOrigin[2];
+
+ srcOffsOrg = srcOffs;
+
+ // Copy memory slice by slice
+ for (size_t slice = 0; slice < size[2]; ++slice) {
+ srcOffs = srcOffsOrg + slice * srcSlicePitch;
+
+ // Copy memory line by line
+ for (size_t rows = 0; rows < size[1]; ++rows) {
+ amd::Os::fastMemcpy((reinterpret_cast(dst) + dstOffs),
+ (reinterpret_cast(src) + srcOffs), copySize);
+
+ srcOffs += srcRowPitch;
+ dstOffs += copySize;
}
- // rowPitch and slicePitch in bytes
- size_t srcRowPitch;
- size_t srcSlicePitch;
- // Map source memory
- void *src = srcMemory.cpuMap(vDev_, Memory::CpuReadOnly,
- startLayer, numLayers, &srcRowPitch, &srcSlicePitch);
- if (src == NULL) {
- LogError("Couldn't map source memory");
- return false;
- }
- size_t elementSize = srcMemory.owner()->asImage()->getImageFormat().getElementSize();
+ }
- // Map destination memory
- void *dst = dstMemory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0);
- if (dst == NULL) {
- LogError("Couldn't map destination memory");
- return false;
- }
+ // Unmap source and destination memory
+ srcMemory.cpuUnmap(vDev_);
+ dstMemory.cpuUnmap(vDev_);
- size_t srcOffs = srcOrigin[0];
- size_t dstOffs = dstOrigin[0];
- size_t srcOffsOrg;
- size_t copySize = size[0];
-
- // Calculate the offset in bytes
- srcOffs *= elementSize;
- copySize *= elementSize;
-
- // Adjust source offset with Y and Z dimensions
- srcOffs += srcRowPitch * srcOrigin[1];
- srcOffs += srcSlicePitch * srcOrigin[2];
-
- srcOffsOrg = srcOffs;
-
- // Copy memory slice by slice
- for (size_t slice = 0; slice < size[2]; ++slice) {
- srcOffs = srcOffsOrg + slice * srcSlicePitch;
-
- // Copy memory line by line
- for (size_t rows = 0; rows < size[1]; ++rows) {
- amd::Os::fastMemcpy(
- (reinterpret_cast(dst) + dstOffs),
- (reinterpret_cast(src) + srcOffs),
- copySize);
-
- srcOffs += srcRowPitch;
- dstOffs += copySize;
- }
- }
-
- // Unmap source and destination memory
- srcMemory.cpuUnmap(vDev_);
- dstMemory.cpuUnmap(vDev_);
-
- return true;
+ return true;
}
-bool
-HostBlitManager::copyBufferToImage(
- device::Memory& srcMemory,
- device::Memory& dstMemory,
- const amd::Coord3D& srcOrigin,
- const amd::Coord3D& dstOrigin,
- const amd::Coord3D& size,
- bool entire,
- size_t rowPitch,
- size_t slicePitch) const
-{
- // Map source memory
- void *src = srcMemory.cpuMap(vDev_, Memory::CpuReadOnly);
- if (src == NULL) {
- LogError("Couldn't map source memory");
- return false;
+bool HostBlitManager::copyBufferToImage(device::Memory& srcMemory, device::Memory& dstMemory,
+ const amd::Coord3D& srcOrigin,
+ const amd::Coord3D& dstOrigin, const amd::Coord3D& size,
+ bool entire, size_t rowPitch, size_t slicePitch) const {
+ // Map source memory
+ void* src = srcMemory.cpuMap(vDev_, Memory::CpuReadOnly);
+ if (src == NULL) {
+ LogError("Couldn't map source memory");
+ return false;
+ }
+
+ size_t startLayer = dstOrigin[2];
+ size_t numLayers = size[2];
+ if (dstMemory.owner()->getType() == CL_MEM_OBJECT_IMAGE1D_ARRAY) {
+ startLayer = dstOrigin[1];
+ numLayers = size[1];
+ }
+ // rowPitch and slicePitch in bytes
+ size_t dstRowPitch;
+ size_t dstSlicePitch;
+ // Map destination memory
+ void* dst = dstMemory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0, startLayer, numLayers,
+ &dstRowPitch, &dstSlicePitch);
+ if (dst == NULL) {
+ LogError("Couldn't map destination memory");
+ return false;
+ }
+
+ size_t elementSize = dstMemory.owner()->asImage()->getImageFormat().getElementSize();
+ size_t srcOffs = srcOrigin[0];
+ size_t dstOffs = dstOrigin[0];
+ size_t dstOffsOrg;
+ size_t copySize = size[0];
+
+ // Calculate the offset in bytes
+ dstOffs *= elementSize;
+ copySize *= elementSize;
+
+ // Adjust destination offset with Y and Z dimension
+ dstOffs += dstRowPitch * dstOrigin[1];
+ dstOffs += dstSlicePitch * dstOrigin[2];
+
+ dstOffsOrg = dstOffs;
+
+ // Copy memory slice by slice
+ for (size_t slice = 0; slice < size[2]; ++slice) {
+ dstOffs = dstOffsOrg + slice * dstSlicePitch;
+
+ // Copy memory line by line
+ for (size_t rows = 0; rows < size[1]; ++rows) {
+ amd::Os::fastMemcpy((reinterpret_cast(dst) + dstOffs),
+ (reinterpret_cast(src) + srcOffs), copySize);
+
+ srcOffs += copySize;
+ dstOffs += dstRowPitch;
}
+ }
- size_t startLayer = dstOrigin[2];
- size_t numLayers = size[2];
- if (dstMemory.owner()->getType() == CL_MEM_OBJECT_IMAGE1D_ARRAY) {
- startLayer = dstOrigin[1];
- numLayers = size[1];
- }
- // rowPitch and slicePitch in bytes
- size_t dstRowPitch;
- size_t dstSlicePitch;
- // Map destination memory
- void *dst = dstMemory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0,
- startLayer, numLayers, &dstRowPitch, &dstSlicePitch);
- if (dst == NULL) {
- LogError("Couldn't map destination memory");
- return false;
- }
+ // Unmap source and destination memory
+ srcMemory.cpuUnmap(vDev_);
+ dstMemory.cpuUnmap(vDev_);
- size_t elementSize = dstMemory.owner()->asImage()->getImageFormat().getElementSize();
- size_t srcOffs = srcOrigin[0];
- size_t dstOffs = dstOrigin[0];
- size_t dstOffsOrg;
- size_t copySize = size[0];
-
- // Calculate the offset in bytes
- dstOffs *= elementSize;
- copySize *= elementSize;
-
- // Adjust destination offset with Y and Z dimension
- dstOffs += dstRowPitch * dstOrigin[1];
- dstOffs += dstSlicePitch * dstOrigin[2];
-
- dstOffsOrg = dstOffs;
-
- // Copy memory slice by slice
- for (size_t slice = 0; slice < size[2]; ++slice) {
- dstOffs = dstOffsOrg + slice * dstSlicePitch;
-
- // Copy memory line by line
- for (size_t rows = 0; rows < size[1]; ++rows) {
- amd::Os::fastMemcpy(
- (reinterpret_cast(dst) + dstOffs),
- (reinterpret_cast(src) + srcOffs),
- copySize);
-
- srcOffs += copySize;
- dstOffs += dstRowPitch;
- }
- }
-
- // Unmap source and destination memory
- srcMemory.cpuUnmap(vDev_);
- dstMemory.cpuUnmap(vDev_);
-
- return true;
+ return true;
}
-bool
-HostBlitManager::copyImage(
- device::Memory& srcMemory,
- device::Memory& dstMemory,
- const amd::Coord3D& srcOrigin,
- const amd::Coord3D& dstOrigin,
- const amd::Coord3D& size,
- bool entire) const
-{
- size_t startLayer = srcOrigin[2];
- size_t numLayers = size[2];
- if (srcMemory.owner()->getType() == CL_MEM_OBJECT_IMAGE1D_ARRAY) {
- startLayer = srcOrigin[1];
- numLayers = size[1];
- }
- // rowPitch and slicePitch in bytes
- size_t srcRowPitch;
- size_t srcSlicePitch;
- // Map source memory
- void *src = srcMemory.cpuMap(vDev_, Memory::CpuReadOnly,
- startLayer, numLayers, &srcRowPitch, &srcSlicePitch);
- if (src == NULL) {
- LogError("Couldn't map source memory");
- return false;
- }
- if (dstMemory.owner()->getType() == CL_MEM_OBJECT_IMAGE1D_ARRAY) {
- startLayer = dstOrigin[1];
- numLayers = size[1];
- }
- else {
- startLayer = dstOrigin[2];
- numLayers = size[2];
+bool HostBlitManager::copyImage(device::Memory& srcMemory, device::Memory& dstMemory,
+ const amd::Coord3D& srcOrigin, const amd::Coord3D& dstOrigin,
+ const amd::Coord3D& size, bool entire) const {
+ size_t startLayer = srcOrigin[2];
+ size_t numLayers = size[2];
+ if (srcMemory.owner()->getType() == CL_MEM_OBJECT_IMAGE1D_ARRAY) {
+ startLayer = srcOrigin[1];
+ numLayers = size[1];
+ }
+ // rowPitch and slicePitch in bytes
+ size_t srcRowPitch;
+ size_t srcSlicePitch;
+ // Map source memory
+ void* src = srcMemory.cpuMap(vDev_, Memory::CpuReadOnly, startLayer, numLayers, &srcRowPitch,
+ &srcSlicePitch);
+ if (src == NULL) {
+ LogError("Couldn't map source memory");
+ return false;
+ }
+ if (dstMemory.owner()->getType() == CL_MEM_OBJECT_IMAGE1D_ARRAY) {
+ startLayer = dstOrigin[1];
+ numLayers = size[1];
+ } else {
+ startLayer = dstOrigin[2];
+ numLayers = size[2];
+ }
+
+ // rowPitch and slicePitch in bytes
+ size_t dstRowPitch;
+ size_t dstSlicePitch;
+ // Map destination memory
+ void* dst = dstMemory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0, startLayer, numLayers,
+ &dstRowPitch, &dstSlicePitch);
+ if (dst == NULL) {
+ LogError("Couldn't map destination memory");
+ return false;
+ }
+
+ size_t elementSize = dstMemory.owner()->asImage()->getImageFormat().getElementSize();
+ assert(elementSize == srcMemory.owner()->asImage()->getImageFormat().getElementSize());
+
+ size_t srcOffs = srcOrigin[0];
+ size_t dstOffs = dstOrigin[0];
+ size_t srcOffsOrg;
+ size_t dstOffsOrg;
+ size_t copySize = size[0];
+
+ // Calculate the offsets in bytes
+ srcOffs *= elementSize;
+ dstOffs *= elementSize;
+ copySize *= elementSize;
+
+ // Adjust destination and sorce offsets with Y dimension
+ srcOffs += srcRowPitch * srcOrigin[1];
+ dstOffs += dstRowPitch * dstOrigin[1];
+
+ // Adjust destination and sorce offsets with Z dimension
+ srcOffs += srcSlicePitch * srcOrigin[2];
+ dstOffs += dstSlicePitch * dstOrigin[2];
+
+ srcOffsOrg = srcOffs;
+ dstOffsOrg = dstOffs;
+
+ // Copy memory slice by slice
+ for (size_t slice = 0; slice < size[2]; ++slice) {
+ srcOffs = srcOffsOrg + slice * srcSlicePitch;
+ dstOffs = dstOffsOrg + slice * dstSlicePitch;
+
+ // Copy memory line by line
+ for (size_t rows = 0; rows < size[1]; ++rows) {
+ amd::Os::fastMemcpy((reinterpret_cast(dst) + dstOffs),
+ (reinterpret_cast(src) + srcOffs), copySize);
+
+ srcOffs += srcRowPitch;
+ dstOffs += dstRowPitch;
}
+ }
- // rowPitch and slicePitch in bytes
- size_t dstRowPitch;
- size_t dstSlicePitch;
- // Map destination memory
- void *dst = dstMemory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0,
- startLayer, numLayers, &dstRowPitch, &dstSlicePitch);
- if (dst == NULL) {
- LogError("Couldn't map destination memory");
- return false;
- }
+ // Unmap source and destination memory
+ srcMemory.cpuUnmap(vDev_);
+ dstMemory.cpuUnmap(vDev_);
- size_t elementSize = dstMemory.owner()->asImage()->getImageFormat().getElementSize();
- assert(elementSize == srcMemory.owner()->asImage()->getImageFormat().getElementSize());
-
- size_t srcOffs = srcOrigin[0];
- size_t dstOffs = dstOrigin[0];
- size_t srcOffsOrg;
- size_t dstOffsOrg;
- size_t copySize = size[0];
-
- // Calculate the offsets in bytes
- srcOffs *= elementSize;
- dstOffs *= elementSize;
- copySize *= elementSize;
-
- // Adjust destination and sorce offsets with Y dimension
- srcOffs += srcRowPitch * srcOrigin[1];
- dstOffs += dstRowPitch * dstOrigin[1];
-
- // Adjust destination and sorce offsets with Z dimension
- srcOffs += srcSlicePitch * srcOrigin[2];
- dstOffs += dstSlicePitch * dstOrigin[2];
-
- srcOffsOrg = srcOffs;
- dstOffsOrg = dstOffs;
-
- // Copy memory slice by slice
- for (size_t slice = 0; slice < size[2]; ++slice) {
- srcOffs = srcOffsOrg + slice * srcSlicePitch;
- dstOffs = dstOffsOrg + slice * dstSlicePitch;
-
- // Copy memory line by line
- for (size_t rows = 0; rows < size[1]; ++rows) {
- amd::Os::fastMemcpy(
- (reinterpret_cast(dst) + dstOffs),
- (reinterpret_cast(src) + srcOffs),
- copySize);
-
- srcOffs += srcRowPitch;
- dstOffs += dstRowPitch;
- }
- }
-
- // Unmap source and destination memory
- srcMemory.cpuUnmap(vDev_);
- dstMemory.cpuUnmap(vDev_);
-
- return true;
+ return true;
}
-bool
-HostBlitManager::fillBuffer(
- device::Memory& memory,
- const void* pattern,
- size_t patternSize,
- const amd::Coord3D& origin,
- const amd::Coord3D& size,
- bool entire
- ) const
-{
- // Map memory
- void* fillMem = memory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0);
- if (fillMem == NULL) {
- LogError("Couldn't map destination memory");
- return false;
- }
+bool HostBlitManager::fillBuffer(device::Memory& memory, const void* pattern, size_t patternSize,
+ const amd::Coord3D& origin, const amd::Coord3D& size,
+ bool entire) const {
+ // Map memory
+ void* fillMem = memory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0);
+ if (fillMem == NULL) {
+ LogError("Couldn't map destination memory");
+ return false;
+ }
- size_t offset = origin[0];
- size_t fillSize = size[0];
+ size_t offset = origin[0];
+ size_t fillSize = size[0];
- if ((fillSize % patternSize) != 0) {
- LogError("Misaligned buffer size and pattern size!");
- }
+ if ((fillSize % patternSize) != 0) {
+ LogError("Misaligned buffer size and pattern size!");
+ }
- // Fill the buffer memory with a pattern
- for (size_t i = 0; i < (fillSize / patternSize); i++) {
- memcpy(
- (reinterpret_cast(fillMem) + offset),
- (reinterpret_cast(pattern)),
- patternSize
- );
- offset += patternSize;
- }
+ // Fill the buffer memory with a pattern
+ for (size_t i = 0; i < (fillSize / patternSize); i++) {
+ memcpy((reinterpret_cast(fillMem) + offset),
+ (reinterpret_cast(pattern)), patternSize);
+ offset += patternSize;
+ }
- // Unmap source and destination memory
- memory.cpuUnmap(vDev_);
+ // Unmap source and destination memory
+ memory.cpuUnmap(vDev_);
- return true;
+ return true;
}
-bool
-HostBlitManager::fillImage(
- device::Memory& memory,
- const void* pattern,
- const amd::Coord3D& origin,
- const amd::Coord3D& size,
- bool entire
- ) const
-{
- size_t startLayer = origin[2];
- size_t numLayers = size[2];
- if (memory.owner()->getType() == CL_MEM_OBJECT_IMAGE1D_ARRAY) {
- startLayer = origin[1];
- numLayers = size[1];
+bool HostBlitManager::fillImage(device::Memory& memory, const void* pattern,
+ const amd::Coord3D& origin, const amd::Coord3D& size,
+ bool entire) const {
+ size_t startLayer = origin[2];
+ size_t numLayers = size[2];
+ if (memory.owner()->getType() == CL_MEM_OBJECT_IMAGE1D_ARRAY) {
+ startLayer = origin[1];
+ numLayers = size[1];
+ }
+ // rowPitch and slicePitch in bytes
+ size_t devRowPitch;
+ size_t devSlicePitch;
+
+ void* newpattern = const_cast(pattern);
+ cl_float4 fFillColor;
+
+ // Converting a linear RGB floating-point color value to a normalized 8-bit unsigned integer sRGB
+ // value so that the cpu path can treat sRGB as RGB for host transfer.
+ if (memory.owner()->asImage()->getImageFormat().image_channel_order == CL_sRGBA) {
+ float* fColor = static_cast(newpattern);
+ fFillColor.s[0] = sRGBmap(fColor[0]) / 255.0f;
+ fFillColor.s[1] = sRGBmap(fColor[1]) / 255.0f;
+ fFillColor.s[2] = sRGBmap(fColor[2]) / 255.0f;
+ fFillColor.s[3] = fColor[3];
+ newpattern = static_cast(&fFillColor);
+ }
+
+ // Map memory
+ void* fillMem = memory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0, startLayer, numLayers,
+ &devRowPitch, &devSlicePitch);
+ if (fillMem == NULL) {
+ LogError("Couldn't map destination memory");
+ return false;
+ }
+
+ float fillValue[4];
+ memset(fillValue, 0, sizeof(fillValue));
+ memory.owner()->asImage()->getImageFormat().formatColor(newpattern, fillValue);
+
+ size_t elementSize = memory.owner()->asImage()->getImageFormat().getElementSize();
+ size_t offset = origin[0] * elementSize;
+ size_t offsetOrg;
+
+ // Adjust offset with Y dimension
+ offset += devRowPitch * origin[1];
+
+ // Adjust offset with Z dimension
+ offset += devSlicePitch * origin[2];
+
+ offsetOrg = offset;
+
+ // Fill the image memory with a pattern
+ for (size_t slice = 0; slice < size[2]; ++slice) {
+ offset = offsetOrg + slice * devSlicePitch;
+
+ for (size_t rows = 0; rows < size[1]; ++rows) {
+ size_t pixOffset = offset;
+
+ // Copy memory pixel by pixel
+ for (size_t column = 0; column < size[0]; ++column) {
+ memcpy((reinterpret_cast(fillMem) + pixOffset),
+ (reinterpret_cast(fillValue)), elementSize);
+ pixOffset += elementSize;
+ }
+
+ offset += devRowPitch;
}
- // rowPitch and slicePitch in bytes
- size_t devRowPitch;
- size_t devSlicePitch;
+ }
- void *newpattern = const_cast(pattern);
- cl_float4 fFillColor;
+ // Unmap memory
+ memory.cpuUnmap(vDev_);
- // Converting a linear RGB floating-point color value to a normalized 8-bit unsigned integer sRGB value so that the cpu path can treat sRGB as RGB for host transfer.
- if (memory.owner()->asImage()->getImageFormat().image_channel_order == CL_sRGBA) {
- float *fColor = static_cast(newpattern);
- fFillColor.s[0] = sRGBmap(fColor[0]) / 255.0f;
- fFillColor.s[1] = sRGBmap(fColor[1]) / 255.0f;
- fFillColor.s[2] = sRGBmap(fColor[2]) / 255.0f;
- fFillColor.s[3] = fColor[3];
- newpattern = static_cast(&fFillColor);
- }
-
- // Map memory
- void* fillMem = memory.cpuMap(vDev_, (entire) ? Memory::CpuWriteOnly : 0,
- startLayer, numLayers, &devRowPitch, &devSlicePitch);
- if (fillMem == NULL) {
- LogError("Couldn't map destination memory");
- return false;
- }
-
- float fillValue[4];
- memset(fillValue, 0, sizeof(fillValue));
- memory.owner()->asImage()->getImageFormat().formatColor(newpattern, fillValue);
-
- size_t elementSize = memory.owner()->asImage()->getImageFormat().getElementSize();
- size_t offset = origin[0] * elementSize;
- size_t offsetOrg;
-
- // Adjust offset with Y dimension
- offset += devRowPitch * origin[1];
-
- // Adjust offset with Z dimension
- offset += devSlicePitch * origin[2];
-
- offsetOrg = offset;
-
- // Fill the image memory with a pattern
- for (size_t slice = 0; slice < size[2]; ++slice) {
- offset = offsetOrg + slice * devSlicePitch;
-
- for (size_t rows = 0; rows < size[1]; ++rows) {
- size_t pixOffset = offset;
-
- // Copy memory pixel by pixel
- for (size_t column = 0; column < size[0]; ++column) {
- memcpy(
- (reinterpret_cast(fillMem) + pixOffset),
- (reinterpret_cast(fillValue)),
- elementSize
- );
- pixOffset += elementSize;
- }
-
- offset += devRowPitch;
- }
- }
-
- // Unmap memory
- memory.cpuUnmap(vDev_);
-
- return true;
+ return true;
}
-cl_uint
-HostBlitManager::sRGBmap(float fc) const
-{
- double c = (double)fc;
+cl_uint HostBlitManager::sRGBmap(float fc) const {
+ double c = (double)fc;
#ifdef ATI_OS_LINUX
- if (isnan(c))
- c = 0.0;
+ if (isnan(c)) c = 0.0;
#else
- if (_isnan(c))
- c = 0.0;
+ if (_isnan(c)) c = 0.0;
#endif
- if (c > 1.0)
- c = 1.0;
- else if (c < 0.0)
- c = 0.0;
- else if (c < 0.0031308)
- c = 12.92 * c;
- else
- c = (1055.0/1000.0) * pow(c, 5.0/12.0) - (55.0/1000.0);
+ if (c > 1.0)
+ c = 1.0;
+ else if (c < 0.0)
+ c = 0.0;
+ else if (c < 0.0031308)
+ c = 12.92 * c;
+ else
+ c = (1055.0 / 1000.0) * pow(c, 5.0 / 12.0) - (55.0 / 1000.0);
- return (cl_uint)(c * 255.0 + 0.5);
+ return (cl_uint)(c * 255.0 + 0.5);
}
-} // namespace gpu
+} // namespace gpu
diff --git a/rocclr/runtime/device/blit.hpp b/rocclr/runtime/device/blit.hpp
index 226637f653..386a979e92 100644
--- a/rocclr/runtime/device/blit.hpp
+++ b/rocclr/runtime/device/blit.hpp
@@ -17,354 +17,325 @@
namespace device {
//! Blit Manager Abstraction class
-class BlitManager : public amd::HeapObject
-{
-public:
- //! HW accelerated setup
- union Setup {
- struct {
- uint disableReadBuffer_ : 1;
- uint disableReadBufferRect_ : 1;
- uint disableReadImage_ : 1;
- uint disableWriteBuffer_ : 1;
- uint disableWriteBufferRect_ : 1;
- uint disableWriteImage_ : 1;
- uint disableCopyBuffer_ : 1;
- uint disableCopyBufferRect_ : 1;
- uint disableCopyImageToBuffer_ : 1;
- uint disableCopyBufferToImage_ : 1;
- uint disableCopyImage_ : 1;
- uint disableFillBuffer_ : 1;
- uint disableFillImage_ : 1;
- uint disableCopyBufferToImageOpt_: 1;
- uint disableHwlCopyBuffer_ : 1;
- };
- uint32_t value_;
- Setup() : value_(0) {}
- void disableAll() { value_ = 0xffffffff; }
+class BlitManager : public amd::HeapObject {
+ public:
+ //! HW accelerated setup
+ union Setup {
+ struct {
+ uint disableReadBuffer_ : 1;
+ uint disableReadBufferRect_ : 1;
+ uint disableReadImage_ : 1;
+ uint disableWriteBuffer_ : 1;
+ uint disableWriteBufferRect_ : 1;
+ uint disableWriteImage_ : 1;
+ uint disableCopyBuffer_ : 1;
+ uint disableCopyBufferRect_ : 1;
+ uint disableCopyImageToBuffer_ : 1;
+ uint disableCopyBufferToImage_ : 1;
+ uint disableCopyImage_ : 1;
+ uint disableFillBuffer_ : 1;
+ uint disableFillImage_ : 1;
+ uint disableCopyBufferToImageOpt_ : 1;
+ uint disableHwlCopyBuffer_ : 1;
};
+ uint32_t value_;
+ Setup() : value_(0) {}
+ void disableAll() { value_ = 0xffffffff; }
+ };
-public:
- //! Constructor
- BlitManager(
- Setup setup = Setup() //!< Specifies HW accelerated blits
- ) : setup_(setup), syncOperation_(false) {}
+ public:
+ //! Constructor
+ BlitManager(Setup setup = Setup() //!< Specifies HW accelerated blits
+ )
+ : setup_(setup), syncOperation_(false) {}
- //! Destructor
- virtual ~BlitManager() { }
+ //! Destructor
+ virtual ~BlitManager() {}
- //! Creates HostBlitManager object
- virtual bool create(amd::Device& device) { return true; }
+ //! Creates HostBlitManager object
+ virtual bool create(amd::Device& device) { return true; }
- //! Copies a buffer object to system memory
- virtual bool readBuffer(
- Memory& srcMemory, //!< Source memory object
- void* dstHost, //!< Destination host memory
- const amd::Coord3D& origin, //!< Source origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const = 0;
+ //! Copies a buffer object to system memory
+ virtual bool readBuffer(Memory& srcMemory, //!< Source memory object
+ void* dstHost, //!< Destination host memory
+ const amd::Coord3D& origin, //!< Source origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const = 0;
- //! Copies a buffer object to system memory
- virtual bool readBufferRect(
- Memory& srcMemory, //!< Source memory object
- void* dstHost, //!< Destinaiton host memory
- const amd::BufferRect& bufRect, //!< Source rectangle
- const amd::BufferRect& hostRect, //!< Destination rectangle
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const = 0;
+ //! Copies a buffer object to system memory
+ virtual bool readBufferRect(Memory& srcMemory, //!< Source memory object
+ void* dstHost, //!< Destinaiton host memory
+ const amd::BufferRect& bufRect, //!< Source rectangle
+ const amd::BufferRect& hostRect, //!< Destination rectangle
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const = 0;
- //! Copies an image object to system memory
- virtual bool readImage(
- Memory& srcMemory, //!< Source memory object
- void* dstHost, //!< Destination host memory
- const amd::Coord3D& origin, //!< Source origin
- const amd::Coord3D& size, //!< Size of the copy region
- size_t rowPitch, //!< Row pitch for host memory
- size_t slicePitch, //!< Slice pitch for host memory
- bool entire = false //!< Entire buffer will be updated
- ) const = 0;
+ //! Copies an image object to system memory
+ virtual bool readImage(Memory& srcMemory, //!< Source memory object
+ void* dstHost, //!< Destination host memory
+ const amd::Coord3D& origin, //!< Source origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ size_t rowPitch, //!< Row pitch for host memory
+ size_t slicePitch, //!< Slice pitch for host memory
+ bool entire = false //!< Entire buffer will be updated
+ ) const = 0;
- //! Copies system memory to a buffer object
- virtual bool writeBuffer(
- const void* srcHost, //!< Source host memory
- Memory& dstMemory, //!< Destination memory object
- const amd::Coord3D& origin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const = 0;
+ //! Copies system memory to a buffer object
+ virtual bool writeBuffer(const void* srcHost, //!< Source host memory
+ Memory& dstMemory, //!< Destination memory object
+ const amd::Coord3D& origin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const = 0;
- //! Copies system memory to a buffer object
- virtual bool writeBufferRect(
- const void* srcHost, //!< Source host memory
- Memory& dstMemory, //!< Destination memory object
- const amd::BufferRect& hostRect, //!< Destination rectangle
- const amd::BufferRect& bufRect, //!< Source rectangle
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const = 0;
+ //! Copies system memory to a buffer object
+ virtual bool writeBufferRect(const void* srcHost, //!< Source host memory
+ Memory& dstMemory, //!< Destination memory object
+ const amd::BufferRect& hostRect, //!< Destination rectangle
+ const amd::BufferRect& bufRect, //!< Source rectangle
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const = 0;
- //! Copies system memory to an image object
- virtual bool writeImage(
- const void* srcHost, //!< Source host memory
- Memory& dstMemory, //!< Destination memory object
- const amd::Coord3D& origin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- size_t rowPitch, //!< Row pitch for host memory
- size_t slicePitch, //!< Slice pitch for host memory
- bool entire = false //!< Entire buffer will be updated
- ) const = 0;
+ //! Copies system memory to an image object
+ virtual bool writeImage(const void* srcHost, //!< Source host memory
+ Memory& dstMemory, //!< Destination memory object
+ const amd::Coord3D& origin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ size_t rowPitch, //!< Row pitch for host memory
+ size_t slicePitch, //!< Slice pitch for host memory
+ bool entire = false //!< Entire buffer will be updated
+ ) const = 0;
- //! Copies a buffer object to another buffer object
- virtual bool copyBuffer(
- Memory& srcMemory, //!< Source memory object
- Memory& dstMemory, //!< Destination memory object
- const amd::Coord3D& srcOrigin, //!< Source origin
- const amd::Coord3D& dstOrigin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const = 0;
+ //! Copies a buffer object to another buffer object
+ virtual bool copyBuffer(Memory& srcMemory, //!< Source memory object
+ Memory& dstMemory, //!< Destination memory object
+ const amd::Coord3D& srcOrigin, //!< Source origin
+ const amd::Coord3D& dstOrigin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const = 0;
- //! Copies a buffer object to another buffer object
- virtual bool copyBufferRect(
- Memory& srcMemory, //!< Source memory object
- Memory& dstMemory, //!< Destination memory object
- const amd::BufferRect& srcRect, //!< Source rectangle
- const amd::BufferRect& dstRect, //!< Destination rectangle
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const = 0;
+ //! Copies a buffer object to another buffer object
+ virtual bool copyBufferRect(Memory& srcMemory, //!< Source memory object
+ Memory& dstMemory, //!< Destination memory object
+ const amd::BufferRect& srcRect, //!< Source rectangle
+ const amd::BufferRect& dstRect, //!< Destination rectangle
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const = 0;
- //! Copies an image object to a buffer object
- virtual bool copyImageToBuffer(
- Memory& srcMemory, //!< Source memory object
- Memory& dstMemory, //!< Destination memory object
- const amd::Coord3D& srcOrigin, //!< Source origin
- const amd::Coord3D& dstOrigin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false, //!< Entire buffer will be updated
- size_t rowPitch = 0, //!< Pitch for buffer
- size_t slicePitch = 0 //!< Slice for buffer
- ) const = 0;
+ //! Copies an image object to a buffer object
+ virtual bool copyImageToBuffer(Memory& srcMemory, //!< Source memory object
+ Memory& dstMemory, //!< Destination memory object
+ const amd::Coord3D& srcOrigin, //!< Source origin
+ const amd::Coord3D& dstOrigin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false, //!< Entire buffer will be updated
+ size_t rowPitch = 0, //!< Pitch for buffer
+ size_t slicePitch = 0 //!< Slice for buffer
+ ) const = 0;
- //! Copies a buffer object to an image object
- virtual bool copyBufferToImage(
- Memory& srcMemory, //!< Source memory object
- Memory& dstMemory, //!< Destination memory object
- const amd::Coord3D& srcOrigin, //!< Source origin
- const amd::Coord3D& dstOrigin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false, //!< Entire buffer will be updated
- size_t rowPitch = 0, //!< Pitch for buffer
- size_t slicePitch = 0 //!< Slice for buffer
- ) const = 0;
+ //! Copies a buffer object to an image object
+ virtual bool copyBufferToImage(Memory& srcMemory, //!< Source memory object
+ Memory& dstMemory, //!< Destination memory object
+ const amd::Coord3D& srcOrigin, //!< Source origin
+ const amd::Coord3D& dstOrigin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false, //!< Entire buffer will be updated
+ size_t rowPitch = 0, //!< Pitch for buffer
+ size_t slicePitch = 0 //!< Slice for buffer
+ ) const = 0;
- //! Copies an image object to another image object
- virtual bool copyImage(
- Memory& srcMemory, //!< Source memory object
- Memory& dstMemory, //!< Destination memory object
- const amd::Coord3D& srcOrigin, //!< Source origin
- const amd::Coord3D& dstOrigin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const = 0;
+ //! Copies an image object to another image object
+ virtual bool copyImage(Memory& srcMemory, //!< Source memory object
+ Memory& dstMemory, //!< Destination memory object
+ const amd::Coord3D& srcOrigin, //!< Source origin
+ const amd::Coord3D& dstOrigin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const = 0;
- //! Fills a buffer memory with a pattern data
- virtual bool fillBuffer(
- Memory& memory, //!< Memory object to fill with pattern
- const void* pattern, //!< Pattern data
- size_t patternSize, //!< Pattern size
- const amd::Coord3D& origin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const = 0;
+ //! Fills a buffer memory with a pattern data
+ virtual bool fillBuffer(Memory& memory, //!< Memory object to fill with pattern
+ const void* pattern, //!< Pattern data
+ size_t patternSize, //!< Pattern size
+ const amd::Coord3D& origin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const = 0;
- //! Fills an image memory with a pattern data
- virtual bool fillImage(
- Memory& dstMemory, //!< Memory object to fill with pattern
- const void* pattern, //!< Pattern data
- const amd::Coord3D& origin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const = 0;
+ //! Fills an image memory with a pattern data
+ virtual bool fillImage(Memory& dstMemory, //!< Memory object to fill with pattern
+ const void* pattern, //!< Pattern data
+ const amd::Coord3D& origin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const = 0;
- //! Enables synchronization on blit operations
- void enableSynchronization() { syncOperation_ = true; }
+ //! Enables synchronization on blit operations
+ void enableSynchronization() { syncOperation_ = true; }
-protected:
- const Setup setup_; //!< HW accelerated blit requested
- bool syncOperation_; //!< Blit operations are synchronized
+ protected:
+ const Setup setup_; //!< HW accelerated blit requested
+ bool syncOperation_; //!< Blit operations are synchronized
-private:
- //! Disable copy constructor
- BlitManager(const BlitManager&);
+ private:
+ //! Disable copy constructor
+ BlitManager(const BlitManager&);
- //! Disable operator=
- BlitManager& operator=(const BlitManager&);
+ //! Disable operator=
+ BlitManager& operator=(const BlitManager&);
};
//! Host Blit Manager
-class HostBlitManager : public device::BlitManager
-{
-public:
- //! Constructor
- HostBlitManager(
- VirtualDevice& vdev, //!< Virtual GPU to be used for blits
- Setup setup = Setup() //!< Specifies HW accelerated blits
- );
+class HostBlitManager : public device::BlitManager {
+ public:
+ //! Constructor
+ HostBlitManager(VirtualDevice& vdev, //!< Virtual GPU to be used for blits
+ Setup setup = Setup() //!< Specifies HW accelerated blits
+ );
- //! Destructor
- virtual ~HostBlitManager() { }
+ //! Destructor
+ virtual ~HostBlitManager() {}
- //! Creates HostBlitManager object
- virtual bool create(amd::Device& device) { return true; }
+ //! Creates HostBlitManager object
+ virtual bool create(amd::Device& device) { return true; }
- //! Copies a buffer object to system memory
- virtual bool readBuffer(
- device::Memory& srcMemory, //!< Source memory object
- void* dstHost, //!< Destination host memory
- const amd::Coord3D& origin, //!< Source origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const;
+ //! Copies a buffer object to system memory
+ virtual bool readBuffer(device::Memory& srcMemory, //!< Source memory object
+ void* dstHost, //!< Destination host memory
+ const amd::Coord3D& origin, //!< Source origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const;
- //! Copies a buffer object to system memory
- virtual bool readBufferRect(
- device::Memory& srcMemory, //!< Source memory object
- void* dstHost, //!< Destinaiton host memory
- const amd::BufferRect& bufRect, //!< Source rectangle
- const amd::BufferRect& hostRect, //!< Destination rectangle
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const;
+ //! Copies a buffer object to system memory
+ virtual bool readBufferRect(device::Memory& srcMemory, //!< Source memory object
+ void* dstHost, //!< Destinaiton host memory
+ const amd::BufferRect& bufRect, //!< Source rectangle
+ const amd::BufferRect& hostRect, //!< Destination rectangle
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const;
- //! Copies an image object to system memory
- virtual bool readImage(
- device::Memory& srcMemory, //!< Source memory object
- void* dstHost, //!< Destination host memory
- const amd::Coord3D& origin, //!< Source origin
- const amd::Coord3D& size, //!< Size of the copy region
- size_t rowPitch, //!< Row pitch for host memory
- size_t slicePitch, //!< Slice pitch for host memory
- bool entire = false //!< Entire buffer will be updated
- ) const;
+ //! Copies an image object to system memory
+ virtual bool readImage(device::Memory& srcMemory, //!< Source memory object
+ void* dstHost, //!< Destination host memory
+ const amd::Coord3D& origin, //!< Source origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ size_t rowPitch, //!< Row pitch for host memory
+ size_t slicePitch, //!< Slice pitch for host memory
+ bool entire = false //!< Entire buffer will be updated
+ ) const;
- //! Copies system memory to a buffer object
- virtual bool writeBuffer(
- const void* srcHost, //!< Source host memory
- device::Memory& dstMemory, //!< Destination memory object
- const amd::Coord3D& origin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const;
+ //! Copies system memory to a buffer object
+ virtual bool writeBuffer(const void* srcHost, //!< Source host memory
+ device::Memory& dstMemory, //!< Destination memory object
+ const amd::Coord3D& origin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const;
- //! Copies system memory to a buffer object
- virtual bool writeBufferRect(
- const void* srcHost, //!< Source host memory
- device::Memory& dstMemory, //!< Destination memory object
- const amd::BufferRect& hostRect, //!< Destination rectangle
- const amd::BufferRect& bufRect, //!< Source rectangle
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const;
+ //! Copies system memory to a buffer object
+ virtual bool writeBufferRect(const void* srcHost, //!< Source host memory
+ device::Memory& dstMemory, //!< Destination memory object
+ const amd::BufferRect& hostRect, //!< Destination rectangle
+ const amd::BufferRect& bufRect, //!< Source rectangle
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const;
- //! Copies system memory to an image object
- virtual bool writeImage(
- const void* srcHost, //!< Source host memory
- device::Memory& dstMemory, //!< Destination memory object
- const amd::Coord3D& origin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- size_t rowPitch, //!< Row pitch for host memory
- size_t slicePitch, //!< Slice pitch for host memory
- bool entire = false //!< Entire buffer will be updated
- ) const;
+ //! Copies system memory to an image object
+ virtual bool writeImage(const void* srcHost, //!< Source host memory
+ device::Memory& dstMemory, //!< Destination memory object
+ const amd::Coord3D& origin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ size_t rowPitch, //!< Row pitch for host memory
+ size_t slicePitch, //!< Slice pitch for host memory
+ bool entire = false //!< Entire buffer will be updated
+ ) const;
- //! Copies a buffer object to another buffer object
- virtual bool copyBuffer(
- device::Memory& srcMemory, //!< Source memory object
- device::Memory& dstMemory, //!< Destination memory object
- const amd::Coord3D& srcOrigin, //!< Source origin
- const amd::Coord3D& dstOrigin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const;
+ //! Copies a buffer object to another buffer object
+ virtual bool copyBuffer(device::Memory& srcMemory, //!< Source memory object
+ device::Memory& dstMemory, //!< Destination memory object
+ const amd::Coord3D& srcOrigin, //!< Source origin
+ const amd::Coord3D& dstOrigin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const;
- //! Copies a buffer object to another buffer object
- virtual bool copyBufferRect(
- device::Memory& srcMemory, //!< Source memory object
- device::Memory& dstMemory, //!< Destination memory object
- const amd::BufferRect& srcRect, //!< Source rectangle
- const amd::BufferRect& dstRect, //!< Destination rectangle
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const;
+ //! Copies a buffer object to another buffer object
+ virtual bool copyBufferRect(device::Memory& srcMemory, //!< Source memory object
+ device::Memory& dstMemory, //!< Destination memory object
+ const amd::BufferRect& srcRect, //!< Source rectangle
+ const amd::BufferRect& dstRect, //!< Destination rectangle
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const;
- //! Copies an image object to a buffer object
- virtual bool copyImageToBuffer(
- device::Memory& srcMemory, //!< Source memory object
- device::Memory& dstMemory, //!< Destination memory object
- const amd::Coord3D& srcOrigin, //!< Source origin
- const amd::Coord3D& dstOrigin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false, //!< Entire buffer will be updated
- size_t rowPitch = 0, //!< Pitch for buffer
- size_t slicePitch = 0 //!< Slice for buffer
- ) const;
+ //! Copies an image object to a buffer object
+ virtual bool copyImageToBuffer(device::Memory& srcMemory, //!< Source memory object
+ device::Memory& dstMemory, //!< Destination memory object
+ const amd::Coord3D& srcOrigin, //!< Source origin
+ const amd::Coord3D& dstOrigin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false, //!< Entire buffer will be updated
+ size_t rowPitch = 0, //!< Pitch for buffer
+ size_t slicePitch = 0 //!< Slice for buffer
+ ) const;
- //! Copies a buffer object to an image object
- virtual bool copyBufferToImage(
- device::Memory& srcMemory, //!< Source memory object
- device::Memory& dstMemory, //!< Destination memory object
- const amd::Coord3D& srcOrigin, //!< Source origin
- const amd::Coord3D& dstOrigin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false, //!< Entire buffer will be updated
- size_t rowPitch = 0, //!< Pitch for buffer
- size_t slicePitch = 0 //!< Slice for buffer
- ) const;
+ //! Copies a buffer object to an image object
+ virtual bool copyBufferToImage(device::Memory& srcMemory, //!< Source memory object
+ device::Memory& dstMemory, //!< Destination memory object
+ const amd::Coord3D& srcOrigin, //!< Source origin
+ const amd::Coord3D& dstOrigin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false, //!< Entire buffer will be updated
+ size_t rowPitch = 0, //!< Pitch for buffer
+ size_t slicePitch = 0 //!< Slice for buffer
+ ) const;
- //! Copies an image object to another image object
- virtual bool copyImage(
- device::Memory& srcMemory, //!< Source memory object
- device::Memory& dstMemory, //!< Destination memory object
- const amd::Coord3D& srcOrigin, //!< Source origin
- const amd::Coord3D& dstOrigin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const;
+ //! Copies an image object to another image object
+ virtual bool copyImage(device::Memory& srcMemory, //!< Source memory object
+ device::Memory& dstMemory, //!< Destination memory object
+ const amd::Coord3D& srcOrigin, //!< Source origin
+ const amd::Coord3D& dstOrigin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const;
- //! Fills a buffer memory with a pattern data
- virtual bool fillBuffer(
- device::Memory& memory, //!< Memory object to fill with pattern
- const void* pattern, //!< Pattern data
- size_t patternSize, //!< Pattern size
- const amd::Coord3D& origin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const;
+ //! Fills a buffer memory with a pattern data
+ virtual bool fillBuffer(device::Memory& memory, //!< Memory object to fill with pattern
+ const void* pattern, //!< Pattern data
+ size_t patternSize, //!< Pattern size
+ const amd::Coord3D& origin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const;
- //! Fills an image memory with a pattern data
- virtual bool fillImage(
- device::Memory& dstMemory, //!< Memory object to fill with pattern
- const void* pattern, //!< Pattern data
- const amd::Coord3D& origin, //!< Destination origin
- const amd::Coord3D& size, //!< Size of the copy region
- bool entire = false //!< Entire buffer will be updated
- ) const;
+ //! Fills an image memory with a pattern data
+ virtual bool fillImage(device::Memory& dstMemory, //!< Memory object to fill with pattern
+ const void* pattern, //!< Pattern data
+ const amd::Coord3D& origin, //!< Destination origin
+ const amd::Coord3D& size, //!< Size of the copy region
+ bool entire = false //!< Entire buffer will be updated
+ ) const;
- cl_uint sRGBmap(float fc) const;
+ cl_uint sRGBmap(float fc) const;
-protected:
- VirtualDevice& vDev_; //!< Virtual device object
- const amd::Device& dev_; //!< Physical device
+ protected:
+ VirtualDevice& vDev_; //!< Virtual device object
+ const amd::Device& dev_; //!< Physical device
-private:
- //! Disable copy constructor
- HostBlitManager(const HostBlitManager&);
+ private:
+ //! Disable copy constructor
+ HostBlitManager(const HostBlitManager&);
- //! Disable operator=
- HostBlitManager& operator=(const HostBlitManager&);
+ //! Disable operator=
+ HostBlitManager& operator=(const HostBlitManager&);
};
/*@}*/} // namespace device
diff --git a/rocclr/runtime/device/blitcl.cpp b/rocclr/runtime/device/blitcl.cpp
index 853ebab465..1d2c409eaf 100644
--- a/rocclr/runtime/device/blitcl.cpp
+++ b/rocclr/runtime/device/blitcl.cpp
@@ -6,161 +6,86 @@ namespace device {
#define BLIT_KERNELS(...) #__VA_ARGS__
-const char* BlitSourceCode =
-BLIT_KERNELS(
-extern void __amd_copyBufferRect(
- __global uchar*, __global uchar*,
- ulong4, ulong4, ulong4);
+const char* BlitSourceCode = BLIT_KERNELS(
+ extern void __amd_copyBufferRect(__global uchar*, __global uchar*, ulong4, ulong4, ulong4);
-extern void __amd_copyBufferRectAligned(
- __global uint*, __global uint*,
- ulong4, ulong4, ulong4);
+ extern void __amd_copyBufferRectAligned(__global uint*, __global uint*, ulong4, ulong4, ulong4);
-extern void __amd_copyBuffer(
- __global uchar*, __global uchar*,
- ulong, ulong, ulong, uint);
+ extern void __amd_copyBuffer(__global uchar*, __global uchar*, ulong, ulong, ulong, uint);
-extern void __amd_copyBufferAligned(
- __global uint*, __global uint*,
- ulong, ulong, ulong, uint);
+ extern void __amd_copyBufferAligned(__global uint*, __global uint*, ulong, ulong, ulong, uint);
-extern void __amd_fillBuffer(
- __global uchar*, __global uint*, __constant uchar*,
- uint, ulong, ulong);
+ extern void __amd_fillBuffer(__global uchar*, __global uint*, __constant uchar*, uint, ulong,
+ ulong);
-__kernel void copyBufferRect(
- __global uchar* src,
- __global uchar* dst,
- ulong4 srcRect,
- ulong4 dstRect,
- ulong4 size)
-{
- __amd_copyBufferRect(src, dst, srcRect, dstRect, size);
-}
+ __kernel void copyBufferRect(__global uchar* src, __global uchar* dst, ulong4 srcRect,
+ ulong4 dstRect, ulong4 size) {
+ __amd_copyBufferRect(src, dst, srcRect, dstRect, size);
+ }
-__kernel void copyBufferRectAligned(
- __global uint* src,
- __global uint* dst,
- ulong4 srcRect,
- ulong4 dstRect,
- ulong4 size)
-{
- __amd_copyBufferRectAligned(src, dst, srcRect, dstRect, size);
-}
+ __kernel void copyBufferRectAligned(__global uint* src, __global uint* dst, ulong4 srcRect,
+ ulong4 dstRect, ulong4 size) {
+ __amd_copyBufferRectAligned(src, dst, srcRect, dstRect, size);
+ }
-__kernel void copyBuffer(
- __global uchar* srcI,
- __global uchar* dstI,
- ulong srcOrigin,
- ulong dstOrigin,
- ulong size,
- uint remain)
-{
- __amd_copyBuffer(srcI, dstI, srcOrigin, dstOrigin, size, remain);
-}
+ __kernel void copyBuffer(__global uchar* srcI, __global uchar* dstI, ulong srcOrigin,
+ ulong dstOrigin, ulong size, uint remain) {
+ __amd_copyBuffer(srcI, dstI, srcOrigin, dstOrigin, size, remain);
+ }
-__kernel void copyBufferAligned(
- __global uint* src,
- __global uint* dst,
- ulong srcOrigin,
- ulong dstOrigin,
- ulong size,
- uint alignment)
-{
- __amd_copyBufferAligned(src, dst, srcOrigin, dstOrigin, size, alignment);
-}
+ __kernel void copyBufferAligned(__global uint* src, __global uint* dst, ulong srcOrigin,
+ ulong dstOrigin, ulong size, uint alignment) {
+ __amd_copyBufferAligned(src, dst, srcOrigin, dstOrigin, size, alignment);
+ }
-__kernel void fillBuffer(
- __global uchar* bufUChar,
- __global uint* bufUInt,
- __constant uchar* pattern,
- uint patternSize,
- ulong offset,
- ulong size)
-{
- __amd_fillBuffer(bufUChar, bufUInt, pattern, patternSize, offset, size);
-}
-extern void __amd_copyBufferToImage(
- __global uint*, __write_only image2d_array_t, ulong4,
- int4, int4, uint4, ulong4);
+ __kernel void fillBuffer(__global uchar* bufUChar, __global uint* bufUInt,
+ __constant uchar* pattern, uint patternSize, ulong offset,
+ ulong size) {
+ __amd_fillBuffer(bufUChar, bufUInt, pattern, patternSize, offset, size);
+ } extern void __amd_copyBufferToImage(__global uint*, __write_only image2d_array_t, ulong4,
+ int4, int4, uint4, ulong4);
-extern void __amd_copyImageToBuffer(
- __read_only image2d_array_t, __global uint*, __global ushort*,
- __global uchar*, int4, ulong4, int4, uint4, ulong4);
+ extern void __amd_copyImageToBuffer(__read_only image2d_array_t, __global uint*,
+ __global ushort*, __global uchar*, int4, ulong4, int4,
+ uint4, ulong4);
-extern void __amd_copyImage(
- __read_only image2d_array_t, __write_only image2d_array_t,
- int4, int4, int4);
+ extern void __amd_copyImage(__read_only image2d_array_t, __write_only image2d_array_t, int4,
+ int4, int4);
-extern void __amd_copyImage1DA(
- __read_only image2d_array_t, __write_only image2d_array_t,
- int4, int4, int4);
+ extern void __amd_copyImage1DA(__read_only image2d_array_t, __write_only image2d_array_t, int4,
+ int4, int4);
-extern void __amd_fillImage(
- __write_only image2d_array_t,
- float4, int4, uint4, int4, int4, uint);
+ extern void __amd_fillImage(__write_only image2d_array_t, float4, int4, uint4, int4, int4,
+ uint);
-__kernel void copyBufferToImage(
- __global uint* src,
- __write_only image2d_array_t dst,
- ulong4 srcOrigin,
- int4 dstOrigin,
- int4 size,
- uint4 format,
- ulong4 pitch)
-{
- __amd_copyBufferToImage(src, dst, srcOrigin, dstOrigin, size, format, pitch);
-}
+ __kernel void copyBufferToImage(__global uint* src, __write_only image2d_array_t dst,
+ ulong4 srcOrigin, int4 dstOrigin, int4 size, uint4 format,
+ ulong4 pitch) {
+ __amd_copyBufferToImage(src, dst, srcOrigin, dstOrigin, size, format, pitch);
+ }
-__kernel void copyImageToBuffer(
- __read_only image2d_array_t src,
- __global uint* dstUInt,
- __global ushort* dstUShort,
- __global uchar* dstUChar,
- int4 srcOrigin,
- ulong4 dstOrigin,
- int4 size,
- uint4 format,
- ulong4 pitch)
-{
- __amd_copyImageToBuffer(src, dstUInt, dstUShort, dstUChar,
- srcOrigin, dstOrigin, size, format, pitch);
-}
+ __kernel void copyImageToBuffer(__read_only image2d_array_t src, __global uint* dstUInt,
+ __global ushort* dstUShort, __global uchar* dstUChar,
+ int4 srcOrigin, ulong4 dstOrigin, int4 size, uint4 format,
+ ulong4 pitch) {
+ __amd_copyImageToBuffer(src, dstUInt, dstUShort, dstUChar, srcOrigin, dstOrigin, size, format,
+ pitch);
+ }
-__kernel void copyImage(
- __read_only image2d_array_t src,
- __write_only image2d_array_t dst,
- int4 srcOrigin,
- int4 dstOrigin,
- int4 size)
-{
- __amd_copyImage(src, dst, srcOrigin, dstOrigin, size);
-}
+ __kernel void copyImage(__read_only image2d_array_t src, __write_only image2d_array_t dst,
+ int4 srcOrigin, int4 dstOrigin,
+ int4 size) { __amd_copyImage(src, dst, srcOrigin, dstOrigin, size); }
-__kernel void copyImage1DA(
- __read_only image2d_array_t src,
- __write_only image2d_array_t dst,
- int4 srcOrigin,
- int4 dstOrigin,
- int4 size)
-{
- __amd_copyImage1DA(src, dst, srcOrigin, dstOrigin, size);
-}
+ __kernel void copyImage1DA(__read_only image2d_array_t src, __write_only image2d_array_t dst,
+ int4 srcOrigin, int4 dstOrigin, int4 size) {
+ __amd_copyImage1DA(src, dst, srcOrigin, dstOrigin, size);
+ }
-__kernel void fillImage(
- __write_only image2d_array_t image,
- float4 patternFLOAT4,
- int4 patternINT4,
- uint4 patternUINT4,
- int4 origin,
- int4 size,
- uint type)
-{
- __amd_fillImage(image, patternFLOAT4, patternINT4, patternUINT4,
- origin, size, type);
-}
-)
-;
+ __kernel void fillImage(__write_only image2d_array_t image, float4 patternFLOAT4,
+ int4 patternINT4, uint4 patternUINT4, int4 origin, int4 size,
+ uint type) {
+ __amd_fillImage(image, patternFLOAT4, patternINT4, patternUINT4, origin, size, type);
+ });
-} // namespace device
+} // namespace device
diff --git a/rocclr/runtime/device/cpu/cpubinary.cpp b/rocclr/runtime/device/cpu/cpubinary.cpp
index b35d70b3bb..e8cf8496c2 100644
--- a/rocclr/runtime/device/cpu/cpubinary.cpp
+++ b/rocclr/runtime/device/cpu/cpubinary.cpp
@@ -16,74 +16,69 @@
namespace cpu {
-ClBinary::FeatureCheckResult
-ClBinary::checkFeatures()
-{
- /* Validate that all cpu features of loaded binary target (i.e. elf_target) exists in current target.
- * If some of elf_target features doesn't exist in current target we fail the build since we assume that elf LLVM-IR and binary are
- * target specific and can't be recompiled to current target*/
- uint16_t target = (uint16_t)dev().settings().cpuFeatures_;
- uint16_t elf_target;
- amd::OclElf::oclElfPlatform platform;
- if (!elfIn()->getTarget(elf_target, platform)){
- LogError("Loading OCL CPU binary: incorrect format");
- return ERROR;
+ClBinary::FeatureCheckResult ClBinary::checkFeatures() {
+ /* Validate that all cpu features of loaded binary target (i.e. elf_target) exists in current
+ * target.
+ * If some of elf_target features doesn't exist in current target we fail the build since we
+ * assume that elf LLVM-IR and binary are
+ * target specific and can't be recompiled to current target*/
+ uint16_t target = (uint16_t)dev().settings().cpuFeatures_;
+ uint16_t elf_target;
+ amd::OclElf::oclElfPlatform platform;
+ if (!elfIn()->getTarget(elf_target, platform)) {
+ LogError("Loading OCL CPU binary: incorrect format");
+ return ERROR;
+ }
+ uint64_t chip_options = 0x0;
+ if (platform == amd::OclElf::COMPLIB_PLATFORM) {
+ // BIF 3.0
+ uint32_t flag;
+ if (!elfIn()->getFlags(flag)) {
+ LogError("Loading OCL CPU binary: incorrect format");
+ return ERROR;
}
- uint64_t chip_options=0x0;
- if (platform == amd::OclElf::COMPLIB_PLATFORM) {
- // BIF 3.0
- uint32_t flag;
- if (!elfIn()->getFlags(flag)) {
- LogError("Loading OCL CPU binary: incorrect format");
- return ERROR;
- }
- aclTargetInfo tgtInfo = aclGetTargetInfoFromChipID(LP64_SWITCH("x86", "x86-64"), flag, NULL);
- chip_options = aclGetChipOptions(tgtInfo) ;
- if (((target & chip_options) != chip_options) ||
- ((elf_target == EM_386) && (strcmp(LP64_SWITCH("x86", "x86-64"), "x86") != 0)) ||
- ((elf_target == EM_X86_64) && (strcmp(LP64_SWITCH("x86", "x86-64"), "x86-64") != 0))){
- LogError("Loading OCL CPU binary: different target");
- return ERROR;
- }
+ aclTargetInfo tgtInfo = aclGetTargetInfoFromChipID(LP64_SWITCH("x86", "x86-64"), flag, NULL);
+ chip_options = aclGetChipOptions(tgtInfo);
+ if (((target & chip_options) != chip_options) ||
+ ((elf_target == EM_386) && (strcmp(LP64_SWITCH("x86", "x86-64"), "x86") != 0)) ||
+ ((elf_target == EM_X86_64) && (strcmp(LP64_SWITCH("x86", "x86-64"), "x86-64") != 0))) {
+ LogError("Loading OCL CPU binary: different target");
+ return ERROR;
}
- else {
- // BIF 2.0
- if ((platform != amd::OclElf::CPU_PLATFORM) ||
- ((target & elf_target) != elf_target)) {
- LogError("Loading OCL CPU binary: different target");
- return ERROR;
- }
+ } else {
+ // BIF 2.0
+ if ((platform != amd::OclElf::CPU_PLATFORM) || ((target & elf_target) != elf_target)) {
+ LogError("Loading OCL CPU binary: different target");
+ return ERROR;
}
- char* section;
- size_t sz;
+ }
+ char* section;
+ size_t sz;
- /* If current target has more cpu features than the one for which the binary was (notice it must have all features as in elf_target
- * due to previous check), we can benefit from recompiling the LLVM-IR if exists in binary (if there are errors, ignore them !).*/
- if (((platform == amd::OclElf::CPU_PLATFORM) &&
- ((target ^ elf_target) != 0)) ||
- ((platform == amd::OclElf::COMPLIB_PLATFORM) &&
- ((target ^ chip_options) != 0))) {
- if (elfIn_->getSection(amd::OclElf::LLVMIR, §ion, &sz)) {
- if ((section != NULL) && (sz > 0)) {
- // hasDLL being false to force recompiling
- RECOMPILE;
- }
- }
+ /* If current target has more cpu features than the one for which the binary was (notice it must
+ * have all features as in elf_target
+ * due to previous check), we can benefit from recompiling the LLVM-IR if exists in binary (if
+ * there are errors, ignore them !).*/
+ if (((platform == amd::OclElf::CPU_PLATFORM) && ((target ^ elf_target) != 0)) ||
+ ((platform == amd::OclElf::COMPLIB_PLATFORM) && ((target ^ chip_options) != 0))) {
+ if (elfIn_->getSection(amd::OclElf::LLVMIR, §ion, &sz)) {
+ if ((section != NULL) && (sz > 0)) {
+ // hasDLL being false to force recompiling
+ RECOMPILE;
+ }
}
- return OK;
+ }
+ return OK;
}
-bool
-ClBinary::loadX86(Program& program, std::string& dllName, bool& hasDLL)
-{
- hasDLL = false;
+bool ClBinary::loadX86(Program& program, std::string& dllName, bool& hasDLL) {
+ hasDLL = false;
- std::string tempName = amd::Os::getTempFileName();
+ std::string tempName = amd::Os::getTempFileName();
- dllName = tempName
- + "." WINDOWS_SWITCH("dll",MACOS_SWITCH("dyld","so"));
+ dllName = tempName + "." WINDOWS_SWITCH("dll", MACOS_SWITCH("dyld", "so"));
- switch (checkFeatures()) {
+ switch (checkFeatures()) {
case ERROR:
return false;
case RECOMPILE:
@@ -91,67 +86,63 @@ ClBinary::loadX86(Program& program, std::string& dllName, bool& hasDLL)
case OK:
// Fallthrough
break;
- }
+ }
- char* section;
- size_t sz;
+ char* section;
+ size_t sz;
- if (!elfIn_->getSection(amd::OclElf::DLL, §ion, &sz)) {
- LogError("Loading OCL CPU binary: error occured!");
- return false;
- }
+ if (!elfIn_->getSection(amd::OclElf::DLL, §ion, &sz)) {
+ LogError("Loading OCL CPU binary: error occured!");
+ return false;
+ }
- if ((section == NULL) || (sz == 0)) {
- // hasDLL being false to force recompiling
- return true;
- }
+ if ((section == NULL) || (sz == 0)) {
+ // hasDLL being false to force recompiling
+ return true;
+ }
- std::fstream f;
- f.open(dllName.c_str(), (std::fstream::out | std::fstream::binary));
+ std::fstream f;
+ f.open(dllName.c_str(), (std::fstream::out | std::fstream::binary));
- if (!f.is_open()) {
+ if (!f.is_open()) {
#ifdef _WIN32
- amd::Os::unlink(tempName.c_str());
-#endif // _WIN32
- LogError("Loading OCL CPU binary: cannot open a file!");
- return false;
- }
- f.write(section, sz);
- f.close();
+ amd::Os::unlink(tempName.c_str());
+#endif // _WIN32
+ LogError("Loading OCL CPU binary: cannot open a file!");
+ return false;
+ }
+ f.write(section, sz);
+ f.close();
- hasDLL = true;
- return true;
+ hasDLL = true;
+ return true;
}
-bool
-ClBinary::storeX86(Program& program, std::string& dllName)
-{
- std::fstream f;
- f.open(dllName.c_str(), (std::fstream::in | std::fstream::binary));
- if (!f.is_open()) {
- return false;
- }
+bool ClBinary::storeX86(Program& program, std::string& dllName) {
+ std::fstream f;
+ f.open(dllName.c_str(), (std::fstream::in | std::fstream::binary));
+ if (!f.is_open()) {
+ return false;
+ }
- f.seekg(0, std::fstream::end);
- size_t x86CodeSize = f.tellg();
- f.seekg(0, std::fstream::beg);
+ f.seekg(0, std::fstream::end);
+ size_t x86CodeSize = f.tellg();
+ f.seekg(0, std::fstream::beg);
- if (saveISA()) {
- char* x86Code = new char[x86CodeSize];
- f.read(x86Code, x86CodeSize);
- elfOut_->addSection(amd::OclElf::DLL, x86Code, x86CodeSize);
- delete [] x86Code;
- }
- f.close();
- return true;
+ if (saveISA()) {
+ char* x86Code = new char[x86CodeSize];
+ f.read(x86Code, x86CodeSize);
+ elfOut_->addSection(amd::OclElf::DLL, x86Code, x86CodeSize);
+ delete[] x86Code;
+ }
+ f.close();
+ return true;
}
-bool
-ClBinary::loadX86JIT(Program& program, bool& hasJITBinary)
-{
+bool ClBinary::loadX86JIT(Program& program, bool& hasJITBinary) {
hasJITBinary = false;
- switch (checkFeatures()) {
+ switch (checkFeatures()) {
case ERROR:
return false;
case RECOMPILE:
@@ -159,66 +150,62 @@ ClBinary::loadX86JIT(Program& program, bool& hasJITBinary)
case OK:
// Fallthrough
break;
- }
+ }
- char* section;
- size_t sz;
+ char* section;
+ size_t sz;
- if (!elfIn_->getSection(amd::OclElf::JITBINARY, §ion, &sz)) {
- LogError("Loading OCL CPU JIT binary: error occured!");
- return false;
- }
+ if (!elfIn_->getSection(amd::OclElf::JITBINARY, §ion, &sz)) {
+ LogError("Loading OCL CPU JIT binary: error occured!");
+ return false;
+ }
- if ((section == NULL) || (sz == 0)) {
- // force recompiling
- return true;
- }
- acl_error err = ACL_SUCCESS;
- program.setJITBinary(aclJITObjectImageCopy(program.compiler(), section, sz, &err));
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageCopy failed");
- return false;
- }
- hasJITBinary = true;
+ if ((section == NULL) || (sz == 0)) {
+ // force recompiling
return true;
+ }
+ acl_error err = ACL_SUCCESS;
+ program.setJITBinary(aclJITObjectImageCopy(program.compiler(), section, sz, &err));
+ if (err != ACL_SUCCESS) {
+ LogWarning("aclJITObjectImageCopy failed");
+ return false;
+ }
+ hasJITBinary = true;
+ return true;
}
void checkDifference(const char* buf1, const char* buf2, size_t size) {
- for(size_t i = 0; i < size; ++i) {
- if(buf1[i] != buf2[i]) {
- printf("Index %d different",(int)i);
+ for (size_t i = 0; i < size; ++i) {
+ if (buf1[i] != buf2[i]) {
+ printf("Index %d different", (int)i);
return;
}
}
}
-bool
-ClBinary::storeX86JIT(Program& program)
-{
+bool ClBinary::storeX86JIT(Program& program) {
if (saveISA()) {
acl_error err = ACL_SUCCESS;
aclJITObjectImage objectImage = program.getJITBinary();
size_t x86CodeSize = aclJITObjectImageSize(program.compiler(), objectImage, &err);
if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageSize failed");
- return false;
+ LogWarning("aclJITObjectImageSize failed");
+ return false;
}
const char* x86CodePtr = aclJITObjectImageData(program.compiler(), objectImage, &err);
if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageData failed");
- return false;
+ LogWarning("aclJITObjectImageData failed");
+ return false;
}
elfOut_->addSection(amd::OclElf::JITBINARY, x86CodePtr, x86CodeSize);
}
return true;
}
-bool
-ClBinary::storeX86Asm(const char* buffer, size_t size)
-{
+bool ClBinary::storeX86Asm(const char* buffer, size_t size) {
if (saveAS()) {
elfOut_->addSection(amd::OclElf::ASTEXT, buffer, size);
}
return true;
}
-} // namespace cpu
+} // namespace cpu
diff --git a/rocclr/runtime/device/cpu/cpubinary.hpp b/rocclr/runtime/device/cpu/cpubinary.hpp
index 1fa9bcf21e..79ce0bdc34 100644
--- a/rocclr/runtime/device/cpu/cpubinary.hpp
+++ b/rocclr/runtime/device/cpu/cpubinary.hpp
@@ -17,69 +17,59 @@ class Device;
class Program;
//! \class CPU binary
-class ClBinary : public device::ClBinary
-{
-public:
- //! Constructor
- ClBinary(const Device& dev) : device::ClBinary(dev) {}
+class ClBinary : public device::ClBinary {
+ public:
+ //! Constructor
+ ClBinary(const Device& dev) : device::ClBinary(dev) {}
- //! Destructor
- ~ClBinary() {}
+ //! Destructor
+ ~ClBinary() {}
- //! Loads x86 executable code
- bool loadX86(
- Program& prorgam, //!< CPU Program object
- std::string& dllName, //!< Dll name of the CPU binary
- bool& hasDLL //!< indicate if the OCL binary has DLL
- );
+ //! Loads x86 executable code
+ bool loadX86(Program& prorgam, //!< CPU Program object
+ std::string& dllName, //!< Dll name of the CPU binary
+ bool& hasDLL //!< indicate if the OCL binary has DLL
+ );
- //! Stores x86 executable code
- bool storeX86(
- Program& program, //!< CPU Program object
- std::string& dllName //!< Dll name for the binary
- );
+ //! Stores x86 executable code
+ bool storeX86(Program& program, //!< CPU Program object
+ std::string& dllName //!< Dll name for the binary
+ );
- //! Loads x86 executable in-memory code
- bool loadX86JIT(
- Program& prorgam, //!< CPU Program object
- bool& hasJITBin //!< indicate if the OCL binary has JIT binary
- );
+ //! Loads x86 executable in-memory code
+ bool loadX86JIT(Program& prorgam, //!< CPU Program object
+ bool& hasJITBin //!< indicate if the OCL binary has JIT binary
+ );
- //! Stores x86 executable in-memory code
- bool storeX86JIT(
- Program& program //!< CPU Program object
- );
+ //! Stores x86 executable in-memory code
+ bool storeX86JIT(Program& program //!< CPU Program object
+ );
- //! Set elf header information for CPU target
- bool setElfTarget() {
- uint32_t target = dev().settings().cpuFeatures_;
- assert (((0xFFFF8000 & target) == 0) && "ASIC target ID >= 2^15");
- uint16_t elf_target = (uint16_t)(0x7FFF & target);
- return elfOut()->setTarget(elf_target, amd::OclElf::CPU_PLATFORM);
- }
+ //! Set elf header information for CPU target
+ bool setElfTarget() {
+ uint32_t target = dev().settings().cpuFeatures_;
+ assert(((0xFFFF8000 & target) == 0) && "ASIC target ID >= 2^15");
+ uint16_t elf_target = (uint16_t)(0x7FFF & target);
+ return elfOut()->setTarget(elf_target, amd::OclElf::CPU_PLATFORM);
+ }
bool storeX86Asm(const char* buffer, size_t size);
-private:
+ private:
+ enum FeatureCheckResult { ERROR, RECOMPILE, OK };
- enum FeatureCheckResult {
- ERROR,
- RECOMPILE,
- OK
- };
+ FeatureCheckResult checkFeatures();
- FeatureCheckResult checkFeatures();
+ //! Disable default copy constructor
+ ClBinary(const ClBinary&);
- //! Disable default copy constructor
- ClBinary(const ClBinary&);
+ //! Disable default operator=
+ ClBinary& operator=(const ClBinary&);
- //! Disable default operator=
- ClBinary& operator=(const ClBinary&);
-
- //! Returns the GPU device for this object
- const Device& dev() { return static_cast(dev_); }
+ //! Returns the GPU device for this object
+ const Device& dev() { return static_cast(dev_); }
};
-} // namespace cpu
+} // namespace cpu
-#endif // CPUBINARY_HPP_
+#endif // CPUBINARY_HPP_
diff --git a/rocclr/runtime/device/cpu/cpubuiltins.cpp b/rocclr/runtime/device/cpu/cpubuiltins.cpp
index a0896c97c5..b366134ad9 100644
--- a/rocclr/runtime/device/cpu/cpubuiltins.cpp
+++ b/rocclr/runtime/device/cpu/cpubuiltins.cpp
@@ -6,52 +6,47 @@
#include "device/cpu/cpucommand.hpp"
#include
-#include // for printf
+#include // for printf
#include
#define BUF_SIZE_PRINTF 4095
-//In the current implementation of printf in gcc 4.5.2 runtime libraries,inf/infinity and nan are not supported
-//The [-]infinity value is printed as [-]1.#INF00
-//The [-]nan value is printed as [-]1.#INF00
-//bufOutUpdate converts the all printed instanced of [-]1.#INF00 to inf,and
+// In the current implementation of printf in gcc 4.5.2 runtime libraries,inf/infinity and nan are
+// not supported
+// The [-]infinity value is printed as [-]1.#INF00
+// The [-]nan value is printed as [-]1.#INF00
+// bufOutUpdate converts the all printed instanced of [-]1.#INF00 to inf,and
// all printed instanced of [-]1.#IND00 to nan
-void bufOutUpdate(std::string& sBufOut,const char* strToReplace,const char* strReplace)
-{
- size_t foundIdx = 0;
- while ((foundIdx = sBufOut.find(strToReplace,foundIdx)) != std::string::npos) {
- sBufOut.replace(foundIdx,strlen(strToReplace),strReplace,strlen(strReplace));
- foundIdx += 3;
- }
+void bufOutUpdate(std::string& sBufOut, const char* strToReplace, const char* strReplace) {
+ size_t foundIdx = 0;
+ while ((foundIdx = sBufOut.find(strToReplace, foundIdx)) != std::string::npos) {
+ sBufOut.replace(foundIdx, strlen(strToReplace), strReplace, strlen(strReplace));
+ foundIdx += 3;
+ }
}
-int cpuprintf(const char* format,...)
-{
- char cBufOut[BUF_SIZE_PRINTF];
- std::string sBufOut;
- va_list args;
- va_start(args, format);
- //write to the buffer
- vsprintf(cBufOut,format,args);
- sBufOut = cBufOut;
+int cpuprintf(const char* format, ...) {
+ char cBufOut[BUF_SIZE_PRINTF];
+ std::string sBufOut;
+ va_list args;
+ va_start(args, format);
+ // write to the buffer
+ vsprintf(cBufOut, format, args);
+ sBufOut = cBufOut;
- //convert to correct infinity/nan representation
- bufOutUpdate(sBufOut,"1.#INF00","inf");
- bufOutUpdate(sBufOut,"1.#IND00","nan");
- bufOutUpdate(sBufOut,"1.#QNAN0","nan");
- int ret = amd::Os::printf("%s",sBufOut.c_str());
- fflush(stdout);
- va_end (args);
- return ret;
+ // convert to correct infinity/nan representation
+ bufOutUpdate(sBufOut, "1.#INF00", "inf");
+ bufOutUpdate(sBufOut, "1.#IND00", "nan");
+ bufOutUpdate(sBufOut, "1.#QNAN0", "nan");
+ int ret = amd::Os::printf("%s", sBufOut.c_str());
+ fflush(stdout);
+ va_end(args);
+ return ret;
}
namespace cpu {
-const clk_builtins_t
-Builtins::dispatchTable_ =
-{
+const clk_builtins_t Builtins::dispatchTable_ = {
/* Synchronization functions */
&WorkItem::barrier,
/* AMD Only builtins: FIXME_lmoriche: remove or add an extension */
- NULL,
- cpuprintf
-};
+ NULL, cpuprintf};
-} // namespace cpu
+} // namespace cpu
diff --git a/rocclr/runtime/device/cpu/cpubuiltins.hpp b/rocclr/runtime/device/cpu/cpubuiltins.hpp
index 2723730857..f50854e7b1 100644
--- a/rocclr/runtime/device/cpu/cpubuiltins.hpp
+++ b/rocclr/runtime/device/cpu/cpubuiltins.hpp
@@ -10,11 +10,10 @@
namespace cpu {
-struct Builtins : public amd::AllStatic
-{
- static const clk_builtins_t dispatchTable_;
+struct Builtins : public amd::AllStatic {
+ static const clk_builtins_t dispatchTable_;
};
-} // namespace cpu
+} // namespace cpu
#endif /*BUILTINS_HPP_*/
diff --git a/rocclr/runtime/device/cpu/cpucommand.cpp b/rocclr/runtime/device/cpu/cpucommand.cpp
index e8c3488b8c..95ca23fa70 100644
--- a/rocclr/runtime/device/cpu/cpucommand.cpp
+++ b/rocclr/runtime/device/cpu/cpucommand.cpp
@@ -21,676 +21,589 @@
namespace cpu {
-#define CPU_WORKER_THREAD_TOTAL_STACK_SIZE (CPU_WORKER_THREAD_STACK_SIZE + \
- CLK_PRIVATE_MEMORY_SIZE * (CPU_MAX_WORKGROUP_SIZE + 1))
+#define CPU_WORKER_THREAD_TOTAL_STACK_SIZE \
+ (CPU_WORKER_THREAD_STACK_SIZE + CLK_PRIVATE_MEMORY_SIZE * (CPU_MAX_WORKGROUP_SIZE + 1))
-WorkerThread::WorkerThread(const cpu::Device& device) :
- Thread("CPU Worker Thread", CPU_WORKER_THREAD_TOTAL_STACK_SIZE),
- queueLock_("WorkerThread::queueLock"), waitingOp_(0), terminated_(false)
-{
- localDataSize_ = (size_t) device.info().localMemSize_;
- localDataStorage_ = (address) amd::AlignedMemory::allocate(
- localDataSize_ + __CPU_SCRATCH_SIZE, sizeof(cl_long16));
+WorkerThread::WorkerThread(const cpu::Device& device)
+ : Thread("CPU Worker Thread", CPU_WORKER_THREAD_TOTAL_STACK_SIZE),
+ queueLock_("WorkerThread::queueLock"),
+ waitingOp_(0),
+ terminated_(false) {
+ localDataSize_ = (size_t)device.info().localMemSize_;
+ localDataStorage_ =
+ (address)amd::AlignedMemory::allocate(localDataSize_ + __CPU_SCRATCH_SIZE, sizeof(cl_long16));
#if defined(__linux__) && defined(NUMA_SUPPORT)
- const nodemask_t* numaMask = device.getNumaMask();
- if (numaMask != NULL) {
- numa_bind(numaMask);
- }
+ const nodemask_t* numaMask = device.getNumaMask();
+ if (numaMask != NULL) {
+ numa_bind(numaMask);
+ }
#endif
}
-WorkerThread::~WorkerThread()
-{
- guarantee(Thread::current() != this && "thread suicide!");
- amd::AlignedMemory::deallocate(localDataStorage_);
+WorkerThread::~WorkerThread() {
+ guarantee(Thread::current() != this && "thread suicide!");
+ amd::AlignedMemory::deallocate(localDataStorage_);
}
-bool
-WorkerThread::terminate()
-{
- terminated_ = true;
+bool WorkerThread::terminate() {
+ terminated_ = true;
- if (Thread::current() != this) {
- // FIXME_lmoriche: fix termination handshake
- while (state() < Thread::FINISHED) {
- flush();
- amd::Os::yield();
- }
+ if (Thread::current() != this) {
+ // FIXME_lmoriche: fix termination handshake
+ while (state() < Thread::FINISHED) {
+ flush();
+ amd::Os::yield();
}
+ }
- return true;
+ return true;
}
-void
-WorkerThread::enqueue(Operation& op)
-{
- while (waitingOp_ != 0) {
- amd::Os::yield();
- }
- op.clone(operation());
- ++waitingOp_;
+void WorkerThread::enqueue(Operation& op) {
+ while (waitingOp_ != 0) {
+ amd::Os::yield();
+ }
+ op.clone(operation());
+ ++waitingOp_;
}
-void
-WorkerThread::loop()
-{
- baseWorkItemsStack_ = amd::alignDown(stackBase() -
- CPU_WORKER_THREAD_STACK_SIZE, CLK_PRIVATE_MEMORY_SIZE);
+void WorkerThread::loop() {
+ baseWorkItemsStack_ =
+ amd::alignDown(stackBase() - CPU_WORKER_THREAD_STACK_SIZE, CLK_PRIVATE_MEMORY_SIZE);
#if defined(WIN32)
- amd::Os::touchStackPages(baseWorkItemsStack_, amd::Os::currentStackPtr());
-#endif // WINDOWS
- Operation *op = operation();
+ amd::Os::touchStackPages(baseWorkItemsStack_, amd::Os::currentStackPtr());
+#endif // WINDOWS
+ Operation* op = operation();
- queueLock_.lock();
- while (true) {
- while (waitingOp_ == 0) {
- if (terminated_) {
- break;
- }
- queueLock_.wait();
- }
- if (terminated_) {
- break;
- }
- op->command().setStatus(CL_RUNNING);
- op->execute();
- op->cleanup();
- --waitingOp_;
+ queueLock_.lock();
+ while (true) {
+ while (waitingOp_ == 0) {
+ if (terminated_) {
+ break;
+ }
+ queueLock_.wait();
}
- queueLock_.unlock();
+ if (terminated_) {
+ break;
+ }
+ op->command().setStatus(CL_RUNNING);
+ op->execute();
+ op->cleanup();
+ --waitingOp_;
+ }
+ queueLock_.unlock();
}
-void
-NativeFn::execute()
-{
- cl_int status = static_cast(command()).invoke();
- command().setStatus(status);
+void NativeFn::execute() {
+ cl_int status = static_cast(command()).invoke();
+ command().setStatus(status);
}
-static void
-nop() { /*Do nothing*/ }
+static void nop() { /*Do nothing*/
+}
template
-class NDRangeKernelBatchMode : public NDRangeKernelBatch
-{
-private:
- void executeWorkGroup(WorkGroup& wg)
- {
- if (NATURE == NATURE_WG_LEVEL_EXEC) {
- wg.executeWorkItem();
- }
- else if ((NATURE == NATURE_1_WORK_ITEM) ||
- (wg.getNumWorkItems() == 1)) {
- wg.executeWorkItem();
- }
- else {
- wg.getBaseWorkItem()->setNext(&wg.getWorkerThread().mainFiber());
- if (NATURE == NATURE_WITHOUT_BARRIER) {
- wg.executeWithoutBarrier();
- }
- else { // NATURE == NATURE_WITH_BARRIER
- wg.executeWithBarrier();
- }
- }
- // Yield at the end of each workgroup to avoid starving GPU device
- amd::Os::yield();
+ NDRangeKernelBatch::ExecutionOrder ORDER = NDRangeKernelBatch::ORDER_DEFAULT>
+class NDRangeKernelBatchMode : public NDRangeKernelBatch {
+ private:
+ void executeWorkGroup(WorkGroup& wg) {
+ if (NATURE == NATURE_WG_LEVEL_EXEC) {
+ wg.executeWorkItem();
+ } else if ((NATURE == NATURE_1_WORK_ITEM) || (wg.getNumWorkItems() == 1)) {
+ wg.executeWorkItem();
+ } else {
+ wg.getBaseWorkItem()->setNext(&wg.getWorkerThread().mainFiber());
+ if (NATURE == NATURE_WITHOUT_BARRIER) {
+ wg.executeWithoutBarrier();
+ } else { // NATURE == NATURE_WITH_BARRIER
+ wg.executeWithBarrier();
+ }
+ }
+ // Yield at the end of each workgroup to avoid starving GPU device
+ amd::Os::yield();
+ }
+
+ public:
+ void executeMode(WorkGroup& wg) {
+ const amd::NDRange& offset = static_cast(command_).sizes().offset();
+ WorkItem* workItem0 = wg.getBaseWorkItem();
+ clk_builtins_t tableTask;
+ size_t prevOpId = 0, opId = (size_t)-1;
+
+ if (NATURE == NATURE_1_WORK_ITEM) {
+ tableTask = Builtins::dispatchTable_;
+
+ // If local size == 1 then barrier() becomes a nop.
+ tableTask.barrier_ptr = (void (*)(cl_mem_fence_flags))nop;
+ workItem0->infoBlock().builtins = &tableTask;
+ workItem0->setNext(&wg.getWorkerThread().mainFiber());
}
-public:
- void executeMode(WorkGroup& wg)
- {
- const amd::NDRange& offset =
- static_cast(command_).sizes().offset();
- WorkItem* workItem0 = wg.getBaseWorkItem();
- clk_builtins_t tableTask;
- size_t prevOpId = 0, opId = (size_t)-1;
-
- if (NATURE == NATURE_1_WORK_ITEM) {
- tableTask = Builtins::dispatchTable_;
-
- // If local size == 1 then barrier() becomes a nop.
- tableTask.barrier_ptr = (void (*)(cl_mem_fence_flags)) nop;
- workItem0->infoBlock().builtins = &tableTask;
- workItem0->setNext(&wg.getWorkerThread().mainFiber());
- }
-
- while (getNextOperationId(opId)) {
- workItem0->incrementGroupId(groupIds_, offset, opId - prevOpId);
- uint workDims = workItem0->infoBlock().work_dim;
- size_t numWorkItems = workItem0->infoBlock().local_size[0] *
- (workDims >= 2 ? workItem0->infoBlock().local_size[1] : 1) *
- (workDims >= 3 ? workItem0->infoBlock().local_size[2] : 1);
- wg.setNumWorkItems(numWorkItems);
- if(numWorkItems == 1) {
- tableTask = Builtins::dispatchTable_;
- tableTask.barrier_ptr = (void (*)(cl_mem_fence_flags)) nop;
- workItem0->infoBlock().builtins = &tableTask;
- workItem0->setNext(&wg.getWorkerThread().mainFiber());
- executeWorkGroup(wg);
- tableTask.barrier_ptr = &WorkItem::barrier;
- } else {
- executeWorkGroup(wg);
- }
- prevOpId = opId;
- }
+ while (getNextOperationId(opId)) {
+ workItem0->incrementGroupId(groupIds_, offset, opId - prevOpId);
+ uint workDims = workItem0->infoBlock().work_dim;
+ size_t numWorkItems = workItem0->infoBlock().local_size[0] *
+ (workDims >= 2 ? workItem0->infoBlock().local_size[1] : 1) *
+ (workDims >= 3 ? workItem0->infoBlock().local_size[2] : 1);
+ wg.setNumWorkItems(numWorkItems);
+ if (numWorkItems == 1) {
+ tableTask = Builtins::dispatchTable_;
+ tableTask.barrier_ptr = (void (*)(cl_mem_fence_flags))nop;
+ workItem0->infoBlock().builtins = &tableTask;
+ workItem0->setNext(&wg.getWorkerThread().mainFiber());
+ executeWorkGroup(wg);
+ tableTask.barrier_ptr = &WorkItem::barrier;
+ } else {
+ executeWorkGroup(wg);
+ }
+ prevOpId = opId;
+ }
//#define DISABLE_TASK_STEALING
#if !defined(DISABLE_TASK_STEALING) && 0
- size_t maxId = numCores_;
- size_t stolenId = coreId_ + 1;
- NDRangeKernelBatch* workingBatch = this;
- size_t numStolenIds = 1;
- const size_t maxStealingSize = 3;
- const size_t minAdaptiveStealingDiff = numCores_ * maxStealingSize;
-
- while (true) {
- for (; stolenId < maxId; ++stolenId) {
- WorkerThread* worker = virtualDevice_.getWorkerThread(stolenId);
+ size_t maxId = numCores_;
+ size_t stolenId = coreId_ + 1;
+ NDRangeKernelBatch* workingBatch = this;
+ size_t numStolenIds = 1;
+ const size_t maxStealingSize = 3;
+ const size_t minAdaptiveStealingDiff = numCores_ * maxStealingSize;
- // In case were we have less operations than Worker Threads
- if (worker->isOperationValid()) {
- workingBatch = static_cast(
- worker->operation());
+ while (true) {
+ for (; stolenId < maxId; ++stolenId) {
+ WorkerThread* worker = virtualDevice_.getWorkerThread(stolenId);
- numStolenIds =
- workingBatch->getNextOperationIds(opId, numStolenIds);
- if (numStolenIds > 0) {
- do {
- for (size_t i = 0; i < numStolenIds; ++i) {
- workItem0->setGroupId(groupIds_, offset, opId);
- executeWorkGroup(wg);
- opId += numCores_;
- }
+ // In case were we have less operations than Worker Threads
+ if (worker->isOperationValid()) {
+ workingBatch = static_cast(worker->operation());
- // adaptive stealing
- if (numWorkGroups_ - opId > minAdaptiveStealingDiff) {
- numStolenIds = maxStealingSize;
- }
- else {
- while (workingBatch->getNextOperationId(opId)) {
- workItem0->setGroupId(groupIds_, offset, opId);
- executeWorkGroup(wg);
- }
- break;
- }
- numStolenIds = workingBatch->getNextOperationIds(
- opId, numStolenIds);
- } while (numStolenIds > 0);
- }
- numStolenIds = 1;
+ numStolenIds = workingBatch->getNextOperationIds(opId, numStolenIds);
+ if (numStolenIds > 0) {
+ do {
+ for (size_t i = 0; i < numStolenIds; ++i) {
+ workItem0->setGroupId(groupIds_, offset, opId);
+ executeWorkGroup(wg);
+ opId += numCores_;
+ }
+
+ // adaptive stealing
+ if (numWorkGroups_ - opId > minAdaptiveStealingDiff) {
+ numStolenIds = maxStealingSize;
+ } else {
+ while (workingBatch->getNextOperationId(opId)) {
+ workItem0->setGroupId(groupIds_, offset, opId);
+ executeWorkGroup(wg);
}
- } // for (stolenId..maxId)
-
- if (stolenId == coreId_) {
break;
- }
+ }
+ numStolenIds = workingBatch->getNextOperationIds(opId, numStolenIds);
+ } while (numStolenIds > 0);
+ }
+ numStolenIds = 1;
+ }
+ } // for (stolenId..maxId)
- stolenId = 0;
- maxId = coreId_;
- } // while (true)
+ if (stolenId == coreId_) {
+ break;
+ }
+
+ stolenId = 0;
+ maxId = coreId_;
+ } // while (true)
#endif
- }
+ }
};
-inline bool
-NDRangeKernelBatch::getNextOperationId(size_t& opId)
-{
- if (currentOpId_ >= numWorkGroups_) {
- return false;
- }
- opId = amd::AtomicOperation::add(numCores_, ¤tOpId_);
- return opId < numWorkGroups_;
+inline bool NDRangeKernelBatch::getNextOperationId(size_t& opId) {
+ if (currentOpId_ >= numWorkGroups_) {
+ return false;
+ }
+ opId = amd::AtomicOperation::add(numCores_, ¤tOpId_);
+ return opId < numWorkGroups_;
}
-inline size_t
-NDRangeKernelBatch::getNextOperationIds(size_t& opId, size_t count)
-{
- size_t topId = numCores_ * count;
- if (currentOpId_ >= numWorkGroups_) {
- return 0;
- }
+inline size_t NDRangeKernelBatch::getNextOperationIds(size_t& opId, size_t count) {
+ size_t topId = numCores_ * count;
+ if (currentOpId_ >= numWorkGroups_) {
+ return 0;
+ }
- opId = amd::AtomicOperation::add(topId, ¤tOpId_);
- const size_t numWorkGroups = numWorkGroups_;
- if (opId >= numWorkGroups) {
- return 0;
- }
+ opId = amd::AtomicOperation::add(topId, ¤tOpId_);
+ const size_t numWorkGroups = numWorkGroups_;
+ if (opId >= numWorkGroups) {
+ return 0;
+ }
- topId += opId;
- if (topId >= (numWorkGroups + numCores_)) {
- count -= (topId - numWorkGroups) / numCores_;
- }
+ topId += opId;
+ if (topId >= (numWorkGroups + numCores_)) {
+ count -= (topId - numWorkGroups) / numCores_;
+ }
- return count;
+ return count;
}
// Process the parameters, allocate LDS.
-bool
-NDRangeKernelBatch::patchParameters(
- const cpu::Kernel& cpuKernel,
- address params,
- address& localMemPtr,
- const address localMemLimit,
- size_t localMemSize) const
-{
- amd::NDRangeKernelCommand& command =
- static_cast(command_);
+bool NDRangeKernelBatch::patchParameters(const cpu::Kernel& cpuKernel, address params,
+ address& localMemPtr, const address localMemLimit,
+ size_t localMemSize) const {
+ amd::NDRangeKernelCommand& command = static_cast(command_);
- const amd::Device& device = command.queue()->device();
+ const amd::Device& device = command.queue()->device();
- const amd::Kernel& kernel = command.kernel();
- const amd::KernelSignature& signature = kernel.signature();
- const amd::KernelParameters& kernelParam = kernel.parameters();
+ const amd::Kernel& kernel = command.kernel();
+ const amd::KernelSignature& signature = kernel.signature();
+ const amd::KernelParameters& kernelParam = kernel.parameters();
- const_address cmdParams = command.parameters();
+ const_address cmdParams = command.parameters();
- unsigned effectiveOffset = 0;
+ unsigned effectiveOffset = 0;
- // DD -- on CPU device, real effective offset is NATIVELY aligned
- // Here all source arguments are in place, so we're safe just iterating
- for (size_t i = 0; i < signature.numParameters(); ++i) {
- const amd::KernelParameterDescriptor& desc = signature.at(i);
- const void* cmdParam = cmdParams + desc.offset_;
- void *param;
- size_t prmSize = cpuKernel.getArgSize(i);
+ // DD -- on CPU device, real effective offset is NATIVELY aligned
+ // Here all source arguments are in place, so we're safe just iterating
+ for (size_t i = 0; i < signature.numParameters(); ++i) {
+ const amd::KernelParameterDescriptor& desc = signature.at(i);
+ const void* cmdParam = cmdParams + desc.offset_;
+ void* param;
+ size_t prmSize = cpuKernel.getArgSize(i);
- // Align i'th parameter on multiple of its size. Parameter size is power of 2.
- size_t alignment = cpuKernel.getArgAlignment(i);
- effectiveOffset = amd::alignUp(effectiveOffset, std::min(alignment, size_t(16)));
- param = params + effectiveOffset;
- if (desc.size_ == 0) {
- // __local memory parameter
- localMemPtr = amd::alignUp(localMemPtr, sizeof(cl_long16));
+ // Align i'th parameter on multiple of its size. Parameter size is power of 2.
+ size_t alignment = cpuKernel.getArgAlignment(i);
+ effectiveOffset = amd::alignUp(effectiveOffset, std::min(alignment, size_t(16)));
+ param = params + effectiveOffset;
+ if (desc.size_ == 0) {
+ // __local memory parameter
+ localMemPtr = amd::alignUp(localMemPtr, sizeof(cl_long16));
- size_t length = *static_cast(cmdParam);
- *static_cast(param) = localMemPtr;
- localMemPtr += length;
+ size_t length = *static_cast(cmdParam);
+ *static_cast(param) = localMemPtr;
+ localMemPtr += length;
- if (localMemPtr > localMemLimit) {
- command.setException(CL_MEM_OBJECT_ALLOCATION_FAILURE);
- return false;
- }
- }
- else if (desc.type_ == T_POINTER) {
- // __global memory parameter
- cl_mem_object_type pointer_type = CL_MEM_OBJECT_BUFFER;
- if (kernelParam.boundToSvmPointer(device, cmdParams, i)) {
- *reinterpret_cast(param) =
- *reinterpret_cast(cmdParam);
- }
- else {
- void* hostMemPtr = NULL;
- amd::Memory* memArg =
- *reinterpret_cast(cmdParam);
- if (memArg != NULL) {
- hostMemPtr = memArg->getHostMem();
- if (hostMemPtr == NULL) {
- command.setException(CL_MEM_OBJECT_ALLOCATION_FAILURE);
- return false;
- }
- pointer_type = memArg->getType();
- }
- // For images on CPU devices, pass "struct {int4 p0; int4 p1}".
- // That allows an obvious implementation for
- // __amdil_get_image[23]d_params[01].
- // That makes the rest of the .bc implementation for
- // images relatively straight forward.
- if (pointer_type == CL_MEM_OBJECT_IMAGE1D ||
- pointer_type == CL_MEM_OBJECT_IMAGE2D ||
- pointer_type == CL_MEM_OBJECT_IMAGE3D ||
- pointer_type == CL_MEM_OBJECT_IMAGE1D_ARRAY ||
- pointer_type == CL_MEM_OBJECT_IMAGE1D_BUFFER ||
- pointer_type == CL_MEM_OBJECT_IMAGE2D_ARRAY) {
- amd::Image::Impl& impl = memArg->asImage()->getImpl();
- impl.reserved_ = hostMemPtr;
- *reinterpret_cast(param) = (void*)&impl;
- } else {
- *reinterpret_cast(param) = hostMemPtr;
- }
- }
- }
- else if (desc.type_ == T_SAMPLER) {
- // Switch from an Amd::Sampler to the 32bit integer
- // variable that is a clk_sampler.
- amd::Sampler* samplerArg =
- *reinterpret_cast(cmdParam);
- *reinterpret_cast(param) = (uint32_t)samplerArg->state();
- }
- else {
- //Using HCtoDCmap
- HCtoDCmap arg_map = cpuKernel.getHCtoDCmap(i);
- unsigned int arg_offset = effectiveOffset;
- int err_code = 0;
- int inStruct = 0;
- int sys_64bit = LP64_SWITCH(0, 1); // Mapping only required for 32 bit targets
- if (CPU_USE_ALIGNMENT_MAP == 0 && !sys_64bit) {
- effectiveOffset += arg_map.copy_params(param, cmdParam, arg_offset, err_code, inStruct);
- if (err_code) {
- return false;
- }
- prmSize = arg_map.dc_size;
- }
- else {
- ::memcpy(param, cmdParam, desc.size_);
- }
- }
- effectiveOffset += prmSize;
- }
-
- localMemPtr = amd::alignUp(localMemPtr, sizeof(cl_long16));
- if ((localMemPtr + localMemSize) > localMemLimit) {
+ if (localMemPtr > localMemLimit) {
command.setException(CL_MEM_OBJECT_ALLOCATION_FAILURE);
return false;
- }
-
- return true;
-}
-
-void
-NDRangeKernelBatch::execute()
-{
- amd::NDRangeKernelCommand& command =
- static_cast(command_);
-
- const cpu::Kernel& kernel = static_cast(
- *command.kernel().getDeviceKernel(command.queue()->device()));
-
- WorkerThread& thread = *WorkerThread::current();
-
- const size_t numWorkItems = command.sizes().local().product();
-
- address params = thread.baseWorkItemsStack();
- address baseLocalMemPtr = thread.localDataStorage();
- address patchedLocalMemPtr = thread.localDataStorage() + __CPU_SCRATCH_SIZE;
- if (!patchParameters(kernel, params,
- patchedLocalMemPtr, patchedLocalMemPtr + thread.localDataSize(),
- kernel.workGroupInfo()->localMemSize_)) {
- return;
- }
-
- WorkItem* workItem0 = ::new((WorkItem*)params - 1) WorkItem(
- command.sizes(), baseLocalMemPtr, patchedLocalMemPtr);
-
- WorkGroup wg(command, kernel, thread, params, workItem0, numWorkItems);
-
- if (numWorkItems == 1) {
- static_cast*>(this)->
- executeMode(wg);
- }
- else if (kernel.hasBarrier()) {
- static_cast*>(this)->
- executeMode(wg);
- }
- else {
- static_cast*>(this)->
- executeMode(wg);
- }
-}
-
-void
-WorkGroup::executeWorkItem()
-{
- callKernel((kernelentrypoint_t)kernel_.getEntryPoint(), workItem0_->nativeStackPtr());
-}
-
-void
-WorkGroup::executeWithBarrier()
-{
- kernelentrypoint_t entryPoint = (kernelentrypoint_t)kernel_.getEntryPoint();
-
- workingFiber_ = workItem0_;
- address workGroupStackPtr = workItem0_->nativeStackPtr();
-
- // Save the current stack context in case we execute a barrier.
- volatile size_t threadCounter = 0;
- bool barrier = !thread_.mainFiber().save();
-
- size_t tid = threadCounter++;
- WorkItem* workItem = (WorkItem*)((char*) workItem0_
- - tid * CLK_PRIVATE_MEMORY_SIZE);
-
- if (barrier) {
- WorkItem* prev = (WorkItem*)((char*) workItem
- + CLK_PRIVATE_MEMORY_SIZE);
-
- WINDOWS_ONLY(amd::Os::touchStackPages(
- (address) (workItem + 1), (address) prev));
- ::memcpy(workItem, prev, sizeof(WorkItem));
-
- clk_thread_info_block_t& tib = workItem->infoBlock();
- ++tib.local_id[0];
- if (unlikely(tib.local_id[0] >= tib.local_size[0])) {
- //
- // Compiling for Windows 64bit (only in release) introduces a bug,
- // which uses the same register for saving threadCounter and the
- // 0 value. Therefore "tib.local_id[i] = 0" was actually translated
- // to "tib.local_id[0] = threadCounter". To avoid this issue, and
- // still be able to store a 0 into tib.local_id[i], we trick the
- // compiler, by using the value in tib.local_id[3], which is always
- // initialized to 0.
- //
- tib.local_id[0] = tib.local_id[3];
-
- ++tib.local_id[1];
- if (unlikely(tib.local_id[1] >= tib.local_size[1])) {
- tib.local_id[1] = tib.local_id[3];
-
- ++tib.local_id[2];
- }
+ }
+ } else if (desc.type_ == T_POINTER) {
+ // __global memory parameter
+ cl_mem_object_type pointer_type = CL_MEM_OBJECT_BUFFER;
+ if (kernelParam.boundToSvmPointer(device, cmdParams, i)) {
+ *reinterpret_cast(param) = *reinterpret_cast(cmdParam);
+ } else {
+ void* hostMemPtr = NULL;
+ amd::Memory* memArg = *reinterpret_cast(cmdParam);
+ if (memArg != NULL) {
+ hostMemPtr = memArg->getHostMem();
+ if (hostMemPtr == NULL) {
+ command.setException(CL_MEM_OBJECT_ALLOCATION_FAILURE);
+ return false;
+ }
+ pointer_type = memArg->getType();
}
-
- // Link the previous workitem to this one.
- prev->setNext(workItem);
- // If this is the last workitem, complete the ring.
- if (tid >= numWorkItems_ - 1) {
- workItem->setNext(workItem0_);
+ // For images on CPU devices, pass "struct {int4 p0; int4 p1}".
+ // That allows an obvious implementation for
+ // __amdil_get_image[23]d_params[01].
+ // That makes the rest of the .bc implementation for
+ // images relatively straight forward.
+ if (pointer_type == CL_MEM_OBJECT_IMAGE1D || pointer_type == CL_MEM_OBJECT_IMAGE2D ||
+ pointer_type == CL_MEM_OBJECT_IMAGE3D || pointer_type == CL_MEM_OBJECT_IMAGE1D_ARRAY ||
+ pointer_type == CL_MEM_OBJECT_IMAGE1D_BUFFER ||
+ pointer_type == CL_MEM_OBJECT_IMAGE2D_ARRAY) {
+ amd::Image::Impl& impl = memArg->asImage()->getImpl();
+ impl.reserved_ = hostMemPtr;
+ *reinterpret_cast(param) = (void*)&impl;
+ } else {
+ *reinterpret_cast(param) = hostMemPtr;
}
+ }
+ } else if (desc.type_ == T_SAMPLER) {
+ // Switch from an Amd::Sampler to the 32bit integer
+ // variable that is a clk_sampler.
+ amd::Sampler* samplerArg = *reinterpret_cast(cmdParam);
+ *reinterpret_cast(param) = (uint32_t)samplerArg->state();
+ } else {
+ // Using HCtoDCmap
+ HCtoDCmap arg_map = cpuKernel.getHCtoDCmap(i);
+ unsigned int arg_offset = effectiveOffset;
+ int err_code = 0;
+ int inStruct = 0;
+ int sys_64bit = LP64_SWITCH(0, 1); // Mapping only required for 32 bit targets
+ if (CPU_USE_ALIGNMENT_MAP == 0 && !sys_64bit) {
+ effectiveOffset += arg_map.copy_params(param, cmdParam, arg_offset, err_code, inStruct);
+ if (err_code) {
+ return false;
+ }
+ prmSize = arg_map.dc_size;
+ } else {
+ ::memcpy(param, cmdParam, desc.size_);
+ }
}
+ effectiveOffset += prmSize;
+ }
- // Execute thread0
+ localMemPtr = amd::alignUp(localMemPtr, sizeof(cl_long16));
+ if ((localMemPtr + localMemSize) > localMemLimit) {
+ command.setException(CL_MEM_OBJECT_ALLOCATION_FAILURE);
+ return false;
+ }
- address workItemStackPtr = workItem->nativeStackPtr();
- callKernelProtectedReturn(entryPoint, workItemStackPtr);
-
- // Check if thread0 executed a barrier()
- if (threadCounter > 1) {
- workItem = (WorkItem*)workingFiber_;
- workingFiber_ = workingFiber_->next();
-
- tid = ((address)workItem0_ - (address)workItem)
- / CLK_PRIVATE_MEMORY_SIZE;
- if (tid == (numWorkItems_ - 1)) {
- // If we get here, we are done!
- return;
- }
- if (workItem->next() == &thread_.mainFiber()) {
- // Detected a deadlock
- command_.setException(CL_INVALID_KERNEL);
- return;
- }
-
- // Schedule the next workitem.
- workItem->next()->restore();
- ShouldNotReachHere();
- }
-
- // Execute thread1...threadN
- callKernelRange(entryPoint, workItemStackPtr, workItem->infoBlock());
+ return true;
}
-void
-WorkGroup::executeWithoutBarrier()
-{
- kernelentrypoint_t entryPoint = (kernelentrypoint_t)kernel_.getEntryPoint();
- address workItemStackPtr = workItem0_->nativeStackPtr();
+void NDRangeKernelBatch::execute() {
+ amd::NDRangeKernelCommand& command = static_cast(command_);
- // Execute thread0
- callKernel(entryPoint, workItemStackPtr);
+ const cpu::Kernel& kernel =
+ static_cast(*command.kernel().getDeviceKernel(command.queue()->device()));
- // Execute thread1...threadN
- callKernelRange(entryPoint, workItemStackPtr, workItem0_->infoBlock());
+ WorkerThread& thread = *WorkerThread::current();
+
+ const size_t numWorkItems = command.sizes().local().product();
+
+ address params = thread.baseWorkItemsStack();
+ address baseLocalMemPtr = thread.localDataStorage();
+ address patchedLocalMemPtr = thread.localDataStorage() + __CPU_SCRATCH_SIZE;
+ if (!patchParameters(kernel, params, patchedLocalMemPtr,
+ patchedLocalMemPtr + thread.localDataSize(),
+ kernel.workGroupInfo()->localMemSize_)) {
+ return;
+ }
+
+ WorkItem* workItem0 =
+ ::new ((WorkItem*)params - 1) WorkItem(command.sizes(), baseLocalMemPtr, patchedLocalMemPtr);
+
+ WorkGroup wg(command, kernel, thread, params, workItem0, numWorkItems);
+
+ if (numWorkItems == 1) {
+ static_cast*>(this)->executeMode(wg);
+ } else if (kernel.hasBarrier()) {
+ static_cast*>(this)->executeMode(wg);
+ } else {
+ static_cast*>(this)->executeMode(wg);
+ }
}
-void
-WorkGroup::callKernelRange(kernelentrypoint_t entryPoint,
- address stackPtr,
- clk_thread_info_block_t& tib)
-{
- while (true) {
- ++tib.local_id[0];
- if (unlikely(tib.local_id[0] >= tib.local_size[0])) {
- tib.local_id[0] = 0;
+void WorkGroup::executeWorkItem() {
+ callKernel((kernelentrypoint_t)kernel_.getEntryPoint(), workItem0_->nativeStackPtr());
+}
- ++tib.local_id[1];
- if (unlikely(tib.local_id[1] >= tib.local_size[1])) {
- tib.local_id[1] = 0;
+void WorkGroup::executeWithBarrier() {
+ kernelentrypoint_t entryPoint = (kernelentrypoint_t)kernel_.getEntryPoint();
- ++tib.local_id[2];
- if (unlikely(tib.local_id[2] >= tib.local_size[2])) {
- tib.local_id[2] = 0;
+ workingFiber_ = workItem0_;
+ address workGroupStackPtr = workItem0_->nativeStackPtr();
- return;
- }
- }
- }
+ // Save the current stack context in case we execute a barrier.
+ volatile size_t threadCounter = 0;
+ bool barrier = !thread_.mainFiber().save();
- callKernel(entryPoint, stackPtr);
+ size_t tid = threadCounter++;
+ WorkItem* workItem = (WorkItem*)((char*)workItem0_ - tid * CLK_PRIVATE_MEMORY_SIZE);
+
+ if (barrier) {
+ WorkItem* prev = (WorkItem*)((char*)workItem + CLK_PRIVATE_MEMORY_SIZE);
+
+ WINDOWS_ONLY(amd::Os::touchStackPages((address)(workItem + 1), (address)prev));
+ ::memcpy(workItem, prev, sizeof(WorkItem));
+
+ clk_thread_info_block_t& tib = workItem->infoBlock();
+ ++tib.local_id[0];
+ if (unlikely(tib.local_id[0] >= tib.local_size[0])) {
+ //
+ // Compiling for Windows 64bit (only in release) introduces a bug,
+ // which uses the same register for saving threadCounter and the
+ // 0 value. Therefore "tib.local_id[i] = 0" was actually translated
+ // to "tib.local_id[0] = threadCounter". To avoid this issue, and
+ // still be able to store a 0 into tib.local_id[i], we trick the
+ // compiler, by using the value in tib.local_id[3], which is always
+ // initialized to 0.
+ //
+ tib.local_id[0] = tib.local_id[3];
+
+ ++tib.local_id[1];
+ if (unlikely(tib.local_id[1] >= tib.local_size[1])) {
+ tib.local_id[1] = tib.local_id[3];
+
+ ++tib.local_id[2];
+ }
}
+
+ // Link the previous workitem to this one.
+ prev->setNext(workItem);
+ // If this is the last workitem, complete the ring.
+ if (tid >= numWorkItems_ - 1) {
+ workItem->setNext(workItem0_);
+ }
+ }
+
+ // Execute thread0
+
+ address workItemStackPtr = workItem->nativeStackPtr();
+ callKernelProtectedReturn(entryPoint, workItemStackPtr);
+
+ // Check if thread0 executed a barrier()
+ if (threadCounter > 1) {
+ workItem = (WorkItem*)workingFiber_;
+ workingFiber_ = workingFiber_->next();
+
+ tid = ((address)workItem0_ - (address)workItem) / CLK_PRIVATE_MEMORY_SIZE;
+ if (tid == (numWorkItems_ - 1)) {
+ // If we get here, we are done!
+ return;
+ }
+ if (workItem->next() == &thread_.mainFiber()) {
+ // Detected a deadlock
+ command_.setException(CL_INVALID_KERNEL);
+ return;
+ }
+
+ // Schedule the next workitem.
+ workItem->next()->restore();
+ ShouldNotReachHere();
+ }
+
+ // Execute thread1...threadN
+ callKernelRange(entryPoint, workItemStackPtr, workItem->infoBlock());
}
-WorkItem::WorkItem(const amd::NDRangeContainer& sizes,
- void* scratchMemPtr,
- void* localMemPtr)
-{
- const amd::NDRange& local = sizes.local();
- const amd::NDRange& global = sizes.global();
- const amd::NDRange& offset = sizes.offset();
- const size_t dims = sizes.dimensions();
+void WorkGroup::executeWithoutBarrier() {
+ kernelentrypoint_t entryPoint = (kernelentrypoint_t)kernel_.getEntryPoint();
+ address workItemStackPtr = workItem0_->nativeStackPtr();
- tib_.builtins = &Builtins::dispatchTable_;
- tib_.local_mem_base = localMemPtr;
- tib_.local_scratch = scratchMemPtr;
- tib_.table_base = (const void *)cpuTables;
- tib_.work_dim = (cl_uint) sizes.dimensions();
+ // Execute thread0
+ callKernel(entryPoint, workItemStackPtr);
- for (size_t i = 0; i < dims; ++i) {
+ // Execute thread1...threadN
+ callKernelRange(entryPoint, workItemStackPtr, workItem0_->infoBlock());
+}
+
+void WorkGroup::callKernelRange(kernelentrypoint_t entryPoint, address stackPtr,
+ clk_thread_info_block_t& tib) {
+ while (true) {
+ ++tib.local_id[0];
+ if (unlikely(tib.local_id[0] >= tib.local_size[0])) {
+ tib.local_id[0] = 0;
+
+ ++tib.local_id[1];
+ if (unlikely(tib.local_id[1] >= tib.local_size[1])) {
+ tib.local_id[1] = 0;
+
+ ++tib.local_id[2];
+ if (unlikely(tib.local_id[2] >= tib.local_size[2])) {
+ tib.local_id[2] = 0;
+
+ return;
+ }
+ }
+ }
+
+ callKernel(entryPoint, stackPtr);
+ }
+}
+
+WorkItem::WorkItem(const amd::NDRangeContainer& sizes, void* scratchMemPtr, void* localMemPtr) {
+ const amd::NDRange& local = sizes.local();
+ const amd::NDRange& global = sizes.global();
+ const amd::NDRange& offset = sizes.offset();
+ const size_t dims = sizes.dimensions();
+
+ tib_.builtins = &Builtins::dispatchTable_;
+ tib_.local_mem_base = localMemPtr;
+ tib_.local_scratch = scratchMemPtr;
+ tib_.table_base = (const void*)cpuTables;
+ tib_.work_dim = (cl_uint)sizes.dimensions();
+
+ for (size_t i = 0; i < dims; ++i) {
+ tib_.global_offset[i] = offset[i];
+ tib_.global_size[i] = global[i];
+ tib_.local_size[i] = local[i];
+ tib_.enqueued_local_size[i] = local[i];
+ tib_.local_id[i] = 0;
+ tib_.group_id[i] = 0;
+ }
+
+ // Fill the remaining dimensions.
+ for (size_t i = dims; i < sizeof(tib_.global_size) / sizeof(size_t); ++i) {
+ tib_.global_offset[i] = 0;
+ tib_.global_size[i] = 1;
+ tib_.local_size[i] = 1;
+ tib_.enqueued_local_size[i] = 1;
+ tib_.local_id[i] = 0;
+ tib_.group_id[i] = 0;
+ }
+}
+
+ALWAYSINLINE void WorkItem::setGroupId(const amd::NDRange& rangeLimits, const amd::NDRange& offset,
+ size_t n) {
+ const size_t dims = rangeLimits.dimensions();
+ for (size_t i = 0; i < dims; ++i) {
+ size_t lim = rangeLimits[i];
+ size_t& val = tib_.group_id[i];
+ val = n;
+ if (n < lim) {
+ tib_.global_offset[i] = offset[i] + val * tib_.enqueued_local_size[i];
+ tib_.local_id[i] = 0;
+ tib_.local_size[i] = std::min(tib_.enqueued_local_size[i],
+ tib_.global_size[i] - (val * tib_.enqueued_local_size[i]));
+
+ ++i;
+ for (; i < dims; ++i) {
tib_.global_offset[i] = offset[i];
- tib_.global_size[i] = global[i];
- tib_.local_size[i] = local[i];
- tib_.enqueued_local_size[i] = local[i];
- tib_.local_id[i] = 0;
- tib_.group_id[i] = 0;
- }
-
- // Fill the remaining dimensions.
- for (size_t i = dims; i < sizeof(tib_.global_size)/sizeof(size_t); ++i) {
- tib_.global_offset[i] = 0;
- tib_.global_size[i] = 1;
- tib_.local_size[i] = 1;
- tib_.enqueued_local_size[i] = 1;
tib_.local_id[i] = 0;
tib_.group_id[i] = 0;
+ }
+ break;
+ } else {
+ n /= lim;
+ val -= n * lim;
+ tib_.global_offset[i] = offset[i] + val * tib_.enqueued_local_size[i];
+ tib_.local_id[i] = 0;
+ tib_.local_size[i] = std::min(tib_.enqueued_local_size[i],
+ tib_.global_size[i] - (val * tib_.enqueued_local_size[i]));
}
+ }
}
-ALWAYSINLINE void
-WorkItem::setGroupId(
- const amd::NDRange& rangeLimits,
- const amd::NDRange& offset,
- size_t n)
-{
- const size_t dims = rangeLimits.dimensions();
- for (size_t i = 0; i < dims; ++i) {
- size_t lim = rangeLimits[i];
- size_t& val = tib_.group_id[i];
- val = n;
- if (n < lim) {
- tib_.global_offset[i] =
- offset[i] + val * tib_.enqueued_local_size[i];
- tib_.local_id[i] = 0;
- tib_.local_size[i] =
- std::min(tib_.enqueued_local_size[i],
- tib_.global_size[i] - (val * tib_.enqueued_local_size[i]));
-
- ++i;
- for (; i < dims; ++i) {
- tib_.global_offset[i] = offset[i];
- tib_.local_id[i] = 0;
- tib_.group_id[i] = 0;
- }
- break;
- }
- else {
- n /= lim;
- val -= n * lim;
- tib_.global_offset[i] =
- offset[i] + val * tib_.enqueued_local_size[i];
- tib_.local_id[i] = 0;
- tib_.local_size[i] =
- std::min(tib_.enqueued_local_size[i],
- tib_.global_size[i] - (val * tib_.enqueued_local_size[i]));
- }
+ALWAYSINLINE void WorkItem::incrementGroupId(const amd::NDRange& rangeLimits,
+ const amd::NDRange& offset, size_t n) {
+ const size_t dims = rangeLimits.dimensions();
+ for (size_t i = 0; i < dims; ++i) {
+ size_t lim = rangeLimits[i];
+ size_t& val = tib_.group_id[i];
+ val += n;
+ if (val < lim) {
+ tib_.global_offset[i] = offset[i] + val * tib_.enqueued_local_size[i];
+ tib_.local_id[i] = 0;
+ tib_.local_size[i] = std::min(tib_.enqueued_local_size[i],
+ tib_.global_size[i] - (val * tib_.enqueued_local_size[i]));
+ break;
+ } else {
+ n = val / lim;
+ val -= n * lim;
+ tib_.global_offset[i] = offset[i] + val * tib_.enqueued_local_size[i];
+ tib_.local_id[i] = 0;
+ tib_.local_size[i] = std::min(tib_.enqueued_local_size[i],
+ tib_.global_size[i] - (val * tib_.enqueued_local_size[i]));
}
+ }
}
-ALWAYSINLINE void
-WorkItem::incrementGroupId(
- const amd::NDRange& rangeLimits,
- const amd::NDRange& offset,
- size_t n)
-{
- const size_t dims = rangeLimits.dimensions();
- for (size_t i = 0; i < dims; ++i) {
- size_t lim = rangeLimits[i];
- size_t& val = tib_.group_id[i];
- val += n;
- if (val < lim) {
- tib_.global_offset[i] =
- offset[i] + val * tib_.enqueued_local_size[i];
- tib_.local_id[i] = 0;
- tib_.local_size[i] =
- std::min(tib_.enqueued_local_size[i],
- tib_.global_size[i] - (val * tib_.enqueued_local_size[i]));
- break;
- }
- else {
- n = val / lim;
- val -= n * lim;
- tib_.global_offset[i] =
- offset[i] + val * tib_.enqueued_local_size[i];
- tib_.local_id[i] = 0;
- tib_.local_size[i] =
- std::min(tib_.enqueued_local_size[i],
- tib_.global_size[i] - (val * tib_.enqueued_local_size[i]));
- }
- }
+void WorkItem::barrier(cl_mem_fence_flags flags) {
+ WorkItem* workItem = WorkItem::current();
+ workItem->swap(workItem->next());
}
-void
-WorkItem::barrier(cl_mem_fence_flags flags)
-{
- WorkItem* workItem = WorkItem::current();
- workItem->swap(workItem->next());
+void Operation::cleanup() {
+ cl_int lastException = command().exception();
+ cl_int status = (lastException != 0) ? lastException : CL_COMPLETE;
+
+ Counter* counter = reinterpret_cast(command().data());
+ if (counter == NULL) {
+ command().setStatus(status);
+ } else if (counter->decrement() == 0) {
+ counter->event().setStatus(status);
+ }
}
-void Operation::cleanup()
-{
- cl_int lastException = command().exception();
- cl_int status = (lastException != 0) ? lastException : CL_COMPLETE;
-
- Counter* counter = reinterpret_cast(command().data());
- if (counter == NULL) {
- command().setStatus(status);
- }
- else if (counter->decrement() == 0) {
- counter->event().setStatus(status);
- }
-}
-
-} // namespace cpu
+} // namespace cpu
diff --git a/rocclr/runtime/device/cpu/cpucommand.hpp b/rocclr/runtime/device/cpu/cpucommand.hpp
index abd195da0b..d5b4e35e83 100644
--- a/rocclr/runtime/device/cpu/cpucommand.hpp
+++ b/rocclr/runtime/device/cpu/cpucommand.hpp
@@ -15,7 +15,7 @@
#if defined(ATI_ARCH_ARM)
#include
-#endif // ATI_ARCH_ARM
+#endif // ATI_ARCH_ARM
namespace cpu {
@@ -27,94 +27,91 @@ namespace cpu {
*/
//! A saved stack context
-class StackContext : public amd::StackObject
-{
-private:
+class StackContext : public amd::StackObject {
+ private:
#if defined(ATI_ARCH_ARM)
- jmp_buf env_;
+ jmp_buf env_;
#elif defined(_WIN64)
- intptr_t __declspec(align(16)) regs_[32];
-#else // !_WIN64
- intptr_t regs_[LP64_SWITCH(6,8)];
-#endif // !_WIN64
+ intptr_t __declspec(align(16)) regs_[32];
+#else // !_WIN64
+ intptr_t regs_[LP64_SWITCH(6, 8)];
+#endif // !_WIN64
-public:
- //! Save the stack context. Return 0 if returning directly.
- inline intptr_t setjmp();
+ public:
+ //! Save the stack context. Return 0 if returning directly.
+ inline intptr_t setjmp();
- //! Restore the stack context
- inline void longjmp(intptr_t val) const;
+ //! Restore the stack context
+ inline void longjmp(intptr_t val) const;
};
//! A thread fiber
-class Fiber : public amd::StackObject
-{
-private:
- //! Next fiber in the thread.
- Fiber* next_;
+class Fiber : public amd::StackObject {
+ private:
+ //! Next fiber in the thread.
+ Fiber* next_;
- //! This fiber's saved state.
- StackContext context_;
+ //! This fiber's saved state.
+ StackContext context_;
-public:
- //! Construct a new Fiber
- Fiber() : next_(NULL) { }
+ public:
+ //! Construct a new Fiber
+ Fiber() : next_(NULL) {}
- //! Return the next fiber in the current thread.
- const Fiber* next() const { return next_; }
- //! Set the next fiber in the current thread.
- void setNext(Fiber* next) { next_ = next; }
+ //! Return the next fiber in the current thread.
+ const Fiber* next() const { return next_; }
+ //! Set the next fiber in the current thread.
+ void setNext(Fiber* next) { next_ = next; }
- //! Save the state of this fiber. Return true if directly returning.
- ALWAYSINLINE bool save() { return context_.setjmp() == 0; }
- //! Restore this fiber from the saved context.
- void restore() const { context_.longjmp(1); }
+ //! Save the state of this fiber. Return true if directly returning.
+ ALWAYSINLINE bool save() { return context_.setjmp() == 0; }
+ //! Restore this fiber from the saved context.
+ void restore() const { context_.longjmp(1); }
- //! Switch to the given fiber.
- void swap(const Fiber* fiber) { if (save()) { fiber->restore(); } }
+ //! Switch to the given fiber.
+ void swap(const Fiber* fiber) {
+ if (save()) {
+ fiber->restore();
+ }
+ }
};
-
//! A CPU core operation (enqueued in the worker thread queue)
-class Operation : public amd::HeapObject
-{
-public:
- //! An atomic counter
- class Counter
- {
- // FIXME_lmoriche: recycle the counters, implement a thread local pool.
- private:
- amd::Event& event_;
- //! The atomic counter value.
- amd::Atomic counter_;
+class Operation : public amd::HeapObject {
+ public:
+ //! An atomic counter
+ class Counter {
+ // FIXME_lmoriche: recycle the counters, implement a thread local pool.
+ private:
+ amd::Event& event_;
+ //! The atomic counter value.
+ amd::Atomic counter_;
- public:
- //! Initialize the counter with the given initial value.
- Counter(amd::Event& event, size_t initialValue) :
- event_(event), counter_(initialValue) { }
- //! Return the event associated with this counter.
- amd::Event& event() { return event_; }
- //! Decrement the counter and return the new value.
- size_t decrement() { return --counter_; }
- };
+ public:
+ //! Initialize the counter with the given initial value.
+ Counter(amd::Event& event, size_t initialValue) : event_(event), counter_(initialValue) {}
+ //! Return the event associated with this counter.
+ amd::Event& event() { return event_; }
+ //! Decrement the counter and return the new value.
+ size_t decrement() { return --counter_; }
+ };
-protected:
- amd::Command& command_;
+ protected:
+ amd::Command& command_;
-public:
- Operation(amd::Command& command) : command_(command)
- { }
+ public:
+ Operation(amd::Command& command) : command_(command) {}
- virtual ~Operation() {};
+ virtual ~Operation(){};
- virtual void clone(Operation* buf) = 0;
+ virtual void clone(Operation* buf) = 0;
- void cleanup();
+ void cleanup();
- amd::Command& command() { return command_;}
+ amd::Command& command() { return command_; }
- virtual void execute() = 0;
+ virtual void execute() = 0;
};
/*! @}
@@ -123,243 +120,210 @@ public:
*/
//! A work item instance
-class WorkItem : public Fiber
-{
-private:
- //! Thread info block (must be the last field).
- clk_thread_info_block_t tib_;
+class WorkItem : public Fiber {
+ private:
+ //! Thread info block (must be the last field).
+ clk_thread_info_block_t tib_;
-private:
- //! Cannot be deleted (allocated with placement new).
- void operator delete(void*) { ShouldNotCallThis(); }
+ private:
+ //! Cannot be deleted (allocated with placement new).
+ void operator delete(void*) { ShouldNotCallThis(); }
-public:
- //! Initialize this workgroup.
- WorkItem(
- const amd::NDRangeContainer& size,
- void* scratchMemPtr,
- void* localMemPtr);
+ public:
+ //! Initialize this workgroup.
+ WorkItem(const amd::NDRangeContainer& size, void* scratchMemPtr, void* localMemPtr);
- //! Return the current WorkItem (based of the current stack pointer).
- static WorkItem* current() {
- return (WorkItem*)amd::alignUp((intptr_t) amd::Os::currentStackPtr(),
- CLK_PRIVATE_MEMORY_SIZE) - 1;
- }
+ //! Return the current WorkItem (based of the current stack pointer).
+ static WorkItem* current() {
+ return (WorkItem*)amd::alignUp((intptr_t)amd::Os::currentStackPtr(), CLK_PRIVATE_MEMORY_SIZE) -
+ 1;
+ }
- clk_thread_info_block_t& infoBlock() { return tib_; }
+ clk_thread_info_block_t& infoBlock() { return tib_; }
- //! Return the native stack pointer base for this workitem.
- address nativeStackPtr() const {
- address newSp = amd::alignDown((address) this - CPUKERNEL_STACK_ALIGN,
- CPUKERNEL_STACK_ALIGN);
- WINDOWS_ONLY(NOT_WIN64(newSp += sizeof(void*)));
- return newSp;
- }
+ //! Return the native stack pointer base for this workitem.
+ address nativeStackPtr() const {
+ address newSp = amd::alignDown((address) this - CPUKERNEL_STACK_ALIGN, CPUKERNEL_STACK_ALIGN);
+ WINDOWS_ONLY(NOT_WIN64(newSp += sizeof(void*)));
+ return newSp;
+ }
- //! These functions are mapping "n" from 1d index to the required dimension
- inline void setGroupId(
- const amd::NDRange& rangeLimits,
- const amd::NDRange& offset,
- size_t n);
- inline void incrementGroupId(
- const amd::NDRange& rangeLimits,
- const amd::NDRange& offset,
- size_t n);
+ //! These functions are mapping "n" from 1d index to the required dimension
+ inline void setGroupId(const amd::NDRange& rangeLimits, const amd::NDRange& offset, size_t n);
+ inline void incrementGroupId(const amd::NDRange& rangeLimits, const amd::NDRange& offset,
+ size_t n);
- //! Execute a thread synchronization barrier.
- static void barrier(cl_mem_fence_flags flags);
+ //! Execute a thread synchronization barrier.
+ static void barrier(cl_mem_fence_flags flags);
};
typedef void (*kernelentrypoint_t)(const void*);
//! Execute a workgroup (work-items).
-class WorkGroup
-{
-private:
- amd::NDRangeKernelCommand& command_;
- const cpu::Kernel& kernel_;
- WorkerThread& thread_;
- address params_;
- WorkItem* const workItem0_;
- const Fiber* workingFiber_;
- size_t numWorkItems_;
+class WorkGroup {
+ private:
+ amd::NDRangeKernelCommand& command_;
+ const cpu::Kernel& kernel_;
+ WorkerThread& thread_;
+ address params_;
+ WorkItem* const workItem0_;
+ const Fiber* workingFiber_;
+ size_t numWorkItems_;
-public:
- WorkGroup(
- amd::NDRangeKernelCommand& parent,
- const cpu::Kernel& kernel,
- WorkerThread& thread,
- address params,
- WorkItem* workItem0,
- const size_t numWorkItems) :
- command_(parent),
- kernel_(kernel),
- thread_(thread),
- params_(params),
- workItem0_(workItem0),
- numWorkItems_(numWorkItems)
- { }
+ public:
+ WorkGroup(amd::NDRangeKernelCommand& parent, const cpu::Kernel& kernel, WorkerThread& thread,
+ address params, WorkItem* workItem0, const size_t numWorkItems)
+ : command_(parent),
+ kernel_(kernel),
+ thread_(thread),
+ params_(params),
+ workItem0_(workItem0),
+ numWorkItems_(numWorkItems) {}
- WorkItem* getBaseWorkItem() { return workItem0_; }
- WorkerThread& getWorkerThread() { return thread_; }
+ WorkItem* getBaseWorkItem() { return workItem0_; }
+ WorkerThread& getWorkerThread() { return thread_; }
- void executeWorkItem(); // In case of 1 WorkItem
- void executeWithBarrier();
- void executeWithoutBarrier();
+ void executeWorkItem(); // In case of 1 WorkItem
+ void executeWithBarrier();
+ void executeWithoutBarrier();
- void setNumWorkItems(size_t workItems) { numWorkItems_ = workItems; }
- size_t getNumWorkItems() { return numWorkItems_; }
-private:
- void callKernelRange(
- kernelentrypoint_t entryPoint,
- address stackPtr,
- clk_thread_info_block_t& tib);
- inline void callKernel(
- kernelentrypoint_t entryPoint,
- address stackPtr);
- inline void callKernelProtectedReturn(
- kernelentrypoint_t entryPoint,
- address stackPtr);
+ void setNumWorkItems(size_t workItems) { numWorkItems_ = workItems; }
+ size_t getNumWorkItems() { return numWorkItems_; }
+
+ private:
+ void callKernelRange(kernelentrypoint_t entryPoint, address stackPtr,
+ clk_thread_info_block_t& tib);
+ inline void callKernel(kernelentrypoint_t entryPoint, address stackPtr);
+ inline void callKernelProtectedReturn(kernelentrypoint_t entryPoint, address stackPtr);
};
-class NDRangeKernelBatch : public Operation
-{
-protected:
- size_t coreId_;
- const size_t numWorkGroups_;
- const size_t numCores_;
- volatile size_t currentOpId_;
- const amd::NDRange groupIds_; //!< Number of groups in each dimensions
- VirtualCPU& virtualDevice_;
+class NDRangeKernelBatch : public Operation {
+ protected:
+ size_t coreId_;
+ const size_t numWorkGroups_;
+ const size_t numCores_;
+ volatile size_t currentOpId_;
+ const amd::NDRange groupIds_; //!< Number of groups in each dimensions
+ VirtualCPU& virtualDevice_;
-public:
- enum ExecutionOrder {
- ORDER_DEFAULT,
- ORDER_ROUND_ROBIN = ORDER_DEFAULT,
- //ORDER_LINEAR
- };
+ public:
+ enum ExecutionOrder {
+ ORDER_DEFAULT,
+ ORDER_ROUND_ROBIN = ORDER_DEFAULT,
+ // ORDER_LINEAR
+ };
- enum ExecutionNature {
- NATURE_WITH_BARRIER,
- NATURE_WITHOUT_BARRIER,
- NATURE_1_WORK_ITEM,
- NATURE_WG_LEVEL_EXEC
- };
+ enum ExecutionNature {
+ NATURE_WITH_BARRIER,
+ NATURE_WITHOUT_BARRIER,
+ NATURE_1_WORK_ITEM,
+ NATURE_WG_LEVEL_EXEC
+ };
- NDRangeKernelBatch(
- amd::NDRangeKernelCommand& parent,
- VirtualCPU& virtualDevice,
- const amd::NDRange& groupIds, size_t numCores) :
- Operation(parent),
- coreId_(0),
- numWorkGroups_(groupIds.product()),
- numCores_(numCores),
- currentOpId_(0),
- groupIds_(groupIds),
- virtualDevice_(virtualDevice)
- { }
+ NDRangeKernelBatch(amd::NDRangeKernelCommand& parent, VirtualCPU& virtualDevice,
+ const amd::NDRange& groupIds, size_t numCores)
+ : Operation(parent),
+ coreId_(0),
+ numWorkGroups_(groupIds.product()),
+ numCores_(numCores),
+ currentOpId_(0),
+ groupIds_(groupIds),
+ virtualDevice_(virtualDevice) {}
- virtual void clone(Operation* buf)
- {
- ::new(buf) NDRangeKernelBatch(static_cast(command_),
- virtualDevice_, groupIds_, numCores_);
- static_cast(buf)->setCoreId(coreId_);
- }
+ virtual void clone(Operation* buf) {
+ ::new (buf) NDRangeKernelBatch(static_cast(command_),
+ virtualDevice_, groupIds_, numCores_);
+ static_cast(buf)->setCoreId(coreId_);
+ }
- virtual void execute();
+ virtual void execute();
- void setCoreId(size_t coreId) { coreId_ = coreId; currentOpId_ = coreId; }
+ void setCoreId(size_t coreId) {
+ coreId_ = coreId;
+ currentOpId_ = coreId;
+ }
- inline bool getNextOperationId(size_t& opId);
- inline size_t getNextOperationIds(size_t& opId, size_t count);
+ inline bool getNextOperationId(size_t& opId);
+ inline size_t getNextOperationIds(size_t& opId, size_t count);
-private:
- bool patchParameters(
- const cpu::Kernel& kernel,
- address params,
- address& localMemPtr,
- const address localMemLimit,
- size_t localMemSize) const;
+ private:
+ bool patchParameters(const cpu::Kernel& kernel, address params, address& localMemPtr,
+ const address localMemLimit, size_t localMemSize) const;
};
-class NativeFn : public Operation
-{
-public:
- NativeFn(amd::NativeFnCommand& parent) : Operation(parent)
- { }
+class NativeFn : public Operation {
+ public:
+ NativeFn(amd::NativeFnCommand& parent) : Operation(parent) {}
- virtual void clone(Operation* buf)
- {
- ::new(buf) NativeFn(static_cast(command_));
- }
+ virtual void clone(Operation* buf) {
+ ::new (buf) NativeFn(static_cast(command_));
+ }
- virtual void execute();
+ virtual void execute();
};
#ifndef MAX
-#define MAX(x,y) ((x)>=(y) ?(x) : (y))
-#endif //MAX
+#define MAX(x, y) ((x) >= (y) ? (x) : (y))
+#endif // MAX
#define MAX_OPERATION_ALLOC_SIZE (MAX(sizeof(NDRangeKernelBatch), sizeof(NativeFn)))
//! A thread bound to a cpu core.
-class WorkerThread : public amd::Thread
-{
-private:
- Fiber mainFiber_; //!< main fiber for this worker thread.
+class WorkerThread : public amd::Thread {
+ private:
+ Fiber mainFiber_; //!< main fiber for this worker thread.
- amd::Monitor queueLock_; //!< lock protecting the queue.
- volatile int waitingOp_;
- bool terminated_; //!< true if the thread is shutting down.
-
- //! Local memory storage
- address localDataStorage_;
- //! Size of the local memory.
- size_t localDataSize_;
+ amd::Monitor queueLock_; //!< lock protecting the queue.
+ volatile int waitingOp_;
+ bool terminated_; //!< true if the thread is shutting down.
- char operation_[MAX_OPERATION_ALLOC_SIZE];
+ //! Local memory storage
+ address localDataStorage_;
+ //! Size of the local memory.
+ size_t localDataSize_;
- address baseWorkItemsStack_;
-private:
- //! Awaits operations and execute them as they become ready.
- void loop();
+ char operation_[MAX_OPERATION_ALLOC_SIZE];
-public:
- //! Construct a new WorkerThread.
- WorkerThread(const cpu::Device& device);
- //! Destroy the worker thread.
- virtual ~WorkerThread();
- //! Cleanup the thread before termination.
- bool terminate();
+ address baseWorkItemsStack_;
- //! Return the main fiber for this thread.
- Fiber& mainFiber() { return mainFiber_; }
- //! Return the LDS for this thread
- address localDataStorage() const { return localDataStorage_; }
- //! Return the size of the local memory for this thread.
- size_t localDataSize() const { return localDataSize_; }
+ private:
+ //! Awaits operations and execute them as they become ready.
+ void loop();
- address baseWorkItemsStack() { return baseWorkItemsStack_; }
+ public:
+ //! Construct a new WorkerThread.
+ WorkerThread(const cpu::Device& device);
+ //! Destroy the worker thread.
+ virtual ~WorkerThread();
+ //! Cleanup the thread before termination.
+ bool terminate();
- Operation* operation() { return reinterpret_cast(operation_); }
- bool isOperationValid() { return waitingOp_ > 0; }
+ //! Return the main fiber for this thread.
+ Fiber& mainFiber() { return mainFiber_; }
+ //! Return the LDS for this thread
+ address localDataStorage() const { return localDataStorage_; }
+ //! Return the size of the local memory for this thread.
+ size_t localDataSize() const { return localDataSize_; }
- //! Enqueue a new operation to execute in this thread.
- void enqueue(Operation& op);
- //! Signal to start processing the commands in the queue.
- void flush() { amd::ScopedLock sl(queueLock_); queueLock_.notify(); }
+ address baseWorkItemsStack() { return baseWorkItemsStack_; }
- //! This thread's execution engine.
- void run(void* data) {
- loop();
- }
+ Operation* operation() { return reinterpret_cast(operation_); }
+ bool isOperationValid() { return waitingOp_ > 0; }
- bool isWorkerThread() const { return true; }
+ //! Enqueue a new operation to execute in this thread.
+ void enqueue(Operation& op);
+ //! Signal to start processing the commands in the queue.
+ void flush() {
+ amd::ScopedLock sl(queueLock_);
+ queueLock_.notify();
+ }
- //! Return the currently executing WorkerThread's instance.
- static WorkerThread* current()
- {
- return static_cast(Thread::current());
- }
+ //! This thread's execution engine.
+ void run(void* data) { loop(); }
+
+ bool isWorkerThread() const { return true; }
+
+ //! Return the currently executing WorkerThread's instance.
+ static WorkerThread* current() { return static_cast(Thread::current()); }
};
/*! @}
@@ -371,59 +335,43 @@ extern "C" intptr_t _StackContext_setjmp(intptr_t* regs);
#if !defined(ATI_ARCH_ARM)
ALWAYSINLINE
#endif
-intptr_t
-StackContext::setjmp()
-{
+intptr_t StackContext::setjmp() {
#if defined(ATI_ARCH_ARM)
- return ::setjmp(env_);
+ return ::setjmp(env_);
#else
- return _StackContext_setjmp(regs_);
+ return _StackContext_setjmp(regs_);
#endif
}
extern "C" void _StackContext_longjmp(const intptr_t* env, intptr_t val);
-ALWAYSINLINE void
-StackContext::longjmp(intptr_t val) const
-{
+ALWAYSINLINE void StackContext::longjmp(intptr_t val) const {
#if defined(ATI_ARCH_ARM)
- return ::longjmp(*const_cast(&env_), val);
+ return ::longjmp(*const_cast(&env_), val);
#else
- return _StackContext_longjmp(regs_, val);
+ return _StackContext_longjmp(regs_, val);
#endif
}
+extern "C" void _WorkGroup_callKernel(address params, kernelentrypoint_t entryPoint,
+ address stackPtr);
-extern "C" void _WorkGroup_callKernel(
- address params,
- kernelentrypoint_t entryPoint,
- address stackPtr);
-
-extern "C" void _WorkGroup_callKernelProtectedReturn(
- address params,
- kernelentrypoint_t entryPoint,
- address stackPtr);
+extern "C" void _WorkGroup_callKernelProtectedReturn(address params, kernelentrypoint_t entryPoint,
+ address stackPtr);
-ALWAYSINLINE void
-WorkGroup::callKernel(
- kernelentrypoint_t entryPoint,
- address stackPtr)
-{
- _WorkGroup_callKernel(params_, entryPoint, stackPtr);
+ALWAYSINLINE void WorkGroup::callKernel(kernelentrypoint_t entryPoint, address stackPtr) {
+ _WorkGroup_callKernel(params_, entryPoint, stackPtr);
}
// This version support the case of changing the stack for fibers.
-ALWAYSINLINE void
-WorkGroup::callKernelProtectedReturn(
- kernelentrypoint_t entryPoint,
- address stackPtr)
-{
- _WorkGroup_callKernelProtectedReturn(params_, entryPoint, stackPtr);
+ALWAYSINLINE void WorkGroup::callKernelProtectedReturn(kernelentrypoint_t entryPoint,
+ address stackPtr) {
+ _WorkGroup_callKernelProtectedReturn(params_, entryPoint, stackPtr);
}
-} // namespace cpu
+} // namespace cpu
#endif /*OPERATION_HPP_*/
diff --git a/rocclr/runtime/device/cpu/cpudevice.cpp b/rocclr/runtime/device/cpu/cpudevice.cpp
index 5314689e62..0270c9432b 100644
--- a/rocclr/runtime/device/cpu/cpudevice.cpp
+++ b/rocclr/runtime/device/cpu/cpudevice.cpp
@@ -18,16 +18,16 @@
#if defined(__linux__)
#if !defined(ATI_ARCH_ARM)
#include
-#endif // ATI_ARCH_ARM
+#endif // ATI_ARCH_ARM
#include
#endif
#if defined(_WIN32)
-# include
-# include
+#include
+#include
-extern BOOL (WINAPI *pfnGetNumaNodeProcessorMaskEx)(USHORT,PGROUP_AFFINITY);
-#endif // _WIN32
+extern BOOL(WINAPI* pfnGetNumaNodeProcessorMaskEx)(USHORT, PGROUP_AFFINITY);
+#endif // _WIN32
namespace cpu {
@@ -35,1133 +35,1012 @@ aclCompiler* Device::compiler_;
size_t Device::maxWorkerThreads_ = (size_t)-1;
-Device::~Device()
-{
+Device::~Device() {
#if defined(__linux__) && defined(NUMA_SUPPORT)
- if (getNumaMask() != NULL) {
- if (numaMask_ != NULL) {
- delete numaMask_;
- }
+ if (getNumaMask() != NULL) {
+ if (numaMask_ != NULL) {
+ delete numaMask_;
}
- else
+ } else
#endif
- if (workerThreadsAffinity_ != NULL) {
- delete workerThreadsAffinity_;
- }
+ if (workerThreadsAffinity_ != NULL) {
+ delete workerThreadsAffinity_;
+ }
}
-void
-Device::tearDown()
-{
- amd::Os::uninstallSigfpeHandler();
- aclCompilerFini(compiler_);
+void Device::tearDown() {
+ amd::Os::uninstallSigfpeHandler();
+ aclCompilerFini(compiler_);
}
-bool
-Device::init()
-{
- // Allow disabling of the CPU device
- if (CPU_MAX_COMPUTE_UNITS == 0)
- return false;
+bool Device::init() {
+ // Allow disabling of the CPU device
+ if (CPU_MAX_COMPUTE_UNITS == 0) return false;
- if(!amd::Os::installSigfpeHandler())
- return false;
+ if (!amd::Os::installSigfpeHandler()) return false;
- const char *library = getenv("COMPILER_LIBRARY");
- aclCompilerOptions opts = {
- sizeof(aclCompilerOptions_0_8),
- (library || CPU_OPENCL_VERSION >= 200)
- ? library : LINUX_ONLY("lib") "amdocl12cl" \
- LP64_SWITCH(LINUX_SWITCH("32",""),"64") LINUX_SWITCH(".so",".dll"),
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL
- };
- acl_error error;
- compiler_ = aclCompilerInit(&opts, &error);
- if (error != ACL_SUCCESS) {
- LogError("Error initializing the compiler");
- return false;
- }
+ const char* library = getenv("COMPILER_LIBRARY");
+ aclCompilerOptions opts = {sizeof(aclCompilerOptions_0_8), (library || CPU_OPENCL_VERSION >= 200)
+ ? library
+ : LINUX_ONLY("lib") "amdocl12cl" LP64_SWITCH(
+ LINUX_SWITCH("32", ""), "64") LINUX_SWITCH(".so", ".dll"),
+ NULL, NULL, NULL, NULL, NULL, NULL};
+ acl_error error;
+ compiler_ = aclCompilerInit(&opts, &error);
+ if (error != ACL_SUCCESS) {
+ LogError("Error initializing the compiler");
+ return false;
+ }
- device::Info info;
- ::memset(&info, '\0', sizeof(info));
+ device::Info info;
+ ::memset(&info, '\0', sizeof(info));
- info.type_ = CL_DEVICE_TYPE_CPU;
- info.vendorId_ = 0x1002;
+ info.type_ = CL_DEVICE_TYPE_CPU;
+ info.vendorId_ = 0x1002;
- int systemProcessorCount = amd::Os::processorCount();
- info.maxComputeUnits_ = systemProcessorCount;
- if (!flagIsDefault(CPU_MAX_COMPUTE_UNITS)) {
- if ((CPU_MAX_COMPUTE_UNITS <= 0) || (CPU_MAX_COMPUTE_UNITS > systemProcessorCount))
- info.maxComputeUnits_ = systemProcessorCount;
- else
- info.maxComputeUnits_ = CPU_MAX_COMPUTE_UNITS;
- }
+ int systemProcessorCount = amd::Os::processorCount();
+ info.maxComputeUnits_ = systemProcessorCount;
+ if (!flagIsDefault(CPU_MAX_COMPUTE_UNITS)) {
+ if ((CPU_MAX_COMPUTE_UNITS <= 0) || (CPU_MAX_COMPUTE_UNITS > systemProcessorCount))
+ info.maxComputeUnits_ = systemProcessorCount;
+ else
+ info.maxComputeUnits_ = CPU_MAX_COMPUTE_UNITS;
+ }
- info.maxWorkItemDimensions_ = 3;
- info.maxWorkGroupSize_ = CPU_MAX_WORKGROUP_SIZE;
- info.maxWorkItemSizes_[0] = info.maxWorkGroupSize_;
- info.maxWorkItemSizes_[1] = info.maxWorkGroupSize_;
- info.maxWorkItemSizes_[2] = info.maxWorkGroupSize_;
+ info.maxWorkItemDimensions_ = 3;
+ info.maxWorkGroupSize_ = CPU_MAX_WORKGROUP_SIZE;
+ info.maxWorkItemSizes_[0] = info.maxWorkGroupSize_;
+ info.maxWorkItemSizes_[1] = info.maxWorkGroupSize_;
+ info.maxWorkItemSizes_[2] = info.maxWorkGroupSize_;
- info.addressBits_ = LP64_SWITCH(32,64);
+ info.addressBits_ = LP64_SWITCH(32, 64);
- if (CPU_IMAGE_SUPPORT) {
- info.imageSupport_ = CL_TRUE;
- info.maxReadImageArgs_ = MaxReadImage;
- info.maxWriteImageArgs_ = MaxWriteImage;
- info.image2DMaxWidth_ = 8 * Ki;
- info.image2DMaxHeight_ = 8 * Ki;
- info.image3DMaxWidth_ = 2 * Ki;
- info.image3DMaxHeight_ = 2 * Ki;
- info.image3DMaxDepth_ = 2 * Ki;
- info.maxSamplers_ = MaxSamplers;
+ if (CPU_IMAGE_SUPPORT) {
+ info.imageSupport_ = CL_TRUE;
+ info.maxReadImageArgs_ = MaxReadImage;
+ info.maxWriteImageArgs_ = MaxWriteImage;
+ info.image2DMaxWidth_ = 8 * Ki;
+ info.image2DMaxHeight_ = 8 * Ki;
+ info.image3DMaxWidth_ = 2 * Ki;
+ info.image3DMaxHeight_ = 2 * Ki;
+ info.image3DMaxDepth_ = 2 * Ki;
+ info.maxSamplers_ = MaxSamplers;
- // OpenCL 1.2 device info fields
- info.imageMaxBufferSize_ = 64 * Ki;
- info.imageMaxArraySize_ = 2 * Ki;
+ // OpenCL 1.2 device info fields
+ info.imageMaxBufferSize_ = 64 * Ki;
+ info.imageMaxArraySize_ = 2 * Ki;
- info.imagePitchAlignment_ = 0;
- info.imageBaseAddressAlignment_ = 0;
- info.bufferFromImageSupport_ = CL_FALSE;
- }
+ info.imagePitchAlignment_ = 0;
+ info.imageBaseAddressAlignment_ = 0;
+ info.bufferFromImageSupport_ = CL_FALSE;
+ }
- info.maxParameterSize_ = 4*Ki;
+ info.maxParameterSize_ = 4 * Ki;
- info.memBaseAddrAlign_ = 8 * (flagIsDefault(MEMOBJ_BASE_ADDR_ALIGN) ?
- sizeof(cl_long16) : MEMOBJ_BASE_ADDR_ALIGN);
- info.minDataTypeAlignSize_ = sizeof(cl_long16);
+ info.memBaseAddrAlign_ =
+ 8 * (flagIsDefault(MEMOBJ_BASE_ADDR_ALIGN) ? sizeof(cl_long16) : MEMOBJ_BASE_ADDR_ALIGN);
+ info.minDataTypeAlignSize_ = sizeof(cl_long16);
- info.singleFPConfig_ =
- CL_FP_DENORM | CL_FP_INF_NAN |
- CL_FP_ROUND_TO_NEAREST | CL_FP_ROUND_TO_ZERO |
- CL_FP_ROUND_TO_INF | CL_FP_FMA;
+ info.singleFPConfig_ = CL_FP_DENORM | CL_FP_INF_NAN | CL_FP_ROUND_TO_NEAREST |
+ CL_FP_ROUND_TO_ZERO | CL_FP_ROUND_TO_INF | CL_FP_FMA;
- info.doubleFPConfig_ = info.singleFPConfig_;
- info.singleFPConfig_ |= CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT;
+ info.doubleFPConfig_ = info.singleFPConfig_;
+ info.singleFPConfig_ |= CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT;
- info.affinityDomain_.value_ = 0;
- info.affinityDomain_.next_ = 1;
+ info.affinityDomain_.value_ = 0;
+ info.affinityDomain_.next_ = 1;
- info.globalMemCacheType_ = CL_READ_WRITE_CACHE;
+ info.globalMemCacheType_ = CL_READ_WRITE_CACHE;
#if defined(__linux__)
- info.globalMemCacheLineSize_ = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
- info.globalMemCacheSize_ = sysconf(_SC_LEVEL1_DCACHE_SIZE);
- info.affinityDomain_.cacheL1_ = 1;
+ info.globalMemCacheLineSize_ = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
+ info.globalMemCacheSize_ = sysconf(_SC_LEVEL1_DCACHE_SIZE);
+ info.affinityDomain_.cacheL1_ = 1;
- if (sysconf(_SC_LEVEL2_CACHE_SIZE) > 0) {
- info.affinityDomain_.cacheL2_ = 1;
- }
- if (sysconf(_SC_LEVEL3_CACHE_SIZE) > 0) {
- info.affinityDomain_.cacheL3_ = 1;
- }
- if (sysconf(_SC_LEVEL4_CACHE_SIZE) > 0) {
- info.affinityDomain_.cacheL4_ = 1;
- }
+ if (sysconf(_SC_LEVEL2_CACHE_SIZE) > 0) {
+ info.affinityDomain_.cacheL2_ = 1;
+ }
+ if (sysconf(_SC_LEVEL3_CACHE_SIZE) > 0) {
+ info.affinityDomain_.cacheL3_ = 1;
+ }
+ if (sysconf(_SC_LEVEL4_CACHE_SIZE) > 0) {
+ info.affinityDomain_.cacheL4_ = 1;
+ }
#if defined(NUMA_SUPPORT)
- if (numa_available() != -1 && numa_max_node() => 0) {
- info.affinityDomain_.numa_ = 1;
- }
+ if (numa_available() != -1 && numa_max_node() = > 0) {
+ info.affinityDomain_.numa_ = 1;
+ }
#endif
-#else // win32
+#else // win32
- DWORD length = 0;
- ::GetLogicalProcessorInformation(NULL, &length);
+ DWORD length = 0;
+ ::GetLogicalProcessorInformation(NULL, &length);
- PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer =
- (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION) malloc(length);
+ PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer =
+ (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(length);
- if (buffer != NULL && ::GetLogicalProcessorInformation(buffer, &length)) {
- bool found = false;
- PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr, limit =
- &buffer[length / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION)];
- for (ptr = buffer; ptr < limit; ++ptr) {
- PCACHE_DESCRIPTOR cache = &ptr->Cache;
- if (ptr->Relationship == RelationCache && cache->Type != CacheInstruction) {
- info.affinityDomain_.value_ |=
- (device::AffinityDomain::AFFINITY_DOMAIN_L1_CACHE << 1) >>
- cache->Level;
+ if (buffer != NULL && ::GetLogicalProcessorInformation(buffer, &length)) {
+ bool found = false;
+ PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr,
+ limit = &buffer[length / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION)];
+ for (ptr = buffer; ptr < limit; ++ptr) {
+ PCACHE_DESCRIPTOR cache = &ptr->Cache;
+ if (ptr->Relationship == RelationCache && cache->Type != CacheInstruction) {
+ info.affinityDomain_.value_ |=
+ (device::AffinityDomain::AFFINITY_DOMAIN_L1_CACHE << 1) >> cache->Level;
- if (!found && cache->Level == 1) {
- info.globalMemCacheLineSize_ = cache->LineSize;
- info.globalMemCacheSize_ = cache->Size;
- found = true;
- }
- }
+ if (!found && cache->Level == 1) {
+ info.globalMemCacheLineSize_ = cache->LineSize;
+ info.globalMemCacheSize_ = cache->Size;
+ found = true;
}
+ }
}
+ }
- free(buffer);
+ free(buffer);
- ULONG highestNuma = 0;
- if (::GetNumaHighestNodeNumber(&highestNuma) && highestNuma != 0) {
- info.affinityDomain_.numa_ = 1;
- }
+ ULONG highestNuma = 0;
+ if (::GetNumaHighestNodeNumber(&highestNuma) && highestNuma != 0) {
+ info.affinityDomain_.numa_ = 1;
+ }
#endif
- uintptr_t virtualMemSize;
+ uintptr_t virtualMemSize;
#if defined(__linux__)
#if !defined(ATI_ARCH_ARM)
- struct sysinfo si;
+ struct sysinfo si;
- if (sysinfo(&si) != 0) {
- return false;
- }
- if (si.mem_unit == 0) {
- // Linux kernels prior to 2.3.23 return sizes in bytes.
- si.mem_unit = 1;
- }
- info.globalMemSize_ = (cl_ulong) si.totalram * si.mem_unit;
+ if (sysinfo(&si) != 0) {
+ return false;
+ }
+ if (si.mem_unit == 0) {
+ // Linux kernels prior to 2.3.23 return sizes in bytes.
+ si.mem_unit = 1;
+ }
+ info.globalMemSize_ = (cl_ulong)si.totalram * si.mem_unit;
#else
- info.globalMemSize_ = 0;
+ info.globalMemSize_ = 0;
#endif
- virtualMemSize = (uintptr_t) info.globalMemSize_;
+ virtualMemSize = (uintptr_t)info.globalMemSize_;
#else
- MEMORYSTATUSEX statex;
- statex.dwLength = sizeof (statex);
+ MEMORYSTATUSEX statex;
+ statex.dwLength = sizeof(statex);
- if (GlobalMemoryStatusEx (&statex) == 0) {
- return false;
- }
- info.globalMemSize_ = (cl_ulong) statex.ullTotalPhys;
- virtualMemSize =
- (uintptr_t) std::min(statex.ullTotalPageFile, statex.ullTotalVirtual);
+ if (GlobalMemoryStatusEx(&statex) == 0) {
+ return false;
+ }
+ info.globalMemSize_ = (cl_ulong)statex.ullTotalPhys;
+ virtualMemSize = (uintptr_t)std::min(statex.ullTotalPageFile, statex.ullTotalVirtual);
#endif
- //disable CPU device if system memory is equal to or less than 2GB
- if (info.globalMemSize_ <= OCL_SYSMEM_REQUIREMENT * Gi) {
- return true;
- }
+ // disable CPU device if system memory is equal to or less than 2GB
+ if (info.globalMemSize_ <= OCL_SYSMEM_REQUIREMENT * Gi) {
+ return true;
+ }
- maxWorkerThreads_ = (size_t) (virtualMemSize /
- (uintptr_t) ((CPU_WORKER_THREAD_STACK_SIZE +
- CLK_PRIVATE_MEMORY_SIZE * (CPU_MAX_WORKGROUP_SIZE + 1))) *
- 7 / 10);
+ maxWorkerThreads_ = (size_t)(
+ virtualMemSize / (uintptr_t)((CPU_WORKER_THREAD_STACK_SIZE +
+ CLK_PRIVATE_MEMORY_SIZE * (CPU_MAX_WORKGROUP_SIZE + 1))) *
+ 7 / 10);
#if defined(_LP64)
- // Cap at 8TiB for 64-bit
- const cl_ulong maxGlobalMemSize = 8ULL*Ki*Gi;
+ // Cap at 8TiB for 64-bit
+ const cl_ulong maxGlobalMemSize = 8ULL * Ki * Gi;
#elif defined(_WIN32)
- // Cap at 2GiB (see http://msdn.microsoft.com/en-us/library/aa366778.aspx)
- const cl_ulong maxGlobalMemSize = 2ULL*Gi;
-#else // linux
- // Cap at 3.5GiB
- const cl_ulong maxGlobalMemSize = 3584ULL*Mi;
+ // Cap at 2GiB (see http://msdn.microsoft.com/en-us/library/aa366778.aspx)
+ const cl_ulong maxGlobalMemSize = 2ULL * Gi;
+#else // linux
+ // Cap at 3.5GiB
+ const cl_ulong maxGlobalMemSize = 3584ULL * Mi;
#endif
- info.globalMemSize_ = std::min(info.globalMemSize_, maxGlobalMemSize);
+ info.globalMemSize_ = std::min(info.globalMemSize_, maxGlobalMemSize);
- info.maxMemAllocSize_ = info.globalMemSize_ * CPU_MAX_ALLOC_PERCENT / 100;
- if (flagIsDefault(CPU_MAX_ALLOC_PERCENT)) {
- const cl_ulong minAllocSize = LP64_SWITCH(1ULL*Gi, 2ULL*Gi);
- info.maxMemAllocSize_ = std::max(info.maxMemAllocSize_,
- std::min(info.globalMemSize_, minAllocSize));
- }
+ info.maxMemAllocSize_ = info.globalMemSize_ * CPU_MAX_ALLOC_PERCENT / 100;
+ if (flagIsDefault(CPU_MAX_ALLOC_PERCENT)) {
+ const cl_ulong minAllocSize = LP64_SWITCH(1ULL * Gi, 2ULL * Gi);
+ info.maxMemAllocSize_ =
+ std::max(info.maxMemAllocSize_, std::min(info.globalMemSize_, minAllocSize));
+ }
- info.maxConstantBufferSize_ = 64*Ki;
- info.maxConstantArgs_ = 8;
+ info.maxConstantBufferSize_ = 64 * Ki;
+ info.maxConstantArgs_ = 8;
- info.localMemType_ = CL_GLOBAL;
- info.localMemSize_ = std::max((cl_ulong)32*Ki, info.globalMemCacheSize_/2);
+ info.localMemType_ = CL_GLOBAL;
+ info.localMemSize_ = std::max((cl_ulong)32 * Ki, info.globalMemCacheSize_ / 2);
- info.errorCorrectionSupport_ = CL_FALSE;
- info.hostUnifiedMemory_ = CL_TRUE;
- info.profilingTimerResolution_ = (size_t)amd::Os::timerResolutionNanos();
- info.profilingTimerOffset_ = amd::Os::offsetToEpochNanos();
- info.littleEndian_ = CL_TRUE;
- info.available_ = CL_TRUE;
- info.compilerAvailable_ = CL_TRUE;
- info.linkerAvailable_ = CL_TRUE;
+ info.errorCorrectionSupport_ = CL_FALSE;
+ info.hostUnifiedMemory_ = CL_TRUE;
+ info.profilingTimerResolution_ = (size_t)amd::Os::timerResolutionNanos();
+ info.profilingTimerOffset_ = amd::Os::offsetToEpochNanos();
+ info.littleEndian_ = CL_TRUE;
+ info.available_ = CL_TRUE;
+ info.compilerAvailable_ = CL_TRUE;
+ info.linkerAvailable_ = CL_TRUE;
- info.executionCapabilities_ = CL_EXEC_KERNEL | CL_EXEC_NATIVE_KERNEL;
- // Enable SVM only for OpenCL 2.0
- if (((OPENCL_MAJOR >= 2) && (CPU_OPENCL_VERSION >= 200)) || OCL_FORCE_CPU_SVM) {
- info.svmCapabilities_ = CL_DEVICE_SVM_COARSE_GRAIN_BUFFER |
- CL_DEVICE_SVM_FINE_GRAIN_BUFFER |
- CL_DEVICE_SVM_FINE_GRAIN_SYSTEM |
- CL_DEVICE_SVM_ATOMICS;
- }
- info.preferredPlatformAtomicAlignment_ = 0;
- info.preferredGlobalAtomicAlignment_ = 0;
- info.preferredLocalAtomicAlignment_ = 0;
- info.queueProperties_ = CL_QUEUE_PROFILING_ENABLE;
+ info.executionCapabilities_ = CL_EXEC_KERNEL | CL_EXEC_NATIVE_KERNEL;
+ // Enable SVM only for OpenCL 2.0
+ if (((OPENCL_MAJOR >= 2) && (CPU_OPENCL_VERSION >= 200)) || OCL_FORCE_CPU_SVM) {
+ info.svmCapabilities_ = CL_DEVICE_SVM_COARSE_GRAIN_BUFFER | CL_DEVICE_SVM_FINE_GRAIN_BUFFER |
+ CL_DEVICE_SVM_FINE_GRAIN_SYSTEM | CL_DEVICE_SVM_ATOMICS;
+ }
+ info.preferredPlatformAtomicAlignment_ = 0;
+ info.preferredGlobalAtomicAlignment_ = 0;
+ info.preferredLocalAtomicAlignment_ = 0;
+ info.queueProperties_ = CL_QUEUE_PROFILING_ENABLE;
- info.platform_ = AMD_PLATFORM;
+ info.platform_ = AMD_PLATFORM;
#if defined(__linux__)
- std::ifstream ifs("/proc/cpuinfo", std::ios::in);
- if (ifs.is_open()) {
- std::string line;
- bool vendor = false;
- bool name = false;
- bool freq = false;
+ std::ifstream ifs("/proc/cpuinfo", std::ios::in);
+ if (ifs.is_open()) {
+ std::string line;
+ bool vendor = false;
+ bool name = false;
+ bool freq = false;
- while (std::getline(ifs, line) && !(vendor && name && freq)) {
- if (!vendor && (line.find("vendor_id\t: ")
- != std::string::npos)) {
- ::strcpy(
- info.vendor_,
- line.substr(line.find_first_of(':') + 2).c_str());
- vendor = true;
- }
- else if (!name && (line.find("model name\t: ") != std::string::npos
- || line.find("Processor\t: ") != std::string::npos)) {
- ::strcpy(
- info.name_,
- line.substr(line.find_first_of(':') + 2).c_str());
- name = true;
- }
- else if (!freq && (line.find("cpu MHz\t\t: ")
- != std::string::npos)) {
- info.maxClockFrequency_ =
- ::atoi(line.substr(line.find_first_of(':') + 2).c_str());
- freq = true;
- }
- }
- ifs.close();
+ while (std::getline(ifs, line) && !(vendor && name && freq)) {
+ if (!vendor && (line.find("vendor_id\t: ") != std::string::npos)) {
+ ::strcpy(info.vendor_, line.substr(line.find_first_of(':') + 2).c_str());
+ vendor = true;
+ } else if (!name && (line.find("model name\t: ") != std::string::npos ||
+ line.find("Processor\t: ") != std::string::npos)) {
+ ::strcpy(info.name_, line.substr(line.find_first_of(':') + 2).c_str());
+ name = true;
+ } else if (!freq && (line.find("cpu MHz\t\t: ") != std::string::npos)) {
+ info.maxClockFrequency_ = ::atoi(line.substr(line.find_first_of(':') + 2).c_str());
+ freq = true;
+ }
}
+ ifs.close();
+ }
#elif defined(_WIN32)
- int CPUInfo[4] = {-1};
- int nRet = 0;
- unsigned nIds, nExIds, i;
+ int CPUInfo[4] = {-1};
+ int nRet = 0;
+ unsigned nIds, nExIds, i;
- // cpuid with an InfoType argument of 0 returns the number of
- // valid Ids in CPUInfo[0] and the CPU identification string in
- // the other three array elements. The CPU identification string is
- // not in linear order. The code below arranges the information
- // in a human readable form.
- amd::Os::cpuid(CPUInfo, 0);
- nIds = CPUInfo[0];
- memset(info.vendor_, 0, sizeof(info.vendor_));
- *((int*)(info.vendor_+0)) = CPUInfo[1];
- *((int*)(info.vendor_+4)) = CPUInfo[3];
- *((int*)(info.vendor_+8)) = CPUInfo[2];
+ // cpuid with an InfoType argument of 0 returns the number of
+ // valid Ids in CPUInfo[0] and the CPU identification string in
+ // the other three array elements. The CPU identification string is
+ // not in linear order. The code below arranges the information
+ // in a human readable form.
+ amd::Os::cpuid(CPUInfo, 0);
+ nIds = CPUInfo[0];
+ memset(info.vendor_, 0, sizeof(info.vendor_));
+ *((int*)(info.vendor_ + 0)) = CPUInfo[1];
+ *((int*)(info.vendor_ + 4)) = CPUInfo[3];
+ *((int*)(info.vendor_ + 8)) = CPUInfo[2];
- // Calling cpuid with 0x80000000 as the InfoType argument
- // gets the number of valid extended IDs.
- amd::Os::cpuid(CPUInfo, 0x80000000);
- nExIds = CPUInfo[0];
- memset(info.name_, 0, sizeof(info.name_));
- sprintf(info.name_, "Unknown Processor");
+ // Calling cpuid with 0x80000000 as the InfoType argument
+ // gets the number of valid extended IDs.
+ amd::Os::cpuid(CPUInfo, 0x80000000);
+ nExIds = CPUInfo[0];
+ memset(info.name_, 0, sizeof(info.name_));
+ sprintf(info.name_, "Unknown Processor");
- // Get the information associated with each extended ID.
- for (i=0x80000000; i<=nExIds; ++i)
- {
- amd::Os::cpuid(CPUInfo, i);
- // Interpret CPU brand string and cache information.
- if (i == 0x80000002)
- memcpy(info.name_, CPUInfo, sizeof(CPUInfo));
- else if (i == 0x80000003)
- memcpy(info.name_ + 16, CPUInfo, sizeof(CPUInfo));
- else if (i == 0x80000004)
- memcpy(info.name_ + 32, CPUInfo, sizeof(CPUInfo));
- }
+ // Get the information associated with each extended ID.
+ for (i = 0x80000000; i <= nExIds; ++i) {
+ amd::Os::cpuid(CPUInfo, i);
+ // Interpret CPU brand string and cache information.
+ if (i == 0x80000002)
+ memcpy(info.name_, CPUInfo, sizeof(CPUInfo));
+ else if (i == 0x80000003)
+ memcpy(info.name_ + 16, CPUInfo, sizeof(CPUInfo));
+ else if (i == 0x80000004)
+ memcpy(info.name_ + 32, CPUInfo, sizeof(CPUInfo));
+ }
- info.maxClockFrequency_ = 0;
- HKEY hKey;
+ info.maxClockFrequency_ = 0;
+ HKEY hKey;
- // Open the key
- if (RegOpenKeyEx(
- HKEY_LOCAL_MACHINE,
- "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\\",
- 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {
+ // Open the key
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\\", 0,
+ KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {
+ // Read the value
+ DWORD dwLen = 4;
+ RegQueryValueEx(hKey, "~MHz", NULL, NULL, (LPBYTE)&info.maxClockFrequency_, &dwLen);
- // Read the value
- DWORD dwLen = 4;
- RegQueryValueEx(
- hKey, "~MHz", NULL, NULL,
- (LPBYTE)&info.maxClockFrequency_, &dwLen);
-
- // Cleanup and return
- RegCloseKey(hKey);
- }
+ // Cleanup and return
+ RegCloseKey(hKey);
+ }
#else
- ::strcpy(info.name_, "Unknown Processor");
- ::strcpy(info.vendor_, "Unknown Vendor");
- info.maxClockFrequency_ = 0;
+ ::strcpy(info.name_, "Unknown Processor");
+ ::strcpy(info.vendor_, "Unknown Vendor");
+ info.maxClockFrequency_ = 0;
#endif
#define OPENCL_VERSION_STR XSTR(OPENCL_MAJOR) "." XSTR(OPENCL_MINOR)
- info.profile_ = "FULL_PROFILE";
- if (CPU_OPENCL_VERSION < 200) {
- info.version_ = "OpenCL 1.2 " AMD_PLATFORM_INFO;
- info.oclcVersion_ = "OpenCL C 1.2 ";
- }
- else {
- info.version_ = "OpenCL " OPENCL_VERSION_STR " " AMD_PLATFORM_INFO;
- info.oclcVersion_ = "OpenCL C " OPENCL_VERSION_STR " ";
- }
- info.spirVersions_ = "1.2";
+ info.profile_ = "FULL_PROFILE";
+ if (CPU_OPENCL_VERSION < 200) {
+ info.version_ = "OpenCL 1.2 " AMD_PLATFORM_INFO;
+ info.oclcVersion_ = "OpenCL C 1.2 ";
+ } else {
+ info.version_ = "OpenCL " OPENCL_VERSION_STR " " AMD_PLATFORM_INFO;
+ info.oclcVersion_ = "OpenCL C " OPENCL_VERSION_STR " ";
+ }
+ info.spirVersions_ = "1.2";
- info.partitionCreateInfo_.type_.value_ = 0;
- info.partitionProperties_.value_ = 0;
- if (info.maxComputeUnits_ > 1) {
- info.partitionProperties_.equally_ = 1;
- info.partitionProperties_.byCounts_ = 1;
- if (info.affinityDomain_.value_ != 0) {
- info.partitionProperties_.byAffinityDomain_ = 1;
- }
- }
- else {
- info.affinityDomain_.value_ = 0;
+ info.partitionCreateInfo_.type_.value_ = 0;
+ info.partitionProperties_.value_ = 0;
+ if (info.maxComputeUnits_ > 1) {
+ info.partitionProperties_.equally_ = 1;
+ info.partitionProperties_.byCounts_ = 1;
+ if (info.affinityDomain_.value_ != 0) {
+ info.partitionProperties_.byAffinityDomain_ = 1;
}
+ } else {
+ info.affinityDomain_.value_ = 0;
+ }
- // Copy the name into the boardName data member for CPU implementation.
-// ::strncpy(info.boardName_, info.name_, sizeof(info.boardName_));
- memset(info.boardName_, 0, sizeof(info.boardName_));
+ // Copy the name into the boardName data member for CPU implementation.
+ // ::strncpy(info.boardName_, info.name_, sizeof(info.boardName_));
+ memset(info.boardName_, 0, sizeof(info.boardName_));
- Device* device = new Device();
+ Device* device = new Device();
- if (device == NULL || !device->create()) {
- delete device;
- return false;
- }
+ if (device == NULL || !device->create()) {
+ delete device;
+ return false;
+ }
- ::snprintf(info.driverVersion_, sizeof(info.driverVersion_) - 1,
- "%s (%s%s%s)", AMD_BUILD_STRING,
+ ::snprintf(info.driverVersion_, sizeof(info.driverVersion_) - 1, "%s (%s%s%s)", AMD_BUILD_STRING,
#if defined(ATI_ARCH_X86)
- "sse2",
-#else // !ATI_ARCH_X86
- "",
-#endif // !ATI_ARCH_X86
- device->hasAVXInstructions() ? ",avx" : "",
- device->hasFMA4Instructions() ? ",fma4" : "");
+ "sse2",
+#else // !ATI_ARCH_X86
+ "",
+#endif // !ATI_ARCH_X86
+ device->hasAVXInstructions() ? ",avx" : "",
+ device->hasFMA4Instructions() ? ",fma4" : "");
- // These will need to change for AVX2
- info.preferredVectorWidthChar_ = 16;
- info.preferredVectorWidthShort_ = 8;
- info.preferredVectorWidthInt_ = 4;
- info.preferredVectorWidthLong_ = 2;
- if (device->hasAVXInstructions()) {
- info.preferredVectorWidthFloat_ = 8;
- info.preferredVectorWidthDouble_ = 4;
- } else {
- info.preferredVectorWidthFloat_ = 4;
- info.preferredVectorWidthDouble_ = 2;
- }
- info.preferredVectorWidthHalf_ = 0; // no half support
+ // These will need to change for AVX2
+ info.preferredVectorWidthChar_ = 16;
+ info.preferredVectorWidthShort_ = 8;
+ info.preferredVectorWidthInt_ = 4;
+ info.preferredVectorWidthLong_ = 2;
+ if (device->hasAVXInstructions()) {
+ info.preferredVectorWidthFloat_ = 8;
+ info.preferredVectorWidthDouble_ = 4;
+ } else {
+ info.preferredVectorWidthFloat_ = 4;
+ info.preferredVectorWidthDouble_ = 2;
+ }
+ info.preferredVectorWidthHalf_ = 0; // no half support
- // Same here, will need to change for AVX2
- info.nativeVectorWidthChar_ = 16;
- info.nativeVectorWidthShort_ = 8;
- info.nativeVectorWidthInt_ = 4;
- info.nativeVectorWidthLong_ = 2;
- if (device->hasAVXInstructions()) {
- info.nativeVectorWidthFloat_ = 8;
- info.nativeVectorWidthDouble_ = 4;
- } else {
- info.nativeVectorWidthFloat_ = 4;
- info.nativeVectorWidthDouble_ = 2;
- }
- info.nativeVectorWidthHalf_ = 0; // no half support
+ // Same here, will need to change for AVX2
+ info.nativeVectorWidthChar_ = 16;
+ info.nativeVectorWidthShort_ = 8;
+ info.nativeVectorWidthInt_ = 4;
+ info.nativeVectorWidthLong_ = 2;
+ if (device->hasAVXInstructions()) {
+ info.nativeVectorWidthFloat_ = 8;
+ info.nativeVectorWidthDouble_ = 4;
+ } else {
+ info.nativeVectorWidthFloat_ = 4;
+ info.nativeVectorWidthDouble_ = 2;
+ }
+ info.nativeVectorWidthHalf_ = 0; // no half support
- // Find all supported device extensions
- info.extensions_ = device->getExtensionString();
+ // Find all supported device extensions
+ info.extensions_ = device->getExtensionString();
- // OpenCL 1.2 device info fields
- info.builtInKernels_ = "";
- info.preferredInteropUserSync_ = true;
- info.printfBufferSize_ = 64*Ki;
+ // OpenCL 1.2 device info fields
+ info.builtInKernels_ = "";
+ info.preferredInteropUserSync_ = true;
+ info.printfBufferSize_ = 64 * Ki;
- info.maxPipePacketSize_ = info.maxMemAllocSize_;
- info.maxPipeActiveReservations_ = 16;
- info.maxPipeArgs_ = 16;
- info.maxReadWriteImageArgs_ = MaxReadWriteImage;
+ info.maxPipePacketSize_ = info.maxMemAllocSize_;
+ info.maxPipeActiveReservations_ = 16;
+ info.maxPipeArgs_ = 16;
+ info.maxReadWriteImageArgs_ = MaxReadWriteImage;
- // Max size should not be bigger than 1.75 GB
- const cl_ulong maxSize = std::min(static_cast((Gi/4)*7),
- info.maxMemAllocSize_);
- info.maxGlobalVariableSize_ = static_cast(maxSize);
- info.globalVariablePreferredTotalSize_ = static_cast(maxSize);
+ // Max size should not be bigger than 1.75 GB
+ const cl_ulong maxSize = std::min(static_cast((Gi / 4) * 7), info.maxMemAllocSize_);
+ info.maxGlobalVariableSize_ = static_cast(maxSize);
+ info.globalVariablePreferredTotalSize_ = static_cast(maxSize);
- device->info_ = info;
- device->registerDevice();
+ device->info_ = info;
+ device->registerDevice();
- return true;
+ return true;
}
-bool
-Device::create()
-{
- // Create CPU settings
- settings_ = new cpu::Settings();
- cpu::Settings* cpuSettings = reinterpret_cast(settings_);
+bool Device::create() {
+ // Create CPU settings
+ settings_ = new cpu::Settings();
+ cpu::Settings* cpuSettings = reinterpret_cast(settings_);
- if ((cpuSettings == NULL) || !cpuSettings->create()) {
- return false;
- }
+ if ((cpuSettings == NULL) || !cpuSettings->create()) {
+ return false;
+ }
#if defined(ATI_ARCH_X86)
- // Check that we have at least SSE2
- if (settings().cpuFeatures_ == 0) {
- return false;
- }
+ // Check that we have at least SSE2
+ if (settings().cpuFeatures_ == 0) {
+ return false;
+ }
#endif
- return true;
+ return true;
}
-bool
-Device::initSubDevice(
- device::Info& info,
- cl_uint maxComputeUnits,
- const device::CreateSubDevicesInfo& create_info)
-{
+bool Device::initSubDevice(device::Info& info, cl_uint maxComputeUnits,
+ const device::CreateSubDevicesInfo& create_info) {
+ if (workerThreadsAffinity_ == NULL) {
+ workerThreadsAffinity_ = new amd::Os::ThreadAffinityMask;
if (workerThreadsAffinity_ == NULL) {
- workerThreadsAffinity_ = new amd::Os::ThreadAffinityMask;
- if (workerThreadsAffinity_ == NULL) {
- return false;
- }
+ return false;
}
+ }
- info_ = info;
- info_.maxComputeUnits_ = maxComputeUnits;
- info_.partitionCreateInfo_ = create_info.p_;
- if (create_info.p_.type_.value_ == device::PartitionType::BY_COUNTS) {
- cl_uint* countsList = new cl_uint[create_info.p_.byCounts_.listSize_];
- if (countsList == NULL) {
- return false;
- }
- for (size_t i = 0; i < create_info.p_.byCounts_.listSize_; ++i) {
- countsList[i] = create_info.countsListAt(i);
- }
- info_.partitionCreateInfo_.byCounts_.countsList_ = countsList;
+ info_ = info;
+ info_.maxComputeUnits_ = maxComputeUnits;
+ info_.partitionCreateInfo_ = create_info.p_;
+ if (create_info.p_.type_.value_ == device::PartitionType::BY_COUNTS) {
+ cl_uint* countsList = new cl_uint[create_info.p_.byCounts_.listSize_];
+ if (countsList == NULL) {
+ return false;
}
+ for (size_t i = 0; i < create_info.p_.byCounts_.listSize_; ++i) {
+ countsList[i] = create_info.countsListAt(i);
+ }
+ info_.partitionCreateInfo_.byCounts_.countsList_ = countsList;
+ }
- // The device cannot be partitioned further
- if (maxComputeUnits == 1) {
- info_.partitionProperties_.value_ = 0;
- info_.affinityDomain_.value_ = 0;
- }
- return true;
+ // The device cannot be partitioned further
+ if (maxComputeUnits == 1) {
+ info_.partitionProperties_.value_ = 0;
+ info_.affinityDomain_.value_ = 0;
+ }
+ return true;
}
-void
-Device::setWorkerThreadsAffinity(
- cl_uint numWorkerThreads,
- const amd::Os::ThreadAffinityMask* threadsAffinityMask,
- uint& baseCoreId)
-{
- uint coreId = baseCoreId;
- if (threadsAffinityMask == NULL) {
- for (cl_uint i = 0; i < numWorkerThreads; ++i) {
- ++coreId;
- workerThreadsAffinity_->set(coreId);
- }
+void Device::setWorkerThreadsAffinity(cl_uint numWorkerThreads,
+ const amd::Os::ThreadAffinityMask* threadsAffinityMask,
+ uint& baseCoreId) {
+ uint coreId = baseCoreId;
+ if (threadsAffinityMask == NULL) {
+ for (cl_uint i = 0; i < numWorkerThreads; ++i) {
+ ++coreId;
+ workerThreadsAffinity_->set(coreId);
}
- else { // Already has affinity, so filter accordingly
- for (cl_uint i = 0; i < numWorkerThreads; ++i) {
- coreId = threadsAffinityMask->getNextSet(coreId);
- workerThreadsAffinity_->set(coreId);
- }
+ } else { // Already has affinity, so filter accordingly
+ for (cl_uint i = 0; i < numWorkerThreads; ++i) {
+ coreId = threadsAffinityMask->getNextSet(coreId);
+ workerThreadsAffinity_->set(coreId);
}
- baseCoreId = coreId;
+ }
+ baseCoreId = coreId;
}
-cl_int
-Device::createSubDevices(
- device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries,
- cl_device_id* devices,
- cl_uint* num_devices)
-{
- switch (create_info.p_.type_.value_) {
+cl_int Device::createSubDevices(device::CreateSubDevicesInfo& create_info, cl_uint num_entries,
+ cl_device_id* devices, cl_uint* num_devices) {
+ switch (create_info.p_.type_.value_) {
case device::PartitionType::EQUALLY:
- return partitionEqually(
- create_info, num_entries, devices, num_devices);
+ return partitionEqually(create_info, num_entries, devices, num_devices);
case device::PartitionType::BY_COUNTS:
- return partitionByCounts(
- create_info, num_entries, devices, num_devices);
+ return partitionByCounts(create_info, num_entries, devices, num_devices);
case device::PartitionType::BY_AFFINITY_DOMAIN:
- if (info_.affinityDomain_.value_ == 0) {
- return CL_DEVICE_PARTITION_FAILED;
- }
-
- if (create_info.p_.byAffinityDomain_.next_) {
- create_info.p_.byAffinityDomain_.next_ = 0;
- create_info.p_.byAffinityDomain_.value_ =
- (1 << amd::leastBitSet(info_.affinityDomain_.value_));
- }
- else {
- if ((create_info.p_.byAffinityDomain_.value_ &
- info_.affinityDomain_.value_) == 0) {
- return CL_INVALID_VALUE;
- }
- }
-
- if (create_info.p_.byAffinityDomain_.numa_) {
- return partitionByAffinityDomainNUMA(
- create_info, num_entries, devices, num_devices);
- }
- else {
- return partitionByAffinityDomainCacheLevel(
- create_info, num_entries, devices, num_devices);
- }
- default:
- return CL_INVALID_VALUE;
- }
- return CL_SUCCESS;
-}
-
-cl_int
-Device::partitionEqually(
- const device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries,
- cl_device_id* devices,
- cl_uint* num_devices)
-{
- cl_uint subComputeUnits =
- (cl_uint)create_info.p_.equally_.numComputeUnits_;
- if (subComputeUnits == 0) {
- return CL_INVALID_VALUE;
- }
-
- cl_uint numSubDevices = info_.maxComputeUnits_ / subComputeUnits;
- if (numSubDevices == 0) {
+ if (info_.affinityDomain_.value_ == 0) {
return CL_DEVICE_PARTITION_FAILED;
- }
+ }
- if (num_devices != NULL) {
- *num_devices = numSubDevices;
- }
-
- if (devices != NULL) {
- if (num_entries < numSubDevices) {
- return CL_INVALID_VALUE;
+ if (create_info.p_.byAffinityDomain_.next_) {
+ create_info.p_.byAffinityDomain_.next_ = 0;
+ create_info.p_.byAffinityDomain_.value_ =
+ (1 << amd::leastBitSet(info_.affinityDomain_.value_));
+ } else {
+ if ((create_info.p_.byAffinityDomain_.value_ & info_.affinityDomain_.value_) == 0) {
+ return CL_INVALID_VALUE;
}
- uint coreId = (uint)-1;
- while (numSubDevices-- > 0) {
- Device* device = new Device(this);
- if (device == NULL) {
- return CL_OUT_OF_HOST_MEMORY;
- }
+ }
- if (!device->create() ||
- !device->initSubDevice(info_, subComputeUnits, create_info)) {
- device->release();
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- device->setWorkerThreadsAffinity(
- subComputeUnits, workerThreadsAffinity_, coreId);
- *devices++ = as_cl(static_cast(device));
- }
- }
-
- return CL_SUCCESS;
+ if (create_info.p_.byAffinityDomain_.numa_) {
+ return partitionByAffinityDomainNUMA(create_info, num_entries, devices, num_devices);
+ } else {
+ return partitionByAffinityDomainCacheLevel(create_info, num_entries, devices, num_devices);
+ }
+ default:
+ return CL_INVALID_VALUE;
+ }
+ return CL_SUCCESS;
}
-cl_int
-Device::partitionByCounts(
- const device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries,
- cl_device_id* devices,
- cl_uint* num_devices)
-{
- cl_uint maxComputeUnits = 0;
- cl_uint numSubDevices = (cl_uint)create_info.p_.byCounts_.listSize_;
- for (size_t i = (size_t)numSubDevices; i > 0; --i) {
- maxComputeUnits += create_info.countsListAt(i);
+cl_int Device::partitionEqually(const device::CreateSubDevicesInfo& create_info,
+ cl_uint num_entries, cl_device_id* devices, cl_uint* num_devices) {
+ cl_uint subComputeUnits = (cl_uint)create_info.p_.equally_.numComputeUnits_;
+ if (subComputeUnits == 0) {
+ return CL_INVALID_VALUE;
+ }
+
+ cl_uint numSubDevices = info_.maxComputeUnits_ / subComputeUnits;
+ if (numSubDevices == 0) {
+ return CL_DEVICE_PARTITION_FAILED;
+ }
+
+ if (num_devices != NULL) {
+ *num_devices = numSubDevices;
+ }
+
+ if (devices != NULL) {
+ if (num_entries < numSubDevices) {
+ return CL_INVALID_VALUE;
}
- if (numSubDevices == 0 || maxComputeUnits > info_.maxComputeUnits_) {
- return CL_INVALID_DEVICE_PARTITION_COUNT;
+ uint coreId = (uint)-1;
+ while (numSubDevices-- > 0) {
+ Device* device = new Device(this);
+ if (device == NULL) {
+ return CL_OUT_OF_HOST_MEMORY;
+ }
+
+ if (!device->create() || !device->initSubDevice(info_, subComputeUnits, create_info)) {
+ device->release();
+ return CL_OUT_OF_HOST_MEMORY;
+ }
+
+ device->setWorkerThreadsAffinity(subComputeUnits, workerThreadsAffinity_, coreId);
+ *devices++ = as_cl(static_cast(device));
}
+ }
- if (num_devices != NULL) {
- *num_devices = numSubDevices;
- }
-
- if (devices != NULL) {
- if (num_entries < numSubDevices) {
- return CL_INVALID_VALUE;
- }
- uint coreId = (uint)-1;
- while (numSubDevices-- > 0) {
- Device* device = new Device(this);
- if (device == NULL) {
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- cl_uint subComputeUnits =
- create_info.countsListAt((size_t)numSubDevices);
- if (!device->create() ||
- !device->initSubDevice(info_, subComputeUnits, create_info)) {
- device->release();
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- device->setWorkerThreadsAffinity(
- subComputeUnits, workerThreadsAffinity_, coreId);
- *devices++ = as_cl(static_cast(device));
- }
- }
-
- return CL_SUCCESS;
+ return CL_SUCCESS;
}
-cl_int
-Device::partitionByAffinityDomainNUMA(
- const device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries,
- cl_device_id* devices,
- cl_uint* num_devices)
-{
- cl_uint numSubDevices = 0;
+cl_int Device::partitionByCounts(const device::CreateSubDevicesInfo& create_info,
+ cl_uint num_entries, cl_device_id* devices, cl_uint* num_devices) {
+ cl_uint maxComputeUnits = 0;
+ cl_uint numSubDevices = (cl_uint)create_info.p_.byCounts_.listSize_;
+ for (size_t i = (size_t)numSubDevices; i > 0; --i) {
+ maxComputeUnits += create_info.countsListAt(i);
+ }
+ if (numSubDevices == 0 || maxComputeUnits > info_.maxComputeUnits_) {
+ return CL_INVALID_DEVICE_PARTITION_COUNT;
+ }
+
+ if (num_devices != NULL) {
+ *num_devices = numSubDevices;
+ }
+
+ if (devices != NULL) {
+ if (num_entries < numSubDevices) {
+ return CL_INVALID_VALUE;
+ }
+ uint coreId = (uint)-1;
+ while (numSubDevices-- > 0) {
+ Device* device = new Device(this);
+ if (device == NULL) {
+ return CL_OUT_OF_HOST_MEMORY;
+ }
+
+ cl_uint subComputeUnits = create_info.countsListAt((size_t)numSubDevices);
+ if (!device->create() || !device->initSubDevice(info_, subComputeUnits, create_info)) {
+ device->release();
+ return CL_OUT_OF_HOST_MEMORY;
+ }
+
+ device->setWorkerThreadsAffinity(subComputeUnits, workerThreadsAffinity_, coreId);
+ *devices++ = as_cl(static_cast(device));
+ }
+ }
+
+ return CL_SUCCESS;
+}
+
+cl_int Device::partitionByAffinityDomainNUMA(const device::CreateSubDevicesInfo& create_info,
+ cl_uint num_entries, cl_device_id* devices,
+ cl_uint* num_devices) {
+ cl_uint numSubDevices = 0;
#if defined(__linux__)
#if !defined(NUMA_SUPPORT)
- return CL_INVALID_VALUE;
+ return CL_INVALID_VALUE;
#else
- int highestNuma = numa_max_node();
- if (highestNuma < 0) {
+ int highestNuma = numa_max_node();
+ if (highestNuma < 0) {
+ return CL_INVALID_VALUE;
+ }
+
+ numSubDevices = (cl_uint)highestNuma;
+ if (devices != NULL) {
+ for (int node = 0; node <= highestNuma; ++node) {
+ cl_uint subComputeUnits = 0;
+ int len = 1;
+ while (true) {
+ ulong* cpus = alloca(sizeof(ulong) * len);
+ if (numa_node_to_cpus(node, cpus, len * sizeof(ulong)) < 0) {
+ if (errno != ERANGE) {
+ return CL_INVALID_VALUE;
+ }
+ len *= 2;
+ } else {
+ len *= sizeof(ulong) * 8;
+ for (int i = 0; i < len; i++) {
+ if (test_bit(i, cpus)) {
+ ++subComputeUnits;
+ }
+ }
+ break;
+ }
+ }
+
+ if (subComputeUnits == 0) {
return CL_INVALID_VALUE;
+ }
+
+ Device* device = new Device(this);
+ if (device == NULL) {
+ return CL_OUT_OF_HOST_MEMORY;
+ }
+
+ if (!device->create() || NULL == (device->numaMask_ = new nodemask_t)) {
+ device->release();
+ return CL_OUT_OF_HOST_MEMORY;
+ }
+
+
+ if (!device->initSubDevice(info_, subComputeUnits, create_info)) {
+ delete device->numaMask_;
+ device->numaMask_ = NULL;
+ device->release();
+ return CL_OUT_OF_HOST_MEMORY;
+ }
+
+ nodemask_zero(device->numaMask_);
+ nodemask_set(device->numaMask_, node);
+ // Need to remove this domain type
+ device->info_.affinityDomain_.numa_ = 0;
+ *devices++ = as_cl(static_cast(device));
+ }
+ }
+#endif // NUMA_SUPPORT
+
+#else // win32
+ GROUP_AFFINITY numaNodeMask;
+ ULONG highestNuma = 0;
+ if (!::GetNumaHighestNodeNumber(&highestNuma)) {
+ return CL_INVALID_VALUE;
+ }
+
+ for (ULONG node = 0; node <= highestNuma; ++node) {
+ if (pfnGetNumaNodeProcessorMaskEx != NULL) {
+ if (!pfnGetNumaNodeProcessorMaskEx((USHORT)node, &numaNodeMask)) {
+ // Highet NUMA node number is not guaranteed to be the
+ // number of nodes.
+ continue;
+ }
+ } else {
+ ULONGLONG tmpMask;
+ if (!::GetNumaNodeProcessorMask((UCHAR)node, &tmpMask)) {
+ // Highet NUMA node number is not guaranteed to be the
+ // number of nodes.
+ continue;
+ }
+ numaNodeMask.Group = 0;
+ numaNodeMask.Mask = (KAFFINITY)tmpMask;
}
- numSubDevices = (cl_uint)highestNuma;
- if (devices != NULL) {
- for (int node = 0; node <= highestNuma; ++node) {
- cl_uint subComputeUnits = 0;
- int len = 1;
- while (true) {
- ulong* cpus = alloca(sizeof(ulong)*len);
- if (numa_node_to_cpus(node, cpus, len * sizeof(ulong)) < 0) {
- if (errno != ERANGE) {
- return CL_INVALID_VALUE;
- }
- len *= 2;
- }
- else {
- len *= sizeof(ulong) * 8;
- for (int i = 0; i < len; i++) {
- if (test_bit(i, cpus)) {
- ++subComputeUnits;
- }
- }
- break;
- }
- }
-
- if (subComputeUnits == 0) {
- return CL_INVALID_VALUE;
- }
-
- Device* device = new Device(this);
- if (device == NULL) {
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- if (!device->create() || NULL == (device->numaMask_ = new nodemask_t)) {
- device->release();
- return CL_OUT_OF_HOST_MEMORY;
- }
-
-
- if (!device->initSubDevice(
- info_, subComputeUnits, create_info)) {
- delete device->numaMask_;
- device->numaMask_ = NULL;
- device->release();
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- nodemask_zero(device->numaMask_);
- nodemask_set(device->numaMask_, node);
- // Need to remove this domain type
- device->info_.affinityDomain_.numa_ = 0;
- *devices++ = as_cl(static_cast(device));
- }
- }
-#endif // NUMA_SUPPORT
-
-#else // win32
- GROUP_AFFINITY numaNodeMask;
- ULONG highestNuma = 0;
- if (!::GetNumaHighestNodeNumber(&highestNuma)) {
- return CL_INVALID_VALUE;
- }
-
- for (ULONG node = 0; node <= highestNuma; ++node) {
- if (pfnGetNumaNodeProcessorMaskEx != NULL) {
- if (!pfnGetNumaNodeProcessorMaskEx((USHORT)node, &numaNodeMask)) {
- // Highet NUMA node number is not guaranteed to be the
- // number of nodes.
- continue;
- }
- }
- else {
- ULONGLONG tmpMask;
- if (!::GetNumaNodeProcessorMask((UCHAR)node, &tmpMask)) {
- // Highet NUMA node number is not guaranteed to be the
- // number of nodes.
- continue;
- }
- numaNodeMask.Group = 0;
- numaNodeMask.Mask = (KAFFINITY)tmpMask;
- }
-
- if (workerThreadsAffinity_ != NULL) {
- workerThreadsAffinity_->adjust(0, numaNodeMask.Mask);
- }
- if (numaNodeMask.Mask == 0) {
- continue;
- }
-
- if (devices != NULL) {
- Device* device = new Device(this);
- if (device == NULL) {
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- if (!device->create() || !device->initSubDevice(info_,
- (cl_uint)amd::countBitsSet(numaNodeMask.Mask), create_info)) {
- device->release();
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- device->workerThreadsAffinity_->set(
- numaNodeMask.Group, numaNodeMask.Mask);
- // Need to remove this domain type
- device->info_.affinityDomain_.numa_ = 0;
- *devices++ = as_cl(static_cast(device));
- }
- numSubDevices++;
- }
-
-#endif // win32
-
- if (num_devices != NULL) {
- *num_devices = numSubDevices;
- }
-
- // Could not get a processor mask for any of the nodes
- if (numSubDevices == 0) {
- return CL_INVALID_VALUE;
- }
- return CL_SUCCESS;
-}
-
-#if defined(__linux__)
-static bool
-readFileString(const char* file, char* buf, size_t bufSize)
-{
- int fd = open(file, O_RDONLY);
- if (fd < 0) {
- return false;
- }
-
- struct stat st;
- if (fstat(fd, &st) < 0) {
- close(fd);
- return false;
- }
-
- if ((size_t)st.st_size < bufSize) {
- bufSize = (size_t)st.st_size;
- }
-
- ssize_t n = read(fd, buf, bufSize);
- close(fd);
-
- if (n <= 0) {
- return false;
- }
-
- if (n >= (ssize_t)bufSize) {
- n = (ssize_t)bufSize - 1;
- }
- buf[n] = '\0';
- return true;
-}
-
-static void
-parseSharedCpuMap(const char* cpuMap, cpu_set_t& mask)
-{
- CPU_ZERO(&mask);
- uint32_t* bits = (uint32_t*)mask.__bits;
- const char* s = cpuMap + strlen(cpuMap);
- while (true) {
- s = (const char*)memrchr(cpuMap, ',', s - cpuMap);
- if (!s) {
- s = cpuMap;
- }
- else {
- s++;
- }
-
- *bits++ = strtoul(s, NULL, 16);
-
- if (s == cpuMap) {
- return;
- }
-
- --s;
- }
-}
-#endif // linux
-
-cl_int
-Device::partitionByAffinityDomainCacheLevel(
- const device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries,
- cl_device_id* devices,
- cl_uint* num_devices)
-{
- cl_uint cacheLevel = 0;
- switch (create_info.p_.byAffinityDomain_.value_) {
- case device::AffinityDomain::AFFINITY_DOMAIN_L4_CACHE:
- cacheLevel = 4;
- break;
- case device::AffinityDomain::AFFINITY_DOMAIN_L3_CACHE:
- cacheLevel = 3;
- break;
- case device::AffinityDomain::AFFINITY_DOMAIN_L2_CACHE:
- cacheLevel = 2;
- break;
- case device::AffinityDomain::AFFINITY_DOMAIN_L1_CACHE:
- cacheLevel = 1;
- break;
- default:
- return CL_INVALID_VALUE;
- }
-
- const uint negAffinityDomain =
- ~create_info.p_.byAffinityDomain_.value_;
- cl_uint numSubDevices = 0;
-
-#if defined(__linux__)
-
- amd::Os::ThreadAffinityMask affinityMask;
if (workerThreadsAffinity_ != NULL) {
- affinityMask = *workerThreadsAffinity_;
+ workerThreadsAffinity_->adjust(0, numaNodeMask.Mask);
}
- else {
- for (uint cpuId = 0; cpuId < (uint)info_.maxComputeUnits_; ++cpuId) {
- affinityMask.set(cpuId);
- }
+ if (numaNodeMask.Mask == 0) {
+ continue;
}
- amd::Os::ThreadAffinityMask currentMask;
- char buf[1024];
- for (uint cpuId = affinityMask.getFirstSet();
- cpuId != (uint)-1;
- cpuId = affinityMask.getNextSet(cpuId)) {
+ if (devices != NULL) {
+ Device* device = new Device(this);
+ if (device == NULL) {
+ return CL_OUT_OF_HOST_MEMORY;
+ }
- sprintf(buf,
- "/sys/devices/system/cpu/cpu%u/cache/index%u/shared_cpu_map",
- cpuId, cacheLevel);
+ if (!device->create() ||
+ !device->initSubDevice(info_, (cl_uint)amd::countBitsSet(numaNodeMask.Mask),
+ create_info)) {
+ device->release();
+ return CL_OUT_OF_HOST_MEMORY;
+ }
+
+ device->workerThreadsAffinity_->set(numaNodeMask.Group, numaNodeMask.Mask);
+ // Need to remove this domain type
+ device->info_.affinityDomain_.numa_ = 0;
+ *devices++ = as_cl(static_cast(device));
+ }
+ numSubDevices++;
+ }
+
+#endif // win32
+
+ if (num_devices != NULL) {
+ *num_devices = numSubDevices;
+ }
+
+ // Could not get a processor mask for any of the nodes
+ if (numSubDevices == 0) {
+ return CL_INVALID_VALUE;
+ }
+ return CL_SUCCESS;
+}
+
+#if defined(__linux__)
+static bool readFileString(const char* file, char* buf, size_t bufSize) {
+ int fd = open(file, O_RDONLY);
+ if (fd < 0) {
+ return false;
+ }
+
+ struct stat st;
+ if (fstat(fd, &st) < 0) {
+ close(fd);
+ return false;
+ }
+
+ if ((size_t)st.st_size < bufSize) {
+ bufSize = (size_t)st.st_size;
+ }
+
+ ssize_t n = read(fd, buf, bufSize);
+ close(fd);
+
+ if (n <= 0) {
+ return false;
+ }
+
+ if (n >= (ssize_t)bufSize) {
+ n = (ssize_t)bufSize - 1;
+ }
+ buf[n] = '\0';
+ return true;
+}
+
+static void parseSharedCpuMap(const char* cpuMap, cpu_set_t& mask) {
+ CPU_ZERO(&mask);
+ uint32_t* bits = (uint32_t*)mask.__bits;
+ const char* s = cpuMap + strlen(cpuMap);
+ while (true) {
+ s = (const char*)memrchr(cpuMap, ',', s - cpuMap);
+ if (!s) {
+ s = cpuMap;
+ } else {
+ s++;
+ }
+
+ *bits++ = strtoul(s, NULL, 16);
+
+ if (s == cpuMap) {
+ return;
+ }
+
+ --s;
+ }
+}
+#endif // linux
+
+cl_int Device::partitionByAffinityDomainCacheLevel(const device::CreateSubDevicesInfo& create_info,
+ cl_uint num_entries, cl_device_id* devices,
+ cl_uint* num_devices) {
+ cl_uint cacheLevel = 0;
+ switch (create_info.p_.byAffinityDomain_.value_) {
+ case device::AffinityDomain::AFFINITY_DOMAIN_L4_CACHE:
+ cacheLevel = 4;
+ break;
+ case device::AffinityDomain::AFFINITY_DOMAIN_L3_CACHE:
+ cacheLevel = 3;
+ break;
+ case device::AffinityDomain::AFFINITY_DOMAIN_L2_CACHE:
+ cacheLevel = 2;
+ break;
+ case device::AffinityDomain::AFFINITY_DOMAIN_L1_CACHE:
+ cacheLevel = 1;
+ break;
+ default:
+ return CL_INVALID_VALUE;
+ }
+
+ const uint negAffinityDomain = ~create_info.p_.byAffinityDomain_.value_;
+ cl_uint numSubDevices = 0;
+
+#if defined(__linux__)
+
+ amd::Os::ThreadAffinityMask affinityMask;
+ if (workerThreadsAffinity_ != NULL) {
+ affinityMask = *workerThreadsAffinity_;
+ } else {
+ for (uint cpuId = 0; cpuId < (uint)info_.maxComputeUnits_; ++cpuId) {
+ affinityMask.set(cpuId);
+ }
+ }
+
+ amd::Os::ThreadAffinityMask currentMask;
+ char buf[1024];
+ for (uint cpuId = affinityMask.getFirstSet(); cpuId != (uint)-1;
+ cpuId = affinityMask.getNextSet(cpuId)) {
+ sprintf(buf, "/sys/devices/system/cpu/cpu%u/cache/index%u/shared_cpu_map", cpuId, cacheLevel);
+
+ if (!readFileString(buf, buf, sizeof(buf))) {
+ return CL_INVALID_VALUE;
+ }
+
+ parseSharedCpuMap(buf, currentMask.getNative());
+ affinityMask.adjust(currentMask.getNative());
+ if (currentMask.isEmpty()) {
+ continue;
+ }
+
+ cl_uint maxComputeUnits;
+ if (cacheLevel > 1) {
+ maxComputeUnits = 0;
+ amd::Os::ThreadAffinityMask currentMaskSub;
+ cl_uint cacheLevelSub = cacheLevel - 1;
+ for (uint cpuIdSub = affinityMask.getFirstSet(); cpuIdSub != (uint)-1;
+ cpuIdSub = affinityMask.getNextSet(cpuIdSub)) {
+ sprintf(buf, "/sys/devices/system/cpu/cpu%u/cache/index%u/shared_cpu_map", cpuIdSub,
+ cacheLevelSub);
if (!readFileString(buf, buf, sizeof(buf))) {
- return CL_INVALID_VALUE;
+ return CL_INVALID_VALUE;
}
- parseSharedCpuMap(buf, currentMask.getNative());
- affinityMask.adjust(currentMask.getNative());
- if (currentMask.isEmpty()) {
+ parseSharedCpuMap(buf, currentMaskSub.getNative());
+ currentMask.adjust(currentMaskSub.getNative());
+ if (!currentMaskSub.isEmpty()) {
+ ++maxComputeUnits;
+ }
+ }
+
+ if (maxComputeUnits == 0) {
+ continue;
+ }
+ } else {
+ maxComputeUnits = 1;
+ }
+
+ if (devices != NULL) {
+ Device* device = new Device(this);
+ if (device == NULL) {
+ return CL_OUT_OF_HOST_MEMORY;
+ }
+
+ if (!device->create() || !device->initSubDevice(info_, maxComputeUnits, create_info)) {
+ device->release();
+ return CL_OUT_OF_HOST_MEMORY;
+ }
+
+ device->workerThreadsAffinity_->set(currentMask.getNative());
+ // Need to remove this domain type
+ device->info_.affinityDomain_.value_ &= negAffinityDomain;
+ *devices++ = as_cl(static_cast(device));
+ }
+ numSubDevices++;
+ affinityMask.clear(currentMask.getNative());
+ }
+
+#else // win32
+ DWORD length = 0;
+ ::GetLogicalProcessorInformation(NULL, &length);
+
+ PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer =
+ (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(length);
+
+ if (buffer != NULL && ::GetLogicalProcessorInformation(buffer, &length)) {
+ PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr,
+ limit = &buffer[length / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION)];
+
+ for (ptr = buffer; ptr < limit; ++ptr) {
+ PCACHE_DESCRIPTOR cache = &ptr->Cache;
+ if (ptr->Relationship == RelationCache && cache->Type != CacheInstruction) {
+ if (cache->Level == cacheLevel) {
+ KAFFINITY affinityMask = (KAFFINITY)ptr->ProcessorMask;
+ if (workerThreadsAffinity_ != NULL) {
+ workerThreadsAffinity_->adjust(0, affinityMask);
+ }
+ if (affinityMask == 0) {
continue;
- }
+ }
- cl_uint maxComputeUnits;
- if (cacheLevel > 1) {
+ cl_uint maxComputeUnits;
+ if (cacheLevel > 1) {
maxComputeUnits = 0;
- amd::Os::ThreadAffinityMask currentMaskSub;
cl_uint cacheLevelSub = cacheLevel - 1;
- for (uint cpuIdSub = affinityMask.getFirstSet();
- cpuIdSub != (uint)-1;
- cpuIdSub = affinityMask.getNextSet(cpuIdSub)) {
-
- sprintf(buf,
- "/sys/devices/system/cpu/cpu%u/cache/index%u/shared_cpu_map",
- cpuIdSub, cacheLevelSub);
-
- if (!readFileString(buf, buf, sizeof(buf))) {
- return CL_INVALID_VALUE;
- }
-
- parseSharedCpuMap(buf, currentMaskSub.getNative());
- currentMask.adjust(currentMaskSub.getNative());
- if (!currentMaskSub.isEmpty()) {
- ++maxComputeUnits;
+ for (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptrSub = buffer; ptrSub < limit; ++ptrSub) {
+ PCACHE_DESCRIPTOR cacheSub = &ptrSub->Cache;
+ if (ptrSub->Relationship == RelationCache && cacheSub->Type != CacheInstruction) {
+ if (cacheSub->Level == cacheLevelSub &&
+ ((affinityMask & (KAFFINITY)ptrSub->ProcessorMask) != 0)) {
+ ++maxComputeUnits;
}
+ }
}
if (maxComputeUnits == 0) {
- continue;
+ continue;
}
- }
- else {
+ } else {
maxComputeUnits = 1;
- }
+ }
- if (devices != NULL) {
+ if (devices != NULL) {
Device* device = new Device(this);
if (device == NULL) {
- return CL_OUT_OF_HOST_MEMORY;
+ free(buffer);
+ return CL_OUT_OF_HOST_MEMORY;
}
- if (!device->create() ||
- !device->initSubDevice(info_, maxComputeUnits, create_info)) {
- device->release();
- return CL_OUT_OF_HOST_MEMORY;
+ if (!device->create() || !device->initSubDevice(info_, maxComputeUnits, create_info)) {
+ free(buffer);
+ device->release();
+ return CL_OUT_OF_HOST_MEMORY;
}
- device->workerThreadsAffinity_->set(currentMask.getNative());
+ device->workerThreadsAffinity_->set(0, affinityMask);
// Need to remove this domain type
device->info_.affinityDomain_.value_ &= negAffinityDomain;
*devices++ = as_cl(static_cast(device));
+ }
+ numSubDevices++;
+ if (numSubDevices >= info_.maxComputeUnits_) {
+ break;
+ }
}
- numSubDevices++;
- affinityMask.clear(currentMask.getNative());
+ }
}
+ }
-#else // win32
- DWORD length = 0;
- ::GetLogicalProcessorInformation(NULL, &length);
-
- PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer =
- (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION) malloc(length);
-
- if (buffer != NULL && ::GetLogicalProcessorInformation(buffer, &length)) {
- PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr, limit =
- &buffer[length / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION)];
-
- for (ptr = buffer; ptr < limit; ++ptr) {
- PCACHE_DESCRIPTOR cache = &ptr->Cache;
- if (ptr->Relationship == RelationCache && cache->Type != CacheInstruction) {
- if (cache->Level == cacheLevel) {
- KAFFINITY affinityMask = (KAFFINITY)ptr->ProcessorMask;
- if (workerThreadsAffinity_ != NULL) {
- workerThreadsAffinity_->adjust(0, affinityMask);
- }
- if (affinityMask == 0) {
- continue;
- }
-
- cl_uint maxComputeUnits;
- if (cacheLevel > 1) {
- maxComputeUnits = 0;
- cl_uint cacheLevelSub = cacheLevel - 1;
- for (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION
- ptrSub = buffer; ptrSub < limit; ++ptrSub) {
-
- PCACHE_DESCRIPTOR cacheSub = &ptrSub->Cache;
- if (ptrSub->Relationship == RelationCache &&
- cacheSub->Type != CacheInstruction) {
- if (cacheSub->Level == cacheLevelSub &&
- ((affinityMask & (KAFFINITY)ptrSub->ProcessorMask) != 0)) {
- ++maxComputeUnits;
- }
- }
- }
-
- if (maxComputeUnits == 0) {
- continue;
- }
- }
- else {
- maxComputeUnits = 1;
- }
-
- if (devices != NULL) {
- Device* device = new Device(this);
- if (device == NULL) {
- free(buffer);
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- if (!device->create() || !device->initSubDevice(info_,
- maxComputeUnits, create_info)) {
- free(buffer);
- device->release();
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- device->workerThreadsAffinity_->set(0, affinityMask);
- // Need to remove this domain type
- device->info_.affinityDomain_.value_ &= negAffinityDomain;
- *devices++ = as_cl(static_cast(device));
- }
- numSubDevices++;
- if (numSubDevices >= info_.maxComputeUnits_) {
- break;
- }
- }
- }
- }
- }
-
- free(buffer);
+ free(buffer);
#endif
- if (num_devices != NULL) {
- *num_devices = numSubDevices;
- }
+ if (num_devices != NULL) {
+ *num_devices = numSubDevices;
+ }
- if (numSubDevices == 0) {
- return CL_INVALID_VALUE;
- }
+ if (numSubDevices == 0) {
+ return CL_INVALID_VALUE;
+ }
- return CL_SUCCESS;
+ return CL_SUCCESS;
}
-device::Program*
-Device::createProgram(amd::option::Options* options)
-{
- Program* cpuProgram = new Program(*this);
- if (cpuProgram == NULL) {
- LogError("We failed memory allocation for program!");
- }
+device::Program* Device::createProgram(amd::option::Options* options) {
+ Program* cpuProgram = new Program(*this);
+ if (cpuProgram == NULL) {
+ LogError("We failed memory allocation for program!");
+ }
- return cpuProgram;
+ return cpuProgram;
}
-void*
-Device::allocMapTarget(
- amd::Memory& mem,
- const amd::Coord3D& origin,
- const amd::Coord3D& region,
- uint mapFlags,
- size_t* rowPitch,
- size_t* slicePitch)
-{
- if (mem.asImage() != NULL) {
- amd::Image * image = mem.asImage();
- size_t elementSize = image->getImageFormat().getElementSize();
- size_t rp = image->getRowPitch();
- size_t sp = image->getSlicePitch();
- *rowPitch = rp;
- if (slicePitch) {
- *slicePitch = sp;
- }
- return (address) image->getHostMem()
- + (origin[0] * elementSize + origin[1] * rp + origin[2] * sp);
- }
- else if (mem.asBuffer() != NULL) {
- return (address) mem.getHostMem() + origin[0];
+void* Device::allocMapTarget(amd::Memory& mem, const amd::Coord3D& origin,
+ const amd::Coord3D& region, uint mapFlags, size_t* rowPitch,
+ size_t* slicePitch) {
+ if (mem.asImage() != NULL) {
+ amd::Image* image = mem.asImage();
+ size_t elementSize = image->getImageFormat().getElementSize();
+ size_t rp = image->getRowPitch();
+ size_t sp = image->getSlicePitch();
+ *rowPitch = rp;
+ if (slicePitch) {
+ *slicePitch = sp;
}
+ return (address)image->getHostMem() +
+ (origin[0] * elementSize + origin[1] * rp + origin[2] * sp);
+ } else if (mem.asBuffer() != NULL) {
+ return (address)mem.getHostMem() + origin[0];
+ }
- return NULL;
+ return NULL;
}
-void
-Device::freeMapTarget(amd::Memory& mem, void* target)
-{
- // nop for CPU
+void Device::freeMapTarget(amd::Memory& mem, void* target) {
+ // nop for CPU
}
-} // namespace cpu
+} // namespace cpu
diff --git a/rocclr/runtime/device/cpu/cpudevice.hpp b/rocclr/runtime/device/cpu/cpudevice.hpp
index 7399721aeb..16df72d541 100644
--- a/rocclr/runtime/device/cpu/cpudevice.hpp
+++ b/rocclr/runtime/device/cpu/cpudevice.hpp
@@ -21,9 +21,9 @@
namespace cpu {
//! Maximum number of the supported samplers
-const static uint32_t MaxSamplers = 16;
+const static uint32_t MaxSamplers = 16;
//! Maximum number of supported read images
-const static uint32_t MaxReadImage = 128;
+const static uint32_t MaxReadImage = 128;
//! Maximum number of supported write images
const static uint32_t MaxWriteImage = 64;
//! Maximum number of supported read/write images
@@ -40,203 +40,169 @@ const static uint32_t MaxReadWriteImage = 64;
*/
//! A CPU device ordinal
-class Device : public amd::Device
-{
-protected:
- static aclCompiler* compiler_;
-public:
- aclCompiler* compiler() const { return compiler_; }
+class Device : public amd::Device {
+ protected:
+ static aclCompiler* compiler_;
-public:
- static bool init(void);
+ public:
+ aclCompiler* compiler() const { return compiler_; }
- //! Shutdown CPU device
- static void tearDown();
+ public:
+ static bool init(void);
- //! Construct a new identifier
- Device(Device* parent = NULL) :
- amd::Device(parent),
- workerThreadsAffinity_(NULL)
- {}
+ //! Shutdown CPU device
+ static void tearDown();
- virtual ~Device();
+ //! Construct a new identifier
+ Device(Device* parent = NULL) : amd::Device(parent), workerThreadsAffinity_(NULL) {}
- bool create();
+ virtual ~Device();
- virtual cl_int createSubDevices(
- device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries,
- cl_device_id* devices,
- cl_uint* num_devices);
+ bool create();
- //! Instantiate a new virtual device
- virtual device::VirtualDevice* createVirtualDevice(
- amd::CommandQueue* queue = NULL
- )
- {
- VirtualCPU* virtualCpu = new VirtualCPU(*this);
- if (virtualCpu != NULL && !virtualCpu->acceptingCommands()) {
- virtualCpu->terminate();
- delete virtualCpu;
- virtualCpu = NULL;
- }
- return virtualCpu;
+ virtual cl_int createSubDevices(device::CreateSubDevicesInfo& create_info, cl_uint num_entries,
+ cl_device_id* devices, cl_uint* num_devices);
+
+ //! Instantiate a new virtual device
+ virtual device::VirtualDevice* createVirtualDevice(amd::CommandQueue* queue = NULL) {
+ VirtualCPU* virtualCpu = new VirtualCPU(*this);
+ if (virtualCpu != NULL && !virtualCpu->acceptingCommands()) {
+ virtualCpu->terminate();
+ delete virtualCpu;
+ virtualCpu = NULL;
}
+ return virtualCpu;
+ }
- //! Compile the given source code.
- virtual device::Program* createProgram(amd::option::Options* options = NULL);
+ //! Compile the given source code.
+ virtual device::Program* createProgram(amd::option::Options* options = NULL);
- //! Just returns NULL as CPU devices use the host memory
- virtual device::Memory* createMemory(amd::Memory& owner) const
- {
- return NULL;
- }
+ //! Just returns NULL as CPU devices use the host memory
+ virtual device::Memory* createMemory(amd::Memory& owner) const { return NULL; }
- //! Sampler object allocation
- virtual bool createSampler(
- const amd::Sampler& owner, //!< abstraction layer sampler object
- device::Sampler** sampler //!< device sampler object
- ) const
- {
- // Just return NULL on CPU device
- *sampler = NULL;
- return true;
- }
+ //! Sampler object allocation
+ virtual bool createSampler(const amd::Sampler& owner, //!< abstraction layer sampler object
+ device::Sampler** sampler //!< device sampler object
+ ) const {
+ // Just return NULL on CPU device
+ *sampler = NULL;
+ return true;
+ }
- //! Reallocates device memory obje
- virtual bool reallocMemory(amd::Memory& owner) const
- {
- return true;
- }
+ //! Reallocates device memory obje
+ virtual bool reallocMemory(amd::Memory& owner) const { return true; }
- //! Just returns NULL as CPU devices use the host memory
- virtual device::Memory* createView(
- amd::Memory& owner, //!< Owner memory object
- const device::Memory& parent //!< Parent device memory object for the view
- ) const
- {
- return NULL;
- }
+ //! Just returns NULL as CPU devices use the host memory
+ virtual device::Memory* createView(
+ amd::Memory& owner, //!< Owner memory object
+ const device::Memory& parent //!< Parent device memory object for the view
+ ) const {
+ return NULL;
+ }
- //! Acquire external graphics API object in the host thread
- //! Needed for OpenGL objects on CPU device
+ //! Acquire external graphics API object in the host thread
+ //! Needed for OpenGL objects on CPU device
- //! Return true if initialized interoperability, otherwise false
- virtual bool bindExternalDevice(uint flags, void* const pDevice[], void* pContext, bool validateOnly)
- {
- return true; // On CPU always avail if pD3DDevice is not NULL
- }
+ //! Return true if initialized interoperability, otherwise false
+ virtual bool bindExternalDevice(uint flags, void* const pDevice[], void* pContext,
+ bool validateOnly) {
+ return true; // On CPU always avail if pD3DDevice is not NULL
+ }
- virtual bool unbindExternalDevice(uint flags, void* const pDevice[], void* pContext, bool validateOnly)
- {
- return true;
- }
+ virtual bool unbindExternalDevice(uint flags, void* const pDevice[], void* pContext,
+ bool validateOnly) {
+ return true;
+ }
- //! Gets a pointer to a region of host-visible memory for use as the target
- //! of a non-blocking map for a given memory object
- virtual void* allocMapTarget(
- amd::Memory& mem, //!< Abstraction layer memory object
- const amd::Coord3D& origin, //!< The map location in memory
- const amd::Coord3D& region, //!< The map region in memory
- uint mapFlags, //!< Map flags
- size_t* rowPitch = NULL, //!< Row pitch for the mapped memory
- size_t* slicePitch = NULL //!< Slice for the mapped memory
- );
+ //! Gets a pointer to a region of host-visible memory for use as the target
+ //! of a non-blocking map for a given memory object
+ virtual void* allocMapTarget(amd::Memory& mem, //!< Abstraction layer memory object
+ const amd::Coord3D& origin, //!< The map location in memory
+ const amd::Coord3D& region, //!< The map region in memory
+ uint mapFlags, //!< Map flags
+ size_t* rowPitch = NULL, //!< Row pitch for the mapped memory
+ size_t* slicePitch = NULL //!< Slice for the mapped memory
+ );
- //! Releases non-blocking map target memory
- virtual void freeMapTarget(amd::Memory& mem, void* target);
+ //! Releases non-blocking map target memory
+ virtual void freeMapTarget(amd::Memory& mem, void* target);
- //! Empty implementation on a CPU device
- virtual bool globalFreeMemory(size_t* freeMemory) const { return false; }
+ //! Empty implementation on a CPU device
+ virtual bool globalFreeMemory(size_t* freeMemory) const { return false; }
- //! Get CPU device settings
- const cpu::Settings& settings() const
- { return reinterpret_cast(*settings_); }
+ //! Get CPU device settings
+ const cpu::Settings& settings() const { return reinterpret_cast(*settings_); }
- bool hasAVXInstructions() const
- { return (settings().cpuFeatures_ & Settings::AVXInstructions) ? true : false; }
+ bool hasAVXInstructions() const {
+ return (settings().cpuFeatures_ & Settings::AVXInstructions) ? true : false;
+ }
- bool hasFMA4Instructions() const
- { return (settings().cpuFeatures_ & Settings::FMA4Instructions) ? true : false; }
+ bool hasFMA4Instructions() const {
+ return (settings().cpuFeatures_ & Settings::FMA4Instructions) ? true : false;
+ }
- static size_t getMaxWorkerThreadsNumber() { return maxWorkerThreads_; }
+ static size_t getMaxWorkerThreadsNumber() { return maxWorkerThreads_; }
- void setWorkerThreadsAffinity(
- cl_uint numWorkerThreads,
- const amd::Os::ThreadAffinityMask* threadsAffinityMask,
- uint& baseCoreId);
+ void setWorkerThreadsAffinity(cl_uint numWorkerThreads,
+ const amd::Os::ThreadAffinityMask* threadsAffinityMask,
+ uint& baseCoreId);
- const amd::Os::ThreadAffinityMask* getWorkerThreadsAffinity() const
- {
- return workerThreadsAffinity_;
- }
- //! host memory alloc
- virtual void* svmAlloc(amd::Context& context, size_t size, size_t alignment, cl_svm_mem_flags flags, void* svmPtr) const
- {
- return NULL;
- }
+ const amd::Os::ThreadAffinityMask* getWorkerThreadsAffinity() const {
+ return workerThreadsAffinity_;
+ }
+ //! host memory alloc
+ virtual void* svmAlloc(amd::Context& context, size_t size, size_t alignment,
+ cl_svm_mem_flags flags, void* svmPtr) const {
+ return NULL;
+ }
- //! host memory deallocation
- virtual void svmFree(void* ptr) const
- {
- return;
- }
-private:
- bool initSubDevice(
- device::Info& info,
- cl_uint maxComputeUnits,
- const device::CreateSubDevicesInfo& create_info);
+ //! host memory deallocation
+ virtual void svmFree(void* ptr) const { return; }
- cl_int partitionEqually(
- const device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries,
- cl_device_id* devices,
- cl_uint* num_devices);
+ private:
+ bool initSubDevice(device::Info& info, cl_uint maxComputeUnits,
+ const device::CreateSubDevicesInfo& create_info);
- cl_int partitionByCounts(
- const device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries,
- cl_device_id* devices,
- cl_uint* num_devices);
+ cl_int partitionEqually(const device::CreateSubDevicesInfo& create_info, cl_uint num_entries,
+ cl_device_id* devices, cl_uint* num_devices);
- cl_int partitionByAffinityDomainNUMA(
- const device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries,
- cl_device_id* devices,
- cl_uint* num_devices);
+ cl_int partitionByCounts(const device::CreateSubDevicesInfo& create_info, cl_uint num_entries,
+ cl_device_id* devices, cl_uint* num_devices);
- cl_int partitionByAffinityDomainCacheLevel(
- const device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries,
- cl_device_id* devices,
- cl_uint* num_devices);
+ cl_int partitionByAffinityDomainNUMA(const device::CreateSubDevicesInfo& create_info,
+ cl_uint num_entries, cl_device_id* devices,
+ cl_uint* num_devices);
-private:
+ cl_int partitionByAffinityDomainCacheLevel(const device::CreateSubDevicesInfo& create_info,
+ cl_uint num_entries, cl_device_id* devices,
+ cl_uint* num_devices);
+
+ private:
#if defined(__linux__) && defined(NUMA_SUPPORT)
-public:
- const nodemask_t* getNumaMask() const
- {
- return (info_.partitionCreateInfo_.type_ == device::PartitionType::BY_AFFINITY_DOMAIN &&
- info_.partitionCreateInfo_.byAffinityDomain_.numa_) ?
- numaMask_ : NULL;
- }
+ public:
+ const nodemask_t* getNumaMask() const {
+ return (info_.partitionCreateInfo_.type_ == device::PartitionType::BY_AFFINITY_DOMAIN &&
+ info_.partitionCreateInfo_.byAffinityDomain_.numa_)
+ ? numaMask_
+ : NULL;
+ }
-private:
- union {
- nodemask_t* numaMask_;
- amd::Os::ThreadAffinityMask* workerThreadsAffinity_; //!< As the number of compute units.
- };
+ private:
+ union {
+ nodemask_t* numaMask_;
+ amd::Os::ThreadAffinityMask* workerThreadsAffinity_; //!< As the number of compute units.
+ };
#else
- amd::Os::ThreadAffinityMask* workerThreadsAffinity_; //!< As the number of compute units.
+ amd::Os::ThreadAffinityMask* workerThreadsAffinity_; //!< As the number of compute units.
#endif
- static size_t maxWorkerThreads_; //!< Maximum number of Worker Threads
+ static size_t maxWorkerThreads_; //!< Maximum number of Worker Threads
};
/*! @}
* @}
*/
-} // namespace cpu
+} // namespace cpu
-#endif // CPUDEVICE_HPP_
+#endif // CPUDEVICE_HPP_
diff --git a/rocclr/runtime/device/cpu/cpufeat.hpp b/rocclr/runtime/device/cpu/cpufeat.hpp
index f97f8a3b7f..75ffceaedb 100644
--- a/rocclr/runtime/device/cpu/cpufeat.hpp
+++ b/rocclr/runtime/device/cpu/cpufeat.hpp
@@ -24,4 +24,4 @@
#define CPUFEAT_DX_SSE (1 < 25)
#define CPUFEAT_DX_SSE2 (1 << 26)
-#endif // CPUFEAT_HPP
+#endif // CPUFEAT_HPP
diff --git a/rocclr/runtime/device/cpu/cpukernel.hpp b/rocclr/runtime/device/cpu/cpukernel.hpp
index 5bfa1ff02b..a2544850ce 100644
--- a/rocclr/runtime/device/cpu/cpukernel.hpp
+++ b/rocclr/runtime/device/cpu/cpukernel.hpp
@@ -15,91 +15,79 @@
namespace cpu {
//! \class CPU kernel
-class Kernel : public device::Kernel
-{
-private:
- const void* entryPoint_; //!< entry for the kernel
+class Kernel : public device::Kernel {
+ private:
+ const void* entryPoint_; //!< entry for the kernel
- std::vector< std::pair > args_;
- std::vector< std::pair < HCtoDCmap, size_t> > HCtoDCmaps_;
- std::vector< HCtoDCmap > internal_maps_;
-public:
- uint nature_; //!< kernel's nature
- uint privateSize_; //!< WorkItem's private memory size (in bytes)
+ std::vector > args_;
+ std::vector > HCtoDCmaps_;
+ std::vector internal_maps_;
-private:
- //! Disable default copy constructor
- Kernel(const Kernel&);
- //! Disable operator=
- Kernel& operator=(const Kernel&);
+ public:
+ uint nature_; //!< kernel's nature
+ uint privateSize_; //!< WorkItem's private memory size (in bytes)
-public:
- void addArg(size_t size, size_t alignment) {
- args_.push_back(std::pair(size, alignment));
- }
+ private:
+ //! Disable default copy constructor
+ Kernel(const Kernel&);
+ //! Disable operator=
+ Kernel& operator=(const Kernel&);
- size_t getArgSize(int argIndex) const {
- return args_[argIndex].first;
- }
+ public:
+ void addArg(size_t size, size_t alignment) {
+ args_.push_back(std::pair(size, alignment));
+ }
- size_t getArgAlignment(int argIndex) const {
- return args_[argIndex].second;
- }
+ size_t getArgSize(int argIndex) const { return args_[argIndex].first; }
- void addInternalMap(HCtoDCmap *new_map) {
- if (new_map != NULL) {
- internal_maps_.push_back(*new_map);
- this->addInternalMap(new_map->internal_field_map);
- this->addInternalMap(new_map->next_field_map);
- }
- else
- return;
- }
+ size_t getArgAlignment(int argIndex) const { return args_[argIndex].second; }
- void addHCtoDCmap(HCtoDCmap *new_map) {
- if (new_map != NULL) {
- if (HCtoDCmaps_.size() > 0)
- HCtoDCmaps_.push_back(std::pair< HCtoDCmap, size_t >(*new_map, HCtoDCmaps_.back().second));
- else
- HCtoDCmaps_.push_back(std::pair< HCtoDCmap, size_t >(*new_map, 0));
- }
- else
- return;
- }
+ void addInternalMap(HCtoDCmap* new_map) {
+ if (new_map != NULL) {
+ internal_maps_.push_back(*new_map);
+ this->addInternalMap(new_map->internal_field_map);
+ this->addInternalMap(new_map->next_field_map);
+ } else
+ return;
+ }
- HCtoDCmap getHCtoDCmap(int mapIndex) const {
- return HCtoDCmaps_[mapIndex].first;
- }
+ void addHCtoDCmap(HCtoDCmap* new_map) {
+ if (new_map != NULL) {
+ if (HCtoDCmaps_.size() > 0)
+ HCtoDCmaps_.push_back(std::pair(*new_map, HCtoDCmaps_.back().second));
+ else
+ HCtoDCmaps_.push_back(std::pair(*new_map, 0));
+ } else
+ return;
+ }
+
+ HCtoDCmap getHCtoDCmap(int mapIndex) const { return HCtoDCmaps_[mapIndex].first; }
- uint getArgNumber() {
- return HCtoDCmaps_.size();
- }
+ uint getArgNumber() { return HCtoDCmaps_.size(); }
- //! Default constructor
- Kernel(const std::string& name)
- : device::Kernel(name), entryPoint_(NULL), nature_(0),
- privateSize_(CLK_PRIVATE_MEMORY_SIZE)
- {
- workGroupInfo_.size_ = CPU_MAX_WORKGROUP_SIZE;
- }
+ //! Default constructor
+ Kernel(const std::string& name)
+ : device::Kernel(name), entryPoint_(NULL), nature_(0), privateSize_(CLK_PRIVATE_MEMORY_SIZE) {
+ workGroupInfo_.size_ = CPU_MAX_WORKGROUP_SIZE;
+ }
- //! Default destructor
- ~Kernel() {}
+ //! Default destructor
+ ~Kernel() {}
- //! Returns the CPU kernel entry point
- const void* getEntryPoint() const { return entryPoint_; }
+ //! Returns the CPU kernel entry point
+ const void* getEntryPoint() const { return entryPoint_; }
- //! Sets the CPU kernel entry point
- void setEntryPoint(const void* entryPoint) { entryPoint_ = entryPoint; }
+ //! Sets the CPU kernel entry point
+ void setEntryPoint(const void* entryPoint) { entryPoint_ = entryPoint; }
- //! Returns true if the kernel has a call to barrier
- bool hasBarrier() const { return 0 != (nature_ & KN_HAS_BARRIER); }
+ //! Returns true if the kernel has a call to barrier
+ bool hasBarrier() const { return 0 != (nature_ & KN_HAS_BARRIER); }
- //! Returns the private memory size of a single WorkItem
- uint getWorkItemPrivateMemSize() const { return privateSize_; }
+ //! Returns the private memory size of a single WorkItem
+ uint getWorkItemPrivateMemSize() const { return privateSize_; }
};
-} // namespace cpu
+} // namespace cpu
-#endif // CPUKERNEL_HPP_
+#endif // CPUKERNEL_HPP_
diff --git a/rocclr/runtime/device/cpu/cpumapping.cpp b/rocclr/runtime/device/cpu/cpumapping.cpp
index 3ef0572635..43b3279fae 100644
--- a/rocclr/runtime/device/cpu/cpumapping.cpp
+++ b/rocclr/runtime/device/cpu/cpumapping.cpp
@@ -25,354 +25,403 @@ using std::min;
using std::max;
namespace cpu {
- HCtoDCmap::HCtoDCmap(const clk_parameter_descriptor_t* desc, unsigned int level_alignment, unsigned int index, unsigned int init_offset)
- {
- level_alignment = std::max(level_alignment, 1u); // Minimal possible alignment is 1 and alignment is used as a divisor below.
- //Initialize fields
- hc_offset = 0;
- hc_size = 0;
- dc_offset = 0;
- dc_size = 0;
- hc_alignment = level_alignment;
- dc_alignment = level_alignment;
- internal_field_map = NULL;
- next_field_map = NULL;
- return;
- }
+HCtoDCmap::HCtoDCmap(const clk_parameter_descriptor_t* desc, unsigned int level_alignment,
+ unsigned int index, unsigned int init_offset) {
+ level_alignment =
+ std::max(level_alignment,
+ 1u); // Minimal possible alignment is 1 and alignment is used as a divisor below.
+ // Initialize fields
+ hc_offset = 0;
+ hc_size = 0;
+ dc_offset = 0;
+ dc_size = 0;
+ hc_alignment = level_alignment;
+ dc_alignment = level_alignment;
+ internal_field_map = NULL;
+ next_field_map = NULL;
+ return;
+}
- HCtoDCmap::~HCtoDCmap()
- {
- return;
- }
+HCtoDCmap::~HCtoDCmap() { return; }
- //Helper to find sizes of each scalar type
- size_t HCtoDCmap::getHostScalarParamSize(const clk_value_type_t type) const
- {
- size_t size = 0;
- switch (type) {
- case T_CHAR:
- size = 1;
- break;
- case T_SHORT: case T_CHAR2:
- size = 2;
- break;
- case T_FLOAT: case T_INT: case T_CHAR4:
- case T_SHORT2: case T_CHAR3:
- size = 4;
- break;
- case T_SAMPLER:
- size = 4;
- break;
- case T_LONG: case T_DOUBLE: case T_CHAR8:
- case T_SHORT4: case T_INT2: case T_FLOAT2:
- case T_SHORT3:
- size = 8;
- break;
- case T_INT3: case T_FLOAT3:
- case T_CHAR16: case T_SHORT8: case T_INT4:
- case T_FLOAT4: case T_LONG2: case T_DOUBLE2:
- size = 16;
- break;
- case T_LONG3: case T_DOUBLE3:
- case T_SHORT16: case T_INT8: case T_FLOAT8:
- case T_LONG4: case T_DOUBLE4:
- size = 32;
- break;
- case T_INT16: case T_FLOAT16: case T_LONG8:
- case T_DOUBLE8:
- size = 64;
- break;
- case T_LONG16: case T_DOUBLE16:
- size = 128;
- break;
- case T_POINTER: case T_VOID:
- size = sizeof(void*);
- break;
- default:
- assert(0 && "unknown scalar parameter size");
- break;
- }
- return size;
- }
+// Helper to find sizes of each scalar type
+size_t HCtoDCmap::getHostScalarParamSize(const clk_value_type_t type) const {
+ size_t size = 0;
+ switch (type) {
+ case T_CHAR:
+ size = 1;
+ break;
+ case T_SHORT:
+ case T_CHAR2:
+ size = 2;
+ break;
+ case T_FLOAT:
+ case T_INT:
+ case T_CHAR4:
+ case T_SHORT2:
+ case T_CHAR3:
+ size = 4;
+ break;
+ case T_SAMPLER:
+ size = 4;
+ break;
+ case T_LONG:
+ case T_DOUBLE:
+ case T_CHAR8:
+ case T_SHORT4:
+ case T_INT2:
+ case T_FLOAT2:
+ case T_SHORT3:
+ size = 8;
+ break;
+ case T_INT3:
+ case T_FLOAT3:
+ case T_CHAR16:
+ case T_SHORT8:
+ case T_INT4:
+ case T_FLOAT4:
+ case T_LONG2:
+ case T_DOUBLE2:
+ size = 16;
+ break;
+ case T_LONG3:
+ case T_DOUBLE3:
+ case T_SHORT16:
+ case T_INT8:
+ case T_FLOAT8:
+ case T_LONG4:
+ case T_DOUBLE4:
+ size = 32;
+ break;
+ case T_INT16:
+ case T_FLOAT16:
+ case T_LONG8:
+ case T_DOUBLE8:
+ size = 64;
+ break;
+ case T_LONG16:
+ case T_DOUBLE16:
+ size = 128;
+ break;
+ case T_POINTER:
+ case T_VOID:
+ size = sizeof(void*);
+ break;
+ default:
+ assert(0 && "unknown scalar parameter size");
+ break;
+ }
+ return size;
+}
- size_t HCtoDCmap::getScalarAlignment(const clk_value_type_t type, bool isHost) const
- {
- size_t align = 0;
- switch (type) {
- case T_CHAR:
- align = 1;
- break;
- case T_SHORT: case T_CHAR2:
- align = 2;
- break;
- case T_FLOAT: case T_INT: case T_CHAR4:
- case T_SHORT2: case T_CHAR3:
- align = 4;
- break;
- case T_SAMPLER:
- align = sizeof(uint32_t);
- break;
- case T_LONG:
- #if defined(_WIN32)
- align = 8;
- #else
- align = isHost? 8 : LP64_SWITCH(4, 8);
- #endif
- break;
- case T_DOUBLE:
- #if defined(_WIN32)
- align = 8;
- #else
- align = LP64_SWITCH(4, 8);
- #endif
- break;
- case T_CHAR8:
- case T_SHORT4: case T_INT2: case T_FLOAT2:
- case T_SHORT3:
- align = 4;
- break;
- case T_INT3: case T_FLOAT3:
- case T_CHAR16: case T_SHORT8: case T_INT4:
- case T_FLOAT4: case T_LONG2: case T_DOUBLE2:
- case T_LONG3: case T_DOUBLE3:
- case T_SHORT16: case T_INT8: case T_FLOAT8:
- case T_LONG4: case T_DOUBLE4:
- case T_INT16: case T_FLOAT16: case T_LONG8:
- case T_DOUBLE8:
- case T_LONG16: case T_DOUBLE16:
- align = LP64_SWITCH(4, 8);
- break;
- case T_POINTER: case T_VOID:
- align = sizeof(void*);
- break;
- default:
- assert(0 && "unknown scalar parameter alignment");
- break;
- }
- return align;
- }
+size_t HCtoDCmap::getScalarAlignment(const clk_value_type_t type, bool isHost) const {
+ size_t align = 0;
+ switch (type) {
+ case T_CHAR:
+ align = 1;
+ break;
+ case T_SHORT:
+ case T_CHAR2:
+ align = 2;
+ break;
+ case T_FLOAT:
+ case T_INT:
+ case T_CHAR4:
+ case T_SHORT2:
+ case T_CHAR3:
+ align = 4;
+ break;
+ case T_SAMPLER:
+ align = sizeof(uint32_t);
+ break;
+ case T_LONG:
+#if defined(_WIN32)
+ align = 8;
+#else
+ align = isHost ? 8 : LP64_SWITCH(4, 8);
+#endif
+ break;
+ case T_DOUBLE:
+#if defined(_WIN32)
+ align = 8;
+#else
+ align = LP64_SWITCH(4, 8);
+#endif
+ break;
+ case T_CHAR8:
+ case T_SHORT4:
+ case T_INT2:
+ case T_FLOAT2:
+ case T_SHORT3:
+ align = 4;
+ break;
+ case T_INT3:
+ case T_FLOAT3:
+ case T_CHAR16:
+ case T_SHORT8:
+ case T_INT4:
+ case T_FLOAT4:
+ case T_LONG2:
+ case T_DOUBLE2:
+ case T_LONG3:
+ case T_DOUBLE3:
+ case T_SHORT16:
+ case T_INT8:
+ case T_FLOAT8:
+ case T_LONG4:
+ case T_DOUBLE4:
+ case T_INT16:
+ case T_FLOAT16:
+ case T_LONG8:
+ case T_DOUBLE8:
+ case T_LONG16:
+ case T_DOUBLE16:
+ align = LP64_SWITCH(4, 8);
+ break;
+ case T_POINTER:
+ case T_VOID:
+ align = sizeof(void*);
+ break;
+ default:
+ assert(0 && "unknown scalar parameter alignment");
+ break;
+ }
+ return align;
+}
- // Align up arguments within each map, return the size of current map parameter
- // Input current alignment of the parameter, size of outer struct if it exists
- void HCtoDCmap::align_map(unsigned outer_hc_alignment, unsigned outer_dc_alignment, unsigned &outer_hc_size, unsigned &outer_dc_size, int &inStruct)
- {
- unsigned map_param_size = 0;
- if (internal_field_map != NULL) {
- hc_size = 0; //Recalculate size to account for internal offsets
- inStruct++;
- internal_field_map->align_map(hc_alignment, dc_alignment, hc_size, dc_size, inStruct); // align internal struct, might alter size of this struct
- if (hc_alignment != 1 && hc_size%hc_alignment)
- hc_size = max(hc_size, hc_size - (hc_size%hc_alignment) + hc_alignment);
- if (dc_alignment != 1 && dc_size%dc_alignment)
- dc_size = max(dc_size, dc_size - (dc_size%dc_alignment) + dc_alignment);
- }
- // Use map_param_size to store current parameter size after adjusting alignment
- if (hc_alignment != 1 && hc_size % hc_alignment != 0) {
- map_param_size = max(hc_alignment, hc_size - (hc_size%hc_alignment) + hc_alignment);
- }
- else {
- map_param_size = max(hc_alignment, hc_size);
- }
- if (next_field_map != NULL) {
- next_field_map->hc_offset = this->next_offset(hc_offset, map_param_size, inStruct);
- next_field_map->align_map(outer_hc_alignment, outer_dc_alignment, outer_hc_size, outer_dc_size, inStruct);
- // Reset parameter size for char padding
- if (next_field_map->type == T_CHAR)
- map_param_size = 1;
- }
- else
- {
- // Moving out of struct
- if (inStruct > 0)
- inStruct--;
- if (type == T_CHAR)
- map_param_size = 1;
- }
- outer_hc_size = max(outer_hc_size, hc_offset+map_param_size);
- outer_dc_size = max(outer_dc_size, dc_offset+dc_size);
- return;
- }
+// Align up arguments within each map, return the size of current map parameter
+// Input current alignment of the parameter, size of outer struct if it exists
+void HCtoDCmap::align_map(unsigned outer_hc_alignment, unsigned outer_dc_alignment,
+ unsigned& outer_hc_size, unsigned& outer_dc_size, int& inStruct) {
+ unsigned map_param_size = 0;
+ if (internal_field_map != NULL) {
+ hc_size = 0; // Recalculate size to account for internal offsets
+ inStruct++;
+ internal_field_map->align_map(
+ hc_alignment, dc_alignment, hc_size, dc_size,
+ inStruct); // align internal struct, might alter size of this struct
+ if (hc_alignment != 1 && hc_size % hc_alignment)
+ hc_size = max(hc_size, hc_size - (hc_size % hc_alignment) + hc_alignment);
+ if (dc_alignment != 1 && dc_size % dc_alignment)
+ dc_size = max(dc_size, dc_size - (dc_size % dc_alignment) + dc_alignment);
+ }
+ // Use map_param_size to store current parameter size after adjusting alignment
+ if (hc_alignment != 1 && hc_size % hc_alignment != 0) {
+ map_param_size = max(hc_alignment, hc_size - (hc_size % hc_alignment) + hc_alignment);
+ } else {
+ map_param_size = max(hc_alignment, hc_size);
+ }
+ if (next_field_map != NULL) {
+ next_field_map->hc_offset = this->next_offset(hc_offset, map_param_size, inStruct);
+ next_field_map->align_map(outer_hc_alignment, outer_dc_alignment, outer_hc_size, outer_dc_size,
+ inStruct);
+ // Reset parameter size for char padding
+ if (next_field_map->type == T_CHAR) map_param_size = 1;
+ } else {
+ // Moving out of struct
+ if (inStruct > 0) inStruct--;
+ if (type == T_CHAR) map_param_size = 1;
+ }
+ outer_hc_size = max(outer_hc_size, hc_offset + map_param_size);
+ outer_dc_size = max(outer_dc_size, dc_offset + dc_size);
+ return;
+}
- // Return current size of map, calculate internal maps and process next args if in struct.
- // Alignment: alignment flag for members in case of structs, alignment of scalar otherwise.
- int HCtoDCmap::compute_map(const clk_parameter_descriptor_t* desc, unsigned int &outer_hc_alignment, unsigned int &outer_dc_alignment, unsigned int init_offset, int& inStruct, int& index_out)
- {
- unsigned internal_index;
+// Return current size of map, calculate internal maps and process next args if in struct.
+// Alignment: alignment flag for members in case of structs, alignment of scalar otherwise.
+int HCtoDCmap::compute_map(const clk_parameter_descriptor_t* desc, unsigned int& outer_hc_alignment,
+ unsigned int& outer_dc_alignment, unsigned int init_offset,
+ int& inStruct, int& index_out) {
+ unsigned internal_index;
+ internal_index = index_out;
+ unsigned int next_offset = init_offset;
+ unsigned struct_size = 0;
+ type = desc[internal_index].type;
+
+ if (desc[internal_index].type == T_STRUCT) {
+ // Moving into struct, go to next index
+ inStruct++;
+ hc_offset = init_offset;
+ if (desc[index_out + 1].type != T_VOID) {
+ index_out++;
+ internal_index = index_out;
+ internal_field_map = new HCtoDCmap(desc, 0, internal_index, init_offset);
+ hc_size = internal_field_map->compute_map(desc, hc_alignment, dc_alignment, next_offset,
+ inStruct, index_out);
+ hc_alignment =
+ max(hc_alignment,
+ internal_field_map->hc_alignment); // Adjust alignment to biggest member alignment
+ struct_size = hc_size;
+ internal_index = index_out;
+ outer_hc_alignment = max(outer_hc_alignment, hc_alignment);
+ if (inStruct > 0) {
+ if (desc[index_out + 1].type != T_VOID) {
+ // Still inside struct and not done
+ index_out++;
+ internal_index = index_out;
+ next_field_map = new HCtoDCmap(desc, 0, internal_index, next_offset);
+ struct_size = hc_size;
+ struct_size += next_field_map->compute_map(desc, outer_hc_alignment, outer_dc_alignment,
+ next_offset, inStruct, index_out);
+ next_offset = max(next_field_map->hc_offset + next_field_map->hc_size,
+ next_field_map->hc_offset + hc_alignment);
+ // running count of strucdc_size = hc_size + size of next member
+ return struct_size;
+ } else {
+ // Moving out of struct, go to next index
+ index_out++;
+ internal_index = index_out;
+ inStruct--;
+ return hc_size; // return last struct member size
+ }
+ }
+ }
+ } else if (desc[internal_index].type == T_PAD) {
+ // Struct has padding
+ hc_offset = init_offset;
+ if (desc[index_out + 1].type != T_VOID) {
+ index_out++;
+ internal_index = index_out;
+ internal_field_map = new HCtoDCmap(desc, 0, internal_index, init_offset);
+ hc_size = internal_field_map->compute_map(desc, hc_alignment, dc_alignment, next_offset,
+ inStruct, index_out);
+ // Adjust alignment to biggest member alignment
+ hc_alignment = 1;
+ dc_alignment = 1;
+ unsigned pad_size = hc_size;
+ internal_index = index_out;
+ if (desc[index_out + 1].type != T_VOID) {
+ // Still inside padding and not done
+ index_out++;
internal_index = index_out;
- unsigned int next_offset = init_offset;
- unsigned struct_size = 0;
- type = desc[internal_index].type;
-
- if (desc[internal_index].type == T_STRUCT) {
- //Moving into struct, go to next index
- inStruct++;
- hc_offset = init_offset;
- if (desc[index_out+1].type != T_VOID) {
- index_out++;
- internal_index = index_out;
- internal_field_map = new HCtoDCmap(desc, 0, internal_index, init_offset);
- hc_size = internal_field_map->compute_map(desc, hc_alignment, dc_alignment, next_offset, inStruct, index_out);
- hc_alignment = max(hc_alignment, internal_field_map->hc_alignment); // Adjust alignment to biggest member alignment
- struct_size = hc_size;
- internal_index = index_out;
- outer_hc_alignment = max(outer_hc_alignment, hc_alignment);
- if (inStruct > 0) {
- if (desc[index_out+1].type != T_VOID) {
- //Still inside struct and not done
- index_out++;
- internal_index = index_out;
- next_field_map = new HCtoDCmap(desc, 0, internal_index, next_offset);
- struct_size = hc_size;
- struct_size += next_field_map->compute_map(desc, outer_hc_alignment, outer_dc_alignment, next_offset, inStruct, index_out);
- next_offset = max(next_field_map->hc_offset+next_field_map->hc_size, next_field_map->hc_offset+hc_alignment);
- // running count of strucdc_size = hc_size + size of next member
- return struct_size;
- }
- else {
- //Moving out of struct, go to next index
- index_out++;
- internal_index = index_out;
- inStruct--;
- return hc_size; //return last struct member size
- }
- }
- }
- }
- else if (desc[internal_index].type == T_PAD) {
- //Struct has padding
- hc_offset = init_offset;
- if (desc[index_out+1].type != T_VOID) {
- index_out++;
- internal_index = index_out;
- internal_field_map = new HCtoDCmap(desc, 0, internal_index, init_offset);
- hc_size = internal_field_map->compute_map(desc, hc_alignment, dc_alignment, next_offset, inStruct, index_out);
- // Adjust alignment to biggest member alignment
- hc_alignment = 1;
- dc_alignment = 1;
- unsigned pad_size = hc_size;
- internal_index = index_out;
- if (desc[index_out+1].type != T_VOID) {
- //Still inside padding and not done
- index_out++;
- internal_index = index_out;
- next_field_map = new HCtoDCmap(desc, 0, internal_index, next_offset);
- pad_size = hc_size;
- pad_size += next_field_map->compute_map(desc, outer_hc_alignment, outer_dc_alignment, next_offset, inStruct, index_out);
- next_offset = max(next_field_map->hc_offset+next_field_map->hc_size, next_field_map->hc_offset+hc_alignment);
- // running count of padding dc_size = hc_size + size of next member
- return pad_size;
- }
- else {
- //Moving out of struct, go to next index
- index_out++;
- internal_index = index_out;
- return hc_size; //return last padding member size
- }
- }
- }
- else {
- //Scalar parameter
- hc_offset = init_offset;
- hc_size = getHostScalarParamSize(desc[internal_index].type);
- dc_size = hc_size;
- hc_alignment = getScalarAlignment(desc[internal_index].type, true);
- dc_alignment = getScalarAlignment(desc[internal_index].type, false);
- outer_hc_alignment = max(outer_hc_alignment, hc_alignment); //Adjust alignment of upper level struct if necessary, upper level alignment = max alignment of members
- outer_dc_alignment = max(outer_dc_alignment, dc_alignment); //Adjust alignment of upper level struct if necessary, upper level alignment = max alignment of members
- if (inStruct > 0) {
- if (desc[index_out+1].type != T_VOID) {
- //Still inside struct and not done
- index_out++;
- next_field_map = new HCtoDCmap(desc, outer_hc_alignment, internal_index, next_offset);
- struct_size = hc_size;
- struct_size += next_field_map->compute_map(desc, outer_hc_alignment, outer_dc_alignment, next_offset, inStruct, index_out);
- next_offset = hc_offset+hc_alignment;
- outer_hc_alignment = max(outer_hc_alignment, next_field_map->hc_alignment);
- outer_dc_alignment = max(outer_dc_alignment, next_field_map->dc_alignment);
- // running count of strucdc_size = hc_size + size of next member
- return struct_size;
- }
- else {
- //Moving out of struct, go to next index
- index_out++;
- inStruct--;
- return hc_size; //return last struct member size
- }
- }
- }
- return hc_size;
+ next_field_map = new HCtoDCmap(desc, 0, internal_index, next_offset);
+ pad_size = hc_size;
+ pad_size += next_field_map->compute_map(desc, outer_hc_alignment, outer_dc_alignment,
+ next_offset, inStruct, index_out);
+ next_offset = max(next_field_map->hc_offset + next_field_map->hc_size,
+ next_field_map->hc_offset + hc_alignment);
+ // running count of padding dc_size = hc_size + size of next member
+ return pad_size;
+ } else {
+ // Moving out of struct, go to next index
+ index_out++;
+ internal_index = index_out;
+ return hc_size; // return last padding member size
+ }
}
-
- // Adjust offset for source and target, return next source offset
- unsigned HCtoDCmap::next_offset(unsigned current_offset, unsigned &map_param_size, int& inStruct_flag)
- {
- unsigned next_offset = current_offset;
- if (next_field_map == NULL) {
- assert(0 && "invalid next struct field map");
- return next_offset;
- }
- else {
- // Ignore alignment when a char occurs to account for padding
- if (type == T_PAD) {
- next_field_map->dc_offset = dc_offset + dc_size;
- next_offset = current_offset + hc_size;
- }
- else {
- if ((dc_offset + dc_size) % next_field_map->dc_alignment != 0) {
- this->next_field_map->dc_offset = dc_offset + dc_size - (dc_size % next_field_map->dc_alignment) + next_field_map->dc_alignment;
- }
- else {
- this->next_field_map->dc_offset = dc_offset + max(dc_size, next_field_map->dc_alignment);
- }
- if ((hc_offset + hc_size) % next_field_map->hc_alignment != 0) {
- next_offset = hc_offset + hc_size - (hc_size % next_field_map->hc_alignment) + next_field_map->hc_alignment;
- }
- else {
- next_offset = hc_offset + max(next_field_map->hc_alignment, map_param_size);
- }
- }
- return next_offset;
- }
+ } else {
+ // Scalar parameter
+ hc_offset = init_offset;
+ hc_size = getHostScalarParamSize(desc[internal_index].type);
+ dc_size = hc_size;
+ hc_alignment = getScalarAlignment(desc[internal_index].type, true);
+ dc_alignment = getScalarAlignment(desc[internal_index].type, false);
+ outer_hc_alignment = max(outer_hc_alignment, hc_alignment); // Adjust alignment of upper level
+ // struct if necessary, upper level
+ // alignment = max alignment of
+ // members
+ outer_dc_alignment = max(outer_dc_alignment, dc_alignment); // Adjust alignment of upper level
+ // struct if necessary, upper level
+ // alignment = max alignment of
+ // members
+ if (inStruct > 0) {
+ if (desc[index_out + 1].type != T_VOID) {
+ // Still inside struct and not done
+ index_out++;
+ next_field_map = new HCtoDCmap(desc, outer_hc_alignment, internal_index, next_offset);
+ struct_size = hc_size;
+ struct_size += next_field_map->compute_map(desc, outer_hc_alignment, outer_dc_alignment,
+ next_offset, inStruct, index_out);
+ next_offset = hc_offset + hc_alignment;
+ outer_hc_alignment = max(outer_hc_alignment, next_field_map->hc_alignment);
+ outer_dc_alignment = max(outer_dc_alignment, next_field_map->dc_alignment);
+ // running count of strucdc_size = hc_size + size of next member
+ return struct_size;
+ } else {
+ // Moving out of struct, go to next index
+ index_out++;
+ inStruct--;
+ return hc_size; // return last struct member size
+ }
}
+ }
+ return hc_size;
+}
- // Copy memory according to mapping
- unsigned int HCtoDCmap::copy_params(void *dst, const void *src, unsigned int arg_offset, int& error_code, int &inStruct) const
- {
- unsigned int padding = 0;
- // Pad offset to be aligned by 8 if parameter is double, not as struct field
- if ((arg_offset) % 8 != 0 && (type == T_DOUBLE) && inStruct == 0)
- padding = hc_alignment-((arg_offset+dc_offset)%hc_alignment);
- #if defined(_WIN32)
- // In windows, double is aligned by 8, add padding to struct if it contains double
- if ((arg_offset+dc_offset) % 8 != 0 && hc_alignment == 8)
- padding = hc_alignment-((arg_offset+dc_offset)%hc_alignment);
- #endif
- ::memcpy(reinterpret_cast(reinterpret_cast(dst)+padding), src, hc_size);
- #if defined(_WIN32)
- if (internal_field_map != NULL) {
- inStruct++;
- void *internal_dst = reinterpret_cast(reinterpret_cast(dst)+padding);
- internal_field_map->copy_params(internal_dst, src, arg_offset+padding, error_code, inStruct);
- inStruct--;
- }
- if (next_field_map != NULL) {
- void *next_dst = reinterpret_cast(reinterpret_cast(dst)+next_field_map->dc_offset); // Next field starts with padding
- const void *next_src = reinterpret_cast(reinterpret_cast(src)+next_field_map->hc_offset);
- next_field_map->copy_params(next_dst, next_src, arg_offset+next_field_map->dc_offset, error_code, inStruct);
- }
- #else
- if (internal_field_map != NULL) {
- inStruct++;
- internal_field_map->copy_params(dst, src, arg_offset, error_code, inStruct);
- inStruct--;
- }
- if (next_field_map != NULL) {
- void *next_dst = reinterpret_cast(reinterpret_cast(dst)+next_field_map->dc_offset);
- const void *next_src = reinterpret_cast(reinterpret_cast(src)+next_field_map->hc_offset);
- next_field_map->copy_params(next_dst, next_src, arg_offset, error_code, inStruct);
- }
- #endif
- return padding;
+// Adjust offset for source and target, return next source offset
+unsigned HCtoDCmap::next_offset(unsigned current_offset, unsigned& map_param_size,
+ int& inStruct_flag) {
+ unsigned next_offset = current_offset;
+ if (next_field_map == NULL) {
+ assert(0 && "invalid next struct field map");
+ return next_offset;
+ } else {
+ // Ignore alignment when a char occurs to account for padding
+ if (type == T_PAD) {
+ next_field_map->dc_offset = dc_offset + dc_size;
+ next_offset = current_offset + hc_size;
+ } else {
+ if ((dc_offset + dc_size) % next_field_map->dc_alignment != 0) {
+ this->next_field_map->dc_offset = dc_offset + dc_size -
+ (dc_size % next_field_map->dc_alignment) + next_field_map->dc_alignment;
+ } else {
+ this->next_field_map->dc_offset = dc_offset + max(dc_size, next_field_map->dc_alignment);
+ }
+ if ((hc_offset + hc_size) % next_field_map->hc_alignment != 0) {
+ next_offset = hc_offset + hc_size - (hc_size % next_field_map->hc_alignment) +
+ next_field_map->hc_alignment;
+ } else {
+ next_offset = hc_offset + max(next_field_map->hc_alignment, map_param_size);
+ }
}
+ return next_offset;
+ }
+}
-} //namespace cpu
\ No newline at end of file
+// Copy memory according to mapping
+unsigned int HCtoDCmap::copy_params(void* dst, const void* src, unsigned int arg_offset,
+ int& error_code, int& inStruct) const {
+ unsigned int padding = 0;
+ // Pad offset to be aligned by 8 if parameter is double, not as struct field
+ if ((arg_offset) % 8 != 0 && (type == T_DOUBLE) && inStruct == 0)
+ padding = hc_alignment - ((arg_offset + dc_offset) % hc_alignment);
+#if defined(_WIN32)
+ // In windows, double is aligned by 8, add padding to struct if it contains double
+ if ((arg_offset + dc_offset) % 8 != 0 && hc_alignment == 8)
+ padding = hc_alignment - ((arg_offset + dc_offset) % hc_alignment);
+#endif
+ ::memcpy(reinterpret_cast(reinterpret_cast(dst) + padding), src, hc_size);
+#if defined(_WIN32)
+ if (internal_field_map != NULL) {
+ inStruct++;
+ void* internal_dst = reinterpret_cast(reinterpret_cast(dst) + padding);
+ internal_field_map->copy_params(internal_dst, src, arg_offset + padding, error_code, inStruct);
+ inStruct--;
+ }
+ if (next_field_map != NULL) {
+ void* next_dst =
+ reinterpret_cast(reinterpret_cast(dst) +
+ next_field_map->dc_offset); // Next field starts with padding
+ const void* next_src = reinterpret_cast(
+ reinterpret_cast(src) + next_field_map->hc_offset);
+ next_field_map->copy_params(next_dst, next_src, arg_offset + next_field_map->dc_offset,
+ error_code, inStruct);
+ }
+#else
+ if (internal_field_map != NULL) {
+ inStruct++;
+ internal_field_map->copy_params(dst, src, arg_offset, error_code, inStruct);
+ inStruct--;
+ }
+ if (next_field_map != NULL) {
+ void* next_dst =
+ reinterpret_cast(reinterpret_cast(dst) + next_field_map->dc_offset);
+ const void* next_src = reinterpret_cast(
+ reinterpret_cast(src) + next_field_map->hc_offset);
+ next_field_map->copy_params(next_dst, next_src, arg_offset, error_code, inStruct);
+ }
+#endif
+ return padding;
+}
+
+} // namespace cpu
\ No newline at end of file
diff --git a/rocclr/runtime/device/cpu/cpumapping.hpp b/rocclr/runtime/device/cpu/cpumapping.hpp
index 0ea5d2f350..00531ef8ea 100644
--- a/rocclr/runtime/device/cpu/cpumapping.hpp
+++ b/rocclr/runtime/device/cpu/cpumapping.hpp
@@ -9,36 +9,37 @@
namespace cpu {
-class HCtoDCmap
-{
+class HCtoDCmap {
+ public:
+ unsigned int hc_offset, hc_size; // Offset and size of this parameter in host compiler
+ unsigned int dc_offset, dc_size; // Offset and size of this parameter in device compiler
+ unsigned int hc_alignment; // Alignment of parameter in host compiler
+ unsigned int dc_alignment; // Alignment of parameter in device compiler
+ clk_value_type_t type; // Type of parameter
+ HCtoDCmap*
+ internal_field_map; // Pointer to internal mapping when current parameter is of type T_STRUCT
+ HCtoDCmap*
+ next_field_map; // Pointer to next struct field when current parameter is a struct member
-public:
- unsigned int hc_offset, hc_size; // Offset and size of this parameter in host compiler
- unsigned int dc_offset, dc_size; // Offset and size of this parameter in device compiler
- unsigned int hc_alignment; // Alignment of parameter in host compiler
- unsigned int dc_alignment; // Alignment of parameter in device compiler
- clk_value_type_t type; // Type of parameter
- HCtoDCmap *internal_field_map; // Pointer to internal mapping when current parameter is of type T_STRUCT
- HCtoDCmap *next_field_map; // Pointer to next struct field when current parameter is a struct member
+ HCtoDCmap(const clk_parameter_descriptor_t*, unsigned int, unsigned int, unsigned int);
+ virtual ~HCtoDCmap();
+ int compute_map(const clk_parameter_descriptor_t*, unsigned int&, unsigned int&, unsigned int,
+ int&, int&);
+ unsigned next_offset(unsigned, unsigned&, int&);
+ size_t getHostScalarParamSize(const clk_value_type_t) const;
+ size_t getScalarAlignment(const clk_value_type_t, bool) const;
+ void align_map(unsigned, unsigned, unsigned&, unsigned&, int&);
+ unsigned int copy_params(void*, const void*, unsigned int, int&, int&) const;
- HCtoDCmap(const clk_parameter_descriptor_t*, unsigned int, unsigned int, unsigned int);
- virtual ~HCtoDCmap();
- int compute_map(const clk_parameter_descriptor_t*, unsigned int &, unsigned int &, unsigned int, int&, int&);
- unsigned next_offset(unsigned, unsigned &, int &);
- size_t getHostScalarParamSize(const clk_value_type_t) const;
- size_t getScalarAlignment(const clk_value_type_t, bool) const;
- void align_map(unsigned, unsigned, unsigned&, unsigned&, int&);
- unsigned int copy_params(void *, const void *, unsigned int, int&, int&) const;
-
-private:
+ private:
};
-} // namespace cpu
+} // namespace cpu
-#endif // CPUMAPPING_HPP_
-// Mapping rule
-// Long types are treated with 8 byte alignment in runtime when passed in as arguments
-// but they are treated with 4 byte alignment in compiler
-// Double members have 8 byte alignment when passed as scalar argument
-// but have 4 byte alignment as a field inside a struct
\ No newline at end of file
+#endif // CPUMAPPING_HPP_
+ // Mapping rule
+ // Long types are treated with 8 byte alignment in runtime when passed in as arguments
+ // but they are treated with 4 byte alignment in compiler
+ // Double members have 8 byte alignment when passed as scalar argument
+ // but have 4 byte alignment as a field inside a struct
\ No newline at end of file
diff --git a/rocclr/runtime/device/cpu/cpuprogram.cpp b/rocclr/runtime/device/cpu/cpuprogram.cpp
index 7f56866dac..179c483083 100644
--- a/rocclr/runtime/device/cpu/cpuprogram.cpp
+++ b/rocclr/runtime/device/cpu/cpuprogram.cpp
@@ -18,7 +18,7 @@
#include
#if defined(_WIN32)
-# include
+#include
#endif
// amdrt.o
@@ -26,609 +26,582 @@
#include "amdrt.inc"
#endif
-//CLC_IN_PROCESS_CHANGE
+// CLC_IN_PROCESS_CHANGE
extern int openclFrontEnd(const char* cmdline, std::string*, std::string* typInfo = NULL);
namespace cpu {
-static inline bool
-isScalar(clk_value_type_t type)
-{
- switch (type) {
- case T_CHAR: case T_SHORT: case T_INT:
- case T_LONG: case T_FLOAT: case T_DOUBLE:
- case T_POINTER:
- return true;
- default:
- return false;
- }
-}
-
-
-static cl_kernel_arg_address_qualifier
-getParamAddressQualifier(const clk_parameter_descriptor_t* desc)
-{
- switch (desc->space) {
- case A_LOCAL:
- return CL_KERNEL_ARG_ADDRESS_LOCAL;
- break;
- case A_CONSTANT:
- return CL_KERNEL_ARG_ADDRESS_CONSTANT;
- break;
- case A_GLOBAL:
- return CL_KERNEL_ARG_ADDRESS_GLOBAL;
- break;
- default:
- return CL_KERNEL_ARG_ADDRESS_PRIVATE;
- break;
- }
-}
-
-static cl_kernel_arg_type_qualifier
-getParamTypeQualifier(const clk_parameter_descriptor_t* desc)
-{
- cl_kernel_arg_type_qualifier typeQualifier = CL_KERNEL_ARG_TYPE_NONE;
-
- if (desc->space == A_CONSTANT) {
- typeQualifier |= CL_KERNEL_ARG_TYPE_CONST;
- }
-
- if ((desc->qualifier & Q_CONST) != 0) {
- typeQualifier |= CL_KERNEL_ARG_TYPE_CONST;
- }
- if ((desc->qualifier & Q_RESTRICT) != 0) {
- typeQualifier |= CL_KERNEL_ARG_TYPE_RESTRICT;
- }
- if ((desc->qualifier & Q_VOLATILE) != 0) {
- typeQualifier |= CL_KERNEL_ARG_TYPE_VOLATILE;
- }
-
- if ((desc->qualifier & Q_PIPE) != 0) {
- typeQualifier = CL_KERNEL_ARG_TYPE_PIPE;
- }
-
- return typeQualifier;
-}
-
-static cl_kernel_arg_access_qualifier
-getParamAccessQualifier(const clk_parameter_descriptor_t* desc)
-{
- uint access = desc->qualifier & (Q_READ | Q_WRITE);
- switch (access) {
- case Q_READ:
- return CL_KERNEL_ARG_ACCESS_READ_ONLY;
- break;
- case Q_WRITE:
- return CL_KERNEL_ARG_ACCESS_WRITE_ONLY;
- break;
- case (Q_READ | Q_WRITE):
- return CL_KERNEL_ARG_ACCESS_READ_WRITE;
- break;
- default:
- return CL_KERNEL_ARG_ACCESS_NONE;
- break;
- }
-}
-
-static size_t
-getScalarParamSize(bool cpuLayer, const clk_value_type_t type,
- cl_kernel_arg_address_qualifier qualifier)
-{
- size_t size = 0;
-
- if (qualifier == CL_KERNEL_ARG_ADDRESS_LOCAL) {
- return cpuLayer ? sizeof(void*) : 0;
- }
-
- switch (type) {
+static inline bool isScalar(clk_value_type_t type) {
+ switch (type) {
case T_CHAR:
- size = 1;
- break;
- case T_SHORT: case T_CHAR2:
- size = 2;
- break;
- case T_FLOAT: case T_INT: case T_CHAR4:
- case T_SHORT2: case T_CHAR3:
- size = 4;
- break;
- case T_SAMPLER:
- size = cpuLayer ? sizeof(uint32_t) : sizeof(cl_sampler);
- break;
- case T_LONG: case T_DOUBLE: case T_CHAR8:
- case T_SHORT4: case T_INT2: case T_FLOAT2:
- case T_SHORT3:
- size = 8;
- break;
- case T_INT3: case T_FLOAT3:
- case T_CHAR16: case T_SHORT8: case T_INT4:
- case T_FLOAT4: case T_LONG2: case T_DOUBLE2:
- size = 16;
- break;
- case T_LONG3: case T_DOUBLE3:
- case T_SHORT16: case T_INT8: case T_FLOAT8:
- case T_LONG4: case T_DOUBLE4:
- size = 32;
- break;
- case T_INT16: case T_FLOAT16: case T_LONG8:
- case T_DOUBLE8:
- size = 64;
- break;
- case T_LONG16: case T_DOUBLE16:
- size = 128;
- break;
- case T_POINTER: case T_VOID:
- size = sizeof(void*);
- break;
+ case T_SHORT:
+ case T_INT:
+ case T_LONG:
+ case T_FLOAT:
+ case T_DOUBLE:
+ case T_POINTER:
+ return true;
default:
- ShouldNotReachHere();
- break;
- }
- return size;
+ return false;
+ }
}
-static size_t
-getParamSizeImpl(bool cpuLayer, const clk_parameter_descriptor_t* desc,
- unsigned index, cl_kernel_arg_address_qualifier qualifier,
- size_t* alignment, unsigned* index_out)
-{
- size_t size = 0;
- if(desc[index].type == T_STRUCT || desc[index].type == T_PAD) {
- size_t maxAlignment = 0;
- size_t structSize = 0;
- size_t structAlignment = 0;
- index++;
- while(desc[index].type != T_VOID) {
- size_t elementAlignment = 0;
- size_t elementSize =
- getParamSizeImpl(cpuLayer, desc, index, qualifier,
- &elementAlignment, index_out);
- #if defined(_WIN32)
- maxAlignment = std::max(maxAlignment, elementAlignment);
- #else
- // In Linux, the alignment of long field is 4 for GCC,
- // but it is 8 on LLVM side
- if (desc[index].type == T_LONG)
- structAlignment = cpuLayer? LP64_SWITCH(4, 8) : 8;
- else
- structAlignment = std::max(maxAlignment, elementAlignment);
- maxAlignment = std::max(maxAlignment, structAlignment);
- #endif
- index = *index_out;
- structSize =
- amd::alignUp(structSize,
- std::min(elementAlignment, size_t(16))) +
- elementSize;
- }
- *index_out = index + 1;
- *alignment = maxAlignment;
- size = amd::alignUp(structSize, std::min(maxAlignment, size_t(16)));
+
+static cl_kernel_arg_address_qualifier getParamAddressQualifier(
+ const clk_parameter_descriptor_t* desc) {
+ switch (desc->space) {
+ case A_LOCAL:
+ return CL_KERNEL_ARG_ADDRESS_LOCAL;
+ break;
+ case A_CONSTANT:
+ return CL_KERNEL_ARG_ADDRESS_CONSTANT;
+ break;
+ case A_GLOBAL:
+ return CL_KERNEL_ARG_ADDRESS_GLOBAL;
+ break;
+ default:
+ return CL_KERNEL_ARG_ADDRESS_PRIVATE;
+ break;
+ }
+}
+
+static cl_kernel_arg_type_qualifier getParamTypeQualifier(const clk_parameter_descriptor_t* desc) {
+ cl_kernel_arg_type_qualifier typeQualifier = CL_KERNEL_ARG_TYPE_NONE;
+
+ if (desc->space == A_CONSTANT) {
+ typeQualifier |= CL_KERNEL_ARG_TYPE_CONST;
+ }
+
+ if ((desc->qualifier & Q_CONST) != 0) {
+ typeQualifier |= CL_KERNEL_ARG_TYPE_CONST;
+ }
+ if ((desc->qualifier & Q_RESTRICT) != 0) {
+ typeQualifier |= CL_KERNEL_ARG_TYPE_RESTRICT;
+ }
+ if ((desc->qualifier & Q_VOLATILE) != 0) {
+ typeQualifier |= CL_KERNEL_ARG_TYPE_VOLATILE;
+ }
+
+ if ((desc->qualifier & Q_PIPE) != 0) {
+ typeQualifier = CL_KERNEL_ARG_TYPE_PIPE;
+ }
+
+ return typeQualifier;
+}
+
+static cl_kernel_arg_access_qualifier getParamAccessQualifier(
+ const clk_parameter_descriptor_t* desc) {
+ uint access = desc->qualifier & (Q_READ | Q_WRITE);
+ switch (access) {
+ case Q_READ:
+ return CL_KERNEL_ARG_ACCESS_READ_ONLY;
+ break;
+ case Q_WRITE:
+ return CL_KERNEL_ARG_ACCESS_WRITE_ONLY;
+ break;
+ case (Q_READ | Q_WRITE):
+ return CL_KERNEL_ARG_ACCESS_READ_WRITE;
+ break;
+ default:
+ return CL_KERNEL_ARG_ACCESS_NONE;
+ break;
+ }
+}
+
+static size_t getScalarParamSize(bool cpuLayer, const clk_value_type_t type,
+ cl_kernel_arg_address_qualifier qualifier) {
+ size_t size = 0;
+
+ if (qualifier == CL_KERNEL_ARG_ADDRESS_LOCAL) {
+ return cpuLayer ? sizeof(void*) : 0;
+ }
+
+ switch (type) {
+ case T_CHAR:
+ size = 1;
+ break;
+ case T_SHORT:
+ case T_CHAR2:
+ size = 2;
+ break;
+ case T_FLOAT:
+ case T_INT:
+ case T_CHAR4:
+ case T_SHORT2:
+ case T_CHAR3:
+ size = 4;
+ break;
+ case T_SAMPLER:
+ size = cpuLayer ? sizeof(uint32_t) : sizeof(cl_sampler);
+ break;
+ case T_LONG:
+ case T_DOUBLE:
+ case T_CHAR8:
+ case T_SHORT4:
+ case T_INT2:
+ case T_FLOAT2:
+ case T_SHORT3:
+ size = 8;
+ break;
+ case T_INT3:
+ case T_FLOAT3:
+ case T_CHAR16:
+ case T_SHORT8:
+ case T_INT4:
+ case T_FLOAT4:
+ case T_LONG2:
+ case T_DOUBLE2:
+ size = 16;
+ break;
+ case T_LONG3:
+ case T_DOUBLE3:
+ case T_SHORT16:
+ case T_INT8:
+ case T_FLOAT8:
+ case T_LONG4:
+ case T_DOUBLE4:
+ size = 32;
+ break;
+ case T_INT16:
+ case T_FLOAT16:
+ case T_LONG8:
+ case T_DOUBLE8:
+ size = 64;
+ break;
+ case T_LONG16:
+ case T_DOUBLE16:
+ size = 128;
+ break;
+ case T_POINTER:
+ case T_VOID:
+ size = sizeof(void*);
+ break;
+ default:
+ ShouldNotReachHere();
+ break;
+ }
+ return size;
+}
+
+static size_t getParamSizeImpl(bool cpuLayer, const clk_parameter_descriptor_t* desc,
+ unsigned index, cl_kernel_arg_address_qualifier qualifier,
+ size_t* alignment, unsigned* index_out) {
+ size_t size = 0;
+ if (desc[index].type == T_STRUCT || desc[index].type == T_PAD) {
+ size_t maxAlignment = 0;
+ size_t structSize = 0;
+ size_t structAlignment = 0;
+ index++;
+ while (desc[index].type != T_VOID) {
+ size_t elementAlignment = 0;
+ size_t elementSize =
+ getParamSizeImpl(cpuLayer, desc, index, qualifier, &elementAlignment, index_out);
+#if defined(_WIN32)
+ maxAlignment = std::max(maxAlignment, elementAlignment);
+#else
+ // In Linux, the alignment of long field is 4 for GCC,
+ // but it is 8 on LLVM side
+ if (desc[index].type == T_LONG)
+ structAlignment = cpuLayer ? LP64_SWITCH(4, 8) : 8;
+ else
+ structAlignment = std::max(maxAlignment, elementAlignment);
+ maxAlignment = std::max(maxAlignment, structAlignment);
+#endif
+ index = *index_out;
+ structSize = amd::alignUp(structSize, std::min(elementAlignment, size_t(16))) + elementSize;
+ }
+ *index_out = index + 1;
+ *alignment = maxAlignment;
+ size = amd::alignUp(structSize, std::min(maxAlignment, size_t(16)));
+ } else {
+ size = getScalarParamSize(cpuLayer, desc[index].type, qualifier);
+ if (desc[index].type == T_DOUBLE) {
+#if defined(_WIN32)
+ *alignment = 8;
+#else
+ *alignment = LP64_SWITCH(4, 8);
+#endif
+ } else if (desc[index].type == T_LONG) {
+ *alignment = 8;
} else {
- size = getScalarParamSize(cpuLayer, desc[index].type, qualifier);
- if (desc[index].type == T_DOUBLE) {
- #if defined(_WIN32)
- *alignment = 8;
- #else
- *alignment = LP64_SWITCH(4, 8);
- #endif
- } else if (desc[index].type == T_LONG) {
- *alignment = 8;
- } else {
- *alignment = size;
- }
- *index_out = index + 1;
+ *alignment = size;
}
- return size;
+ *index_out = index + 1;
+ }
+ return size;
}
-size_t
-getParamSize(bool cpuLayer, const clk_parameter_descriptor_t* desc,
- cl_kernel_arg_address_qualifier qualifier,
- size_t* alignment)
-{
- unsigned index_out = 0;
- return getParamSizeImpl(cpuLayer, desc, 0, qualifier, alignment,
- &index_out);
+size_t getParamSize(bool cpuLayer, const clk_parameter_descriptor_t* desc,
+ cl_kernel_arg_address_qualifier qualifier, size_t* alignment) {
+ unsigned index_out = 0;
+ return getParamSizeImpl(cpuLayer, desc, 0, qualifier, alignment, &index_out);
}
-static unsigned
-getNumTypeDescs(const clk_parameter_descriptor_t* desc)
-{
+static unsigned getNumTypeDescs(const clk_parameter_descriptor_t* desc) {
int numStruct = 0;
unsigned i;
- for(i = 0; desc[i].type != T_VOID || numStruct > 0; ++i) {
- if (desc[i].type == T_STRUCT || desc[i].type == T_PAD)
- numStruct++;
- if (desc[i].type == T_VOID)
- numStruct--;
- }
- return i + 1;
+ for (i = 0; desc[i].type != T_VOID || numStruct > 0; ++i) {
+ if (desc[i].type == T_STRUCT || desc[i].type == T_PAD) numStruct++;
+ if (desc[i].type == T_VOID) numStruct--;
+ }
+ return i + 1;
}
-static clk_value_type_t
-getFirstScalarType(const clk_parameter_descriptor_t* desc)
-{
+static clk_value_type_t getFirstScalarType(const clk_parameter_descriptor_t* desc) {
int i = 0;
- while(desc[i].type == T_STRUCT)
- i++;
+ while (desc[i].type == T_STRUCT) i++;
return desc[i].type;
}
-static const clk_value_type_t
-getParamType(const clk_parameter_descriptor_t* desc,
- const clk_parameter_descriptor_t** desc_out,
- const char** type_name)
-{
- unsigned numDescs = getNumTypeDescs(desc);
- *desc_out = desc + numDescs;
- *type_name = desc[numDescs-1].name;
- // Use old behaviour and return first scalar type in case of a struct.
- return getFirstScalarType(desc);
-
+static const clk_value_type_t getParamType(const clk_parameter_descriptor_t* desc,
+ const clk_parameter_descriptor_t** desc_out,
+ const char** type_name) {
+ unsigned numDescs = getNumTypeDescs(desc);
+ *desc_out = desc + numDescs;
+ *type_name = desc[numDescs - 1].name;
+ // Use old behaviour and return first scalar type in case of a struct.
+ return getFirstScalarType(desc);
}
-static amd::KernelParameterDescriptor
-getParam(bool cpuLayer, const clk_parameter_descriptor_t* desc,
- size_t offset_in, const clk_parameter_descriptor_t ** desc_out)
-{
- size_t alignment;
+static amd::KernelParameterDescriptor getParam(bool cpuLayer,
+ const clk_parameter_descriptor_t* desc,
+ size_t offset_in,
+ const clk_parameter_descriptor_t** desc_out) {
+ size_t alignment;
- amd::KernelParameterDescriptor param;
- param.name_ = desc->name;
- param.type_ = getParamType(desc, desc_out, &(param.typeName_));
- param.addressQualifier_ = getParamAddressQualifier(desc);
- param.typeQualifier_ = getParamTypeQualifier(desc);
- param.accessQualifier_ = getParamAccessQualifier(desc);
- param.size_ = getParamSize(cpuLayer, desc, param.addressQualifier_,
- &alignment);
- if(param.size_ == 0) {
- param.offset_ = amd::alignUp(offset_in,
- std::min(sizeof(cl_mem), size_t(16)));
- } else {
- param.offset_ = amd::alignUp(offset_in,
- std::min(alignment, size_t(16)));
- }
- return param;
+ amd::KernelParameterDescriptor param;
+ param.name_ = desc->name;
+ param.type_ = getParamType(desc, desc_out, &(param.typeName_));
+ param.addressQualifier_ = getParamAddressQualifier(desc);
+ param.typeQualifier_ = getParamTypeQualifier(desc);
+ param.accessQualifier_ = getParamAccessQualifier(desc);
+ param.size_ = getParamSize(cpuLayer, desc, param.addressQualifier_, &alignment);
+ if (param.size_ == 0) {
+ param.offset_ = amd::alignUp(offset_in, std::min(sizeof(cl_mem), size_t(16)));
+ } else {
+ param.offset_ = amd::alignUp(offset_in, std::min(alignment, size_t(16)));
+ }
+ return param;
}
-static bool
-setKernelInfoCallback(std::string symbol, const void* value, void* data)
-{
- cpu::Program* program = reinterpret_cast(data);
- device::Program::kernels_t& kernels = program->kernels();
- const char __OpenCL_[] = "__OpenCL_";
- const char _kernel[] = "_stub";
- const char _data[] = "_metadata";
- const char _nature[] = "_nature";
-
- const size_t offset = sizeof(__OpenCL_) - 1;
- if (symbol.compare(0, offset, __OpenCL_) != 0) {
- return false;
- }
-
- size_t suffixPos = symbol.rfind('_');
- if (suffixPos == std::string::npos) {
- return false;
- }
-
- std::string name = symbol.substr(offset, suffixPos - offset);
- cpu::Kernel* kernel = reinterpret_cast(kernels[name]);
- if (NULL == kernel) {
- kernel = new Kernel(name);
- kernels[name] = kernel;
- }
-
- if (symbol.compare(suffixPos, sizeof(_kernel) - 1, _kernel) == 0) {
- kernel->setEntryPoint(value);
- return true;
- }
- else if (symbol.compare(suffixPos, sizeof(_data) - 1, _data) == 0) {
- device::Kernel::parameters_t params;
-
- size_t* recordPtr = (size_t*) value;
- size_t* recordEnd = recordPtr + (*recordPtr)/sizeof(size_t);
- ++recordPtr; // skip struct_length
-
- kernel->setLocalMemSize(*recordPtr++);
- kernel->setPreferredSizeMultiple(1);
-
- kernel->setUniformWorkGroupSize(program->getCompilerOptions()
- ->oVariables->UniformWorkGroupSize);
-
- kernel->setReqdWorkGroupSize(recordPtr[0], recordPtr[1], recordPtr[2]);
- recordPtr += 3;
-
- kernel->setWorkGroupSizeHint(recordPtr[0], recordPtr[1], recordPtr[2]);
- recordPtr += 3;
-
- const clk_parameter_descriptor_t* desc =
- reinterpret_cast(recordPtr);
-
- size_t offset = 0;
- while (desc->type != T_VOID) {
- const clk_parameter_descriptor_t* next_desc = NULL;
- amd::KernelParameterDescriptor param = getParam(false, desc, offset,
- &next_desc);
-
- size_t cpuSize, cpuAlignment;
- cpuSize =
- getParamSize(true, desc, param.addressQualifier_, &cpuAlignment);
- kernel->addArg(cpuSize, cpuAlignment);
-
- //Init for HCtoDCmap
- unsigned int init_offset = 0;
- unsigned int align = 0;
- int inStruct = 0;
- int end_index = 0;
- HCtoDCmap *map_p = new HCtoDCmap(desc, align, 0, init_offset);
- map_p->dc_size = map_p->compute_map(desc, map_p->hc_alignment, map_p->dc_alignment, init_offset, inStruct, end_index);
- map_p->align_map(map_p->hc_alignment, map_p->dc_alignment, map_p->hc_size, map_p->dc_size, inStruct);
- if (CPU_USE_ALIGNMENT_MAP == 0) {
- kernel->addHCtoDCmap(map_p);
- if (map_p->internal_field_map != NULL) {
- kernel->addInternalMap(map_p->internal_field_map);
- }
- }
- else {
- delete(map_p);
- }
- //End of HCtoDCmap
-
- desc = next_desc;
- params.push_back(param);
- size_t size = param.size_ == 0 ? sizeof(cl_mem) : param.size_;
-#if defined(USE_NATIVE_ABI)
- size = amd::alignUp(size, sizeof(size_t));
-#endif // USE_NATIVE_ABI
- offset = param.offset_ + size;
- }
-
- // retrieve vector type hint metadata
- const clk_parameter_descriptor_t* vth_desc = NULL;
- getParam(false, desc, offset, &vth_desc);
- const size_t* vthPtr = reinterpret_cast(vth_desc);
- if (vthPtr < recordEnd && *vthPtr != 0) {
- const char* vecTypeHint = reinterpret_cast(*vthPtr);
- kernel->setVecTypeHint(vecTypeHint);
- }
-
- if (kernel->createSignature(params)) {
- return true;
- }
- }
- else if (symbol.compare(suffixPos, sizeof(_nature) - 1, _nature) == 0) {
- uint32_t* recordPtr = (uint32_t*) value;
- kernel->nature_ = (uint)recordPtr[0];
- kernel->privateSize_ = (uint)recordPtr[1];
- return true;
- }
+static bool setKernelInfoCallback(std::string symbol, const void* value, void* data) {
+ cpu::Program* program = reinterpret_cast(data);
+ device::Program::kernels_t& kernels = program->kernels();
+ const char __OpenCL_[] = "__OpenCL_";
+ const char _kernel[] = "_stub";
+ const char _data[] = "_metadata";
+ const char _nature[] = "_nature";
+ const size_t offset = sizeof(__OpenCL_) - 1;
+ if (symbol.compare(0, offset, __OpenCL_) != 0) {
return false;
+ }
+
+ size_t suffixPos = symbol.rfind('_');
+ if (suffixPos == std::string::npos) {
+ return false;
+ }
+
+ std::string name = symbol.substr(offset, suffixPos - offset);
+ cpu::Kernel* kernel = reinterpret_cast(kernels[name]);
+ if (NULL == kernel) {
+ kernel = new Kernel(name);
+ kernels[name] = kernel;
+ }
+
+ if (symbol.compare(suffixPos, sizeof(_kernel) - 1, _kernel) == 0) {
+ kernel->setEntryPoint(value);
+ return true;
+ } else if (symbol.compare(suffixPos, sizeof(_data) - 1, _data) == 0) {
+ device::Kernel::parameters_t params;
+
+ size_t* recordPtr = (size_t*)value;
+ size_t* recordEnd = recordPtr + (*recordPtr) / sizeof(size_t);
+ ++recordPtr; // skip struct_length
+
+ kernel->setLocalMemSize(*recordPtr++);
+ kernel->setPreferredSizeMultiple(1);
+
+ kernel->setUniformWorkGroupSize(
+ program->getCompilerOptions()->oVariables->UniformWorkGroupSize);
+
+ kernel->setReqdWorkGroupSize(recordPtr[0], recordPtr[1], recordPtr[2]);
+ recordPtr += 3;
+
+ kernel->setWorkGroupSizeHint(recordPtr[0], recordPtr[1], recordPtr[2]);
+ recordPtr += 3;
+
+ const clk_parameter_descriptor_t* desc =
+ reinterpret_cast(recordPtr);
+
+ size_t offset = 0;
+ while (desc->type != T_VOID) {
+ const clk_parameter_descriptor_t* next_desc = NULL;
+ amd::KernelParameterDescriptor param = getParam(false, desc, offset, &next_desc);
+
+ size_t cpuSize, cpuAlignment;
+ cpuSize = getParamSize(true, desc, param.addressQualifier_, &cpuAlignment);
+ kernel->addArg(cpuSize, cpuAlignment);
+
+ // Init for HCtoDCmap
+ unsigned int init_offset = 0;
+ unsigned int align = 0;
+ int inStruct = 0;
+ int end_index = 0;
+ HCtoDCmap* map_p = new HCtoDCmap(desc, align, 0, init_offset);
+ map_p->dc_size = map_p->compute_map(desc, map_p->hc_alignment, map_p->dc_alignment,
+ init_offset, inStruct, end_index);
+ map_p->align_map(map_p->hc_alignment, map_p->dc_alignment, map_p->hc_size, map_p->dc_size,
+ inStruct);
+ if (CPU_USE_ALIGNMENT_MAP == 0) {
+ kernel->addHCtoDCmap(map_p);
+ if (map_p->internal_field_map != NULL) {
+ kernel->addInternalMap(map_p->internal_field_map);
+ }
+ } else {
+ delete (map_p);
+ }
+ // End of HCtoDCmap
+
+ desc = next_desc;
+ params.push_back(param);
+ size_t size = param.size_ == 0 ? sizeof(cl_mem) : param.size_;
+#if defined(USE_NATIVE_ABI)
+ size = amd::alignUp(size, sizeof(size_t));
+#endif // USE_NATIVE_ABI
+ offset = param.offset_ + size;
+ }
+
+ // retrieve vector type hint metadata
+ const clk_parameter_descriptor_t* vth_desc = NULL;
+ getParam(false, desc, offset, &vth_desc);
+ const size_t* vthPtr = reinterpret_cast(vth_desc);
+ if (vthPtr < recordEnd && *vthPtr != 0) {
+ const char* vecTypeHint = reinterpret_cast(*vthPtr);
+ kernel->setVecTypeHint(vecTypeHint);
+ }
+
+ if (kernel->createSignature(params)) {
+ return true;
+ }
+ } else if (symbol.compare(suffixPos, sizeof(_nature) - 1, _nature) == 0) {
+ uint32_t* recordPtr = (uint32_t*)value;
+ kernel->nature_ = (uint)recordPtr[0];
+ kernel->privateSize_ = (uint)recordPtr[1];
+ return true;
+ }
+
+ return false;
}
-static bool
-setKernelInfoCallbackCStr(const char* symbol, const void* value, void* data) {
+static bool setKernelInfoCallbackCStr(const char* symbol, const void* value, void* data) {
std::string symbolString(symbol);
return setKernelInfoCallback(symbolString, value, data);
}
-static bool
-setSymbolsCallback(std::string symbol, const void* value, void* data)
-{
- device::ClBinary* clbinary = (device::ClBinary*) data;
- const char __OpenCL_[] = "__OpenCL_";
- const char _stub[] = "_stub";
- const char _kernel[] = "_kernel";
- const char _data[] = "_metadata";
+static bool setSymbolsCallback(std::string symbol, const void* value, void* data) {
+ device::ClBinary* clbinary = (device::ClBinary*)data;
+ const char __OpenCL_[] = "__OpenCL_";
+ const char _stub[] = "_stub";
+ const char _kernel[] = "_kernel";
+ const char _data[] = "_metadata";
- const size_t offset = sizeof(__OpenCL_) - 1;
- if (symbol.compare(0, offset, __OpenCL_) != 0) {
- return false;
- }
-
- size_t suffixPos = symbol.rfind('_');
- if (suffixPos == std::string::npos) {
- return false;
- }
-
- if ((symbol.compare(suffixPos, sizeof(_stub) - 1, _stub) == 0) ||
- (symbol.compare(suffixPos, sizeof(_kernel) - 1, _kernel) == 0) ||
- (symbol.compare(suffixPos, sizeof(_data) - 1, _data) == 0)) {
-
- return clbinary->elfOut()->addSymbol(amd::OclElf::DLL,
- const_cast(symbol.c_str()),
- 0, false);
- }
+ const size_t offset = sizeof(__OpenCL_) - 1;
+ if (symbol.compare(0, offset, __OpenCL_) != 0) {
return false;
+ }
+
+ size_t suffixPos = symbol.rfind('_');
+ if (suffixPos == std::string::npos) {
+ return false;
+ }
+
+ if ((symbol.compare(suffixPos, sizeof(_stub) - 1, _stub) == 0) ||
+ (symbol.compare(suffixPos, sizeof(_kernel) - 1, _kernel) == 0) ||
+ (symbol.compare(suffixPos, sizeof(_data) - 1, _data) == 0)) {
+ return clbinary->elfOut()->addSymbol(amd::OclElf::DLL, const_cast(symbol.c_str()), 0,
+ false);
+ }
+ return false;
}
-static bool
-setSymbolsCallbackCStr(const char* symbol, const void* value, void* data) {
+static bool setSymbolsCallbackCStr(const char* symbol, const void* value, void* data) {
std::string symbolString(symbol);
return setSymbolsCallback(symbolString, value, data);
}
// Some helper functions to simplify testing the disassembler
struct DisasData {
-public:
- DisasData(std::stringstream *stream,
- aclJITObjectImage im, aclCompiler* cmpl)
- : asmstream(stream), image(im), compiler(cmpl) {};
- std::stringstream *asmstream;
+ public:
+ DisasData(std::stringstream* stream, aclJITObjectImage im, aclCompiler* cmpl)
+ : asmstream(stream), image(im), compiler(cmpl){};
+ std::stringstream* asmstream;
aclJITObjectImage image;
aclCompiler* compiler;
};
#if defined(LEGACY_COMPLIB)
-static bool
-disasSymbolsCallback(std::string symbol, const void* value, void* data)
-{
- DisasData* disasData = (DisasData*) data;
- std::stringstream &asmstream = *(disasData->asmstream);
- aclJITObjectImage image = disasData->image;
- aclCompiler* compiler = disasData->compiler;
- const char __OpenCL_[] = "__OpenCL_";
- const char _stub[] = "_stub";
- const char _kernel[] = "_kernel";
- const char _data[] = "_metadata";
+static bool disasSymbolsCallback(std::string symbol, const void* value, void* data) {
+ DisasData* disasData = (DisasData*)data;
+ std::stringstream& asmstream = *(disasData->asmstream);
+ aclJITObjectImage image = disasData->image;
+ aclCompiler* compiler = disasData->compiler;
+ const char __OpenCL_[] = "__OpenCL_";
+ const char _stub[] = "_stub";
+ const char _kernel[] = "_kernel";
+ const char _data[] = "_metadata";
- const size_t offset = sizeof(__OpenCL_) - 1;
- if (symbol.compare(0, offset, __OpenCL_) != 0) {
- return false;
- }
-
- size_t suffixPos = symbol.rfind('_');
- if (suffixPos == std::string::npos) {
- return false;
- }
-
- if ((symbol.compare(suffixPos, sizeof(_stub) - 1, _stub) == 0) ||
- (symbol.compare(suffixPos, sizeof(_kernel) - 1, _kernel) == 0)) {
- acl_error err = ACL_SUCCESS;
- char* kernelDisas =
- aclJITObjectImageDisassembleKernel(compiler, image, symbol.c_str(), &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageDisassembleKernel failed");
- return false;
- }
- asmstream << kernelDisas;
- free(kernelDisas);
- }
+ const size_t offset = sizeof(__OpenCL_) - 1;
+ if (symbol.compare(0, offset, __OpenCL_) != 0) {
return false;
+ }
+
+ size_t suffixPos = symbol.rfind('_');
+ if (suffixPos == std::string::npos) {
+ return false;
+ }
+
+ if ((symbol.compare(suffixPos, sizeof(_stub) - 1, _stub) == 0) ||
+ (symbol.compare(suffixPos, sizeof(_kernel) - 1, _kernel) == 0)) {
+ acl_error err = ACL_SUCCESS;
+ char* kernelDisas = aclJITObjectImageDisassembleKernel(compiler, image, symbol.c_str(), &err);
+ if (err != ACL_SUCCESS) {
+ LogWarning("aclJITObjectImageDisassembleKernel failed");
+ return false;
+ }
+ asmstream << kernelDisas;
+ free(kernelDisas);
+ }
+ return false;
}
-static bool
-disasSymbolsCallbackCStr(const char* symbol, const void* value, void* data) {
+static bool disasSymbolsCallbackCStr(const char* symbol, const void* value, void* data) {
std::string symbolString(symbol);
return disasSymbolsCallback(symbolString, value, data);
}
#endif
-bool
-Program::compileBinaryToISA(amd::option::Options* options)
-{
- const bool has_avx = !options->oVariables->DisableAVX
- && device().hasAVXInstructions();
- const bool has_fma4 = device().hasFMA4Instructions();
+bool Program::compileBinaryToISA(amd::option::Options* options) {
+ const bool has_avx = !options->oVariables->DisableAVX && device().hasAVXInstructions();
+ const bool has_fma4 = device().hasFMA4Instructions();
#if defined(WITH_ONLINE_COMPILER)
- std::string tempName = amd::Os::getTempFileName();
- dllFileName_ = tempName + "dbg" + "." IF(IS_WINDOWS, "dll", "so");
+ std::string tempName = amd::Os::getTempFileName();
+ dllFileName_ = tempName + "dbg" + "." IF(IS_WINDOWS, "dll", "so");
- acl_error err = ACL_SUCCESS;
- aclTargetInfo aclinfo = info(has_avx ?
- /*has_fma4 ? "Bulldozer" :*/
- "Corei7_AVX" :
- "Athlon64");
+ acl_error err = ACL_SUCCESS;
+ aclTargetInfo aclinfo = info(has_avx ?
+ /*has_fma4 ? "Bulldozer" :*/
+ "Corei7_AVX"
+ : "Athlon64");
- aclBinaryOptions binOpts = {0};
- binOpts.struct_size = sizeof(binOpts);
- binOpts.elfclass = aclinfo.arch_id == aclX64 ? ELFCLASS64 : ELFCLASS32;
- binOpts.bitness = ELFDATA2LSB;
- binOpts.alloc = &::malloc;
- binOpts.dealloc = &::free;
+ aclBinaryOptions binOpts = {0};
+ binOpts.struct_size = sizeof(binOpts);
+ binOpts.elfclass = aclinfo.arch_id == aclX64 ? ELFCLASS64 : ELFCLASS32;
+ binOpts.bitness = ELFDATA2LSB;
+ binOpts.alloc = &::malloc;
+ binOpts.dealloc = &::free;
- aclBinary* bin = aclBinaryInit(sizeof(aclBinary), &aclinfo, &binOpts, &err);
- if (err != ACL_SUCCESS) {
- buildLog_ += "Internal error: Setting up input OpenCL binary failed!\n";
- LogWarning("aclBinaryInit failed");
- return false;
- }
+ aclBinary* bin = aclBinaryInit(sizeof(aclBinary), &aclinfo, &binOpts, &err);
+ if (err != ACL_SUCCESS) {
+ buildLog_ += "Internal error: Setting up input OpenCL binary failed!\n";
+ LogWarning("aclBinaryInit failed");
+ return false;
+ }
- aclSections_0_8 spirFlag;
- _acl_type_enum_0_8 aclTypeBinaryUsed;
- if (std::string::npos != options->clcOptions.find("--spirv")
- || elfSectionType_ == amd::OclElf::SPIRV) {
- spirFlag = aclSPIRV;
- aclTypeBinaryUsed = ACL_TYPE_SPIRV_BINARY;
- } else if (std::string::npos != options->clcOptions.find("--spir")
- || elfSectionType_ == amd::OclElf::SPIR) {
- spirFlag = aclSPIR;
- aclTypeBinaryUsed = ACL_TYPE_SPIR_BINARY;
- } else {
- spirFlag = aclLLVMIR;
- aclTypeBinaryUsed = ACL_TYPE_LLVMIR_BINARY;
- }
+ aclSections_0_8 spirFlag;
+ _acl_type_enum_0_8 aclTypeBinaryUsed;
+ if (std::string::npos != options->clcOptions.find("--spirv") ||
+ elfSectionType_ == amd::OclElf::SPIRV) {
+ spirFlag = aclSPIRV;
+ aclTypeBinaryUsed = ACL_TYPE_SPIRV_BINARY;
+ } else if (std::string::npos != options->clcOptions.find("--spir") ||
+ elfSectionType_ == amd::OclElf::SPIR) {
+ spirFlag = aclSPIR;
+ aclTypeBinaryUsed = ACL_TYPE_SPIR_BINARY;
+ } else {
+ spirFlag = aclLLVMIR;
+ aclTypeBinaryUsed = ACL_TYPE_LLVMIR_BINARY;
+ }
- if (ACL_SUCCESS != aclInsertSection(compiler(), bin,
- llvmBinary_.data(), llvmBinary_.size(), spirFlag)) {
- LogWarning("aclInsertSection failed");
- aclBinaryFini(bin);
- return false;
- }
+ if (ACL_SUCCESS !=
+ aclInsertSection(compiler(), bin, llvmBinary_.data(), llvmBinary_.size(), spirFlag)) {
+ LogWarning("aclInsertSection failed");
+ aclBinaryFini(bin);
+ return false;
+ }
- // temporary solution to synchronize buildNo between runtime and complib
- // until we move runtime inside complib
- ((amd::option::Options*)bin->options)->setBuildNo(options->getBuildNo());
+ // temporary solution to synchronize buildNo between runtime and complib
+ // until we move runtime inside complib
+ ((amd::option::Options*)bin->options)->setBuildNo(options->getBuildNo());
- err = aclCompile(compiler(), bin, options->origOptionStr.c_str(),
- aclTypeBinaryUsed, ACL_TYPE_ISA, NULL);
+ err = aclCompile(compiler(), bin, options->origOptionStr.c_str(), aclTypeBinaryUsed, ACL_TYPE_ISA,
+ NULL);
- buildLog_ += aclGetCompilerLog(compiler());
+ buildLog_ += aclGetCompilerLog(compiler());
- if (err != ACL_SUCCESS) {
- LogWarning("aclCompile failed");
- aclBinaryFini(bin);
- return false;
- }
+ if (err != ACL_SUCCESS) {
+ LogWarning("aclCompile failed");
+ aclBinaryFini(bin);
+ return false;
+ }
- if (options->oVariables->BinBIF30) {
- if (!createBIFBinary(bin)) {
- aclBinaryFini(bin);
- return false;
- }
- }
-
- if (options->oVariables->BinAS && !options->oVariables->UseJIT) {
- size_t len = 0;
- const char* asmtext =
- static_cast(aclExtractSection(compiler(), bin,
- &len, aclCODEGEN, &err));
- if (err != ACL_SUCCESS) {
- LogWarning("aclExtractSection failed");
- aclBinaryFini(bin);
- return false;
- }
-
- // Store the Asm text in ASTEXT section unless the JIT is used
-
- if (!clBinary()->storeX86Asm(asmtext, len)) {
- buildLog_ += "Internal Error: Storing X86 ASM failed!\n";
- return false;
- }
- }
-
- size_t len = 0;
- const void* isa = aclExtractSection(compiler(), bin,
- &len, aclTEXT, &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclExtractSection failed");
- aclBinaryFini(bin);
- return false;
- }
-
- if (options->oVariables->UseJIT) {
- // printf("Using the jit!\n");
- aclJITObjectImage objectImage = aclJITObjectImageCreate(compiler(), isa, len, bin, &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageCreate failed");
- aclBinaryFini(bin);
- return false;
- }
- err = aclJITObjectImageFinalize(compiler(), objectImage);
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageFinalize failed");
- aclBinaryFini(bin);
- return false;
- }
- setJITBinary(objectImage);
+ if (options->oVariables->BinBIF30) {
+ if (!createBIFBinary(bin)) {
aclBinaryFini(bin);
+ return false;
+ }
+ }
+
+ if (options->oVariables->BinAS && !options->oVariables->UseJIT) {
+ size_t len = 0;
+ const char* asmtext =
+ static_cast(aclExtractSection(compiler(), bin, &len, aclCODEGEN, &err));
+ if (err != ACL_SUCCESS) {
+ LogWarning("aclExtractSection failed");
+ aclBinaryFini(bin);
+ return false;
+ }
+
+ // Store the Asm text in ASTEXT section unless the JIT is used
+
+ if (!clBinary()->storeX86Asm(asmtext, len)) {
+ buildLog_ += "Internal Error: Storing X86 ASM failed!\n";
+ return false;
+ }
+ }
+
+ size_t len = 0;
+ const void* isa = aclExtractSection(compiler(), bin, &len, aclTEXT, &err);
+ if (err != ACL_SUCCESS) {
+ LogWarning("aclExtractSection failed");
+ aclBinaryFini(bin);
+ return false;
+ }
+
+ if (options->oVariables->UseJIT) {
+ // printf("Using the jit!\n");
+ aclJITObjectImage objectImage = aclJITObjectImageCreate(compiler(), isa, len, bin, &err);
+ if (err != ACL_SUCCESS) {
+ LogWarning("aclJITObjectImageCreate failed");
+ aclBinaryFini(bin);
+ return false;
+ }
+ err = aclJITObjectImageFinalize(compiler(), objectImage);
+ if (err != ACL_SUCCESS) {
+ LogWarning("aclJITObjectImageFinalize failed");
+ aclBinaryFini(bin);
+ return false;
+ }
+ setJITBinary(objectImage);
+ aclBinaryFini(bin);
// Store the object image binary in the CL binary;
- if (!clBinary()->storeX86JIT(*this)) {
- buildLog_ += "Internal Error: Storing X86 DLL failed!\n";
- return false;
+ if (!clBinary()->storeX86JIT(*this)) {
+ buildLog_ += "Internal Error: Storing X86 DLL failed!\n";
+ return false;
}
#if 0
@@ -646,466 +619,443 @@ Program::compileBinaryToISA(amd::option::Options* options)
asmtext.str().c_str());
#endif
- return true;
- }
-
- std::fstream f;
- f.open(dllFileName_.c_str(), std::fstream::out | std::fstream::binary);
- f.write(static_cast(isa), len);
- f.close();
-
- aclBinaryFini(bin);
-
- if (f.fail() || f.bad()) {
- buildLog_ += "Internal error: fail to create an internal file!\n";
- return false;
- }
-
- // Store the dll binary in the CL binary;
- if (!clBinary()->storeX86(*this, dllFileName_)) {
- buildLog_ += "Internal Error: Storing X86 DLL failed!\n";
- return false;
- }
-
return true;
-#endif // WITH_ONLINE_COMPILER
+ }
+
+ std::fstream f;
+ f.open(dllFileName_.c_str(), std::fstream::out | std::fstream::binary);
+ f.write(static_cast(isa), len);
+ f.close();
+
+ aclBinaryFini(bin);
+
+ if (f.fail() || f.bad()) {
+ buildLog_ += "Internal error: fail to create an internal file!\n";
return false;
+ }
+
+ // Store the dll binary in the CL binary;
+ if (!clBinary()->storeX86(*this, dllFileName_)) {
+ buildLog_ += "Internal Error: Storing X86 DLL failed!\n";
+ return false;
+ }
+
+ return true;
+#endif // WITH_ONLINE_COMPILER
+ return false;
}
-bool
-Program::initBuild(amd::option::Options* options)
-{
- if (!this->::device::Program::initBuild(options)) {
- return false;
- }
+bool Program::initBuild(amd::option::Options* options) {
+ if (!this->::device::Program::initBuild(options)) {
+ return false;
+ }
- options->setPerBuildInfo("cpu",
- clBinary()->getEncryptCode(), false);
+ options->setPerBuildInfo("cpu", clBinary()->getEncryptCode(), false);
- /*
- -f[no-]bin-source : control .source
- -f[no-]bin-llvmir : control .llvmir
- -f[no-]bin-amdil : control .amdil
- -f[no-]bin-exe : control .text
+ /*
+ -f[no-]bin-source : control .source
+ -f[no-]bin-llvmir : control .llvmir
+ -f[no-]bin-amdil : control .amdil
+ -f[no-]bin-exe : control .text
- Default: -fno-bin-source -fbin-llvmir -fno-bin-amdil -fbin-exe
- */
- // Elf Binary setup
- clBinary()->init(options);
+ Default: -fno-bin-source -fbin-llvmir -fno-bin-amdil -fbin-exe
+ */
+ // Elf Binary setup
+ clBinary()->init(options);
- std::string outFileName;
- if (options->isDumpFlagSet(amd::option::DUMP_BIF)) {
- outFileName = options->getDumpFileName(".bin");
- }
- if (!clBinary()->setElfOut(LP64_SWITCH(ELFCLASS32, ELFCLASS64),
- (outFileName.size() > 0)
- ? outFileName.c_str() : NULL)) {
- LogError("setup elfout for CPU failed");
- return false;
- }
+ std::string outFileName;
+ if (options->isDumpFlagSet(amd::option::DUMP_BIF)) {
+ outFileName = options->getDumpFileName(".bin");
+ }
+ if (!clBinary()->setElfOut(LP64_SWITCH(ELFCLASS32, ELFCLASS64),
+ (outFileName.size() > 0) ? outFileName.c_str() : NULL)) {
+ LogError("setup elfout for CPU failed");
+ return false;
+ }
- return true;
+ return true;
}
-bool
-Program::finiBuild(bool isBuildGood)
-{
- clBinary()->resetElfOut();
- clBinary()->resetElfIn();
+bool Program::finiBuild(bool isBuildGood) {
+ clBinary()->resetElfOut();
+ clBinary()->resetElfIn();
- if (!isBuildGood) {
- // Prevent the encrypted binary form leaking out
- clBinary()->setBinary(NULL, 0);
- }
+ if (!isBuildGood) {
+ // Prevent the encrypted binary form leaking out
+ clBinary()->setBinary(NULL, 0);
+ }
- return this->::device::Program::finiBuild(isBuildGood);
+ return this->::device::Program::finiBuild(isBuildGood);
}
-bool
-Program::compileImpl(
- const std::string& sourceCode,
- const std::vector& headers,
- const char** headerIncludeNames,
- amd::option::Options* options)
-{
+bool Program::compileImpl(const std::string& sourceCode,
+ const std::vector& headers,
+ const char** headerIncludeNames, amd::option::Options* options) {
#if defined(WITH_ONLINE_COMPILER)
- std::string tempFolder = amd::Os::getTempPath();
+ std::string tempFolder = amd::Os::getTempPath();
- std::fstream f;
- std::vector headerFileNames(headers.size());
- std::vector newDirs;
- for (size_t i = 0; i < headers.size(); ++i) {
- std::string headerPath = tempFolder;
- std::string headerIncludeName(headerIncludeNames[i]);
- // replace / in path with current os's file separator
- if (amd::Os::fileSeparator() != '/') {
- for (std::string::iterator it = headerIncludeName.begin(),
- end = headerIncludeName.end();
- it != end;
- ++it) {
- if (*it == '/') *it = amd::Os::fileSeparator();
- }
- }
- size_t pos = headerIncludeName.rfind(amd::Os::fileSeparator());
- if (pos != std::string::npos) {
- headerPath += amd::Os::fileSeparator();
- headerPath += headerIncludeName.substr(0, pos);
- headerIncludeName = headerIncludeName.substr(pos+1);
- }
- if (!amd::Os::pathExists(headerPath)) {
- bool ret = amd::Os::createPath(headerPath);
- assert(ret && "failed creating path!");
- newDirs.push_back(headerPath);
- }
- std::string headerFullName
- = headerPath + amd::Os::fileSeparator() + headerIncludeName;
- headerFileNames[i] = headerFullName;
- f.open(headerFullName.c_str(), std::fstream::out);
- assert(!f.fail() && "failed creating header file!");
- f.write(headers[i]->c_str(), headers[i]->length());
- f.close();
+ std::fstream f;
+ std::vector headerFileNames(headers.size());
+ std::vector newDirs;
+ for (size_t i = 0; i < headers.size(); ++i) {
+ std::string headerPath = tempFolder;
+ std::string headerIncludeName(headerIncludeNames[i]);
+ // replace / in path with current os's file separator
+ if (amd::Os::fileSeparator() != '/') {
+ for (std::string::iterator it = headerIncludeName.begin(), end = headerIncludeName.end();
+ it != end; ++it) {
+ if (*it == '/') *it = amd::Os::fileSeparator();
+ }
}
-
- acl_error err = ACL_SUCCESS;
- aclTargetInfo aclinfo = info();
-
- aclBinaryOptions binOpts = {0};
- binOpts.struct_size = sizeof(binOpts);
- binOpts.elfclass = aclinfo.arch_id == aclX64 ? ELFCLASS64 : ELFCLASS32;
- binOpts.bitness = ELFDATA2LSB;
- binOpts.alloc = &::malloc;
- binOpts.dealloc = &::free;
-
- aclBinary* bin = aclBinaryInit(sizeof(aclBinary), &aclinfo, &binOpts, &err);
- if (err != ACL_SUCCESS) {
- buildLog_ += "Internal error: Setting up input OpenCL binary failed!\n";
- LogWarning("aclBinaryInit failed");
- return false;
+ size_t pos = headerIncludeName.rfind(amd::Os::fileSeparator());
+ if (pos != std::string::npos) {
+ headerPath += amd::Os::fileSeparator();
+ headerPath += headerIncludeName.substr(0, pos);
+ headerIncludeName = headerIncludeName.substr(pos + 1);
}
-
- if (ACL_SUCCESS != aclInsertSection(compiler(), bin,
- sourceCode.c_str(), sourceCode.size(), aclSOURCE)) {
- LogWarning("aclInsertSection failed");
- aclBinaryFini(bin);
- return false;
+ if (!amd::Os::pathExists(headerPath)) {
+ bool ret = amd::Os::createPath(headerPath);
+ assert(ret && "failed creating path!");
+ newDirs.push_back(headerPath);
}
+ std::string headerFullName = headerPath + amd::Os::fileSeparator() + headerIncludeName;
+ headerFileNames[i] = headerFullName;
+ f.open(headerFullName.c_str(), std::fstream::out);
+ assert(!f.fail() && "failed creating header file!");
+ f.write(headers[i]->c_str(), headers[i]->length());
+ f.close();
+ }
- // temporary solution to synchronize buildNo between runtime and complib
- // until we move runtime inside complib
- ((amd::option::Options*)bin->options)->setBuildNo(options->getBuildNo());
+ acl_error err = ACL_SUCCESS;
+ aclTargetInfo aclinfo = info();
- std::stringstream opts;
- std::string token;
- opts << options->origOptionStr.c_str();
+ aclBinaryOptions binOpts = {0};
+ binOpts.struct_size = sizeof(binOpts);
+ binOpts.elfclass = aclinfo.arch_id == aclX64 ? ELFCLASS64 : ELFCLASS32;
+ binOpts.bitness = ELFDATA2LSB;
+ binOpts.alloc = &::malloc;
+ binOpts.dealloc = &::free;
- if (options->origOptionStr.find("-cl-std=CL") == std::string::npos) {
- switch(OPENCL_MAJOR*100 + OPENCL_MINOR*10) {
- case 100: opts << " -cl-std=CL1.0"; break;
- case 110: opts << " -cl-std=CL1.1"; break;
- case 200: default:
- case 120: opts << " -cl-std=CL1.2"; break;
- }
- }
-
- //Add only for CL2.0 and later
- bool spirFlag = false;
- if (options->oVariables->CLStd[2] >= '2') {
- opts << " -D" << "CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE="
- << device().info().maxGlobalVariableSize_;
- spirFlag = true;
- }
-
- // FIXME: Should we prefix everything with -Wf,?
- std::istringstream iss(options->clcOptions);
- while (getline(iss, token, ' ')) {
- if (!token.empty()) {
- // Check if this is a -D option
- if (token.compare("-D") == 0) {
- // It is, skip payload
- getline(iss, token, ' ');
- continue;
- }
- opts << " -Wf," << token;
- }
- }
-
- if (!headers.empty()) {
- opts << " -I" << tempFolder;
- }
-
- if (device().info().imageSupport_) {
- opts << " -D__IMAGE_SUPPORT__=1";
- }
- if (device().hasFMA4Instructions()) {
- opts << " -DFP_FAST_FMA=1 -DFP_FAST_FMAF=1";
- }
-
- iss.clear();
- iss.str(device().info().extensions_);
- while (getline(iss, token, ' ')) {
- if (!token.empty()) {
- opts << " -D" << token << "=1";
- }
- }
-
- std::string newOpt = opts.str();
- size_t pos = newOpt.find("-fno-bin-llvmir");
- while (pos != std::string::npos) {
- newOpt.erase(pos, 15);
- pos = newOpt.find("-fno-bin-llvmir");
- }
-
- err = aclCompile(compiler(), bin, newOpt.c_str(),
- ACL_TYPE_OPENCL, spirFlag ? ACL_TYPE_SPIR_BINARY : ACL_TYPE_LLVMIR_BINARY, NULL);
-
- buildLog_ += aclGetCompilerLog(compiler());
-
- if (err != ACL_SUCCESS) {
- LogWarning("aclCompile failed");
- aclBinaryFini(bin);
- return false;
- }
-
- size_t size = 0;
- const void* llvmir = aclExtractSection(compiler(), bin,
- &size, aclLLVMIR, &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclExtractSection failed");
- aclBinaryFini(bin);
- return false;
- }
-
- llvmBinary_.assign(reinterpret_cast(llvmir), size);
- elfSectionType_ = amd::OclElf::LLVMIR;
- aclBinaryFini(bin);
-
- if (clBinary()->saveSOURCE()) {
- clBinary()->elfOut()->addSection(
- amd::OclElf::SOURCE, sourceCode.data(), sourceCode.length());
- }
- if (clBinary()->saveLLVMIR()) {
- clBinary()->elfOut()->addSection(
- amd::OclElf::LLVMIR, llvmBinary_.data(), llvmBinary_.size(), false);
- // store the original compile options
- clBinary()->storeCompileOptions(compileOptions_);
- }
-
- return true;
-#else // WITH_ONLINE_COMPILER
+ aclBinary* bin = aclBinaryInit(sizeof(aclBinary), &aclinfo, &binOpts, &err);
+ if (err != ACL_SUCCESS) {
+ buildLog_ += "Internal error: Setting up input OpenCL binary failed!\n";
+ LogWarning("aclBinaryInit failed");
return false;
+ }
+
+ if (ACL_SUCCESS !=
+ aclInsertSection(compiler(), bin, sourceCode.c_str(), sourceCode.size(), aclSOURCE)) {
+ LogWarning("aclInsertSection failed");
+ aclBinaryFini(bin);
+ return false;
+ }
+
+ // temporary solution to synchronize buildNo between runtime and complib
+ // until we move runtime inside complib
+ ((amd::option::Options*)bin->options)->setBuildNo(options->getBuildNo());
+
+ std::stringstream opts;
+ std::string token;
+ opts << options->origOptionStr.c_str();
+
+ if (options->origOptionStr.find("-cl-std=CL") == std::string::npos) {
+ switch (OPENCL_MAJOR * 100 + OPENCL_MINOR * 10) {
+ case 100:
+ opts << " -cl-std=CL1.0";
+ break;
+ case 110:
+ opts << " -cl-std=CL1.1";
+ break;
+ case 200:
+ default:
+ case 120:
+ opts << " -cl-std=CL1.2";
+ break;
+ }
+ }
+
+ // Add only for CL2.0 and later
+ bool spirFlag = false;
+ if (options->oVariables->CLStd[2] >= '2') {
+ opts << " -D"
+ << "CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE=" << device().info().maxGlobalVariableSize_;
+ spirFlag = true;
+ }
+
+ // FIXME: Should we prefix everything with -Wf,?
+ std::istringstream iss(options->clcOptions);
+ while (getline(iss, token, ' ')) {
+ if (!token.empty()) {
+ // Check if this is a -D option
+ if (token.compare("-D") == 0) {
+ // It is, skip payload
+ getline(iss, token, ' ');
+ continue;
+ }
+ opts << " -Wf," << token;
+ }
+ }
+
+ if (!headers.empty()) {
+ opts << " -I" << tempFolder;
+ }
+
+ if (device().info().imageSupport_) {
+ opts << " -D__IMAGE_SUPPORT__=1";
+ }
+ if (device().hasFMA4Instructions()) {
+ opts << " -DFP_FAST_FMA=1 -DFP_FAST_FMAF=1";
+ }
+
+ iss.clear();
+ iss.str(device().info().extensions_);
+ while (getline(iss, token, ' ')) {
+ if (!token.empty()) {
+ opts << " -D" << token << "=1";
+ }
+ }
+
+ std::string newOpt = opts.str();
+ size_t pos = newOpt.find("-fno-bin-llvmir");
+ while (pos != std::string::npos) {
+ newOpt.erase(pos, 15);
+ pos = newOpt.find("-fno-bin-llvmir");
+ }
+
+ err = aclCompile(compiler(), bin, newOpt.c_str(), ACL_TYPE_OPENCL,
+ spirFlag ? ACL_TYPE_SPIR_BINARY : ACL_TYPE_LLVMIR_BINARY, NULL);
+
+ buildLog_ += aclGetCompilerLog(compiler());
+
+ if (err != ACL_SUCCESS) {
+ LogWarning("aclCompile failed");
+ aclBinaryFini(bin);
+ return false;
+ }
+
+ size_t size = 0;
+ const void* llvmir = aclExtractSection(compiler(), bin, &size, aclLLVMIR, &err);
+ if (err != ACL_SUCCESS) {
+ LogWarning("aclExtractSection failed");
+ aclBinaryFini(bin);
+ return false;
+ }
+
+ llvmBinary_.assign(reinterpret_cast(llvmir), size);
+ elfSectionType_ = amd::OclElf::LLVMIR;
+ aclBinaryFini(bin);
+
+ if (clBinary()->saveSOURCE()) {
+ clBinary()->elfOut()->addSection(amd::OclElf::SOURCE, sourceCode.data(), sourceCode.length());
+ }
+ if (clBinary()->saveLLVMIR()) {
+ clBinary()->elfOut()->addSection(amd::OclElf::LLVMIR, llvmBinary_.data(), llvmBinary_.size(),
+ false);
+ // store the original compile options
+ clBinary()->storeCompileOptions(compileOptions_);
+ }
+
+ return true;
+#else // WITH_ONLINE_COMPILER
+ return false;
#endif
}
-bool
-Program::loadDllCode(amd::option::Options* options, bool addElfSymbols)
-{
- if(options->oVariables->UseJIT) {
- acl_error err = ACL_SUCCESS;
- aclJITObjectImage objectImage = getJITBinary();
- err = aclJITObjectImageIterateSymbols(compiler(), objectImage,
- setKernelInfoCallbackCStr, this);
- if (err != ACL_SUCCESS) {
+bool Program::loadDllCode(amd::option::Options* options, bool addElfSymbols) {
+ if (options->oVariables->UseJIT) {
+ acl_error err = ACL_SUCCESS;
+ aclJITObjectImage objectImage = getJITBinary();
+ err = aclJITObjectImageIterateSymbols(compiler(), objectImage, setKernelInfoCallbackCStr, this);
+ if (err != ACL_SUCCESS) {
+ LogWarning("aclJITObjectImageIterateSymbols failed");
+ return false;
+ }
+ err = aclJITObjectImageIterateSymbols(compiler(), objectImage, setSymbolsCallbackCStr,
+ clBinary());
+ if (err != ACL_SUCCESS) {
+ LogWarning("aclJITObjectImageIterateSymbols failed");
+ return false;
+ }
+ size_t size = aclJITObjectImageGetGlobalsSize(compiler(), objectImage, &err);
+ if (err != ACL_SUCCESS) {
+ LogWarning("aclJITObjectImageGetGlobalsSize failed");
+ return false;
+ }
+ setGlobalVariableTotalSize(size);
+ return true;
+ }
+// Check if we have a URI
+#if defined(_WIN32)
+ UINT prevMode = ::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
+
+ handle_ = ::LoadLibraryEx(dllFileName_.c_str(), NULL, DONT_RESOLVE_DLL_REFERENCES);
+
+ ::SetErrorMode(prevMode);
+#else
+ handle_ = amd::Os::loadLibrary(dllFileName_.c_str());
+#endif
+ if (!handle_) {
+ return false;
+ }
+
+ if (!amd::Os::iterateSymbols(handle_, setKernelInfoCallback, this)) {
+ return false;
+ }
+
+ // Add cpu symbols into elf
+ if (addElfSymbols) {
+ if (!amd::Os::iterateSymbols(handle_, setSymbolsCallback, clBinary())) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool Program::linkImpl(amd::option::Options* options) {
+#if defined(WITH_ONLINE_COMPILER)
+ // If we don't have LLVM binary then attempt to use OCL binary
+ if (llvmBinary_.empty()) {
+ // Load ISA
+ // For elf format, setup elfIn() and this elfIn() will be released
+ // at the end of build by finiBuild().
+ if (!clBinary()->setElfIn(LP64_SWITCH(ELFCLASS32, ELFCLASS64))) {
+ buildLog_ += "Internal error: Setting up input OpenCL binary failed!\n";
+ LogError("Setting up input binary failed");
+ return false;
+ }
+
+ if (options->oVariables->UseJIT) {
+ bool hasJITBinary;
+ if (!clBinary()->loadX86JIT(*this, hasJITBinary)) {
+ return false;
+ } else if (hasJITBinary) {
+ aclJITObjectImage objectImage = getJITBinary();
+ acl_error err = aclJITObjectImageIterateSymbols(compiler(), objectImage,
+ setKernelInfoCallbackCStr, this);
+ if (err != ACL_SUCCESS) {
LogWarning("aclJITObjectImageIterateSymbols failed");
return false;
- }
- err = aclJITObjectImageIterateSymbols(compiler(), objectImage,
- setSymbolsCallbackCStr, clBinary());
- if (err != ACL_SUCCESS) {
+ }
+ err = aclJITObjectImageIterateSymbols(compiler(), objectImage, setSymbolsCallbackCStr,
+ clBinary());
+ if (err != ACL_SUCCESS) {
LogWarning("aclJITObjectImageIterateSymbols failed");
return false;
- }
- size_t size = aclJITObjectImageGetGlobalsSize(compiler(), objectImage, &err);
- if (err != ACL_SUCCESS) {
+ }
+ size_t size = aclJITObjectImageGetGlobalsSize(compiler(), objectImage, &err);
+ if (err != ACL_SUCCESS) {
LogWarning("aclJITObjectImageGetGlobalsSize failed");
return false;
- }
- setGlobalVariableTotalSize(size);
- return true;
- }
- // Check if we have a URI
-#if defined(_WIN32)
- UINT prevMode = ::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
-
- handle_ = ::LoadLibraryEx(
- dllFileName_.c_str(), NULL,DONT_RESOLVE_DLL_REFERENCES);
-
- ::SetErrorMode(prevMode);
-#else
- handle_ = amd::Os::loadLibrary(dllFileName_.c_str());
-#endif
- if (!handle_) {
- return false;
- }
-
- if (!amd::Os::iterateSymbols(handle_, setKernelInfoCallback, this)) {
- return false;
- }
-
- // Add cpu symbols into elf
- if (addElfSymbols) {
- if (!amd::Os::iterateSymbols(handle_, setSymbolsCallback, clBinary())) {
- return false;
- }
- }
-
- return true;
-}
-
-bool
-Program::linkImpl(amd::option::Options* options)
-{
-#if defined(WITH_ONLINE_COMPILER)
- // If we don't have LLVM binary then attempt to use OCL binary
- if (llvmBinary_.empty()) {
- // Load ISA
- // For elf format, setup elfIn() and this elfIn() will be released
- // at the end of build by finiBuild().
- if (!clBinary()->setElfIn(LP64_SWITCH(ELFCLASS32, ELFCLASS64))) {
- buildLog_ += "Internal error: Setting up input OpenCL binary failed!\n";
- LogError("Setting up input binary failed");
- return false;
- }
-
- if (options->oVariables->UseJIT) {
- bool hasJITBinary;
- if (!clBinary()->loadX86JIT(*this, hasJITBinary)) {
- return false;
- } else if (hasJITBinary) {
- aclJITObjectImage objectImage = getJITBinary();
- acl_error err = aclJITObjectImageIterateSymbols(compiler(), objectImage,
- setKernelInfoCallbackCStr, this);
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageIterateSymbols failed");
- return false;
- }
- err = aclJITObjectImageIterateSymbols(compiler(), objectImage,
- setSymbolsCallbackCStr, clBinary());
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageIterateSymbols failed");
- return false;
- }
- size_t size = aclJITObjectImageGetGlobalsSize(compiler(), objectImage, &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageGetGlobalsSize failed");
- return false;
- }
- setGlobalVariableTotalSize(size);
- return true;
- }
- // Fall-through to recompile
- } else {
- // Trying to load DLL that was generated by out-process as/ld before
- bool hasDLL = false;
- bool loadSuccess = clBinary()->loadX86(*this, dllFileName_, hasDLL);
- if (!loadSuccess) {
- buildLog_ += "Error: loading a kernel from OpenCL binary failed!\n";
- return false;
- }
- else if (hasDLL) {
- if (loadDllCode(options)) {
- // No rebuid and use the original binary. Release any new binary if there is.
- clBinary()->restoreOrigBinary();
- return true;
- }
- }
- // Fall-through to recompile
- }
-
- // Need to try recompile, check to see if if LLVM IR is present
- if (clBinary()->loadLlvmBinary(llvmBinary_, elfSectionType_) &&
- clBinary()->isRecompilable(llvmBinary_, amd::OclElf::CPU_PLATFORM)) {
- // Copy both .source and .llvmir into the elfout_
- char *section;
- size_t sz;
- if (clBinary()->saveSOURCE() &&
- clBinary()->elfIn()->getSection(amd::OclElf::SOURCE, §ion, &sz)) {
- if ((section != NULL) && (sz > 0)) {
- clBinary()->elfOut()->addSection(amd::OclElf::SOURCE, section, sz);
- }
- }
-
- if (clBinary()->saveLLVMIR()) {
- clBinary()->elfOut()->addSection(elfSectionType_,
- llvmBinary_.data(),
- llvmBinary_.size(), false);
- }
- }
- // We failed kernels loading (wrong ASIC?)
- else {
- buildLog_ += "Error: Runtime failed to load kernels from OCL binary!\n";
- LogError(buildLog_.c_str());
- return false;
- }
- }
-
- // Do we have llvm binary?
- if (!llvmBinary_.empty()) {
- // Compile llvm binary to x86 source code
- if (!compileBinaryToISA(options)) {
- LogError("We failed to compile LLVMIR binary to ASM text!");
- return false;
- }
- }
-
- setType(TYPE_EXECUTABLE);
-
- /////////////////////////////////////////////////////////////
- //////////////// check, there is a good place to finish elf objects
- //////////////////////////////////////////////////////////////
-
- // Load dll executable
- if (loadDllCode(options, clBinary()->saveISA())) {
- if (!createBinary(options)) {
- buildLog_ += "Internal Error: creating OpenCL binary failed!\n";
- return false;
}
+ setGlobalVariableTotalSize(size);
return true;
+ }
+ // Fall-through to recompile
+ } else {
+ // Trying to load DLL that was generated by out-process as/ld before
+ bool hasDLL = false;
+ bool loadSuccess = clBinary()->loadX86(*this, dllFileName_, hasDLL);
+ if (!loadSuccess) {
+ buildLog_ += "Error: loading a kernel from OpenCL binary failed!\n";
+ return false;
+ } else if (hasDLL) {
+ if (loadDllCode(options)) {
+ // No rebuid and use the original binary. Release any new binary if there is.
+ clBinary()->restoreOrigBinary();
+ return true;
+ }
+ }
+ // Fall-through to recompile
}
- buildLog_ += "Internal Error: loading shared library failed!\n";
-#endif // WITH_ONLINE_COMPILER
- return false;
+
+ // Need to try recompile, check to see if if LLVM IR is present
+ if (clBinary()->loadLlvmBinary(llvmBinary_, elfSectionType_) &&
+ clBinary()->isRecompilable(llvmBinary_, amd::OclElf::CPU_PLATFORM)) {
+ // Copy both .source and .llvmir into the elfout_
+ char* section;
+ size_t sz;
+ if (clBinary()->saveSOURCE() &&
+ clBinary()->elfIn()->getSection(amd::OclElf::SOURCE, §ion, &sz)) {
+ if ((section != NULL) && (sz > 0)) {
+ clBinary()->elfOut()->addSection(amd::OclElf::SOURCE, section, sz);
+ }
+ }
+
+ if (clBinary()->saveLLVMIR()) {
+ clBinary()->elfOut()->addSection(elfSectionType_, llvmBinary_.data(), llvmBinary_.size(),
+ false);
+ }
+ }
+ // We failed kernels loading (wrong ASIC?)
+ else {
+ buildLog_ += "Error: Runtime failed to load kernels from OCL binary!\n";
+ LogError(buildLog_.c_str());
+ return false;
+ }
+ }
+
+ // Do we have llvm binary?
+ if (!llvmBinary_.empty()) {
+ // Compile llvm binary to x86 source code
+ if (!compileBinaryToISA(options)) {
+ LogError("We failed to compile LLVMIR binary to ASM text!");
+ return false;
+ }
+ }
+
+ setType(TYPE_EXECUTABLE);
+
+ /////////////////////////////////////////////////////////////
+ //////////////// check, there is a good place to finish elf objects
+ //////////////////////////////////////////////////////////////
+
+ // Load dll executable
+ if (loadDllCode(options, clBinary()->saveISA())) {
+ if (!createBinary(options)) {
+ buildLog_ += "Internal Error: creating OpenCL binary failed!\n";
+ return false;
+ }
+ return true;
+ }
+ buildLog_ += "Internal Error: loading shared library failed!\n";
+#endif // WITH_ONLINE_COMPILER
+ return false;
}
-bool
-Program::linkImpl(
- const std::vector& inputPrograms,
- amd::option::Options* options,
- bool createLibrary)
-{
+bool Program::linkImpl(const std::vector& inputPrograms,
+ amd::option::Options* options, bool createLibrary) {
#if defined(WITH_ONLINE_COMPILER)
- std::vector llvmBinaries(inputPrograms.size());
- std::vector elfSectionType(inputPrograms.size());
- std::vector::const_iterator it
- = inputPrograms.begin();
- std::vector::const_iterator itEnd
- = inputPrograms.end();
- for (size_t i = 0; it != itEnd; ++it, ++i) {
- Program* program = (Program*)*it;
+ std::vector llvmBinaries(inputPrograms.size());
+ std::vector elfSectionType(inputPrograms.size());
+ std::vector::const_iterator it = inputPrograms.begin();
+ std::vector::const_iterator itEnd = inputPrograms.end();
+ for (size_t i = 0; it != itEnd; ++it, ++i) {
+ Program* program = (Program*)*it;
- if (program->llvmBinary_.empty()) {
- if (program->clBinary() == NULL) {
- buildLog_ += "Internal error: Input program not compiled!\n";
- LogError("Loading compiled input object failed");
- return false;
- }
+ if (program->llvmBinary_.empty()) {
+ if (program->clBinary() == NULL) {
+ buildLog_ += "Internal error: Input program not compiled!\n";
+ LogError("Loading compiled input object failed");
+ return false;
+ }
- // If we don't have LLVM binary then attempt to use OCL binary
- // Load ISA
- // For elf format, setup elfIn() and this elfIn() will be released
- // at the end of build by finiBuild().
- if (!program->clBinary()->setElfIn(LP64_SWITCH(ELFCLASS32,
- ELFCLASS64))) {
- buildLog_ += "Internal error: Setting up input OpenCL binary"
- " failed!\n";
- LogError("Setting up input binary failed");
- return false;
- }
+ // If we don't have LLVM binary then attempt to use OCL binary
+ // Load ISA
+ // For elf format, setup elfIn() and this elfIn() will be released
+ // at the end of build by finiBuild().
+ if (!program->clBinary()->setElfIn(LP64_SWITCH(ELFCLASS32, ELFCLASS64))) {
+ buildLog_ +=
+ "Internal error: Setting up input OpenCL binary"
+ " failed!\n";
+ LogError("Setting up input binary failed");
+ return false;
+ }
- // Need to try recompile, check to see if if LLVM IR is present
- if (program->clBinary()->loadLlvmBinary(program->llvmBinary_, program->elfSectionType_) &&
- program->clBinary()->isRecompilable(program->llvmBinary_,
- amd::OclElf::CPU_PLATFORM)) {
- // Copy both .source and .llvmir into the elfout_
+ // Need to try recompile, check to see if if LLVM IR is present
+ if (program->clBinary()->loadLlvmBinary(program->llvmBinary_, program->elfSectionType_) &&
+ program->clBinary()->isRecompilable(program->llvmBinary_, amd::OclElf::CPU_PLATFORM)) {
+// Copy both .source and .llvmir into the elfout_
#if 0
// TODO: copy source into .source section of elfout_
char *section;
@@ -1117,222 +1067,211 @@ Program::linkImpl(
}
}
#endif
- }
- // We failed kernels loading (wrong ASIC?)
- else {
- buildLog_ += "Error: Runtime failed to load kernels from OCL "
- "binary!\n";
- LogError(buildLog_.c_str());
- return false;
- }
- }
-
- llvmBinaries[i] = &program->llvmBinary_;
- elfSectionType[i] = program->elfSectionType_;
+ }
+ // We failed kernels loading (wrong ASIC?)
+ else {
+ buildLog_ +=
+ "Error: Runtime failed to load kernels from OCL "
+ "binary!\n";
+ LogError(buildLog_.c_str());
+ return false;
+ }
}
- acl_error err = ACL_SUCCESS;
- aclTargetInfo aclinfo = info();
+ llvmBinaries[i] = &program->llvmBinary_;
+ elfSectionType[i] = program->elfSectionType_;
+ }
- aclBinaryOptions binOpts = {0};
- binOpts.struct_size = sizeof(binOpts);
- binOpts.elfclass = aclinfo.arch_id == aclX64 ? ELFCLASS64 : ELFCLASS32;
- binOpts.bitness = ELFDATA2LSB;
- binOpts.alloc = &::malloc;
- binOpts.dealloc = &::free;
+ acl_error err = ACL_SUCCESS;
+ aclTargetInfo aclinfo = info();
- std::vector libs(llvmBinaries.size(), NULL);
- for (size_t i = 0; i < libs.size(); ++i) {
- libs[i] = aclBinaryInit(sizeof(aclBinary), &aclinfo, &binOpts, &err);
- if (err != ACL_SUCCESS) {
- buildLog_ += "Internal error: Setting up input OpenCL binary failed!\n";
- LogWarning("aclBinaryInit failed");
- break;
- }
+ aclBinaryOptions binOpts = {0};
+ binOpts.struct_size = sizeof(binOpts);
+ binOpts.elfclass = aclinfo.arch_id == aclX64 ? ELFCLASS64 : ELFCLASS32;
+ binOpts.bitness = ELFDATA2LSB;
+ binOpts.alloc = &::malloc;
+ binOpts.dealloc = &::free;
- _bif_sections_enum_0_8 aclTypeUsed;
- if (elfSectionType[i] == amd::OclElf::SPIRV) {
- aclTypeUsed = aclSPIRV;
- } else if (elfSectionType[i] == amd::OclElf::SPIR) {
- aclTypeUsed = aclSPIR;
- } else {
- aclTypeUsed = aclLLVMIR;
- }
- err = aclInsertSection(compiler(), libs[i],
- llvmBinaries[i]->data(), llvmBinaries[i]->size(), aclTypeUsed);
-
- if (err != ACL_SUCCESS) {
- LogWarning("aclInsertSection failed");
- break;
- }
-
- // temporary solution to synchronize buildNo between runtime and complib
- // until we move runtime inside complib
- ((amd::option::Options*)libs[i]->options)->setBuildNo(
- options->getBuildNo());
+ std::vector libs(llvmBinaries.size(), NULL);
+ for (size_t i = 0; i < libs.size(); ++i) {
+ libs[i] = aclBinaryInit(sizeof(aclBinary), &aclinfo, &binOpts, &err);
+ if (err != ACL_SUCCESS) {
+ buildLog_ += "Internal error: Setting up input OpenCL binary failed!\n";
+ LogWarning("aclBinaryInit failed");
+ break;
}
- if (libs.size() > 0 && err == ACL_SUCCESS) do {
- unsigned int numLibs = libs.size() - 1;
-
- if (numLibs > 0) {
- err = aclLink(compiler(), libs[0], libs.size() - 1, &libs[1],
- ACL_TYPE_LLVMIR_BINARY, "-create-library", NULL);
-
- buildLog_ += aclGetCompilerLog(compiler());
-
- if (err != ACL_SUCCESS) {
- LogWarning("aclLink failed");
- break;
- }
- }
-
- size_t size = 0;
- _bif_sections_enum_0_8 aclTypeUsed;
- if (elfSectionType[0] == amd::OclElf::SPIRV && numLibs == 0) {
- aclTypeUsed = aclSPIRV;
- } else if (elfSectionType[0] == amd::OclElf::SPIR && numLibs == 0) {
- aclTypeUsed = aclSPIR;
- } else {
- aclTypeUsed = aclLLVMIR;
- }
- const void* llvmir = aclExtractSection(compiler(), libs[0],
- &size, aclTypeUsed, &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclExtractSection failed");
- break;
- }
-
- llvmBinary_.assign(reinterpret_cast(llvmir), size);
- } while(0);
-
- std::for_each(libs.begin(), libs.end(), std::ptr_fun(aclBinaryFini));
+ _bif_sections_enum_0_8 aclTypeUsed;
+ if (elfSectionType[i] == amd::OclElf::SPIRV) {
+ aclTypeUsed = aclSPIRV;
+ } else if (elfSectionType[i] == amd::OclElf::SPIR) {
+ aclTypeUsed = aclSPIR;
+ } else {
+ aclTypeUsed = aclLLVMIR;
+ }
+ err = aclInsertSection(compiler(), libs[i], llvmBinaries[i]->data(), llvmBinaries[i]->size(),
+ aclTypeUsed);
if (err != ACL_SUCCESS) {
- buildLog_ += "Error: linking llvm modules failed!";
- return false;
+ LogWarning("aclInsertSection failed");
+ break;
}
- if (clBinary()->saveLLVMIR()) {
- clBinary()->elfOut()->addSection(elfSectionType_,
- llvmBinary_.data(),
- llvmBinary_.size(),
- false);
- // store the original link options
- clBinary()->storeLinkOptions(linkOptions_);
- clBinary()->storeCompileOptions(compileOptions_);
- }
+ // temporary solution to synchronize buildNo between runtime and complib
+ // until we move runtime inside complib
+ ((amd::option::Options*)libs[i]->options)->setBuildNo(options->getBuildNo());
+ }
- // skip the rest if we are building an opencl library
- if (createLibrary) {
- setType(TYPE_LIBRARY);
- if (!createBinary(options)) {
- buildLog_ += "Intenral error: creating OpenCL binary failed\n";
- return false;
+ if (libs.size() > 0 && err == ACL_SUCCESS) do {
+ unsigned int numLibs = libs.size() - 1;
+
+ if (numLibs > 0) {
+ err = aclLink(compiler(), libs[0], libs.size() - 1, &libs[1], ACL_TYPE_LLVMIR_BINARY,
+ "-create-library", NULL);
+
+ buildLog_ += aclGetCompilerLog(compiler());
+
+ if (err != ACL_SUCCESS) {
+ LogWarning("aclLink failed");
+ break;
}
+ }
- return true;
- }
+ size_t size = 0;
+ _bif_sections_enum_0_8 aclTypeUsed;
+ if (elfSectionType[0] == amd::OclElf::SPIRV && numLibs == 0) {
+ aclTypeUsed = aclSPIRV;
+ } else if (elfSectionType[0] == amd::OclElf::SPIR && numLibs == 0) {
+ aclTypeUsed = aclSPIR;
+ } else {
+ aclTypeUsed = aclLLVMIR;
+ }
+ const void* llvmir = aclExtractSection(compiler(), libs[0], &size, aclTypeUsed, &err);
+ if (err != ACL_SUCCESS) {
+ LogWarning("aclExtractSection failed");
+ break;
+ }
- // Compile llvm binary to x86 source code
- if (!compileBinaryToISA(options)) {
- LogError("We failed to compile LLVMIR binary to ASM text!");
- return false;
- }
+ llvmBinary_.assign(reinterpret_cast(llvmir), size);
+ } while (0);
- setType(TYPE_EXECUTABLE);
+ std::for_each(libs.begin(), libs.end(), std::ptr_fun(aclBinaryFini));
- /////////////////////////////////////////////////////////////
- //////////////// check, there is a good place to finish elf objects
- //////////////////////////////////////////////////////////////
-
- // Load dll executable
- if (loadDllCode(options, clBinary()->saveISA())) {
- if (!createBinary(options)) {
- buildLog_ += "Internal Error: creating OpenCL binary failed!\n";
- return false;
- }
- return true;
- }
- buildLog_ += "Internal Error: loading shared library failed!\n";
-#endif // WITH_ONLINE_COMPILER
+ if (err != ACL_SUCCESS) {
+ buildLog_ += "Error: linking llvm modules failed!";
return false;
+ }
+
+ if (clBinary()->saveLLVMIR()) {
+ clBinary()->elfOut()->addSection(elfSectionType_, llvmBinary_.data(), llvmBinary_.size(),
+ false);
+ // store the original link options
+ clBinary()->storeLinkOptions(linkOptions_);
+ clBinary()->storeCompileOptions(compileOptions_);
+ }
+
+ // skip the rest if we are building an opencl library
+ if (createLibrary) {
+ setType(TYPE_LIBRARY);
+ if (!createBinary(options)) {
+ buildLog_ += "Intenral error: creating OpenCL binary failed\n";
+ return false;
+ }
+
+ return true;
+ }
+
+ // Compile llvm binary to x86 source code
+ if (!compileBinaryToISA(options)) {
+ LogError("We failed to compile LLVMIR binary to ASM text!");
+ return false;
+ }
+
+ setType(TYPE_EXECUTABLE);
+
+ /////////////////////////////////////////////////////////////
+ //////////////// check, there is a good place to finish elf objects
+ //////////////////////////////////////////////////////////////
+
+ // Load dll executable
+ if (loadDllCode(options, clBinary()->saveISA())) {
+ if (!createBinary(options)) {
+ buildLog_ += "Internal Error: creating OpenCL binary failed!\n";
+ return false;
+ }
+ return true;
+ }
+ buildLog_ += "Internal Error: loading shared library failed!\n";
+#endif // WITH_ONLINE_COMPILER
+ return false;
}
-bool
-Program::initClBinary()
-{
+bool Program::initClBinary() {
+ if (clBinary_ == NULL) {
+ clBinary_ = new ClBinary(device());
if (clBinary_ == NULL) {
- clBinary_ = new ClBinary(device());
- if (clBinary_ == NULL) {
- return false;
- }
+ return false;
}
+ }
+ return true;
+}
+
+void Program::releaseClBinary() {
+ if (clBinary_ != NULL) {
+ delete clBinary_;
+ clBinary_ = NULL;
+ }
+}
+
+bool Program::createBinary(amd::option::Options* options) {
+ if (options->oVariables->BinBIF30) {
return true;
+ }
+
+ if (!clBinary()->createElfBinary(options->oVariables->BinEncrypt, type())) {
+ buildLog_ += "Internal Error: creating OpenCL binary failed!\n";
+ LogError("Failed to create ELF binary image!");
+ return false;
+ }
+ return true;
}
-void
-Program::releaseClBinary()
-{
- if (clBinary_ != NULL) {
- delete clBinary_;
- clBinary_ = NULL;
- }
+const aclTargetInfo& Program::info(const char* str) {
+ acl_error err = ACL_SUCCESS;
+ info_ = aclGetTargetInfo(LP64_SWITCH("x86", "x86-64"), (str && str[0] == '\0' ? "Generic" : str),
+ &err);
+ if (err != ACL_SUCCESS) {
+ LogWarning("aclGetTargetInfo failed");
+ }
+ return info_;
}
-bool
-Program::createBinary(amd::option::Options* options)
-{
- if (options->oVariables->BinBIF30) {
- return true;
- }
+Program::~Program() {
+ if (getJITBinary() != NULL) {
+ aclJITObjectImageDestroy(compiler(), getJITBinary());
+ }
- if (!clBinary()->createElfBinary(options->oVariables->BinEncrypt,
- type())) {
- buildLog_ += "Internal Error: creating OpenCL binary failed!\n";
- LogError("Failed to create ELF binary image!");
- return false;
- }
- return true;
-}
+ if (!sourceFileName_.empty()) {
+ amd::Os::unlink(sourceFileName_.c_str());
+ }
-const aclTargetInfo &
-Program::info(const char * str) {
- acl_error err = ACL_SUCCESS;
- info_ = aclGetTargetInfo(LP64_SWITCH("x86", "x86-64"), ( str && str[0] == '\0' ? "Generic" : str ), &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclGetTargetInfo failed");
- }
- return info_;
-}
-
-Program::~Program()
-{
- if(getJITBinary() != NULL) {
- aclJITObjectImageDestroy(compiler(), getJITBinary());
- }
-
- if (!sourceFileName_.empty()) {
- amd::Os::unlink(sourceFileName_.c_str());
- }
-
- if (handle_ != NULL) {
- amd::Os::unloadLibrary(handle_);
- amd::Os::unlink(dllFileName_);
- char dllName[256];
+ if (handle_ != NULL) {
+ amd::Os::unloadLibrary(handle_);
+ amd::Os::unlink(dllFileName_);
+ char dllName[256];
#ifdef _WIN32
- memcpy(dllName, dllFileName_.data(), dllFileName_.size());
- char* tempName = strrchr(dllName, '.');
- if (tempName != NULL) {
- *tempName = '\0';
- amd::Os::unlink(dllName);
- }
-#endif // _WIN32
+ memcpy(dllName, dllFileName_.data(), dllFileName_.size());
+ char* tempName = strrchr(dllName, '.');
+ if (tempName != NULL) {
+ *tempName = '\0';
+ amd::Os::unlink(dllName);
}
+#endif // _WIN32
+ }
#if defined(WITH_ONLINE_COMPILER)
- releaseClBinary();
+ releaseClBinary();
#endif
}
-} // namespace cpu
+} // namespace cpu
diff --git a/rocclr/runtime/device/cpu/cpuprogram.hpp b/rocclr/runtime/device/cpu/cpuprogram.hpp
index 47fec428ba..908956617a 100644
--- a/rocclr/runtime/device/cpu/cpuprogram.hpp
+++ b/rocclr/runtime/device/cpu/cpuprogram.hpp
@@ -14,106 +14,94 @@
namespace amd {
namespace option {
class Options;
-} // option
-} // amd
+} // option
+} // amd
//! \namespace cpu CPU Device Implementation
namespace cpu {
//! \class CPU program
-class Program : public device::Program
-{
-private:
- aclJITObjectImage JITBinary;
- std::string sourceFileName_; //!< The source image.
- void* handle_; // @todo: remove me
+class Program : public device::Program {
+ private:
+ aclJITObjectImage JITBinary;
+ std::string sourceFileName_; //!< The source image.
+ void* handle_; // @todo: remove me
-public:
- //! Default constructor
- Program(Device& cpuDev)
- : device::Program(cpuDev), JITBinary(NULL), handle_(NULL) {}
+ public:
+ //! Default constructor
+ Program(Device& cpuDev) : device::Program(cpuDev), JITBinary(NULL), handle_(NULL) {}
- //! Default destructor
- ~Program();
+ //! Default destructor
+ ~Program();
- //! pre-compile setup for CPU
- virtual bool initBuild(amd::option::Options* options);
+ //! pre-compile setup for CPU
+ virtual bool initBuild(amd::option::Options* options);
- //! post-compile setup for CPU
- virtual bool finiBuild(bool isBuildGood);
+ //! post-compile setup for CPU
+ virtual bool finiBuild(bool isBuildGood);
- //! Compiles CPU program
- virtual bool compileImpl(
- const std::string& sourceCode,
- const std::vector& headers,
- const char** headerIncludeNames,
- amd::option::Options* options );
+ //! Compiles CPU program
+ virtual bool compileImpl(const std::string& sourceCode,
+ const std::vector& headers,
+ const char** headerIncludeNames, amd::option::Options* options);
- //! Links CPU program
- virtual bool linkImpl(amd::option::Options* options = NULL);
+ //! Links CPU program
+ virtual bool linkImpl(amd::option::Options* options = NULL);
- //! Links CPU programs
- virtual bool linkImpl(
- const std::vector& inputPrograms,
- amd::option::Options* options = NULL,
- bool createLibrary = false);
+ //! Links CPU programs
+ virtual bool linkImpl(const std::vector& inputPrograms,
+ amd::option::Options* options = NULL, bool createLibrary = false);
- virtual bool createBinary(amd::option::Options* options);
+ virtual bool createBinary(amd::option::Options* options);
- //! Returns the device object, associated with this program.
- const Device& device() {
- return static_cast(device::Program::device());
- }
+ //! Returns the device object, associated with this program.
+ const Device& device() { return static_cast(device::Program::device()); }
- /*! \brief Invokes the LLC compiler for the LLVM binary compilation
- * to x86 ASM text source code and ISA binary
- *
- * \return True if we successefully compiled a CPU program
- */
- bool compileBinaryToISA(
- amd::option::Options* options //!< options for compilation
- );
+ /*! \brief Invokes the LLC compiler for the LLVM binary compilation
+ * to x86 ASM text source code and ISA binary
+ *
+ * \return True if we successefully compiled a CPU program
+ */
+ bool compileBinaryToISA(amd::option::Options* options //!< options for compilation
+ );
- //! Load the library into memory
- bool loadDllCode(amd::option::Options* options, bool addElfSymbols=false);
+ //! Load the library into memory
+ bool loadDllCode(amd::option::Options* options, bool addElfSymbols = false);
- //! Initialize binary for CPU
- virtual bool initClBinary();
+ //! Initialize binary for CPU
+ virtual bool initClBinary();
- //! Release binary for CPU
- virtual void releaseClBinary();
+ //! Release binary for CPU
+ virtual void releaseClBinary();
- ClBinary* clBinary() {
- return static_cast(device::Program::clBinary());
- }
- const ClBinary* clBinary() const {
- return static_cast(device::Program::clBinary());
- }
+ ClBinary* clBinary() { return static_cast(device::Program::clBinary()); }
+ const ClBinary* clBinary() const {
+ return static_cast(device::Program::clBinary());
+ }
- aclJITObjectImage getJITBinary() { return this->JITBinary; }
- void setJITBinary(aclJITObjectImage JITBinary) { this->JITBinary = JITBinary; }
+ aclJITObjectImage getJITBinary() { return this->JITBinary; }
+ void setJITBinary(aclJITObjectImage JITBinary) { this->JITBinary = JITBinary; }
- //! Returns the pointer to the Compiler struct
- //! Became public (prev. private) due to use in cpubinary for aclJIT functionality
- aclCompiler* compiler() { return static_cast(device()).compiler(); }
+ //! Returns the pointer to the Compiler struct
+ //! Became public (prev. private) due to use in cpubinary for aclJIT functionality
+ aclCompiler* compiler() { return static_cast(device()).compiler(); }
-private:
+ private:
+ //! Disable default copy constructor
+ Program(const Program&);
- //! Disable default copy constructor
- Program(const Program&);
+ //! Disable operator=
+ Program& operator=(const Program&);
- //! Disable operator=
- Program& operator=(const Program&);
+ std::string dllFileName_; //!< File name of the dll with kernels
+ protected:
+ virtual bool isElf(const char* bin) const {
+ return amd::isElfHeader(bin, LP64_SWITCH(ELFCLASS32, ELFCLASS64));
+ }
- std::string dllFileName_; //!< File name of the dll with kernels
-protected:
- virtual bool isElf(const char* bin) const {
- return amd::isElfHeader(bin, LP64_SWITCH(ELFCLASS32, ELFCLASS64));
- }
-
- virtual const aclTargetInfo & info(const char * str = "");
+ virtual const aclTargetInfo& info(const char* str = "");
};
-} // namespace cpu
+} // namespace cpu
-#endif // CPUPROGRAM_HPP_
+#endif // CPUPROGRAM_HPP_
diff --git a/rocclr/runtime/device/cpu/cpusettings.cpp b/rocclr/runtime/device/cpu/cpusettings.cpp
index da4fb15344..1389f235a9 100644
--- a/rocclr/runtime/device/cpu/cpusettings.cpp
+++ b/rocclr/runtime/device/cpu/cpusettings.cpp
@@ -7,99 +7,92 @@
namespace cpu {
-bool
-Settings::create()
-{
- // This code is temporary until cl_khr_fp64 is unconditional
- if (flagIsDefault(CL_KHR_FP64) || CL_KHR_FP64) {
- enableExtension(ClKhrFp64);
- }
+bool Settings::create() {
+ // This code is temporary until cl_khr_fp64 is unconditional
+ if (flagIsDefault(CL_KHR_FP64) || CL_KHR_FP64) {
+ enableExtension(ClKhrFp64);
+ }
- enableExtension(ClAmdFp64);
- enableExtension(ClKhrGlobalInt32BaseAtomics);
- enableExtension(ClKhrGlobalInt32ExtendedAtomics);
- enableExtension(ClKhrLocalInt32BaseAtomics);
- enableExtension(ClKhrLocalInt32ExtendedAtomics);
+ enableExtension(ClAmdFp64);
+ enableExtension(ClKhrGlobalInt32BaseAtomics);
+ enableExtension(ClKhrGlobalInt32ExtendedAtomics);
+ enableExtension(ClKhrLocalInt32BaseAtomics);
+ enableExtension(ClKhrLocalInt32ExtendedAtomics);
#ifdef _LP64
- enableExtension(ClKhrInt64BaseAtomics);
- enableExtension(ClKhrInt64ExtendedAtomics);
-#endif // _LP64
- enableExtension(ClKhrByteAddressableStore);
- enableExtension(ClKhrGlSharing);
- enableExtension(ClKhrGlEvent);
- enableExtension(ClExtDeviceFission);
- enableExtension(ClAmdDeviceAttributeQuery);
- enableExtension(ClAmdVec3);
- enableExtension(ClAmdMediaOps);
- enableExtension(ClAmdMediaOps2);
- enableExtension(ClAmdPopcnt);
- enableExtension(ClAmdPrintf);
+ enableExtension(ClKhrInt64BaseAtomics);
+ enableExtension(ClKhrInt64ExtendedAtomics);
+#endif // _LP64
+ enableExtension(ClKhrByteAddressableStore);
+ enableExtension(ClKhrGlSharing);
+ enableExtension(ClKhrGlEvent);
+ enableExtension(ClExtDeviceFission);
+ enableExtension(ClAmdDeviceAttributeQuery);
+ enableExtension(ClAmdVec3);
+ enableExtension(ClAmdMediaOps);
+ enableExtension(ClAmdMediaOps2);
+ enableExtension(ClAmdPopcnt);
+ enableExtension(ClAmdPrintf);
- // enableExtension(ClKhrSelectFpRoundingMode);
- enableExtension(ClKhr3DImageWrites);
+ // enableExtension(ClKhrSelectFpRoundingMode);
+ enableExtension(ClKhr3DImageWrites);
- // enableExtension(ClKhrFp16);
+// enableExtension(ClKhrFp16);
#if defined(_WIN32)
- enableExtension(ClKhrD3d10Sharing);
-#endif // _WIN32
- enableExtension(ClKhrSpir);
- // ToDo: enable this after conformance test is updated to accept it
- // enableExtension(ClKhrIlProgram);
+ enableExtension(ClKhrD3d10Sharing);
+#endif // _WIN32
+ enableExtension(ClKhrSpir);
+ // ToDo: enable this after conformance test is updated to accept it
+ // enableExtension(ClKhrIlProgram);
- // Enable some OpenCL 2.0 extensions
- if ((OPENCL_MAJOR >= 2) && (CPU_OPENCL_VERSION >= 200)) {
- partialDispatch_ = true;
- enableExtension(ClKhrSubGroups);
- supportDepthsRGB_ = true;
- enableExtension(ClKhrDepthImages);
- }
+ // Enable some OpenCL 2.0 extensions
+ if ((OPENCL_MAJOR >= 2) && (CPU_OPENCL_VERSION >= 200)) {
+ partialDispatch_ = true;
+ enableExtension(ClKhrSubGroups);
+ supportDepthsRGB_ = true;
+ enableExtension(ClKhrDepthImages);
+ }
- // Map CPUID feature bits to our own feature bits
- const int sse2_features = CPUFEAT_DX_SSE | CPUFEAT_DX_SSE2;
- const int avx_features = CPUFEAT_CX_SSE3 | CPUFEAT_CX_SSSE3 |
- CPUFEAT_CX_SSE4_1 | CPUFEAT_CX_SSE4_2 |
- CPUFEAT_CX_POPCNT | CPUFEAT_CX_AVX |
- CPUFEAT_CX_OSXSAVE;
- const int fma3_features = INTEL_CPUFEAT_CX_FMA3;
- const int fma4_features = AMD_CPUFEAT_CX_FMA4 | AMD_CPUFEAT_CX_XOP;
- int regs[4];
+ // Map CPUID feature bits to our own feature bits
+ const int sse2_features = CPUFEAT_DX_SSE | CPUFEAT_DX_SSE2;
+ const int avx_features = CPUFEAT_CX_SSE3 | CPUFEAT_CX_SSSE3 | CPUFEAT_CX_SSE4_1 |
+ CPUFEAT_CX_SSE4_2 | CPUFEAT_CX_POPCNT | CPUFEAT_CX_AVX | CPUFEAT_CX_OSXSAVE;
+ const int fma3_features = INTEL_CPUFEAT_CX_FMA3;
+ const int fma4_features = AMD_CPUFEAT_CX_FMA4 | AMD_CPUFEAT_CX_XOP;
+ int regs[4];
#if defined(ATI_ARCH_X86)
- amd::Os::cpuid(regs, 0x0);
- bool isAmd = regs[1] == ('A' | ('u' << 8) | ('t' << 16) | ('h' << 24));
- bool isIntel = regs[1] == ('G' | ('e' << 8) | ('n' << 16) | ('u' << 24));
+ amd::Os::cpuid(regs, 0x0);
+ bool isAmd = regs[1] == ('A' | ('u' << 8) | ('t' << 16) | ('h' << 24));
+ bool isIntel = regs[1] == ('G' | ('e' << 8) | ('n' << 16) | ('u' << 24));
- amd::Os::cpuid(regs, 0x1);
+ amd::Os::cpuid(regs, 0x1);
- cpuFeatures_ = (regs[3] & sse2_features) == sse2_features ?
- SSE2Instructions : 0;
+ cpuFeatures_ = (regs[3] & sse2_features) == sse2_features ? SSE2Instructions : 0;
- if ((regs[2] & avx_features) == avx_features) {
- // Check for state support
- uint64_t xcr0 = amd::Os::xgetbv(0);
+ if ((regs[2] & avx_features) == avx_features) {
+ // Check for state support
+ uint64_t xcr0 = amd::Os::xgetbv(0);
- // Check for SSE and YMM bits (1 and 2)
- if (((uint32_t)xcr0 & 0x6U) == 0x6U) {
- cpuFeatures_ |= AVXInstructions;
+ // Check for SSE and YMM bits (1 and 2)
+ if (((uint32_t)xcr0 & 0x6U) == 0x6U) {
+ cpuFeatures_ |= AVXInstructions;
- // Now check for FMA and XOP
- if (isIntel) {
- cpuFeatures_ |= (regs[2] & fma3_features) == fma3_features ?
- FMA3Instructions : 0;
- }
+ // Now check for FMA and XOP
+ if (isIntel) {
+ cpuFeatures_ |= (regs[2] & fma3_features) == fma3_features ? FMA3Instructions : 0;
+ }
- if (isAmd) {
- amd::Os::cpuid(regs, 0x80000001);
- cpuFeatures_ |= (regs[2] & fma4_features) == fma4_features ?
- FMA4Instructions : 0;
- }
- }
+ if (isAmd) {
+ amd::Os::cpuid(regs, 0x80000001);
+ cpuFeatures_ |= (regs[2] & fma4_features) == fma4_features ? FMA4Instructions : 0;
+ }
}
-#endif // ATI_ARCH_X86
+ }
+#endif // ATI_ARCH_X86
- return true;
+ return true;
}
-} // namespace cpu
+} // namespace cpu
diff --git a/rocclr/runtime/device/cpu/cpusettings.hpp b/rocclr/runtime/device/cpu/cpusettings.hpp
index 6f15780c2d..a5958d8900 100644
--- a/rocclr/runtime/device/cpu/cpusettings.hpp
+++ b/rocclr/runtime/device/cpu/cpusettings.hpp
@@ -13,32 +13,31 @@
namespace cpu {
//! Device settings
-class Settings : public device::Settings
-{
-public:
- enum CpuFeatures {
- SSE2Instructions = 0x01,
- AVXInstructions = 0x02, // Processor reports SSSE3, SSE4_1, SSE4_2
- // POPCNT and AVX
- FMA3Instructions = 0x04, // Intel processor reports FMA3
- FMA4Instructions = 0x08 // AMD processor reports FMA4 and XOP
- };
- uint32_t cpuFeatures_; //!< CPU features
+class Settings : public device::Settings {
+ public:
+ enum CpuFeatures {
+ SSE2Instructions = 0x01,
+ AVXInstructions = 0x02, // Processor reports SSSE3, SSE4_1, SSE4_2
+ // POPCNT and AVX
+ FMA3Instructions = 0x04, // Intel processor reports FMA3
+ FMA4Instructions = 0x08 // AMD processor reports FMA4 and XOP
+ };
+ uint32_t cpuFeatures_; //!< CPU features
- //! Default constructor
- Settings() { cpuFeatures_ = 0; }
+ //! Default constructor
+ Settings() { cpuFeatures_ = 0; }
- //! Creates settings
- bool create();
+ //! Creates settings
+ bool create();
-private:
- //! Disable copy constructor
- Settings(const Settings&);
+ private:
+ //! Disable copy constructor
+ Settings(const Settings&);
- //! Disable assignment
- Settings& operator=(const Settings&);
+ //! Disable assignment
+ Settings& operator=(const Settings&);
};
-} // namespace cpu
+} // namespace cpu
-#endif // CPUSETTINGS_HPP_
+#endif // CPUSETTINGS_HPP_
diff --git a/rocclr/runtime/device/cpu/cputables.hpp b/rocclr/runtime/device/cpu/cputables.hpp
index 3e98d24878..31f02a489a 100644
--- a/rocclr/runtime/device/cpu/cputables.hpp
+++ b/rocclr/runtime/device/cpu/cputables.hpp
@@ -3,2013 +3,1008 @@
#define TABLES_HPP_
static const uint32_t __ALIGNED__(32) cpuTables[8024] = {
- 0x00000000, 0x3faff55b, 0xbd38db2c, 0x3e56e59f,
- 0x00000000, 0x3fb0f99e, 0x54dedf96, 0x3e64e3aa,
- 0x00000000, 0x3fb1f86d, 0xab1bda88, 0x3e67e105,
- 0x00000000, 0x3fb2f719, 0x4d013fd0, 0x3e48c525,
- 0x00000000, 0x3fb3f59f, 0x3ad62670, 0x3e2cf8ab,
- 0x00000000, 0x3fb4f3fd, 0xbec80468, 0x3e59dca4,
- 0x00000000, 0x3fb5f232, 0xec98a8da, 0x3e53f4b5,
- 0x00000000, 0x3fb6f03b, 0x619d81fe, 0x3e6b9d49,
- 0x00000000, 0x3fb7ee18, 0x87460934, 0x3e430178,
- 0x00000000, 0x3fb8ebc5, 0xca0b9944, 0x3e511e3e,
- 0x00000000, 0x3fb9e941, 0x3c5a332e, 0x3e54f3f7,
- 0x00000000, 0x3fbae68a, 0xae0e00a6, 0x3e5c71c8,
- 0x00000000, 0x3fbbe39e, 0xf86fbdc7, 0x3e67cde0,
- 0x00000000, 0x3fbce07c, 0x8c889c72, 0x3e570f32,
- 0x00000000, 0x3fbddd21, 0x9b994efe, 0x3e5c07ae,
- 0x00000000, 0x3fbed98c, 0x1d7b1698, 0x3e40c802,
- 0x00000000, 0x3fbfd5ba, 0xedb8cb22, 0x3e635585,
- 0x00000000, 0x3fc068d5, 0x67b30e96, 0x3e708425,
- 0x00000000, 0x3fc0e6ad, 0x1031472e, 0x3e799e81,
- 0x00000000, 0x3fc16465, 0x1416bcee, 0x3e604182,
- 0x00000000, 0x3fc1e1fa, 0xe4dc96f4, 0x3e7f6086,
- 0x00000000, 0x3fc25f6e, 0x5c5f1b58, 0x3e471a53,
- 0x00000000, 0x3fc2dcbd, 0x3fe63ca1, 0x3e765f74,
- 0x00000000, 0x3fc359e8, 0x3472d014, 0x3e7dbd73,
- 0x00000000, 0x3fc3d6ee, 0x4d8b0d1d, 0x3e7d18cc,
- 0x00000000, 0x3fc453ce, 0x53c8fb29, 0x3e78c125,
- 0x00000000, 0x3fc4d087, 0xe2e8f991, 0x3e753b49,
- 0x00000000, 0x3fc54d18, 0xe148c141, 0x3e77422a,
- 0x00000000, 0x3fc5c981, 0x69df56a8, 0x3e4e3ec2,
- 0x00000000, 0x3fc645bf, 0x4e7e0ac9, 0x3e7ff675,
- 0x00000000, 0x3fc6c1d4, 0x7b1b5aad, 0x3e713126,
- 0x00000000, 0x3fc73dbd, 0x403a94bc, 0x3e7d14fa,
- 0x00000000, 0x3fc7b97b, 0xc089a3d8, 0x3e62f396,
- 0x00000000, 0x3fc8350b, 0x78fa95bb, 0x3e7c731d,
- 0x00000000, 0x3fc8b06e, 0x85177399, 0x3e7c50f3,
- 0x00000000, 0x3fc92ba3, 0x9c6f2c20, 0x3e6f4140,
- 0x00000000, 0x3fc9a6a8, 0xc4c39ec0, 0x3e7d2d90,
- 0x00000000, 0x3fca217e, 0x696f2106, 0x3e680420,
- 0x00000000, 0x3fca9c23, 0x7943a2e8, 0x3e4b4032,
- 0x00000000, 0x3fcb1696, 0x02f3d2a2, 0x3e65d35e,
- 0x00000000, 0x3fcb90d7, 0x288117b0, 0x3e64a498,
- 0x00000000, 0x3fcc0ae5, 0x19afb324, 0x3e635da1,
- 0x00000000, 0x3fcc84bf, 0xcdb9a908, 0x3e714e85,
- 0x00000000, 0x3fccfe65, 0xe5547b9a, 0x3e638754,
- 0x00000000, 0x3fcd77d5, 0xe6ce3246, 0x3e7be40a,
- 0x00000000, 0x3fcdf110, 0xb3bea7e7, 0x3e70c993,
- 0x00000000, 0x3fce6a14, 0x89ac3359, 0x3e71d2dd,
- 0x00000000, 0x3fcee2e1, 0x03332c46, 0x3e614766,
- 0x00000000, 0x3fcf5b75, 0x1bac55b7, 0x3e7f2590,
- 0x00000000, 0x3fcfd3d1, 0x7c826e28, 0x3e7f881b,
- 0x00000000, 0x3fd025fa, 0x6d698d20, 0x3e744199,
- 0x00000000, 0x3fd061ee, 0x521ea089, 0x3e8407ac,
- 0x00000000, 0x3fd09dc5, 0x6c4b1723, 0x3e82fb0c,
- 0x00000000, 0x3fd0d97e, 0x966a3e18, 0x3e8ca135,
- 0x00000000, 0x3fd1151a, 0xe4d646e4, 0x3e6b1218,
- 0x00000000, 0x3fd15097, 0xa350d288, 0x3e6d4e72,
- 0x00000000, 0x3fd18bf5, 0x2f04c329, 0x3e84617e,
- 0x00000000, 0x3fd1c735, 0x41e82650, 0x3e6096ec,
- 0x00000000, 0x3fd20255, 0x25773e6e, 0x3e79f91f,
- 0x00000000, 0x3fd23d56, 0x20f1d674, 0x3e659c08,
- 0x00000000, 0x3fd27837, 0xa2df1064, 0x3e602bf7,
- 0x00000000, 0x3fd2b2f7, 0xfc40508f, 0x3e8fb36b,
- 0x00000000, 0x3fd2ed98, 0x3f8dc892, 0x3e7ea08f,
- 0x00000000, 0x3fd32818, 0x54656a0e, 0x3e73ed62,
- 0x00000000, 0x3fd36277, 0xe5e69c58, 0x3e6b83f5,
- 0x00000000, 0x3fd39cb4, 0xaf768592, 0x3e8d6ec2,
- 0x00000000, 0x3fd3d6d1, 0x9a226f94, 0x3e649388,
- 0x00000000, 0x3fd410cb, 0xa65279ba, 0x3e85ad8f,
- 0x00000000, 0x3fd44aa4, 0x84d45434, 0x3e6b6157,
- 0x00000000, 0x3fd4845a, 0x4368f145, 0x3e809a18,
- 0x00000000, 0x3fd4bdee, 0x39b0d91c, 0x3e761a24,
- 0x00000000, 0x3fd4f75f, 0x5e39a978, 0x3e7ce1a6,
- 0x00000000, 0x3fd530ad, 0xa93b6a66, 0x3e832a39,
- 0x00000000, 0x3fd569d8, 0x9af804e7, 0x3e81c369,
- 0x00000000, 0x3fd5a2e0, 0x4e44ede8, 0x3e575e0f,
- 0x00000000, 0x3fd5dbc3, 0xd1a7a83b, 0x3e8f77ce,
- 0x00000000, 0x3fd61484, 0x0cb1b500, 0x3e284e7f,
- 0x00000000, 0x3fd64d1f, 0x38b02dfe, 0x3e8ec6b8,
- 0x00000000, 0x3fd68597, 0xdfbeda87, 0x3e83ebf4,
- 0x00000000, 0x3fd6bdea, 0xed9cb475, 0x3e89397a,
- 0x00000000, 0x3fd6f619, 0xbc239c54, 0x3e707937,
- 0x00000000, 0x3fd72e22, 0x553131b6, 0x3e8aa754,
- 0x00000000, 0x3fd76607, 0x407c45dc, 0x3e74a05d,
- 0x00000000, 0x3fd79dc6, 0x1a206dd0, 0x3e813223,
- 0x00000000, 0x3fd7d560, 0xfdd69c88, 0x3e72d8ec,
- 0x00000000, 0x3fd80cd4, 0x74218606, 0x3e7a852c,
- 0x00000000, 0x3fd84422, 0xbaeebb50, 0x3e871bf2,
- 0x00000000, 0x3fd87b4b, 0xb7491820, 0x3e483d7d,
- 0x00000000, 0x3fd8b24d, 0x92b6da14, 0x3e6ca50d,
- 0x00000000, 0x3fd8e929, 0xe8530298, 0x3e56f5cd,
- 0x00000000, 0x3fd91fde, 0x98910740, 0x3e7f3431,
- 0x00000000, 0x3fd9566d, 0x41ccd80a, 0x3e70e8d2,
- 0x00000000, 0x3fd98cd5, 0xc619e6c8, 0x3e71535a,
- 0x00000000, 0x3fd9c316, 0x41c36cd2, 0x3e773160,
- 0x00000000, 0x3fd9f930, 0x00637d8e, 0x3e7985a0,
- 0x00000000, 0x3fda2f23, 0x858c0a68, 0x3e6f2f29,
- 0x00000000, 0x3fda64ee, 0x7f96d909, 0x3e887984,
- 0x00000000, 0x3fda9a92, 0x19e12e42, 0x3e8ab3d3,
- 0x00000000, 0x3fdad00f, 0x62dfc4c2, 0x3e750881,
- 0x00000000, 0x3fdb0564, 0xa1cd9d8c, 0x3e605749,
- 0x00000000, 0x3fdb3a91, 0x6c6b8618, 0x3e5da65c,
- 0x00000000, 0x3fdb6f96, 0x7df1ad64, 0x3e6739bf,
- 0x00000000, 0x3fdba473, 0x52aa3340, 0x3e6bc312,
- 0x00000000, 0x3fdbd928, 0x91ad3aa8, 0x3e5e5281,
- 0x00000000, 0x3fdc0db4, 0x3df19f18, 0x3e8929d9,
- 0x00000000, 0x3fdc4219, 0xb693a080, 0x3e5ff11e,
- 0x00000000, 0x3fdc7655, 0xf145a3a0, 0x3e455ae3,
- 0x00000000, 0x3fdcaa68, 0xc6c0ca82, 0x3e7cbcd8,
- 0x00000000, 0x3fdcde53, 0xd425d304, 0x3e70cb04,
- 0x00000000, 0x3fdd1215, 0xab5be678, 0x3e79adfc,
- 0x00000000, 0x3fdd45ae, 0xc5662508, 0x3e893d90,
- 0x00000000, 0x3fdd791f, 0xbd35ff40, 0x3e768489,
- 0x00000000, 0x3fddac67, 0x3da2b7e0, 0x3e3586ed,
- 0x00000000, 0x3fdddf85, 0x2e850eee, 0x3e87604d,
- 0x00000000, 0x3fde127b, 0x2bfb53d8, 0x3e7ac1d1,
- 0x00000000, 0x3fde4548, 0x68274740, 0x3e39b3d4,
- 0x00000000, 0x3fde77eb, 0x8d10e53c, 0x3e7fc5d6,
- 0x00000000, 0x3fdeaa65, 0x1884becb, 0x3e88f9e5,
- 0x00000000, 0x3fdedcb6, 0x869c06d1, 0x3e8a87f0,
- 0x00000000, 0x3fdf0ede, 0x79f685fa, 0x3e831e72,
- 0x00000000, 0x3fdf40dd, 0x2f9719b0, 0x3e46a828,
- 0x00000000, 0x3fdf72b2, 0x4a8a44e0, 0x3e60d272,
- 0x00000000, 0x3fdfa45d, 0x4b11ad4e, 0x3e8a6052,
- 0x00000000, 0x3fdfd5e0, 0x832750f0, 0x3e575fdf,
- 0x00000000, 0x3fe0039c, 0x02e4cd36, 0x3e8cf069,
- 0x00000000, 0x3fe01c34, 0x2d4f6d10, 0x3e6e8242,
- 0x00000000, 0x3fe034b7, 0x1063e6c0, 0x3e524a09,
- 0x00000000, 0x3fe04d25, 0x72dc6f38, 0x3e78a1a1,
- 0x00000000, 0x3fe0657e, 0x19f8a92d, 0x3e929b66,
- 0x00000000, 0x3fe07dc3, 0x9c1b70c8, 0x3e79274d,
- 0x00000000, 0x3fe095f3, 0x1fbb7930, 0x3e50c34b,
- 0x00000000, 0x3fe0ae0e, 0x6c20eb50, 0x3e663986,
- 0x00000000, 0x3fe0c614, 0xf6832e9e, 0x3e86d6d0,
- 0x00000000, 0x3fe0de05, 0xef99f25e, 0x3e9af54d,
- 0x00000000, 0x3fe0f5e2, 0x52a00262, 0x3e916cfc,
- 0x00000000, 0x3fe10daa, 0x83569c32, 0x3e8dcc1e,
- 0x00000000, 0x3fe1255d, 0x551ed425, 0x3e937f7a,
- 0x00000000, 0x3fe13cfb, 0xadc98887, 0x3e9f6360,
- 0x00000000, 0x3fe15485, 0x8d35a2c1, 0x3e92c6ec,
- 0x00000000, 0x3fe16bfa, 0xf84cb036, 0x3e8bd44d,
- 0x00000000, 0x3fe1835a, 0x826e310e, 0x3e9117cf,
- 0x00000000, 0x3fe19aa5, 0xf332cfc9, 0x3e9ca533,
- 0x00000000, 0x3fe1b1dc, 0x509dbc2e, 0x3e90f208,
- 0x00000000, 0x3fe1c8fe, 0x93c945de, 0x3e8cd07d,
- 0x00000000, 0x3fe1e00b, 0xd67e6d72, 0x3e957bdf,
- 0x00000000, 0x3fe1f704, 0xc516c658, 0x3e7aab89,
- 0x00000000, 0x3fe20de8, 0xb1a1b8a0, 0x3e63e823,
- 0x00000000, 0x3fe224b7, 0x4a9d6d3c, 0x3e830746,
- 0x00000000, 0x3fe23b71, 0xcd438843, 0x3e9c5993,
- 0x00000000, 0x3fe25217, 0xa02ab554, 0x3e9ba2fc,
- 0x00000000, 0x3fe268a9, 0x6983a268, 0x3e801a5b,
- 0x00000000, 0x3fe27f26, 0xb350efc8, 0x3e6273d1,
- 0x00000000, 0x3fe2958e, 0x8c37b0c6, 0x3e864c23,
- 0x00000000, 0x3fe2abe2, 0x7370a300, 0x3e6aded0,
- 0x00000000, 0x3fe2c221, 0x197eb47e, 0x3e878091,
- 0x00000000, 0x3fe2d84c, 0x45e0dabc, 0x3e74b0f2,
- 0x00000000, 0x3fe2ee62, 0x794e2eaf, 0x3e9080d9,
- 0x00000000, 0x3fe30464, 0x42b60c76, 0x3e8d4ec2,
- 0x00000000, 0x3fe31a52, 0xf940caa0, 0x3e4221d2,
- 0x00000000, 0x3fe3302b, 0x2b2bba5c, 0x3e7cdbc4,
- 0x00000000, 0x3fe345f0, 0xbb440840, 0x3e6cce37,
- 0x00000000, 0x3fe35ba0, 0x99cf1dd0, 0x3e96c1d9,
- 0x00000000, 0x3fe3713d, 0x07eb0870, 0x3e5bed8a,
- 0x00000000, 0x3fe386c5, 0x8f490e3c, 0x3e769ed8,
- 0x00000000, 0x3fe39c39, 0x19b73ef0, 0x3e6cd417,
- 0x00000000, 0x3fe3b198, 0xc95b41b7, 0x3e9cbc4a,
- 0x00000000, 0x3fe3c6e4, 0xb890f5d7, 0x3e9238f1,
- 0x00000000, 0x3fe3dc1c, 0x82259cc4, 0x3e750c42,
- 0x00000000, 0x3fe3f13f, 0xde87b3e2, 0x3e9713d2,
- 0x00000000, 0x3fe4064f, 0xd2255276, 0x3e81d5a7,
- 0x00000000, 0x3fe41b4a, 0x48227ac1, 0x3e9c0dfd,
- 0x00000000, 0x3fe43032, 0xdab76753, 0x3e91c964,
- 0x00000000, 0x3fe44506, 0xd5704496, 0x3e86de56,
- 0x00000000, 0x3fe459c6, 0x1fd19968, 0x3e84aeb7,
- 0x00000000, 0x3fe46e72, 0xc57b1918, 0x3e8fbf91,
- 0x00000000, 0x3fe4830a, 0x7fbe5d9a, 0x3e9d6bef,
- 0x00000000, 0x3fe4978f, 0xdc249066, 0x3e9464d3,
- 0x00000000, 0x3fe4ac00, 0xec4d9073, 0x3e9638e2,
- 0x00000000, 0x3fe4c05e, 0x7247ea7c, 0x3e716f4a,
- 0x00000000, 0x3fe4d4a8, 0x40f1d440, 0x3e31a0a7,
- 0x00000000, 0x3fe4e8de, 0x0114a33c, 0x3e86edbb,
- 0x00000000, 0x3fe4fd01, 0xbf1d513c, 0x3e7dbee8,
- 0x00000000, 0x3fe51110, 0xb0248f73, 0x3e95b8bd,
- 0x00000000, 0x3fe5250c, 0x3f5eac64, 0x3e97de3d,
- 0x00000000, 0x3fe538f5, 0x87ae448a, 0x3e8ee241,
- 0x00000000, 0x3fe54cca, 0x91ec5192, 0x3e9e06c5,
- 0x00000000, 0x3fe5608d, 0x1a332738, 0x3e74e386,
- 0x00000000, 0x3fe5743c, 0xdcc2bfe4, 0x3e7a9599,
- 0x00000000, 0x3fe587d8, 0xbad43468, 0x3e6f732f,
- 0x00000000, 0x3fe59b60, 0x73b727d9, 0x3e9eb9f5,
- 0x00000000, 0x3fe5aed6, 0xa2eb9897, 0x3e98b212,
- 0x00000000, 0x3fe5c239, 0x4c167215, 0x3e938488,
- 0x00000000, 0x3fe5d589, 0x63020051, 0x3e90e2d3,
- 0x00000000, 0x3fe5e8c6, 0x79fbd022, 0x3e928208,
- 0x00000000, 0x3fe5fbf0, 0x893e4b30, 0x3e9a1ab9,
- 0x00000000, 0x3fe60f08, 0x17a24478, 0x3e82d1b8,
- 0x00000000, 0x3fe6220d, 0x8ded4878, 0x3e615d7b,
- 0x00000000, 0x3fe634ff, 0x9db3a5e4, 0x3e78968f,
- 0x00000000, 0x3fe647de, 0x71fe135f, 0x3e971c41,
- 0x00000000, 0x3fe65aab, 0x605d0d8c, 0x3e96d80f,
- 0x00000000, 0x3fe66d66, 0x43691590, 0x3e7c91f0,
- 0x00000000, 0x3fe6800e, 0x15fce2b2, 0x3e839f8a,
- 0x00000000, 0x3fe692a4, 0xa9d94b80, 0x3e455bed,
- 0x00000000, 0x3fe6a527, 0x5d60949a, 0x3e8b12c1,
- 0x00000000, 0x3fe6b798, 0xb312bfe3, 0x3e924167,
- 0x00000000, 0x3fe6c9f7, 0x33070277, 0x3e90ab86,
- 0x00000000, 0x3fe6dc44, 0xebbc80ee, 0x3e854554,
- 0x00000000, 0x3fe6ee7f, 0xef5a4bb8, 0x3e60204a,
- 0x00000000, 0x3fe700a7, 0xc679cf2c, 0x3e98af08,
- 0x00000000, 0x3fe712be, 0x330ae6c8, 0x3e90852a,
- 0x00000000, 0x3fe724c3, 0x9ec32916, 0x3e86d3eb,
- 0x00000000, 0x3fe736b6, 0x7fcbbafe, 0x3e8685cb,
- 0x00000000, 0x3fe74897, 0xc1e0bd95, 0x3e91f751,
- 0x00000000, 0x3fe75a67, 0xb0f72560, 0x3e5705b1,
- 0x00000000, 0x3fe76c24, 0xd808ca92, 0x3e9b98d8,
- 0x00000000, 0x3fe77dd1, 0xc75cc980, 0x3e62ea22,
- 0x00000000, 0x3fe78f6b, 0x2bca0350, 0x3e97aba6,
- 0x00000000, 0x3fe7a0f4, 0x3442278c, 0x3e9d7383,
- 0x00000000, 0x3fe7b26c, 0x1fb18bf9, 0x3e95a5ca,
- 0x00000000, 0x3fe7c3d3, 0x2b6ecf28, 0x3e61a609,
- 0x00000000, 0x3fe7d528, 0x49aac104, 0x3e744fd0,
- 0x00000000, 0x3fe7e66c, 0xd8df5180, 0x3e2c114f,
- 0x00000000, 0x3fe7f79e, 0x130feae5, 0x3e95972f,
- 0x00000000, 0x3fe808c0, 0xa55fe198, 0x3e7ca034,
- 0x00000000, 0x3fe819d0, 0x49990227, 0x3e96e2b1,
- 0x00000000, 0x3fe82ad0, 0x0294592c, 0x3e7b0000,
- 0x00000000, 0x3fe83bbe, 0xc442620e, 0x3e98b9bd,
- 0x00000000, 0x3fe84c9c, 0xfabf3e4e, 0x3e8d94fd,
- 0x00000000, 0x3fe85d69, 0xb145ad9a, 0x3e85db30,
- 0x00000000, 0x3fe86e25, 0xb95022b0, 0x3e8e3e1e,
- 0x00000000, 0x3fe87ed0, 0x45442bd6, 0x3e9d5b8b,
- 0x00000000, 0x3fe88f6b, 0x231ecd2e, 0x3e97a046,
- 0x00000000, 0x3fe89ff5, 0x3ef55232, 0x3e9feafe,
- 0x00000000, 0x3fe8b06f, 0xbfd78267, 0x3e9839e7,
- 0x00000000, 0x3fe8c0d9, 0x9d6fa900, 0x3e645cf4,
- 0x00000000, 0x3fe8d132, 0x2b27f380, 0x3e4be313,
- 0x00000000, 0x3fe8e17a, 0x0bb84f9f, 0x3e953398,
- 0x00000000, 0x3fe8f1b3, 0xce3ba390, 0x3e5889e2,
- 0x00000000, 0x3fe901db, 0xc3ad0cc8, 0x3e7f7778,
- 0x00000000, 0x3fe911f3, 0xcec4eba2, 0x3e846660,
- 0x00000000, 0x3fe921fb, 0x4611a626, 0x3e85110b,
- 0x00000000, 0x3ff00000, 0x00000000, 0x00000000,
- 0x80000000, 0x3ff00553, 0xc81e4294, 0x3e6e6a24,
- 0x90000000, 0x3ff00aa3, 0x11e3a785, 0x3e585485,
- 0x10000000, 0x3ff00ff0, 0x36ec07f6, 0x3e64eb93,
- 0x20000000, 0x3ff01539, 0xb8b750e1, 0x3e40ea64,
- 0xb0000000, 0x3ff01a7e, 0xcff8a53c, 0x3e461637,
- 0xd0000000, 0x3ff01fc0, 0xf7bd1943, 0x3e40733b,
- 0x80000000, 0x3ff024ff, 0x1345cced, 0x3e566691,
- 0xd0000000, 0x3ff02a3a, 0x3f592f14, 0x3e477b7a,
- 0xb0000000, 0x3ff02f72, 0xdd1a5402, 0x3e6f18d3,
- 0x50000000, 0x3ff034a7, 0xa58ee9a4, 0x3e2be2f5,
- 0x80000000, 0x3ff039d8, 0x8f085fa7, 0x3e68901f,
- 0x70000000, 0x3ff03f06, 0xcd5b5d69, 0x3e5c68b8,
- 0x10000000, 0x3ff04431, 0x8624be42, 0x3e5a6b0e,
- 0x70000000, 0x3ff04958, 0xb06f68e7, 0x3dbc4b22,
- 0x80000000, 0x3ff04e7c, 0xafcabe9b, 0x3e60f3f0,
- 0x60000000, 0x3ff0539d, 0xbca4e1b7, 0x3e548495,
- 0x00000000, 0x3ff058bb, 0x1abdfdc3, 0x3e66107f,
- 0x70000000, 0x3ff05dd5, 0x1878288a, 0x3e6e6726,
- 0xc0000000, 0x3ff062ec, 0x55286f1e, 0x3e5a6bc1,
- 0xe0000000, 0x3ff06800, 0xc64a85f2, 0x3e58a759,
- 0xe0000000, 0x3ff06d11, 0x0a4a8d09, 0x3e45fce7,
- 0xc0000000, 0x3ff0721f, 0xf373fe1d, 0x3e32f9cb,
- 0x80000000, 0x3ff0772a, 0xce4ac359, 0x3e590564,
- 0x30000000, 0x3ff07c32, 0xe761b02f, 0x3e5ac29c,
- 0xd0000000, 0x3ff08136, 0xf497381c, 0x3e5cb752,
- 0x60000000, 0x3ff08638, 0x1cfb35e0, 0x3e68bb9e,
- 0xf0000000, 0x3ff08b36, 0x7099de90, 0x3e65b491,
- 0x80000000, 0x3ff09032, 0xc9c65ef2, 0x3e5cc77a,
- 0x10000000, 0x3ff0952b, 0xe7be3dba, 0x3e57a0f3,
- 0xa0000000, 0x3ff09a20, 0x1ee0c16f, 0x3e66ec85,
- 0x40000000, 0x3ff09f13, 0xbf2946da, 0x3e689449,
- 0xf0000000, 0x3ff0a402, 0x301ba223, 0x3e698f25,
- 0xc0000000, 0x3ff0a8ef, 0xc651f549, 0x3e347d5e,
- 0x90000000, 0x3ff0add9, 0x9a86007a, 0x3e6c33ec,
- 0x90000000, 0x3ff0b2c0, 0x53e92649, 0x3e5e0b66,
- 0xb0000000, 0x3ff0b7a4, 0xc09d755f, 0x3e3bd64a,
- 0xf0000000, 0x3ff0bc85, 0x06f78167, 0x3e2f5375,
- 0x50000000, 0x3ff0c164, 0xd1b3735e, 0x3e62c382,
- 0xe0000000, 0x3ff0c63f, 0x659f99e1, 0x3e6e20ed,
- 0xb0000000, 0x3ff0cb18, 0x3a9c182a, 0x3e586b63,
- 0xb0000000, 0x3ff0cfee, 0x5a65e777, 0x3e445cfd,
- 0xe0000000, 0x3ff0d4c1, 0x0f58bca4, 0x3e60c877,
- 0x50000000, 0x3ff0d992, 0x4b0933c5, 0x3e6739e4,
- 0x10000000, 0x3ff0de60, 0xd9ce7bd8, 0x3e027dc3,
- 0x00000000, 0x3ff0e32b, 0x7c5a7b64, 0x3e63c53c,
- 0x40000000, 0x3ff0e7f3, 0x83830cec, 0x3e696696,
- 0xd0000000, 0x3ff0ecb8, 0xc39bdcc4, 0x3e68d772,
- 0xb0000000, 0x3ff0f17b, 0x8bcf6d7b, 0x3e69b000,
- 0xf0000000, 0x3ff0f63b, 0x5825ce4f, 0x3e3bbb30,
- 0x70000000, 0x3ff0faf9, 0xaf13a406, 0x3e6da3f4,
- 0x60000000, 0x3ff0ffb4, 0x6f74ce86, 0x3e5f36b9,
- 0xb0000000, 0x3ff1046c, 0x2303f790, 0x3e165c00,
- 0x50000000, 0x3ff10922, 0x095ba7d5, 0x3e682f84,
- 0x60000000, 0x3ff10dd5, 0x3541b2c6, 0x3e6d4643,
- 0xe0000000, 0x3ff11285, 0x56e93a89, 0x3e671c3d,
- 0xd0000000, 0x3ff11733, 0xf4e40012, 0x3e598dce,
- 0x30000000, 0x3ff11bdf, 0xef17fe03, 0x3e4530eb,
- 0x00000000, 0x3ff12088, 0xa3715066, 0x3e4e8b8f,
- 0x40000000, 0x3ff1252e, 0xb3b211dc, 0x3e6ab26e,
- 0x10000000, 0x3ff129d2, 0xdc906307, 0x3e454dd4,
- 0x50000000, 0x3ff12e73, 0x2387984e, 0x3e5c9f96,
- 0x10000000, 0x3ff13312, 0x59afec09, 0x3e6c62a9,
- 0x60000000, 0x3ff137ae, 0xac6a866a, 0x3e6638d9,
- 0x40000000, 0x3ff13c48, 0xeca8a22d, 0x3e338704,
- 0xa0000000, 0x3ff140df, 0x1db14f8f, 0x3e4e6c9e,
- 0x90000000, 0x3ff14574, 0x7f9c9eaa, 0x3e58744b,
- 0x10000000, 0x3ff14a07, 0x3486373b, 0x3e66c289,
- 0x30000000, 0x3ff14e97, 0xe31699b7, 0x3e5b36bc,
- 0xe0000000, 0x3ff15324, 0x13d200c7, 0x3e671e38,
- 0x30000000, 0x3ff157b0, 0xab40aa88, 0x3e699755,
- 0x20000000, 0x3ff15c39, 0x0e4bcfc0, 0x3e6b45ca,
- 0xc0000000, 0x3ff160bf, 0x0d869c5d, 0x3e32dd09,
- 0xf0000000, 0x3ff16543, 0x16b917da, 0x3e64fe05,
- 0xd0000000, 0x3ff169c5, 0x226317a2, 0x3e694563,
- 0x60000000, 0x3ff16e45, 0xafc2c851, 0x3e653d8f,
- 0xa0000000, 0x3ff172c2, 0x1fbd41a3, 0x3e5dcbd4,
- 0x90000000, 0x3ff1773d, 0x5285f59c, 0x3e5862ff,
- 0x30000000, 0x3ff17bb6, 0xa97a1e1c, 0x3e63072e,
- 0x90000000, 0x3ff1802c, 0x75184805, 0x3e528390,
- 0xa0000000, 0x3ff184a0, 0x3e9eff42, 0x3e64b032,
- 0x70000000, 0x3ff18912, 0x93c45484, 0x3e6b1588,
- 0x10000000, 0x3ff18d82, 0x0fc35826, 0x3e3149ef,
- 0x60000000, 0x3ff191ef, 0xea96acaa, 0x3e5f2e77,
- 0x80000000, 0x3ff1965a, 0x4c471a95, 0x3e520007,
- 0x60000000, 0x3ff19ac3, 0x517f6f04, 0x3e63f8cc,
- 0x10000000, 0x3ff19f2a, 0xe311bb55, 0x3e660ba2,
- 0x90000000, 0x3ff1a38e, 0x730bbec3, 0x3e64b788,
- 0xe0000000, 0x3ff1a7f0, 0x795ee20c, 0x3e657090,
- 0x00000000, 0x3ff1ac51, 0x983670b1, 0x3e6d9ffe,
- 0x00000000, 0x3ff1b0af, 0xff61bfda, 0x3e62a463,
- 0xd0000000, 0x3ff1b50a, 0x6a5e65cf, 0x3e69d1bc,
- 0x80000000, 0x3ff1b964, 0xbaa9e922, 0x3e68718a,
- 0x10000000, 0x3ff1bdbc, 0x2ffa342e, 0x3e63c2f5,
- 0x80000000, 0x3ff1c211, 0x3ff42c80, 0x3e60fae1,
- 0xd0000000, 0x3ff1c664, 0x0ef00d57, 0x3e65440f,
- 0x10000000, 0x3ff1cab6, 0x2d4e3c1e, 0x3e46fcd2,
- 0x30000000, 0x3ff1cf05, 0xb409e863, 0x3e4e0c60,
- 0x30000000, 0x3ff1d352, 0x5a5f0333, 0x3e6f9cab,
- 0x30000000, 0x3ff1d79d, 0x744c333d, 0x3e630f24,
- 0x20000000, 0x3ff1dbe6, 0x2a76b2fe, 0x3e4b5062,
- 0xf0000000, 0x3ff1e02c, 0xba595375, 0x3e6fdb94,
- 0xd0000000, 0x3ff1e471, 0xb945a171, 0x3e3861b9,
- 0x90000000, 0x3ff1e8b4, 0x015188c4, 0x3e654348,
- 0x50000000, 0x3ff1ecf5, 0x49865523, 0x3e6b54d1,
- 0x10000000, 0x3ff1f134, 0x83d9de33, 0x3e6a0bb7,
- 0xd0000000, 0x3ff1f570, 0x2b1a2157, 0x3e6629d1,
- 0x90000000, 0x3ff1f9ab, 0x35d179df, 0x3e6467fe,
- 0x50000000, 0x3ff1fde4, 0x3e26c8f7, 0x3e69763f,
- 0x20000000, 0x3ff2021b, 0xbb9f7679, 0x3e53f798,
- 0xf0000000, 0x3ff2064f, 0x7e855898, 0x3e552e57,
- 0xc0000000, 0x3ff20a82, 0xe5502c3a, 0x3e6fde47,
- 0xb0000000, 0x3ff20eb3, 0x548d96a0, 0x3e5cbd0b,
- 0xa0000000, 0x3ff212e2, 0xf7be8de8, 0x3e6a9cd9,
- 0xb0000000, 0x3ff2170f, 0x704886de, 0x3e522bbe,
- 0xc0000000, 0x3ff21b3a, 0x8317f020, 0x3e6e3dea,
- 0xf0000000, 0x3ff21f63, 0x85ac8855, 0x3e6e8120,
- 0x40000000, 0x3ff2238b, 0x4f24cb07, 0x3e5c8714,
- 0xa0000000, 0x3ff227b0, 0xee311fa2, 0x3e61e128,
- 0x20000000, 0x3ff22bd4, 0x3d61a2d3, 0x3e5b5c16,
- 0xc0000000, 0x3ff22ff5, 0x7fb90633, 0x3e47d97e,
- 0x70000000, 0x3ff23415, 0x9d50f6a7, 0x3e6efe89,
- 0x50000000, 0x3ff23833, 0xeb75de5a, 0x3e6d0333,
- 0x60000000, 0x3ff23c4f, 0xbe73a573, 0x3e40e590,
- 0x80000000, 0x3ff24069, 0xcac3cdd2, 0x3e68ce8d,
- 0xd0000000, 0x3ff24481, 0x8954064b, 0x3e6ee8a4,
- 0x50000000, 0x3ff24898, 0x18461e09, 0x3e6aa62f,
- 0x00000000, 0x3ff24cad, 0x40986a15, 0x3e601e59,
- 0xe0000000, 0x3ff250bf, 0x4f9b8d4c, 0x3e3b082f,
- 0xe0000000, 0x3ff254d0, 0xe5527f5a, 0x3e6876e0,
- 0x20000000, 0x3ff258e0, 0x80831e6b, 0x3e636170,
- 0x90000000, 0x3ff25ced, 0xe34aa4a2, 0x3e681b26,
- 0x40000000, 0x3ff260f9, 0x6dfab0c1, 0x3e552ee6,
- 0x20000000, 0x3ff26503, 0x329e8819, 0x3e5d85a5,
- 0x40000000, 0x3ff2690b, 0xb646b5d1, 0x3e5105c1,
- 0x90000000, 0x3ff26d11, 0x0c1a379c, 0x3e6bb669,
- 0x30000000, 0x3ff27116, 0xa73ce3a9, 0x3e586aeb,
- 0x00000000, 0x3ff27519, 0x98294dd4, 0x3e6dd161,
- 0x20000000, 0x3ff2791a, 0x75775e83, 0x3e6454e6,
- 0x80000000, 0x3ff27d19, 0x026197ea, 0x3e63842e,
- 0x20000000, 0x3ff28117, 0xe70c44d2, 0x3e6f1ce0,
- 0x10000000, 0x3ff28513, 0x441a5627, 0x3e6ad636,
- 0x50000000, 0x3ff2890d, 0xd7212abb, 0x3e54c205,
- 0xd0000000, 0x3ff28d05, 0x6c116419, 0x3e6167c8,
- 0xa0000000, 0x3ff290fc, 0xef16e294, 0x3e638ec3,
- 0xc0000000, 0x3ff294f1, 0xeace9321, 0x3e6473fc,
- 0x30000000, 0x3ff298e5, 0xa836dba7, 0x3e67af53,
- 0x00000000, 0x3ff29cd7, 0xc383b652, 0x3e1a51f3,
- 0x10000000, 0x3ff2a0c7, 0xa190822d, 0x3e63696d,
- 0x80000000, 0x3ff2a4b5, 0xec77074b, 0x3e62f9ad,
- 0x50000000, 0x3ff2a8a2, 0xd5bee55f, 0x3e38190f,
- 0x70000000, 0x3ff2ac8d, 0xfac68e55, 0x3e4bfee8,
- 0xf0000000, 0x3ff2b076, 0x6bc5f68a, 0x3e331c9d,
- 0xc0000000, 0x3ff2b45e, 0x23737edf, 0x3e689d05,
- 0x00000000, 0x3ff2b845, 0x43bf47bb, 0x3e5a2959,
- 0xa0000000, 0x3ff2bc29, 0x2e5b3207, 0x3e396be3,
- 0x90000000, 0x3ff2c00c, 0xd909fa0e, 0x3e6e44c7,
- 0x00000000, 0x3ff2c3ee, 0xda94d9ea, 0x3e2b2505,
- 0xc0000000, 0x3ff2c7cd, 0xf46c9c98, 0x3e60c851,
- 0xf0000000, 0x3ff2cbab, 0x7d9aa3b7, 0x3e5da71f,
- 0x80000000, 0x3ff2cf88, 0x5d019ef1, 0x3e6f1b60,
- 0x90000000, 0x3ff2d363, 0xa2189563, 0x3e4386e8,
- 0x00000000, 0x3ff2d73d, 0x5d306ba7, 0x3e3b19fa,
- 0xd0000000, 0x3ff2db14, 0xb67aef76, 0x3e6dd749,
- 0x20000000, 0x3ff2deeb, 0xf1dc04b0, 0x3e676ff6,
- 0xe0000000, 0x3ff2e2bf, 0xd0b232a6, 0x3e635a33,
- 0x10000000, 0x3ff2e693, 0x0024a4e1, 0x3e64bdc8,
- 0xb0000000, 0x3ff2ea64, 0x770fd723, 0x3e6ebd61,
- 0xd0000000, 0x3ff2ee34, 0xc537264d, 0x3e64769f,
- 0x60000000, 0x3ff2f203, 0x429f3b98, 0x3e69021f,
- 0x70000000, 0x3ff2f5d0, 0x3efbd606, 0x3e5ee708,
- 0xf0000000, 0x3ff2f99b, 0x552a6b1a, 0x3e6ad985,
- 0xf0000000, 0x3ff2fd65, 0x78772160, 0x3e6e3df7,
- 0x70000000, 0x3ff3012e, 0x6ddc9b34, 0x3e6ca5d7,
- 0x70000000, 0x3ff304f5, 0xffdbaf74, 0x3e691154,
- 0xf0000000, 0x3ff308ba, 0x57fb306a, 0x3e667bdd,
- 0xf0000000, 0x3ff30c7e, 0x5ac40886, 0x3e67dc25,
- 0x80000000, 0x3ff31041, 0x8e8afafe, 0x3df219f3,
- 0x80000000, 0x3ff31402, 0xf9669a04, 0x3e62416b,
- 0x10000000, 0x3ff317c2, 0xb2b3987f, 0x3e611c96,
- 0x20000000, 0x3ff31b80, 0x447e1177, 0x3e6f99ed,
- 0xd0000000, 0x3ff31f3c, 0x26328a11, 0x3e132458,
- 0xf0000000, 0x3ff322f7, 0xd1e645f8, 0x3e66f56d,
- 0xb0000000, 0x3ff326b1, 0x46945535, 0x3e461649,
- 0xf0000000, 0x3ff32a69, 0x9d190028, 0x3e5e37d5,
- 0xc0000000, 0x3ff32e20, 0xf12bf828, 0x3e668671,
- 0x20000000, 0x3ff331d6, 0xca6aabbd, 0x3e6e8ecb,
- 0x20000000, 0x3ff3358a, 0x109a5912, 0x3e53f49e,
- 0xa0000000, 0x3ff3393c, 0x11ec3043, 0x3e6b8a0e,
- 0xc0000000, 0x3ff33ced, 0x0aed691a, 0x3e65fae0,
- 0x70000000, 0x3ff3409d, 0xbece3e4a, 0x3e6c0569,
- 0xc0000000, 0x3ff3444b, 0x744efbfe, 0x3e605e26,
- 0xa0000000, 0x3ff347f8, 0xa94be5c5, 0x3e65b570,
- 0x20000000, 0x3ff34ba4, 0x6ea0e063, 0x3e5d6f15,
- 0x30000000, 0x3ff34f4e, 0x612fc484, 0x3e6e0ca7,
- 0xf0000000, 0x3ff352f6, 0x27b25258, 0x3e4963c9,
- 0x40000000, 0x3ff3569e, 0xaa725a5c, 0x3e547930,
- 0x30000000, 0x3ff35a44, 0xe3af43b3, 0x3e58a79f,
- 0xc0000000, 0x3ff35de8, 0x9c41bdaf, 0x3e5e6dc2,
- 0xf0000000, 0x3ff3618b, 0x76f863a5, 0x3e657a2e,
- 0xd0000000, 0x3ff3652d, 0x1716354d, 0x3e2ae3b6,
- 0x40000000, 0x3ff368ce, 0xdf6906b1, 0x3e665fb5,
- 0x60000000, 0x3ff36c6d, 0x7f588f7b, 0x3e66177d,
- 0x30000000, 0x3ff3700b, 0xbd091b67, 0x3e3ad55a,
- 0xa0000000, 0x3ff373a7, 0xb2422d76, 0x3e155337,
- 0xb0000000, 0x3ff37742, 0xe86972d5, 0x3e6084eb,
- 0x70000000, 0x3ff37adc, 0x808e1ea3, 0x3e656395,
- 0xe0000000, 0x3ff37e74, 0x1b40fba7, 0x3e61bce2,
- 0x00000000, 0x3ff3820c, 0x4605b515, 0x3e5006f9,
- 0xc0000000, 0x3ff385a1, 0xaceb1f7d, 0x3e6aa676,
- 0x40000000, 0x3ff38936, 0x76554ce6, 0x3e58229f,
- 0x60000000, 0x3ff38cc9, 0x6cf57330, 0x3e6eabfc,
- 0x40000000, 0x3ff3905b, 0x9c0ce8bc, 0x3e64daed,
- 0xd0000000, 0x3ff393eb, 0x68237141, 0x3e60ff17,
- 0x10000000, 0x3ff3977b, 0x3051b085, 0x3e6575f8,
- 0x10000000, 0x3ff39b09, 0xeb523e29, 0x3e42667d,
- 0xc0000000, 0x3ff39e95, 0x6954f4fd, 0x3e181699,
- 0x20000000, 0x3ff3a221, 0xcf4d9cd4, 0x3e587cfc,
- 0x40000000, 0x3ff3a5ab, 0x18198353, 0x3e52c5d0,
- 0x10000000, 0x3ff3a934, 0x8dcc34aa, 0x3e6a7a89,
- 0xb0000000, 0x3ff3acbb, 0xdadc36d1, 0x3e2cead6,
- 0x00000000, 0x3ff3b042, 0x9c498bdf, 0x3e2a5575,
- 0x00000000, 0x3ff3b3c7, 0x9ef6de04, 0x3e6c414a,
- 0xd0000000, 0x3ff3b74a, 0x8a6e58fa, 0x3e63e210,
- 0x60000000, 0x3ff3bacd, 0x7643d77c, 0x3e5587fd,
- 0xb0000000, 0x3ff3be4e, 0x1d3ff3df, 0x3e3901eb,
- 0xb0000000, 0x3ff3c1ce, 0x7c812fc6, 0x3e6f2ccd,
- 0x90000000, 0x3ff3c54d, 0x70a01049, 0x3e21c8ee,
- 0x20000000, 0x3ff3c8cb, 0x02831eec, 0x3e563e8d,
- 0x70000000, 0x3ff3cc47, 0x2a92c7ff, 0x3e6f61a4,
- 0xa0000000, 0x3ff3cfc2, 0x99c84d24, 0x3dda9173,
- 0x80000000, 0x3ff3d33c, 0xc8eec2f0, 0x3e5e9197,
- 0x30000000, 0x3ff3d6b5, 0x2f5a1378, 0x3e5e6f84,
- 0xb0000000, 0x3ff3da2c, 0x2a90a0fc, 0x3e2fac24,
- 0xf0000000, 0x3ff3dda2, 0x26610227, 0x3e535ed7,
- 0x00000000, 0x3ff3e118, 0x4804b15b, 0x3e50e0d6,
- 0xe0000000, 0x3ff3e48b, 0x5daba814, 0x3e056067,
- 0x80000000, 0x3ff3e7fe, 0xc8768032, 0x3e637388,
- 0x00000000, 0x3ff3eb70, 0x9f9e01f5, 0x3e3ee3c8,
- 0x40000000, 0x3ff3eee0, 0x0d09747c, 0x3e639f6f,
- 0x60000000, 0x3ff3f24f, 0x27abb8f0, 0x3e4322c3,
- 0x40000000, 0x3ff3f5bd, 0x47c8ac80, 0x3e6961b3,
- 0x00000000, 0x3ff3f92a, 0xbbd0f118, 0x3e63711f,
- 0x90000000, 0x3ff3fc95, 0xd7718ffb, 0x3e64fad8,
- 0xf0000000, 0x3ff3ffff, 0xffffffff, 0x3e6fffff,
- 0x30000000, 0x3ff40369, 0x79ec35b4, 0x3e667efa,
- 0x40000000, 0x3ff406d1, 0x87a254a8, 0x3e6a7376,
- 0x30000000, 0x3ff40a38, 0xf87d924d, 0x3e5bace0,
- 0xf0000000, 0x3ff40d9d, 0xc237e392, 0x3e629e37,
- 0x90000000, 0x3ff41102, 0xac3f3012, 0x3e557ce7,
- 0x00000000, 0x3ff41466, 0x359f8fbd, 0x3e682829,
- 0x50000000, 0x3ff417c8, 0x42d14676, 0x3e6cc9be,
- 0x80000000, 0x3ff41b29, 0x1c137d0b, 0x3e6a8f00,
- 0x90000000, 0x3ff41e89, 0x687dda05, 0x3e636127,
- 0x80000000, 0x3ff421e8, 0x322646f0, 0x3e524dba,
- 0x40000000, 0x3ff42546, 0x1ed210b4, 0x3e6dc43f,
- 0xf0000000, 0x3ff428a2, 0x15c447bb, 0x3e631ae5,
- 0xf0000000, 0x3fe428a2, 0x15c447bb, 0x3e531ae5,
- 0xa0000000, 0x3fe965fe, 0xf20ac166, 0x3e44f5b8,
- 0x00000000, 0x3ff00000, 0x00000000, 0x00000000,
- 0xf0000000, 0x3ff428a2, 0x15c447bb, 0x3e631ae5,
- 0xa0000000, 0x3ff965fe, 0xf20ac166, 0x3e54f5b8,
- 0x00000000, 0x3ff00000, 0x00000000, 0x00000000,
- 0x30000000, 0x3ff02c9a, 0xc1dcdef9, 0x3e6cef00,
- 0xd0000000, 0x3ff059b0, 0xa1d73e2a, 0x3e48ac2b,
- 0x10000000, 0x3ff08745, 0x901186be, 0x3e60eb37,
- 0x60000000, 0x3ff0b558, 0x1ec53172, 0x3e69f312,
- 0x30000000, 0x3ff0e3ec, 0x10103a17, 0x3e469e8d,
- 0xd0000000, 0x3ff11301, 0xa4ebbf1a, 0x3df25b50,
- 0xa0000000, 0x3ff1429a, 0xbf668203, 0x3e6d525b,
- 0x30000000, 0x3ff172b8, 0xf5b9bef9, 0x3e68faa2,
- 0xe0000000, 0x3ff1a35b, 0xea796d31, 0x3e66df96,
- 0x30000000, 0x3ff1d487, 0xa7805b80, 0x3e368b9a,
- 0x80000000, 0x3ff2063b, 0xac771dd6, 0x3e60c519,
- 0x60000000, 0x3ff2387a, 0x70cd83f5, 0x3e6ceac4,
- 0x60000000, 0x3ff26b45, 0x7495e99c, 0x3e5789f3,
- 0xf0000000, 0x3ff29e9d, 0x84b09745, 0x3e547f7b,
- 0xa0000000, 0x3ff2d285, 0x2d002475, 0x3e5b900c,
- 0x00000000, 0x3ff306fe, 0x2a5bd1ab, 0x3e64636e,
- 0xb0000000, 0x3ff33c08, 0xfa64e430, 0x3e4320b7,
- 0x30000000, 0x3ff371a7, 0x2a9c5154, 0x3e5ceaa7,
- 0x30000000, 0x3ff3a7db, 0xdba86f24, 0x3e53967f,
- 0x40000000, 0x3ff3dea6, 0x446b6824, 0x3e682468,
- 0x20000000, 0x3ff4160a, 0x9f84325b, 0x3e3f72e2,
- 0x60000000, 0x3ff44e08, 0x40c4dbd0, 0x3e18624b,
- 0xb0000000, 0x3ff486a2, 0x404f068e, 0x3e5704f3,
- 0xd0000000, 0x3ff4bfda, 0x9c750e5e, 0x3e54d8a8,
- 0x70000000, 0x3ff4f9b2, 0x9ab4cf62, 0x3e5a74b2,
- 0x50000000, 0x3ff5342b, 0x077c2a0f, 0x3e5a753e,
- 0x30000000, 0x3ff56f47, 0x699bb2c0, 0x3e5ad49f,
- 0xd0000000, 0x3ff5ab07, 0x52b19260, 0x3e6a90a8,
- 0x10000000, 0x3ff5e76f, 0x21ba6f93, 0x3e56b485,
- 0xb0000000, 0x3ff6247e, 0x58f87d03, 0x3e0d2ac2,
- 0x80000000, 0x3ff66238, 0x24893ecf, 0x3e42a911,
- 0x60000000, 0x3ff6a09e, 0x32422cbe, 0x3e59fcef,
- 0x30000000, 0x3ff6dfb2, 0x5de441c5, 0x3e68ca34,
- 0xe0000000, 0x3ff71f75, 0xe7ba46e1, 0x3e61d8be,
- 0x50000000, 0x3ff75feb, 0x22fdba6a, 0x3e59099f,
- 0x70000000, 0x3ff7a114, 0x36bea881, 0x3e4f580c,
- 0x30000000, 0x3ff7e2f3, 0x8841740a, 0x3e5b3d39,
- 0x90000000, 0x3ff82589, 0x25159f11, 0x3e62999c,
- 0x90000000, 0x3ff868d9, 0xd901c83b, 0x3e668925,
- 0x40000000, 0x3ff8ace5, 0xdadd3e2a, 0x3e415506,
- 0x90000000, 0x3ff8f1ae, 0x6c57304e, 0x3e622aee,
- 0xb0000000, 0x3ff93737, 0x9e8a0387, 0x3e29b8bc,
- 0x90000000, 0x3ff97d82, 0x9f173d24, 0x3e6fbc9c,
- 0x80000000, 0x3ff9c491, 0x80e3e235, 0x3e451f84,
- 0x70000000, 0x3ffa0c66, 0xc96535b5, 0x3e66bbca,
- 0xb0000000, 0x3ffa5503, 0xe45a1224, 0x3e41f12a,
- 0x50000000, 0x3ffa9e6b, 0xfd0fac90, 0x3e55e7f6,
- 0x90000000, 0x3ffae89f, 0x5abd0e69, 0x3e62b5a7,
- 0xb0000000, 0x3ffb33a2, 0xf5ed7fa1, 0x3e609e2b,
- 0xf0000000, 0x3ffb7f76, 0x37553d84, 0x3e47daf2,
- 0x90000000, 0x3ffbcc1e, 0x891ee83d, 0x3e12f074,
- 0xd0000000, 0x3ffc199b, 0x38444196, 0x3e6b0aa5,
- 0x20000000, 0x3ffc67f1, 0x9694426f, 0x3e6cafa2,
- 0xd0000000, 0x3ffcb720, 0xd22a0797, 0x3e69df20,
- 0x40000000, 0x3ffd072d, 0xf71a1e45, 0x3e640f12,
- 0xd0000000, 0x3ffd5818, 0x0e4bb40b, 0x3e69f749,
- 0x00000000, 0x3ffda9e6, 0x2b84600d, 0x3e4ed994,
- 0x30000000, 0x3ffdfc97, 0xf5cb4656, 0x3e4bdcda,
- 0xe0000000, 0x3ffe502e, 0xd89cf44c, 0x3e5e2cff,
- 0xa0000000, 0x3ffea4af, 0xcc2c7b9d, 0x3e452486,
- 0xe0000000, 0x3ffefa1b, 0x4eee3fa4, 0x3e6cc2b4,
- 0x50000000, 0x3fff5076, 0x80ce9f09, 0x3e66dc8a,
- 0x80000000, 0x3fffa7c1, 0x82e90a7e, 0x3e39e90d,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x3f8fc0a8, 0x7c79f3db, 0x3e361f80,
- 0x00000000, 0x3f9f8298, 0x980267c8, 0x3e6873c1,
- 0x00000000, 0x3fa77458, 0x9f88c69e, 0x3e5ec65b,
- 0x00000000, 0x3faf0a30, 0x54cc2f99, 0x3e58022c,
- 0x00000000, 0x3fb341d7, 0x3a125330, 0x3e62c37a,
- 0x00000000, 0x3fb6f0d2, 0x69737c93, 0x3e615cad,
- 0x00000000, 0x3fba926d, 0xb1b285e9, 0x3e4d256a,
- 0x00000000, 0x3fbe2707, 0xb97a7aa2, 0x3e5b8abc,
- 0x00000000, 0x3fc0d77e, 0x9659a5dc, 0x3e6f3423,
- 0x80000000, 0x3fc29552, 0x48d30177, 0x3e6e07fd,
- 0x00000000, 0x3fc44d2b, 0x4799f4f6, 0x3e6b32df,
- 0x00000000, 0x3fc5ff30, 0xf4f21cf8, 0x3e6c29e4,
- 0x00000000, 0x3fc7ab89, 0x48df1b59, 0x3e1086c8,
- 0x80000000, 0x3fc9525a, 0xb4764130, 0x3e4cf456,
- 0x00000000, 0x3fcaf3c9, 0xfcb63398, 0x3e63a02f,
- 0x80000000, 0x3fcc8ff7, 0x886b0976, 0x3e61e6a6,
- 0x00000000, 0x3fce2707, 0xb97a7aa2, 0x3e6b8abc,
- 0x00000000, 0x3fcfb918, 0x8aa35552, 0x3e6b578f,
- 0xc0000000, 0x3fd0a324, 0x71afb9fc, 0x3e6139c8,
- 0x80000000, 0x3fd1675c, 0x0701ce64, 0x3e65d5d3,
- 0xc0000000, 0x3fd22941, 0xb2d12142, 0x3e6de7bc,
- 0x80000000, 0x3fd2e8e2, 0x984e1664, 0x3e6d708e,
- 0x40000000, 0x3fd3a64c, 0xe9c72f36, 0x3e556945,
- 0xc0000000, 0x3fd4618b, 0x13e85bda, 0x3e20e2f6,
- 0x80000000, 0x3fd51aad, 0xb42724f6, 0x3e3cb7e0,
- 0x80000000, 0x3fd5d1bd, 0xe52846c7, 0x3e6fac04,
- 0x00000000, 0x3fd686c8, 0xaec442be, 0x3e5e9b14,
- 0xc0000000, 0x3fd739d7, 0x034e7126, 0x3e6b5de8,
- 0x00000000, 0x3fd7eaf8, 0xe1b259d3, 0x3e6dc157,
- 0x80000000, 0x3fd89a33, 0x6ad69c62, 0x3e3b0509,
- 0x00000000, 0x3fd94794, 0xfaba4cdd, 0x3e5c2116,
- 0xc0000000, 0x3fd9f323, 0x25f95b47, 0x3e665fcc,
- 0x80000000, 0x3fda9cec, 0x498d4850, 0x3e5a9a08,
- 0x40000000, 0x3fdb44f7, 0xb1465f77, 0x3e6de647,
- 0x80000000, 0x3fdbeb4d, 0x7bf7861d, 0x3e5da71b,
- 0xc0000000, 0x3fdc8ff7, 0x86b09760, 0x3e3e6a68,
- 0x40000000, 0x3fdd32fe, 0xeab0ef64, 0x3e6f0075,
- 0x00000000, 0x3fddd46a, 0x82fb989b, 0x3e330712,
- 0x40000000, 0x3fde7442, 0xc3f1bed2, 0x3e60eb43,
- 0x40000000, 0x3fdf128f, 0xecb35c84, 0x3e5faf06,
- 0x80000000, 0x3fdfaf58, 0x3db35f68, 0x3e4ef1e6,
- 0xa0000000, 0x3fe02552, 0xfb1a71a5, 0x3e469743,
- 0x40000000, 0x3fe0723e, 0x404e5796, 0x3e6c1cdf,
- 0xe0000000, 0x3fe0be72, 0x0ada625e, 0x3e4094aa,
- 0x80000000, 0x3fe109f3, 0x96fde3ec, 0x3e6e2d4c,
- 0xc0000000, 0x3fe154c3, 0xe9a98f34, 0x3e62f4d5,
- 0xa0000000, 0x3fe19ee6, 0x6ecc5cbe, 0x3e6467c9,
- 0x40000000, 0x3fe1e85f, 0xd03dec5a, 0x3e6e7040,
- 0xc0000000, 0x3fe23130, 0x4282de36, 0x3e67bebf,
- 0x00000000, 0x3fe2795e, 0x1aeb783f, 0x3e6289b1,
- 0xe0000000, 0x3fe2c0e9, 0x1772f538, 0x3e5a891d,
- 0x20000000, 0x3fe307d7, 0xbe1fb591, 0x3e634f10,
- 0x80000000, 0x3fe34e28, 0xd316eb93, 0x3e6d9ce1,
- 0xc0000000, 0x3fe393e0, 0x19a9c442, 0x3e63562a,
- 0x60000000, 0x3fe3d902, 0xf548084c, 0x3e54e2ad,
- 0xe0000000, 0x3fe41d8f, 0x5cc8c97a, 0x3e508ce5,
- 0xc0000000, 0x3fe4618b, 0x13e85bda, 0x3e30e2f6,
- 0x40000000, 0x3fe4a4f8, 0xbb0227bf, 0x3e6db03e,
- 0x00000000, 0x3fe4e7d8, 0xb09cb098, 0x3e61b75b,
- 0x20000000, 0x3fe52a2d, 0xabb9df22, 0x3e496f16,
- 0xc0000000, 0x3fe56bf9, 0x99411c62, 0x3e65b3f3,
- 0x40000000, 0x3fe5ad40, 0x59f65355, 0x3e586b3e,
- 0xa0000000, 0x3fe5ee02, 0xeae1ac12, 0x3e52482c,
- 0xe0000000, 0x3fe62e42, 0xef35793c, 0x3e6efa39,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xa0000000, 0x3f6ff00a, 0x0250435a, 0x3db5885e,
- 0x60000000, 0x3f7fe02a, 0x11f86ed2, 0x3de620cf,
- 0x50000000, 0x3f87dc47, 0xedba4a25, 0x3dff0214,
- 0xb0000000, 0x3f8fc0a8, 0x79f3db4e, 0x3dbf807c,
- 0x40000000, 0x3f93cea4, 0xa779a52b, 0x3dea352b,
- 0x00000000, 0x3f97b91b, 0x6aa49fd5, 0x3dff56c4,
- 0x20000000, 0x3f9b9fc0, 0x5fef5196, 0x3dfebe46,
- 0x00000000, 0x3f9f829b, 0x0099f1f8, 0x3e0cf066,
- 0x80000000, 0x3fa1b0d9, 0xff85945d, 0x3e1247b2,
- 0xb0000000, 0x3fa39e87, 0xbf5202b6, 0x3e13fd7a,
- 0xa0000000, 0x3fa58a5b, 0xa918d51e, 0x3e1f91c9,
- 0xf0000000, 0x3fa77458, 0xf118d3ca, 0x3e08cb73,
- 0x00000000, 0x3fa95c83, 0xd6fad074, 0x3e1d91c7,
- 0x70000000, 0x3fab42dd, 0xec28d14c, 0x3de1971b,
- 0x80000000, 0x3fad276b, 0xa423c78a, 0x3e15b616,
- 0xc0000000, 0x3faf0a30, 0x617cc971, 0x3da162a6,
- 0x30000000, 0x3fb07598, 0xc4c06d29, 0x3e166391,
- 0xe0000000, 0x3fb16536, 0xc1d0c4b8, 0x3e2d46f5,
- 0x20000000, 0x3fb253f6, 0x2df1f6d3, 0x3e2e1428,
- 0x90000000, 0x3fb341d7, 0x424a660d, 0x3e186f47,
- 0xb0000000, 0x3fb42edc, 0xe077753e, 0x3e2d4c8d,
- 0x30000000, 0x3fb51b07, 0x7ed24f1c, 0x3e2e0c30,
- 0xa0000000, 0x3fb60658, 0x8763bdd3, 0x3e226ea1,
- 0x80000000, 0x3fb6f0d2, 0x9737c933, 0x3e25cad6,
- 0x60000000, 0x3fb7da76, 0x99088901, 0x3e2af625,
- 0xd0000000, 0x3fb8c345, 0x83d6b2d0, 0x3e18c66c,
- 0x40000000, 0x3fb9ab42, 0xb36fb30f, 0x3e1880ce,
- 0x30000000, 0x3fba926d, 0xc6ca17a4, 0x3e2495aa,
- 0x20000000, 0x3fbb78c8, 0x4210878c, 0x3e2761db,
- 0x80000000, 0x3fbc5e54, 0x862bac2f, 0x3e2eb78e,
- 0xd0000000, 0x3fbd4313, 0x75790dd9, 0x3e19b2cd,
- 0x60000000, 0x3fbe2707, 0xcbd3d50f, 0x3e2c55e5,
- 0xc0000000, 0x3fbf0a30, 0x617cc971, 0x3db162a6,
- 0x30000000, 0x3fbfec91, 0xaaa2e519, 0x3dfdbeab,
- 0x10000000, 0x3fc06715, 0x7150c647, 0x3e1652cb,
- 0x70000000, 0x3fc0d77e, 0xb2cd2ee2, 0x3e39a11c,
- 0x80000000, 0x3fc14785, 0xb1a28813, 0x3e219d0a,
- 0xd0000000, 0x3fc1b72a, 0x80a41811, 0x3e24bd9e,
- 0x10000000, 0x3fc2266f, 0x96faa3df, 0x3e3214b5,
- 0xf0000000, 0x3fc29552, 0x46980bb8, 0x3e303fea,
- 0x10000000, 0x3fc303d7, 0xa5fd28c7, 0x3e31c8ff,
- 0x20000000, 0x3fc371fc, 0x3bcd96c5, 0x3dce8f74,
- 0xb0000000, 0x3fc3dfc2, 0x395315c6, 0x3dfd98c5,
- 0x60000000, 0x3fc44d2b, 0x3ccfa7b2, 0x3e3996fa,
- 0xf0000000, 0x3fc4ba36, 0x2ad13037, 0x3e1cd2af,
- 0xe0000000, 0x3fc526e5, 0xbd17200e, 0x3e1d0da1,
- 0xd0000000, 0x3fc59338, 0x0ba68b75, 0x3e333041,
- 0x70000000, 0x3fc5ff30, 0x790e7c41, 0x3df4f27a,
- 0x40000000, 0x3fc66acd, 0x86f6ff1b, 0x3e13956a,
- 0xe0000000, 0x3fc6d60f, 0x723551d9, 0x3e2c6748,
- 0xf0000000, 0x3fc740f8, 0x9326cdfc, 0x3e2500de,
- 0x00000000, 0x3fc7ab89, 0x48df1b59, 0x3e1086c8,
- 0xa0000000, 0x3fc815c0, 0xad6836ff, 0x3e04357e,
- 0x60000000, 0x3fc87fa0, 0x42408024, 0x3e248324,
- 0xd0000000, 0x3fc8e928, 0x8154b13d, 0x3e3d10da,
- 0x90000000, 0x3fc9525a, 0x68ec8260, 0x3e39e8ad,
- 0x20000000, 0x3fc9bb36, 0x06abaf18, 0x3e3cfbf7,
- 0x10000000, 0x3fca23bc, 0xc6326e23, 0x3e3fc56a,
- 0xf0000000, 0x3fca8bec, 0x3185cf21, 0x3e39105e,
- 0x40000000, 0x3fcaf3c9, 0xe5b19cc0, 0x3e3d017f,
- 0x90000000, 0x3fcb5b51, 0x48dd13fe, 0x3e3d1f6b,
- 0x70000000, 0x3fcbc286, 0x58a7e73a, 0x3e20b633,
- 0x50000000, 0x3fcc2968, 0x028c211c, 0x3e263063,
- 0xc0000000, 0x3fcc8ff7, 0x86b09760, 0x3e2e6a68,
- 0x40000000, 0x3fccf635, 0xb891cd03, 0x3e3c138b,
- 0x60000000, 0x3fcd5c21, 0x22b7221a, 0x3e369f77,
- 0xa0000000, 0x3fcdc1bc, 0xac1a628c, 0x3df57d8f,
- 0x60000000, 0x3fce2707, 0xcbd3d50f, 0x3e3c55e5,
- 0x50000000, 0x3fce8c02, 0xff48fe2e, 0x3e1552d2,
- 0xc0000000, 0x3fcef0ad, 0x6ca431bc, 0x3e37b8b2,
- 0x50000000, 0x3fcf550a, 0xdc1c5f6d, 0x3e292dec,
- 0x60000000, 0x3fcfb918, 0x551aaa8c, 0x3e3abc7c,
- 0x40000000, 0x3fd00e6c, 0x731a354b, 0x3e36b540,
- 0x90000000, 0x3fd04025, 0x036b89ef, 0x3e32d341,
- 0x50000000, 0x3fd071b8, 0x1a3a2e0f, 0x3e4f9ab2,
- 0xe0000000, 0x3fd0a324, 0x1afb9fbd, 0x3e239c87,
- 0x50000000, 0x3fd0d46b, 0x2c81f640, 0x3e3e6add,
- 0xf0000000, 0x3fd1058b, 0xaa313f41, 0x3e435c95,
- 0x00000000, 0x3fd13687, 0x82f6cc53, 0x3e249d45,
- 0xa0000000, 0x3fd1675c, 0x1c07398f, 0x3e47574c,
- 0x20000000, 0x3fd1980d, 0xdece9e8d, 0x3e4ba846,
- 0xc0000000, 0x3fd1c898, 0xafbc68e7, 0x3e16999f,
- 0x90000000, 0x3fd1f8ff, 0xe51b0103, 0x3e4c9145,
- 0xf0000000, 0x3fd22941, 0xcb44850a, 0x3e479ef2,
- 0x10000000, 0x3fd25960, 0x3de11275, 0x3e0beec7,
- 0x10000000, 0x3fd2895a, 0x1af5a498, 0x3e2ef435,
- 0x30000000, 0x3fd2b930, 0x493b4a50, 0x3e45713a,
- 0xb0000000, 0x3fd2e8e2, 0x61385992, 0x3e45c23a,
- 0xc0000000, 0x3fd31871, 0x09f57299, 0x3e42a883,
- 0x90000000, 0x3fd347dd, 0xa9ac8ace, 0x3e4530fa,
- 0x60000000, 0x3fd37726, 0xd792a758, 0x3e25fec2,
- 0x50000000, 0x3fd3a64c, 0xa71cbcd7, 0x3e35a517,
- 0xa0000000, 0x3fd3d54f, 0x3e1cd9a3, 0x3e3707dc,
- 0x80000000, 0x3fd40430, 0x8ef43049, 0x3e3a1a9f,
- 0x20000000, 0x3fd432ef, 0x276b3674, 0x3e4409d0,
- 0xc0000000, 0x3fd4618b, 0x13e85bd9, 0x3e20e2f6,
- 0x80000000, 0x3fd49006, 0x33001e5f, 0x3df00274,
- 0x90000000, 0x3fd4be5f, 0x836d3265, 0x3e35dde2,
- 0x30000000, 0x3fd4ec97, 0x4d7aaf04, 0x3e230013,
- 0x80000000, 0x3fd51aad, 0xb42724f5, 0x3e3cb7e0,
- 0xc0000000, 0x3fd548a2, 0x167e6308, 0x3e2d6e93,
- 0x10000000, 0x3fd57677, 0xb1526adb, 0x3e3d1569,
- 0xb0000000, 0x3fd5a42a, 0x338a1a41, 0x3e0e99fc,
- 0xb0000000, 0x3fd5d1bd, 0x94a11b1c, 0x3e4eb013,
- 0x70000000, 0x3fd5ff30, 0x790e7c41, 0x3e04f27a,
- 0xf0000000, 0x3fd62c82, 0xa97b7af9, 0x3e25ce3c,
- 0x70000000, 0x3fd659b5, 0x940ed857, 0x3e281f0f,
- 0x10000000, 0x3fd686c8, 0x5d88857c, 0x3e4d3629,
- 0x20000000, 0x3fd6b3bb, 0xec4af526, 0x3e21aca1,
- 0xa0000000, 0x3fd6e08e, 0xc7182726, 0x3e445743,
- 0xe0000000, 0x3fd70d42, 0xaead337e, 0x3e23c491,
- 0xf0000000, 0x3fd739d7, 0x1a738931, 0x3e3aef40,
- 0x10000000, 0x3fd7664e, 0x76092a29, 0x3e21cede,
- 0x50000000, 0x3fd792a5, 0x44f82bb4, 0x3e4fba8f,
- 0x00000000, 0x3fd7bede, 0x7f3c3e1a, 0x3e446f5f,
- 0x30000000, 0x3fd7eaf8, 0x86c9674b, 0x3e47055f,
- 0x10000000, 0x3fd816f4, 0x2b6b6e1a, 0x3e4b41a9,
- 0xd0000000, 0x3fd842d1, 0x2e927628, 0x3e443d16,
- 0x90000000, 0x3fd86e91, 0x4013f9b1, 0x3e446617,
- 0x80000000, 0x3fd89a33, 0x6ad69c62, 0x3e3b0509,
- 0xc0000000, 0x3fd8c5b7, 0x150faa58, 0x3e40b169,
- 0x80000000, 0x3fd8f11e, 0x1df85da7, 0x3e3cd98b,
- 0xe0000000, 0x3fd91c67, 0x7b0f8fa8, 0x3e468b50,
- 0x10000000, 0x3fd94794, 0xf57499ba, 0x3e48422d,
- 0x40000000, 0x3fd972a3, 0x86970274, 0x3e113515,
- 0x80000000, 0x3fd99d95, 0xacba92ee, 0x3e117e08,
- 0x00000000, 0x3fd9c86b, 0x14dd0229, 0x3e26e043,
- 0xe0000000, 0x3fd9f323, 0x97e56d1a, 0x3e497f30,
- 0x60000000, 0x3fda1dc0, 0x55901286, 0x3e3356e6,
- 0x90000000, 0x3fda4840, 0x457f94d6, 0x3e0cb761,
- 0x90000000, 0x3fda72a4, 0xa85a9dac, 0x3e39af67,
- 0x90000000, 0x3fda9cec, 0x931a909f, 0x3e453410,
- 0xc0000000, 0x3fdac718, 0x206058f5, 0x3e22c587,
- 0x30000000, 0x3fdaf129, 0x58899c22, 0x3e223bc3,
- 0x00000000, 0x3fdb1b1e, 0xb6d223cb, 0x3e4d7bf8,
- 0x70000000, 0x3fdb44f7, 0xc5197ddb, 0x3e47991e,
- 0x90000000, 0x3fdb6eb5, 0xbb3a9219, 0x3e4a79e6,
- 0x90000000, 0x3fdb9858, 0xed663ec5, 0x3e3a4c43,
- 0x80000000, 0x3fdbc1e0, 0x1484f438, 0x3e461b5a,
- 0x90000000, 0x3fdbeb4d, 0xf7ef0c3a, 0x3e4b4e36,
- 0xf0000000, 0x3fdc149f, 0x6acd0d1b, 0x3e115f02,
- 0xa0000000, 0x3fdc3dd7, 0x35cecf05, 0x3e3f36b5,
- 0xe0000000, 0x3fdc66f4, 0xbf3eb5c6, 0x3e2ffb7f,
- 0xc0000000, 0x3fdc8ff7, 0x86b09760, 0x3e3e6a68,
- 0x70000000, 0x3fdcb8e0, 0x27f5bbc3, 0x3e3135eb,
- 0x00000000, 0x3fdce1af, 0xd6f6fa57, 0x3e470be7,
- 0xa0000000, 0x3fdd0a63, 0xc84ab338, 0x3e4ce43c,
- 0x70000000, 0x3fdd32fe, 0xaac3bd91, 0x3e4c01d7,
- 0x90000000, 0x3fdd5b7f, 0x07961060, 0x3e45c58d,
- 0x20000000, 0x3fdd83e7, 0xf941456e, 0x3e3628bc,
- 0x30000000, 0x3fddac35, 0xa8461cd2, 0x3e4c58b2,
- 0x00000000, 0x3fddd46a, 0x82fb989a, 0x3e330712,
- 0x90000000, 0x3fddfc85, 0x6a80f09c, 0x3e420dab,
- 0x10000000, 0x3fde2488, 0x4c397b1e, 0x3e44f8d8,
- 0xa0000000, 0x3fde4c71, 0x08599e48, 0x3e40d0ee,
- 0x60000000, 0x3fde7442, 0x7e37da36, 0x3e1d6878,
- 0x60000000, 0x3fde9bfa, 0xd591bafc, 0x3e366187,
- 0xd0000000, 0x3fdec399, 0x00bae772, 0x3e223466,
- 0xc0000000, 0x3fdeeb20, 0xd0d61b8e, 0x3e390377,
- 0x50000000, 0x3fdf128f, 0xd966b907, 0x3e4f5e0d,
- 0xb0000000, 0x3fdf39e5, 0xb79a00e2, 0x3e49023c,
- 0xf0000000, 0x3fdf6123, 0x58c28ad8, 0x3e44e051,
- 0x30000000, 0x3fdf884a, 0x08b18ae4, 0x3e3bfa7b,
- 0x80000000, 0x3fdfaf58, 0x3db35f67, 0x3e4ef1e6,
- 0x20000000, 0x3fdfd64f, 0x39493d4f, 0x3e0ec2ae,
- 0x00000000, 0x3fdffd2e, 0x30ab2fa0, 0x3e40afe9,
- 0xb0000000, 0x3fe011fa, 0xa1810dd4, 0x3e225ff8,
- 0xa0000000, 0x3fe02552, 0xfb1a71a5, 0x3e469743,
- 0xe0000000, 0x3fe0389e, 0x76785571, 0x3e5f9cc6,
- 0x90000000, 0x3fe04bdf, 0xa4cbf982, 0x3e5b524d,
- 0xb0000000, 0x3fe05f14, 0x381535b8, 0x3e5a4c8b,
- 0x50000000, 0x3fe0723e, 0x809caf2c, 0x3e5839be,
- 0x80000000, 0x3fe0855c, 0x1cb82c13, 0x3e50968a,
- 0x40000000, 0x3fe0986f, 0x41723fb5, 0x3e5eae6a,
- 0xb0000000, 0x3fe0ab76, 0xa380a4db, 0x3e5d9c29,
- 0xe0000000, 0x3fe0be72, 0x0ada625e, 0x3e4094aa,
- 0xc0000000, 0x3fe0d163, 0x6fc108ca, 0x3e5973ad,
- 0x80000000, 0x3fe0e449, 0x2fdbab97, 0x3e474732,
- 0x10000000, 0x3fe0f724, 0xfa9d4221, 0x3e593692,
- 0x90000000, 0x3fe109f3, 0x2dfbc7d9, 0x3e5c5a99,
- 0x10000000, 0x3fe11cb8, 0xe102387a, 0x3e4e1f33,
- 0x90000000, 0x3fe12f71, 0xf14c048c, 0x3e464fbe,
- 0x20000000, 0x3fe14220, 0x13ca5e3b, 0x3e4490f5,
- 0xd0000000, 0x3fe154c3, 0x4d4c799d, 0x3e37a6af,
- 0xa0000000, 0x3fe1675c, 0x1c07398f, 0x3e57574c,
- 0xb0000000, 0x3fe179ea, 0x417f8c1c, 0x3e57b133,
- 0x00000000, 0x3fe18c6e, 0x0c176514, 0x3e5feb9e,
- 0xb0000000, 0x3fe19ee6, 0xbb3172f7, 0x3e419f25,
- 0xb0000000, 0x3fe1b154, 0x7bbfb852, 0x3e45f68a,
- 0x10000000, 0x3fe1c3b8, 0x497929f1, 0x3e5ee278,
- 0xf0000000, 0x3fe1d610, 0x06109d58, 0x3e5ccee0,
- 0x50000000, 0x3fe1e85f, 0xa07bd8b3, 0x3e5ce081,
- 0x40000000, 0x3fe1faa3, 0x981817b8, 0x3e570e12,
- 0xd0000000, 0x3fe20cdc, 0xd93503d0, 0x3e292ab6,
- 0xf0000000, 0x3fe21f0b, 0xd7c3b61e, 0x3e58cb7d,
- 0xd0000000, 0x3fe23130, 0x0a0b78da, 0x3e4efafd,
- 0x60000000, 0x3fe2434b, 0x67c4288e, 0x3e5e9072,
- 0xc0000000, 0x3fe2555b, 0x96780875, 0x3e5d31ef,
- 0x00000000, 0x3fe26762, 0xfcd2ad50, 0x3e23430d,
- 0x10000000, 0x3fe2795e, 0xd75bc1f9, 0x3e344d88,
- 0x00000000, 0x3fe28b50, 0x055e04fc, 0x3e5bec0f,
- 0xf0000000, 0x3fe29d37, 0x1590b9ad, 0x3e5d8561,
- 0xf0000000, 0x3fe2af15, 0x8e583229, 0x3df32056,
- 0xe0000000, 0x3fe2c0e9, 0x1772f538, 0x3e5a891d,
- 0x00000000, 0x3fe2d2b4, 0xdabba74d, 0x3e22edc9,
- 0x30000000, 0x3fe2e474, 0xa1015086, 0x3e4b9009,
- 0x90000000, 0x3fe2f62a, 0x8c5b1a19, 0x3e52a12a,
- 0x30000000, 0x3fe307d7, 0xf0fdac85, 0x3e3a7885,
- 0x00000000, 0x3fe3197a, 0xd43ac691, 0x3e5f4ffc,
- 0x30000000, 0x3fe32b13, 0xe2640aad, 0x3e52243a,
- 0xb0000000, 0x3fe33ca2, 0x299035d3, 0x3e546513,
- 0x90000000, 0x3fe34e28, 0xa62dd725, 0x3e5b39c3,
- 0xe0000000, 0x3fe35fa4, 0x40049f51, 0x3e5ba6dd,
- 0xb0000000, 0x3fe37117, 0xd7177409, 0x3e451d1e,
- 0xf0000000, 0x3fe38280, 0xfd7f5216, 0x3e5cb0f2,
- 0xd0000000, 0x3fe393e0, 0xcd4e2213, 0x3e3ab150,
- 0x30000000, 0x3fe3a537, 0xf3193844, 0x3e5cfd7b,
- 0x40000000, 0x3fe3b684, 0x455f1dbd, 0x3e53fff8,
- 0xf0000000, 0x3fe3c7c7, 0x0b905fc9, 0x3e5fee64,
- 0x60000000, 0x3fe3d902, 0xf548084c, 0x3e54e2ad,
- 0x90000000, 0x3fe3ea33, 0xdc1ecdd2, 0x3e3b597a,
- 0x80000000, 0x3fe3fb5b, 0x096d3a75, 0x3e4345bd,
- 0x40000000, 0x3fe40c7a, 0xd2453c8b, 0x3e5101b9,
- 0xe0000000, 0x3fe41d8f, 0x5cc8c979, 0x3e508ce5,
- 0x60000000, 0x3fe42e9c, 0x7e595f71, 0x3e5bbf01,
- 0xe0000000, 0x3fe43f9f, 0x3bd393dc, 0x3e37ce73,
- 0x50000000, 0x3fe4509a, 0xa503f8a1, 0x3e233bb0,
- 0xc0000000, 0x3fe4618b, 0x13e85bd9, 0x3e30e2f6,
- 0x30000000, 0x3fe47274, 0x5a635b3c, 0x3e5e6755,
- 0xd0000000, 0x3fe48353, 0xf73d5e8b, 0x3e2ea88d,
- 0x80000000, 0x3fe4942a, 0x3bda18a8, 0x3e3d17e0,
- 0x50000000, 0x3fe4a4f8, 0x76044f7e, 0x3e5b607d,
- 0x60000000, 0x3fe4b5bd, 0xe71bc2fc, 0x3e52adc4,
- 0xa0000000, 0x3fe4c679, 0x7362d1d9, 0x3e5f99dc,
- 0x30000000, 0x3fe4d72d, 0x008e6a6a, 0x3e5473fa,
- 0x10000000, 0x3fe4e7d8, 0x09cb0985, 0x3e2b75bb,
- 0x30000000, 0x3fe4f87a, 0xd10b9aba, 0x3e5ea04d,
- 0xc0000000, 0x3fe50913, 0xd6979674, 0x3e5802d0,
- 0xc0000000, 0x3fe519a4, 0xccd99094, 0x3e174688,
- 0x20000000, 0x3fe52a2d, 0xabb9df22, 0x3e496f16,
- 0x00000000, 0x3fe53aad, 0xf2aa374f, 0x3e46e66d,
- 0x60000000, 0x3fe54b24, 0x5ea4550a, 0x3e4e6652,
- 0x50000000, 0x3fe55b93, 0x34f20cbd, 0x3e42d02f,
- 0xd0000000, 0x3fe56bf9, 0x65047188, 0x3e46cfce,
- 0xf0000000, 0x3fe57c57, 0x842d58b8, 0x3e39b78c,
- 0xb0000000, 0x3fe58cad, 0x24c24bc9, 0x3e4735e6,
- 0x20000000, 0x3fe59cfb, 0xf7dd1adf, 0x3e47eba1,
- 0x40000000, 0x3fe5ad40, 0x59f65355, 0x3e586b3e,
- 0x30000000, 0x3fe5bd7d, 0x637f1b4d, 0x3e1ce38e,
- 0xd0000000, 0x3fe5cdb1, 0xc919edc7, 0x3e58d82e,
- 0x50000000, 0x3fe5ddde, 0x8ddcfa37, 0x3e4c5264,
- 0xa0000000, 0x3fe5ee02, 0xeae1ac12, 0x3e52482c,
- 0xd0000000, 0x3fe5fe1e, 0x311aba4f, 0x3e55a312,
- 0xf0000000, 0x3fe60e32, 0x6329f225, 0x3e411e23,
- 0xf0000000, 0x3fe61e3e, 0xcd2f246c, 0x3e5b48c8,
- 0xe0000000, 0x3fe62e42, 0xef35793c, 0x3e6efa39,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x40000000, 0x00000000, 0x00000000,
- 0x00000000, 0x3fffe000, 0xe01fe020, 0x3effe01f,
- 0x00000000, 0x3fffc000, 0x01fc07f0, 0x3f1fc07f,
- 0x00000000, 0x3fffa000, 0x1fa11caa, 0x3f31caa0,
- 0x00000000, 0x3fff8000, 0x1f81f820, 0x3f3f81f8,
- 0x00000000, 0x3fff6000, 0x06ddaba6, 0x3f488565,
- 0x00000000, 0x3fff4000, 0x2909c560, 0x3f519679,
- 0x00000000, 0x3fff2000, 0x8c2ad433, 0x3f57d910,
- 0x00000000, 0x3fff0000, 0xf07c1f08, 0x3f5f07c1,
- 0x00000000, 0x3ffee000, 0x8b1c03dd, 0x3f638ff0,
- 0x00000000, 0x3ffec000, 0x03d980f6, 0x3f680f66,
- 0x00000000, 0x3ffea000, 0x7403d5d0, 0x3f6d00f5,
- 0x00000000, 0x3ffe9000, 0x0b7672a0, 0x3f331abf,
- 0x00000000, 0x3ffe7000, 0x5d43919b, 0x3f506a96,
- 0x00000000, 0x3ffe5000, 0x0795ceb2, 0x3f5ceb24,
- 0x00000000, 0x3ffe3000, 0xb834e67f, 0x3f6522f3,
- 0x00000000, 0x3ffe1000, 0x3c3c3c3c, 0x3f6c3c3c,
- 0x00000000, 0x3ffe0000, 0x1e01e01e, 0x3f3e01e0,
- 0x00000000, 0x3ffde000, 0xe21a291c, 0x3f575b8f,
- 0x00000000, 0x3ffdc000, 0x403b9404, 0x3f6403b9,
- 0x00000000, 0x3ffda000, 0x7303b5cc, 0x3f6cc0ed,
- 0x00000000, 0x3ffd9000, 0xf3fc4da2, 0x3f479118,
- 0x00000000, 0x3ffd7000, 0xe0b0ce46, 0x3f5ed952,
- 0x00000000, 0x3ffd5000, 0xeae56404, 0x3f695900,
- 0x00000000, 0x3ffd4000, 0x1d41d41d, 0x3f3d41d4,
- 0x00000000, 0x3ffd2000, 0xf16c69ae, 0x3f5cb28f,
- 0x00000000, 0x3ffd0000, 0xdd80e866, 0x3f696b1e,
- 0x00000000, 0x3ffcf000, 0x25fe30d9, 0x3f4372e2,
- 0x00000000, 0x3ffcd000, 0x073615a2, 0x3f60ad12,
- 0x00000000, 0x3ffcb000, 0x0397cdb3, 0x3f6cdb2c,
- 0x00000000, 0x3ffca000, 0x7b864407, 0x3f52cc15,
- 0x00000000, 0x3ffc8000, 0xf7148404, 0x3f664cb5,
- 0x00000000, 0x3ffc7000, 0x1c71c71c, 0x3f3c71c7,
- 0x00000000, 0x3ffc5000, 0x1a930b84, 0x3f6129a2,
- 0x00000000, 0x3ffc3000, 0x87f1e038, 0x3f6f1e03,
- 0x00000000, 0x3ffc2000, 0xba80709b, 0x3f5ad4e4,
- 0x00000000, 0x3ffc0000, 0x0381c0e0, 0x3f6c0e07,
- 0x00000000, 0x3ffbf000, 0x1a362bb0, 0x3f560fba,
- 0x00000000, 0x3ffbd000, 0x280dee96, 0x3f6a5713,
- 0x00000000, 0x3ffbc000, 0x20f9ece9, 0x3f53f596,
- 0x00000000, 0x3ffba000, 0x83759f23, 0x3f69f229,
- 0x00000000, 0x3ffb9000, 0x63fc8d5c, 0x3f5478ac,
- 0x00000000, 0x3ffb7000, 0xb4671656, 0x3f6ad87b,
- 0x00000000, 0x3ffb6000, 0xfbb8148c, 0x3f578b8e,
- 0x00000000, 0x3ffb4000, 0xd0369d03, 0x3f6d0369,
- 0x00000000, 0x3ffb3000, 0x601b3748, 0x3f5d212b,
- 0x00000000, 0x3ffb2000, 0x406c80d9, 0x3f0b2036,
- 0x00000000, 0x3ffb0000, 0xb24547d1, 0x3f629663,
- 0x00000000, 0x3ffaf000, 0x0d79435e, 0x3f4435e5,
- 0x00000000, 0x3ffad000, 0x2920bc03, 0x3f67d0ff,
- 0x00000000, 0x3ffac000, 0x15c06b16, 0x3f55c06b,
- 0x00000000, 0x3ffaa000, 0x0fd7f954, 0x3f6e3a5f,
- 0x00000000, 0x3ffa9000, 0xd4c77b03, 0x3f61dec0,
- 0x00000000, 0x3ffa8000, 0x870ac52e, 0x3f473289,
- 0x00000000, 0x3ffa6000, 0xa034da03, 0x3f6a034d,
- 0x00000000, 0x3ffa5000, 0xa2292856, 0x3f5d041d,
- 0x00000000, 0x3ffa4000, 0x1a41a41a, 0x3f3a41a4,
- 0x00000000, 0x3ffa2000, 0x8a39409d, 0x3f68550f,
- 0x00000000, 0x3ffa1000, 0xe92c0686, 0x3f5b4fe5,
- 0x00000000, 0x3ffa0000, 0x1a01a01a, 0x3f3a01a0,
- 0x00000000, 0x3ff9e000, 0x2067b23a, 0x3f691d2a,
- 0x00000000, 0x3ff9d000, 0xada0b4e5, 0x3f5e7c5d,
- 0x00000000, 0x3ff9c000, 0x25080ce1, 0x3f468a77,
- 0x00000000, 0x3ff9a000, 0xaa21b490, 0x3f6c49d4,
- 0x00000000, 0x3ff99000, 0x33333333, 0x3f633333,
- 0x00000000, 0x3ff98000, 0x3b03fccf, 0x3f54bc36,
- 0x00000000, 0x3ff97000, 0x970e4f81, 0x3f2c9f01,
- 0x00000000, 0x3ff95000, 0xc6ef5b25, 0x3f697617,
- 0x00000000, 0x3ff94000, 0xadd3c0ca, 0x3f6161f9,
- 0x00000000, 0x3ff93000, 0x6cb39806, 0x3f5319fe,
- 0x00000000, 0x3ff92000, 0x1c451ab3, 0x3f2f693a,
- 0x00000000, 0x3ff90000, 0x0321a9e2, 0x3f6a9e24,
- 0x00000000, 0x3ff8f000, 0x3831f383, 0x3f63831f,
- 0x00000000, 0x3ff8e000, 0xc4dcfc1c, 0x3f5949eb,
- 0x00000000, 0x3ff8d000, 0x80c6980c, 0x3f480c69,
- 0x00000000, 0x3ff8b000, 0xc5fe7403, 0x3f6f9d00,
- 0x00000000, 0x3ff8a000, 0xd7e75347, 0x3f69721e,
- 0x00000000, 0x3ff89000, 0x0313381f, 0x3f6381ec,
- 0x00000000, 0x3ff88000, 0xaec12653, 0x3f5b97c2,
- 0x00000000, 0x3ff87000, 0x024ae3ba, 0x3f509ef3,
- 0x00000000, 0x3ff86000, 0x18618618, 0x3f386186,
- 0x00000000, 0x3ff84000, 0xf00c2780, 0x3f6e0184,
- 0x00000000, 0x3ff83000, 0x657dba52, 0x3f692ef5,
- 0x00000000, 0x3ff82000, 0x05494030, 0x3f649403,
- 0x00000000, 0x3ff81000, 0x30303030, 0x3f603030,
- 0x00000000, 0x3ff80000, 0x80601806, 0x3f580601,
- 0x00000000, 0x3ff7f000, 0x05fd017f, 0x3f5017f4,
- 0x00000000, 0x3ff7e000, 0xd278e8dd, 0x3f412a8a,
- 0x00000000, 0x3ff7d000, 0x417d05f4, 0x3f17d05f,
- 0x00000000, 0x3ff7b000, 0x5c02f7d6, 0x3f6d6724,
- 0x00000000, 0x3ff7a000, 0xc1d986a9, 0x3f6a4411,
- 0x00000000, 0x3ff79000, 0x6c7316df, 0x3f6754d7,
- 0x00000000, 0x3ff78000, 0xf149902f, 0x3f649902,
- 0x00000000, 0x3ff77000, 0x358c1a68, 0x3f621023,
- 0x00000000, 0x3ff76000, 0xd2a6c406, 0x3f5f7390,
- 0x00000000, 0x3ff75000, 0x05d5b2b1, 0x3f5b2b08,
- 0x00000000, 0x3ff74000, 0x745d1746, 0x3f5745d1,
- 0x00000000, 0x3ff73000, 0x07fa32c4, 0x3f53c315,
- 0x00000000, 0x3ff72000, 0x1b7af017, 0x3f50a1fd,
- 0x00000000, 0x3ff71000, 0xe3e0453a, 0x3f4bc36c,
- 0x00000000, 0x3ff70000, 0x5c0b8170, 0x3f4702e0,
- 0x00000000, 0x3ff6f000, 0x9300b793, 0x3f4300b7,
- 0x00000000, 0x3ff6e000, 0x337c6cb1, 0x3f3f76b4,
- 0x00000000, 0x3ff6d000, 0x1c860fb0, 0x3f3a6268,
- 0x00000000, 0x3ff6c000, 0x16c16c17, 0x3f36c16c,
- 0x00000000, 0x3ff6b000, 0x31a3cfc7, 0x3f3490aa,
- 0x00000000, 0x3ff6a000, 0x3729043e, 0x3f33cd15,
- 0x00000000, 0x3ff69000, 0x8d0bfd2e, 0x3f3473a8,
- 0x00000000, 0x3ff68000, 0x16816817, 0x3f368168,
- 0x00000000, 0x3ff67000, 0x16719f36, 0x3f39f360,
- 0x00000000, 0x3ff66000, 0x122f9016, 0x3f3ec6a5,
- 0x00000000, 0x3ff65000, 0xda5519cf, 0x3f427c29,
- 0x00000000, 0x3ff64000, 0x590b2164, 0x3f4642c8,
- 0x00000000, 0x3ff63000, 0x5606f00b, 0x3f4ab5c4,
- 0x00000000, 0x3ff62000, 0x0b11fd3c, 0x3f4fd3b8,
- 0x00000000, 0x3ff61000, 0xc6ba4eaa, 0x3f52cda0,
- 0x00000000, 0x3ff60000, 0x60581606, 0x3f560581,
- 0x00000000, 0x3ff5f000, 0xa4b7ef87, 0x3f5990d0,
- 0x00000000, 0x3ff5e000, 0x40579d6f, 0x3f5d6ee3,
- 0x00000000, 0x3ff5d000, 0xd9c54a69, 0x3f60cf87,
- 0x00000000, 0x3ff5c000, 0x2620ae4c, 0x3f631057,
- 0x00000000, 0x3ff5b000, 0x8ff522a2, 0x3f65798c,
- 0x00000000, 0x3ff5a000, 0x02b580ad, 0x3f680ad6,
- 0x00000000, 0x3ff59000, 0x4799546f, 0x3f6ac3e2,
- 0x00000000, 0x3ff58000, 0x02b1da46, 0x3f6da461,
- 0x00000000, 0x3ff58000, 0x01580560, 0x3f158056,
- 0x00000000, 0x3ff57000, 0x06b39a23, 0x3f3ed3c5,
- 0x00000000, 0x3ff56000, 0xe2970f60, 0x3f4cbdd3,
- 0x00000000, 0x3ff55000, 0x55555555, 0x3f555555,
- 0x00000000, 0x3ff54000, 0xee0bf805, 0x3f5c979a,
- 0x00000000, 0x3ff53000, 0xe81fd58e, 0x3f621291,
- 0x00000000, 0x3ff52000, 0x500a9580, 0x3f65fead,
- 0x00000000, 0x3ff51000, 0xc5f02a3a, 0x3f6a0fd5,
- 0x00000000, 0x3ff50000, 0x23898adc, 0x3f6e45c2,
- 0x00000000, 0x3ff50000, 0x15015015, 0x3f350150,
- 0x00000000, 0x3ff4f000, 0xea64d422, 0x3f4c7b16,
- 0x00000000, 0x3ff4e000, 0xbc14e5e1, 0x3f57829c,
- 0x00000000, 0x3ff4d000, 0xb8589720, 0x3f60877d,
- 0x00000000, 0x3ff4c000, 0x4b5edcea, 0x3f65710e,
- 0x00000000, 0x3ff4b000, 0x4d1fc1c8, 0x3f6a7dbb,
- 0x00000000, 0x3ff4a000, 0xa57eb503, 0x3f6fad40,
- 0x00000000, 0x3ff4a000, 0xb00a5140, 0x3f43fd6b,
- 0x00000000, 0x3ff49000, 0xcb419ba9, 0x3f54e78e,
- 0x00000000, 0x3ff48000, 0x029100a4, 0x3f600a44,
- 0x00000000, 0x3ff47000, 0x5c28f5c3, 0x3f65c28f,
- 0x00000000, 0x3ff46000, 0xb2c0cc4a, 0x3f6b9c68,
- 0x00000000, 0x3ff46000, 0xb9f34381, 0x3f2978fe,
- 0x00000000, 0x3ff45000, 0x3bb6500a, 0x3f4ecf16,
- 0x00000000, 0x3ff44000, 0x8b67ebb9, 0x3f5be195,
- 0x00000000, 0x3ff43000, 0x57dc9a3b, 0x3f644e61,
- 0x00000000, 0x3ff42000, 0xaa3f0ddf, 0x3f6acc4b,
- 0x00000000, 0x3ff42000, 0xcb2a247b, 0x3f26a4cb,
- 0x00000000, 0x3ff41000, 0x50505050, 0x3f505050,
- 0x00000000, 0x3ff40000, 0x39959819, 0x3f5e0b44,
- 0x00000000, 0x3ff3f000, 0x6027f602, 0x3f66027f,
- 0x00000000, 0x3ff3e000, 0x4b5e0db4, 0x3f6d1e85,
- 0x00000000, 0x3ff3e000, 0x254813e2, 0x3f4165e7,
- 0x00000000, 0x3ff3d000, 0xa9d716ef, 0x3f576646,
- 0x00000000, 0x3ff3c000, 0xf757ce88, 0x3f632b48,
- 0x00000000, 0x3ff3b000, 0x4652a906, 0x3f6ac1b2,
- 0x00000000, 0x3ff3b000, 0x13b13b14, 0x3f33b13b,
- 0x00000000, 0x3ff3a000, 0xeb208984, 0x3f5490e1,
- 0x00000000, 0x3ff39000, 0x30fec66e, 0x3f623858,
- 0x00000000, 0x3ff38000, 0xcc111b7e, 0x3f6a45a6,
- 0x00000000, 0x3ff38000, 0x13813814, 0x3f338138,
- 0x00000000, 0x3ff37000, 0x2517b708, 0x3f556f47,
- 0x00000000, 0x3ff36000, 0xbc0e8f2a, 0x3f631be7,
- 0x00000000, 0x3ff35000, 0x3e55f044, 0x3f6b9cbf,
- 0x00000000, 0x3ff35000, 0x5bc609a9, 0x3f40e7d9,
- 0x00000000, 0x3ff34000, 0x804d19e7, 0x3f59e6b3,
- 0x00000000, 0x3ff33000, 0xaf7963c2, 0x3f65c8b6,
- 0x00000000, 0x3ff32000, 0xd43bf402, 0x3f6eb9da,
- 0x00000000, 0x3ff32000, 0x5885fb37, 0x3f4f1a51,
- 0x00000000, 0x3ff31000, 0xd3d76c02, 0x3f60eeb1,
- 0x00000000, 0x3ff30000, 0x61a32026, 0x3f6a3202,
- 0x00000000, 0x3ff30000, 0x40260390, 0x3f3c82ac,
- 0x00000000, 0x3ff2f000, 0x84bda12f, 0x3f5a12f6,
- 0x00000000, 0x3ff2e000, 0xfda2962c, 0x3f669d43,
- 0x00000000, 0x3ff2e000, 0xc04b8097, 0x3f02e025,
- 0x00000000, 0x3ff2d000, 0xb542804b, 0x3f542804,
- 0x00000000, 0x3ff2c000, 0x02593f6a, 0x3f63f69b,
- 0x00000000, 0x3ff2b000, 0xb46e21fa, 0x3f6df31c,
- 0x00000000, 0x3ff2b000, 0x04ad012b, 0x3f5012b4,
- 0x00000000, 0x3ff2a000, 0xe7820a7f, 0x3f623925,
- 0x00000000, 0x3ff29000, 0xc8253c82, 0x3f6c8253,
- 0x00000000, 0x3ff29000, 0xc02526e5, 0x3f4b92dd,
- 0x00000000, 0x3ff28000, 0x11602511, 0x3f616025,
- 0x00000000, 0x3ff27000, 0x439c9adf, 0x3f6bf471,
- 0x00000000, 0x3ff27000, 0x0939a85c, 0x3f4a85c4,
- 0x00000000, 0x3ff26000, 0xac024d16, 0x3f6166f9,
- 0x00000000, 0x3ff25000, 0x0125e227, 0x3f6c44e1,
- 0x00000000, 0x3ff25000, 0x8bbd90e5, 0x3f4cebf4,
- 0x00000000, 0x3ff24000, 0x92492492, 0x3f624924,
- 0x00000000, 0x3ff23000, 0x2ec0b673, 0x3f6d6f2e,
- 0x00000000, 0x3ff23000, 0x6af37c05, 0x3f5159e2,
- 0x00000000, 0x3ff22000, 0x40245402, 0x3f640245,
- 0x00000000, 0x3ff21000, 0x43f6f024, 0x3f6f6f02,
- 0x00000000, 0x3ff21000, 0x21579805, 0x3f55e601,
- 0x00000000, 0x3ff20000, 0xcf81b10f, 0x3f668e18,
- 0x00000000, 0x3ff20000, 0x12012012, 0x3f320120,
- 0x00000000, 0x3ff1f000, 0x047dc11f, 0x3f5c11f7,
- 0x00000000, 0x3ff1e000, 0xff70985e, 0x3f69e878,
- 0x00000000, 0x3ff1e000, 0xfdc3a219, 0x3f4779d9,
- 0x00000000, 0x3ff1d000, 0x5c957907, 0x3f61eace,
- 0x00000000, 0x3ff1c000, 0x450239e1, 0x3f6e0d5b,
- 0x00000000, 0x3ff1c000, 0x73816367, 0x3f548bf0,
- 0x00000000, 0x3ff1b000, 0x8dda5202, 0x3f669480,
- 0x00000000, 0x3ff1b000, 0x2bae2b21, 0x3f37c67f,
- 0x00000000, 0x3ff1a000, 0x69ee5847, 0x3f5ee584,
- 0x00000000, 0x3ff19000, 0xc0233c02, 0x3f6c0233,
- 0x00000000, 0x3ff19000, 0x328a7012, 0x3f514e02,
- 0x00000000, 0x3ff18000, 0x2057b573, 0x3f656107,
- 0x00000000, 0x3ff18000, 0x11811812, 0x3f318118,
- 0x00000000, 0x3ff17000, 0x6f5a1060, 0x3f5e2864,
- 0x00000000, 0x3ff16000, 0x84e6f1d7, 0x3f6c0d12,
- 0x00000000, 0x3ff16000, 0xf0c80459, 0x3f523543,
- 0x00000000, 0x3ff15000, 0xea4e1a09, 0x3f663cbe,
- 0x00000000, 0x3ff15000, 0xdd5c8cb8, 0x3f3b9a3f,
- 0x00000000, 0x3ff14000, 0x159a76d2, 0x3f60be1c,
- 0x00000000, 0x3ff13000, 0x688e4838, 0x3f6e1d1a,
- 0x00000000, 0x3ff13000, 0xd72044d7, 0x3f572044,
- 0x00000000, 0x3ff12000, 0xdb81577b, 0x3f691713,
- 0x00000000, 0x3ff12000, 0xe9819b50, 0x3f4ac73a,
- 0x00000000, 0x3ff11000, 0x4e904cf6, 0x3f646033,
- 0x00000000, 0x3ff11000, 0x11111111, 0x3f311111,
- 0x00000000, 0x3ff10000, 0x0441fef0, 0x3f5feef8,
- 0x00000000, 0x3ff0f000, 0xfde021fe, 0x3f6de021,
- 0x00000000, 0x3ff0f000, 0xcc9686a0, 0x3f57b7ea,
- 0x00000000, 0x3ff0e000, 0xcd391fbc, 0x3f69ead7,
- 0x00000000, 0x3ff0e000, 0x09804390, 0x3f501956,
- 0x00000000, 0x3ff0d000, 0x1e8d2b32, 0x3f664151,
- 0x00000000, 0x3ff0d000, 0xacf1ce96, 0x3f4222b1,
- 0x00000000, 0x3ff0c000, 0x79b47582, 0x3f62e29f,
- 0x00000000, 0x3ff0c000, 0x682e11cd, 0x3f24f0d1,
- 0x00000000, 0x3ff0b000, 0x96771e4d, 0x3f5f9bb0,
- 0x00000000, 0x3ff0a000, 0x5dd96ae2, 0x3f6e5ee4,
- 0x00000000, 0x3ff0a000, 0xa0429a04, 0x3f5a0429,
- 0x00000000, 0x3ff09000, 0x5f06c021, 0x3f6bb74d,
- 0x00000000, 0x3ff09000, 0x04254fce, 0x3f54fce4,
- 0x00000000, 0x3ff08000, 0xeacbc402, 0x3f695766,
- 0x00000000, 0x3ff08000, 0x08421084, 0x3f508421,
- 0x00000000, 0x3ff07000, 0x71d5c338, 0x3f673e53,
- 0x00000000, 0x3ff07000, 0x3fbe3368, 0x3f493052,
- 0x00000000, 0x3ff06000, 0xf225f6c4, 0x3f656b38,
- 0x00000000, 0x3ff06000, 0x8d4fdf3b, 0x3f426e97,
- 0x00000000, 0x3ff05000, 0xe4eb0cc6, 0x3f63dd40,
- 0x00000000, 0x3ff05000, 0x73404146, 0x3f397f7d,
- 0x00000000, 0x3ff04000, 0x2cc98af1, 0x3f629398,
- 0x00000000, 0x3ff04000, 0x10410410, 0x3f304104,
- 0x00000000, 0x3ff03000, 0x048ff7e4, 0x3f618d6f,
- 0x00000000, 0x3ff03000, 0xebc349de, 0x3f2236a3,
- 0x00000000, 0x3ff02000, 0xee53d18c, 0x3f60c9f8,
- 0x00000000, 0x3ff02000, 0x81020408, 0x3f102040,
- 0x00000000, 0x3ff01000, 0xa2f46ea6, 0x3f60486c,
- 0x00000000, 0x3ff01000, 0x10101010, 0x3ef01010,
- 0x00000000, 0x3ff00000, 0x02010080, 0x3f600804,
- 0x00000000, 0x3ff00000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xc0000000, 0x3ff2cd9f, 0x096a0092, 0x3e513ae6,
- 0x60000000, 0x400d03cf, 0xfb79a640, 0x3e5db70c,
- 0xe0000000, 0x40240926, 0xb66dc067, 0x3e8c2526,
- 0x00000000, 0x403b4a38, 0x8647f380, 0x3e8b81b1,
- 0x60000000, 0x40528d01, 0xd1e1eb08, 0x3ebbc1cd,
- 0x28000000, 0x406936d2, 0x1534fb09, 0x3ecd9f20,
- 0x68000000, 0x40812287, 0x4a4e9954, 0x3edd1c06,
- 0x50000000, 0x409749ea, 0x5d06ea74, 0x3ed4eca6,
- 0x70000000, 0x40afa715, 0xbcc0ecc5, 0x3f00c259,
- 0xc8000000, 0x40c5829d, 0x47cf9016, 0x3f2b5a66,
- 0x88000000, 0x40dd3c44, 0xdefb0870, 0x3f09691a,
- 0x50000000, 0x40f3de16, 0xc29cde38, 0x3f53410f,
- 0x90000000, 0x410b00b5, 0x50b6fb3c, 0x3f46a31a,
- 0x48000000, 0x412259ac, 0x71805c40, 0x3f57defc,
- 0xa8000000, 0x4138f0cc, 0xd80e0bab, 0x3f9eb49f,
- 0xd0000000, 0x4150f2eb, 0x7bcd5920, 0x3f84fffc,
- 0x88000000, 0x41670934, 0xb6c63435, 0x3fc03a93,
- 0x08000000, 0x417f4f22, 0xb255fd1c, 0x3fb1940b,
- 0xf8000000, 0x419546d8, 0x14260b50, 0x3fded26e,
- 0x88000000, 0x41aceb08, 0x1fc9f2a2, 0x3ffb4740,
- 0xf8000000, 0x41c3a6e1, 0xf55634f1, 0x40267bb3,
- 0xb8000000, 0x41dab5ad, 0xf8194ddc, 0x401c435f,
- 0x30000000, 0x41f226af, 0x052ba63a, 0x404d8fee,
- 0xb0000000, 0x4208ab7f, 0xdccde3f6, 0x40651d7e,
- 0x90000000, 0x4220c3d3, 0x44557d1a, 0x40704b16,
- 0x68000000, 0x4236c932, 0xca0a9dc4, 0x4076a6b5,
- 0xf0000000, 0x424ef822, 0x72249aba, 0x40afd9cc,
- 0x30000000, 0x42650bba, 0x693edab5, 0x40ce58de,
- 0x40000000, 0x427c9aae, 0x58ac6363, 0x40d8c701,
- 0x08000000, 0x42937047, 0x64f43e20, 0x40e76147,
- 0x58000000, 0x42aa6b76, 0xb36fc718, 0x4106337d,
- 0xc8000000, 0x42c1f43f, 0xb1f611e2, 0x41212d98,
- 0x48000000, 0x42d866f3, 0x108b37cc, 0x412392bc,
- 0x28000000, 0x42f0953e, 0xdc3473dc, 0x415ce87b,
- 0x20000000, 0x430689e2, 0xae99ad14, 0x414bc8d5,
- 0xa0000000, 0x431ea215, 0x6744835c, 0x415d20d7,
- 0x00000000, 0x3ff00000, 0x00000000, 0x00000000,
- 0x50000000, 0x3ff8b075, 0x04c2bd28, 0x3e3d9f55,
- 0x08000000, 0x400e18fa, 0xf0a4c9fd, 0x3e67cb66,
- 0x90000000, 0x402422a4, 0x7928e588, 0x3e8f5861,
- 0x58000000, 0x403b4ee8, 0x00c38d48, 0x3e6bc7d0,
- 0xc8000000, 0x40528d6f, 0x4e329998, 0x3eaf7f9d,
- 0x78000000, 0x406936e6, 0x64885269, 0x3ec6e6e4,
- 0x48000000, 0x40812289, 0xb946c154, 0x3ecba3a8,
- 0xa8000000, 0x409749ea, 0x6110d5a4, 0x3ed3f4e7,
- 0x80000000, 0x40afa715, 0x515a3e2b, 0x3f017622,
- 0xd0000000, 0x40c5829d, 0x528af3d0, 0x3ee4dc4b,
- 0x88000000, 0x40dd3c44, 0x78615e10, 0x3f111562,
- 0x50000000, 0x40f3de16, 0x0ed821f5, 0x3f535ad5,
- 0x90000000, 0x410b00b5, 0x55f2935c, 0x3f46b610,
- 0x48000000, 0x412259ac, 0x4a601240, 0x3f57e279,
- 0xa8000000, 0x4138f0cc, 0x5f6aadd3, 0x3f9eb4b4,
- 0xd0000000, 0x4150f2eb, 0x967b3698, 0x3f85000b,
- 0x88000000, 0x41670934, 0x0fadc092, 0x3fc03a94,
- 0x08000000, 0x417f4f22, 0xf3bf874c, 0x3fb1940b,
- 0xf8000000, 0x419546d8, 0x1a2a2110, 0x3fded26e,
- 0x88000000, 0x41aceb08, 0x205796d6, 0x3ffb4740,
- 0xf8000000, 0x41c3a6e1, 0xf55cb85d, 0x40267bb3,
- 0xb8000000, 0x41dab5ad, 0xf81e18ac, 0x401c435f,
- 0x30000000, 0x41f226af, 0x052bdea4, 0x404d8fee,
- 0xb0000000, 0x4208ab7f, 0xdccde926, 0x40651d7e,
- 0x90000000, 0x4220c3d3, 0x44557e0e, 0x40704b16,
- 0x68000000, 0x4236c932, 0xca0a9e1c, 0x4076a6b5,
- 0xf0000000, 0x424ef822, 0x72249abe, 0x40afd9cc,
- 0x30000000, 0x42650bba, 0x693edab5, 0x40ce58de,
- 0x40000000, 0x427c9aae, 0x58ac6364, 0x40d8c701,
- 0x08000000, 0x42937047, 0x64f43e20, 0x40e76147,
- 0x58000000, 0x42aa6b76, 0xb36fc718, 0x4106337d,
- 0xc8000000, 0x42c1f43f, 0xb1f611e2, 0x41212d98,
- 0x48000000, 0x42d866f3, 0x108b37cc, 0x412392bc,
- 0x28000000, 0x42f0953e, 0xdc3473dc, 0x415ce87b,
- 0x20000000, 0x430689e2, 0xae99ad14, 0x414bc8d5,
- 0xa0000000, 0x431ea215, 0x6744835c, 0x415d20d7,
- 0x00000000, 0x40000000, 0xe01fe020, 0x3fffe01f,
- 0x01fc07f0, 0x3fffc07f, 0xaa01fa12, 0x3fffa11c,
- 0x1f81f820, 0x3fff81f8, 0xaca0dbb5, 0x3fff6310,
- 0x9e4a4271, 0x3fff4465, 0x44230ab5, 0x3fff25f6,
- 0xf07c1f08, 0x3fff07c1, 0xf8458e02, 0x3ffee9c7,
- 0xb301ecc0, 0x3ffecc07, 0x7aba01eb, 0x3ffeae80,
- 0xabf0b767, 0x3ffe9131, 0xa59750e4, 0x3ffe741a,
- 0xc901e574, 0x3ffe573a, 0x79dc1a73, 0x3ffe3a91,
- 0x1e1e1e1e, 0x3ffe1e1e, 0x1e01e01e, 0x3ffe01e0,
- 0xe3f8868a, 0x3ffde5d6, 0xdca01dca, 0x3ffdca01,
- 0x76b981db, 0x3ffdae60, 0x231e7f8a, 0x3ffd92f2,
- 0x54b82c34, 0x3ffd77b6, 0x807572b2, 0x3ffd5cac,
- 0x1d41d41d, 0x3ffd41d4, 0xa3fc5b1a, 0x3ffd272c,
- 0x8f6ec074, 0x3ffd0cb5, 0x5c44bfc6, 0x3ffcf26e,
- 0x89039b0b, 0x3ffcd856, 0x9601cbe7, 0x3ffcbe6d,
- 0x055ee191, 0x3ffca4b3, 0x5afb8a42, 0x3ffc8b26,
- 0x1c71c71c, 0x3ffc71c7, 0xd10d4986, 0x3ffc5894,
- 0x01c3f8f0, 0x3ffc3f8f, 0x392ea01c, 0x3ffc26b5,
- 0x0381c0e0, 0x3ffc0e07, 0xee868d8b, 0x3ffbf583,
- 0x899406f7, 0x3ffbdd2b, 0x65883e7b, 0x3ffbc4fd,
- 0x14c1bad0, 0x3ffbacf9, 0x2b18ff23, 0x3ffb951e,
- 0x3dda338b, 0x3ffb7d6c, 0xe3beee05, 0x3ffb65e2,
- 0xb4e81b4f, 0x3ffb4e81, 0x4ad806ce, 0x3ffb3748,
- 0x406c80d9, 0x3ffb2036, 0x31d922a4, 0x3ffb094b,
- 0xbca1af28, 0x3ffaf286, 0x7f94905e, 0x3ffadbe8,
- 0x1ac5701b, 0x3ffac570, 0x2f87ebfd, 0x3ffaaf1d,
- 0x606a63be, 0x3ffa98ef, 0x5130e159, 0x3ffa82e6,
- 0xa6d01a6d, 0x3ffa6d01, 0x07688a4a, 0x3ffa5741,
- 0x1a41a41a, 0x3ffa41a4, 0x87c51ca0, 0x3ffa2c2a,
- 0xf97a4b02, 0x3ffa16d3, 0x1a01a01a, 0x3ffa01a0,
- 0x951033d9, 0x3ff9ec8e, 0x176b682d, 0x3ff9d79f,
- 0x4ee4a102, 0x3ff9c2d1, 0xea5510da, 0x3ff9ae24,
- 0x9999999a, 0x3ff99999, 0x0d8ec0ff, 0x3ff9852f,
- 0xf80cb872, 0x3ff970e4, 0x0be377ae, 0x3ff95cbb,
- 0xfcd6e9e0, 0x3ff948b0, 0x7f9b2ce6, 0x3ff934c6,
- 0x49d0e229, 0x3ff920fb, 0x120190d5, 0x3ff90d4f,
- 0x8f9c18fa, 0x3ff8f9c1, 0x7af1373f, 0x3ff8e652,
- 0x8d3018d3, 0x3ff8d301, 0x8062ff3a, 0x3ff8bfce,
- 0x0f6bf3aa, 0x3ff8acb9, 0xf601899c, 0x3ff899c0,
- 0xf0abb04a, 0x3ff886e5, 0xbcc092b9, 0x3ff87427,
- 0x18618618, 0x3ff86186, 0xc2780614, 0x3ff84f00,
- 0x7ab2bedd, 0x3ff83c97, 0x0182a4a0, 0x3ff82a4a,
- 0x18181818, 0x3ff81818, 0x80601806, 0x3ff80601,
- 0xfd017f40, 0x3ff7f405, 0x515a4f1d, 0x3ff7e225,
- 0x417d05f4, 0x3ff7d05f, 0x922e017c, 0x3ff7beb3,
- 0x08e0ecc3, 0x3ff7ad22, 0x6bb6398b, 0x3ff79baa,
- 0x8178a4c8, 0x3ff78a4c, 0x119ac60d, 0x3ff77908,
- 0xe434a9b1, 0x3ff767dc, 0xc201756d, 0x3ff756ca,
- 0x745d1746, 0x3ff745d1, 0xc541fe8d, 0x3ff734f0,
- 0x7f46debc, 0x3ff72428, 0x6d9c7c09, 0x3ff71378,
- 0x5c0b8170, 0x3ff702e0, 0x16f26017, 0x3ff6f260,
- 0x6b4337c7, 0x3ff6e1f7, 0x2681c861, 0x3ff6d1a6,
- 0x16c16c17, 0x3ff6c16c, 0x0aa31a3d, 0x3ff6b149,
- 0xd1537290, 0x3ff6a13c, 0x3a88d0c0, 0x3ff69147,
- 0x16816817, 0x3ff68168, 0x3601671a, 0x3ff6719f,
- 0x6a5122f9, 0x3ff661ec, 0x853b4aa3, 0x3ff6524f,
- 0x590b2164, 0x3ff642c8, 0xb88ac0de, 0x3ff63356,
- 0x77016240, 0x3ff623fa, 0x6831ae94, 0x3ff614b3,
- 0x60581606, 0x3ff60581, 0x34292dfc, 0x3ff5f664,
- 0xb8d015e7, 0x3ff5e75b, 0xc3ece2a5, 0x3ff5d867,
- 0x2b931057, 0x3ff5c988, 0xc647fa91, 0x3ff5babc,
- 0x6b015ac0, 0x3ff5ac05, 0xf123ccaa, 0x3ff59d61,
- 0x308158ed, 0x3ff58ed2, 0x01580560, 0x3ff58056,
- 0x3c506b3a, 0x3ff571ed, 0xba7c52e2, 0x3ff56397,
- 0x55555555, 0x3ff55555, 0xe6bb82fe, 0x3ff54725,
- 0x48f40feb, 0x3ff53909, 0x56a8054b, 0x3ff52aff,
- 0xeae2f815, 0x3ff51d07, 0xe111c4c5, 0x3ff50f22,
- 0x15015015, 0x3ff50150, 0x62dd4c9b, 0x3ff4f38f,
- 0xa72f0539, 0x3ff4e5e0, 0xbedc2c4c, 0x3ff4d843,
- 0x8725af6e, 0x3ff4cab8, 0xdda68fe1, 0x3ff4bd3e,
- 0xa052bf5b, 0x3ff4afd6, 0xad76014a, 0x3ff4a27f,
- 0xe3b2d067, 0x3ff49539, 0x22014880, 0x3ff48805,
- 0x47ae147b, 0x3ff47ae1, 0x34596066, 0x3ff46dce,
- 0xc7f5cf9a, 0x3ff460cb, 0xe2c776ca, 0x3ff453d9,
- 0x6562d9fb, 0x3ff446f8, 0x30abee4d, 0x3ff43a27,
- 0x25d51f87, 0x3ff42d66, 0x265e5951, 0x3ff420b5,
- 0x14141414, 0x3ff41414, 0xd10e6566, 0x3ff40782,
- 0x3fb013fb, 0x3ff3fb01, 0x42a5af07, 0x3ff3ee8f,
- 0xbce4a902, 0x3ff3e22c, 0x91aa75c6, 0x3ff3d5d9,
- 0xa47babe7, 0x3ff3c995, 0xd9232955, 0x3ff3bd60,
- 0x13b13b14, 0x3ff3b13b, 0x387ac822, 0x3ff3a524,
- 0x2c187f63, 0x3ff3991c, 0xd366088e, 0x3ff38d22,
- 0x13813814, 0x3ff38138, 0xd1c945ee, 0x3ff3755b,
- 0xf3de0748, 0x3ff3698d, 0x5f9f2af8, 0x3ff35dce,
- 0xfb2b78c1, 0x3ff3521c, 0xace01346, 0x3ff34679,
- 0x5b57bcb2, 0x3ff33ae4, 0xed6a1dfa, 0x3ff32f5c,
- 0x4a2b10bf, 0x3ff323e3, 0x58e9ebb6, 0x3ff31877,
- 0x0130d190, 0x3ff30d19, 0x2ac40260, 0x3ff301c8,
- 0xbda12f68, 0x3ff2f684, 0xa1fed14b, 0x3ff2eb4e,
- 0xc04b8097, 0x3ff2e025, 0x012d50a0, 0x3ff2d50a,
- 0x4d812ca0, 0x3ff2c9fb, 0x8e5a3711, 0x3ff2bef9,
- 0xad012b40, 0x3ff2b404, 0x92f3c105, 0x3ff2a91c,
- 0x29e4129e, 0x3ff29e41, 0x5bb804a5, 0x3ff29372,
- 0x1288b013, 0x3ff288b0, 0x38a1ce4d, 0x3ff27dfa,
- 0xb8812735, 0x3ff27350, 0x7cd60127, 0x3ff268b3,
- 0x708092f1, 0x3ff25e22, 0x7e9177b2, 0x3ff2539d,
- 0x92492492, 0x3ff24924, 0x9717605b, 0x3ff23eb7,
- 0x789abcdf, 0x3ff23456, 0x22a0122a, 0x3ff22a01,
- 0x8121fb78, 0x3ff21fb7, 0x804855e6, 0x3ff21579,
- 0x0c67c0d9, 0x3ff20b47, 0x12012012, 0x3ff20120,
- 0x7dc11f70, 0x3ff1f704, 0x3c7fb84c, 0x3ff1ecf4,
- 0x3b3fb874, 0x3ff1e2ef, 0x672e4abd, 0x3ff1d8f5,
- 0xada2811d, 0x3ff1cf06, 0xfc1ce059, 0x3ff1c522,
- 0x4046ed29, 0x3ff1bb4a, 0x67f2bae3, 0x3ff1b17c,
- 0x611a7b96, 0x3ff1a7b9, 0x19e0119e, 0x3ff19e01,
- 0x808ca29c, 0x3ff19453, 0x83902bdb, 0x3ff18ab0,
- 0x11811812, 0x3ff18118, 0x191bd684, 0x3ff1778a,
- 0x89427379, 0x3ff16e06, 0x50fc3201, 0x3ff1648d,
- 0x5f75270d, 0x3ff15b1e, 0xa3fdd5c9, 0x3ff151b9,
- 0x0e0acd3b, 0x3ff1485f, 0x8d344724, 0x3ff13f0e,
- 0x1135c811, 0x3ff135c8, 0x89edc0ac, 0x3ff12c8b,
- 0xe75d3033, 0x3ff12358, 0x19a74826, 0x3ff11a30,
- 0x11111111, 0x3ff11111, 0xbe011080, 0x3ff107fb,
- 0x10fef011, 0x3ff0fef0, 0xfab325a2, 0x3ff0f5ed,
- 0x6be69c90, 0x3ff0ecf5, 0x55826011, 0x3ff0e406,
- 0xa88f4696, 0x3ff0db20, 0x56359e3a, 0x3ff0d244,
- 0x4fbcda3b, 0x3ff0c971, 0x868b4171, 0x3ff0c0a7,
- 0xec259dc8, 0x3ff0b7e6, 0x722eecb5, 0x3ff0af2f,
- 0x0a6810a7, 0x3ff0a681, 0xa6af8360, 0x3ff09ddb,
- 0x39010954, 0x3ff0953f, 0xb37565e2, 0x3ff08cab,
- 0x08421084, 0x3ff08421, 0x29b8eae2, 0x3ff07b9f,
- 0x0a47f7c6, 0x3ff07326, 0x9c7912fb, 0x3ff06ab5,
- 0xd2f1a9fc, 0x3ff0624d, 0xa0727586, 0x3ff059ee,
- 0xf7d73404, 0x3ff05197, 0xcc1664c5, 0x3ff04949,
- 0x10410410, 0x3ff04104, 0xb78247fc, 0x3ff038c6,
- 0xb51f5e1a, 0x3ff03091, 0xfc7729e9, 0x3ff02864,
- 0x81020408, 0x3ff02040, 0x36517a37, 0x3ff01824,
- 0x10101010, 0x3ff01010, 0x02010080, 0x3ff00804,
- 0x00000000, 0x3ff00000, 0x87ec3637, 0x3dd06139,
- 0x8db86d61, 0xbe138a4b, 0xe5bcc98d, 0x3e4f7b72,
- 0x634fb0e4, 0xbe85f1f0, 0x954a9137, 0x3ebb9df2,
- 0x3a67dc3c, 0xbeef4d1e, 0x1dd3898b, 0x3f1f9a32,
- 0x3db06d60, 0xbf4c02db, 0xd0dbc1ad, 0x3f7565bc,
- 0x31284e9c, 0xbf9b82ce, 0x1a042b32, 0x3fbce2f2,
- 0x6b0379e6, 0xbfd81274, 0x50429b6d, 0x3ff20dd7,
- 0x1438dcf6, 0x3dba1606, 0x016becfe, 0xbdff4342,
- 0x75b4cde8, 0x3e395b1b, 0xf9c2a481, 0xbe71d468,
- 0xb7a0966a, 0x3ea6ae6b, 0xfda1afb2, 0xbeda0df5,
- 0xd9475b18, 0x3f0ac250, 0xc8a35a21, 0xbf384227,
- 0xceb7b0e9, 0x3f631cd0, 0x054eefef, 0xbf89b3c1,
- 0xbc5785f9, 0x3facf6d2, 0x451254ef, 0xbfcb5db0,
- 0xa741088b, 0x3feaf767, 0x6a2dd61d, 0x3da4e37d,
- 0xe1edf74c, 0xbde92a56, 0x4377a2ac, 0x3e2491d9,
- 0x39f489a1, 0xbe5d38a6, 0x1dce54b4, 0x3e92d22f,
- 0xc5671218, 0xbec5f6c1, 0x3a1bb9bd, 0x3ef70561,
- 0x46c610de, 0xbf25712a, 0xbf0e3574, 0x3f518a17,
- 0xdb5a4b51, 0xbf78ea53, 0x50e230dd, 0x3f9e962f,
- 0x85d30895, 0xbfc0b60e, 0x95f8c2b3, 0x3fe5990d,
- 0x45479566, 0x3d90d511, 0x59127e17, 0xbdd4667c,
- 0x3e09cefe, 0x3e10d308, 0xa495656e, 0xbe482e4c,
- 0xa05c8f4f, 0x3e7f9bcf, 0x66933f59, 0xbeb2ca0d,
- 0xf3cce792, 0x3ee42cd2, 0x99c503dd, 0xbf136902,
- 0x532c5193, 0x3f409c2f, 0xdf44f35e, 0xbf6931da,
- 0x1aa68815, 0x3f911720, 0x1d221312, 0xbfb5e25e,
- 0xd6c7e25c, 0x3fe235fd, 0xc24c08dd, 0x3d7b51ef,
- 0x4c2104f1, 0xbdc0ab73, 0x866c02a1, 0x3dfbc79c,
- 0x72027ff7, 0xbe343c2f, 0x21752c63, 0x3e6ae853,
- 0x76229e21, 0xbea0593b, 0x32c6dda4, 0x3ed2106d,
- 0xf8633468, 0xbf020fd5, 0xc5ffc392, 0x3f304e0c,
- 0x0a3b61e7, 0xbf5ab23d, 0x9b1a01ca, 0x3f844016,
- 0x759a9c41, 0xbfae8712, 0x142795e3, 0x3fdfd9ae,
- 0xcee056b0, 0xbdf46eed, 0xbf31cd83, 0x3e272c71,
- 0x3414494b, 0xbe3b858c, 0x150492a9, 0xbe51e878,
- 0x4f9d39bd, 0xbe8d551c, 0x081cc18c, 0x3ec65597,
- 0x3a3f547c, 0x3ef0e91e, 0x5416a98f, 0xbf30c9b6,
- 0x4dfcdccd, 0x3f2428f4, 0xe4d81e00, 0x3f80b3bd,
- 0x46178bfd, 0xbf8cb801, 0x675394d2, 0xbfc946a9,
- 0x791dc8fb, 0x3fe6e23d, 0xd42d57ef, 0xbdb573c8,
- 0xed1a27a8, 0xbdf632bf, 0x6b1145de, 0x3e367087,
- 0xbdc2436d, 0x3e2d7559, 0xa688c6ab, 0xbe9801bb,
- 0xf4ea88f0, 0x3e8ad7ec, 0xf8bce95a, 0x3efc2cfa,
- 0x2fa996ef, 0xbf1f0bdd, 0x22b44655, 0xbf4a8a14,
- 0x66397f44, 0x3f7b13bf, 0xbd4c13b8, 0x3f82a08f,
- 0x7a57ce71, 0xbfc9ce0d, 0x517103fe, 0x3fe05fd2,
- 0x0e7c1431, 0x3dc14df8, 0xad2781f0, 0xbe00a71c,
- 0x333bdac6, 0x3e05e0fa, 0x8ecd3732, 0x3e62222b,
- 0x9d8f65fe, 0xbe84bcf8, 0xe8101ae5, 0xbec10eb4,
- 0xc2c15462, 0x3ef46afc, 0x0af95711, 0x3efded8b,
- 0x8fc77467, 0xbf50a3f2, 0x2397107c, 0x3f663734,
- 0x2190992e, 0x3f97d6f6, 0x75be54c3, 0xbfc56874,
- 0xacd147f5, 0x3fd4cb2b, 0x7100d5fc, 0x3db9806d,
- 0xc3b2ca73, 0xbdd1537c, 0x60cdaaa7, 0xbe26c0f4,
- 0x7eb23d7f, 0x3e5604f1, 0x4c3adb34, 0x3e7e86ae,
- 0x9b1fe971, 0xbec1b7ba, 0xc100d516, 0x3eceefdc,
- 0x7287d24a, 0x3f19c090, 0xf860db94, 0xbf4594c1,
- 0x906b63ac, 0xbf48ab6e, 0xabea8a44, 0x3f9a798f,
- 0x314c81f1, 0xbfbdca7c, 0x462cb19e, 0x3fc761d7,
- 0xaa177cb2, 0xbd902cf0, 0x207e29b4, 0x3decb11b,
- 0x5fac5489, 0xbe209b21, 0xb5bdf6e3, 0xbe32b95b,
- 0xca4c97b7, 0x3e882b27, 0xc0a47266, 0xbeaa520c,
- 0x67f1145d, 0xbedc5422, 0x3e7fc487, 0x3f161837,
- 0x7eb92091, 0xbf27130d, 0x8d1e6d3f, 0xbf63a37e,
- 0x8a1743b5, 0x3f9522fd, 0x334d0c36, 0xbfb1ada1,
- 0xae493c1d, 0x3fb741a2, 0x3f800000, 0x00000000,
- 0x3f804000, 0x3a28e585, 0x3f80a000, 0x399c910f,
- 0x3f80e000, 0x3a703484, 0x3f814000, 0x3a0eb4bc,
- 0x3f81a000, 0x392750df, 0x3f81e000, 0x3a419dc7,
- 0x3f824000, 0x39ac3801, 0x3f828000, 0x3a675948,
- 0x3f82e000, 0x39eabf9a, 0x3f834000, 0x356629d6,
- 0x3f838000, 0x3a07f04c, 0x3f83e000, 0x3848dac3,
- 0x3f842000, 0x3a0e1b17, 0x3f848000, 0x384a1cc7,
- 0x3f84c000, 0x3a082ade, 0x3f852000, 0x363f31e5,
- 0x3f856000, 0x39eccf0d, 0x3f85a000, 0x3a692c6f,
- 0x3f860000, 0x39b22cb1, 0x3f864000, 0x3a462d87,
- 0x3f86a000, 0x3941e864, 0x3f86e000, 0x3a180409,
- 0x3f872000, 0x3a7cd32d, 0x3f878000, 0x39bdde6c,
- 0x3f87c000, 0x3a3e5fb4, 0x3f882000, 0x38d960b3,
- 0x3f886000, 0x39eab752, 0x3f88a000, 0x3a4cf599,
- 0x3f890000, 0x390803d1, 0x3f894000, 0x39e90955,
- 0x3f898000, 0x3a44878c, 0x3f89e000, 0x38908271,
- 0x3f8a2000, 0x39ba4b0f, 0x3f8a6000, 0x3a25cdb3,
- 0x3f8aa000, 0x3a6c0f33, 0x3f8b0000, 0x393fc12e,
- 0x3f8b4000, 0x39e2ee51, 0x3f8b8000, 0x3a30a9dd,
- 0x3f8bc000, 0x3a6d8e61, 0x3f8c2000, 0x3920aa58,
- 0x3f8c6000, 0x39c1088a, 0x3f8ca000, 0x3a16a120,
- 0x3f8ce000, 0x3a4a86c1, 0x3f8d2000, 0x3a7c3aae,
- 0x3f8d8000, 0x392f0952, 0x3f8dc000, 0x39b2461c,
- 0x3f8e0000, 0x3a04621f, 0x3f8e4000, 0x3a2d84b8,
- 0x3f8e8000, 0x3a548ff4, 0x3f8ec000, 0x3a7988db,
- 0x3f8f2000, 0x38e3a30c, 0x3f8f6000, 0x39755daa,
- 0x3f8fa000, 0x39b86d8a, 0x3f8fe000, 0x39f22e5e,
- 0x3f902000, 0x3a13fd53, 0x3f906000, 0x3a2cedcc,
- 0x3f90a000, 0x3a43ed23, 0x3f90e000, 0x3a58ffd0,
- 0x3f912000, 0x3a6c2a3c, 0x3f916000, 0x3a7d70bf,
- 0x3f91c000, 0x384d7a06, 0x3f920000, 0x38d318cf,
- 0x3f924000, 0x39185d53, 0x3f928000, 0x393fe1b1,
- 0x3f92c000, 0x396029b1, 0x3f930000, 0x3979454c,
- 0x3f934000, 0x3985a221, 0x3f938000, 0x398b1b0d,
- 0x3f93c000, 0x398d1515, 0x3f940000, 0x398b97c7,
- 0x3f944000, 0x3986aa98, 0x3f948000, 0x397ca9c7,
- 0x3f94c000, 0x39653bd8, 0x3f950000, 0x394719b5,
- 0x3f954000, 0x39225182, 0x3f958000, 0x38ede264,
- 0x3f95c000, 0x388a0d15, 0x3f960000, 0x3749f226,
- 0x3f962000, 0x3a737219, 0x3f966000, 0x3a6223e3,
- 0x3f96a000, 0x3a4f406c, 0x3f96e000, 0x3a3acaee,
- 0x3f972000, 0x3a24c698, 0x3f976000, 0x3a0d368f,
- 0x3f97a000, 0x39e83bdd, 0x3f97e000, 0x39b2ff8f,
- 0x3f982000, 0x39757c89, 0x3f986000, 0x38fdf7dc,
- 0x3f98a000, 0x3622482d, 0x3f98c000, 0x3a600bf3,
- 0x3f990000, 0x3a3dfedf, 0x3f994000, 0x3a1a7de3,
- 0x3f998000, 0x39eb17a4, 0x3f99c000, 0x399e56e3,
- 0x3f9a0000, 0x391d7e03, 0x3f9a2000, 0x3a7e2ab7,
- 0x3f9a6000, 0x3a538fc2, 0x3f9aa000, 0x3a279148,
- 0x3f9ae000, 0x39f463ce, 0x3f9b2000, 0x3996e86c,
- 0x3f9b6000, 0x38dad617, 0x3f9b8000, 0x3a69e815,
- 0x3f9bc000, 0x3a371eac, 0x3f9c0000, 0x3a030100,
- 0x3f9c4000, 0x399b2304, 0x3f9c8000, 0x38b694db,
- 0x3f9ca000, 0x3a5ec6af, 0x3f9ce000, 0x3a257018,
- 0x3f9d2000, 0x39d5a259, 0x3f9d6000, 0x393bb0e7,
- 0x3f9d8000, 0x3a71c388, 0x3f9dc000, 0x3a335958,
- 0x3f9e0000, 0x39e75fcb, 0x3f9e4000, 0x394b2590,
- 0x3f9e6000, 0x3a70a802, 0x3f9ea000, 0x3a2d4de7,
- 0x3f9ee000, 0x39d17a6c, 0x3f9f2000, 0x390be02b,
- 0x3f9f4000, 0x3a5c007c, 0x3f9f8000, 0x3a13d899,
- 0x3f9fc000, 0x399504dc, 0x3fa00000, 0x00000000,
- 0x3fa02000, 0x3a34534e, 0x3fa06000, 0x39cefca8,
- 0x3fa0a000, 0x38cc1828, 0x3fa0c000, 0x3a4a6352,
- 0x3fa10000, 0x39f4424a, 0x3fa14000, 0x3922f98d,
- 0x3f214000, 0x38a2f98d, 0x3f4b2000, 0x397f529f,
- 0x3f800000, 0x00000000, 0x3fa14000, 0x3922f98d,
- 0x3fcb2000, 0x39ff529f, 0x3f800000, 0x00000000,
- 0x3f816000, 0x391a3e77, 0x3f82c000, 0x39d8698a,
- 0x3f842000, 0x3a51461d, 0x3f85a000, 0x39ac367c,
- 0x3f870000, 0x3a7b0cb4, 0x3f888000, 0x3a407404,
- 0x3f8a0000, 0x3a26abaa, 0x3f8b8000, 0x3a2e0f1f,
- 0x3f8d0000, 0x3a56fadb, 0x3f8ea000, 0x39073168,
- 0x3f902000, 0x3a0ee218, 0x3f91c000, 0x38f4dcea,
- 0x3f934000, 0x3a515978, 0x3f94e000, 0x3a277d47,
- 0x3f968000, 0x3a2169b9, 0x3f982000, 0x3a3f828c,
- 0x3f99e000, 0x370b2641, 0x3f9b8000, 0x39d39b9d,
- 0x3f9d2000, 0x3a76cd39, 0x3f9ee000, 0x3a299304,
- 0x3fa0a000, 0x3a02887d, 0x3fa26000, 0x3a021818,
- 0x3fa42000, 0x3a28ad70, 0x3fa5e000, 0x3a76b54d,
- 0x3fa7c000, 0x39d93b4e, 0x3fa9a000, 0x382d5a75,
- 0x3fab6000, 0x3a51cdad, 0x3fad4000, 0x3a41f752,
- 0x3faf2000, 0x3a5bc56b, 0x3fb12000, 0x38fd6074,
- 0x3fb30000, 0x3a0e2095, 0x3fb50000, 0x391e667f,
- 0x3fb6e000, 0x3a6c8f19, 0x3fb8e000, 0x3a5d7a3b,
- 0x3fbae000, 0x3a7ad590, 0x3fbd0000, 0x398a39f5,
- 0x3fbf0000, 0x3a3ccdb3, 0x3fc12000, 0x39c4cca6,
- 0x3fc34000, 0x39599b44, 0x3fc56000, 0x3965422a,
- 0x3fc78000, 0x39d74c8a, 0x3fc9a000, 0x3a4dec33,
- 0x3fcbe000, 0x39c14fef, 0x3fce2000, 0x391182a3,
- 0x3fd06000, 0x38ccf6bb, 0x3fd2a000, 0x3981d91f,
- 0x3fd4e000, 0x3a1ad55e, 0x3fd74000, 0x391f995a,
- 0x3fd98000, 0x3a68ae13, 0x3fdbe000, 0x3a5dbcbe,
- 0x3fde6000, 0x37f4825e, 0x3fe0c000, 0x39cdeec2,
- 0x3fe32000, 0x3a7c4b95, 0x3fe5a000, 0x3a48373b,
- 0x3fe82000, 0x3a4b5281, 0x3feac000, 0x37c6e7dd,
- 0x3fed4000, 0x39f301ed, 0x3fefe000, 0x3917337b,
- 0x3ff28000, 0x383b9e2c, 0x3ff52000, 0x392fa2a4,
- 0x3ff7c000, 0x3a06fb98, 0x3ffa8000, 0x38ecb6dc,
- 0x3ffd2000, 0x3a706067, 0x40000000, 0x00000000,
- 0x00000000, 0x00000000, 0x3c37c000, 0x374a16dd,
- 0x3cb70000, 0x37f2d0b8, 0x3d08c000, 0x381a3aa2,
- 0x3d35c000, 0x37b4dd63, 0x3d624000, 0x383f5721,
- 0x3d874000, 0x384e27e8, 0x3d9d4000, 0x380bf749,
- 0x3db30000, 0x387dbeb2, 0x3dc8c000, 0x37216e46,
- 0x3dde4000, 0x3684815b, 0x3df38000, 0x383b045f,
- 0x3e044000, 0x390b119b, 0x3e0ec000, 0x391a32ea,
- 0x3e194000, 0x38ba789e, 0x3e238000, 0x39553f30,
- 0x3e2e0000, 0x3651cfde, 0x3e380000, 0x39685a9d,
- 0x3e424000, 0x39057a05, 0x3e4c4000, 0x395ba0ef,
- 0x3e564000, 0x396bc5b6, 0x3e604000, 0x3936d9bb,
- 0x3e6a4000, 0x38772619, 0x3e740000, 0x39017ce9,
- 0x3e7dc000, 0x3902d720, 0x3e83c000, 0x38856dd8,
- 0x3e888000, 0x3941f6b4, 0x3e8d4000, 0x3980b652,
- 0x3e920000, 0x3980f561, 0x3e96c000, 0x39443f13,
- 0x3e9b8000, 0x38926752, 0x3ea00000, 0x39c8c763,
- 0x3ea4c000, 0x391e12f3, 0x3ea94000, 0x39b7bf89,
- 0x3eae0000, 0x36d1cfde, 0x3eb28000, 0x38c7f233,
- 0x3eb70000, 0x39087367, 0x3ebb8000, 0x38e95d3f,
- 0x3ec00000, 0x38256316, 0x3ec44000, 0x39d38e5c,
- 0x3ec8c000, 0x396ea247, 0x3ecd4000, 0x350e4788,
- 0x3ed18000, 0x395d829f, 0x3ed5c000, 0x39c30f2f,
- 0x3eda0000, 0x39fd7ee7, 0x3ede8000, 0x3872e9e7,
- 0x3ee2c000, 0x3897d694, 0x3ee70000, 0x3824923a,
- 0x3eeb0000, 0x39ea7c06, 0x3eef4000, 0x39a7fa88,
- 0x3ef38000, 0x391aa879, 0x3ef78000, 0x39dace65,
- 0x3efbc000, 0x39215a32, 0x3effc000, 0x39af3350,
- 0x3f01c000, 0x3a7b5172, 0x3f040000, 0x389cf27f,
- 0x3f060000, 0x3902806b, 0x3f080000, 0x3909d8a9,
- 0x3f0a0000, 0x38c9faa1, 0x3f0c0000, 0x37a33dca,
- 0x3f0dc000, 0x3a6623d2, 0x3f0fc000, 0x3a3c7a61,
- 0x3f11c000, 0x3a083a84, 0x3f13c000, 0x39930161,
- 0x3f15c000, 0x35d1cfde, 0x3f178000, 0x3a2d0ebd,
- 0x3f198000, 0x399f1aad, 0x3f1b4000, 0x3a67ff6d,
- 0x3f1d4000, 0x39ecfea8, 0x3f1f0000, 0x3a7b26f3,
- 0x3f210000, 0x39ec1fa6, 0x3f22c000, 0x3a675314,
- 0x3f24c000, 0x399e12f3, 0x3f268000, 0x3a2d4b66,
- 0x3f288000, 0x370c3845, 0x3f2a4000, 0x399ba329,
- 0x3f2c0000, 0x3a1044d3, 0x3f2dc000, 0x3a49a196,
- 0x3f2f8000, 0x3a79fe83, 0x3f318000, 0x3905c7aa,
- 0x3f334000, 0x39802391, 0x3f350000, 0x39abe796,
- 0x3f36c000, 0x39c65a9d, 0x3f388000, 0x39cfa6c5,
- 0x3f3a4000, 0x39c7f593, 0x3f3c0000, 0x39af6ff7,
- 0x3f3dc000, 0x39863e4d, 0x3f3f8000, 0x391910c1,
- 0x3f414000, 0x369d5be7, 0x3f42c000, 0x3a541616,
- 0x3f448000, 0x3a1ee960, 0x3f464000, 0x39c38ed2,
- 0x3f480000, 0x38e61600, 0x3f498000, 0x3a4fedb4,
- 0x3f4b4000, 0x39f6b4ab, 0x3f4d0000, 0x38f8d3b0,
- 0x3f4e8000, 0x3a3b3faa, 0x3f504000, 0x399fb693,
- 0x3f51c000, 0x3a5cfe71, 0x3f538000, 0x39c5740b,
- 0x3f550000, 0x3a611eb0, 0x3f56c000, 0x39b079c4,
- 0x3f584000, 0x3a4824d7, 0x3f5a0000, 0x39439a54,
- 0x3f5b8000, 0x3a1291ea, 0x3f5d0000, 0x3a6d3673,
- 0x3f5ec000, 0x3981c731, 0x3f604000, 0x3a0da88f,
- 0x3f61c000, 0x3a53945c, 0x3f638000, 0x3895ae91,
- 0x3f650000, 0x3996372a, 0x3f668000, 0x39f9a832,
- 0x3f680000, 0x3a27eda4, 0x3f698000, 0x3a4c764f,
- 0x3f6b0000, 0x3a6a7c06, 0x3f6cc000, 0x370321eb,
- 0x3f6e4000, 0x3899ab3f, 0x3f6fc000, 0x38f02086,
- 0x3f714000, 0x390a1707, 0x3f72c000, 0x39031e44,
- 0x3f744000, 0x38c6b362, 0x3f75c000, 0x382bf195,
- 0x3f770000, 0x3a768e36, 0x3f788000, 0x3a5c503b,
- 0x3f7a0000, 0x3a3c1179, 0x3f7b8000, 0x3a15de1d,
- 0x3f7d0000, 0x39d3845d, 0x3f7e8000, 0x395f263f,
- 0x3f800000, 0x00000000, 0x00000000, 0x00000000,
- 0x3b5d4000, 0x367a8e44, 0x3bdc8000, 0x368ed49f,
- 0x3c24c000, 0x36c21451, 0x3c5ac000, 0x375211d6,
- 0x3c884000, 0x3720ea11, 0x3ca2c000, 0x37e9eb59,
- 0x3cbd4000, 0x37b87be7, 0x3cd78000, 0x37bf2560,
- 0x3cf1c000, 0x33d597a0, 0x3d05c000, 0x37806a05,
- 0x3d128000, 0x3820581f, 0x3d1f4000, 0x38223334,
- 0x3d2c0000, 0x378e3bac, 0x3d388000, 0x3810684f,
- 0x3d450000, 0x37feb7ae, 0x3d518000, 0x36a9d609,
- 0x3d5dc000, 0x37a68163, 0x3d6a0000, 0x376a8b27,
- 0x3d760000, 0x384c8fd6, 0x3d810000, 0x3885183e,
- 0x3d870000, 0x3874a760, 0x3d8d0000, 0x380d1154,
- 0x3d92c000, 0x38ea42bd, 0x3d98c000, 0x384c1571,
- 0x3d9e8000, 0x38ba66b8, 0x3da44000, 0x38e7da3b,
- 0x3daa0000, 0x38eee632, 0x3dafc000, 0x38d00911,
- 0x3db58000, 0x388bbede, 0x3dbb4000, 0x378a0512,
- 0x3dc0c000, 0x3894c7a0, 0x3dc64000, 0x38e30710,
- 0x3dcc0000, 0x36db2829, 0x3dd18000, 0x3729d609,
- 0x3dd6c000, 0x38fa0e82, 0x3ddc4000, 0x38bc9a75,
- 0x3de1c000, 0x383a9297, 0x3de70000, 0x38dc83c8,
- 0x3dec8000, 0x37eac335, 0x3df1c000, 0x38706ac3,
- 0x3df70000, 0x389574c2, 0x3dfc4000, 0x3892d068,
- 0x3e00c000, 0x38615032, 0x3e034000, 0x3917acf4,
- 0x3e05c000, 0x3967a126, 0x3e088000, 0x38217840,
- 0x3e0b0000, 0x38b420ab, 0x3e0d8000, 0x38f9c7b2,
- 0x3e100000, 0x391103bd, 0x3e128000, 0x39169a6b,
- 0x3e150000, 0x390dd194, 0x3e178000, 0x38eda471,
- 0x3e1a0000, 0x38a38950, 0x3e1c8000, 0x37f6844a,
- 0x3e1ec000, 0x395e1cdb, 0x3e214000, 0x390fcffc,
- 0x3e23c000, 0x38503e9d, 0x3e260000, 0x394b00fd,
- 0x3e288000, 0x38a9910a, 0x3e2ac000, 0x39518a31,
- 0x3e2d4000, 0x3882d2c2, 0x3e2f8000, 0x392488e4,
- 0x3e31c000, 0x397b0aff, 0x3e344000, 0x388a22d8,
- 0x3e368000, 0x3902bd5e, 0x3e38c000, 0x39342f85,
- 0x3e3b0000, 0x39598811, 0x3e3d4000, 0x3972e6b1,
- 0x3e3fc000, 0x34d53654, 0x3e420000, 0x360ca25e,
- 0x3e440000, 0x39785cc0, 0x3e464000, 0x39630710,
- 0x3e488000, 0x39424ed7, 0x3e4ac000, 0x39165101,
- 0x3e4d0000, 0x38be5421, 0x3e4f4000, 0x37e7b0c0,
- 0x3e514000, 0x394fd0c3, 0x3e538000, 0x38efaaaa,
- 0x3e55c000, 0x37a8f566, 0x3e57c000, 0x3927c744,
- 0x3e5a0000, 0x383fa4d5, 0x3e5c0000, 0x392d9e39,
- 0x3e5e4000, 0x3803feae, 0x3e604000, 0x390a268c,
- 0x3e624000, 0x39692b80, 0x3e648000, 0x38789b4f,
- 0x3e668000, 0x3909307d, 0x3e688000, 0x394a601c,
- 0x3e6ac000, 0x35e67edc, 0x3e6cc000, 0x383e386d,
- 0x3e6ec000, 0x38a7743d, 0x3e70c000, 0x38dccec3,
- 0x3e72c000, 0x38ff57e0, 0x3e74c000, 0x39079d8b,
- 0x3e76c000, 0x390651a6, 0x3e78c000, 0x38f7bad9,
- 0x3e7ac000, 0x38d0ab82, 0x3e7cc000, 0x38979e7d,
- 0x3e7ec000, 0x381978ee, 0x3e804000, 0x397816c8,
- 0x3e814000, 0x39410cb2, 0x3e824000, 0x39015384,
- 0x3e834000, 0x3863fa28, 0x3e840000, 0x39f41065,
- 0x3e850000, 0x39c7668a, 0x3e860000, 0x39968afa,
- 0x3e870000, 0x39430db9, 0x3e880000, 0x38a18cf3,
- 0x3e88c000, 0x39eb2907, 0x3e89c000, 0x39a9e10c,
- 0x3e8ac000, 0x39492800, 0x3e8bc000, 0x385a53d1,
- 0x3e8c8000, 0x39ce0cf7, 0x3e8d8000, 0x3979c7b2,
- 0x3e8e8000, 0x389f5d99, 0x3e8f4000, 0x39ceefcb,
- 0x3e904000, 0x39646a39, 0x3e914000, 0x380d7a9b,
- 0x3e920000, 0x39ad6650, 0x3e930000, 0x390ac3b8,
- 0x3e93c000, 0x39d9a9a8, 0x3e94c000, 0x39548a99,
- 0x3e958000, 0x39f73c4b, 0x3e968000, 0x3980960e,
- 0x3e978000, 0x374b3d5a, 0x3e984000, 0x39888f1e,
- 0x3e994000, 0x37679a07, 0x3e9a0000, 0x39826a13,
- 0x00000000, 0x00000000, 0x3bff0000, 0x3429ac41,
- 0x3c7e0000, 0x35a8b0fc, 0x3cbdc000, 0x368d83ea,
- 0x3cfc1000, 0x361b0e78, 0x3d1cf000, 0x3687b9fe,
- 0x3d3ba000, 0x3631ec65, 0x3d5a1000, 0x36dd7119,
- 0x3d785000, 0x35c30045, 0x3d8b2000, 0x379b7751,
- 0x3d9a0000, 0x37ebcb0d, 0x3da8d000, 0x37839f83,
- 0x3db78000, 0x37528ae5, 0x3dc61000, 0x37a2eb18,
- 0x3dd49000, 0x36da7495, 0x3de2f000, 0x36a91eb7,
- 0x3df13000, 0x3783b715, 0x3dff6000, 0x371131db,
- 0x3e06b000, 0x383f3e68, 0x3e0db000, 0x38156a97,
- 0x3e14a000, 0x38297c0f, 0x3e1b8000, 0x387e100f,
- 0x3e226000, 0x3815b665, 0x3e293000, 0x37e5e3a1,
- 0x3e2ff000, 0x38183853, 0x3e36b000, 0x35fe719d,
- 0x3e3d5000, 0x38448108, 0x3e43f000, 0x38503290,
- 0x3e4a9000, 0x373539e8, 0x3e511000, 0x385e0ff1,
- 0x3e579000, 0x3864a740, 0x3e5e1000, 0x3786742d,
- 0x3e647000, 0x387be3cd, 0x3e6ae000, 0x3685ad3e,
- 0x3e713000, 0x3803b715, 0x3e778000, 0x37adcbdc,
- 0x3e7dc000, 0x380c36af, 0x3e820000, 0x371652d3,
- 0x3e851000, 0x38927139, 0x3e882000, 0x38c5fcd7,
- 0x3e8b3000, 0x38ae55d5, 0x3e8e4000, 0x3818c169,
- 0x3e914000, 0x38a0fde7, 0x3e944000, 0x38ad09ef,
- 0x3e974000, 0x3862bae1, 0x3e9a3000, 0x38eecd4c,
- 0x3e9d3000, 0x3798aad2, 0x3ea02000, 0x37421a1a,
- 0x3ea30000, 0x38c5e10e, 0x3ea5f000, 0x37bf2aee,
- 0x3ea8d000, 0x382d872d, 0x3eabb000, 0x37ee2e8a,
- 0x3eae8000, 0x38dedfac, 0x3eb16000, 0x3802f2b9,
- 0x3eb43000, 0x38481e9b, 0x3eb70000, 0x380eaa2b,
- 0x3eb9c000, 0x38ebfb5d, 0x3ebc9000, 0x38255fdd,
- 0x3ebf5000, 0x38783b82, 0x3ec21000, 0x3851da1e,
- 0x3ec4d000, 0x374e1b05, 0x3ec78000, 0x388f439b,
- 0x3eca3000, 0x38ca0e10, 0x3ecce000, 0x38cac08b,
- 0x3ecf9000, 0x3891f65f, 0x3ed24000, 0x378121cb,
- 0x3ed4e000, 0x386c9a9a, 0x3ed78000, 0x38949923,
- 0x3eda2000, 0x38777bcc, 0x3edcc000, 0x37b12d26,
- 0x3edf5000, 0x38a6ced3, 0x3ee1e000, 0x38ebd3e6,
- 0x3ee47000, 0x38fbe3cd, 0x3ee70000, 0x38d785c2,
- 0x3ee99000, 0x387e7e00, 0x3eec1000, 0x38f392c5,
- 0x3eeea000, 0x37d40983, 0x3ef12000, 0x38081a7c,
- 0x3ef3a000, 0x3784c3ad, 0x3ef61000, 0x38cce923,
- 0x3ef89000, 0x380f5faf, 0x3efb0000, 0x3891fd38,
- 0x3efd7000, 0x38ac47bc, 0x3effe000, 0x3897042b,
- 0x3f012000, 0x392952d2, 0x3f025000, 0x396fced4,
- 0x3f039000, 0x37f97073, 0x3f04c000, 0x385e9eae,
- 0x3f05f000, 0x3865c84a, 0x3f072000, 0x38130ba3,
- 0x3f084000, 0x3979cf16, 0x3f097000, 0x3938cac9,
- 0x3f0aa000, 0x38c3d2f4, 0x3f0bc000, 0x39755dec,
- 0x3f0cf000, 0x38e6b467, 0x3f0e1000, 0x395c0fb8,
- 0x3f0f4000, 0x383ebce0, 0x3f106000, 0x38dcd192,
- 0x3f118000, 0x39186bdf, 0x3f12a000, 0x392de74c,
- 0x3f13c000, 0x392f0944, 0x3f14e000, 0x391bff61,
- 0x3f160000, 0x38e9ed44, 0x3f172000, 0x38686dc8,
- 0x3f183000, 0x396b99a7, 0x3f195000, 0x39099c89,
- 0x3f1a7000, 0x37a27673, 0x3f1b8000, 0x390bdaa3,
- 0x3f1c9000, 0x397069ab, 0x3f1db000, 0x388449ff,
- 0x3f1ec000, 0x39013538, 0x3f1fd000, 0x392dc268,
- 0x3f20e000, 0x3947f423, 0x3f21f000, 0x394ff17c,
- 0x3f230000, 0x3945e10e, 0x3f241000, 0x3929e8f5,
- 0x3f252000, 0x38f85db0, 0x3f263000, 0x38735f99,
- 0x3f273000, 0x396c08db, 0x3f284000, 0x3909e600,
- 0x3f295000, 0x37b4996f, 0x3f2a5000, 0x391233cc,
- 0x3f2b5000, 0x397cead9, 0x3f2c6000, 0x38adb5cd,
- 0x3f2d6000, 0x3920261a, 0x3f2e6000, 0x3958ee36,
- 0x3f2f7000, 0x35aa4905, 0x3f307000, 0x37cbd11e,
- 0x3f317000, 0x3805fdf4, 0x40000000, 0x00000000,
- 0x3ffe0000, 0x38fe03f8, 0x3ffc0000, 0x39fc0fc1,
- 0x3ffa0000, 0x3a8cb3c9, 0x3ff80000, 0x3af83e10,
- 0x3ff60000, 0x3b407b30, 0x3ff40000, 0x3b898d60,
- 0x3ff20000, 0x3bb9d648, 0x3ff00000, 0x3bf0f0f1,
- 0x3fef0000, 0x3abadc7f, 0x3fed0000, 0x3b66076c,
- 0x3feb0000, 0x3bbdb2a6, 0x3fea0000, 0x39ea0ea1,
- 0x3fe80000, 0x3b4b58f7, 0x3fe60000, 0x3bc2b448,
- 0x3fe50000, 0x3a9660ac, 0x3fe30000, 0x3b8e38e4,
- 0x3fe10000, 0x3bfc780e, 0x3fe00000, 0x3b607038,
- 0x3fde0000, 0x3be95c4d, 0x3fdd0000, 0x3b4f914c,
- 0x3fdb0000, 0x3beb61ef, 0x3fda0000, 0x3b681b4f,
- 0x3fd90000, 0x385901b2, 0x3fd70000, 0x3b9435e5,
- 0x3fd60000, 0x3aae0359, 0x3fd40000, 0x3bc77b03,
- 0x3fd30000, 0x3b501a6d, 0x3fd20000, 0x39d20d21,
- 0x3fd00000, 0x3bb69fcc, 0x3fcf0000, 0x3b48e951,
- 0x3fce0000, 0x3a3453b9, 0x3fcc0000, 0x3bcccccd,
- 0x3fcb0000, 0x3b8727c0, 0x3fca0000, 0x3b0b0fcd,
- 0x3fc90000, 0x397b49d1, 0x3fc70000, 0x3bce0c7d,
- 0x3fc60000, 0x3b980c6a, 0x3fc50000, 0x3b4b90f7,
- 0x3fc40000, 0x3adcbe15, 0x3fc30000, 0x39c30c31,
- 0x3fc10000, 0x3be4bbd6, 0x3fc00000, 0x3bc0c0c1,
- 0x3fbf0000, 0x3ba02fe8, 0x3fbe0000, 0x3b82fa0c,
- 0x3fbd0000, 0x3b52208e, 0x3fbc0000, 0x3b24c818,
- 0x3fbb0000, 0x3afb9c87, 0x3fba0000, 0x3aba2e8c,
- 0x3fb90000, 0x3a850fe9, 0x3fb80000, 0x3a381703,
- 0x3fb70000, 0x39fbb5a2, 0x3fb60000, 0x39b60b61,
- 0x3fb50000, 0x399e68aa, 0x3fb40000, 0x39b40b41,
- 0x3fb30000, 0x39f63529, 0x3fb20000, 0x3a321643,
- 0x3fb10000, 0x3a7e9dc0, 0x3fb00000, 0x3ab02c0b,
- 0x3faf0000, 0x3aeb771a, 0x3fae0000, 0x3b1882b9,
- 0x3fad0000, 0x3b4056b0, 0x3fac0000, 0x3b6d2308,
- 0x3fab0000, 0x3b8f69e3, 0x3faa0000, 0x3baaaaab,
- 0x3fa90000, 0x3bc84a48, 0x3fa80000, 0x3be83f57,
- 0x3fa80000, 0x39a80a81, 0x3fa70000, 0x3abc14e6,
- 0x3fa60000, 0x3b2b8872, 0x3fa50000, 0x3b7d6a05,
- 0x3fa40000, 0x3ba9cf1e, 0x3fa30000, 0x3bd70a3d,
- 0x3fa30000, 0x394bc7f6, 0x3fa20000, 0x3adf0cac,
- 0x3fa10000, 0x3b56625d, 0x3fa00000, 0x3ba0a0a1,
- 0x3f9f0000, 0x3bd809fe, 0x3f9f0000, 0x3a0b2f39,
- 0x3f9e0000, 0x3b195a48, 0x3f9d0000, 0x3b89d89e,
- 0x3f9c0000, 0x3bc8e161, 0x3f9c0000, 0x399c09c1,
- 0x3f9b0000, 0x3b18df3e, 0x3f9a0000, 0x3b90e7d9,
- 0x3f990000, 0x3bd722db, 0x3f990000, 0x3a78d28b,
- 0x3f980000, 0x3b519013, 0x3f970000, 0x3bb425ed,
- 0x3f970000, 0x3817012e, 0x3f960000, 0x3b1fb4d8,
- 0x3f950000, 0x3ba02568, 0x3f940000, 0x3bf2094f,
- 0x3f940000, 0x3b0b0129, 0x3f930000, 0x3b9a85c4,
- 0x3f920000, 0x3bf11384, 0x3f920000, 0x3b124925,
- 0x3f910000, 0x3ba2b3c5, 0x3f900000, 0x3bfdbc09,
- 0x3f900000, 0x3b3470c6, 0x3f8f0000, 0x3bb823ee,
- 0x3f8f0000, 0x3a3bced0, 0x3f8e0000, 0x3b706ada,
- 0x3f8d0000, 0x3bda5202, 0x3f8d0000, 0x3af72c23,
- 0x3f8c0000, 0x3ba29c04, 0x3f8c0000, 0x398c08c1,
- 0x3f8b0000, 0x3b606894, 0x3f8a0000, 0x3bd8f2fc,
- 0x3f8a0000, 0x3b05f0e1, 0x3f890000, 0x3bae408a,
- 0x3f890000, 0x3a5639d7, 0x3f880000, 0x3b888889,
- 0x3f870000, 0x3bf78088, 0x3f870000, 0x3b4f56be,
- 0x3f860000, 0x3bd90544, 0x3f860000, 0x3b1714fc,
- 0x3f850000, 0x3bbf3761, 0x3f850000, 0x3ad0214d,
- 0x3f840000, 0x3ba9f9c8, 0x3f840000, 0x3a842108,
- 0x3f830000, 0x3b993052, 0x3f830000, 0x3a1374bc,
- 0x3f820000, 0x3b8cbfbf, 0x3f820000, 0x39820821,
- 0x3f810000, 0x3b848da9, 0x3f810000, 0x38810204,
- 0x3f800000, 0x3b808081, 0x3f800000, 0x00000000,
- 0x00000000, 0x3f800000, 0x3f966cfe, 0x3fc583ab,
- 0x40681e7b, 0x4070c7d0, 0x41204937, 0x41211525,
- 0x41da51c0, 0x41da7743, 0x4294680b, 0x42946b7e,
- 0x4349b691, 0x4349b734, 0x4409143b, 0x4409144a,
- 0x44ba4f53, 0x44ba4f55, 0x457d38ac, 0x457d38ac,
- 0x462c14ee, 0x462c14ef, 0x46e9e224, 0x46e9e224,
- 0x479ef0b3, 0x479ef0b3, 0x485805ad, 0x485805ad,
- 0x4912cd62, 0x4912cd62, 0x49c78665, 0x49c78665,
- 0x4a87975f, 0x4a87975f, 0x4b3849a4, 0x4b3849a4,
- 0x4bfa7910, 0x4bfa7910, 0x4caa36c8, 0x4caa36c8,
- 0x4d675844, 0x4d675844, 0x4e1d3710, 0x4e1d3710,
- 0x4ed5ad6e, 0x4ed5ad6e, 0x4f91357a, 0x4f91357a,
- 0x50455bfe, 0x50455bfe, 0x51061e9d, 0x51061e9d,
- 0x51b64993, 0x51b64993, 0x5277c118, 0x5277c118,
- 0x53285dd2, 0x53285dd2, 0x53e4d572, 0x53e4d572,
- 0x549b8238, 0x549b8238, 0x55535bb3, 0x55535bb3,
- 0x560fa1fe, 0x560fa1fe, 0x56c3379a, 0x56c3379a,
- 0x5784a9f1, 0x5784a9f1, 0x58344f11, 0x58344f11,
- 0x58f510ad, 0x58f510ad, 0x3d7faade, 0x3d87ccf5,
- 0x3d8fc36e, 0x3d97b8ca, 0x3d9facf8, 0x3da79feb,
- 0x3daf9192, 0x3db781df, 0x3dbf70c1, 0x3dc75e2a,
- 0x3dcf4a0b, 0x3dd73454, 0x3ddf1cf6, 0x3de703e3,
- 0x3deee90c, 0x3df6cc61, 0x3dfeadd5, 0x3e0346ac,
- 0x3e07356e, 0x3e0b232a, 0x3e0f0fd8, 0x3e12fb71,
- 0x3e16e5ee, 0x3e1acf47, 0x3e1eb777, 0x3e229e76,
- 0x3e26843d, 0x3e2a68c6, 0x3e2e4c09, 0x3e322e00,
- 0x3e360ea4, 0x3e39edef, 0x3e3dcbda, 0x3e41a85f,
- 0x3e458377, 0x3e495d1c, 0x3e4d3547, 0x3e510bf3,
- 0x3e54e119, 0x3e58b4b3, 0x3e5c86bb, 0x3e60572a,
- 0x3e6425fc, 0x3e67f32a, 0x3e6bbeaf, 0x3e6f8884,
- 0x3e7350a4, 0x3e77170a, 0x3e7adbb0, 0x3e7e9e90,
- 0x3e812fd3, 0x3e830f75, 0x3e84ee2d, 0x3e86cbf7,
- 0x3e88a8d2, 0x3e8a84ba, 0x3e8c5fad, 0x3e8e39a9,
- 0x3e9012ab, 0x3e91eab1, 0x3e93c1b9, 0x3e9597c0,
- 0x3e976cc4, 0x3e9940c2, 0x3e9b13ba, 0x3e9ce5a7,
- 0x3e9eb689, 0x3ea0865d, 0x3ea25522, 0x3ea422d4,
- 0x3ea5ef73, 0x3ea7bafc, 0x3ea9856d, 0x3eab4ec4,
- 0x3ead1701, 0x3eaede20, 0x3eb0a420, 0x3eb26900,
- 0x3eb42cbd, 0x3eb5ef56, 0x3eb7b0ca, 0x3eb97117,
- 0x3ebb303b, 0x3ebcee34, 0x3ebeab02, 0x3ec066a3,
- 0x3ec22116, 0x3ec3da58, 0x3ec5926a, 0x3ec74949,
- 0x3ec8fef4, 0x3ecab36a, 0x3ecc66aa, 0x3ece18b3,
- 0x3ecfc983, 0x3ed1791a, 0x3ed32776, 0x3ed4d497,
- 0x3ed6807b, 0x3ed82b21, 0x3ed9d489, 0x3edb7cb1,
- 0x3edd239a, 0x3edec941, 0x3ee06da6, 0x3ee210c9,
- 0x3ee3b2a8, 0x3ee55344, 0x3ee6f29a, 0x3ee890ab,
- 0x3eea2d76, 0x3eebc8fb, 0x3eed6338, 0x3eeefc2e,
- 0x3ef093db, 0x3ef22a40, 0x3ef3bf5c, 0x3ef5532e,
- 0x3ef6e5b7, 0x3ef876f5, 0x3efa06e8, 0x3efb9591,
- 0x3efd22ef, 0x3efeaf01, 0x3f001ce4, 0x3f00e1a1,
- 0x3f01a5b8, 0x3f02692a, 0x3f032bf5, 0x3f03ee1a,
- 0x3f04af98, 0x3f057071, 0x3f0630a3, 0x3f06f02f,
- 0x3f07af14, 0x3f086d54, 0x3f092aed, 0x3f09e7e0,
- 0x3f0aa42d, 0x3f0b5fd3, 0x3f0c1ad4, 0x3f0cd52f,
- 0x3f0d8ee4, 0x3f0e47f4, 0x3f0f005d, 0x3f0fb822,
- 0x3f106f41, 0x3f1125ba, 0x3f11db8f, 0x3f1290bf,
- 0x3f13454a, 0x3f13f931, 0x3f14ac73, 0x3f155f11,
- 0x3f16110b, 0x3f16c261, 0x3f177314, 0x3f182324,
- 0x3f18d290, 0x3f19815a, 0x3f1a2f81, 0x3f1add06,
- 0x3f1b89e8, 0x3f1c3629, 0x3f1ce1c9, 0x3f1d8cc7,
- 0x3f1e3725, 0x3f1ee0e1, 0x3f1f89fe, 0x3f20327a,
- 0x3f20da57, 0x3f218194, 0x3f222833, 0x3f22ce33,
- 0x3f237394, 0x3f241857, 0x3f24bc7d, 0x3f256006,
- 0x3f2602f1, 0x3f26a540, 0x3f2746f3, 0x3f27e80a,
- 0x3f288885, 0x3f292866, 0x3f29c7ac, 0x3f2a6658,
- 0x3f2b0469, 0x3f2ba1e2, 0x3f2c3ec1, 0x3f2cdb08,
- 0x3f2d76b6, 0x3f2e11cd, 0x3f2eac4c, 0x3f2f4635,
- 0x3f2fdf87, 0x3f307842, 0x3f311069, 0x3f31a7fa,
- 0x3f323ef6, 0x3f32d55e, 0x3f336b32, 0x3f340072,
- 0x3f349520, 0x3f35293b, 0x3f35bcc5, 0x3f364fbc,
- 0x3f36e223, 0x3f3773f9, 0x3f38053e, 0x3f3895f4,
- 0x3f39261b, 0x3f39b5b3, 0x3f3a44bc, 0x3f3ad338,
- 0x3f3b6127, 0x3f3bee89, 0x3f3c7b5e, 0x3f3d07a7,
- 0x3f3d9365, 0x3f3e1e99, 0x3f3ea941, 0x3f3f3360,
- 0x3f3fbcf5, 0x3f404602, 0x3f40ce86, 0x3f415682,
- 0x3f41ddf6, 0x3f4264e4, 0x3f42eb4b, 0x3f43712c,
- 0x3f43f687, 0x3f447b5e, 0x3f44ffb0, 0x3f45837e,
- 0x3f4606c9, 0x3f468990, 0x3f470bd5, 0x3f478d98,
- 0x3f480eda, 0x3f488f9b, 0x3f490fdb, 0x3f800000,
- 0x3f8164d2, 0x3f82cd87, 0x3f843a29, 0x3f85aac3,
- 0x3f871f62, 0x3f88980f, 0x3f8a14d5, 0x3f8b95c2,
- 0x3f8d1adf, 0x3f8ea43a, 0x3f9031dc, 0x3f91c3d3,
- 0x3f935a2b, 0x3f94f4f0, 0x3f96942d, 0x3f9837f0,
- 0x3f99e046, 0x3f9b8d3a, 0x3f9d3eda, 0x3f9ef532,
- 0x3fa0b051, 0x3fa27043, 0x3fa43516, 0x3fa5fed7,
- 0x3fa7cd94, 0x3fa9a15b, 0x3fab7a3a, 0x3fad583f,
- 0x3faf3b79, 0x3fb123f6, 0x3fb311c4, 0x3fb504f3,
- 0x3fb6fd92, 0x3fb8fbaf, 0x3fbaff5b, 0x3fbd08a4,
- 0x3fbf179a, 0x3fc12c4d, 0x3fc346cd, 0x3fc5672a,
- 0x3fc78d75, 0x3fc9b9be, 0x3fcbec15, 0x3fce248c,
- 0x3fd06334, 0x3fd2a81e, 0x3fd4f35b, 0x3fd744fd,
- 0x3fd99d16, 0x3fdbfbb8, 0x3fde60f5, 0x3fe0ccdf,
- 0x3fe33f89, 0x3fe5b907, 0x3fe8396a, 0x3feac0c7,
- 0x3fed4f30, 0x3fefe4ba, 0x3ff28177, 0x3ff5257d,
- 0x3ff7d0df, 0x3ffa83b3, 0x3ffd3e0c, 0x40000000,
- 0x40000000, 0x3ffe03f8, 0x3ffc0fc1, 0x3ffa232d,
- 0x3ff83e10, 0x3ff6603e, 0x3ff4898d, 0x3ff2b9d6,
- 0x3ff0f0f1, 0x3fef2eb7, 0x3fed7304, 0x3febbdb3,
- 0x3fea0ea1, 0x3fe865ac, 0x3fe6c2b4, 0x3fe52598,
- 0x3fe38e39, 0x3fe1fc78, 0x3fe07038, 0x3fdee95c,
- 0x3fdd67c9, 0x3fdbeb62, 0x3fda740e, 0x3fd901b2,
- 0x3fd79436, 0x3fd62b81, 0x3fd4c77b, 0x3fd3680d,
- 0x3fd20d21, 0x3fd0b6a0, 0x3fcf6475, 0x3fce168a,
- 0x3fcccccd, 0x3fcb8728, 0x3fca4588, 0x3fc907da,
- 0x3fc7ce0c, 0x3fc6980c, 0x3fc565c8, 0x3fc43730,
- 0x3fc30c31, 0x3fc1e4bc, 0x3fc0c0c1, 0x3fbfa030,
- 0x3fbe82fa, 0x3fbd6910, 0x3fbc5264, 0x3fbb3ee7,
- 0x3fba2e8c, 0x3fb92144, 0x3fb81703, 0x3fb70fbb,
- 0x3fb60b61, 0x3fb509e7, 0x3fb40b41, 0x3fb30f63,
- 0x3fb21643, 0x3fb11fd4, 0x3fb02c0b, 0x3faf3ade,
- 0x3fae4c41, 0x3fad602b, 0x3fac7692, 0x3fab8f6a,
- 0x3faaaaab, 0x3fa9c84a, 0x3fa8e83f, 0x3fa80a81,
- 0x3fa72f05, 0x3fa655c4, 0x3fa57eb5, 0x3fa4a9cf,
- 0x3fa3d70a, 0x3fa3065e, 0x3fa237c3, 0x3fa16b31,
- 0x3fa0a0a1, 0x3f9fd80a, 0x3f9f1166, 0x3f9e4cad,
- 0x3f9d89d9, 0x3f9cc8e1, 0x3f9c09c1, 0x3f9b4c70,
- 0x3f9a90e8, 0x3f99d723, 0x3f991f1a, 0x3f9868c8,
- 0x3f97b426, 0x3f97012e, 0x3f964fda, 0x3f95a025,
- 0x3f94f209, 0x3f944581, 0x3f939a86, 0x3f92f114,
- 0x3f924925, 0x3f91a2b4, 0x3f90fdbc, 0x3f905a38,
- 0x3f8fb824, 0x3f8f177a, 0x3f8e7835, 0x3f8dda52,
- 0x3f8d3dcb, 0x3f8ca29c, 0x3f8c08c1, 0x3f8b7034,
- 0x3f8ad8f3, 0x3f8a42f8, 0x3f89ae41, 0x3f891ac7,
- 0x3f888889, 0x3f87f781, 0x3f8767ab, 0x3f86d905,
- 0x3f864b8a, 0x3f85bf37, 0x3f853408, 0x3f84a9fa,
- 0x3f842108, 0x3f839930, 0x3f83126f, 0x3f828cc0,
- 0x3f820821, 0x3f81848e, 0x3f810204, 0x3f808081,
- 0x3f800000, 0x00000000, 0x399f22b4, 0x3a1f22b4,
- 0x3a6eb40e, 0x3a9f22b4, 0x3ac6eb61, 0x3aeeb40e,
- 0x3b0b3e5d, 0x3b1f22b4, 0x3b33070a, 0x3b46eb61,
- 0x3b5b518e, 0x3b70f18f, 0x3b83e1c6, 0x3b8fe616,
- 0x3b9c87fd, 0x3ba9c9b6, 0x3bb7ad6f, 0x3bc6354a,
- 0x3bd56360, 0x3be539c1, 0x3bf5ba71, 0x3c0373b6,
- 0x3c0c6153, 0x3c15a705, 0x3c1f45be, 0x3c293e6b,
- 0x3c3391f7, 0x3c3e4149, 0x3c494d44, 0x3c54b6c9,
- 0x3c607eb4, 0x3c6ca5df, 0x3c792d22, 0x3c830aa9,
- 0x3c89af9f, 0x3c9085dc, 0x3c978dc6, 0x3c9ec7c2,
- 0x3ca63433, 0x3cadd37d, 0x3cb5a602, 0x3cbdac21,
- 0x3cc5e63a, 0x3cce54ac, 0x3cd6f7d5, 0x3cdfd010,
- 0x3ce8ddba, 0x3cf2212d, 0x3cfb9ac3, 0x3d02a56a,
- 0x3d0798dd, 0x3d0ca7e6, 0x3d11d2af, 0x3d171964,
- 0x3d1c7c30, 0x3d21fb3c, 0x3d2796b2, 0x3d2d4ebb,
- 0x3d332381, 0x3d39152b, 0x3d3f23e4, 0x3d454fd2,
- 0x3d4b991d, 0x3d51ffec, 0x3d588468, 0x3d5f26b6,
- 0x3d65e6fd, 0x3d6cc563, 0x3d73c20e, 0x3d7add24,
- 0x3d810b65, 0x3d84b793, 0x3d88732e, 0x3d8c3e48,
- 0x3d9018f4, 0x3d940344, 0x3d97fd49, 0x3d9c0715,
- 0x3da020ba, 0x3da44a4a, 0x3da883d6, 0x3daccd6f,
- 0x3db12727, 0x3db5910f, 0x3dba0b38, 0x3dbe95b3,
- 0x3dc33090, 0x3dc7dbe0, 0x3dcc97b4, 0x3dd1641d,
- 0x3dd6412b, 0x3ddb2eee, 0x3de02d76, 0x3de53cd4,
- 0x3dea5d18, 0x3def8e51, 0x3df4d090, 0x3dfa23e5,
- 0x3dff885e, 0x3e027f06, 0x3e05427f, 0x3e080ea2,
- 0x3e0ae377, 0x3e0dc104, 0x3e10a753, 0x3e13966a,
- 0x3e168e51, 0x3e198f0f, 0x3e1c98ac, 0x3e1fab30,
- 0x3e22c6a1, 0x3e25eb07, 0x3e29186a, 0x3e2c4ed0,
- 0x3e2f8e42, 0x3e32d6c5, 0x3e362862, 0x3e39831f,
- 0x3e3ce703, 0x3e405417, 0x3e43ca60, 0x3e4749e6,
- 0x3e4ad2af, 0x3e4e64c3, 0x3e520029, 0x3e55a4e7,
- 0x3e595305, 0x3e5d0a89, 0x3e60cb7a, 0x3e6495df,
- 0x3e6869be, 0x3e6c471f, 0x3e702e07, 0x3e741e7e,
- 0x3e78188b, 0x3e7c1c33, 0x3e8014bf, 0x3e822039,
- 0x3e84308b, 0x3e8645b8, 0x3e885fc3, 0x3e8a7eb0,
- 0x3e8ca281, 0x3e8ecb3b, 0x3e90f8df, 0x3e932b72,
- 0x3e9562f6, 0x3e979f6f, 0x3e99e0e0, 0x3e9c274c,
- 0x3e9e72b6, 0x3ea0c321, 0x3ea31890, 0x3ea57307,
- 0x3ea7d288, 0x3eaa3716, 0x3eaca0b6, 0x3eaf0f68,
- 0x3eb18332, 0x3eb3fc15, 0x3eb67a14, 0x3eb8fd34,
- 0x3ebb8576, 0x3ebe12de, 0x3ec0a56e, 0x3ec33d2a,
- 0x3ec5da14, 0x3ec87c30, 0x3ecb2380, 0x3ecdd008,
- 0x3ed081ca, 0x3ed338c9, 0x3ed5f508, 0x3ed8b68a,
- 0x3edb7d52, 0x3ede4963, 0x3ee11abf, 0x3ee3f169,
- 0x3ee6cd65, 0x3ee9aeb5, 0x3eec955b, 0x3eef815c,
- 0x3ef272b8, 0x3ef56974, 0x3ef86593, 0x3efb6716,
- 0x3efe6e00, 0x3f00bd2b, 0x3f02460c, 0x3f03d1a5,
- 0x3f055ff7, 0x3f06f104, 0x3f0884cd, 0x3f0a1b54,
- 0x3f0bb499, 0x3f0d509f, 0x3f0eef65, 0x3f1090ef,
- 0x3f12353d, 0x3f13dc50, 0x3f15862a, 0x3f1732cc,
- 0x3f18e237, 0x3f1a946e, 0x3f1c4970, 0x3f1e0140,
- 0x3f1fbbde, 0x3f21794d, 0x3f23398c, 0x3f24fc9f,
- 0x3f26c285, 0x3f288b41, 0x3f2a56d2, 0x3f2c253c,
- 0x3f2df67f, 0x3f2fca9c, 0x3f31a194, 0x3f337b6a,
- 0x3f35581d, 0x3f3737b0, 0x3f391a24, 0x3f3aff7a,
- 0x3f3ce7b2, 0x3f3ed2cf, 0x3f40c0d2, 0x3f42b1bc,
- 0x3f44a58e, 0x3f469c49, 0x3f4895ef, 0x3f4a9280,
- 0x3f4c91ff, 0x3f4e946c, 0x3f5099c9, 0x3f52a216,
- 0x3f54ad56, 0x3f56bb88, 0x3f58ccaf, 0x3f5ae0cc,
- 0x3f5cf7df, 0x3f5f11ea, 0x3f612eef, 0x3f634eee,
- 0x3f6571e9, 0x3f6797e0, 0x3f69c0d5, 0x3f6becca,
- 0x3f6e1bbf, 0x3f704db5, 0x3f7282ae, 0x3f74baab,
- 0x3f76f5ae, 0x3f7933b6, 0x3f7b74c6, 0x3f7db8de,
- 0x3f800000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x000000a2,
- 0x000003e6, 0x00000036, 0x00000393, 0x00000244,
- 0x00000054, 0x0000029f, 0x00000309, 0x00000357,
- 0x00000347, 0x00000353, 0x00000137, 0x000001c0,
- 0x0000036d, 0x00000229, 0x00000166, 0x0000013c,
- 0x0000010e, 0x00000104, 0x0000007f, 0x00000251,
- 0x0000018e, 0x000002bd, 0x000003ae, 0x000003c5,
- 0x00000186, 0x00000372, 0x0000011b, 0x0000023a,
- 0x00000109, 0x000000dd, 0x000000b8, 0x00000006,
- 0x00000124, 0x000002ee, 0x00000282, 0x000001d1,
- 0x00000248, 0x000001cf, 0x00000387, 0x000001eb,
- 0x00000072, 0x00000312, 0x00000269, 0x0000033e,
- 0x000003a2, 0x00000023, 0x0000017d, 0x0000012e,
- 0x000002ed, 0x00000048, 0x0000013a, 0x0000019c,
- 0x000001c0, 0x0000026b, 0x00000117, 0x0000037e,
- 0x00000104, 0x00000399, 0x00000075, 0x00000239,
- 0x0000020d, 0x00000133, 0x0000027d, 0x0000009c,
- 0x00000211, 0x000001f8, 0x000002ef, 0x000001f9,
- 0x000000a0, 0x000003b1, 0x000003fe, 0x00000097,
- 0x000003ff, 0x000001e0, 0x00000166, 0x0000000f,
- 0x000003bc, 0x000002f1, 0x00000062, 0x0000035a,
- 0x00000029, 0x000002d1, 0x000003db, 0x00000136,
- 0x000001fb, 0x000000f2, 0x000001f2, 0x00000309,
- 0x000002dd, 0x000000f4, 0x0000018f, 0x00000366,
- 0x00000279, 0x000001fe, 0x0000028b, 0x00000175,
- 0x0000009e, 0x000003ac, 0x000001fa, 0x000003e5,
- 0x000003c5, 0x000003b3, 0x00000341, 0x00000339,
- 0x000003de, 0x000000a5, 0x000000a4, 0x000002ea,
- 0x000001af, 0x000003b5, 0x000003ec, 0x0000011f,
- 0x00000235, 0x000001d0, 0x00000215, 0x00000203,
- 0x000000c1, 0x0000006f, 0x0000031e, 0xc11bf1e0,
- 0x7421580c, 0x7ec47e35, 0x4ba9afed, 0xe7de294a,
- 0xc5ecf41c, 0xeb1faf97, 0xa8b5d49e, 0xfd9a797f,
- 0x26dd3d18, 0xfb3c9f2c, 0xb47db4d9, 0x462d6829,
- 0x603fbcbc, 0x5fff7816, 0xa0ec7fe2, 0x7e2ef7e4,
- 0xe7d27211, 0x58e60d4c, 0xf904e647, 0xc09ad17d,
- 0x1213a671, 0xd7d4baed, 0x9cfba208, 0xac72c4a6,
- 0x4873f877, 0xbba82746, 0x4b801924, 0xb8e90937,
- 0x1586dc91, 0x8eaf7aef, 0x4107f945, 0x5664f10e,
- 0x77036d8a, 0x5f47d4d3, 0x54a7f09d, 0x0db93910,
- 0x00028be6, 0x00000000, 0x00000000, 0x00000000
-};
-
-#endif // TABLES_HPP_
+ 0x00000000, 0x3faff55b, 0xbd38db2c, 0x3e56e59f, 0x00000000, 0x3fb0f99e, 0x54dedf96, 0x3e64e3aa,
+ 0x00000000, 0x3fb1f86d, 0xab1bda88, 0x3e67e105, 0x00000000, 0x3fb2f719, 0x4d013fd0, 0x3e48c525,
+ 0x00000000, 0x3fb3f59f, 0x3ad62670, 0x3e2cf8ab, 0x00000000, 0x3fb4f3fd, 0xbec80468, 0x3e59dca4,
+ 0x00000000, 0x3fb5f232, 0xec98a8da, 0x3e53f4b5, 0x00000000, 0x3fb6f03b, 0x619d81fe, 0x3e6b9d49,
+ 0x00000000, 0x3fb7ee18, 0x87460934, 0x3e430178, 0x00000000, 0x3fb8ebc5, 0xca0b9944, 0x3e511e3e,
+ 0x00000000, 0x3fb9e941, 0x3c5a332e, 0x3e54f3f7, 0x00000000, 0x3fbae68a, 0xae0e00a6, 0x3e5c71c8,
+ 0x00000000, 0x3fbbe39e, 0xf86fbdc7, 0x3e67cde0, 0x00000000, 0x3fbce07c, 0x8c889c72, 0x3e570f32,
+ 0x00000000, 0x3fbddd21, 0x9b994efe, 0x3e5c07ae, 0x00000000, 0x3fbed98c, 0x1d7b1698, 0x3e40c802,
+ 0x00000000, 0x3fbfd5ba, 0xedb8cb22, 0x3e635585, 0x00000000, 0x3fc068d5, 0x67b30e96, 0x3e708425,
+ 0x00000000, 0x3fc0e6ad, 0x1031472e, 0x3e799e81, 0x00000000, 0x3fc16465, 0x1416bcee, 0x3e604182,
+ 0x00000000, 0x3fc1e1fa, 0xe4dc96f4, 0x3e7f6086, 0x00000000, 0x3fc25f6e, 0x5c5f1b58, 0x3e471a53,
+ 0x00000000, 0x3fc2dcbd, 0x3fe63ca1, 0x3e765f74, 0x00000000, 0x3fc359e8, 0x3472d014, 0x3e7dbd73,
+ 0x00000000, 0x3fc3d6ee, 0x4d8b0d1d, 0x3e7d18cc, 0x00000000, 0x3fc453ce, 0x53c8fb29, 0x3e78c125,
+ 0x00000000, 0x3fc4d087, 0xe2e8f991, 0x3e753b49, 0x00000000, 0x3fc54d18, 0xe148c141, 0x3e77422a,
+ 0x00000000, 0x3fc5c981, 0x69df56a8, 0x3e4e3ec2, 0x00000000, 0x3fc645bf, 0x4e7e0ac9, 0x3e7ff675,
+ 0x00000000, 0x3fc6c1d4, 0x7b1b5aad, 0x3e713126, 0x00000000, 0x3fc73dbd, 0x403a94bc, 0x3e7d14fa,
+ 0x00000000, 0x3fc7b97b, 0xc089a3d8, 0x3e62f396, 0x00000000, 0x3fc8350b, 0x78fa95bb, 0x3e7c731d,
+ 0x00000000, 0x3fc8b06e, 0x85177399, 0x3e7c50f3, 0x00000000, 0x3fc92ba3, 0x9c6f2c20, 0x3e6f4140,
+ 0x00000000, 0x3fc9a6a8, 0xc4c39ec0, 0x3e7d2d90, 0x00000000, 0x3fca217e, 0x696f2106, 0x3e680420,
+ 0x00000000, 0x3fca9c23, 0x7943a2e8, 0x3e4b4032, 0x00000000, 0x3fcb1696, 0x02f3d2a2, 0x3e65d35e,
+ 0x00000000, 0x3fcb90d7, 0x288117b0, 0x3e64a498, 0x00000000, 0x3fcc0ae5, 0x19afb324, 0x3e635da1,
+ 0x00000000, 0x3fcc84bf, 0xcdb9a908, 0x3e714e85, 0x00000000, 0x3fccfe65, 0xe5547b9a, 0x3e638754,
+ 0x00000000, 0x3fcd77d5, 0xe6ce3246, 0x3e7be40a, 0x00000000, 0x3fcdf110, 0xb3bea7e7, 0x3e70c993,
+ 0x00000000, 0x3fce6a14, 0x89ac3359, 0x3e71d2dd, 0x00000000, 0x3fcee2e1, 0x03332c46, 0x3e614766,
+ 0x00000000, 0x3fcf5b75, 0x1bac55b7, 0x3e7f2590, 0x00000000, 0x3fcfd3d1, 0x7c826e28, 0x3e7f881b,
+ 0x00000000, 0x3fd025fa, 0x6d698d20, 0x3e744199, 0x00000000, 0x3fd061ee, 0x521ea089, 0x3e8407ac,
+ 0x00000000, 0x3fd09dc5, 0x6c4b1723, 0x3e82fb0c, 0x00000000, 0x3fd0d97e, 0x966a3e18, 0x3e8ca135,
+ 0x00000000, 0x3fd1151a, 0xe4d646e4, 0x3e6b1218, 0x00000000, 0x3fd15097, 0xa350d288, 0x3e6d4e72,
+ 0x00000000, 0x3fd18bf5, 0x2f04c329, 0x3e84617e, 0x00000000, 0x3fd1c735, 0x41e82650, 0x3e6096ec,
+ 0x00000000, 0x3fd20255, 0x25773e6e, 0x3e79f91f, 0x00000000, 0x3fd23d56, 0x20f1d674, 0x3e659c08,
+ 0x00000000, 0x3fd27837, 0xa2df1064, 0x3e602bf7, 0x00000000, 0x3fd2b2f7, 0xfc40508f, 0x3e8fb36b,
+ 0x00000000, 0x3fd2ed98, 0x3f8dc892, 0x3e7ea08f, 0x00000000, 0x3fd32818, 0x54656a0e, 0x3e73ed62,
+ 0x00000000, 0x3fd36277, 0xe5e69c58, 0x3e6b83f5, 0x00000000, 0x3fd39cb4, 0xaf768592, 0x3e8d6ec2,
+ 0x00000000, 0x3fd3d6d1, 0x9a226f94, 0x3e649388, 0x00000000, 0x3fd410cb, 0xa65279ba, 0x3e85ad8f,
+ 0x00000000, 0x3fd44aa4, 0x84d45434, 0x3e6b6157, 0x00000000, 0x3fd4845a, 0x4368f145, 0x3e809a18,
+ 0x00000000, 0x3fd4bdee, 0x39b0d91c, 0x3e761a24, 0x00000000, 0x3fd4f75f, 0x5e39a978, 0x3e7ce1a6,
+ 0x00000000, 0x3fd530ad, 0xa93b6a66, 0x3e832a39, 0x00000000, 0x3fd569d8, 0x9af804e7, 0x3e81c369,
+ 0x00000000, 0x3fd5a2e0, 0x4e44ede8, 0x3e575e0f, 0x00000000, 0x3fd5dbc3, 0xd1a7a83b, 0x3e8f77ce,
+ 0x00000000, 0x3fd61484, 0x0cb1b500, 0x3e284e7f, 0x00000000, 0x3fd64d1f, 0x38b02dfe, 0x3e8ec6b8,
+ 0x00000000, 0x3fd68597, 0xdfbeda87, 0x3e83ebf4, 0x00000000, 0x3fd6bdea, 0xed9cb475, 0x3e89397a,
+ 0x00000000, 0x3fd6f619, 0xbc239c54, 0x3e707937, 0x00000000, 0x3fd72e22, 0x553131b6, 0x3e8aa754,
+ 0x00000000, 0x3fd76607, 0x407c45dc, 0x3e74a05d, 0x00000000, 0x3fd79dc6, 0x1a206dd0, 0x3e813223,
+ 0x00000000, 0x3fd7d560, 0xfdd69c88, 0x3e72d8ec, 0x00000000, 0x3fd80cd4, 0x74218606, 0x3e7a852c,
+ 0x00000000, 0x3fd84422, 0xbaeebb50, 0x3e871bf2, 0x00000000, 0x3fd87b4b, 0xb7491820, 0x3e483d7d,
+ 0x00000000, 0x3fd8b24d, 0x92b6da14, 0x3e6ca50d, 0x00000000, 0x3fd8e929, 0xe8530298, 0x3e56f5cd,
+ 0x00000000, 0x3fd91fde, 0x98910740, 0x3e7f3431, 0x00000000, 0x3fd9566d, 0x41ccd80a, 0x3e70e8d2,
+ 0x00000000, 0x3fd98cd5, 0xc619e6c8, 0x3e71535a, 0x00000000, 0x3fd9c316, 0x41c36cd2, 0x3e773160,
+ 0x00000000, 0x3fd9f930, 0x00637d8e, 0x3e7985a0, 0x00000000, 0x3fda2f23, 0x858c0a68, 0x3e6f2f29,
+ 0x00000000, 0x3fda64ee, 0x7f96d909, 0x3e887984, 0x00000000, 0x3fda9a92, 0x19e12e42, 0x3e8ab3d3,
+ 0x00000000, 0x3fdad00f, 0x62dfc4c2, 0x3e750881, 0x00000000, 0x3fdb0564, 0xa1cd9d8c, 0x3e605749,
+ 0x00000000, 0x3fdb3a91, 0x6c6b8618, 0x3e5da65c, 0x00000000, 0x3fdb6f96, 0x7df1ad64, 0x3e6739bf,
+ 0x00000000, 0x3fdba473, 0x52aa3340, 0x3e6bc312, 0x00000000, 0x3fdbd928, 0x91ad3aa8, 0x3e5e5281,
+ 0x00000000, 0x3fdc0db4, 0x3df19f18, 0x3e8929d9, 0x00000000, 0x3fdc4219, 0xb693a080, 0x3e5ff11e,
+ 0x00000000, 0x3fdc7655, 0xf145a3a0, 0x3e455ae3, 0x00000000, 0x3fdcaa68, 0xc6c0ca82, 0x3e7cbcd8,
+ 0x00000000, 0x3fdcde53, 0xd425d304, 0x3e70cb04, 0x00000000, 0x3fdd1215, 0xab5be678, 0x3e79adfc,
+ 0x00000000, 0x3fdd45ae, 0xc5662508, 0x3e893d90, 0x00000000, 0x3fdd791f, 0xbd35ff40, 0x3e768489,
+ 0x00000000, 0x3fddac67, 0x3da2b7e0, 0x3e3586ed, 0x00000000, 0x3fdddf85, 0x2e850eee, 0x3e87604d,
+ 0x00000000, 0x3fde127b, 0x2bfb53d8, 0x3e7ac1d1, 0x00000000, 0x3fde4548, 0x68274740, 0x3e39b3d4,
+ 0x00000000, 0x3fde77eb, 0x8d10e53c, 0x3e7fc5d6, 0x00000000, 0x3fdeaa65, 0x1884becb, 0x3e88f9e5,
+ 0x00000000, 0x3fdedcb6, 0x869c06d1, 0x3e8a87f0, 0x00000000, 0x3fdf0ede, 0x79f685fa, 0x3e831e72,
+ 0x00000000, 0x3fdf40dd, 0x2f9719b0, 0x3e46a828, 0x00000000, 0x3fdf72b2, 0x4a8a44e0, 0x3e60d272,
+ 0x00000000, 0x3fdfa45d, 0x4b11ad4e, 0x3e8a6052, 0x00000000, 0x3fdfd5e0, 0x832750f0, 0x3e575fdf,
+ 0x00000000, 0x3fe0039c, 0x02e4cd36, 0x3e8cf069, 0x00000000, 0x3fe01c34, 0x2d4f6d10, 0x3e6e8242,
+ 0x00000000, 0x3fe034b7, 0x1063e6c0, 0x3e524a09, 0x00000000, 0x3fe04d25, 0x72dc6f38, 0x3e78a1a1,
+ 0x00000000, 0x3fe0657e, 0x19f8a92d, 0x3e929b66, 0x00000000, 0x3fe07dc3, 0x9c1b70c8, 0x3e79274d,
+ 0x00000000, 0x3fe095f3, 0x1fbb7930, 0x3e50c34b, 0x00000000, 0x3fe0ae0e, 0x6c20eb50, 0x3e663986,
+ 0x00000000, 0x3fe0c614, 0xf6832e9e, 0x3e86d6d0, 0x00000000, 0x3fe0de05, 0xef99f25e, 0x3e9af54d,
+ 0x00000000, 0x3fe0f5e2, 0x52a00262, 0x3e916cfc, 0x00000000, 0x3fe10daa, 0x83569c32, 0x3e8dcc1e,
+ 0x00000000, 0x3fe1255d, 0x551ed425, 0x3e937f7a, 0x00000000, 0x3fe13cfb, 0xadc98887, 0x3e9f6360,
+ 0x00000000, 0x3fe15485, 0x8d35a2c1, 0x3e92c6ec, 0x00000000, 0x3fe16bfa, 0xf84cb036, 0x3e8bd44d,
+ 0x00000000, 0x3fe1835a, 0x826e310e, 0x3e9117cf, 0x00000000, 0x3fe19aa5, 0xf332cfc9, 0x3e9ca533,
+ 0x00000000, 0x3fe1b1dc, 0x509dbc2e, 0x3e90f208, 0x00000000, 0x3fe1c8fe, 0x93c945de, 0x3e8cd07d,
+ 0x00000000, 0x3fe1e00b, 0xd67e6d72, 0x3e957bdf, 0x00000000, 0x3fe1f704, 0xc516c658, 0x3e7aab89,
+ 0x00000000, 0x3fe20de8, 0xb1a1b8a0, 0x3e63e823, 0x00000000, 0x3fe224b7, 0x4a9d6d3c, 0x3e830746,
+ 0x00000000, 0x3fe23b71, 0xcd438843, 0x3e9c5993, 0x00000000, 0x3fe25217, 0xa02ab554, 0x3e9ba2fc,
+ 0x00000000, 0x3fe268a9, 0x6983a268, 0x3e801a5b, 0x00000000, 0x3fe27f26, 0xb350efc8, 0x3e6273d1,
+ 0x00000000, 0x3fe2958e, 0x8c37b0c6, 0x3e864c23, 0x00000000, 0x3fe2abe2, 0x7370a300, 0x3e6aded0,
+ 0x00000000, 0x3fe2c221, 0x197eb47e, 0x3e878091, 0x00000000, 0x3fe2d84c, 0x45e0dabc, 0x3e74b0f2,
+ 0x00000000, 0x3fe2ee62, 0x794e2eaf, 0x3e9080d9, 0x00000000, 0x3fe30464, 0x42b60c76, 0x3e8d4ec2,
+ 0x00000000, 0x3fe31a52, 0xf940caa0, 0x3e4221d2, 0x00000000, 0x3fe3302b, 0x2b2bba5c, 0x3e7cdbc4,
+ 0x00000000, 0x3fe345f0, 0xbb440840, 0x3e6cce37, 0x00000000, 0x3fe35ba0, 0x99cf1dd0, 0x3e96c1d9,
+ 0x00000000, 0x3fe3713d, 0x07eb0870, 0x3e5bed8a, 0x00000000, 0x3fe386c5, 0x8f490e3c, 0x3e769ed8,
+ 0x00000000, 0x3fe39c39, 0x19b73ef0, 0x3e6cd417, 0x00000000, 0x3fe3b198, 0xc95b41b7, 0x3e9cbc4a,
+ 0x00000000, 0x3fe3c6e4, 0xb890f5d7, 0x3e9238f1, 0x00000000, 0x3fe3dc1c, 0x82259cc4, 0x3e750c42,
+ 0x00000000, 0x3fe3f13f, 0xde87b3e2, 0x3e9713d2, 0x00000000, 0x3fe4064f, 0xd2255276, 0x3e81d5a7,
+ 0x00000000, 0x3fe41b4a, 0x48227ac1, 0x3e9c0dfd, 0x00000000, 0x3fe43032, 0xdab76753, 0x3e91c964,
+ 0x00000000, 0x3fe44506, 0xd5704496, 0x3e86de56, 0x00000000, 0x3fe459c6, 0x1fd19968, 0x3e84aeb7,
+ 0x00000000, 0x3fe46e72, 0xc57b1918, 0x3e8fbf91, 0x00000000, 0x3fe4830a, 0x7fbe5d9a, 0x3e9d6bef,
+ 0x00000000, 0x3fe4978f, 0xdc249066, 0x3e9464d3, 0x00000000, 0x3fe4ac00, 0xec4d9073, 0x3e9638e2,
+ 0x00000000, 0x3fe4c05e, 0x7247ea7c, 0x3e716f4a, 0x00000000, 0x3fe4d4a8, 0x40f1d440, 0x3e31a0a7,
+ 0x00000000, 0x3fe4e8de, 0x0114a33c, 0x3e86edbb, 0x00000000, 0x3fe4fd01, 0xbf1d513c, 0x3e7dbee8,
+ 0x00000000, 0x3fe51110, 0xb0248f73, 0x3e95b8bd, 0x00000000, 0x3fe5250c, 0x3f5eac64, 0x3e97de3d,
+ 0x00000000, 0x3fe538f5, 0x87ae448a, 0x3e8ee241, 0x00000000, 0x3fe54cca, 0x91ec5192, 0x3e9e06c5,
+ 0x00000000, 0x3fe5608d, 0x1a332738, 0x3e74e386, 0x00000000, 0x3fe5743c, 0xdcc2bfe4, 0x3e7a9599,
+ 0x00000000, 0x3fe587d8, 0xbad43468, 0x3e6f732f, 0x00000000, 0x3fe59b60, 0x73b727d9, 0x3e9eb9f5,
+ 0x00000000, 0x3fe5aed6, 0xa2eb9897, 0x3e98b212, 0x00000000, 0x3fe5c239, 0x4c167215, 0x3e938488,
+ 0x00000000, 0x3fe5d589, 0x63020051, 0x3e90e2d3, 0x00000000, 0x3fe5e8c6, 0x79fbd022, 0x3e928208,
+ 0x00000000, 0x3fe5fbf0, 0x893e4b30, 0x3e9a1ab9, 0x00000000, 0x3fe60f08, 0x17a24478, 0x3e82d1b8,
+ 0x00000000, 0x3fe6220d, 0x8ded4878, 0x3e615d7b, 0x00000000, 0x3fe634ff, 0x9db3a5e4, 0x3e78968f,
+ 0x00000000, 0x3fe647de, 0x71fe135f, 0x3e971c41, 0x00000000, 0x3fe65aab, 0x605d0d8c, 0x3e96d80f,
+ 0x00000000, 0x3fe66d66, 0x43691590, 0x3e7c91f0, 0x00000000, 0x3fe6800e, 0x15fce2b2, 0x3e839f8a,
+ 0x00000000, 0x3fe692a4, 0xa9d94b80, 0x3e455bed, 0x00000000, 0x3fe6a527, 0x5d60949a, 0x3e8b12c1,
+ 0x00000000, 0x3fe6b798, 0xb312bfe3, 0x3e924167, 0x00000000, 0x3fe6c9f7, 0x33070277, 0x3e90ab86,
+ 0x00000000, 0x3fe6dc44, 0xebbc80ee, 0x3e854554, 0x00000000, 0x3fe6ee7f, 0xef5a4bb8, 0x3e60204a,
+ 0x00000000, 0x3fe700a7, 0xc679cf2c, 0x3e98af08, 0x00000000, 0x3fe712be, 0x330ae6c8, 0x3e90852a,
+ 0x00000000, 0x3fe724c3, 0x9ec32916, 0x3e86d3eb, 0x00000000, 0x3fe736b6, 0x7fcbbafe, 0x3e8685cb,
+ 0x00000000, 0x3fe74897, 0xc1e0bd95, 0x3e91f751, 0x00000000, 0x3fe75a67, 0xb0f72560, 0x3e5705b1,
+ 0x00000000, 0x3fe76c24, 0xd808ca92, 0x3e9b98d8, 0x00000000, 0x3fe77dd1, 0xc75cc980, 0x3e62ea22,
+ 0x00000000, 0x3fe78f6b, 0x2bca0350, 0x3e97aba6, 0x00000000, 0x3fe7a0f4, 0x3442278c, 0x3e9d7383,
+ 0x00000000, 0x3fe7b26c, 0x1fb18bf9, 0x3e95a5ca, 0x00000000, 0x3fe7c3d3, 0x2b6ecf28, 0x3e61a609,
+ 0x00000000, 0x3fe7d528, 0x49aac104, 0x3e744fd0, 0x00000000, 0x3fe7e66c, 0xd8df5180, 0x3e2c114f,
+ 0x00000000, 0x3fe7f79e, 0x130feae5, 0x3e95972f, 0x00000000, 0x3fe808c0, 0xa55fe198, 0x3e7ca034,
+ 0x00000000, 0x3fe819d0, 0x49990227, 0x3e96e2b1, 0x00000000, 0x3fe82ad0, 0x0294592c, 0x3e7b0000,
+ 0x00000000, 0x3fe83bbe, 0xc442620e, 0x3e98b9bd, 0x00000000, 0x3fe84c9c, 0xfabf3e4e, 0x3e8d94fd,
+ 0x00000000, 0x3fe85d69, 0xb145ad9a, 0x3e85db30, 0x00000000, 0x3fe86e25, 0xb95022b0, 0x3e8e3e1e,
+ 0x00000000, 0x3fe87ed0, 0x45442bd6, 0x3e9d5b8b, 0x00000000, 0x3fe88f6b, 0x231ecd2e, 0x3e97a046,
+ 0x00000000, 0x3fe89ff5, 0x3ef55232, 0x3e9feafe, 0x00000000, 0x3fe8b06f, 0xbfd78267, 0x3e9839e7,
+ 0x00000000, 0x3fe8c0d9, 0x9d6fa900, 0x3e645cf4, 0x00000000, 0x3fe8d132, 0x2b27f380, 0x3e4be313,
+ 0x00000000, 0x3fe8e17a, 0x0bb84f9f, 0x3e953398, 0x00000000, 0x3fe8f1b3, 0xce3ba390, 0x3e5889e2,
+ 0x00000000, 0x3fe901db, 0xc3ad0cc8, 0x3e7f7778, 0x00000000, 0x3fe911f3, 0xcec4eba2, 0x3e846660,
+ 0x00000000, 0x3fe921fb, 0x4611a626, 0x3e85110b, 0x00000000, 0x3ff00000, 0x00000000, 0x00000000,
+ 0x80000000, 0x3ff00553, 0xc81e4294, 0x3e6e6a24, 0x90000000, 0x3ff00aa3, 0x11e3a785, 0x3e585485,
+ 0x10000000, 0x3ff00ff0, 0x36ec07f6, 0x3e64eb93, 0x20000000, 0x3ff01539, 0xb8b750e1, 0x3e40ea64,
+ 0xb0000000, 0x3ff01a7e, 0xcff8a53c, 0x3e461637, 0xd0000000, 0x3ff01fc0, 0xf7bd1943, 0x3e40733b,
+ 0x80000000, 0x3ff024ff, 0x1345cced, 0x3e566691, 0xd0000000, 0x3ff02a3a, 0x3f592f14, 0x3e477b7a,
+ 0xb0000000, 0x3ff02f72, 0xdd1a5402, 0x3e6f18d3, 0x50000000, 0x3ff034a7, 0xa58ee9a4, 0x3e2be2f5,
+ 0x80000000, 0x3ff039d8, 0x8f085fa7, 0x3e68901f, 0x70000000, 0x3ff03f06, 0xcd5b5d69, 0x3e5c68b8,
+ 0x10000000, 0x3ff04431, 0x8624be42, 0x3e5a6b0e, 0x70000000, 0x3ff04958, 0xb06f68e7, 0x3dbc4b22,
+ 0x80000000, 0x3ff04e7c, 0xafcabe9b, 0x3e60f3f0, 0x60000000, 0x3ff0539d, 0xbca4e1b7, 0x3e548495,
+ 0x00000000, 0x3ff058bb, 0x1abdfdc3, 0x3e66107f, 0x70000000, 0x3ff05dd5, 0x1878288a, 0x3e6e6726,
+ 0xc0000000, 0x3ff062ec, 0x55286f1e, 0x3e5a6bc1, 0xe0000000, 0x3ff06800, 0xc64a85f2, 0x3e58a759,
+ 0xe0000000, 0x3ff06d11, 0x0a4a8d09, 0x3e45fce7, 0xc0000000, 0x3ff0721f, 0xf373fe1d, 0x3e32f9cb,
+ 0x80000000, 0x3ff0772a, 0xce4ac359, 0x3e590564, 0x30000000, 0x3ff07c32, 0xe761b02f, 0x3e5ac29c,
+ 0xd0000000, 0x3ff08136, 0xf497381c, 0x3e5cb752, 0x60000000, 0x3ff08638, 0x1cfb35e0, 0x3e68bb9e,
+ 0xf0000000, 0x3ff08b36, 0x7099de90, 0x3e65b491, 0x80000000, 0x3ff09032, 0xc9c65ef2, 0x3e5cc77a,
+ 0x10000000, 0x3ff0952b, 0xe7be3dba, 0x3e57a0f3, 0xa0000000, 0x3ff09a20, 0x1ee0c16f, 0x3e66ec85,
+ 0x40000000, 0x3ff09f13, 0xbf2946da, 0x3e689449, 0xf0000000, 0x3ff0a402, 0x301ba223, 0x3e698f25,
+ 0xc0000000, 0x3ff0a8ef, 0xc651f549, 0x3e347d5e, 0x90000000, 0x3ff0add9, 0x9a86007a, 0x3e6c33ec,
+ 0x90000000, 0x3ff0b2c0, 0x53e92649, 0x3e5e0b66, 0xb0000000, 0x3ff0b7a4, 0xc09d755f, 0x3e3bd64a,
+ 0xf0000000, 0x3ff0bc85, 0x06f78167, 0x3e2f5375, 0x50000000, 0x3ff0c164, 0xd1b3735e, 0x3e62c382,
+ 0xe0000000, 0x3ff0c63f, 0x659f99e1, 0x3e6e20ed, 0xb0000000, 0x3ff0cb18, 0x3a9c182a, 0x3e586b63,
+ 0xb0000000, 0x3ff0cfee, 0x5a65e777, 0x3e445cfd, 0xe0000000, 0x3ff0d4c1, 0x0f58bca4, 0x3e60c877,
+ 0x50000000, 0x3ff0d992, 0x4b0933c5, 0x3e6739e4, 0x10000000, 0x3ff0de60, 0xd9ce7bd8, 0x3e027dc3,
+ 0x00000000, 0x3ff0e32b, 0x7c5a7b64, 0x3e63c53c, 0x40000000, 0x3ff0e7f3, 0x83830cec, 0x3e696696,
+ 0xd0000000, 0x3ff0ecb8, 0xc39bdcc4, 0x3e68d772, 0xb0000000, 0x3ff0f17b, 0x8bcf6d7b, 0x3e69b000,
+ 0xf0000000, 0x3ff0f63b, 0x5825ce4f, 0x3e3bbb30, 0x70000000, 0x3ff0faf9, 0xaf13a406, 0x3e6da3f4,
+ 0x60000000, 0x3ff0ffb4, 0x6f74ce86, 0x3e5f36b9, 0xb0000000, 0x3ff1046c, 0x2303f790, 0x3e165c00,
+ 0x50000000, 0x3ff10922, 0x095ba7d5, 0x3e682f84, 0x60000000, 0x3ff10dd5, 0x3541b2c6, 0x3e6d4643,
+ 0xe0000000, 0x3ff11285, 0x56e93a89, 0x3e671c3d, 0xd0000000, 0x3ff11733, 0xf4e40012, 0x3e598dce,
+ 0x30000000, 0x3ff11bdf, 0xef17fe03, 0x3e4530eb, 0x00000000, 0x3ff12088, 0xa3715066, 0x3e4e8b8f,
+ 0x40000000, 0x3ff1252e, 0xb3b211dc, 0x3e6ab26e, 0x10000000, 0x3ff129d2, 0xdc906307, 0x3e454dd4,
+ 0x50000000, 0x3ff12e73, 0x2387984e, 0x3e5c9f96, 0x10000000, 0x3ff13312, 0x59afec09, 0x3e6c62a9,
+ 0x60000000, 0x3ff137ae, 0xac6a866a, 0x3e6638d9, 0x40000000, 0x3ff13c48, 0xeca8a22d, 0x3e338704,
+ 0xa0000000, 0x3ff140df, 0x1db14f8f, 0x3e4e6c9e, 0x90000000, 0x3ff14574, 0x7f9c9eaa, 0x3e58744b,
+ 0x10000000, 0x3ff14a07, 0x3486373b, 0x3e66c289, 0x30000000, 0x3ff14e97, 0xe31699b7, 0x3e5b36bc,
+ 0xe0000000, 0x3ff15324, 0x13d200c7, 0x3e671e38, 0x30000000, 0x3ff157b0, 0xab40aa88, 0x3e699755,
+ 0x20000000, 0x3ff15c39, 0x0e4bcfc0, 0x3e6b45ca, 0xc0000000, 0x3ff160bf, 0x0d869c5d, 0x3e32dd09,
+ 0xf0000000, 0x3ff16543, 0x16b917da, 0x3e64fe05, 0xd0000000, 0x3ff169c5, 0x226317a2, 0x3e694563,
+ 0x60000000, 0x3ff16e45, 0xafc2c851, 0x3e653d8f, 0xa0000000, 0x3ff172c2, 0x1fbd41a3, 0x3e5dcbd4,
+ 0x90000000, 0x3ff1773d, 0x5285f59c, 0x3e5862ff, 0x30000000, 0x3ff17bb6, 0xa97a1e1c, 0x3e63072e,
+ 0x90000000, 0x3ff1802c, 0x75184805, 0x3e528390, 0xa0000000, 0x3ff184a0, 0x3e9eff42, 0x3e64b032,
+ 0x70000000, 0x3ff18912, 0x93c45484, 0x3e6b1588, 0x10000000, 0x3ff18d82, 0x0fc35826, 0x3e3149ef,
+ 0x60000000, 0x3ff191ef, 0xea96acaa, 0x3e5f2e77, 0x80000000, 0x3ff1965a, 0x4c471a95, 0x3e520007,
+ 0x60000000, 0x3ff19ac3, 0x517f6f04, 0x3e63f8cc, 0x10000000, 0x3ff19f2a, 0xe311bb55, 0x3e660ba2,
+ 0x90000000, 0x3ff1a38e, 0x730bbec3, 0x3e64b788, 0xe0000000, 0x3ff1a7f0, 0x795ee20c, 0x3e657090,
+ 0x00000000, 0x3ff1ac51, 0x983670b1, 0x3e6d9ffe, 0x00000000, 0x3ff1b0af, 0xff61bfda, 0x3e62a463,
+ 0xd0000000, 0x3ff1b50a, 0x6a5e65cf, 0x3e69d1bc, 0x80000000, 0x3ff1b964, 0xbaa9e922, 0x3e68718a,
+ 0x10000000, 0x3ff1bdbc, 0x2ffa342e, 0x3e63c2f5, 0x80000000, 0x3ff1c211, 0x3ff42c80, 0x3e60fae1,
+ 0xd0000000, 0x3ff1c664, 0x0ef00d57, 0x3e65440f, 0x10000000, 0x3ff1cab6, 0x2d4e3c1e, 0x3e46fcd2,
+ 0x30000000, 0x3ff1cf05, 0xb409e863, 0x3e4e0c60, 0x30000000, 0x3ff1d352, 0x5a5f0333, 0x3e6f9cab,
+ 0x30000000, 0x3ff1d79d, 0x744c333d, 0x3e630f24, 0x20000000, 0x3ff1dbe6, 0x2a76b2fe, 0x3e4b5062,
+ 0xf0000000, 0x3ff1e02c, 0xba595375, 0x3e6fdb94, 0xd0000000, 0x3ff1e471, 0xb945a171, 0x3e3861b9,
+ 0x90000000, 0x3ff1e8b4, 0x015188c4, 0x3e654348, 0x50000000, 0x3ff1ecf5, 0x49865523, 0x3e6b54d1,
+ 0x10000000, 0x3ff1f134, 0x83d9de33, 0x3e6a0bb7, 0xd0000000, 0x3ff1f570, 0x2b1a2157, 0x3e6629d1,
+ 0x90000000, 0x3ff1f9ab, 0x35d179df, 0x3e6467fe, 0x50000000, 0x3ff1fde4, 0x3e26c8f7, 0x3e69763f,
+ 0x20000000, 0x3ff2021b, 0xbb9f7679, 0x3e53f798, 0xf0000000, 0x3ff2064f, 0x7e855898, 0x3e552e57,
+ 0xc0000000, 0x3ff20a82, 0xe5502c3a, 0x3e6fde47, 0xb0000000, 0x3ff20eb3, 0x548d96a0, 0x3e5cbd0b,
+ 0xa0000000, 0x3ff212e2, 0xf7be8de8, 0x3e6a9cd9, 0xb0000000, 0x3ff2170f, 0x704886de, 0x3e522bbe,
+ 0xc0000000, 0x3ff21b3a, 0x8317f020, 0x3e6e3dea, 0xf0000000, 0x3ff21f63, 0x85ac8855, 0x3e6e8120,
+ 0x40000000, 0x3ff2238b, 0x4f24cb07, 0x3e5c8714, 0xa0000000, 0x3ff227b0, 0xee311fa2, 0x3e61e128,
+ 0x20000000, 0x3ff22bd4, 0x3d61a2d3, 0x3e5b5c16, 0xc0000000, 0x3ff22ff5, 0x7fb90633, 0x3e47d97e,
+ 0x70000000, 0x3ff23415, 0x9d50f6a7, 0x3e6efe89, 0x50000000, 0x3ff23833, 0xeb75de5a, 0x3e6d0333,
+ 0x60000000, 0x3ff23c4f, 0xbe73a573, 0x3e40e590, 0x80000000, 0x3ff24069, 0xcac3cdd2, 0x3e68ce8d,
+ 0xd0000000, 0x3ff24481, 0x8954064b, 0x3e6ee8a4, 0x50000000, 0x3ff24898, 0x18461e09, 0x3e6aa62f,
+ 0x00000000, 0x3ff24cad, 0x40986a15, 0x3e601e59, 0xe0000000, 0x3ff250bf, 0x4f9b8d4c, 0x3e3b082f,
+ 0xe0000000, 0x3ff254d0, 0xe5527f5a, 0x3e6876e0, 0x20000000, 0x3ff258e0, 0x80831e6b, 0x3e636170,
+ 0x90000000, 0x3ff25ced, 0xe34aa4a2, 0x3e681b26, 0x40000000, 0x3ff260f9, 0x6dfab0c1, 0x3e552ee6,
+ 0x20000000, 0x3ff26503, 0x329e8819, 0x3e5d85a5, 0x40000000, 0x3ff2690b, 0xb646b5d1, 0x3e5105c1,
+ 0x90000000, 0x3ff26d11, 0x0c1a379c, 0x3e6bb669, 0x30000000, 0x3ff27116, 0xa73ce3a9, 0x3e586aeb,
+ 0x00000000, 0x3ff27519, 0x98294dd4, 0x3e6dd161, 0x20000000, 0x3ff2791a, 0x75775e83, 0x3e6454e6,
+ 0x80000000, 0x3ff27d19, 0x026197ea, 0x3e63842e, 0x20000000, 0x3ff28117, 0xe70c44d2, 0x3e6f1ce0,
+ 0x10000000, 0x3ff28513, 0x441a5627, 0x3e6ad636, 0x50000000, 0x3ff2890d, 0xd7212abb, 0x3e54c205,
+ 0xd0000000, 0x3ff28d05, 0x6c116419, 0x3e6167c8, 0xa0000000, 0x3ff290fc, 0xef16e294, 0x3e638ec3,
+ 0xc0000000, 0x3ff294f1, 0xeace9321, 0x3e6473fc, 0x30000000, 0x3ff298e5, 0xa836dba7, 0x3e67af53,
+ 0x00000000, 0x3ff29cd7, 0xc383b652, 0x3e1a51f3, 0x10000000, 0x3ff2a0c7, 0xa190822d, 0x3e63696d,
+ 0x80000000, 0x3ff2a4b5, 0xec77074b, 0x3e62f9ad, 0x50000000, 0x3ff2a8a2, 0xd5bee55f, 0x3e38190f,
+ 0x70000000, 0x3ff2ac8d, 0xfac68e55, 0x3e4bfee8, 0xf0000000, 0x3ff2b076, 0x6bc5f68a, 0x3e331c9d,
+ 0xc0000000, 0x3ff2b45e, 0x23737edf, 0x3e689d05, 0x00000000, 0x3ff2b845, 0x43bf47bb, 0x3e5a2959,
+ 0xa0000000, 0x3ff2bc29, 0x2e5b3207, 0x3e396be3, 0x90000000, 0x3ff2c00c, 0xd909fa0e, 0x3e6e44c7,
+ 0x00000000, 0x3ff2c3ee, 0xda94d9ea, 0x3e2b2505, 0xc0000000, 0x3ff2c7cd, 0xf46c9c98, 0x3e60c851,
+ 0xf0000000, 0x3ff2cbab, 0x7d9aa3b7, 0x3e5da71f, 0x80000000, 0x3ff2cf88, 0x5d019ef1, 0x3e6f1b60,
+ 0x90000000, 0x3ff2d363, 0xa2189563, 0x3e4386e8, 0x00000000, 0x3ff2d73d, 0x5d306ba7, 0x3e3b19fa,
+ 0xd0000000, 0x3ff2db14, 0xb67aef76, 0x3e6dd749, 0x20000000, 0x3ff2deeb, 0xf1dc04b0, 0x3e676ff6,
+ 0xe0000000, 0x3ff2e2bf, 0xd0b232a6, 0x3e635a33, 0x10000000, 0x3ff2e693, 0x0024a4e1, 0x3e64bdc8,
+ 0xb0000000, 0x3ff2ea64, 0x770fd723, 0x3e6ebd61, 0xd0000000, 0x3ff2ee34, 0xc537264d, 0x3e64769f,
+ 0x60000000, 0x3ff2f203, 0x429f3b98, 0x3e69021f, 0x70000000, 0x3ff2f5d0, 0x3efbd606, 0x3e5ee708,
+ 0xf0000000, 0x3ff2f99b, 0x552a6b1a, 0x3e6ad985, 0xf0000000, 0x3ff2fd65, 0x78772160, 0x3e6e3df7,
+ 0x70000000, 0x3ff3012e, 0x6ddc9b34, 0x3e6ca5d7, 0x70000000, 0x3ff304f5, 0xffdbaf74, 0x3e691154,
+ 0xf0000000, 0x3ff308ba, 0x57fb306a, 0x3e667bdd, 0xf0000000, 0x3ff30c7e, 0x5ac40886, 0x3e67dc25,
+ 0x80000000, 0x3ff31041, 0x8e8afafe, 0x3df219f3, 0x80000000, 0x3ff31402, 0xf9669a04, 0x3e62416b,
+ 0x10000000, 0x3ff317c2, 0xb2b3987f, 0x3e611c96, 0x20000000, 0x3ff31b80, 0x447e1177, 0x3e6f99ed,
+ 0xd0000000, 0x3ff31f3c, 0x26328a11, 0x3e132458, 0xf0000000, 0x3ff322f7, 0xd1e645f8, 0x3e66f56d,
+ 0xb0000000, 0x3ff326b1, 0x46945535, 0x3e461649, 0xf0000000, 0x3ff32a69, 0x9d190028, 0x3e5e37d5,
+ 0xc0000000, 0x3ff32e20, 0xf12bf828, 0x3e668671, 0x20000000, 0x3ff331d6, 0xca6aabbd, 0x3e6e8ecb,
+ 0x20000000, 0x3ff3358a, 0x109a5912, 0x3e53f49e, 0xa0000000, 0x3ff3393c, 0x11ec3043, 0x3e6b8a0e,
+ 0xc0000000, 0x3ff33ced, 0x0aed691a, 0x3e65fae0, 0x70000000, 0x3ff3409d, 0xbece3e4a, 0x3e6c0569,
+ 0xc0000000, 0x3ff3444b, 0x744efbfe, 0x3e605e26, 0xa0000000, 0x3ff347f8, 0xa94be5c5, 0x3e65b570,
+ 0x20000000, 0x3ff34ba4, 0x6ea0e063, 0x3e5d6f15, 0x30000000, 0x3ff34f4e, 0x612fc484, 0x3e6e0ca7,
+ 0xf0000000, 0x3ff352f6, 0x27b25258, 0x3e4963c9, 0x40000000, 0x3ff3569e, 0xaa725a5c, 0x3e547930,
+ 0x30000000, 0x3ff35a44, 0xe3af43b3, 0x3e58a79f, 0xc0000000, 0x3ff35de8, 0x9c41bdaf, 0x3e5e6dc2,
+ 0xf0000000, 0x3ff3618b, 0x76f863a5, 0x3e657a2e, 0xd0000000, 0x3ff3652d, 0x1716354d, 0x3e2ae3b6,
+ 0x40000000, 0x3ff368ce, 0xdf6906b1, 0x3e665fb5, 0x60000000, 0x3ff36c6d, 0x7f588f7b, 0x3e66177d,
+ 0x30000000, 0x3ff3700b, 0xbd091b67, 0x3e3ad55a, 0xa0000000, 0x3ff373a7, 0xb2422d76, 0x3e155337,
+ 0xb0000000, 0x3ff37742, 0xe86972d5, 0x3e6084eb, 0x70000000, 0x3ff37adc, 0x808e1ea3, 0x3e656395,
+ 0xe0000000, 0x3ff37e74, 0x1b40fba7, 0x3e61bce2, 0x00000000, 0x3ff3820c, 0x4605b515, 0x3e5006f9,
+ 0xc0000000, 0x3ff385a1, 0xaceb1f7d, 0x3e6aa676, 0x40000000, 0x3ff38936, 0x76554ce6, 0x3e58229f,
+ 0x60000000, 0x3ff38cc9, 0x6cf57330, 0x3e6eabfc, 0x40000000, 0x3ff3905b, 0x9c0ce8bc, 0x3e64daed,
+ 0xd0000000, 0x3ff393eb, 0x68237141, 0x3e60ff17, 0x10000000, 0x3ff3977b, 0x3051b085, 0x3e6575f8,
+ 0x10000000, 0x3ff39b09, 0xeb523e29, 0x3e42667d, 0xc0000000, 0x3ff39e95, 0x6954f4fd, 0x3e181699,
+ 0x20000000, 0x3ff3a221, 0xcf4d9cd4, 0x3e587cfc, 0x40000000, 0x3ff3a5ab, 0x18198353, 0x3e52c5d0,
+ 0x10000000, 0x3ff3a934, 0x8dcc34aa, 0x3e6a7a89, 0xb0000000, 0x3ff3acbb, 0xdadc36d1, 0x3e2cead6,
+ 0x00000000, 0x3ff3b042, 0x9c498bdf, 0x3e2a5575, 0x00000000, 0x3ff3b3c7, 0x9ef6de04, 0x3e6c414a,
+ 0xd0000000, 0x3ff3b74a, 0x8a6e58fa, 0x3e63e210, 0x60000000, 0x3ff3bacd, 0x7643d77c, 0x3e5587fd,
+ 0xb0000000, 0x3ff3be4e, 0x1d3ff3df, 0x3e3901eb, 0xb0000000, 0x3ff3c1ce, 0x7c812fc6, 0x3e6f2ccd,
+ 0x90000000, 0x3ff3c54d, 0x70a01049, 0x3e21c8ee, 0x20000000, 0x3ff3c8cb, 0x02831eec, 0x3e563e8d,
+ 0x70000000, 0x3ff3cc47, 0x2a92c7ff, 0x3e6f61a4, 0xa0000000, 0x3ff3cfc2, 0x99c84d24, 0x3dda9173,
+ 0x80000000, 0x3ff3d33c, 0xc8eec2f0, 0x3e5e9197, 0x30000000, 0x3ff3d6b5, 0x2f5a1378, 0x3e5e6f84,
+ 0xb0000000, 0x3ff3da2c, 0x2a90a0fc, 0x3e2fac24, 0xf0000000, 0x3ff3dda2, 0x26610227, 0x3e535ed7,
+ 0x00000000, 0x3ff3e118, 0x4804b15b, 0x3e50e0d6, 0xe0000000, 0x3ff3e48b, 0x5daba814, 0x3e056067,
+ 0x80000000, 0x3ff3e7fe, 0xc8768032, 0x3e637388, 0x00000000, 0x3ff3eb70, 0x9f9e01f5, 0x3e3ee3c8,
+ 0x40000000, 0x3ff3eee0, 0x0d09747c, 0x3e639f6f, 0x60000000, 0x3ff3f24f, 0x27abb8f0, 0x3e4322c3,
+ 0x40000000, 0x3ff3f5bd, 0x47c8ac80, 0x3e6961b3, 0x00000000, 0x3ff3f92a, 0xbbd0f118, 0x3e63711f,
+ 0x90000000, 0x3ff3fc95, 0xd7718ffb, 0x3e64fad8, 0xf0000000, 0x3ff3ffff, 0xffffffff, 0x3e6fffff,
+ 0x30000000, 0x3ff40369, 0x79ec35b4, 0x3e667efa, 0x40000000, 0x3ff406d1, 0x87a254a8, 0x3e6a7376,
+ 0x30000000, 0x3ff40a38, 0xf87d924d, 0x3e5bace0, 0xf0000000, 0x3ff40d9d, 0xc237e392, 0x3e629e37,
+ 0x90000000, 0x3ff41102, 0xac3f3012, 0x3e557ce7, 0x00000000, 0x3ff41466, 0x359f8fbd, 0x3e682829,
+ 0x50000000, 0x3ff417c8, 0x42d14676, 0x3e6cc9be, 0x80000000, 0x3ff41b29, 0x1c137d0b, 0x3e6a8f00,
+ 0x90000000, 0x3ff41e89, 0x687dda05, 0x3e636127, 0x80000000, 0x3ff421e8, 0x322646f0, 0x3e524dba,
+ 0x40000000, 0x3ff42546, 0x1ed210b4, 0x3e6dc43f, 0xf0000000, 0x3ff428a2, 0x15c447bb, 0x3e631ae5,
+ 0xf0000000, 0x3fe428a2, 0x15c447bb, 0x3e531ae5, 0xa0000000, 0x3fe965fe, 0xf20ac166, 0x3e44f5b8,
+ 0x00000000, 0x3ff00000, 0x00000000, 0x00000000, 0xf0000000, 0x3ff428a2, 0x15c447bb, 0x3e631ae5,
+ 0xa0000000, 0x3ff965fe, 0xf20ac166, 0x3e54f5b8, 0x00000000, 0x3ff00000, 0x00000000, 0x00000000,
+ 0x30000000, 0x3ff02c9a, 0xc1dcdef9, 0x3e6cef00, 0xd0000000, 0x3ff059b0, 0xa1d73e2a, 0x3e48ac2b,
+ 0x10000000, 0x3ff08745, 0x901186be, 0x3e60eb37, 0x60000000, 0x3ff0b558, 0x1ec53172, 0x3e69f312,
+ 0x30000000, 0x3ff0e3ec, 0x10103a17, 0x3e469e8d, 0xd0000000, 0x3ff11301, 0xa4ebbf1a, 0x3df25b50,
+ 0xa0000000, 0x3ff1429a, 0xbf668203, 0x3e6d525b, 0x30000000, 0x3ff172b8, 0xf5b9bef9, 0x3e68faa2,
+ 0xe0000000, 0x3ff1a35b, 0xea796d31, 0x3e66df96, 0x30000000, 0x3ff1d487, 0xa7805b80, 0x3e368b9a,
+ 0x80000000, 0x3ff2063b, 0xac771dd6, 0x3e60c519, 0x60000000, 0x3ff2387a, 0x70cd83f5, 0x3e6ceac4,
+ 0x60000000, 0x3ff26b45, 0x7495e99c, 0x3e5789f3, 0xf0000000, 0x3ff29e9d, 0x84b09745, 0x3e547f7b,
+ 0xa0000000, 0x3ff2d285, 0x2d002475, 0x3e5b900c, 0x00000000, 0x3ff306fe, 0x2a5bd1ab, 0x3e64636e,
+ 0xb0000000, 0x3ff33c08, 0xfa64e430, 0x3e4320b7, 0x30000000, 0x3ff371a7, 0x2a9c5154, 0x3e5ceaa7,
+ 0x30000000, 0x3ff3a7db, 0xdba86f24, 0x3e53967f, 0x40000000, 0x3ff3dea6, 0x446b6824, 0x3e682468,
+ 0x20000000, 0x3ff4160a, 0x9f84325b, 0x3e3f72e2, 0x60000000, 0x3ff44e08, 0x40c4dbd0, 0x3e18624b,
+ 0xb0000000, 0x3ff486a2, 0x404f068e, 0x3e5704f3, 0xd0000000, 0x3ff4bfda, 0x9c750e5e, 0x3e54d8a8,
+ 0x70000000, 0x3ff4f9b2, 0x9ab4cf62, 0x3e5a74b2, 0x50000000, 0x3ff5342b, 0x077c2a0f, 0x3e5a753e,
+ 0x30000000, 0x3ff56f47, 0x699bb2c0, 0x3e5ad49f, 0xd0000000, 0x3ff5ab07, 0x52b19260, 0x3e6a90a8,
+ 0x10000000, 0x3ff5e76f, 0x21ba6f93, 0x3e56b485, 0xb0000000, 0x3ff6247e, 0x58f87d03, 0x3e0d2ac2,
+ 0x80000000, 0x3ff66238, 0x24893ecf, 0x3e42a911, 0x60000000, 0x3ff6a09e, 0x32422cbe, 0x3e59fcef,
+ 0x30000000, 0x3ff6dfb2, 0x5de441c5, 0x3e68ca34, 0xe0000000, 0x3ff71f75, 0xe7ba46e1, 0x3e61d8be,
+ 0x50000000, 0x3ff75feb, 0x22fdba6a, 0x3e59099f, 0x70000000, 0x3ff7a114, 0x36bea881, 0x3e4f580c,
+ 0x30000000, 0x3ff7e2f3, 0x8841740a, 0x3e5b3d39, 0x90000000, 0x3ff82589, 0x25159f11, 0x3e62999c,
+ 0x90000000, 0x3ff868d9, 0xd901c83b, 0x3e668925, 0x40000000, 0x3ff8ace5, 0xdadd3e2a, 0x3e415506,
+ 0x90000000, 0x3ff8f1ae, 0x6c57304e, 0x3e622aee, 0xb0000000, 0x3ff93737, 0x9e8a0387, 0x3e29b8bc,
+ 0x90000000, 0x3ff97d82, 0x9f173d24, 0x3e6fbc9c, 0x80000000, 0x3ff9c491, 0x80e3e235, 0x3e451f84,
+ 0x70000000, 0x3ffa0c66, 0xc96535b5, 0x3e66bbca, 0xb0000000, 0x3ffa5503, 0xe45a1224, 0x3e41f12a,
+ 0x50000000, 0x3ffa9e6b, 0xfd0fac90, 0x3e55e7f6, 0x90000000, 0x3ffae89f, 0x5abd0e69, 0x3e62b5a7,
+ 0xb0000000, 0x3ffb33a2, 0xf5ed7fa1, 0x3e609e2b, 0xf0000000, 0x3ffb7f76, 0x37553d84, 0x3e47daf2,
+ 0x90000000, 0x3ffbcc1e, 0x891ee83d, 0x3e12f074, 0xd0000000, 0x3ffc199b, 0x38444196, 0x3e6b0aa5,
+ 0x20000000, 0x3ffc67f1, 0x9694426f, 0x3e6cafa2, 0xd0000000, 0x3ffcb720, 0xd22a0797, 0x3e69df20,
+ 0x40000000, 0x3ffd072d, 0xf71a1e45, 0x3e640f12, 0xd0000000, 0x3ffd5818, 0x0e4bb40b, 0x3e69f749,
+ 0x00000000, 0x3ffda9e6, 0x2b84600d, 0x3e4ed994, 0x30000000, 0x3ffdfc97, 0xf5cb4656, 0x3e4bdcda,
+ 0xe0000000, 0x3ffe502e, 0xd89cf44c, 0x3e5e2cff, 0xa0000000, 0x3ffea4af, 0xcc2c7b9d, 0x3e452486,
+ 0xe0000000, 0x3ffefa1b, 0x4eee3fa4, 0x3e6cc2b4, 0x50000000, 0x3fff5076, 0x80ce9f09, 0x3e66dc8a,
+ 0x80000000, 0x3fffa7c1, 0x82e90a7e, 0x3e39e90d, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x3f8fc0a8, 0x7c79f3db, 0x3e361f80, 0x00000000, 0x3f9f8298, 0x980267c8, 0x3e6873c1,
+ 0x00000000, 0x3fa77458, 0x9f88c69e, 0x3e5ec65b, 0x00000000, 0x3faf0a30, 0x54cc2f99, 0x3e58022c,
+ 0x00000000, 0x3fb341d7, 0x3a125330, 0x3e62c37a, 0x00000000, 0x3fb6f0d2, 0x69737c93, 0x3e615cad,
+ 0x00000000, 0x3fba926d, 0xb1b285e9, 0x3e4d256a, 0x00000000, 0x3fbe2707, 0xb97a7aa2, 0x3e5b8abc,
+ 0x00000000, 0x3fc0d77e, 0x9659a5dc, 0x3e6f3423, 0x80000000, 0x3fc29552, 0x48d30177, 0x3e6e07fd,
+ 0x00000000, 0x3fc44d2b, 0x4799f4f6, 0x3e6b32df, 0x00000000, 0x3fc5ff30, 0xf4f21cf8, 0x3e6c29e4,
+ 0x00000000, 0x3fc7ab89, 0x48df1b59, 0x3e1086c8, 0x80000000, 0x3fc9525a, 0xb4764130, 0x3e4cf456,
+ 0x00000000, 0x3fcaf3c9, 0xfcb63398, 0x3e63a02f, 0x80000000, 0x3fcc8ff7, 0x886b0976, 0x3e61e6a6,
+ 0x00000000, 0x3fce2707, 0xb97a7aa2, 0x3e6b8abc, 0x00000000, 0x3fcfb918, 0x8aa35552, 0x3e6b578f,
+ 0xc0000000, 0x3fd0a324, 0x71afb9fc, 0x3e6139c8, 0x80000000, 0x3fd1675c, 0x0701ce64, 0x3e65d5d3,
+ 0xc0000000, 0x3fd22941, 0xb2d12142, 0x3e6de7bc, 0x80000000, 0x3fd2e8e2, 0x984e1664, 0x3e6d708e,
+ 0x40000000, 0x3fd3a64c, 0xe9c72f36, 0x3e556945, 0xc0000000, 0x3fd4618b, 0x13e85bda, 0x3e20e2f6,
+ 0x80000000, 0x3fd51aad, 0xb42724f6, 0x3e3cb7e0, 0x80000000, 0x3fd5d1bd, 0xe52846c7, 0x3e6fac04,
+ 0x00000000, 0x3fd686c8, 0xaec442be, 0x3e5e9b14, 0xc0000000, 0x3fd739d7, 0x034e7126, 0x3e6b5de8,
+ 0x00000000, 0x3fd7eaf8, 0xe1b259d3, 0x3e6dc157, 0x80000000, 0x3fd89a33, 0x6ad69c62, 0x3e3b0509,
+ 0x00000000, 0x3fd94794, 0xfaba4cdd, 0x3e5c2116, 0xc0000000, 0x3fd9f323, 0x25f95b47, 0x3e665fcc,
+ 0x80000000, 0x3fda9cec, 0x498d4850, 0x3e5a9a08, 0x40000000, 0x3fdb44f7, 0xb1465f77, 0x3e6de647,
+ 0x80000000, 0x3fdbeb4d, 0x7bf7861d, 0x3e5da71b, 0xc0000000, 0x3fdc8ff7, 0x86b09760, 0x3e3e6a68,
+ 0x40000000, 0x3fdd32fe, 0xeab0ef64, 0x3e6f0075, 0x00000000, 0x3fddd46a, 0x82fb989b, 0x3e330712,
+ 0x40000000, 0x3fde7442, 0xc3f1bed2, 0x3e60eb43, 0x40000000, 0x3fdf128f, 0xecb35c84, 0x3e5faf06,
+ 0x80000000, 0x3fdfaf58, 0x3db35f68, 0x3e4ef1e6, 0xa0000000, 0x3fe02552, 0xfb1a71a5, 0x3e469743,
+ 0x40000000, 0x3fe0723e, 0x404e5796, 0x3e6c1cdf, 0xe0000000, 0x3fe0be72, 0x0ada625e, 0x3e4094aa,
+ 0x80000000, 0x3fe109f3, 0x96fde3ec, 0x3e6e2d4c, 0xc0000000, 0x3fe154c3, 0xe9a98f34, 0x3e62f4d5,
+ 0xa0000000, 0x3fe19ee6, 0x6ecc5cbe, 0x3e6467c9, 0x40000000, 0x3fe1e85f, 0xd03dec5a, 0x3e6e7040,
+ 0xc0000000, 0x3fe23130, 0x4282de36, 0x3e67bebf, 0x00000000, 0x3fe2795e, 0x1aeb783f, 0x3e6289b1,
+ 0xe0000000, 0x3fe2c0e9, 0x1772f538, 0x3e5a891d, 0x20000000, 0x3fe307d7, 0xbe1fb591, 0x3e634f10,
+ 0x80000000, 0x3fe34e28, 0xd316eb93, 0x3e6d9ce1, 0xc0000000, 0x3fe393e0, 0x19a9c442, 0x3e63562a,
+ 0x60000000, 0x3fe3d902, 0xf548084c, 0x3e54e2ad, 0xe0000000, 0x3fe41d8f, 0x5cc8c97a, 0x3e508ce5,
+ 0xc0000000, 0x3fe4618b, 0x13e85bda, 0x3e30e2f6, 0x40000000, 0x3fe4a4f8, 0xbb0227bf, 0x3e6db03e,
+ 0x00000000, 0x3fe4e7d8, 0xb09cb098, 0x3e61b75b, 0x20000000, 0x3fe52a2d, 0xabb9df22, 0x3e496f16,
+ 0xc0000000, 0x3fe56bf9, 0x99411c62, 0x3e65b3f3, 0x40000000, 0x3fe5ad40, 0x59f65355, 0x3e586b3e,
+ 0xa0000000, 0x3fe5ee02, 0xeae1ac12, 0x3e52482c, 0xe0000000, 0x3fe62e42, 0xef35793c, 0x3e6efa39,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xa0000000, 0x3f6ff00a, 0x0250435a, 0x3db5885e,
+ 0x60000000, 0x3f7fe02a, 0x11f86ed2, 0x3de620cf, 0x50000000, 0x3f87dc47, 0xedba4a25, 0x3dff0214,
+ 0xb0000000, 0x3f8fc0a8, 0x79f3db4e, 0x3dbf807c, 0x40000000, 0x3f93cea4, 0xa779a52b, 0x3dea352b,
+ 0x00000000, 0x3f97b91b, 0x6aa49fd5, 0x3dff56c4, 0x20000000, 0x3f9b9fc0, 0x5fef5196, 0x3dfebe46,
+ 0x00000000, 0x3f9f829b, 0x0099f1f8, 0x3e0cf066, 0x80000000, 0x3fa1b0d9, 0xff85945d, 0x3e1247b2,
+ 0xb0000000, 0x3fa39e87, 0xbf5202b6, 0x3e13fd7a, 0xa0000000, 0x3fa58a5b, 0xa918d51e, 0x3e1f91c9,
+ 0xf0000000, 0x3fa77458, 0xf118d3ca, 0x3e08cb73, 0x00000000, 0x3fa95c83, 0xd6fad074, 0x3e1d91c7,
+ 0x70000000, 0x3fab42dd, 0xec28d14c, 0x3de1971b, 0x80000000, 0x3fad276b, 0xa423c78a, 0x3e15b616,
+ 0xc0000000, 0x3faf0a30, 0x617cc971, 0x3da162a6, 0x30000000, 0x3fb07598, 0xc4c06d29, 0x3e166391,
+ 0xe0000000, 0x3fb16536, 0xc1d0c4b8, 0x3e2d46f5, 0x20000000, 0x3fb253f6, 0x2df1f6d3, 0x3e2e1428,
+ 0x90000000, 0x3fb341d7, 0x424a660d, 0x3e186f47, 0xb0000000, 0x3fb42edc, 0xe077753e, 0x3e2d4c8d,
+ 0x30000000, 0x3fb51b07, 0x7ed24f1c, 0x3e2e0c30, 0xa0000000, 0x3fb60658, 0x8763bdd3, 0x3e226ea1,
+ 0x80000000, 0x3fb6f0d2, 0x9737c933, 0x3e25cad6, 0x60000000, 0x3fb7da76, 0x99088901, 0x3e2af625,
+ 0xd0000000, 0x3fb8c345, 0x83d6b2d0, 0x3e18c66c, 0x40000000, 0x3fb9ab42, 0xb36fb30f, 0x3e1880ce,
+ 0x30000000, 0x3fba926d, 0xc6ca17a4, 0x3e2495aa, 0x20000000, 0x3fbb78c8, 0x4210878c, 0x3e2761db,
+ 0x80000000, 0x3fbc5e54, 0x862bac2f, 0x3e2eb78e, 0xd0000000, 0x3fbd4313, 0x75790dd9, 0x3e19b2cd,
+ 0x60000000, 0x3fbe2707, 0xcbd3d50f, 0x3e2c55e5, 0xc0000000, 0x3fbf0a30, 0x617cc971, 0x3db162a6,
+ 0x30000000, 0x3fbfec91, 0xaaa2e519, 0x3dfdbeab, 0x10000000, 0x3fc06715, 0x7150c647, 0x3e1652cb,
+ 0x70000000, 0x3fc0d77e, 0xb2cd2ee2, 0x3e39a11c, 0x80000000, 0x3fc14785, 0xb1a28813, 0x3e219d0a,
+ 0xd0000000, 0x3fc1b72a, 0x80a41811, 0x3e24bd9e, 0x10000000, 0x3fc2266f, 0x96faa3df, 0x3e3214b5,
+ 0xf0000000, 0x3fc29552, 0x46980bb8, 0x3e303fea, 0x10000000, 0x3fc303d7, 0xa5fd28c7, 0x3e31c8ff,
+ 0x20000000, 0x3fc371fc, 0x3bcd96c5, 0x3dce8f74, 0xb0000000, 0x3fc3dfc2, 0x395315c6, 0x3dfd98c5,
+ 0x60000000, 0x3fc44d2b, 0x3ccfa7b2, 0x3e3996fa, 0xf0000000, 0x3fc4ba36, 0x2ad13037, 0x3e1cd2af,
+ 0xe0000000, 0x3fc526e5, 0xbd17200e, 0x3e1d0da1, 0xd0000000, 0x3fc59338, 0x0ba68b75, 0x3e333041,
+ 0x70000000, 0x3fc5ff30, 0x790e7c41, 0x3df4f27a, 0x40000000, 0x3fc66acd, 0x86f6ff1b, 0x3e13956a,
+ 0xe0000000, 0x3fc6d60f, 0x723551d9, 0x3e2c6748, 0xf0000000, 0x3fc740f8, 0x9326cdfc, 0x3e2500de,
+ 0x00000000, 0x3fc7ab89, 0x48df1b59, 0x3e1086c8, 0xa0000000, 0x3fc815c0, 0xad6836ff, 0x3e04357e,
+ 0x60000000, 0x3fc87fa0, 0x42408024, 0x3e248324, 0xd0000000, 0x3fc8e928, 0x8154b13d, 0x3e3d10da,
+ 0x90000000, 0x3fc9525a, 0x68ec8260, 0x3e39e8ad, 0x20000000, 0x3fc9bb36, 0x06abaf18, 0x3e3cfbf7,
+ 0x10000000, 0x3fca23bc, 0xc6326e23, 0x3e3fc56a, 0xf0000000, 0x3fca8bec, 0x3185cf21, 0x3e39105e,
+ 0x40000000, 0x3fcaf3c9, 0xe5b19cc0, 0x3e3d017f, 0x90000000, 0x3fcb5b51, 0x48dd13fe, 0x3e3d1f6b,
+ 0x70000000, 0x3fcbc286, 0x58a7e73a, 0x3e20b633, 0x50000000, 0x3fcc2968, 0x028c211c, 0x3e263063,
+ 0xc0000000, 0x3fcc8ff7, 0x86b09760, 0x3e2e6a68, 0x40000000, 0x3fccf635, 0xb891cd03, 0x3e3c138b,
+ 0x60000000, 0x3fcd5c21, 0x22b7221a, 0x3e369f77, 0xa0000000, 0x3fcdc1bc, 0xac1a628c, 0x3df57d8f,
+ 0x60000000, 0x3fce2707, 0xcbd3d50f, 0x3e3c55e5, 0x50000000, 0x3fce8c02, 0xff48fe2e, 0x3e1552d2,
+ 0xc0000000, 0x3fcef0ad, 0x6ca431bc, 0x3e37b8b2, 0x50000000, 0x3fcf550a, 0xdc1c5f6d, 0x3e292dec,
+ 0x60000000, 0x3fcfb918, 0x551aaa8c, 0x3e3abc7c, 0x40000000, 0x3fd00e6c, 0x731a354b, 0x3e36b540,
+ 0x90000000, 0x3fd04025, 0x036b89ef, 0x3e32d341, 0x50000000, 0x3fd071b8, 0x1a3a2e0f, 0x3e4f9ab2,
+ 0xe0000000, 0x3fd0a324, 0x1afb9fbd, 0x3e239c87, 0x50000000, 0x3fd0d46b, 0x2c81f640, 0x3e3e6add,
+ 0xf0000000, 0x3fd1058b, 0xaa313f41, 0x3e435c95, 0x00000000, 0x3fd13687, 0x82f6cc53, 0x3e249d45,
+ 0xa0000000, 0x3fd1675c, 0x1c07398f, 0x3e47574c, 0x20000000, 0x3fd1980d, 0xdece9e8d, 0x3e4ba846,
+ 0xc0000000, 0x3fd1c898, 0xafbc68e7, 0x3e16999f, 0x90000000, 0x3fd1f8ff, 0xe51b0103, 0x3e4c9145,
+ 0xf0000000, 0x3fd22941, 0xcb44850a, 0x3e479ef2, 0x10000000, 0x3fd25960, 0x3de11275, 0x3e0beec7,
+ 0x10000000, 0x3fd2895a, 0x1af5a498, 0x3e2ef435, 0x30000000, 0x3fd2b930, 0x493b4a50, 0x3e45713a,
+ 0xb0000000, 0x3fd2e8e2, 0x61385992, 0x3e45c23a, 0xc0000000, 0x3fd31871, 0x09f57299, 0x3e42a883,
+ 0x90000000, 0x3fd347dd, 0xa9ac8ace, 0x3e4530fa, 0x60000000, 0x3fd37726, 0xd792a758, 0x3e25fec2,
+ 0x50000000, 0x3fd3a64c, 0xa71cbcd7, 0x3e35a517, 0xa0000000, 0x3fd3d54f, 0x3e1cd9a3, 0x3e3707dc,
+ 0x80000000, 0x3fd40430, 0x8ef43049, 0x3e3a1a9f, 0x20000000, 0x3fd432ef, 0x276b3674, 0x3e4409d0,
+ 0xc0000000, 0x3fd4618b, 0x13e85bd9, 0x3e20e2f6, 0x80000000, 0x3fd49006, 0x33001e5f, 0x3df00274,
+ 0x90000000, 0x3fd4be5f, 0x836d3265, 0x3e35dde2, 0x30000000, 0x3fd4ec97, 0x4d7aaf04, 0x3e230013,
+ 0x80000000, 0x3fd51aad, 0xb42724f5, 0x3e3cb7e0, 0xc0000000, 0x3fd548a2, 0x167e6308, 0x3e2d6e93,
+ 0x10000000, 0x3fd57677, 0xb1526adb, 0x3e3d1569, 0xb0000000, 0x3fd5a42a, 0x338a1a41, 0x3e0e99fc,
+ 0xb0000000, 0x3fd5d1bd, 0x94a11b1c, 0x3e4eb013, 0x70000000, 0x3fd5ff30, 0x790e7c41, 0x3e04f27a,
+ 0xf0000000, 0x3fd62c82, 0xa97b7af9, 0x3e25ce3c, 0x70000000, 0x3fd659b5, 0x940ed857, 0x3e281f0f,
+ 0x10000000, 0x3fd686c8, 0x5d88857c, 0x3e4d3629, 0x20000000, 0x3fd6b3bb, 0xec4af526, 0x3e21aca1,
+ 0xa0000000, 0x3fd6e08e, 0xc7182726, 0x3e445743, 0xe0000000, 0x3fd70d42, 0xaead337e, 0x3e23c491,
+ 0xf0000000, 0x3fd739d7, 0x1a738931, 0x3e3aef40, 0x10000000, 0x3fd7664e, 0x76092a29, 0x3e21cede,
+ 0x50000000, 0x3fd792a5, 0x44f82bb4, 0x3e4fba8f, 0x00000000, 0x3fd7bede, 0x7f3c3e1a, 0x3e446f5f,
+ 0x30000000, 0x3fd7eaf8, 0x86c9674b, 0x3e47055f, 0x10000000, 0x3fd816f4, 0x2b6b6e1a, 0x3e4b41a9,
+ 0xd0000000, 0x3fd842d1, 0x2e927628, 0x3e443d16, 0x90000000, 0x3fd86e91, 0x4013f9b1, 0x3e446617,
+ 0x80000000, 0x3fd89a33, 0x6ad69c62, 0x3e3b0509, 0xc0000000, 0x3fd8c5b7, 0x150faa58, 0x3e40b169,
+ 0x80000000, 0x3fd8f11e, 0x1df85da7, 0x3e3cd98b, 0xe0000000, 0x3fd91c67, 0x7b0f8fa8, 0x3e468b50,
+ 0x10000000, 0x3fd94794, 0xf57499ba, 0x3e48422d, 0x40000000, 0x3fd972a3, 0x86970274, 0x3e113515,
+ 0x80000000, 0x3fd99d95, 0xacba92ee, 0x3e117e08, 0x00000000, 0x3fd9c86b, 0x14dd0229, 0x3e26e043,
+ 0xe0000000, 0x3fd9f323, 0x97e56d1a, 0x3e497f30, 0x60000000, 0x3fda1dc0, 0x55901286, 0x3e3356e6,
+ 0x90000000, 0x3fda4840, 0x457f94d6, 0x3e0cb761, 0x90000000, 0x3fda72a4, 0xa85a9dac, 0x3e39af67,
+ 0x90000000, 0x3fda9cec, 0x931a909f, 0x3e453410, 0xc0000000, 0x3fdac718, 0x206058f5, 0x3e22c587,
+ 0x30000000, 0x3fdaf129, 0x58899c22, 0x3e223bc3, 0x00000000, 0x3fdb1b1e, 0xb6d223cb, 0x3e4d7bf8,
+ 0x70000000, 0x3fdb44f7, 0xc5197ddb, 0x3e47991e, 0x90000000, 0x3fdb6eb5, 0xbb3a9219, 0x3e4a79e6,
+ 0x90000000, 0x3fdb9858, 0xed663ec5, 0x3e3a4c43, 0x80000000, 0x3fdbc1e0, 0x1484f438, 0x3e461b5a,
+ 0x90000000, 0x3fdbeb4d, 0xf7ef0c3a, 0x3e4b4e36, 0xf0000000, 0x3fdc149f, 0x6acd0d1b, 0x3e115f02,
+ 0xa0000000, 0x3fdc3dd7, 0x35cecf05, 0x3e3f36b5, 0xe0000000, 0x3fdc66f4, 0xbf3eb5c6, 0x3e2ffb7f,
+ 0xc0000000, 0x3fdc8ff7, 0x86b09760, 0x3e3e6a68, 0x70000000, 0x3fdcb8e0, 0x27f5bbc3, 0x3e3135eb,
+ 0x00000000, 0x3fdce1af, 0xd6f6fa57, 0x3e470be7, 0xa0000000, 0x3fdd0a63, 0xc84ab338, 0x3e4ce43c,
+ 0x70000000, 0x3fdd32fe, 0xaac3bd91, 0x3e4c01d7, 0x90000000, 0x3fdd5b7f, 0x07961060, 0x3e45c58d,
+ 0x20000000, 0x3fdd83e7, 0xf941456e, 0x3e3628bc, 0x30000000, 0x3fddac35, 0xa8461cd2, 0x3e4c58b2,
+ 0x00000000, 0x3fddd46a, 0x82fb989a, 0x3e330712, 0x90000000, 0x3fddfc85, 0x6a80f09c, 0x3e420dab,
+ 0x10000000, 0x3fde2488, 0x4c397b1e, 0x3e44f8d8, 0xa0000000, 0x3fde4c71, 0x08599e48, 0x3e40d0ee,
+ 0x60000000, 0x3fde7442, 0x7e37da36, 0x3e1d6878, 0x60000000, 0x3fde9bfa, 0xd591bafc, 0x3e366187,
+ 0xd0000000, 0x3fdec399, 0x00bae772, 0x3e223466, 0xc0000000, 0x3fdeeb20, 0xd0d61b8e, 0x3e390377,
+ 0x50000000, 0x3fdf128f, 0xd966b907, 0x3e4f5e0d, 0xb0000000, 0x3fdf39e5, 0xb79a00e2, 0x3e49023c,
+ 0xf0000000, 0x3fdf6123, 0x58c28ad8, 0x3e44e051, 0x30000000, 0x3fdf884a, 0x08b18ae4, 0x3e3bfa7b,
+ 0x80000000, 0x3fdfaf58, 0x3db35f67, 0x3e4ef1e6, 0x20000000, 0x3fdfd64f, 0x39493d4f, 0x3e0ec2ae,
+ 0x00000000, 0x3fdffd2e, 0x30ab2fa0, 0x3e40afe9, 0xb0000000, 0x3fe011fa, 0xa1810dd4, 0x3e225ff8,
+ 0xa0000000, 0x3fe02552, 0xfb1a71a5, 0x3e469743, 0xe0000000, 0x3fe0389e, 0x76785571, 0x3e5f9cc6,
+ 0x90000000, 0x3fe04bdf, 0xa4cbf982, 0x3e5b524d, 0xb0000000, 0x3fe05f14, 0x381535b8, 0x3e5a4c8b,
+ 0x50000000, 0x3fe0723e, 0x809caf2c, 0x3e5839be, 0x80000000, 0x3fe0855c, 0x1cb82c13, 0x3e50968a,
+ 0x40000000, 0x3fe0986f, 0x41723fb5, 0x3e5eae6a, 0xb0000000, 0x3fe0ab76, 0xa380a4db, 0x3e5d9c29,
+ 0xe0000000, 0x3fe0be72, 0x0ada625e, 0x3e4094aa, 0xc0000000, 0x3fe0d163, 0x6fc108ca, 0x3e5973ad,
+ 0x80000000, 0x3fe0e449, 0x2fdbab97, 0x3e474732, 0x10000000, 0x3fe0f724, 0xfa9d4221, 0x3e593692,
+ 0x90000000, 0x3fe109f3, 0x2dfbc7d9, 0x3e5c5a99, 0x10000000, 0x3fe11cb8, 0xe102387a, 0x3e4e1f33,
+ 0x90000000, 0x3fe12f71, 0xf14c048c, 0x3e464fbe, 0x20000000, 0x3fe14220, 0x13ca5e3b, 0x3e4490f5,
+ 0xd0000000, 0x3fe154c3, 0x4d4c799d, 0x3e37a6af, 0xa0000000, 0x3fe1675c, 0x1c07398f, 0x3e57574c,
+ 0xb0000000, 0x3fe179ea, 0x417f8c1c, 0x3e57b133, 0x00000000, 0x3fe18c6e, 0x0c176514, 0x3e5feb9e,
+ 0xb0000000, 0x3fe19ee6, 0xbb3172f7, 0x3e419f25, 0xb0000000, 0x3fe1b154, 0x7bbfb852, 0x3e45f68a,
+ 0x10000000, 0x3fe1c3b8, 0x497929f1, 0x3e5ee278, 0xf0000000, 0x3fe1d610, 0x06109d58, 0x3e5ccee0,
+ 0x50000000, 0x3fe1e85f, 0xa07bd8b3, 0x3e5ce081, 0x40000000, 0x3fe1faa3, 0x981817b8, 0x3e570e12,
+ 0xd0000000, 0x3fe20cdc, 0xd93503d0, 0x3e292ab6, 0xf0000000, 0x3fe21f0b, 0xd7c3b61e, 0x3e58cb7d,
+ 0xd0000000, 0x3fe23130, 0x0a0b78da, 0x3e4efafd, 0x60000000, 0x3fe2434b, 0x67c4288e, 0x3e5e9072,
+ 0xc0000000, 0x3fe2555b, 0x96780875, 0x3e5d31ef, 0x00000000, 0x3fe26762, 0xfcd2ad50, 0x3e23430d,
+ 0x10000000, 0x3fe2795e, 0xd75bc1f9, 0x3e344d88, 0x00000000, 0x3fe28b50, 0x055e04fc, 0x3e5bec0f,
+ 0xf0000000, 0x3fe29d37, 0x1590b9ad, 0x3e5d8561, 0xf0000000, 0x3fe2af15, 0x8e583229, 0x3df32056,
+ 0xe0000000, 0x3fe2c0e9, 0x1772f538, 0x3e5a891d, 0x00000000, 0x3fe2d2b4, 0xdabba74d, 0x3e22edc9,
+ 0x30000000, 0x3fe2e474, 0xa1015086, 0x3e4b9009, 0x90000000, 0x3fe2f62a, 0x8c5b1a19, 0x3e52a12a,
+ 0x30000000, 0x3fe307d7, 0xf0fdac85, 0x3e3a7885, 0x00000000, 0x3fe3197a, 0xd43ac691, 0x3e5f4ffc,
+ 0x30000000, 0x3fe32b13, 0xe2640aad, 0x3e52243a, 0xb0000000, 0x3fe33ca2, 0x299035d3, 0x3e546513,
+ 0x90000000, 0x3fe34e28, 0xa62dd725, 0x3e5b39c3, 0xe0000000, 0x3fe35fa4, 0x40049f51, 0x3e5ba6dd,
+ 0xb0000000, 0x3fe37117, 0xd7177409, 0x3e451d1e, 0xf0000000, 0x3fe38280, 0xfd7f5216, 0x3e5cb0f2,
+ 0xd0000000, 0x3fe393e0, 0xcd4e2213, 0x3e3ab150, 0x30000000, 0x3fe3a537, 0xf3193844, 0x3e5cfd7b,
+ 0x40000000, 0x3fe3b684, 0x455f1dbd, 0x3e53fff8, 0xf0000000, 0x3fe3c7c7, 0x0b905fc9, 0x3e5fee64,
+ 0x60000000, 0x3fe3d902, 0xf548084c, 0x3e54e2ad, 0x90000000, 0x3fe3ea33, 0xdc1ecdd2, 0x3e3b597a,
+ 0x80000000, 0x3fe3fb5b, 0x096d3a75, 0x3e4345bd, 0x40000000, 0x3fe40c7a, 0xd2453c8b, 0x3e5101b9,
+ 0xe0000000, 0x3fe41d8f, 0x5cc8c979, 0x3e508ce5, 0x60000000, 0x3fe42e9c, 0x7e595f71, 0x3e5bbf01,
+ 0xe0000000, 0x3fe43f9f, 0x3bd393dc, 0x3e37ce73, 0x50000000, 0x3fe4509a, 0xa503f8a1, 0x3e233bb0,
+ 0xc0000000, 0x3fe4618b, 0x13e85bd9, 0x3e30e2f6, 0x30000000, 0x3fe47274, 0x5a635b3c, 0x3e5e6755,
+ 0xd0000000, 0x3fe48353, 0xf73d5e8b, 0x3e2ea88d, 0x80000000, 0x3fe4942a, 0x3bda18a8, 0x3e3d17e0,
+ 0x50000000, 0x3fe4a4f8, 0x76044f7e, 0x3e5b607d, 0x60000000, 0x3fe4b5bd, 0xe71bc2fc, 0x3e52adc4,
+ 0xa0000000, 0x3fe4c679, 0x7362d1d9, 0x3e5f99dc, 0x30000000, 0x3fe4d72d, 0x008e6a6a, 0x3e5473fa,
+ 0x10000000, 0x3fe4e7d8, 0x09cb0985, 0x3e2b75bb, 0x30000000, 0x3fe4f87a, 0xd10b9aba, 0x3e5ea04d,
+ 0xc0000000, 0x3fe50913, 0xd6979674, 0x3e5802d0, 0xc0000000, 0x3fe519a4, 0xccd99094, 0x3e174688,
+ 0x20000000, 0x3fe52a2d, 0xabb9df22, 0x3e496f16, 0x00000000, 0x3fe53aad, 0xf2aa374f, 0x3e46e66d,
+ 0x60000000, 0x3fe54b24, 0x5ea4550a, 0x3e4e6652, 0x50000000, 0x3fe55b93, 0x34f20cbd, 0x3e42d02f,
+ 0xd0000000, 0x3fe56bf9, 0x65047188, 0x3e46cfce, 0xf0000000, 0x3fe57c57, 0x842d58b8, 0x3e39b78c,
+ 0xb0000000, 0x3fe58cad, 0x24c24bc9, 0x3e4735e6, 0x20000000, 0x3fe59cfb, 0xf7dd1adf, 0x3e47eba1,
+ 0x40000000, 0x3fe5ad40, 0x59f65355, 0x3e586b3e, 0x30000000, 0x3fe5bd7d, 0x637f1b4d, 0x3e1ce38e,
+ 0xd0000000, 0x3fe5cdb1, 0xc919edc7, 0x3e58d82e, 0x50000000, 0x3fe5ddde, 0x8ddcfa37, 0x3e4c5264,
+ 0xa0000000, 0x3fe5ee02, 0xeae1ac12, 0x3e52482c, 0xd0000000, 0x3fe5fe1e, 0x311aba4f, 0x3e55a312,
+ 0xf0000000, 0x3fe60e32, 0x6329f225, 0x3e411e23, 0xf0000000, 0x3fe61e3e, 0xcd2f246c, 0x3e5b48c8,
+ 0xe0000000, 0x3fe62e42, 0xef35793c, 0x3e6efa39, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x3fffe000, 0xe01fe020, 0x3effe01f,
+ 0x00000000, 0x3fffc000, 0x01fc07f0, 0x3f1fc07f, 0x00000000, 0x3fffa000, 0x1fa11caa, 0x3f31caa0,
+ 0x00000000, 0x3fff8000, 0x1f81f820, 0x3f3f81f8, 0x00000000, 0x3fff6000, 0x06ddaba6, 0x3f488565,
+ 0x00000000, 0x3fff4000, 0x2909c560, 0x3f519679, 0x00000000, 0x3fff2000, 0x8c2ad433, 0x3f57d910,
+ 0x00000000, 0x3fff0000, 0xf07c1f08, 0x3f5f07c1, 0x00000000, 0x3ffee000, 0x8b1c03dd, 0x3f638ff0,
+ 0x00000000, 0x3ffec000, 0x03d980f6, 0x3f680f66, 0x00000000, 0x3ffea000, 0x7403d5d0, 0x3f6d00f5,
+ 0x00000000, 0x3ffe9000, 0x0b7672a0, 0x3f331abf, 0x00000000, 0x3ffe7000, 0x5d43919b, 0x3f506a96,
+ 0x00000000, 0x3ffe5000, 0x0795ceb2, 0x3f5ceb24, 0x00000000, 0x3ffe3000, 0xb834e67f, 0x3f6522f3,
+ 0x00000000, 0x3ffe1000, 0x3c3c3c3c, 0x3f6c3c3c, 0x00000000, 0x3ffe0000, 0x1e01e01e, 0x3f3e01e0,
+ 0x00000000, 0x3ffde000, 0xe21a291c, 0x3f575b8f, 0x00000000, 0x3ffdc000, 0x403b9404, 0x3f6403b9,
+ 0x00000000, 0x3ffda000, 0x7303b5cc, 0x3f6cc0ed, 0x00000000, 0x3ffd9000, 0xf3fc4da2, 0x3f479118,
+ 0x00000000, 0x3ffd7000, 0xe0b0ce46, 0x3f5ed952, 0x00000000, 0x3ffd5000, 0xeae56404, 0x3f695900,
+ 0x00000000, 0x3ffd4000, 0x1d41d41d, 0x3f3d41d4, 0x00000000, 0x3ffd2000, 0xf16c69ae, 0x3f5cb28f,
+ 0x00000000, 0x3ffd0000, 0xdd80e866, 0x3f696b1e, 0x00000000, 0x3ffcf000, 0x25fe30d9, 0x3f4372e2,
+ 0x00000000, 0x3ffcd000, 0x073615a2, 0x3f60ad12, 0x00000000, 0x3ffcb000, 0x0397cdb3, 0x3f6cdb2c,
+ 0x00000000, 0x3ffca000, 0x7b864407, 0x3f52cc15, 0x00000000, 0x3ffc8000, 0xf7148404, 0x3f664cb5,
+ 0x00000000, 0x3ffc7000, 0x1c71c71c, 0x3f3c71c7, 0x00000000, 0x3ffc5000, 0x1a930b84, 0x3f6129a2,
+ 0x00000000, 0x3ffc3000, 0x87f1e038, 0x3f6f1e03, 0x00000000, 0x3ffc2000, 0xba80709b, 0x3f5ad4e4,
+ 0x00000000, 0x3ffc0000, 0x0381c0e0, 0x3f6c0e07, 0x00000000, 0x3ffbf000, 0x1a362bb0, 0x3f560fba,
+ 0x00000000, 0x3ffbd000, 0x280dee96, 0x3f6a5713, 0x00000000, 0x3ffbc000, 0x20f9ece9, 0x3f53f596,
+ 0x00000000, 0x3ffba000, 0x83759f23, 0x3f69f229, 0x00000000, 0x3ffb9000, 0x63fc8d5c, 0x3f5478ac,
+ 0x00000000, 0x3ffb7000, 0xb4671656, 0x3f6ad87b, 0x00000000, 0x3ffb6000, 0xfbb8148c, 0x3f578b8e,
+ 0x00000000, 0x3ffb4000, 0xd0369d03, 0x3f6d0369, 0x00000000, 0x3ffb3000, 0x601b3748, 0x3f5d212b,
+ 0x00000000, 0x3ffb2000, 0x406c80d9, 0x3f0b2036, 0x00000000, 0x3ffb0000, 0xb24547d1, 0x3f629663,
+ 0x00000000, 0x3ffaf000, 0x0d79435e, 0x3f4435e5, 0x00000000, 0x3ffad000, 0x2920bc03, 0x3f67d0ff,
+ 0x00000000, 0x3ffac000, 0x15c06b16, 0x3f55c06b, 0x00000000, 0x3ffaa000, 0x0fd7f954, 0x3f6e3a5f,
+ 0x00000000, 0x3ffa9000, 0xd4c77b03, 0x3f61dec0, 0x00000000, 0x3ffa8000, 0x870ac52e, 0x3f473289,
+ 0x00000000, 0x3ffa6000, 0xa034da03, 0x3f6a034d, 0x00000000, 0x3ffa5000, 0xa2292856, 0x3f5d041d,
+ 0x00000000, 0x3ffa4000, 0x1a41a41a, 0x3f3a41a4, 0x00000000, 0x3ffa2000, 0x8a39409d, 0x3f68550f,
+ 0x00000000, 0x3ffa1000, 0xe92c0686, 0x3f5b4fe5, 0x00000000, 0x3ffa0000, 0x1a01a01a, 0x3f3a01a0,
+ 0x00000000, 0x3ff9e000, 0x2067b23a, 0x3f691d2a, 0x00000000, 0x3ff9d000, 0xada0b4e5, 0x3f5e7c5d,
+ 0x00000000, 0x3ff9c000, 0x25080ce1, 0x3f468a77, 0x00000000, 0x3ff9a000, 0xaa21b490, 0x3f6c49d4,
+ 0x00000000, 0x3ff99000, 0x33333333, 0x3f633333, 0x00000000, 0x3ff98000, 0x3b03fccf, 0x3f54bc36,
+ 0x00000000, 0x3ff97000, 0x970e4f81, 0x3f2c9f01, 0x00000000, 0x3ff95000, 0xc6ef5b25, 0x3f697617,
+ 0x00000000, 0x3ff94000, 0xadd3c0ca, 0x3f6161f9, 0x00000000, 0x3ff93000, 0x6cb39806, 0x3f5319fe,
+ 0x00000000, 0x3ff92000, 0x1c451ab3, 0x3f2f693a, 0x00000000, 0x3ff90000, 0x0321a9e2, 0x3f6a9e24,
+ 0x00000000, 0x3ff8f000, 0x3831f383, 0x3f63831f, 0x00000000, 0x3ff8e000, 0xc4dcfc1c, 0x3f5949eb,
+ 0x00000000, 0x3ff8d000, 0x80c6980c, 0x3f480c69, 0x00000000, 0x3ff8b000, 0xc5fe7403, 0x3f6f9d00,
+ 0x00000000, 0x3ff8a000, 0xd7e75347, 0x3f69721e, 0x00000000, 0x3ff89000, 0x0313381f, 0x3f6381ec,
+ 0x00000000, 0x3ff88000, 0xaec12653, 0x3f5b97c2, 0x00000000, 0x3ff87000, 0x024ae3ba, 0x3f509ef3,
+ 0x00000000, 0x3ff86000, 0x18618618, 0x3f386186, 0x00000000, 0x3ff84000, 0xf00c2780, 0x3f6e0184,
+ 0x00000000, 0x3ff83000, 0x657dba52, 0x3f692ef5, 0x00000000, 0x3ff82000, 0x05494030, 0x3f649403,
+ 0x00000000, 0x3ff81000, 0x30303030, 0x3f603030, 0x00000000, 0x3ff80000, 0x80601806, 0x3f580601,
+ 0x00000000, 0x3ff7f000, 0x05fd017f, 0x3f5017f4, 0x00000000, 0x3ff7e000, 0xd278e8dd, 0x3f412a8a,
+ 0x00000000, 0x3ff7d000, 0x417d05f4, 0x3f17d05f, 0x00000000, 0x3ff7b000, 0x5c02f7d6, 0x3f6d6724,
+ 0x00000000, 0x3ff7a000, 0xc1d986a9, 0x3f6a4411, 0x00000000, 0x3ff79000, 0x6c7316df, 0x3f6754d7,
+ 0x00000000, 0x3ff78000, 0xf149902f, 0x3f649902, 0x00000000, 0x3ff77000, 0x358c1a68, 0x3f621023,
+ 0x00000000, 0x3ff76000, 0xd2a6c406, 0x3f5f7390, 0x00000000, 0x3ff75000, 0x05d5b2b1, 0x3f5b2b08,
+ 0x00000000, 0x3ff74000, 0x745d1746, 0x3f5745d1, 0x00000000, 0x3ff73000, 0x07fa32c4, 0x3f53c315,
+ 0x00000000, 0x3ff72000, 0x1b7af017, 0x3f50a1fd, 0x00000000, 0x3ff71000, 0xe3e0453a, 0x3f4bc36c,
+ 0x00000000, 0x3ff70000, 0x5c0b8170, 0x3f4702e0, 0x00000000, 0x3ff6f000, 0x9300b793, 0x3f4300b7,
+ 0x00000000, 0x3ff6e000, 0x337c6cb1, 0x3f3f76b4, 0x00000000, 0x3ff6d000, 0x1c860fb0, 0x3f3a6268,
+ 0x00000000, 0x3ff6c000, 0x16c16c17, 0x3f36c16c, 0x00000000, 0x3ff6b000, 0x31a3cfc7, 0x3f3490aa,
+ 0x00000000, 0x3ff6a000, 0x3729043e, 0x3f33cd15, 0x00000000, 0x3ff69000, 0x8d0bfd2e, 0x3f3473a8,
+ 0x00000000, 0x3ff68000, 0x16816817, 0x3f368168, 0x00000000, 0x3ff67000, 0x16719f36, 0x3f39f360,
+ 0x00000000, 0x3ff66000, 0x122f9016, 0x3f3ec6a5, 0x00000000, 0x3ff65000, 0xda5519cf, 0x3f427c29,
+ 0x00000000, 0x3ff64000, 0x590b2164, 0x3f4642c8, 0x00000000, 0x3ff63000, 0x5606f00b, 0x3f4ab5c4,
+ 0x00000000, 0x3ff62000, 0x0b11fd3c, 0x3f4fd3b8, 0x00000000, 0x3ff61000, 0xc6ba4eaa, 0x3f52cda0,
+ 0x00000000, 0x3ff60000, 0x60581606, 0x3f560581, 0x00000000, 0x3ff5f000, 0xa4b7ef87, 0x3f5990d0,
+ 0x00000000, 0x3ff5e000, 0x40579d6f, 0x3f5d6ee3, 0x00000000, 0x3ff5d000, 0xd9c54a69, 0x3f60cf87,
+ 0x00000000, 0x3ff5c000, 0x2620ae4c, 0x3f631057, 0x00000000, 0x3ff5b000, 0x8ff522a2, 0x3f65798c,
+ 0x00000000, 0x3ff5a000, 0x02b580ad, 0x3f680ad6, 0x00000000, 0x3ff59000, 0x4799546f, 0x3f6ac3e2,
+ 0x00000000, 0x3ff58000, 0x02b1da46, 0x3f6da461, 0x00000000, 0x3ff58000, 0x01580560, 0x3f158056,
+ 0x00000000, 0x3ff57000, 0x06b39a23, 0x3f3ed3c5, 0x00000000, 0x3ff56000, 0xe2970f60, 0x3f4cbdd3,
+ 0x00000000, 0x3ff55000, 0x55555555, 0x3f555555, 0x00000000, 0x3ff54000, 0xee0bf805, 0x3f5c979a,
+ 0x00000000, 0x3ff53000, 0xe81fd58e, 0x3f621291, 0x00000000, 0x3ff52000, 0x500a9580, 0x3f65fead,
+ 0x00000000, 0x3ff51000, 0xc5f02a3a, 0x3f6a0fd5, 0x00000000, 0x3ff50000, 0x23898adc, 0x3f6e45c2,
+ 0x00000000, 0x3ff50000, 0x15015015, 0x3f350150, 0x00000000, 0x3ff4f000, 0xea64d422, 0x3f4c7b16,
+ 0x00000000, 0x3ff4e000, 0xbc14e5e1, 0x3f57829c, 0x00000000, 0x3ff4d000, 0xb8589720, 0x3f60877d,
+ 0x00000000, 0x3ff4c000, 0x4b5edcea, 0x3f65710e, 0x00000000, 0x3ff4b000, 0x4d1fc1c8, 0x3f6a7dbb,
+ 0x00000000, 0x3ff4a000, 0xa57eb503, 0x3f6fad40, 0x00000000, 0x3ff4a000, 0xb00a5140, 0x3f43fd6b,
+ 0x00000000, 0x3ff49000, 0xcb419ba9, 0x3f54e78e, 0x00000000, 0x3ff48000, 0x029100a4, 0x3f600a44,
+ 0x00000000, 0x3ff47000, 0x5c28f5c3, 0x3f65c28f, 0x00000000, 0x3ff46000, 0xb2c0cc4a, 0x3f6b9c68,
+ 0x00000000, 0x3ff46000, 0xb9f34381, 0x3f2978fe, 0x00000000, 0x3ff45000, 0x3bb6500a, 0x3f4ecf16,
+ 0x00000000, 0x3ff44000, 0x8b67ebb9, 0x3f5be195, 0x00000000, 0x3ff43000, 0x57dc9a3b, 0x3f644e61,
+ 0x00000000, 0x3ff42000, 0xaa3f0ddf, 0x3f6acc4b, 0x00000000, 0x3ff42000, 0xcb2a247b, 0x3f26a4cb,
+ 0x00000000, 0x3ff41000, 0x50505050, 0x3f505050, 0x00000000, 0x3ff40000, 0x39959819, 0x3f5e0b44,
+ 0x00000000, 0x3ff3f000, 0x6027f602, 0x3f66027f, 0x00000000, 0x3ff3e000, 0x4b5e0db4, 0x3f6d1e85,
+ 0x00000000, 0x3ff3e000, 0x254813e2, 0x3f4165e7, 0x00000000, 0x3ff3d000, 0xa9d716ef, 0x3f576646,
+ 0x00000000, 0x3ff3c000, 0xf757ce88, 0x3f632b48, 0x00000000, 0x3ff3b000, 0x4652a906, 0x3f6ac1b2,
+ 0x00000000, 0x3ff3b000, 0x13b13b14, 0x3f33b13b, 0x00000000, 0x3ff3a000, 0xeb208984, 0x3f5490e1,
+ 0x00000000, 0x3ff39000, 0x30fec66e, 0x3f623858, 0x00000000, 0x3ff38000, 0xcc111b7e, 0x3f6a45a6,
+ 0x00000000, 0x3ff38000, 0x13813814, 0x3f338138, 0x00000000, 0x3ff37000, 0x2517b708, 0x3f556f47,
+ 0x00000000, 0x3ff36000, 0xbc0e8f2a, 0x3f631be7, 0x00000000, 0x3ff35000, 0x3e55f044, 0x3f6b9cbf,
+ 0x00000000, 0x3ff35000, 0x5bc609a9, 0x3f40e7d9, 0x00000000, 0x3ff34000, 0x804d19e7, 0x3f59e6b3,
+ 0x00000000, 0x3ff33000, 0xaf7963c2, 0x3f65c8b6, 0x00000000, 0x3ff32000, 0xd43bf402, 0x3f6eb9da,
+ 0x00000000, 0x3ff32000, 0x5885fb37, 0x3f4f1a51, 0x00000000, 0x3ff31000, 0xd3d76c02, 0x3f60eeb1,
+ 0x00000000, 0x3ff30000, 0x61a32026, 0x3f6a3202, 0x00000000, 0x3ff30000, 0x40260390, 0x3f3c82ac,
+ 0x00000000, 0x3ff2f000, 0x84bda12f, 0x3f5a12f6, 0x00000000, 0x3ff2e000, 0xfda2962c, 0x3f669d43,
+ 0x00000000, 0x3ff2e000, 0xc04b8097, 0x3f02e025, 0x00000000, 0x3ff2d000, 0xb542804b, 0x3f542804,
+ 0x00000000, 0x3ff2c000, 0x02593f6a, 0x3f63f69b, 0x00000000, 0x3ff2b000, 0xb46e21fa, 0x3f6df31c,
+ 0x00000000, 0x3ff2b000, 0x04ad012b, 0x3f5012b4, 0x00000000, 0x3ff2a000, 0xe7820a7f, 0x3f623925,
+ 0x00000000, 0x3ff29000, 0xc8253c82, 0x3f6c8253, 0x00000000, 0x3ff29000, 0xc02526e5, 0x3f4b92dd,
+ 0x00000000, 0x3ff28000, 0x11602511, 0x3f616025, 0x00000000, 0x3ff27000, 0x439c9adf, 0x3f6bf471,
+ 0x00000000, 0x3ff27000, 0x0939a85c, 0x3f4a85c4, 0x00000000, 0x3ff26000, 0xac024d16, 0x3f6166f9,
+ 0x00000000, 0x3ff25000, 0x0125e227, 0x3f6c44e1, 0x00000000, 0x3ff25000, 0x8bbd90e5, 0x3f4cebf4,
+ 0x00000000, 0x3ff24000, 0x92492492, 0x3f624924, 0x00000000, 0x3ff23000, 0x2ec0b673, 0x3f6d6f2e,
+ 0x00000000, 0x3ff23000, 0x6af37c05, 0x3f5159e2, 0x00000000, 0x3ff22000, 0x40245402, 0x3f640245,
+ 0x00000000, 0x3ff21000, 0x43f6f024, 0x3f6f6f02, 0x00000000, 0x3ff21000, 0x21579805, 0x3f55e601,
+ 0x00000000, 0x3ff20000, 0xcf81b10f, 0x3f668e18, 0x00000000, 0x3ff20000, 0x12012012, 0x3f320120,
+ 0x00000000, 0x3ff1f000, 0x047dc11f, 0x3f5c11f7, 0x00000000, 0x3ff1e000, 0xff70985e, 0x3f69e878,
+ 0x00000000, 0x3ff1e000, 0xfdc3a219, 0x3f4779d9, 0x00000000, 0x3ff1d000, 0x5c957907, 0x3f61eace,
+ 0x00000000, 0x3ff1c000, 0x450239e1, 0x3f6e0d5b, 0x00000000, 0x3ff1c000, 0x73816367, 0x3f548bf0,
+ 0x00000000, 0x3ff1b000, 0x8dda5202, 0x3f669480, 0x00000000, 0x3ff1b000, 0x2bae2b21, 0x3f37c67f,
+ 0x00000000, 0x3ff1a000, 0x69ee5847, 0x3f5ee584, 0x00000000, 0x3ff19000, 0xc0233c02, 0x3f6c0233,
+ 0x00000000, 0x3ff19000, 0x328a7012, 0x3f514e02, 0x00000000, 0x3ff18000, 0x2057b573, 0x3f656107,
+ 0x00000000, 0x3ff18000, 0x11811812, 0x3f318118, 0x00000000, 0x3ff17000, 0x6f5a1060, 0x3f5e2864,
+ 0x00000000, 0x3ff16000, 0x84e6f1d7, 0x3f6c0d12, 0x00000000, 0x3ff16000, 0xf0c80459, 0x3f523543,
+ 0x00000000, 0x3ff15000, 0xea4e1a09, 0x3f663cbe, 0x00000000, 0x3ff15000, 0xdd5c8cb8, 0x3f3b9a3f,
+ 0x00000000, 0x3ff14000, 0x159a76d2, 0x3f60be1c, 0x00000000, 0x3ff13000, 0x688e4838, 0x3f6e1d1a,
+ 0x00000000, 0x3ff13000, 0xd72044d7, 0x3f572044, 0x00000000, 0x3ff12000, 0xdb81577b, 0x3f691713,
+ 0x00000000, 0x3ff12000, 0xe9819b50, 0x3f4ac73a, 0x00000000, 0x3ff11000, 0x4e904cf6, 0x3f646033,
+ 0x00000000, 0x3ff11000, 0x11111111, 0x3f311111, 0x00000000, 0x3ff10000, 0x0441fef0, 0x3f5feef8,
+ 0x00000000, 0x3ff0f000, 0xfde021fe, 0x3f6de021, 0x00000000, 0x3ff0f000, 0xcc9686a0, 0x3f57b7ea,
+ 0x00000000, 0x3ff0e000, 0xcd391fbc, 0x3f69ead7, 0x00000000, 0x3ff0e000, 0x09804390, 0x3f501956,
+ 0x00000000, 0x3ff0d000, 0x1e8d2b32, 0x3f664151, 0x00000000, 0x3ff0d000, 0xacf1ce96, 0x3f4222b1,
+ 0x00000000, 0x3ff0c000, 0x79b47582, 0x3f62e29f, 0x00000000, 0x3ff0c000, 0x682e11cd, 0x3f24f0d1,
+ 0x00000000, 0x3ff0b000, 0x96771e4d, 0x3f5f9bb0, 0x00000000, 0x3ff0a000, 0x5dd96ae2, 0x3f6e5ee4,
+ 0x00000000, 0x3ff0a000, 0xa0429a04, 0x3f5a0429, 0x00000000, 0x3ff09000, 0x5f06c021, 0x3f6bb74d,
+ 0x00000000, 0x3ff09000, 0x04254fce, 0x3f54fce4, 0x00000000, 0x3ff08000, 0xeacbc402, 0x3f695766,
+ 0x00000000, 0x3ff08000, 0x08421084, 0x3f508421, 0x00000000, 0x3ff07000, 0x71d5c338, 0x3f673e53,
+ 0x00000000, 0x3ff07000, 0x3fbe3368, 0x3f493052, 0x00000000, 0x3ff06000, 0xf225f6c4, 0x3f656b38,
+ 0x00000000, 0x3ff06000, 0x8d4fdf3b, 0x3f426e97, 0x00000000, 0x3ff05000, 0xe4eb0cc6, 0x3f63dd40,
+ 0x00000000, 0x3ff05000, 0x73404146, 0x3f397f7d, 0x00000000, 0x3ff04000, 0x2cc98af1, 0x3f629398,
+ 0x00000000, 0x3ff04000, 0x10410410, 0x3f304104, 0x00000000, 0x3ff03000, 0x048ff7e4, 0x3f618d6f,
+ 0x00000000, 0x3ff03000, 0xebc349de, 0x3f2236a3, 0x00000000, 0x3ff02000, 0xee53d18c, 0x3f60c9f8,
+ 0x00000000, 0x3ff02000, 0x81020408, 0x3f102040, 0x00000000, 0x3ff01000, 0xa2f46ea6, 0x3f60486c,
+ 0x00000000, 0x3ff01000, 0x10101010, 0x3ef01010, 0x00000000, 0x3ff00000, 0x02010080, 0x3f600804,
+ 0x00000000, 0x3ff00000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xc0000000, 0x3ff2cd9f, 0x096a0092, 0x3e513ae6,
+ 0x60000000, 0x400d03cf, 0xfb79a640, 0x3e5db70c, 0xe0000000, 0x40240926, 0xb66dc067, 0x3e8c2526,
+ 0x00000000, 0x403b4a38, 0x8647f380, 0x3e8b81b1, 0x60000000, 0x40528d01, 0xd1e1eb08, 0x3ebbc1cd,
+ 0x28000000, 0x406936d2, 0x1534fb09, 0x3ecd9f20, 0x68000000, 0x40812287, 0x4a4e9954, 0x3edd1c06,
+ 0x50000000, 0x409749ea, 0x5d06ea74, 0x3ed4eca6, 0x70000000, 0x40afa715, 0xbcc0ecc5, 0x3f00c259,
+ 0xc8000000, 0x40c5829d, 0x47cf9016, 0x3f2b5a66, 0x88000000, 0x40dd3c44, 0xdefb0870, 0x3f09691a,
+ 0x50000000, 0x40f3de16, 0xc29cde38, 0x3f53410f, 0x90000000, 0x410b00b5, 0x50b6fb3c, 0x3f46a31a,
+ 0x48000000, 0x412259ac, 0x71805c40, 0x3f57defc, 0xa8000000, 0x4138f0cc, 0xd80e0bab, 0x3f9eb49f,
+ 0xd0000000, 0x4150f2eb, 0x7bcd5920, 0x3f84fffc, 0x88000000, 0x41670934, 0xb6c63435, 0x3fc03a93,
+ 0x08000000, 0x417f4f22, 0xb255fd1c, 0x3fb1940b, 0xf8000000, 0x419546d8, 0x14260b50, 0x3fded26e,
+ 0x88000000, 0x41aceb08, 0x1fc9f2a2, 0x3ffb4740, 0xf8000000, 0x41c3a6e1, 0xf55634f1, 0x40267bb3,
+ 0xb8000000, 0x41dab5ad, 0xf8194ddc, 0x401c435f, 0x30000000, 0x41f226af, 0x052ba63a, 0x404d8fee,
+ 0xb0000000, 0x4208ab7f, 0xdccde3f6, 0x40651d7e, 0x90000000, 0x4220c3d3, 0x44557d1a, 0x40704b16,
+ 0x68000000, 0x4236c932, 0xca0a9dc4, 0x4076a6b5, 0xf0000000, 0x424ef822, 0x72249aba, 0x40afd9cc,
+ 0x30000000, 0x42650bba, 0x693edab5, 0x40ce58de, 0x40000000, 0x427c9aae, 0x58ac6363, 0x40d8c701,
+ 0x08000000, 0x42937047, 0x64f43e20, 0x40e76147, 0x58000000, 0x42aa6b76, 0xb36fc718, 0x4106337d,
+ 0xc8000000, 0x42c1f43f, 0xb1f611e2, 0x41212d98, 0x48000000, 0x42d866f3, 0x108b37cc, 0x412392bc,
+ 0x28000000, 0x42f0953e, 0xdc3473dc, 0x415ce87b, 0x20000000, 0x430689e2, 0xae99ad14, 0x414bc8d5,
+ 0xa0000000, 0x431ea215, 0x6744835c, 0x415d20d7, 0x00000000, 0x3ff00000, 0x00000000, 0x00000000,
+ 0x50000000, 0x3ff8b075, 0x04c2bd28, 0x3e3d9f55, 0x08000000, 0x400e18fa, 0xf0a4c9fd, 0x3e67cb66,
+ 0x90000000, 0x402422a4, 0x7928e588, 0x3e8f5861, 0x58000000, 0x403b4ee8, 0x00c38d48, 0x3e6bc7d0,
+ 0xc8000000, 0x40528d6f, 0x4e329998, 0x3eaf7f9d, 0x78000000, 0x406936e6, 0x64885269, 0x3ec6e6e4,
+ 0x48000000, 0x40812289, 0xb946c154, 0x3ecba3a8, 0xa8000000, 0x409749ea, 0x6110d5a4, 0x3ed3f4e7,
+ 0x80000000, 0x40afa715, 0x515a3e2b, 0x3f017622, 0xd0000000, 0x40c5829d, 0x528af3d0, 0x3ee4dc4b,
+ 0x88000000, 0x40dd3c44, 0x78615e10, 0x3f111562, 0x50000000, 0x40f3de16, 0x0ed821f5, 0x3f535ad5,
+ 0x90000000, 0x410b00b5, 0x55f2935c, 0x3f46b610, 0x48000000, 0x412259ac, 0x4a601240, 0x3f57e279,
+ 0xa8000000, 0x4138f0cc, 0x5f6aadd3, 0x3f9eb4b4, 0xd0000000, 0x4150f2eb, 0x967b3698, 0x3f85000b,
+ 0x88000000, 0x41670934, 0x0fadc092, 0x3fc03a94, 0x08000000, 0x417f4f22, 0xf3bf874c, 0x3fb1940b,
+ 0xf8000000, 0x419546d8, 0x1a2a2110, 0x3fded26e, 0x88000000, 0x41aceb08, 0x205796d6, 0x3ffb4740,
+ 0xf8000000, 0x41c3a6e1, 0xf55cb85d, 0x40267bb3, 0xb8000000, 0x41dab5ad, 0xf81e18ac, 0x401c435f,
+ 0x30000000, 0x41f226af, 0x052bdea4, 0x404d8fee, 0xb0000000, 0x4208ab7f, 0xdccde926, 0x40651d7e,
+ 0x90000000, 0x4220c3d3, 0x44557e0e, 0x40704b16, 0x68000000, 0x4236c932, 0xca0a9e1c, 0x4076a6b5,
+ 0xf0000000, 0x424ef822, 0x72249abe, 0x40afd9cc, 0x30000000, 0x42650bba, 0x693edab5, 0x40ce58de,
+ 0x40000000, 0x427c9aae, 0x58ac6364, 0x40d8c701, 0x08000000, 0x42937047, 0x64f43e20, 0x40e76147,
+ 0x58000000, 0x42aa6b76, 0xb36fc718, 0x4106337d, 0xc8000000, 0x42c1f43f, 0xb1f611e2, 0x41212d98,
+ 0x48000000, 0x42d866f3, 0x108b37cc, 0x412392bc, 0x28000000, 0x42f0953e, 0xdc3473dc, 0x415ce87b,
+ 0x20000000, 0x430689e2, 0xae99ad14, 0x414bc8d5, 0xa0000000, 0x431ea215, 0x6744835c, 0x415d20d7,
+ 0x00000000, 0x40000000, 0xe01fe020, 0x3fffe01f, 0x01fc07f0, 0x3fffc07f, 0xaa01fa12, 0x3fffa11c,
+ 0x1f81f820, 0x3fff81f8, 0xaca0dbb5, 0x3fff6310, 0x9e4a4271, 0x3fff4465, 0x44230ab5, 0x3fff25f6,
+ 0xf07c1f08, 0x3fff07c1, 0xf8458e02, 0x3ffee9c7, 0xb301ecc0, 0x3ffecc07, 0x7aba01eb, 0x3ffeae80,
+ 0xabf0b767, 0x3ffe9131, 0xa59750e4, 0x3ffe741a, 0xc901e574, 0x3ffe573a, 0x79dc1a73, 0x3ffe3a91,
+ 0x1e1e1e1e, 0x3ffe1e1e, 0x1e01e01e, 0x3ffe01e0, 0xe3f8868a, 0x3ffde5d6, 0xdca01dca, 0x3ffdca01,
+ 0x76b981db, 0x3ffdae60, 0x231e7f8a, 0x3ffd92f2, 0x54b82c34, 0x3ffd77b6, 0x807572b2, 0x3ffd5cac,
+ 0x1d41d41d, 0x3ffd41d4, 0xa3fc5b1a, 0x3ffd272c, 0x8f6ec074, 0x3ffd0cb5, 0x5c44bfc6, 0x3ffcf26e,
+ 0x89039b0b, 0x3ffcd856, 0x9601cbe7, 0x3ffcbe6d, 0x055ee191, 0x3ffca4b3, 0x5afb8a42, 0x3ffc8b26,
+ 0x1c71c71c, 0x3ffc71c7, 0xd10d4986, 0x3ffc5894, 0x01c3f8f0, 0x3ffc3f8f, 0x392ea01c, 0x3ffc26b5,
+ 0x0381c0e0, 0x3ffc0e07, 0xee868d8b, 0x3ffbf583, 0x899406f7, 0x3ffbdd2b, 0x65883e7b, 0x3ffbc4fd,
+ 0x14c1bad0, 0x3ffbacf9, 0x2b18ff23, 0x3ffb951e, 0x3dda338b, 0x3ffb7d6c, 0xe3beee05, 0x3ffb65e2,
+ 0xb4e81b4f, 0x3ffb4e81, 0x4ad806ce, 0x3ffb3748, 0x406c80d9, 0x3ffb2036, 0x31d922a4, 0x3ffb094b,
+ 0xbca1af28, 0x3ffaf286, 0x7f94905e, 0x3ffadbe8, 0x1ac5701b, 0x3ffac570, 0x2f87ebfd, 0x3ffaaf1d,
+ 0x606a63be, 0x3ffa98ef, 0x5130e159, 0x3ffa82e6, 0xa6d01a6d, 0x3ffa6d01, 0x07688a4a, 0x3ffa5741,
+ 0x1a41a41a, 0x3ffa41a4, 0x87c51ca0, 0x3ffa2c2a, 0xf97a4b02, 0x3ffa16d3, 0x1a01a01a, 0x3ffa01a0,
+ 0x951033d9, 0x3ff9ec8e, 0x176b682d, 0x3ff9d79f, 0x4ee4a102, 0x3ff9c2d1, 0xea5510da, 0x3ff9ae24,
+ 0x9999999a, 0x3ff99999, 0x0d8ec0ff, 0x3ff9852f, 0xf80cb872, 0x3ff970e4, 0x0be377ae, 0x3ff95cbb,
+ 0xfcd6e9e0, 0x3ff948b0, 0x7f9b2ce6, 0x3ff934c6, 0x49d0e229, 0x3ff920fb, 0x120190d5, 0x3ff90d4f,
+ 0x8f9c18fa, 0x3ff8f9c1, 0x7af1373f, 0x3ff8e652, 0x8d3018d3, 0x3ff8d301, 0x8062ff3a, 0x3ff8bfce,
+ 0x0f6bf3aa, 0x3ff8acb9, 0xf601899c, 0x3ff899c0, 0xf0abb04a, 0x3ff886e5, 0xbcc092b9, 0x3ff87427,
+ 0x18618618, 0x3ff86186, 0xc2780614, 0x3ff84f00, 0x7ab2bedd, 0x3ff83c97, 0x0182a4a0, 0x3ff82a4a,
+ 0x18181818, 0x3ff81818, 0x80601806, 0x3ff80601, 0xfd017f40, 0x3ff7f405, 0x515a4f1d, 0x3ff7e225,
+ 0x417d05f4, 0x3ff7d05f, 0x922e017c, 0x3ff7beb3, 0x08e0ecc3, 0x3ff7ad22, 0x6bb6398b, 0x3ff79baa,
+ 0x8178a4c8, 0x3ff78a4c, 0x119ac60d, 0x3ff77908, 0xe434a9b1, 0x3ff767dc, 0xc201756d, 0x3ff756ca,
+ 0x745d1746, 0x3ff745d1, 0xc541fe8d, 0x3ff734f0, 0x7f46debc, 0x3ff72428, 0x6d9c7c09, 0x3ff71378,
+ 0x5c0b8170, 0x3ff702e0, 0x16f26017, 0x3ff6f260, 0x6b4337c7, 0x3ff6e1f7, 0x2681c861, 0x3ff6d1a6,
+ 0x16c16c17, 0x3ff6c16c, 0x0aa31a3d, 0x3ff6b149, 0xd1537290, 0x3ff6a13c, 0x3a88d0c0, 0x3ff69147,
+ 0x16816817, 0x3ff68168, 0x3601671a, 0x3ff6719f, 0x6a5122f9, 0x3ff661ec, 0x853b4aa3, 0x3ff6524f,
+ 0x590b2164, 0x3ff642c8, 0xb88ac0de, 0x3ff63356, 0x77016240, 0x3ff623fa, 0x6831ae94, 0x3ff614b3,
+ 0x60581606, 0x3ff60581, 0x34292dfc, 0x3ff5f664, 0xb8d015e7, 0x3ff5e75b, 0xc3ece2a5, 0x3ff5d867,
+ 0x2b931057, 0x3ff5c988, 0xc647fa91, 0x3ff5babc, 0x6b015ac0, 0x3ff5ac05, 0xf123ccaa, 0x3ff59d61,
+ 0x308158ed, 0x3ff58ed2, 0x01580560, 0x3ff58056, 0x3c506b3a, 0x3ff571ed, 0xba7c52e2, 0x3ff56397,
+ 0x55555555, 0x3ff55555, 0xe6bb82fe, 0x3ff54725, 0x48f40feb, 0x3ff53909, 0x56a8054b, 0x3ff52aff,
+ 0xeae2f815, 0x3ff51d07, 0xe111c4c5, 0x3ff50f22, 0x15015015, 0x3ff50150, 0x62dd4c9b, 0x3ff4f38f,
+ 0xa72f0539, 0x3ff4e5e0, 0xbedc2c4c, 0x3ff4d843, 0x8725af6e, 0x3ff4cab8, 0xdda68fe1, 0x3ff4bd3e,
+ 0xa052bf5b, 0x3ff4afd6, 0xad76014a, 0x3ff4a27f, 0xe3b2d067, 0x3ff49539, 0x22014880, 0x3ff48805,
+ 0x47ae147b, 0x3ff47ae1, 0x34596066, 0x3ff46dce, 0xc7f5cf9a, 0x3ff460cb, 0xe2c776ca, 0x3ff453d9,
+ 0x6562d9fb, 0x3ff446f8, 0x30abee4d, 0x3ff43a27, 0x25d51f87, 0x3ff42d66, 0x265e5951, 0x3ff420b5,
+ 0x14141414, 0x3ff41414, 0xd10e6566, 0x3ff40782, 0x3fb013fb, 0x3ff3fb01, 0x42a5af07, 0x3ff3ee8f,
+ 0xbce4a902, 0x3ff3e22c, 0x91aa75c6, 0x3ff3d5d9, 0xa47babe7, 0x3ff3c995, 0xd9232955, 0x3ff3bd60,
+ 0x13b13b14, 0x3ff3b13b, 0x387ac822, 0x3ff3a524, 0x2c187f63, 0x3ff3991c, 0xd366088e, 0x3ff38d22,
+ 0x13813814, 0x3ff38138, 0xd1c945ee, 0x3ff3755b, 0xf3de0748, 0x3ff3698d, 0x5f9f2af8, 0x3ff35dce,
+ 0xfb2b78c1, 0x3ff3521c, 0xace01346, 0x3ff34679, 0x5b57bcb2, 0x3ff33ae4, 0xed6a1dfa, 0x3ff32f5c,
+ 0x4a2b10bf, 0x3ff323e3, 0x58e9ebb6, 0x3ff31877, 0x0130d190, 0x3ff30d19, 0x2ac40260, 0x3ff301c8,
+ 0xbda12f68, 0x3ff2f684, 0xa1fed14b, 0x3ff2eb4e, 0xc04b8097, 0x3ff2e025, 0x012d50a0, 0x3ff2d50a,
+ 0x4d812ca0, 0x3ff2c9fb, 0x8e5a3711, 0x3ff2bef9, 0xad012b40, 0x3ff2b404, 0x92f3c105, 0x3ff2a91c,
+ 0x29e4129e, 0x3ff29e41, 0x5bb804a5, 0x3ff29372, 0x1288b013, 0x3ff288b0, 0x38a1ce4d, 0x3ff27dfa,
+ 0xb8812735, 0x3ff27350, 0x7cd60127, 0x3ff268b3, 0x708092f1, 0x3ff25e22, 0x7e9177b2, 0x3ff2539d,
+ 0x92492492, 0x3ff24924, 0x9717605b, 0x3ff23eb7, 0x789abcdf, 0x3ff23456, 0x22a0122a, 0x3ff22a01,
+ 0x8121fb78, 0x3ff21fb7, 0x804855e6, 0x3ff21579, 0x0c67c0d9, 0x3ff20b47, 0x12012012, 0x3ff20120,
+ 0x7dc11f70, 0x3ff1f704, 0x3c7fb84c, 0x3ff1ecf4, 0x3b3fb874, 0x3ff1e2ef, 0x672e4abd, 0x3ff1d8f5,
+ 0xada2811d, 0x3ff1cf06, 0xfc1ce059, 0x3ff1c522, 0x4046ed29, 0x3ff1bb4a, 0x67f2bae3, 0x3ff1b17c,
+ 0x611a7b96, 0x3ff1a7b9, 0x19e0119e, 0x3ff19e01, 0x808ca29c, 0x3ff19453, 0x83902bdb, 0x3ff18ab0,
+ 0x11811812, 0x3ff18118, 0x191bd684, 0x3ff1778a, 0x89427379, 0x3ff16e06, 0x50fc3201, 0x3ff1648d,
+ 0x5f75270d, 0x3ff15b1e, 0xa3fdd5c9, 0x3ff151b9, 0x0e0acd3b, 0x3ff1485f, 0x8d344724, 0x3ff13f0e,
+ 0x1135c811, 0x3ff135c8, 0x89edc0ac, 0x3ff12c8b, 0xe75d3033, 0x3ff12358, 0x19a74826, 0x3ff11a30,
+ 0x11111111, 0x3ff11111, 0xbe011080, 0x3ff107fb, 0x10fef011, 0x3ff0fef0, 0xfab325a2, 0x3ff0f5ed,
+ 0x6be69c90, 0x3ff0ecf5, 0x55826011, 0x3ff0e406, 0xa88f4696, 0x3ff0db20, 0x56359e3a, 0x3ff0d244,
+ 0x4fbcda3b, 0x3ff0c971, 0x868b4171, 0x3ff0c0a7, 0xec259dc8, 0x3ff0b7e6, 0x722eecb5, 0x3ff0af2f,
+ 0x0a6810a7, 0x3ff0a681, 0xa6af8360, 0x3ff09ddb, 0x39010954, 0x3ff0953f, 0xb37565e2, 0x3ff08cab,
+ 0x08421084, 0x3ff08421, 0x29b8eae2, 0x3ff07b9f, 0x0a47f7c6, 0x3ff07326, 0x9c7912fb, 0x3ff06ab5,
+ 0xd2f1a9fc, 0x3ff0624d, 0xa0727586, 0x3ff059ee, 0xf7d73404, 0x3ff05197, 0xcc1664c5, 0x3ff04949,
+ 0x10410410, 0x3ff04104, 0xb78247fc, 0x3ff038c6, 0xb51f5e1a, 0x3ff03091, 0xfc7729e9, 0x3ff02864,
+ 0x81020408, 0x3ff02040, 0x36517a37, 0x3ff01824, 0x10101010, 0x3ff01010, 0x02010080, 0x3ff00804,
+ 0x00000000, 0x3ff00000, 0x87ec3637, 0x3dd06139, 0x8db86d61, 0xbe138a4b, 0xe5bcc98d, 0x3e4f7b72,
+ 0x634fb0e4, 0xbe85f1f0, 0x954a9137, 0x3ebb9df2, 0x3a67dc3c, 0xbeef4d1e, 0x1dd3898b, 0x3f1f9a32,
+ 0x3db06d60, 0xbf4c02db, 0xd0dbc1ad, 0x3f7565bc, 0x31284e9c, 0xbf9b82ce, 0x1a042b32, 0x3fbce2f2,
+ 0x6b0379e6, 0xbfd81274, 0x50429b6d, 0x3ff20dd7, 0x1438dcf6, 0x3dba1606, 0x016becfe, 0xbdff4342,
+ 0x75b4cde8, 0x3e395b1b, 0xf9c2a481, 0xbe71d468, 0xb7a0966a, 0x3ea6ae6b, 0xfda1afb2, 0xbeda0df5,
+ 0xd9475b18, 0x3f0ac250, 0xc8a35a21, 0xbf384227, 0xceb7b0e9, 0x3f631cd0, 0x054eefef, 0xbf89b3c1,
+ 0xbc5785f9, 0x3facf6d2, 0x451254ef, 0xbfcb5db0, 0xa741088b, 0x3feaf767, 0x6a2dd61d, 0x3da4e37d,
+ 0xe1edf74c, 0xbde92a56, 0x4377a2ac, 0x3e2491d9, 0x39f489a1, 0xbe5d38a6, 0x1dce54b4, 0x3e92d22f,
+ 0xc5671218, 0xbec5f6c1, 0x3a1bb9bd, 0x3ef70561, 0x46c610de, 0xbf25712a, 0xbf0e3574, 0x3f518a17,
+ 0xdb5a4b51, 0xbf78ea53, 0x50e230dd, 0x3f9e962f, 0x85d30895, 0xbfc0b60e, 0x95f8c2b3, 0x3fe5990d,
+ 0x45479566, 0x3d90d511, 0x59127e17, 0xbdd4667c, 0x3e09cefe, 0x3e10d308, 0xa495656e, 0xbe482e4c,
+ 0xa05c8f4f, 0x3e7f9bcf, 0x66933f59, 0xbeb2ca0d, 0xf3cce792, 0x3ee42cd2, 0x99c503dd, 0xbf136902,
+ 0x532c5193, 0x3f409c2f, 0xdf44f35e, 0xbf6931da, 0x1aa68815, 0x3f911720, 0x1d221312, 0xbfb5e25e,
+ 0xd6c7e25c, 0x3fe235fd, 0xc24c08dd, 0x3d7b51ef, 0x4c2104f1, 0xbdc0ab73, 0x866c02a1, 0x3dfbc79c,
+ 0x72027ff7, 0xbe343c2f, 0x21752c63, 0x3e6ae853, 0x76229e21, 0xbea0593b, 0x32c6dda4, 0x3ed2106d,
+ 0xf8633468, 0xbf020fd5, 0xc5ffc392, 0x3f304e0c, 0x0a3b61e7, 0xbf5ab23d, 0x9b1a01ca, 0x3f844016,
+ 0x759a9c41, 0xbfae8712, 0x142795e3, 0x3fdfd9ae, 0xcee056b0, 0xbdf46eed, 0xbf31cd83, 0x3e272c71,
+ 0x3414494b, 0xbe3b858c, 0x150492a9, 0xbe51e878, 0x4f9d39bd, 0xbe8d551c, 0x081cc18c, 0x3ec65597,
+ 0x3a3f547c, 0x3ef0e91e, 0x5416a98f, 0xbf30c9b6, 0x4dfcdccd, 0x3f2428f4, 0xe4d81e00, 0x3f80b3bd,
+ 0x46178bfd, 0xbf8cb801, 0x675394d2, 0xbfc946a9, 0x791dc8fb, 0x3fe6e23d, 0xd42d57ef, 0xbdb573c8,
+ 0xed1a27a8, 0xbdf632bf, 0x6b1145de, 0x3e367087, 0xbdc2436d, 0x3e2d7559, 0xa688c6ab, 0xbe9801bb,
+ 0xf4ea88f0, 0x3e8ad7ec, 0xf8bce95a, 0x3efc2cfa, 0x2fa996ef, 0xbf1f0bdd, 0x22b44655, 0xbf4a8a14,
+ 0x66397f44, 0x3f7b13bf, 0xbd4c13b8, 0x3f82a08f, 0x7a57ce71, 0xbfc9ce0d, 0x517103fe, 0x3fe05fd2,
+ 0x0e7c1431, 0x3dc14df8, 0xad2781f0, 0xbe00a71c, 0x333bdac6, 0x3e05e0fa, 0x8ecd3732, 0x3e62222b,
+ 0x9d8f65fe, 0xbe84bcf8, 0xe8101ae5, 0xbec10eb4, 0xc2c15462, 0x3ef46afc, 0x0af95711, 0x3efded8b,
+ 0x8fc77467, 0xbf50a3f2, 0x2397107c, 0x3f663734, 0x2190992e, 0x3f97d6f6, 0x75be54c3, 0xbfc56874,
+ 0xacd147f5, 0x3fd4cb2b, 0x7100d5fc, 0x3db9806d, 0xc3b2ca73, 0xbdd1537c, 0x60cdaaa7, 0xbe26c0f4,
+ 0x7eb23d7f, 0x3e5604f1, 0x4c3adb34, 0x3e7e86ae, 0x9b1fe971, 0xbec1b7ba, 0xc100d516, 0x3eceefdc,
+ 0x7287d24a, 0x3f19c090, 0xf860db94, 0xbf4594c1, 0x906b63ac, 0xbf48ab6e, 0xabea8a44, 0x3f9a798f,
+ 0x314c81f1, 0xbfbdca7c, 0x462cb19e, 0x3fc761d7, 0xaa177cb2, 0xbd902cf0, 0x207e29b4, 0x3decb11b,
+ 0x5fac5489, 0xbe209b21, 0xb5bdf6e3, 0xbe32b95b, 0xca4c97b7, 0x3e882b27, 0xc0a47266, 0xbeaa520c,
+ 0x67f1145d, 0xbedc5422, 0x3e7fc487, 0x3f161837, 0x7eb92091, 0xbf27130d, 0x8d1e6d3f, 0xbf63a37e,
+ 0x8a1743b5, 0x3f9522fd, 0x334d0c36, 0xbfb1ada1, 0xae493c1d, 0x3fb741a2, 0x3f800000, 0x00000000,
+ 0x3f804000, 0x3a28e585, 0x3f80a000, 0x399c910f, 0x3f80e000, 0x3a703484, 0x3f814000, 0x3a0eb4bc,
+ 0x3f81a000, 0x392750df, 0x3f81e000, 0x3a419dc7, 0x3f824000, 0x39ac3801, 0x3f828000, 0x3a675948,
+ 0x3f82e000, 0x39eabf9a, 0x3f834000, 0x356629d6, 0x3f838000, 0x3a07f04c, 0x3f83e000, 0x3848dac3,
+ 0x3f842000, 0x3a0e1b17, 0x3f848000, 0x384a1cc7, 0x3f84c000, 0x3a082ade, 0x3f852000, 0x363f31e5,
+ 0x3f856000, 0x39eccf0d, 0x3f85a000, 0x3a692c6f, 0x3f860000, 0x39b22cb1, 0x3f864000, 0x3a462d87,
+ 0x3f86a000, 0x3941e864, 0x3f86e000, 0x3a180409, 0x3f872000, 0x3a7cd32d, 0x3f878000, 0x39bdde6c,
+ 0x3f87c000, 0x3a3e5fb4, 0x3f882000, 0x38d960b3, 0x3f886000, 0x39eab752, 0x3f88a000, 0x3a4cf599,
+ 0x3f890000, 0x390803d1, 0x3f894000, 0x39e90955, 0x3f898000, 0x3a44878c, 0x3f89e000, 0x38908271,
+ 0x3f8a2000, 0x39ba4b0f, 0x3f8a6000, 0x3a25cdb3, 0x3f8aa000, 0x3a6c0f33, 0x3f8b0000, 0x393fc12e,
+ 0x3f8b4000, 0x39e2ee51, 0x3f8b8000, 0x3a30a9dd, 0x3f8bc000, 0x3a6d8e61, 0x3f8c2000, 0x3920aa58,
+ 0x3f8c6000, 0x39c1088a, 0x3f8ca000, 0x3a16a120, 0x3f8ce000, 0x3a4a86c1, 0x3f8d2000, 0x3a7c3aae,
+ 0x3f8d8000, 0x392f0952, 0x3f8dc000, 0x39b2461c, 0x3f8e0000, 0x3a04621f, 0x3f8e4000, 0x3a2d84b8,
+ 0x3f8e8000, 0x3a548ff4, 0x3f8ec000, 0x3a7988db, 0x3f8f2000, 0x38e3a30c, 0x3f8f6000, 0x39755daa,
+ 0x3f8fa000, 0x39b86d8a, 0x3f8fe000, 0x39f22e5e, 0x3f902000, 0x3a13fd53, 0x3f906000, 0x3a2cedcc,
+ 0x3f90a000, 0x3a43ed23, 0x3f90e000, 0x3a58ffd0, 0x3f912000, 0x3a6c2a3c, 0x3f916000, 0x3a7d70bf,
+ 0x3f91c000, 0x384d7a06, 0x3f920000, 0x38d318cf, 0x3f924000, 0x39185d53, 0x3f928000, 0x393fe1b1,
+ 0x3f92c000, 0x396029b1, 0x3f930000, 0x3979454c, 0x3f934000, 0x3985a221, 0x3f938000, 0x398b1b0d,
+ 0x3f93c000, 0x398d1515, 0x3f940000, 0x398b97c7, 0x3f944000, 0x3986aa98, 0x3f948000, 0x397ca9c7,
+ 0x3f94c000, 0x39653bd8, 0x3f950000, 0x394719b5, 0x3f954000, 0x39225182, 0x3f958000, 0x38ede264,
+ 0x3f95c000, 0x388a0d15, 0x3f960000, 0x3749f226, 0x3f962000, 0x3a737219, 0x3f966000, 0x3a6223e3,
+ 0x3f96a000, 0x3a4f406c, 0x3f96e000, 0x3a3acaee, 0x3f972000, 0x3a24c698, 0x3f976000, 0x3a0d368f,
+ 0x3f97a000, 0x39e83bdd, 0x3f97e000, 0x39b2ff8f, 0x3f982000, 0x39757c89, 0x3f986000, 0x38fdf7dc,
+ 0x3f98a000, 0x3622482d, 0x3f98c000, 0x3a600bf3, 0x3f990000, 0x3a3dfedf, 0x3f994000, 0x3a1a7de3,
+ 0x3f998000, 0x39eb17a4, 0x3f99c000, 0x399e56e3, 0x3f9a0000, 0x391d7e03, 0x3f9a2000, 0x3a7e2ab7,
+ 0x3f9a6000, 0x3a538fc2, 0x3f9aa000, 0x3a279148, 0x3f9ae000, 0x39f463ce, 0x3f9b2000, 0x3996e86c,
+ 0x3f9b6000, 0x38dad617, 0x3f9b8000, 0x3a69e815, 0x3f9bc000, 0x3a371eac, 0x3f9c0000, 0x3a030100,
+ 0x3f9c4000, 0x399b2304, 0x3f9c8000, 0x38b694db, 0x3f9ca000, 0x3a5ec6af, 0x3f9ce000, 0x3a257018,
+ 0x3f9d2000, 0x39d5a259, 0x3f9d6000, 0x393bb0e7, 0x3f9d8000, 0x3a71c388, 0x3f9dc000, 0x3a335958,
+ 0x3f9e0000, 0x39e75fcb, 0x3f9e4000, 0x394b2590, 0x3f9e6000, 0x3a70a802, 0x3f9ea000, 0x3a2d4de7,
+ 0x3f9ee000, 0x39d17a6c, 0x3f9f2000, 0x390be02b, 0x3f9f4000, 0x3a5c007c, 0x3f9f8000, 0x3a13d899,
+ 0x3f9fc000, 0x399504dc, 0x3fa00000, 0x00000000, 0x3fa02000, 0x3a34534e, 0x3fa06000, 0x39cefca8,
+ 0x3fa0a000, 0x38cc1828, 0x3fa0c000, 0x3a4a6352, 0x3fa10000, 0x39f4424a, 0x3fa14000, 0x3922f98d,
+ 0x3f214000, 0x38a2f98d, 0x3f4b2000, 0x397f529f, 0x3f800000, 0x00000000, 0x3fa14000, 0x3922f98d,
+ 0x3fcb2000, 0x39ff529f, 0x3f800000, 0x00000000, 0x3f816000, 0x391a3e77, 0x3f82c000, 0x39d8698a,
+ 0x3f842000, 0x3a51461d, 0x3f85a000, 0x39ac367c, 0x3f870000, 0x3a7b0cb4, 0x3f888000, 0x3a407404,
+ 0x3f8a0000, 0x3a26abaa, 0x3f8b8000, 0x3a2e0f1f, 0x3f8d0000, 0x3a56fadb, 0x3f8ea000, 0x39073168,
+ 0x3f902000, 0x3a0ee218, 0x3f91c000, 0x38f4dcea, 0x3f934000, 0x3a515978, 0x3f94e000, 0x3a277d47,
+ 0x3f968000, 0x3a2169b9, 0x3f982000, 0x3a3f828c, 0x3f99e000, 0x370b2641, 0x3f9b8000, 0x39d39b9d,
+ 0x3f9d2000, 0x3a76cd39, 0x3f9ee000, 0x3a299304, 0x3fa0a000, 0x3a02887d, 0x3fa26000, 0x3a021818,
+ 0x3fa42000, 0x3a28ad70, 0x3fa5e000, 0x3a76b54d, 0x3fa7c000, 0x39d93b4e, 0x3fa9a000, 0x382d5a75,
+ 0x3fab6000, 0x3a51cdad, 0x3fad4000, 0x3a41f752, 0x3faf2000, 0x3a5bc56b, 0x3fb12000, 0x38fd6074,
+ 0x3fb30000, 0x3a0e2095, 0x3fb50000, 0x391e667f, 0x3fb6e000, 0x3a6c8f19, 0x3fb8e000, 0x3a5d7a3b,
+ 0x3fbae000, 0x3a7ad590, 0x3fbd0000, 0x398a39f5, 0x3fbf0000, 0x3a3ccdb3, 0x3fc12000, 0x39c4cca6,
+ 0x3fc34000, 0x39599b44, 0x3fc56000, 0x3965422a, 0x3fc78000, 0x39d74c8a, 0x3fc9a000, 0x3a4dec33,
+ 0x3fcbe000, 0x39c14fef, 0x3fce2000, 0x391182a3, 0x3fd06000, 0x38ccf6bb, 0x3fd2a000, 0x3981d91f,
+ 0x3fd4e000, 0x3a1ad55e, 0x3fd74000, 0x391f995a, 0x3fd98000, 0x3a68ae13, 0x3fdbe000, 0x3a5dbcbe,
+ 0x3fde6000, 0x37f4825e, 0x3fe0c000, 0x39cdeec2, 0x3fe32000, 0x3a7c4b95, 0x3fe5a000, 0x3a48373b,
+ 0x3fe82000, 0x3a4b5281, 0x3feac000, 0x37c6e7dd, 0x3fed4000, 0x39f301ed, 0x3fefe000, 0x3917337b,
+ 0x3ff28000, 0x383b9e2c, 0x3ff52000, 0x392fa2a4, 0x3ff7c000, 0x3a06fb98, 0x3ffa8000, 0x38ecb6dc,
+ 0x3ffd2000, 0x3a706067, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x3c37c000, 0x374a16dd,
+ 0x3cb70000, 0x37f2d0b8, 0x3d08c000, 0x381a3aa2, 0x3d35c000, 0x37b4dd63, 0x3d624000, 0x383f5721,
+ 0x3d874000, 0x384e27e8, 0x3d9d4000, 0x380bf749, 0x3db30000, 0x387dbeb2, 0x3dc8c000, 0x37216e46,
+ 0x3dde4000, 0x3684815b, 0x3df38000, 0x383b045f, 0x3e044000, 0x390b119b, 0x3e0ec000, 0x391a32ea,
+ 0x3e194000, 0x38ba789e, 0x3e238000, 0x39553f30, 0x3e2e0000, 0x3651cfde, 0x3e380000, 0x39685a9d,
+ 0x3e424000, 0x39057a05, 0x3e4c4000, 0x395ba0ef, 0x3e564000, 0x396bc5b6, 0x3e604000, 0x3936d9bb,
+ 0x3e6a4000, 0x38772619, 0x3e740000, 0x39017ce9, 0x3e7dc000, 0x3902d720, 0x3e83c000, 0x38856dd8,
+ 0x3e888000, 0x3941f6b4, 0x3e8d4000, 0x3980b652, 0x3e920000, 0x3980f561, 0x3e96c000, 0x39443f13,
+ 0x3e9b8000, 0x38926752, 0x3ea00000, 0x39c8c763, 0x3ea4c000, 0x391e12f3, 0x3ea94000, 0x39b7bf89,
+ 0x3eae0000, 0x36d1cfde, 0x3eb28000, 0x38c7f233, 0x3eb70000, 0x39087367, 0x3ebb8000, 0x38e95d3f,
+ 0x3ec00000, 0x38256316, 0x3ec44000, 0x39d38e5c, 0x3ec8c000, 0x396ea247, 0x3ecd4000, 0x350e4788,
+ 0x3ed18000, 0x395d829f, 0x3ed5c000, 0x39c30f2f, 0x3eda0000, 0x39fd7ee7, 0x3ede8000, 0x3872e9e7,
+ 0x3ee2c000, 0x3897d694, 0x3ee70000, 0x3824923a, 0x3eeb0000, 0x39ea7c06, 0x3eef4000, 0x39a7fa88,
+ 0x3ef38000, 0x391aa879, 0x3ef78000, 0x39dace65, 0x3efbc000, 0x39215a32, 0x3effc000, 0x39af3350,
+ 0x3f01c000, 0x3a7b5172, 0x3f040000, 0x389cf27f, 0x3f060000, 0x3902806b, 0x3f080000, 0x3909d8a9,
+ 0x3f0a0000, 0x38c9faa1, 0x3f0c0000, 0x37a33dca, 0x3f0dc000, 0x3a6623d2, 0x3f0fc000, 0x3a3c7a61,
+ 0x3f11c000, 0x3a083a84, 0x3f13c000, 0x39930161, 0x3f15c000, 0x35d1cfde, 0x3f178000, 0x3a2d0ebd,
+ 0x3f198000, 0x399f1aad, 0x3f1b4000, 0x3a67ff6d, 0x3f1d4000, 0x39ecfea8, 0x3f1f0000, 0x3a7b26f3,
+ 0x3f210000, 0x39ec1fa6, 0x3f22c000, 0x3a675314, 0x3f24c000, 0x399e12f3, 0x3f268000, 0x3a2d4b66,
+ 0x3f288000, 0x370c3845, 0x3f2a4000, 0x399ba329, 0x3f2c0000, 0x3a1044d3, 0x3f2dc000, 0x3a49a196,
+ 0x3f2f8000, 0x3a79fe83, 0x3f318000, 0x3905c7aa, 0x3f334000, 0x39802391, 0x3f350000, 0x39abe796,
+ 0x3f36c000, 0x39c65a9d, 0x3f388000, 0x39cfa6c5, 0x3f3a4000, 0x39c7f593, 0x3f3c0000, 0x39af6ff7,
+ 0x3f3dc000, 0x39863e4d, 0x3f3f8000, 0x391910c1, 0x3f414000, 0x369d5be7, 0x3f42c000, 0x3a541616,
+ 0x3f448000, 0x3a1ee960, 0x3f464000, 0x39c38ed2, 0x3f480000, 0x38e61600, 0x3f498000, 0x3a4fedb4,
+ 0x3f4b4000, 0x39f6b4ab, 0x3f4d0000, 0x38f8d3b0, 0x3f4e8000, 0x3a3b3faa, 0x3f504000, 0x399fb693,
+ 0x3f51c000, 0x3a5cfe71, 0x3f538000, 0x39c5740b, 0x3f550000, 0x3a611eb0, 0x3f56c000, 0x39b079c4,
+ 0x3f584000, 0x3a4824d7, 0x3f5a0000, 0x39439a54, 0x3f5b8000, 0x3a1291ea, 0x3f5d0000, 0x3a6d3673,
+ 0x3f5ec000, 0x3981c731, 0x3f604000, 0x3a0da88f, 0x3f61c000, 0x3a53945c, 0x3f638000, 0x3895ae91,
+ 0x3f650000, 0x3996372a, 0x3f668000, 0x39f9a832, 0x3f680000, 0x3a27eda4, 0x3f698000, 0x3a4c764f,
+ 0x3f6b0000, 0x3a6a7c06, 0x3f6cc000, 0x370321eb, 0x3f6e4000, 0x3899ab3f, 0x3f6fc000, 0x38f02086,
+ 0x3f714000, 0x390a1707, 0x3f72c000, 0x39031e44, 0x3f744000, 0x38c6b362, 0x3f75c000, 0x382bf195,
+ 0x3f770000, 0x3a768e36, 0x3f788000, 0x3a5c503b, 0x3f7a0000, 0x3a3c1179, 0x3f7b8000, 0x3a15de1d,
+ 0x3f7d0000, 0x39d3845d, 0x3f7e8000, 0x395f263f, 0x3f800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3b5d4000, 0x367a8e44, 0x3bdc8000, 0x368ed49f, 0x3c24c000, 0x36c21451, 0x3c5ac000, 0x375211d6,
+ 0x3c884000, 0x3720ea11, 0x3ca2c000, 0x37e9eb59, 0x3cbd4000, 0x37b87be7, 0x3cd78000, 0x37bf2560,
+ 0x3cf1c000, 0x33d597a0, 0x3d05c000, 0x37806a05, 0x3d128000, 0x3820581f, 0x3d1f4000, 0x38223334,
+ 0x3d2c0000, 0x378e3bac, 0x3d388000, 0x3810684f, 0x3d450000, 0x37feb7ae, 0x3d518000, 0x36a9d609,
+ 0x3d5dc000, 0x37a68163, 0x3d6a0000, 0x376a8b27, 0x3d760000, 0x384c8fd6, 0x3d810000, 0x3885183e,
+ 0x3d870000, 0x3874a760, 0x3d8d0000, 0x380d1154, 0x3d92c000, 0x38ea42bd, 0x3d98c000, 0x384c1571,
+ 0x3d9e8000, 0x38ba66b8, 0x3da44000, 0x38e7da3b, 0x3daa0000, 0x38eee632, 0x3dafc000, 0x38d00911,
+ 0x3db58000, 0x388bbede, 0x3dbb4000, 0x378a0512, 0x3dc0c000, 0x3894c7a0, 0x3dc64000, 0x38e30710,
+ 0x3dcc0000, 0x36db2829, 0x3dd18000, 0x3729d609, 0x3dd6c000, 0x38fa0e82, 0x3ddc4000, 0x38bc9a75,
+ 0x3de1c000, 0x383a9297, 0x3de70000, 0x38dc83c8, 0x3dec8000, 0x37eac335, 0x3df1c000, 0x38706ac3,
+ 0x3df70000, 0x389574c2, 0x3dfc4000, 0x3892d068, 0x3e00c000, 0x38615032, 0x3e034000, 0x3917acf4,
+ 0x3e05c000, 0x3967a126, 0x3e088000, 0x38217840, 0x3e0b0000, 0x38b420ab, 0x3e0d8000, 0x38f9c7b2,
+ 0x3e100000, 0x391103bd, 0x3e128000, 0x39169a6b, 0x3e150000, 0x390dd194, 0x3e178000, 0x38eda471,
+ 0x3e1a0000, 0x38a38950, 0x3e1c8000, 0x37f6844a, 0x3e1ec000, 0x395e1cdb, 0x3e214000, 0x390fcffc,
+ 0x3e23c000, 0x38503e9d, 0x3e260000, 0x394b00fd, 0x3e288000, 0x38a9910a, 0x3e2ac000, 0x39518a31,
+ 0x3e2d4000, 0x3882d2c2, 0x3e2f8000, 0x392488e4, 0x3e31c000, 0x397b0aff, 0x3e344000, 0x388a22d8,
+ 0x3e368000, 0x3902bd5e, 0x3e38c000, 0x39342f85, 0x3e3b0000, 0x39598811, 0x3e3d4000, 0x3972e6b1,
+ 0x3e3fc000, 0x34d53654, 0x3e420000, 0x360ca25e, 0x3e440000, 0x39785cc0, 0x3e464000, 0x39630710,
+ 0x3e488000, 0x39424ed7, 0x3e4ac000, 0x39165101, 0x3e4d0000, 0x38be5421, 0x3e4f4000, 0x37e7b0c0,
+ 0x3e514000, 0x394fd0c3, 0x3e538000, 0x38efaaaa, 0x3e55c000, 0x37a8f566, 0x3e57c000, 0x3927c744,
+ 0x3e5a0000, 0x383fa4d5, 0x3e5c0000, 0x392d9e39, 0x3e5e4000, 0x3803feae, 0x3e604000, 0x390a268c,
+ 0x3e624000, 0x39692b80, 0x3e648000, 0x38789b4f, 0x3e668000, 0x3909307d, 0x3e688000, 0x394a601c,
+ 0x3e6ac000, 0x35e67edc, 0x3e6cc000, 0x383e386d, 0x3e6ec000, 0x38a7743d, 0x3e70c000, 0x38dccec3,
+ 0x3e72c000, 0x38ff57e0, 0x3e74c000, 0x39079d8b, 0x3e76c000, 0x390651a6, 0x3e78c000, 0x38f7bad9,
+ 0x3e7ac000, 0x38d0ab82, 0x3e7cc000, 0x38979e7d, 0x3e7ec000, 0x381978ee, 0x3e804000, 0x397816c8,
+ 0x3e814000, 0x39410cb2, 0x3e824000, 0x39015384, 0x3e834000, 0x3863fa28, 0x3e840000, 0x39f41065,
+ 0x3e850000, 0x39c7668a, 0x3e860000, 0x39968afa, 0x3e870000, 0x39430db9, 0x3e880000, 0x38a18cf3,
+ 0x3e88c000, 0x39eb2907, 0x3e89c000, 0x39a9e10c, 0x3e8ac000, 0x39492800, 0x3e8bc000, 0x385a53d1,
+ 0x3e8c8000, 0x39ce0cf7, 0x3e8d8000, 0x3979c7b2, 0x3e8e8000, 0x389f5d99, 0x3e8f4000, 0x39ceefcb,
+ 0x3e904000, 0x39646a39, 0x3e914000, 0x380d7a9b, 0x3e920000, 0x39ad6650, 0x3e930000, 0x390ac3b8,
+ 0x3e93c000, 0x39d9a9a8, 0x3e94c000, 0x39548a99, 0x3e958000, 0x39f73c4b, 0x3e968000, 0x3980960e,
+ 0x3e978000, 0x374b3d5a, 0x3e984000, 0x39888f1e, 0x3e994000, 0x37679a07, 0x3e9a0000, 0x39826a13,
+ 0x00000000, 0x00000000, 0x3bff0000, 0x3429ac41, 0x3c7e0000, 0x35a8b0fc, 0x3cbdc000, 0x368d83ea,
+ 0x3cfc1000, 0x361b0e78, 0x3d1cf000, 0x3687b9fe, 0x3d3ba000, 0x3631ec65, 0x3d5a1000, 0x36dd7119,
+ 0x3d785000, 0x35c30045, 0x3d8b2000, 0x379b7751, 0x3d9a0000, 0x37ebcb0d, 0x3da8d000, 0x37839f83,
+ 0x3db78000, 0x37528ae5, 0x3dc61000, 0x37a2eb18, 0x3dd49000, 0x36da7495, 0x3de2f000, 0x36a91eb7,
+ 0x3df13000, 0x3783b715, 0x3dff6000, 0x371131db, 0x3e06b000, 0x383f3e68, 0x3e0db000, 0x38156a97,
+ 0x3e14a000, 0x38297c0f, 0x3e1b8000, 0x387e100f, 0x3e226000, 0x3815b665, 0x3e293000, 0x37e5e3a1,
+ 0x3e2ff000, 0x38183853, 0x3e36b000, 0x35fe719d, 0x3e3d5000, 0x38448108, 0x3e43f000, 0x38503290,
+ 0x3e4a9000, 0x373539e8, 0x3e511000, 0x385e0ff1, 0x3e579000, 0x3864a740, 0x3e5e1000, 0x3786742d,
+ 0x3e647000, 0x387be3cd, 0x3e6ae000, 0x3685ad3e, 0x3e713000, 0x3803b715, 0x3e778000, 0x37adcbdc,
+ 0x3e7dc000, 0x380c36af, 0x3e820000, 0x371652d3, 0x3e851000, 0x38927139, 0x3e882000, 0x38c5fcd7,
+ 0x3e8b3000, 0x38ae55d5, 0x3e8e4000, 0x3818c169, 0x3e914000, 0x38a0fde7, 0x3e944000, 0x38ad09ef,
+ 0x3e974000, 0x3862bae1, 0x3e9a3000, 0x38eecd4c, 0x3e9d3000, 0x3798aad2, 0x3ea02000, 0x37421a1a,
+ 0x3ea30000, 0x38c5e10e, 0x3ea5f000, 0x37bf2aee, 0x3ea8d000, 0x382d872d, 0x3eabb000, 0x37ee2e8a,
+ 0x3eae8000, 0x38dedfac, 0x3eb16000, 0x3802f2b9, 0x3eb43000, 0x38481e9b, 0x3eb70000, 0x380eaa2b,
+ 0x3eb9c000, 0x38ebfb5d, 0x3ebc9000, 0x38255fdd, 0x3ebf5000, 0x38783b82, 0x3ec21000, 0x3851da1e,
+ 0x3ec4d000, 0x374e1b05, 0x3ec78000, 0x388f439b, 0x3eca3000, 0x38ca0e10, 0x3ecce000, 0x38cac08b,
+ 0x3ecf9000, 0x3891f65f, 0x3ed24000, 0x378121cb, 0x3ed4e000, 0x386c9a9a, 0x3ed78000, 0x38949923,
+ 0x3eda2000, 0x38777bcc, 0x3edcc000, 0x37b12d26, 0x3edf5000, 0x38a6ced3, 0x3ee1e000, 0x38ebd3e6,
+ 0x3ee47000, 0x38fbe3cd, 0x3ee70000, 0x38d785c2, 0x3ee99000, 0x387e7e00, 0x3eec1000, 0x38f392c5,
+ 0x3eeea000, 0x37d40983, 0x3ef12000, 0x38081a7c, 0x3ef3a000, 0x3784c3ad, 0x3ef61000, 0x38cce923,
+ 0x3ef89000, 0x380f5faf, 0x3efb0000, 0x3891fd38, 0x3efd7000, 0x38ac47bc, 0x3effe000, 0x3897042b,
+ 0x3f012000, 0x392952d2, 0x3f025000, 0x396fced4, 0x3f039000, 0x37f97073, 0x3f04c000, 0x385e9eae,
+ 0x3f05f000, 0x3865c84a, 0x3f072000, 0x38130ba3, 0x3f084000, 0x3979cf16, 0x3f097000, 0x3938cac9,
+ 0x3f0aa000, 0x38c3d2f4, 0x3f0bc000, 0x39755dec, 0x3f0cf000, 0x38e6b467, 0x3f0e1000, 0x395c0fb8,
+ 0x3f0f4000, 0x383ebce0, 0x3f106000, 0x38dcd192, 0x3f118000, 0x39186bdf, 0x3f12a000, 0x392de74c,
+ 0x3f13c000, 0x392f0944, 0x3f14e000, 0x391bff61, 0x3f160000, 0x38e9ed44, 0x3f172000, 0x38686dc8,
+ 0x3f183000, 0x396b99a7, 0x3f195000, 0x39099c89, 0x3f1a7000, 0x37a27673, 0x3f1b8000, 0x390bdaa3,
+ 0x3f1c9000, 0x397069ab, 0x3f1db000, 0x388449ff, 0x3f1ec000, 0x39013538, 0x3f1fd000, 0x392dc268,
+ 0x3f20e000, 0x3947f423, 0x3f21f000, 0x394ff17c, 0x3f230000, 0x3945e10e, 0x3f241000, 0x3929e8f5,
+ 0x3f252000, 0x38f85db0, 0x3f263000, 0x38735f99, 0x3f273000, 0x396c08db, 0x3f284000, 0x3909e600,
+ 0x3f295000, 0x37b4996f, 0x3f2a5000, 0x391233cc, 0x3f2b5000, 0x397cead9, 0x3f2c6000, 0x38adb5cd,
+ 0x3f2d6000, 0x3920261a, 0x3f2e6000, 0x3958ee36, 0x3f2f7000, 0x35aa4905, 0x3f307000, 0x37cbd11e,
+ 0x3f317000, 0x3805fdf4, 0x40000000, 0x00000000, 0x3ffe0000, 0x38fe03f8, 0x3ffc0000, 0x39fc0fc1,
+ 0x3ffa0000, 0x3a8cb3c9, 0x3ff80000, 0x3af83e10, 0x3ff60000, 0x3b407b30, 0x3ff40000, 0x3b898d60,
+ 0x3ff20000, 0x3bb9d648, 0x3ff00000, 0x3bf0f0f1, 0x3fef0000, 0x3abadc7f, 0x3fed0000, 0x3b66076c,
+ 0x3feb0000, 0x3bbdb2a6, 0x3fea0000, 0x39ea0ea1, 0x3fe80000, 0x3b4b58f7, 0x3fe60000, 0x3bc2b448,
+ 0x3fe50000, 0x3a9660ac, 0x3fe30000, 0x3b8e38e4, 0x3fe10000, 0x3bfc780e, 0x3fe00000, 0x3b607038,
+ 0x3fde0000, 0x3be95c4d, 0x3fdd0000, 0x3b4f914c, 0x3fdb0000, 0x3beb61ef, 0x3fda0000, 0x3b681b4f,
+ 0x3fd90000, 0x385901b2, 0x3fd70000, 0x3b9435e5, 0x3fd60000, 0x3aae0359, 0x3fd40000, 0x3bc77b03,
+ 0x3fd30000, 0x3b501a6d, 0x3fd20000, 0x39d20d21, 0x3fd00000, 0x3bb69fcc, 0x3fcf0000, 0x3b48e951,
+ 0x3fce0000, 0x3a3453b9, 0x3fcc0000, 0x3bcccccd, 0x3fcb0000, 0x3b8727c0, 0x3fca0000, 0x3b0b0fcd,
+ 0x3fc90000, 0x397b49d1, 0x3fc70000, 0x3bce0c7d, 0x3fc60000, 0x3b980c6a, 0x3fc50000, 0x3b4b90f7,
+ 0x3fc40000, 0x3adcbe15, 0x3fc30000, 0x39c30c31, 0x3fc10000, 0x3be4bbd6, 0x3fc00000, 0x3bc0c0c1,
+ 0x3fbf0000, 0x3ba02fe8, 0x3fbe0000, 0x3b82fa0c, 0x3fbd0000, 0x3b52208e, 0x3fbc0000, 0x3b24c818,
+ 0x3fbb0000, 0x3afb9c87, 0x3fba0000, 0x3aba2e8c, 0x3fb90000, 0x3a850fe9, 0x3fb80000, 0x3a381703,
+ 0x3fb70000, 0x39fbb5a2, 0x3fb60000, 0x39b60b61, 0x3fb50000, 0x399e68aa, 0x3fb40000, 0x39b40b41,
+ 0x3fb30000, 0x39f63529, 0x3fb20000, 0x3a321643, 0x3fb10000, 0x3a7e9dc0, 0x3fb00000, 0x3ab02c0b,
+ 0x3faf0000, 0x3aeb771a, 0x3fae0000, 0x3b1882b9, 0x3fad0000, 0x3b4056b0, 0x3fac0000, 0x3b6d2308,
+ 0x3fab0000, 0x3b8f69e3, 0x3faa0000, 0x3baaaaab, 0x3fa90000, 0x3bc84a48, 0x3fa80000, 0x3be83f57,
+ 0x3fa80000, 0x39a80a81, 0x3fa70000, 0x3abc14e6, 0x3fa60000, 0x3b2b8872, 0x3fa50000, 0x3b7d6a05,
+ 0x3fa40000, 0x3ba9cf1e, 0x3fa30000, 0x3bd70a3d, 0x3fa30000, 0x394bc7f6, 0x3fa20000, 0x3adf0cac,
+ 0x3fa10000, 0x3b56625d, 0x3fa00000, 0x3ba0a0a1, 0x3f9f0000, 0x3bd809fe, 0x3f9f0000, 0x3a0b2f39,
+ 0x3f9e0000, 0x3b195a48, 0x3f9d0000, 0x3b89d89e, 0x3f9c0000, 0x3bc8e161, 0x3f9c0000, 0x399c09c1,
+ 0x3f9b0000, 0x3b18df3e, 0x3f9a0000, 0x3b90e7d9, 0x3f990000, 0x3bd722db, 0x3f990000, 0x3a78d28b,
+ 0x3f980000, 0x3b519013, 0x3f970000, 0x3bb425ed, 0x3f970000, 0x3817012e, 0x3f960000, 0x3b1fb4d8,
+ 0x3f950000, 0x3ba02568, 0x3f940000, 0x3bf2094f, 0x3f940000, 0x3b0b0129, 0x3f930000, 0x3b9a85c4,
+ 0x3f920000, 0x3bf11384, 0x3f920000, 0x3b124925, 0x3f910000, 0x3ba2b3c5, 0x3f900000, 0x3bfdbc09,
+ 0x3f900000, 0x3b3470c6, 0x3f8f0000, 0x3bb823ee, 0x3f8f0000, 0x3a3bced0, 0x3f8e0000, 0x3b706ada,
+ 0x3f8d0000, 0x3bda5202, 0x3f8d0000, 0x3af72c23, 0x3f8c0000, 0x3ba29c04, 0x3f8c0000, 0x398c08c1,
+ 0x3f8b0000, 0x3b606894, 0x3f8a0000, 0x3bd8f2fc, 0x3f8a0000, 0x3b05f0e1, 0x3f890000, 0x3bae408a,
+ 0x3f890000, 0x3a5639d7, 0x3f880000, 0x3b888889, 0x3f870000, 0x3bf78088, 0x3f870000, 0x3b4f56be,
+ 0x3f860000, 0x3bd90544, 0x3f860000, 0x3b1714fc, 0x3f850000, 0x3bbf3761, 0x3f850000, 0x3ad0214d,
+ 0x3f840000, 0x3ba9f9c8, 0x3f840000, 0x3a842108, 0x3f830000, 0x3b993052, 0x3f830000, 0x3a1374bc,
+ 0x3f820000, 0x3b8cbfbf, 0x3f820000, 0x39820821, 0x3f810000, 0x3b848da9, 0x3f810000, 0x38810204,
+ 0x3f800000, 0x3b808081, 0x3f800000, 0x00000000, 0x00000000, 0x3f800000, 0x3f966cfe, 0x3fc583ab,
+ 0x40681e7b, 0x4070c7d0, 0x41204937, 0x41211525, 0x41da51c0, 0x41da7743, 0x4294680b, 0x42946b7e,
+ 0x4349b691, 0x4349b734, 0x4409143b, 0x4409144a, 0x44ba4f53, 0x44ba4f55, 0x457d38ac, 0x457d38ac,
+ 0x462c14ee, 0x462c14ef, 0x46e9e224, 0x46e9e224, 0x479ef0b3, 0x479ef0b3, 0x485805ad, 0x485805ad,
+ 0x4912cd62, 0x4912cd62, 0x49c78665, 0x49c78665, 0x4a87975f, 0x4a87975f, 0x4b3849a4, 0x4b3849a4,
+ 0x4bfa7910, 0x4bfa7910, 0x4caa36c8, 0x4caa36c8, 0x4d675844, 0x4d675844, 0x4e1d3710, 0x4e1d3710,
+ 0x4ed5ad6e, 0x4ed5ad6e, 0x4f91357a, 0x4f91357a, 0x50455bfe, 0x50455bfe, 0x51061e9d, 0x51061e9d,
+ 0x51b64993, 0x51b64993, 0x5277c118, 0x5277c118, 0x53285dd2, 0x53285dd2, 0x53e4d572, 0x53e4d572,
+ 0x549b8238, 0x549b8238, 0x55535bb3, 0x55535bb3, 0x560fa1fe, 0x560fa1fe, 0x56c3379a, 0x56c3379a,
+ 0x5784a9f1, 0x5784a9f1, 0x58344f11, 0x58344f11, 0x58f510ad, 0x58f510ad, 0x3d7faade, 0x3d87ccf5,
+ 0x3d8fc36e, 0x3d97b8ca, 0x3d9facf8, 0x3da79feb, 0x3daf9192, 0x3db781df, 0x3dbf70c1, 0x3dc75e2a,
+ 0x3dcf4a0b, 0x3dd73454, 0x3ddf1cf6, 0x3de703e3, 0x3deee90c, 0x3df6cc61, 0x3dfeadd5, 0x3e0346ac,
+ 0x3e07356e, 0x3e0b232a, 0x3e0f0fd8, 0x3e12fb71, 0x3e16e5ee, 0x3e1acf47, 0x3e1eb777, 0x3e229e76,
+ 0x3e26843d, 0x3e2a68c6, 0x3e2e4c09, 0x3e322e00, 0x3e360ea4, 0x3e39edef, 0x3e3dcbda, 0x3e41a85f,
+ 0x3e458377, 0x3e495d1c, 0x3e4d3547, 0x3e510bf3, 0x3e54e119, 0x3e58b4b3, 0x3e5c86bb, 0x3e60572a,
+ 0x3e6425fc, 0x3e67f32a, 0x3e6bbeaf, 0x3e6f8884, 0x3e7350a4, 0x3e77170a, 0x3e7adbb0, 0x3e7e9e90,
+ 0x3e812fd3, 0x3e830f75, 0x3e84ee2d, 0x3e86cbf7, 0x3e88a8d2, 0x3e8a84ba, 0x3e8c5fad, 0x3e8e39a9,
+ 0x3e9012ab, 0x3e91eab1, 0x3e93c1b9, 0x3e9597c0, 0x3e976cc4, 0x3e9940c2, 0x3e9b13ba, 0x3e9ce5a7,
+ 0x3e9eb689, 0x3ea0865d, 0x3ea25522, 0x3ea422d4, 0x3ea5ef73, 0x3ea7bafc, 0x3ea9856d, 0x3eab4ec4,
+ 0x3ead1701, 0x3eaede20, 0x3eb0a420, 0x3eb26900, 0x3eb42cbd, 0x3eb5ef56, 0x3eb7b0ca, 0x3eb97117,
+ 0x3ebb303b, 0x3ebcee34, 0x3ebeab02, 0x3ec066a3, 0x3ec22116, 0x3ec3da58, 0x3ec5926a, 0x3ec74949,
+ 0x3ec8fef4, 0x3ecab36a, 0x3ecc66aa, 0x3ece18b3, 0x3ecfc983, 0x3ed1791a, 0x3ed32776, 0x3ed4d497,
+ 0x3ed6807b, 0x3ed82b21, 0x3ed9d489, 0x3edb7cb1, 0x3edd239a, 0x3edec941, 0x3ee06da6, 0x3ee210c9,
+ 0x3ee3b2a8, 0x3ee55344, 0x3ee6f29a, 0x3ee890ab, 0x3eea2d76, 0x3eebc8fb, 0x3eed6338, 0x3eeefc2e,
+ 0x3ef093db, 0x3ef22a40, 0x3ef3bf5c, 0x3ef5532e, 0x3ef6e5b7, 0x3ef876f5, 0x3efa06e8, 0x3efb9591,
+ 0x3efd22ef, 0x3efeaf01, 0x3f001ce4, 0x3f00e1a1, 0x3f01a5b8, 0x3f02692a, 0x3f032bf5, 0x3f03ee1a,
+ 0x3f04af98, 0x3f057071, 0x3f0630a3, 0x3f06f02f, 0x3f07af14, 0x3f086d54, 0x3f092aed, 0x3f09e7e0,
+ 0x3f0aa42d, 0x3f0b5fd3, 0x3f0c1ad4, 0x3f0cd52f, 0x3f0d8ee4, 0x3f0e47f4, 0x3f0f005d, 0x3f0fb822,
+ 0x3f106f41, 0x3f1125ba, 0x3f11db8f, 0x3f1290bf, 0x3f13454a, 0x3f13f931, 0x3f14ac73, 0x3f155f11,
+ 0x3f16110b, 0x3f16c261, 0x3f177314, 0x3f182324, 0x3f18d290, 0x3f19815a, 0x3f1a2f81, 0x3f1add06,
+ 0x3f1b89e8, 0x3f1c3629, 0x3f1ce1c9, 0x3f1d8cc7, 0x3f1e3725, 0x3f1ee0e1, 0x3f1f89fe, 0x3f20327a,
+ 0x3f20da57, 0x3f218194, 0x3f222833, 0x3f22ce33, 0x3f237394, 0x3f241857, 0x3f24bc7d, 0x3f256006,
+ 0x3f2602f1, 0x3f26a540, 0x3f2746f3, 0x3f27e80a, 0x3f288885, 0x3f292866, 0x3f29c7ac, 0x3f2a6658,
+ 0x3f2b0469, 0x3f2ba1e2, 0x3f2c3ec1, 0x3f2cdb08, 0x3f2d76b6, 0x3f2e11cd, 0x3f2eac4c, 0x3f2f4635,
+ 0x3f2fdf87, 0x3f307842, 0x3f311069, 0x3f31a7fa, 0x3f323ef6, 0x3f32d55e, 0x3f336b32, 0x3f340072,
+ 0x3f349520, 0x3f35293b, 0x3f35bcc5, 0x3f364fbc, 0x3f36e223, 0x3f3773f9, 0x3f38053e, 0x3f3895f4,
+ 0x3f39261b, 0x3f39b5b3, 0x3f3a44bc, 0x3f3ad338, 0x3f3b6127, 0x3f3bee89, 0x3f3c7b5e, 0x3f3d07a7,
+ 0x3f3d9365, 0x3f3e1e99, 0x3f3ea941, 0x3f3f3360, 0x3f3fbcf5, 0x3f404602, 0x3f40ce86, 0x3f415682,
+ 0x3f41ddf6, 0x3f4264e4, 0x3f42eb4b, 0x3f43712c, 0x3f43f687, 0x3f447b5e, 0x3f44ffb0, 0x3f45837e,
+ 0x3f4606c9, 0x3f468990, 0x3f470bd5, 0x3f478d98, 0x3f480eda, 0x3f488f9b, 0x3f490fdb, 0x3f800000,
+ 0x3f8164d2, 0x3f82cd87, 0x3f843a29, 0x3f85aac3, 0x3f871f62, 0x3f88980f, 0x3f8a14d5, 0x3f8b95c2,
+ 0x3f8d1adf, 0x3f8ea43a, 0x3f9031dc, 0x3f91c3d3, 0x3f935a2b, 0x3f94f4f0, 0x3f96942d, 0x3f9837f0,
+ 0x3f99e046, 0x3f9b8d3a, 0x3f9d3eda, 0x3f9ef532, 0x3fa0b051, 0x3fa27043, 0x3fa43516, 0x3fa5fed7,
+ 0x3fa7cd94, 0x3fa9a15b, 0x3fab7a3a, 0x3fad583f, 0x3faf3b79, 0x3fb123f6, 0x3fb311c4, 0x3fb504f3,
+ 0x3fb6fd92, 0x3fb8fbaf, 0x3fbaff5b, 0x3fbd08a4, 0x3fbf179a, 0x3fc12c4d, 0x3fc346cd, 0x3fc5672a,
+ 0x3fc78d75, 0x3fc9b9be, 0x3fcbec15, 0x3fce248c, 0x3fd06334, 0x3fd2a81e, 0x3fd4f35b, 0x3fd744fd,
+ 0x3fd99d16, 0x3fdbfbb8, 0x3fde60f5, 0x3fe0ccdf, 0x3fe33f89, 0x3fe5b907, 0x3fe8396a, 0x3feac0c7,
+ 0x3fed4f30, 0x3fefe4ba, 0x3ff28177, 0x3ff5257d, 0x3ff7d0df, 0x3ffa83b3, 0x3ffd3e0c, 0x40000000,
+ 0x40000000, 0x3ffe03f8, 0x3ffc0fc1, 0x3ffa232d, 0x3ff83e10, 0x3ff6603e, 0x3ff4898d, 0x3ff2b9d6,
+ 0x3ff0f0f1, 0x3fef2eb7, 0x3fed7304, 0x3febbdb3, 0x3fea0ea1, 0x3fe865ac, 0x3fe6c2b4, 0x3fe52598,
+ 0x3fe38e39, 0x3fe1fc78, 0x3fe07038, 0x3fdee95c, 0x3fdd67c9, 0x3fdbeb62, 0x3fda740e, 0x3fd901b2,
+ 0x3fd79436, 0x3fd62b81, 0x3fd4c77b, 0x3fd3680d, 0x3fd20d21, 0x3fd0b6a0, 0x3fcf6475, 0x3fce168a,
+ 0x3fcccccd, 0x3fcb8728, 0x3fca4588, 0x3fc907da, 0x3fc7ce0c, 0x3fc6980c, 0x3fc565c8, 0x3fc43730,
+ 0x3fc30c31, 0x3fc1e4bc, 0x3fc0c0c1, 0x3fbfa030, 0x3fbe82fa, 0x3fbd6910, 0x3fbc5264, 0x3fbb3ee7,
+ 0x3fba2e8c, 0x3fb92144, 0x3fb81703, 0x3fb70fbb, 0x3fb60b61, 0x3fb509e7, 0x3fb40b41, 0x3fb30f63,
+ 0x3fb21643, 0x3fb11fd4, 0x3fb02c0b, 0x3faf3ade, 0x3fae4c41, 0x3fad602b, 0x3fac7692, 0x3fab8f6a,
+ 0x3faaaaab, 0x3fa9c84a, 0x3fa8e83f, 0x3fa80a81, 0x3fa72f05, 0x3fa655c4, 0x3fa57eb5, 0x3fa4a9cf,
+ 0x3fa3d70a, 0x3fa3065e, 0x3fa237c3, 0x3fa16b31, 0x3fa0a0a1, 0x3f9fd80a, 0x3f9f1166, 0x3f9e4cad,
+ 0x3f9d89d9, 0x3f9cc8e1, 0x3f9c09c1, 0x3f9b4c70, 0x3f9a90e8, 0x3f99d723, 0x3f991f1a, 0x3f9868c8,
+ 0x3f97b426, 0x3f97012e, 0x3f964fda, 0x3f95a025, 0x3f94f209, 0x3f944581, 0x3f939a86, 0x3f92f114,
+ 0x3f924925, 0x3f91a2b4, 0x3f90fdbc, 0x3f905a38, 0x3f8fb824, 0x3f8f177a, 0x3f8e7835, 0x3f8dda52,
+ 0x3f8d3dcb, 0x3f8ca29c, 0x3f8c08c1, 0x3f8b7034, 0x3f8ad8f3, 0x3f8a42f8, 0x3f89ae41, 0x3f891ac7,
+ 0x3f888889, 0x3f87f781, 0x3f8767ab, 0x3f86d905, 0x3f864b8a, 0x3f85bf37, 0x3f853408, 0x3f84a9fa,
+ 0x3f842108, 0x3f839930, 0x3f83126f, 0x3f828cc0, 0x3f820821, 0x3f81848e, 0x3f810204, 0x3f808081,
+ 0x3f800000, 0x00000000, 0x399f22b4, 0x3a1f22b4, 0x3a6eb40e, 0x3a9f22b4, 0x3ac6eb61, 0x3aeeb40e,
+ 0x3b0b3e5d, 0x3b1f22b4, 0x3b33070a, 0x3b46eb61, 0x3b5b518e, 0x3b70f18f, 0x3b83e1c6, 0x3b8fe616,
+ 0x3b9c87fd, 0x3ba9c9b6, 0x3bb7ad6f, 0x3bc6354a, 0x3bd56360, 0x3be539c1, 0x3bf5ba71, 0x3c0373b6,
+ 0x3c0c6153, 0x3c15a705, 0x3c1f45be, 0x3c293e6b, 0x3c3391f7, 0x3c3e4149, 0x3c494d44, 0x3c54b6c9,
+ 0x3c607eb4, 0x3c6ca5df, 0x3c792d22, 0x3c830aa9, 0x3c89af9f, 0x3c9085dc, 0x3c978dc6, 0x3c9ec7c2,
+ 0x3ca63433, 0x3cadd37d, 0x3cb5a602, 0x3cbdac21, 0x3cc5e63a, 0x3cce54ac, 0x3cd6f7d5, 0x3cdfd010,
+ 0x3ce8ddba, 0x3cf2212d, 0x3cfb9ac3, 0x3d02a56a, 0x3d0798dd, 0x3d0ca7e6, 0x3d11d2af, 0x3d171964,
+ 0x3d1c7c30, 0x3d21fb3c, 0x3d2796b2, 0x3d2d4ebb, 0x3d332381, 0x3d39152b, 0x3d3f23e4, 0x3d454fd2,
+ 0x3d4b991d, 0x3d51ffec, 0x3d588468, 0x3d5f26b6, 0x3d65e6fd, 0x3d6cc563, 0x3d73c20e, 0x3d7add24,
+ 0x3d810b65, 0x3d84b793, 0x3d88732e, 0x3d8c3e48, 0x3d9018f4, 0x3d940344, 0x3d97fd49, 0x3d9c0715,
+ 0x3da020ba, 0x3da44a4a, 0x3da883d6, 0x3daccd6f, 0x3db12727, 0x3db5910f, 0x3dba0b38, 0x3dbe95b3,
+ 0x3dc33090, 0x3dc7dbe0, 0x3dcc97b4, 0x3dd1641d, 0x3dd6412b, 0x3ddb2eee, 0x3de02d76, 0x3de53cd4,
+ 0x3dea5d18, 0x3def8e51, 0x3df4d090, 0x3dfa23e5, 0x3dff885e, 0x3e027f06, 0x3e05427f, 0x3e080ea2,
+ 0x3e0ae377, 0x3e0dc104, 0x3e10a753, 0x3e13966a, 0x3e168e51, 0x3e198f0f, 0x3e1c98ac, 0x3e1fab30,
+ 0x3e22c6a1, 0x3e25eb07, 0x3e29186a, 0x3e2c4ed0, 0x3e2f8e42, 0x3e32d6c5, 0x3e362862, 0x3e39831f,
+ 0x3e3ce703, 0x3e405417, 0x3e43ca60, 0x3e4749e6, 0x3e4ad2af, 0x3e4e64c3, 0x3e520029, 0x3e55a4e7,
+ 0x3e595305, 0x3e5d0a89, 0x3e60cb7a, 0x3e6495df, 0x3e6869be, 0x3e6c471f, 0x3e702e07, 0x3e741e7e,
+ 0x3e78188b, 0x3e7c1c33, 0x3e8014bf, 0x3e822039, 0x3e84308b, 0x3e8645b8, 0x3e885fc3, 0x3e8a7eb0,
+ 0x3e8ca281, 0x3e8ecb3b, 0x3e90f8df, 0x3e932b72, 0x3e9562f6, 0x3e979f6f, 0x3e99e0e0, 0x3e9c274c,
+ 0x3e9e72b6, 0x3ea0c321, 0x3ea31890, 0x3ea57307, 0x3ea7d288, 0x3eaa3716, 0x3eaca0b6, 0x3eaf0f68,
+ 0x3eb18332, 0x3eb3fc15, 0x3eb67a14, 0x3eb8fd34, 0x3ebb8576, 0x3ebe12de, 0x3ec0a56e, 0x3ec33d2a,
+ 0x3ec5da14, 0x3ec87c30, 0x3ecb2380, 0x3ecdd008, 0x3ed081ca, 0x3ed338c9, 0x3ed5f508, 0x3ed8b68a,
+ 0x3edb7d52, 0x3ede4963, 0x3ee11abf, 0x3ee3f169, 0x3ee6cd65, 0x3ee9aeb5, 0x3eec955b, 0x3eef815c,
+ 0x3ef272b8, 0x3ef56974, 0x3ef86593, 0x3efb6716, 0x3efe6e00, 0x3f00bd2b, 0x3f02460c, 0x3f03d1a5,
+ 0x3f055ff7, 0x3f06f104, 0x3f0884cd, 0x3f0a1b54, 0x3f0bb499, 0x3f0d509f, 0x3f0eef65, 0x3f1090ef,
+ 0x3f12353d, 0x3f13dc50, 0x3f15862a, 0x3f1732cc, 0x3f18e237, 0x3f1a946e, 0x3f1c4970, 0x3f1e0140,
+ 0x3f1fbbde, 0x3f21794d, 0x3f23398c, 0x3f24fc9f, 0x3f26c285, 0x3f288b41, 0x3f2a56d2, 0x3f2c253c,
+ 0x3f2df67f, 0x3f2fca9c, 0x3f31a194, 0x3f337b6a, 0x3f35581d, 0x3f3737b0, 0x3f391a24, 0x3f3aff7a,
+ 0x3f3ce7b2, 0x3f3ed2cf, 0x3f40c0d2, 0x3f42b1bc, 0x3f44a58e, 0x3f469c49, 0x3f4895ef, 0x3f4a9280,
+ 0x3f4c91ff, 0x3f4e946c, 0x3f5099c9, 0x3f52a216, 0x3f54ad56, 0x3f56bb88, 0x3f58ccaf, 0x3f5ae0cc,
+ 0x3f5cf7df, 0x3f5f11ea, 0x3f612eef, 0x3f634eee, 0x3f6571e9, 0x3f6797e0, 0x3f69c0d5, 0x3f6becca,
+ 0x3f6e1bbf, 0x3f704db5, 0x3f7282ae, 0x3f74baab, 0x3f76f5ae, 0x3f7933b6, 0x3f7b74c6, 0x3f7db8de,
+ 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000a2,
+ 0x000003e6, 0x00000036, 0x00000393, 0x00000244, 0x00000054, 0x0000029f, 0x00000309, 0x00000357,
+ 0x00000347, 0x00000353, 0x00000137, 0x000001c0, 0x0000036d, 0x00000229, 0x00000166, 0x0000013c,
+ 0x0000010e, 0x00000104, 0x0000007f, 0x00000251, 0x0000018e, 0x000002bd, 0x000003ae, 0x000003c5,
+ 0x00000186, 0x00000372, 0x0000011b, 0x0000023a, 0x00000109, 0x000000dd, 0x000000b8, 0x00000006,
+ 0x00000124, 0x000002ee, 0x00000282, 0x000001d1, 0x00000248, 0x000001cf, 0x00000387, 0x000001eb,
+ 0x00000072, 0x00000312, 0x00000269, 0x0000033e, 0x000003a2, 0x00000023, 0x0000017d, 0x0000012e,
+ 0x000002ed, 0x00000048, 0x0000013a, 0x0000019c, 0x000001c0, 0x0000026b, 0x00000117, 0x0000037e,
+ 0x00000104, 0x00000399, 0x00000075, 0x00000239, 0x0000020d, 0x00000133, 0x0000027d, 0x0000009c,
+ 0x00000211, 0x000001f8, 0x000002ef, 0x000001f9, 0x000000a0, 0x000003b1, 0x000003fe, 0x00000097,
+ 0x000003ff, 0x000001e0, 0x00000166, 0x0000000f, 0x000003bc, 0x000002f1, 0x00000062, 0x0000035a,
+ 0x00000029, 0x000002d1, 0x000003db, 0x00000136, 0x000001fb, 0x000000f2, 0x000001f2, 0x00000309,
+ 0x000002dd, 0x000000f4, 0x0000018f, 0x00000366, 0x00000279, 0x000001fe, 0x0000028b, 0x00000175,
+ 0x0000009e, 0x000003ac, 0x000001fa, 0x000003e5, 0x000003c5, 0x000003b3, 0x00000341, 0x00000339,
+ 0x000003de, 0x000000a5, 0x000000a4, 0x000002ea, 0x000001af, 0x000003b5, 0x000003ec, 0x0000011f,
+ 0x00000235, 0x000001d0, 0x00000215, 0x00000203, 0x000000c1, 0x0000006f, 0x0000031e, 0xc11bf1e0,
+ 0x7421580c, 0x7ec47e35, 0x4ba9afed, 0xe7de294a, 0xc5ecf41c, 0xeb1faf97, 0xa8b5d49e, 0xfd9a797f,
+ 0x26dd3d18, 0xfb3c9f2c, 0xb47db4d9, 0x462d6829, 0x603fbcbc, 0x5fff7816, 0xa0ec7fe2, 0x7e2ef7e4,
+ 0xe7d27211, 0x58e60d4c, 0xf904e647, 0xc09ad17d, 0x1213a671, 0xd7d4baed, 0x9cfba208, 0xac72c4a6,
+ 0x4873f877, 0xbba82746, 0x4b801924, 0xb8e90937, 0x1586dc91, 0x8eaf7aef, 0x4107f945, 0x5664f10e,
+ 0x77036d8a, 0x5f47d4d3, 0x54a7f09d, 0x0db93910, 0x00028be6, 0x00000000, 0x00000000, 0x00000000};
+#endif // TABLES_HPP_
diff --git a/rocclr/runtime/device/cpu/cpuvirtual.cpp b/rocclr/runtime/device/cpu/cpuvirtual.cpp
index 0f94cbbb24..15ab049177 100644
--- a/rocclr/runtime/device/cpu/cpuvirtual.cpp
+++ b/rocclr/runtime/device/cpu/cpuvirtual.cpp
@@ -17,367 +17,328 @@ namespace cpu {
amd::Atomic VirtualCPU::numWorkerThreads_(0);
-VirtualCPU::VirtualCPU(Device& device)
- : device::VirtualDevice(device), acceptingCommands_(false)
-{
- const size_t numCores = device.info().maxComputeUnits_;
+VirtualCPU::VirtualCPU(Device& device) : device::VirtualDevice(device), acceptingCommands_(false) {
+ const size_t numCores = device.info().maxComputeUnits_;
- if ((numWorkerThreads_ += numCores) >= Device::getMaxWorkerThreadsNumber()) {
- numWorkerThreads_ -= numCores;
- cores_ = NULL;
- return;
- }
-
- cores_ = new(std::nothrow) WorkerThread*[numCores];
- if (cores_ == NULL) {
- return;
- }
-
- // Clear memory for the worker threads
- memset(cores_, 0, numCores * sizeof(WorkerThread*));
-
-#if defined(__linux__)
- const bool isNuma =
-#if defined(NUMA_SUPPORT)
- device.getNumaMask() == NULL;
-#else
- false;
-#endif // NUMA_SUPPORT
- const amd::Os::ThreadAffinityMask* affinityMask = isNuma ? NULL :
-#else
- const amd::Os::ThreadAffinityMask* affinityMask =
-#endif
- device.getWorkerThreadsAffinity();
-
- uint coreId = affinityMask != NULL ? affinityMask->getFirstSet() : (uint)-1;
-
- for (size_t i = 0; i < numCores; ++i) {
- WorkerThread* thread = cores_[i] = new WorkerThread(device);
- if (thread == NULL) {
- for (size_t j = 0; j < i; ++j) {
- cores_[j]->resume();
- }
- return;
- }
-
- if (thread->state() != amd::Thread::INITIALIZED) {
- return;
- }
-
-#if defined(__linux__)
- if (!isNuma) {
- if (coreId == (uint)-1) {
- thread->setAffinity((uint) i);
- }
- else {
- thread->setAffinity(coreId);
- coreId = affinityMask->getNextSet(coreId);
- }
- }
-#else // On Windows we set an affinity mask and not a specific ID.
- if (coreId != (uint)-1) {
- thread->setAffinity(*affinityMask);
- }
-#endif
- thread->start();
- }
-
- blitMgr_ = new device::HostBlitManager(*this);
- if ((NULL == blitMgr_) || !blitMgr_->create(device)) {
- LogError("Could not create BlitManager!");
- return;
- }
-
- acceptingCommands_ = true;
-}
-
-VirtualCPU::~VirtualCPU()
-{
- if (cores_ == NULL) {
- return;
- }
-
- delete blitMgr_;
-
- const size_t numCores = device().info().maxComputeUnits_;
- for (size_t i = 0; i < numCores; ++i) {
- delete cores_[i];
- }
+ if ((numWorkerThreads_ += numCores) >= Device::getMaxWorkerThreadsNumber()) {
numWorkerThreads_ -= numCores;
- delete[] cores_;
+ cores_ = NULL;
+ return;
+ }
+
+ cores_ = new (std::nothrow) WorkerThread*[numCores];
+ if (cores_ == NULL) {
+ return;
+ }
+
+ // Clear memory for the worker threads
+ memset(cores_, 0, numCores * sizeof(WorkerThread*));
+
+#if defined(__linux__)
+ const bool isNuma =
+#if defined(NUMA_SUPPORT)
+ device.getNumaMask() == NULL;
+#else
+ false;
+#endif // NUMA_SUPPORT
+ const amd::Os::ThreadAffinityMask* affinityMask = isNuma ? NULL :
+#else
+ const amd::Os::ThreadAffinityMask* affinityMask =
+#endif
+ device.getWorkerThreadsAffinity();
+
+ uint coreId = affinityMask != NULL ? affinityMask->getFirstSet() : (uint)-1;
+
+ for (size_t i = 0; i < numCores; ++i) {
+ WorkerThread* thread = cores_[i] = new WorkerThread(device);
+ if (thread == NULL) {
+ for (size_t j = 0; j < i; ++j) {
+ cores_[j]->resume();
+ }
+ return;
+ }
+
+ if (thread->state() != amd::Thread::INITIALIZED) {
+ return;
+ }
+
+#if defined(__linux__)
+ if (!isNuma) {
+ if (coreId == (uint)-1) {
+ thread->setAffinity((uint)i);
+ } else {
+ thread->setAffinity(coreId);
+ coreId = affinityMask->getNextSet(coreId);
+ }
+ }
+#else // On Windows we set an affinity mask and not a specific ID.
+ if (coreId != (uint)-1) {
+ thread->setAffinity(*affinityMask);
+ }
+#endif
+ thread->start();
+ }
+
+ blitMgr_ = new device::HostBlitManager(*this);
+ if ((NULL == blitMgr_) || !blitMgr_->create(device)) {
+ LogError("Could not create BlitManager!");
+ return;
+ }
+
+ acceptingCommands_ = true;
}
-bool
-VirtualCPU::terminate()
-{
- if (cores_ == NULL) {
- return true;
- }
+VirtualCPU::~VirtualCPU() {
+ if (cores_ == NULL) {
+ return;
+ }
- const size_t numCores = device().info().maxComputeUnits_;
- for (size_t i = 0; i < numCores; ++i) {
- if (cores_[i]) {
- cores_[i]->terminate();
- }
- }
+ delete blitMgr_;
+
+ const size_t numCores = device().info().maxComputeUnits_;
+ for (size_t i = 0; i < numCores; ++i) {
+ delete cores_[i];
+ }
+ numWorkerThreads_ -= numCores;
+ delete[] cores_;
+}
+
+bool VirtualCPU::terminate() {
+ if (cores_ == NULL) {
return true;
+ }
+
+ const size_t numCores = device().info().maxComputeUnits_;
+ for (size_t i = 0; i < numCores; ++i) {
+ if (cores_[i]) {
+ cores_[i]->terminate();
+ }
+ }
+ return true;
}
-void
-VirtualCPU::submitReadMemory(amd::ReadMemoryCommand& vcmd)
-{
- vcmd.setStatus(CL_RUNNING);
+void VirtualCPU::submitReadMemory(amd::ReadMemoryCommand& vcmd) {
+ vcmd.setStatus(CL_RUNNING);
- bool result = false;
- device::Memory memory(vcmd.source());
+ bool result = false;
+ device::Memory memory(vcmd.source());
- // Ensure memory up-to-date
- vcmd.source().cacheWriteBack();
+ // Ensure memory up-to-date
+ vcmd.source().cacheWriteBack();
- switch (vcmd.type()) {
+ switch (vcmd.type()) {
case CL_COMMAND_READ_BUFFER:
- result = blitMgr().readBuffer(memory, vcmd.destination(),
- vcmd.origin(), vcmd.size(), vcmd.isEntireMemory());
- break;
+ result = blitMgr().readBuffer(memory, vcmd.destination(), vcmd.origin(), vcmd.size(),
+ vcmd.isEntireMemory());
+ break;
case CL_COMMAND_READ_BUFFER_RECT:
- result = blitMgr().readBufferRect(memory,
- vcmd.destination(), vcmd.bufRect(), vcmd.hostRect(), vcmd.size(),
- vcmd.isEntireMemory());
- break;
+ result = blitMgr().readBufferRect(memory, vcmd.destination(), vcmd.bufRect(), vcmd.hostRect(),
+ vcmd.size(), vcmd.isEntireMemory());
+ break;
case CL_COMMAND_READ_IMAGE:
- result = blitMgr().readImage(memory, vcmd.destination(),
- vcmd.origin(), vcmd.size(), vcmd.rowPitch(), vcmd.slicePitch(),
- vcmd.isEntireMemory());
- break;
+ result = blitMgr().readImage(memory, vcmd.destination(), vcmd.origin(), vcmd.size(),
+ vcmd.rowPitch(), vcmd.slicePitch(), vcmd.isEntireMemory());
+ break;
default:
- LogError("Unsupported type for the read command");
- break;
- }
+ LogError("Unsupported type for the read command");
+ break;
+ }
- if (!result) {
- LogError("submitReadMemory failed!");
- vcmd.setStatus(CL_INVALID_OPERATION);
- }
- else {
- vcmd.setStatus(CL_COMPLETE);
- }
+ if (!result) {
+ LogError("submitReadMemory failed!");
+ vcmd.setStatus(CL_INVALID_OPERATION);
+ } else {
+ vcmd.setStatus(CL_COMPLETE);
+ }
}
-void
-VirtualCPU::submitWriteMemory(amd::WriteMemoryCommand& vcmd)
-{
- vcmd.setStatus(CL_RUNNING);
+void VirtualCPU::submitWriteMemory(amd::WriteMemoryCommand& vcmd) {
+ vcmd.setStatus(CL_RUNNING);
- bool result = false;
- device::Memory memory(vcmd.destination());
+ bool result = false;
+ device::Memory memory(vcmd.destination());
- // Ensure memory up-to-date
- vcmd.destination().cacheWriteBack();
+ // Ensure memory up-to-date
+ vcmd.destination().cacheWriteBack();
- // Process different write commands
- switch (vcmd.type()) {
+ // Process different write commands
+ switch (vcmd.type()) {
case CL_COMMAND_WRITE_BUFFER:
- result = blitMgr().writeBuffer(vcmd.source(), memory,
- vcmd.origin(), vcmd.size(), vcmd.isEntireMemory());
- break;
+ result = blitMgr().writeBuffer(vcmd.source(), memory, vcmd.origin(), vcmd.size(),
+ vcmd.isEntireMemory());
+ break;
case CL_COMMAND_WRITE_BUFFER_RECT:
- result = blitMgr().writeBufferRect(vcmd.source(), memory,
- vcmd.hostRect(), vcmd.bufRect(), vcmd.size(),
- vcmd.isEntireMemory());
- break;
+ result = blitMgr().writeBufferRect(vcmd.source(), memory, vcmd.hostRect(), vcmd.bufRect(),
+ vcmd.size(), vcmd.isEntireMemory());
+ break;
case CL_COMMAND_WRITE_IMAGE:
- result = blitMgr().writeImage(vcmd.source(), memory,
- vcmd.origin(), vcmd.size(), vcmd.rowPitch(), vcmd.slicePitch(),
- vcmd.isEntireMemory());
- break;
+ result = blitMgr().writeImage(vcmd.source(), memory, vcmd.origin(), vcmd.size(),
+ vcmd.rowPitch(), vcmd.slicePitch(), vcmd.isEntireMemory());
+ break;
default:
- LogError("Unsupported type for the write command");
- break;
- }
+ LogError("Unsupported type for the write command");
+ break;
+ }
- // Mark cache as clean (CPU works directly on backing store)
- vcmd.destination().signalWrite(NULL);
+ // Mark cache as clean (CPU works directly on backing store)
+ vcmd.destination().signalWrite(NULL);
- if (!result) {
- LogError("submitWriteMemory failed!");
- vcmd.setStatus(CL_INVALID_OPERATION);
- }
- else {
- vcmd.setStatus(CL_COMPLETE);
- }
+ if (!result) {
+ LogError("submitWriteMemory failed!");
+ vcmd.setStatus(CL_INVALID_OPERATION);
+ } else {
+ vcmd.setStatus(CL_COMPLETE);
+ }
}
-void
-VirtualCPU::submitCopyMemory(amd::CopyMemoryCommand& vcmd)
-{
- vcmd.setStatus(CL_RUNNING);
+void VirtualCPU::submitCopyMemory(amd::CopyMemoryCommand& vcmd) {
+ vcmd.setStatus(CL_RUNNING);
- // Ensure memory up-to-date
- vcmd.source().cacheWriteBack();
- vcmd.destination().cacheWriteBack();
+ // Ensure memory up-to-date
+ vcmd.source().cacheWriteBack();
+ vcmd.destination().cacheWriteBack();
- // Translate memory references and ensure cache up-to-date
- device::Memory dstMemory(vcmd.destination());
- device::Memory srcMemory(vcmd.source());
+ // Translate memory references and ensure cache up-to-date
+ device::Memory dstMemory(vcmd.destination());
+ device::Memory srcMemory(vcmd.source());
- bool result = false;
+ bool result = false;
- // Check if HW can be used for memory copy
- switch (vcmd.type()) {
+ // Check if HW can be used for memory copy
+ switch (vcmd.type()) {
case CL_COMMAND_COPY_BUFFER:
- result = blitMgr().copyBuffer(srcMemory, dstMemory,
- vcmd.srcOrigin(), vcmd.dstOrigin(), vcmd.size(),
- vcmd.isEntireMemory());
- break;
+ result = blitMgr().copyBuffer(srcMemory, dstMemory, vcmd.srcOrigin(), vcmd.dstOrigin(),
+ vcmd.size(), vcmd.isEntireMemory());
+ break;
case CL_COMMAND_COPY_BUFFER_RECT:
- result = blitMgr().copyBufferRect(srcMemory, dstMemory,
- vcmd.srcRect(), vcmd.dstRect(), vcmd.size(),
- vcmd.isEntireMemory());
- break;
+ result = blitMgr().copyBufferRect(srcMemory, dstMemory, vcmd.srcRect(), vcmd.dstRect(),
+ vcmd.size(), vcmd.isEntireMemory());
+ break;
case CL_COMMAND_COPY_IMAGE_TO_BUFFER:
- result = blitMgr().copyImageToBuffer(srcMemory, dstMemory,
- vcmd.srcOrigin(), vcmd.dstOrigin(), vcmd.size(),
- vcmd.isEntireMemory());
- break;
+ result = blitMgr().copyImageToBuffer(srcMemory, dstMemory, vcmd.srcOrigin(), vcmd.dstOrigin(),
+ vcmd.size(), vcmd.isEntireMemory());
+ break;
case CL_COMMAND_COPY_BUFFER_TO_IMAGE:
- result = blitMgr().copyBufferToImage(srcMemory, dstMemory,
- vcmd.srcOrigin(), vcmd.dstOrigin(), vcmd.size(),
- vcmd.isEntireMemory());
- break;
+ result = blitMgr().copyBufferToImage(srcMemory, dstMemory, vcmd.srcOrigin(), vcmd.dstOrigin(),
+ vcmd.size(), vcmd.isEntireMemory());
+ break;
case CL_COMMAND_COPY_IMAGE:
- result = blitMgr().copyImage(srcMemory, dstMemory,
- vcmd.srcOrigin(), vcmd.dstOrigin(), vcmd.size(),
- vcmd.isEntireMemory());
- break;
+ result = blitMgr().copyImage(srcMemory, dstMemory, vcmd.srcOrigin(), vcmd.dstOrigin(),
+ vcmd.size(), vcmd.isEntireMemory());
+ break;
default:
- LogError("Unsupported command type for memory copy!");
- break;
- }
+ LogError("Unsupported command type for memory copy!");
+ break;
+ }
- // Mark cache as clean (CPU works directly on backing store)
- vcmd.destination().signalWrite(NULL);
+ // Mark cache as clean (CPU works directly on backing store)
+ vcmd.destination().signalWrite(NULL);
- if (!result) {
- LogError("submitCopyMemory failed!");
- vcmd.setStatus(CL_INVALID_OPERATION);
- }
- else {
- vcmd.setStatus(CL_COMPLETE);
- }
+ if (!result) {
+ LogError("submitCopyMemory failed!");
+ vcmd.setStatus(CL_INVALID_OPERATION);
+ } else {
+ vcmd.setStatus(CL_COMPLETE);
+ }
}
-void
-VirtualCPU::submitMapMemory(amd::MapMemoryCommand& cmd)
-{
- cmd.setStatus(CL_RUNNING);
+void VirtualCPU::submitMapMemory(amd::MapMemoryCommand& cmd) {
+ cmd.setStatus(CL_RUNNING);
- if (cmd.mapFlags() & CL_MAP_READ
- || cmd.mapFlags() & CL_MAP_WRITE) {
- LogInfo("cpu::VirtualCPU::submitMapMemory() CL_MAP_READ and CL_MAP_WRITE ignored");
- }
+ if (cmd.mapFlags() & CL_MAP_READ || cmd.mapFlags() & CL_MAP_WRITE) {
+ LogInfo("cpu::VirtualCPU::submitMapMemory() CL_MAP_READ and CL_MAP_WRITE ignored");
+ }
- // Ensure memory up-to-date
- cmd.memory().cacheWriteBack();
+ // Ensure memory up-to-date
+ cmd.memory().cacheWriteBack();
- cmd.setStatus(CL_COMPLETE);
+ cmd.setStatus(CL_COMPLETE);
}
-void
-VirtualCPU::submitUnmapMemory(amd::UnmapMemoryCommand& cmd)
-{
- cmd.setStatus(CL_RUNNING);
+void VirtualCPU::submitUnmapMemory(amd::UnmapMemoryCommand& cmd) {
+ cmd.setStatus(CL_RUNNING);
- // Mark cache as clean (CPU works directly on backing store)
- cmd.memory().signalWrite(NULL);
+ // Mark cache as clean (CPU works directly on backing store)
+ cmd.memory().signalWrite(NULL);
- //! @todo:dgladdin: strictly speaking we should check that the mem object was mapped
- cmd.setStatus(CL_COMPLETE);
+ //! @todo:dgladdin: strictly speaking we should check that the mem object was mapped
+ cmd.setStatus(CL_COMPLETE);
}
-void
-VirtualCPU::submitFillMemory(amd::FillMemoryCommand& vcmd)
-{
- vcmd.setStatus(CL_RUNNING);
+void VirtualCPU::submitFillMemory(amd::FillMemoryCommand& vcmd) {
+ vcmd.setStatus(CL_RUNNING);
- device::Memory memory(vcmd.memory());
+ device::Memory memory(vcmd.memory());
- vcmd.memory().cacheWriteBack();
+ vcmd.memory().cacheWriteBack();
- bool result = false;
+ bool result = false;
- // Find the the right fill operation
- switch (vcmd.type()) {
+ // Find the the right fill operation
+ switch (vcmd.type()) {
case CL_COMMAND_FILL_BUFFER:
- result = blitMgr().fillBuffer(memory, vcmd.pattern(),
- vcmd.patternSize(), vcmd.origin(), vcmd.size(),
- vcmd.isEntireMemory());
- break;
+ result = blitMgr().fillBuffer(memory, vcmd.pattern(), vcmd.patternSize(), vcmd.origin(),
+ vcmd.size(), vcmd.isEntireMemory());
+ break;
case CL_COMMAND_FILL_IMAGE:
- result = blitMgr().fillImage(memory, vcmd.pattern(),
- vcmd.origin(), vcmd.size(), vcmd.isEntireMemory());
- break;
+ result = blitMgr().fillImage(memory, vcmd.pattern(), vcmd.origin(), vcmd.size(),
+ vcmd.isEntireMemory());
+ break;
default:
- LogError("Unsupported command type for FillMemory!");
- break;
- }
+ LogError("Unsupported command type for FillMemory!");
+ break;
+ }
- vcmd.memory().signalWrite(NULL);
+ vcmd.memory().signalWrite(NULL);
- if (!result) {
- LogError("submitFillMemory failed!");
- vcmd.setStatus(CL_INVALID_OPERATION);
- }
- else {
- vcmd.setStatus(CL_COMPLETE);
- }
+ if (!result) {
+ LogError("submitFillMemory failed!");
+ vcmd.setStatus(CL_INVALID_OPERATION);
+ } else {
+ vcmd.setStatus(CL_COMPLETE);
+ }
}
//! Helper function for forcing a cache sync for all kernel parameters
-static void syncAllParams(amd::NDRangeKernelCommand& cmd)
-{
- const amd::Kernel& kernel = cmd.kernel();
- const amd::KernelParameters& kernelParam = kernel.parameters();
- const amd::KernelSignature& signature = kernel.signature();
- const amd::Device& device = cmd.queue()->device();
+static void syncAllParams(amd::NDRangeKernelCommand& cmd) {
+ const amd::Kernel& kernel = cmd.kernel();
+ const amd::KernelParameters& kernelParam = kernel.parameters();
+ const amd::KernelSignature& signature = kernel.signature();
+ const amd::Device& device = cmd.queue()->device();
- for (size_t i = 0; i < signature.numParameters(); ++i) {
- const amd::KernelParameterDescriptor& desc = signature.at(i);
- if (desc.type_ == T_POINTER && desc.size_ > 0 &&
- !kernelParam.boundToSvmPointer(device, cmd.parameters(), i)) {
- address ptr = (address) (cmd.parameters() + desc.offset_);
- amd::Memory* memArg = *(amd::Memory**)ptr;
+ for (size_t i = 0; i < signature.numParameters(); ++i) {
+ const amd::KernelParameterDescriptor& desc = signature.at(i);
+ if (desc.type_ == T_POINTER && desc.size_ > 0 &&
+ !kernelParam.boundToSvmPointer(device, cmd.parameters(), i)) {
+ address ptr = (address)(cmd.parameters() + desc.offset_);
+ amd::Memory* memArg = *(amd::Memory**)ptr;
- if (memArg != NULL) {
- memArg->cacheWriteBack();
- memArg->signalWrite(NULL);
- }
- }
+ if (memArg != NULL) {
+ memArg->cacheWriteBack();
+ memArg->signalWrite(NULL);
+ }
}
+ }
}
-void
-VirtualCPU::computeLocalSizes(amd::NDRangeKernelCommand& command,
- amd::NDRange& local) {
- bool uniformSize = (OPENCL_MAJOR < 2) ||
- command.kernel().getDeviceKernel(device())->getUniformWorkGroupSize();
+void VirtualCPU::computeLocalSizes(amd::NDRangeKernelCommand& command, amd::NDRange& local) {
+ bool uniformSize =
+ (OPENCL_MAJOR < 2) || command.kernel().getDeviceKernel(device())->getUniformWorkGroupSize();
const amd::NDRangeContainer& sizes = command.sizes();
const size_t numCores = device().info().maxComputeUnits_;
const size_t globalSize1D = sizes.global().product();
- const size_t targetNumOperations =
- std::min(globalSize1D, numCores * 4);
- size_t localSize1D =
- std::min(globalSize1D / targetNumOperations,
- device().info().maxWorkGroupSize_);
-
+ const size_t targetNumOperations = std::min(globalSize1D, numCores * 4);
+ size_t localSize1D =
+ std::min(globalSize1D / targetNumOperations, device().info().maxWorkGroupSize_);
+
for (size_t i = 0; i < local.dimensions(); ++i) {
const size_t globalSize = sizes.global()[i];
size_t localSize =
- std::min(std::min(localSize1D, globalSize),
- device().info().maxWorkItemSizes_[i]);
-
+ std::min(std::min(localSize1D, globalSize), device().info().maxWorkItemSizes_[i]);
+
// local must exactly divide global if uniform size is required
// For non uniform size, we could use the work group size hint
if (uniformSize && globalSize % localSize != 0) {
@@ -395,222 +356,181 @@ VirtualCPU::computeLocalSizes(amd::NDRangeKernelCommand& command,
}
-static
-amd::NDRange computeRemainders(const amd::NDRange& global,
- const amd::NDRange& local)
-{
+static amd::NDRange computeRemainders(const amd::NDRange& global, const amd::NDRange& local) {
amd::NDRange remainders(local.dimensions());
for (size_t i = 0; i < local.dimensions(); ++i) {
- remainders[i] = (global[i] % local[i] != 0) ? 1 : 0;
+ remainders[i] = (global[i] % local[i] != 0) ? 1 : 0;
}
return remainders;
}
-void
-VirtualCPU::submitKernel(amd::NDRangeKernelCommand& command)
-{
- const amd::NDRangeContainer& sizes = command.sizes();
- const size_t numCores = device().info().maxComputeUnits_;
+void VirtualCPU::submitKernel(amd::NDRangeKernelCommand& command) {
+ const amd::NDRangeContainer& sizes = command.sizes();
+ const size_t numCores = device().info().maxComputeUnits_;
- amd::NDRange local = sizes.local();
+ amd::NDRange local = sizes.local();
- if (local == 0) {
- computeLocalSizes(command, local);
- }
- amd::NDRange remainders = computeRemainders(sizes.global(), local);
+ if (local == 0) {
+ computeLocalSizes(command, local);
+ }
+ amd::NDRange remainders = computeRemainders(sizes.global(), local);
- // number of groups in each dimensions
- const amd::NDRange numGroups = (sizes.global() / local) + remainders;
+ // number of groups in each dimensions
+ const amd::NDRange numGroups = (sizes.global() / local) + remainders;
- size_t numOperations = numGroups.product();
- if (numOperations == 0) {
- command.setStatus(CL_COMPLETE);
- return;
- }
-
- syncAllParams(command);
- // retain the command here instead of retaining in NDRangeKernelBatch' ctor
- command.retain();
-
- size_t batchCount = std::min(numOperations, numCores);
- NDRangeKernelBatch batch(command, *this, numGroups, batchCount);
-
- Operation::Counter counter(command, batchCount);
- command.setData(&counter);
-
- for (size_t coreId = 0; coreId < batchCount; ++coreId) {
- batch.setCoreId(coreId);
- cores_[coreId]->enqueue(batch);
- cores_[coreId]->flush();
- }
-
- command.awaitCompletion();
- command.release();
-}
-
-void
-VirtualCPU::submitNativeFn(amd::NativeFnCommand& command)
-{
- NativeFn fn(command);
- cores_[0]->enqueue(fn);
- cores_[0]->flush();
- command.awaitCompletion();
-}
-
-void
-VirtualCPU::submitMarker(amd::Marker& command)
-{
+ size_t numOperations = numGroups.product();
+ if (numOperations == 0) {
command.setStatus(CL_COMPLETE);
+ return;
+ }
+
+ syncAllParams(command);
+ // retain the command here instead of retaining in NDRangeKernelBatch' ctor
+ command.retain();
+
+ size_t batchCount = std::min(numOperations, numCores);
+ NDRangeKernelBatch batch(command, *this, numGroups, batchCount);
+
+ Operation::Counter counter(command, batchCount);
+ command.setData(&counter);
+
+ for (size_t coreId = 0; coreId < batchCount; ++coreId) {
+ batch.setCoreId(coreId);
+ cores_[coreId]->enqueue(batch);
+ cores_[coreId]->flush();
+ }
+
+ command.awaitCompletion();
+ command.release();
}
-void
-VirtualCPU::submitAcquireExtObjects(amd::AcquireExtObjectsCommand& cmd)
-{
- //! @todo [odintsov]: create an AcquireExtObjectsOperation and enqueue it
- //! to a core when a core scheduler is around.
- //
- // cores_[0]->enqueue(new AcquireExtObjectsOperation(cmd));
- // the code below will be moved to AcquireExtObjectsOperation::execute()
- cmd.setStatus(CL_RUNNING);
-
- //
- // AcquireExtObjects execution starts here
- //
- bool bError = false;
-
- //! Go through ext objects by one and call member function to execute
- //! a sequence of external graphics API commands for each external object
- for(std::vector::const_iterator itr = cmd.getMemList().begin();
- itr != cmd.getMemList().end(); itr++) {
- if(*itr) {
- bError |= !((*itr)->mapExtObjectInCQThread());
- }
- }
- if(bError) {
- cmd.setStatus(CL_INVALID_OPERATION);
- }
- else {
- cmd.setStatus(CL_COMPLETE);
- }
+void VirtualCPU::submitNativeFn(amd::NativeFnCommand& command) {
+ NativeFn fn(command);
+ cores_[0]->enqueue(fn);
+ cores_[0]->flush();
+ command.awaitCompletion();
}
-void
-VirtualCPU::submitReleaseExtObjects(amd::ReleaseExtObjectsCommand& cmd)
-{
- //! @todo [odintsov]: create a ReleaseExtObjectsOperation and enqueue it
- //! to a core when a core scheduler is around.
- //
- // cores_[i]->enqueue(new ReleaseExtObjectsOperation(cmd));
- // the code below will be moved to ReleaseExtObjectsOperation::execute()
- cmd.setStatus(CL_RUNNING);
+void VirtualCPU::submitMarker(amd::Marker& command) { command.setStatus(CL_COMPLETE); }
- bool bError = false;
+void VirtualCPU::submitAcquireExtObjects(amd::AcquireExtObjectsCommand& cmd) {
+ //! @todo [odintsov]: create an AcquireExtObjectsOperation and enqueue it
+ //! to a core when a core scheduler is around.
+ //
+ // cores_[0]->enqueue(new AcquireExtObjectsOperation(cmd));
+ // the code below will be moved to AcquireExtObjectsOperation::execute()
+ cmd.setStatus(CL_RUNNING);
- for(std::vector::const_iterator itr = cmd.getMemList().begin();
- itr != cmd.getMemList().end(); itr++) {
- if(*itr) {
- bError |= !((*itr)->unmapExtObjectInCQThread());
- }
- }
- if(bError) {
- cmd.setStatus(CL_INVALID_OPERATION);
- }
- else {
- cmd.setStatus(CL_COMPLETE);
- }
-}
+ //
+ // AcquireExtObjects execution starts here
+ //
+ bool bError = false;
-void VirtualCPU::submitPerfCounter(amd::PerfCounterCommand& cmd)
-{
- cmd.setStatus(CL_RUNNING);
- LogError("We don't support HW perf counters on CPU");
+ //! Go through ext objects by one and call member function to execute
+ //! a sequence of external graphics API commands for each external object
+ for (std::vector::const_iterator itr = cmd.getMemList().begin();
+ itr != cmd.getMemList().end(); itr++) {
+ if (*itr) {
+ bError |= !((*itr)->mapExtObjectInCQThread());
+ }
+ }
+ if (bError) {
cmd.setStatus(CL_INVALID_OPERATION);
+ } else {
+ cmd.setStatus(CL_COMPLETE);
+ }
}
-void VirtualCPU::submitThreadTraceMemObjects(amd::ThreadTraceMemObjectsCommand& cmd)
-{
- cmd.setStatus(CL_RUNNING);
- LogError("We don't support thread trace on CPU");
- cmd.setStatus(CL_INVALID_OPERATION);
-}
+void VirtualCPU::submitReleaseExtObjects(amd::ReleaseExtObjectsCommand& cmd) {
+ //! @todo [odintsov]: create a ReleaseExtObjectsOperation and enqueue it
+ //! to a core when a core scheduler is around.
+ //
+ // cores_[i]->enqueue(new ReleaseExtObjectsOperation(cmd));
+ // the code below will be moved to ReleaseExtObjectsOperation::execute()
+ cmd.setStatus(CL_RUNNING);
-void VirtualCPU::submitThreadTrace(amd::ThreadTraceCommand& cmd)
-{
- cmd.setStatus(CL_RUNNING);
- LogError("We don't support thread trace on CPU");
- cmd.setStatus(CL_INVALID_OPERATION);
-}
+ bool bError = false;
-void
-VirtualCPU::flush(amd::Command* list, bool wait)
-{
- amd::Command* head = list;
-
- // Release all commands from the link list
- while (head != NULL) {
- amd::Command * it = head->getNext();
- head->release();
- head = it;
+ for (std::vector::const_iterator itr = cmd.getMemList().begin();
+ itr != cmd.getMemList().end(); itr++) {
+ if (*itr) {
+ bError |= !((*itr)->unmapExtObjectInCQThread());
}
-}
-
-void
-VirtualCPU::submitSignal(amd::SignalCommand & cmd)
-{
+ }
+ if (bError) {
cmd.setStatus(CL_INVALID_OPERATION);
+ } else {
+ cmd.setStatus(CL_COMPLETE);
+ }
}
-void
-VirtualCPU::submitMakeBuffersResident(amd::MakeBuffersResidentCommand & cmd)
-{
- cmd.setStatus(CL_INVALID_OPERATION);
+void VirtualCPU::submitPerfCounter(amd::PerfCounterCommand& cmd) {
+ cmd.setStatus(CL_RUNNING);
+ LogError("We don't support HW perf counters on CPU");
+ cmd.setStatus(CL_INVALID_OPERATION);
}
-void
-VirtualCPU::submitSvmFreeMemory(amd::SvmFreeMemoryCommand& cmd)
-{
- cmd.setStatus(CL_RUNNING);
- if (cmd.pfnFreeFunc() == NULL) {
- // pointers allocated using clSVMAlloc
- for (cl_uint i = 0; i < cmd.svmPointers().size(); i++) {
- amd::SvmBuffer::free(cmd.context(), cmd.svmPointers()[i]);
- }
+void VirtualCPU::submitThreadTraceMemObjects(amd::ThreadTraceMemObjectsCommand& cmd) {
+ cmd.setStatus(CL_RUNNING);
+ LogError("We don't support thread trace on CPU");
+ cmd.setStatus(CL_INVALID_OPERATION);
+}
+
+void VirtualCPU::submitThreadTrace(amd::ThreadTraceCommand& cmd) {
+ cmd.setStatus(CL_RUNNING);
+ LogError("We don't support thread trace on CPU");
+ cmd.setStatus(CL_INVALID_OPERATION);
+}
+
+void VirtualCPU::flush(amd::Command* list, bool wait) {
+ amd::Command* head = list;
+
+ // Release all commands from the link list
+ while (head != NULL) {
+ amd::Command* it = head->getNext();
+ head->release();
+ head = it;
+ }
+}
+
+void VirtualCPU::submitSignal(amd::SignalCommand& cmd) { cmd.setStatus(CL_INVALID_OPERATION); }
+
+void VirtualCPU::submitMakeBuffersResident(amd::MakeBuffersResidentCommand& cmd) {
+ cmd.setStatus(CL_INVALID_OPERATION);
+}
+
+void VirtualCPU::submitSvmFreeMemory(amd::SvmFreeMemoryCommand& cmd) {
+ cmd.setStatus(CL_RUNNING);
+ if (cmd.pfnFreeFunc() == NULL) {
+ // pointers allocated using clSVMAlloc
+ for (cl_uint i = 0; i < cmd.svmPointers().size(); i++) {
+ amd::SvmBuffer::free(cmd.context(), cmd.svmPointers()[i]);
}
- else {
- cmd.pfnFreeFunc()(as_cl(cmd.queue()->asCommandQueue()), cmd.svmPointers().size(),
- (void**) (&(cmd.svmPointers()[0])), cmd.userData());
- }
- cmd.setStatus(CL_COMPLETE);
+ } else {
+ cmd.pfnFreeFunc()(as_cl(cmd.queue()->asCommandQueue()), cmd.svmPointers().size(),
+ (void**)(&(cmd.svmPointers()[0])), cmd.userData());
+ }
+ cmd.setStatus(CL_COMPLETE);
}
-void
-VirtualCPU::submitSvmCopyMemory(amd::SvmCopyMemoryCommand& cmd)
-{
- cmd.setStatus(CL_RUNNING);
- amd::SvmBuffer::memFill(cmd.dst(), cmd.src(), cmd.srcSize(), 1);
- cmd.setStatus(CL_COMPLETE);
+void VirtualCPU::submitSvmCopyMemory(amd::SvmCopyMemoryCommand& cmd) {
+ cmd.setStatus(CL_RUNNING);
+ amd::SvmBuffer::memFill(cmd.dst(), cmd.src(), cmd.srcSize(), 1);
+ cmd.setStatus(CL_COMPLETE);
}
-void
-VirtualCPU::submitSvmFillMemory(amd::SvmFillMemoryCommand& cmd)
-{
- cmd.setStatus(CL_RUNNING);
- amd::SvmBuffer::memFill(cmd.dst(), cmd.pattern(), cmd.patternSize(), cmd.times());
- cmd.setStatus(CL_COMPLETE);
+void VirtualCPU::submitSvmFillMemory(amd::SvmFillMemoryCommand& cmd) {
+ cmd.setStatus(CL_RUNNING);
+ amd::SvmBuffer::memFill(cmd.dst(), cmd.pattern(), cmd.patternSize(), cmd.times());
+ cmd.setStatus(CL_COMPLETE);
}
-void
-VirtualCPU::submitSvmMapMemory(amd::SvmMapMemoryCommand& cmd)
-{
- cmd.setStatus(CL_COMPLETE);
+void VirtualCPU::submitSvmMapMemory(amd::SvmMapMemoryCommand& cmd) { cmd.setStatus(CL_COMPLETE); }
+
+void VirtualCPU::submitSvmUnmapMemory(amd::SvmUnmapMemoryCommand& cmd) {
+ cmd.setStatus(CL_COMPLETE);
}
-void
-VirtualCPU::submitSvmUnmapMemory(amd::SvmUnmapMemoryCommand& cmd)
-{
- cmd.setStatus(CL_COMPLETE);
-}
-
-} // namespace cpu
+} // namespace cpu
diff --git a/rocclr/runtime/device/cpu/cpuvirtual.hpp b/rocclr/runtime/device/cpu/cpuvirtual.hpp
index 5a1ac86b70..3bb2d3394f 100644
--- a/rocclr/runtime/device/cpu/cpuvirtual.hpp
+++ b/rocclr/runtime/device/cpu/cpuvirtual.hpp
@@ -17,60 +17,52 @@ namespace cpu {
class WorkerThread;
class Device;
-class VirtualCPU : public device::VirtualDevice
-{
-private:
- WorkerThread** cores_; //!< Pointer to array of Worker threads
- static amd::Atomic numWorkerThreads_; //!< Current Worker Threads number
- bool acceptingCommands_;
+class VirtualCPU : public device::VirtualDevice {
+ private:
+ WorkerThread** cores_; //!< Pointer to array of Worker threads
+ static amd::Atomic numWorkerThreads_; //!< Current Worker Threads number
+ bool acceptingCommands_;
-public:
- VirtualCPU(cpu::Device& device);
- ~VirtualCPU();
- bool terminate();
+ public:
+ VirtualCPU(cpu::Device& device);
+ ~VirtualCPU();
+ bool terminate();
- WorkerThread* getWorkerThread(size_t id) { return cores_[id]; }
+ WorkerThread* getWorkerThread(size_t id) { return cores_[id]; }
- bool acceptingCommands() const { return acceptingCommands_; }
+ bool acceptingCommands() const { return acceptingCommands_; }
- virtual void submitReadMemory(amd::ReadMemoryCommand& command);
- virtual void submitWriteMemory(amd::WriteMemoryCommand& command);
- virtual void submitCopyMemory(amd::CopyMemoryCommand& command);
- virtual void submitMapMemory(amd::MapMemoryCommand& command);
- virtual void submitUnmapMemory(amd::UnmapMemoryCommand& command);
- virtual void submitKernel(amd::NDRangeKernelCommand& command);
- virtual void submitNativeFn(amd::NativeFnCommand& command);
- virtual void submitMarker(amd::Marker& command);
- virtual void submitFillMemory(amd::FillMemoryCommand& command);
- virtual void submitMigrateMemObjects(amd::MigrateMemObjectsCommand& cmd) {}
- virtual void submitAcquireExtObjects(amd::AcquireExtObjectsCommand& cmd);
- virtual void submitReleaseExtObjects(amd::ReleaseExtObjectsCommand& cmd);
- virtual void submitPerfCounter(amd::PerfCounterCommand& cmd);
- virtual void submitThreadTraceMemObjects(amd::ThreadTraceMemObjectsCommand& cmd);
- virtual void submitThreadTrace(amd::ThreadTraceCommand& cmd);
- virtual void flush(amd::Command* list = NULL, bool wait = false);
- virtual void submitSignal(amd::SignalCommand & cmd);
- virtual void submitMakeBuffersResident(amd::MakeBuffersResidentCommand & cmd);
- virtual void submitSvmFreeMemory(amd::SvmFreeMemoryCommand& cmd);
- virtual void submitSvmCopyMemory(amd::SvmCopyMemoryCommand& cmd);
- virtual void submitSvmFillMemory(amd::SvmFillMemoryCommand& cmd);
- virtual void submitSvmMapMemory(amd::SvmMapMemoryCommand& cmd);
- virtual void submitSvmUnmapMemory(amd::SvmUnmapMemoryCommand& cmd);
+ virtual void submitReadMemory(amd::ReadMemoryCommand& command);
+ virtual void submitWriteMemory(amd::WriteMemoryCommand& command);
+ virtual void submitCopyMemory(amd::CopyMemoryCommand& command);
+ virtual void submitMapMemory(amd::MapMemoryCommand& command);
+ virtual void submitUnmapMemory(amd::UnmapMemoryCommand& command);
+ virtual void submitKernel(amd::NDRangeKernelCommand& command);
+ virtual void submitNativeFn(amd::NativeFnCommand& command);
+ virtual void submitMarker(amd::Marker& command);
+ virtual void submitFillMemory(amd::FillMemoryCommand& command);
+ virtual void submitMigrateMemObjects(amd::MigrateMemObjectsCommand& cmd) {}
+ virtual void submitAcquireExtObjects(amd::AcquireExtObjectsCommand& cmd);
+ virtual void submitReleaseExtObjects(amd::ReleaseExtObjectsCommand& cmd);
+ virtual void submitPerfCounter(amd::PerfCounterCommand& cmd);
+ virtual void submitThreadTraceMemObjects(amd::ThreadTraceMemObjectsCommand& cmd);
+ virtual void submitThreadTrace(amd::ThreadTraceCommand& cmd);
+ virtual void flush(amd::Command* list = NULL, bool wait = false);
+ virtual void submitSignal(amd::SignalCommand& cmd);
+ virtual void submitMakeBuffersResident(amd::MakeBuffersResidentCommand& cmd);
+ virtual void submitSvmFreeMemory(amd::SvmFreeMemoryCommand& cmd);
+ virtual void submitSvmCopyMemory(amd::SvmCopyMemoryCommand& cmd);
+ virtual void submitSvmFillMemory(amd::SvmFillMemoryCommand& cmd);
+ virtual void submitSvmMapMemory(amd::SvmMapMemoryCommand& cmd);
+ virtual void submitSvmUnmapMemory(amd::SvmUnmapMemoryCommand& cmd);
- virtual void computeLocalSizes(amd::NDRangeKernelCommand& command,
- amd::NDRange& local);
+ virtual void computeLocalSizes(amd::NDRangeKernelCommand& command, amd::NDRange& local);
- static bool fillImage(
- amd::Image& image,
- address fillMem,
- const void* pattern,
- const amd::Coord3D& origin,
- const amd::Coord3D& region,
- size_t rowPitch,
- size_t slicePitch,
- size_t elementSize);
+ static bool fillImage(amd::Image& image, address fillMem, const void* pattern,
+ const amd::Coord3D& origin, const amd::Coord3D& region, size_t rowPitch,
+ size_t slicePitch, size_t elementSize);
};
-} // namespace cpu
+} // namespace cpu
-#endif // CPUVIRTUAL_HPP_
+#endif // CPUVIRTUAL_HPP_
diff --git a/rocclr/runtime/device/device.cpp b/rocclr/runtime/device/device.cpp
index 17e5454f0f..62322d9af7 100644
--- a/rocclr/runtime/device/device.cpp
+++ b/rocclr/runtime/device/device.cpp
@@ -13,26 +13,26 @@ extern amd::AppProfile* rocCreateAppProfile();
#if defined(WITH_CPU_DEVICE)
#include "device/cpu/cpudevice.hpp"
-#endif // WITH_CPU_DEVICE
+#endif // WITH_CPU_DEVICE
#if defined(WITH_PAL_DEVICE)
-//namespace pal {
+// namespace pal {
extern bool PalDeviceLoad();
extern void PalDeviceUnload();
//}
-#endif // WITH_PAL_DEVICE
+#endif // WITH_PAL_DEVICE
#if defined(WITH_GPU_DEVICE)
extern bool DeviceLoad();
extern void DeviceUnload();
-#endif // WITH_GPU_DEVICE
+#endif // WITH_GPU_DEVICE
#include "platform/runtime.hpp"
#include "platform/program.hpp"
#include "thread/monitor.hpp"
#include "amdocl/cl_common.hpp"
#include "utils/options.hpp"
-#include "utils/versions.hpp" // AMD_PLATFORM_INFO
+#include "utils/versions.hpp" // AMD_PLATFORM_INFO
#if defined(HAVE_BLOWFISH_H)
#include "blowfish/oclcrypt.hpp"
@@ -53,1924 +53,1694 @@ extern void DeviceUnload();
#include
-
namespace device {
extern const char* BlitSourceCode;
}
namespace amd {
-std::vector *Device::devices_ = NULL;
+std::vector* Device::devices_ = NULL;
AppProfile Device::appProfile_;
amd::Monitor SvmManager::AllocatedLock_("Guards SVM allocation list");
std::map SvmManager::svmBufferMap_;
-size_t
-SvmManager::size()
-{
- amd::ScopedLock lock(AllocatedLock_);
- return svmBufferMap_.size();
+size_t SvmManager::size() {
+ amd::ScopedLock lock(AllocatedLock_);
+ return svmBufferMap_.size();
}
-void
-SvmManager::AddSvmBuffer(const void* k, amd::Memory* v)
-{
- amd::ScopedLock lock(AllocatedLock_);
- svmBufferMap_.insert(std::pair(reinterpret_cast(k), v));
+void SvmManager::AddSvmBuffer(const void* k, amd::Memory* v) {
+ amd::ScopedLock lock(AllocatedLock_);
+ svmBufferMap_.insert(std::pair(reinterpret_cast(k), v));
}
-void
-SvmManager::RemoveSvmBuffer(const void* k)
-{
- amd::ScopedLock lock(AllocatedLock_);
- svmBufferMap_.erase(reinterpret_cast