diff --git a/rocclr/runtime/device/cpu/cpubinary.cpp b/rocclr/runtime/device/cpu/cpubinary.cpp deleted file mode 100644 index 7e56ed7353..0000000000 --- a/rocclr/runtime/device/cpu/cpubinary.cpp +++ /dev/null @@ -1,211 +0,0 @@ -// -// Copyright 2011 Advanced Micro Devices, Inc. All rights reserved. -// - -#include "device/cpu/cpubinary.hpp" -#include "device/cpu/cpudevice.hpp" -#include "device/cpu/cpuprogram.hpp" -#include "utils/versions.hpp" -#include "os/os.hpp" - -#include -#include -#include -#include -#include - -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 fcERROR; - } - 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 fcERROR; - } - 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 fcERROR; - } - } else { - // BIF 2.0 - if ((platform != amd::OclElf::CPU_PLATFORM) || ((target & elf_target) != elf_target)) { - LogError("Loading OCL CPU binary: different target"); - return fcERROR; - } - } - 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 - fcRECOMPILE; - } - } - } - return fcOK; -} - -bool ClBinary::loadX86(Program& program, std::string& dllName, bool& hasDLL) { - hasDLL = false; - - std::string tempName = amd::Os::getTempFileName(); - - dllName = tempName + "." WINDOWS_SWITCH("dll", MACOS_SWITCH("dyld", "so")); - - switch (checkFeatures()) { - case fcERROR: - return false; - case fcRECOMPILE: - return true; - case fcOK: - // Fallthrough - break; - } - - char* section; - size_t sz; - - 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; - } - - std::fstream f; - f.open(dllName.c_str(), (std::fstream::out | std::fstream::binary)); - - 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(); - - 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; - } - - 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; -} - -bool ClBinary::loadX86JIT(Program& program, bool& hasJITBinary) { - hasJITBinary = false; - - switch (checkFeatures()) { - case fcERROR: - return false; - case fcRECOMPILE: - return true; - case fcOK: - // Fallthrough - break; - } - - char* section; - size_t sz; - - 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; - 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); - return; - } - } -} -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; - } - const char* x86CodePtr = aclJITObjectImageData(program.compiler(), objectImage, &err); - if (err != ACL_SUCCESS) { - LogWarning("aclJITObjectImageData failed"); - return false; - } - elfOut_->addSection(amd::OclElf::JITBINARY, x86CodePtr, x86CodeSize); - } - return true; -} - -bool ClBinary::storeX86Asm(const char* buffer, size_t size) { - if (saveAS()) { - elfOut_->addSection(amd::OclElf::ASTEXT, buffer, size); - } - return true; -} - -} // namespace cpu diff --git a/rocclr/runtime/device/cpu/cpubinary.hpp b/rocclr/runtime/device/cpu/cpubinary.hpp deleted file mode 100644 index 96bb4eb88b..0000000000 --- a/rocclr/runtime/device/cpu/cpubinary.hpp +++ /dev/null @@ -1,75 +0,0 @@ -// -// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved. -// - -#ifndef CPUBINARY_HPP_ -#define CPUBINARY_HPP_ - -#include "top.hpp" -#include "device/device.hpp" -#include "device/cpu/cpudevice.hpp" -#include "elf/elf.hpp" - -//! \namespace cpu CPU Device Implementation -namespace cpu { - -class Device; -class Program; - -//! \class CPU binary -class ClBinary : public device::ClBinary { - public: - //! Constructor - ClBinary(const Device& dev) : device::ClBinary(dev) {} - - //! 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 - ); - - //! 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 - ); - - //! 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); - } - - bool storeX86Asm(const char* buffer, size_t size); - - private: - enum FeatureCheckResult { fcERROR, fcRECOMPILE, fcOK }; - - FeatureCheckResult checkFeatures(); - - //! Disable default copy constructor - ClBinary(const ClBinary&); - - //! Disable default operator= - ClBinary& operator=(const ClBinary&); - - //! Returns the GPU device for this object - const Device& dev() { return static_cast(dev_); } -}; - -} // namespace cpu - -#endif // CPUBINARY_HPP_ diff --git a/rocclr/runtime/device/cpu/cpubuiltins.cpp b/rocclr/runtime/device/cpu/cpubuiltins.cpp deleted file mode 100644 index b366134ad9..0000000000 --- a/rocclr/runtime/device/cpu/cpubuiltins.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// -// Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved. -// - -#include "device/cpu/cpubuiltins.hpp" -#include "device/cpu/cpucommand.hpp" - -#include -#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 -// 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; - } -} -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; -} -namespace cpu { - -const clk_builtins_t Builtins::dispatchTable_ = { - /* Synchronization functions */ - &WorkItem::barrier, - /* AMD Only builtins: FIXME_lmoriche: remove or add an extension */ - NULL, cpuprintf}; - -} // namespace cpu diff --git a/rocclr/runtime/device/cpu/cpubuiltins.hpp b/rocclr/runtime/device/cpu/cpubuiltins.hpp deleted file mode 100644 index f50854e7b1..0000000000 --- a/rocclr/runtime/device/cpu/cpubuiltins.hpp +++ /dev/null @@ -1,19 +0,0 @@ -// -// Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved. -// - -#ifndef BUILTINS_HPP_ -#define BUILTINS_HPP_ - -#include "top.hpp" -#include "amdocl/cl_kernel.h" - -namespace cpu { - -struct Builtins : public amd::AllStatic { - static const clk_builtins_t dispatchTable_; -}; - -} // namespace cpu - -#endif /*BUILTINS_HPP_*/ diff --git a/rocclr/runtime/device/cpu/cpucommand.cpp b/rocclr/runtime/device/cpu/cpucommand.cpp deleted file mode 100644 index 95ca23fa70..0000000000 --- a/rocclr/runtime/device/cpu/cpucommand.cpp +++ /dev/null @@ -1,609 +0,0 @@ -// -// Copyright 2010 Advanced Micro Devices, Inc. All rights reserved. -// - -#include "device/cpu/cpucommand.hpp" -#include "device/cpu/cpubuiltins.hpp" -#include "device/cpu/cpudevice.hpp" -#include "device/cpu/cputables.hpp" -#include "platform/command.hpp" -#include "platform/commandqueue.hpp" -#include "platform/program.hpp" -#include "platform/kernel.hpp" -#include "platform/sampler.hpp" -#include "thread/thread.hpp" -#include "os/os.hpp" -#include "utils/util.hpp" -#include "utils/options.hpp" - -#include -#include - -namespace cpu { - -#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)); - -#if defined(__linux__) && defined(NUMA_SUPPORT) - 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_); -} - -bool WorkerThread::terminate() { - terminated_ = true; - - if (Thread::current() != this) { - // FIXME_lmoriche: fix termination handshake - while (state() < Thread::FINISHED) { - flush(); - amd::Os::yield(); - } - } - - return true; -} - -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); -#if defined(WIN32) - 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_.unlock(); -} - -void NativeFn::execute() { - cl_int status = static_cast(command()).invoke(); - command().setStatus(status); -} - -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(); - } - - 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; - } - -//#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); - - // In case were we have less operations than Worker Threads - if (worker->isOperationValid()) { - workingBatch = static_cast(worker->operation()); - - 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); - } - break; - } - numStolenIds = workingBatch->getNextOperationIds(opId, numStolenIds); - } while (numStolenIds > 0); - } - numStolenIds = 1; - } - } // for (stolenId..maxId) - - 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 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; - } - - topId += opId; - if (topId >= (numWorkGroups + numCores_)) { - count -= (topId - numWorkGroups) / numCores_; - } - - 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_); - - 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_address cmdParams = command.parameters(); - - 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); - - // 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; - - 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) { - 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]; - } - } - - // 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()); -} - -void WorkGroup::executeWithoutBarrier() { - kernelentrypoint_t entryPoint = (kernelentrypoint_t)kernel_.getEntryPoint(); - address workItemStackPtr = workItem0_->nativeStackPtr(); - - // Execute thread0 - callKernel(entryPoint, workItemStackPtr); - - // 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_.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])); - } - } -} - -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); - } -} - -} // namespace cpu diff --git a/rocclr/runtime/device/cpu/cpucommand.hpp b/rocclr/runtime/device/cpu/cpucommand.hpp deleted file mode 100644 index d5b4e35e83..0000000000 --- a/rocclr/runtime/device/cpu/cpucommand.hpp +++ /dev/null @@ -1,377 +0,0 @@ -// -// Copyright 2010 Advanced Micro Devices, Inc. All rights reserved. -// - -#ifndef OPERATION_HPP_ -#define OPERATION_HPP_ - -#include "top.hpp" -#include "device/cpu/cpudevice.hpp" -#include "device/cpu/cpukernel.hpp" -#include "platform/command.hpp" -#include "thread/thread.hpp" -#include "os/os.hpp" -#include "amdocl/cl_kernel.h" - -#if defined(ATI_ARCH_ARM) -#include -#endif // ATI_ARCH_ARM - -namespace cpu { - -/*! \addtogroup CPU - * @{ - * - * \addtogroup CPUExec Execution environment - * @{ - */ - -//! A saved stack context -class StackContext : public amd::StackObject { - private: -#if defined(ATI_ARCH_ARM) - jmp_buf env_; -#elif defined(_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(); - - //! 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_; - - //! This fiber's saved state. - StackContext context_; - - 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; } - - //! 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(); - } - } -}; - - -//! 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_; - - 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_; - - public: - Operation(amd::Command& command) : command_(command) {} - - virtual ~Operation(){}; - - virtual void clone(Operation* buf) = 0; - - void cleanup(); - - amd::Command& command() { return command_; } - - virtual void execute() = 0; -}; - -/*! @} - * \defgroup CPUOperations Operations - * @{ - */ - -//! A work item instance -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(); } - - 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; - } - - 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; - } - - //! 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); -}; - -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_; - - 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_; } - - 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); -}; - -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 - }; - - 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) {} - - virtual void clone(Operation* buf) { - ::new (buf) NDRangeKernelBatch(static_cast(command_), - virtualDevice_, groupIds_, numCores_); - static_cast(buf)->setCoreId(coreId_); - } - - virtual void execute(); - - 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); - - 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) {} - - virtual void clone(Operation* buf) { - ::new (buf) NativeFn(static_cast(command_)); - } - - virtual void execute(); -}; -#ifndef 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. - - 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_; - - char operation_[MAX_OPERATION_ALLOC_SIZE]; - - address baseWorkItemsStack_; - - private: - //! Awaits operations and execute them as they become ready. - void loop(); - - public: - //! Construct a new WorkerThread. - WorkerThread(const cpu::Device& device); - //! Destroy the worker thread. - virtual ~WorkerThread(); - //! Cleanup the thread before termination. - bool terminate(); - - //! 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_; } - - address baseWorkItemsStack() { return baseWorkItemsStack_; } - - Operation* operation() { return reinterpret_cast(operation_); } - bool isOperationValid() { return waitingOp_ > 0; } - - //! 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(); - } - - //! 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()); } -}; - -/*! @} - * @} - */ - -extern "C" intptr_t _StackContext_setjmp(intptr_t* regs); - -#if !defined(ATI_ARCH_ARM) -ALWAYSINLINE -#endif -intptr_t StackContext::setjmp() { -#if defined(ATI_ARCH_ARM) - return ::setjmp(env_); -#else - 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 { -#if defined(ATI_ARCH_ARM) - return ::longjmp(*const_cast(&env_), val); -#else - return _StackContext_longjmp(regs_, val); -#endif -} - - -extern "C" void _WorkGroup_callKernel(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); -} - -// 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); -} - - -} // namespace cpu - -#endif /*OPERATION_HPP_*/ diff --git a/rocclr/runtime/device/cpu/cpudevice.cpp b/rocclr/runtime/device/cpu/cpudevice.cpp deleted file mode 100644 index a88deb505e..0000000000 --- a/rocclr/runtime/device/cpu/cpudevice.cpp +++ /dev/null @@ -1,1049 +0,0 @@ -// -// Copyright 2011 Advanced Micro Devices, Inc. All rights reserved. -// - -#include "device/cpu/cpudevice.hpp" -#include "device/cpu/cpuprogram.hpp" -#include "utils/versions.hpp" -#include "utils/flags.hpp" - -#include "amdocl/cl_common.hpp" - -#include -#include -#include -#include -#include - -#if defined(__linux__) -#if !defined(ATI_ARCH_ARM) -#include -#endif // ATI_ARCH_ARM -#include -#endif - -#if defined(_WIN32) -#include -#include - -extern BOOL(WINAPI* pfnGetNumaNodeProcessorMaskEx)(USHORT, PGROUP_AFFINITY); -#endif // _WIN32 - -namespace cpu { - -aclCompiler* Device::compiler_; - -size_t Device::maxWorkerThreads_ = (size_t)-1; - -Device::~Device() { -#if defined(__linux__) && defined(NUMA_SUPPORT) - if (getNumaMask() != NULL) { - if (numaMask_ != NULL) { - delete numaMask_; - } - } else -#endif - if (workerThreadsAffinity_ != NULL) { - delete workerThreadsAffinity_; - } -} -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; - - 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; - } - - device::Info info; - ::memset(&info, '\0', sizeof(info)); - - 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; - } - - 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.preferredWorkGroupSize_ = CPU_MAX_WORKGROUP_SIZE; - - 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; - - // 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.maxParameterSize_ = 4 * Ki; - - 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.doubleFPConfig_ = info.singleFPConfig_; - info.singleFPConfig_ |= CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT; - - info.affinityDomain_.value_ = 0; - info.affinityDomain_.next_ = 1; - - 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; - - 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; - } -#endif - -#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)) { - 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; - } - } - } - } - - free(buffer); - - ULONG highestNuma = 0; - if (::GetNumaHighestNodeNumber(&highestNuma) && highestNuma != 0) { - info.affinityDomain_.numa_ = 1; - } - -#endif - - uintptr_t virtualMemSize; - -#if defined(__linux__) -#if !defined(ATI_ARCH_ARM) - 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; -#else - info.globalMemSize_ = 0; -#endif - virtualMemSize = (uintptr_t)info.globalMemSize_; -#else - 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); -#endif - // 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); - -#if defined(_LP64) - // 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; -#endif - 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.maxConstantBufferSize_ = 64 * Ki; - info.maxConstantArgs_ = 8; - - 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.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; - -#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; - - 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.maxEngineClockFrequency_ = ::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; - - // 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"); - - // 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.maxEngineClockFrequency_ = 0; - info.maxMemoryClockFrequency_ = 0; - HKEY hKey; - - // 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.maxEngineClockFrequency_, &dwLen); - - // Cleanup and return - RegCloseKey(hKey); - } - -#else - ::strcpy(info.name_, "Unknown Processor"); - ::strcpy(info.vendor_, "Unknown Vendor"); - info.maxEngineClockFrequency_ = 0; - info.maxMemoryClockFrequency_ = 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.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_)); - - Device* device = new Device(); - - if (device == NULL || !device->create()) { - delete device; - return false; - } - - ::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" : ""); - - // 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 - - // Find all supported device extensions - info.extensions_ = device->getExtensionString(); - - // 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; - - // 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(); - - return true; -} - -bool Device::create() { - // Create CPU settings - settings_ = new cpu::Settings(); - cpu::Settings* cpuSettings = reinterpret_cast(settings_); - - 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; - } -#endif - - return true; -} - -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) { - 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; - } - - // 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); - } - } else { // Already has affinity, so filter accordingly - for (cl_uint i = 0; i < numWorkerThreads; ++i) { - coreId = threadsAffinityMask->getNextSet(coreId); - workerThreadsAffinity_->set(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_) { - case device::PartitionType::EQUALLY: - return partitionEqually(create_info, num_entries, devices, num_devices); - - case device::PartitionType::BY_COUNTS: - 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) { - return CL_DEVICE_PARTITION_FAILED; - } - - 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; - } - - 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::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; - for (uint subDev = 0; subDev < numSubDevices; ++subDev) { - Device* device = new Device(this); - if (device == NULL) { - return CL_OUT_OF_HOST_MEMORY; - } - - cl_uint subComputeUnits = create_info.countsListAt((size_t)subDev); - 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; -#else - 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; - } - - 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_; - } 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; - } - - 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) { - 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); - -#endif - - if (num_devices != NULL) { - *num_devices = numSubDevices; - } - - if (numSubDevices == 0) { - return CL_INVALID_VALUE; - } - - 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!"); - } - - 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]; - } - - return NULL; -} - -void Device::freeMapTarget(amd::Memory& mem, void* target) { - // nop for CPU -} - -} // namespace cpu diff --git a/rocclr/runtime/device/cpu/cpudevice.hpp b/rocclr/runtime/device/cpu/cpudevice.hpp deleted file mode 100644 index 16df72d541..0000000000 --- a/rocclr/runtime/device/cpu/cpudevice.hpp +++ /dev/null @@ -1,208 +0,0 @@ -// -// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved. -// - -#ifndef CPUDEVICE_HPP_ -#define CPUDEVICE_HPP_ - -#include "top.hpp" -#include "device/device.hpp" -#include "device/cpu/cpuvirtual.hpp" -#include "device/cpu/cpusettings.hpp" -#include "os/os.hpp" - -#if defined(__linux__) && defined(NUMA_SUPPORT) -#include -#endif - -#include "acl.h" - -//! \namespace cpu CPU Device Implementation -namespace cpu { - -//! Maximum number of the supported samplers -const static uint32_t MaxSamplers = 16; -//! Maximum number of supported read images -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 -const static uint32_t MaxReadWriteImage = 64; - -/*! \addtogroup CPU CPU Device Implementation - * @{ - * - * \addtogroup CPUDevice Device - * - * \copydoc cpu::Device - * - * @{ - */ - -//! A CPU device ordinal -class Device : public amd::Device { - protected: - static aclCompiler* compiler_; - - public: - aclCompiler* compiler() const { return compiler_; } - - public: - static bool init(void); - - //! Shutdown CPU device - static void tearDown(); - - //! Construct a new identifier - Device(Device* parent = NULL) : amd::Device(parent), workerThreadsAffinity_(NULL) {} - - virtual ~Device(); - - bool create(); - - 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); - - //! 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; - } - - //! 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; - } - - //! 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 - } - - 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 - ); - - //! 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; } - - //! Get CPU device settings - const cpu::Settings& settings() const { return reinterpret_cast(*settings_); } - - bool hasAVXInstructions() const { - return (settings().cpuFeatures_ & Settings::AVXInstructions) ? true : false; - } - - bool hasFMA4Instructions() const { - return (settings().cpuFeatures_ & Settings::FMA4Instructions) ? true : false; - } - - static size_t getMaxWorkerThreadsNumber() { return maxWorkerThreads_; } - - 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; - } - - //! host memory deallocation - virtual void svmFree(void* ptr) const { return; } - - private: - bool initSubDevice(device::Info& info, cl_uint maxComputeUnits, - const device::CreateSubDevicesInfo& create_info); - - cl_int partitionEqually(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 partitionByAffinityDomainNUMA(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); - - 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; - } - - 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. -#endif - - static size_t maxWorkerThreads_; //!< Maximum number of Worker Threads -}; - -/*! @} - * @} - */ - -} // namespace cpu - -#endif // CPUDEVICE_HPP_ diff --git a/rocclr/runtime/device/cpu/cpufeat.hpp b/rocclr/runtime/device/cpu/cpufeat.hpp deleted file mode 100644 index 75ffceaedb..0000000000 --- a/rocclr/runtime/device/cpu/cpufeat.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright 2011 Advanced Micro Devices, Inc. All rights reserved. -// - -#ifndef CPUFEAT_HPP -#define CPUFEAT_HPP - -#define CPUFEAT_CX_SSE3 (1 << 0) -#define CPUFEAT_CX_SSSE3 (1 << 9) -#define CPUFEAT_CX_CMPXCHG16B (1 << 13) -#define CPUFEAT_CX_SSE4_1 (1 << 19) -#define CPUFEAT_CX_SSE4_2 (1 << 20) -#define CPUFEAT_CX_POPCNT (1 << 23) -#define CPUFEAT_CX_AES (1 << 25) -#define CPUFEAT_CX_OSXSAVE (1 << 27) -#define CPUFEAT_CX_AVX (1 << 28) - -#define INTEL_CPUFEAT_CX_FMA3 (1 << 12) - -#define AMD_CPUFEAT_CX_FMA4 (1 << 16) -#define AMD_CPUFEAT_CX_XOP (1 << 11) -#define AMD_CPUFEAT_CX_SSE4A (1 << 6) - -#define CPUFEAT_DX_SSE (1 < 25) -#define CPUFEAT_DX_SSE2 (1 << 26) - -#endif // CPUFEAT_HPP diff --git a/rocclr/runtime/device/cpu/cpukernel.S b/rocclr/runtime/device/cpu/cpukernel.S deleted file mode 100644 index 19a1ce7d7b..0000000000 --- a/rocclr/runtime/device/cpu/cpukernel.S +++ /dev/null @@ -1,87 +0,0 @@ -# -# Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved. -# - - .text -.globl _WorkGroup_callKernel -#if defined(ATI_ARCH_X86) - .type _WorkGroup_callKernel, @function -_WorkGroup_callKernel: -#if defined(_LP64) - pushq %rbp - movq %rsp, %rbp - movq %rdx, %rsp // stackPtr - call *%rsi - movq %rbp, %rsp - popq %rbp -#else // _LP64 - pushl %ebp - movl %esp, %ebp - movl 0x10(%ebp), %esp // stackPtr - movl 0x0C(%ebp), %edx // entryPoint - movl 0x08(%ebp), %ecx // params - movl %ecx, (%esp) - call *%edx - movl %ebp, %esp - popl %ebp -#endif // _LP64 - ret -#elif defined(ATI_ARCH_ARM) - .type _WorkGroup_callKernel, %function -_WorkGroup_callKernel: - bx lr -#endif - -.globl _WorkGroup_callKernelProtectedReturn -#if defined(ATI_ARCH_X86) - .type _WorkGroup_callKernelProtectedReturn, @function -_WorkGroup_callKernelProtectedReturn: -#if defined(_LP64) - movq %rbp, %rax - movq %rsp, %rbp - movq %rdx, %rsp // stackPtr - subq $CPUKERNEL_STACK_ALIGN, %rsp - movq %rax, 0x08(%rsp) // save rbp - movq %rbx, 0x00(%rsp) // save rbx - movq (%rbp), %rbx // return address - - call *%rsi - - movq %rbx, %rdx - movq %rbp, %rcx - movq 0x00(%rsp), %rbx // load rbx - movq 0x08(%rsp), %rbp // load rbp - movq %rcx, %rsp - addq $0x08, %rsp // skip return address - jmp *%rdx -#else // !_LP64 - movl %ebp, %eax - movl %esp, %ebp - movl 0x0C(%ebp), %esp // stackPtr - subl $CPUKERNEL_STACK_ALIGN, %esp - movl 0x04(%ebp), %ecx // params - movl %eax, 0x08(%esp) // save ebp - movl %ebx, 0x04(%esp) // save ebx - movl %ecx, 0x00(%esp) // pass params - movl 0x00(%ebp), %ebx // return address - movl 0x08(%ebp), %edx // entryPoint - - call *%edx - - movl %ebx, %edx - movl %ebp, %ecx - movl 0x04(%esp), %ebx // load ebx - movl 0x08(%esp), %ebp // load ebp - movl %ecx, %esp - addl $0x4, %esp // skip return address - jmp *%edx -#endif // !_LP64 -#elif defined(ATI_ARCH_ARM) - .type _WorkGroup_callKernelProtectedReturn, %function -_WorkGroup_callKernelProtectedReturn: - bx lr -#endif - - -.section .note.GNU-stack,"",%progbits - diff --git a/rocclr/runtime/device/cpu/cpukernel.asm b/rocclr/runtime/device/cpu/cpukernel.asm deleted file mode 100644 index bb729c9f58..0000000000 --- a/rocclr/runtime/device/cpu/cpukernel.asm +++ /dev/null @@ -1,84 +0,0 @@ -; -; Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved. -; - -ifndef _WIN64 - .386 - .model flat, c -endif ; !_WIN64 - -OPTION PROLOGUE:NONE -OPTION EPILOGUE:NONE -.code - -ifndef _WIN64 - -_WorkGroup_callKernel proc - push ebp - mov ebp, esp - mov esp, 10h[ebp] ; stackPtr - mov edx, 0Ch[ebp] ; entryPoint - push 08h[ebp] ; params - call edx - mov esp, ebp - pop ebp - ret -_WorkGroup_callKernel endp - -_WorkGroup_callKernelProtectedReturn proc - mov eax, ebp - mov ebp, esp - mov esp, 0Ch[ebp] ; stackPtr - sub esp, CPUKERNEL_STACK_ALIGN - mov 04h[esp], eax ; save ebp - mov 00h[esp], ebx ; save ebx - mov ebx, 00h[ebp] ; return address - mov edx, 08h[ebp] ; entryPoint - - push 04h[ebp] ; params - call edx - - mov edx, ebx - mov ecx, ebp - mov ebx, 04h[esp] ; load ebx - mov ebp, 08h[esp] ; load ebp - mov esp, ecx - add esp, 04h ; skip return address - jmp edx -_WorkGroup_callKernelProtectedReturn endp - -else ; _WIN64 - -_WorkGroup_callKernel proc - push rbp - mov rbp, rsp - mov rsp, r8 ; stackPtr - call rdx - mov rsp, rbp - pop rbp - ret -_WorkGroup_callKernel endp - -_WorkGroup_callKernelProtectedReturn proc - mov rax, rbp - mov rbp, rsp - mov rsp, r8 ; stackPtr - sub rsp, CPUKERNEL_STACK_ALIGN - mov 08h[rsp], rax ; save rbp - mov 00h[rsp], rbx ; save rbx - mov rbx, [rbp] ; return address - - call rdx - - mov rdx, rbx - mov rcx, rbp - mov rbx, 00h[rsp] ; load rbx - mov rbp, 08h[rsp] ; load rbp - mov rsp, rcx - add rsp, 08h ; skip return address - jmp rdx -_WorkGroup_callKernelProtectedReturn endp - -endif ; _WIN64 - -end diff --git a/rocclr/runtime/device/cpu/cpukernel.hpp b/rocclr/runtime/device/cpu/cpukernel.hpp deleted file mode 100644 index a2544850ce..0000000000 --- a/rocclr/runtime/device/cpu/cpukernel.hpp +++ /dev/null @@ -1,93 +0,0 @@ -// -// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved. -// - -#ifndef CPUKERNEL_HPP_ -#define CPUKERNEL_HPP_ - -#include "top.hpp" -#include "device/device.hpp" -#include - -#include "device/cpu/cpumapping.hpp" - -//! \namespace cpu CPU Device Implementation -namespace cpu { - -//! \class CPU kernel -class Kernel : public device::Kernel { - private: - const void* entryPoint_; //!< entry for the kernel - - std::vector > args_; - std::vector > HCtoDCmaps_; - std::vector internal_maps_; - - public: - uint nature_; //!< kernel's nature - uint privateSize_; //!< WorkItem's private memory size (in bytes) - - private: - //! Disable default copy constructor - Kernel(const Kernel&); - //! Disable operator= - Kernel& operator=(const Kernel&); - - public: - void addArg(size_t size, size_t alignment) { - args_.push_back(std::pair(size, alignment)); - } - - size_t getArgSize(int argIndex) const { return args_[argIndex].first; } - - size_t getArgAlignment(int argIndex) const { return args_[argIndex].second; } - - 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; - } - - 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(); } - - //! 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() {} - - //! 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; } - - //! 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_; } -}; - -} // namespace cpu - -#endif // CPUKERNEL_HPP_ diff --git a/rocclr/runtime/device/cpu/cpumapping.cpp b/rocclr/runtime/device/cpu/cpumapping.cpp deleted file mode 100644 index 43b3279fae..0000000000 --- a/rocclr/runtime/device/cpu/cpumapping.cpp +++ /dev/null @@ -1,427 +0,0 @@ -// -// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved. -// - -#include "device/cpu/cpudevice.hpp" -#include "device/cpu/cpukernel.hpp" -#include "platform/program.hpp" -#include "os/os.hpp" -#include "device/cpu/cpumapping.hpp" -#include -#include -#include -#include -#include - -#if defined(_WIN32) -#include -#endif -// amdrt.o -#if defined(WITH_ONLINE_COMPILER) && !defined(_LP64) && !defined(ATI_ARCH_ARM) -#include "amdrt.inc" -#endif -#include "acl.h" -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() { 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; -} - -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; -} - -// 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; - 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; -} - -// 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; - } -} - -// 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 deleted file mode 100644 index 00531ef8ea..0000000000 --- a/rocclr/runtime/device/cpu/cpumapping.hpp +++ /dev/null @@ -1,45 +0,0 @@ -// -// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved. -// -// HCtoDCmap provides a mapping of parameters from host compiler to device compiler -// The mapping can be used to copy parameters from host to device where field alignment -// is different in compilers -#ifndef CPUMAPPING_HPP_ -#define CPUMAPPING_HPP_ - -namespace cpu { - -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 - - 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: -}; - - -} // 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 diff --git a/rocclr/runtime/device/cpu/cpuprogram.cpp b/rocclr/runtime/device/cpu/cpuprogram.cpp deleted file mode 100644 index 5f52cdf574..0000000000 --- a/rocclr/runtime/device/cpu/cpuprogram.cpp +++ /dev/null @@ -1,1276 +0,0 @@ - -// -// Copyright 2011 Advanced Micro Devices, Inc. All rights reserved. -// - -#include "device/cpu/cpuprogram.hpp" -#include "device/cpu/cpudevice.hpp" -#include "device/cpu/cpukernel.hpp" -#include "platform/program.hpp" -#include "utils/options.hpp" -#include "os/os.hpp" - -#include -#include -#include -#include -#include -#include - -#if defined(_WIN32) -#include -#endif - -// amdrt.o -#if defined(WITH_ONLINE_COMPILER) && !defined(_LP64) && !defined(ATI_ARCH_ARM) -#include "amdrt.inc" -#endif - -// 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) { - 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 { - *alignment = 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); -} - - -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; -} - -static clk_value_type_t getFirstScalarType(const clk_parameter_descriptor_t* desc) { - int i = 0; - 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 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; -} - -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) { - 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"; - - 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) { - 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; - 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"; - - 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) { - 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(); - -#if defined(WITH_ONLINE_COMPILER) - 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"); - - 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; - } - - 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; - } - - // 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); - - buildLog_ += aclGetCompilerLog(compiler()); - - 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); - 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 0 - // Debug stuff. Try and disassemble all kernels and stubs - std::stringstream asmtext; - DisasData disasData(&asmtext, objectImage, compiler()); - err = aclJITObjectImageIterateSymbols(compiler(), objectImage, - disasSymbolsCallbackCStr, - &disasData); - if (err != ACL_SUCCESS) { - LogWarning("aclJITObjectImageIterateSymbols failed"); - return false; - } - printf("DisasSize: %d\nDisas: %s\n", (int)asmtext.str().size(), - 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 - return false; -} - -bool Program::initBuild(amd::option::Options* options) { - if (!this->::device::Program::initBuild(options)) { - return 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 - - 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; - } - - return true; -} - -bool Program::finiBuild(bool isBuildGood) { - clBinary()->resetElfOut(); - clBinary()->resetElfIn(); - - if (!isBuildGood) { - // Prevent the encrypted binary form leaking out - clBinary()->setBinary(NULL, 0); - } - - return this->::device::Program::finiBuild(isBuildGood); -} - -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::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 (auto& it : headerIncludeName) { - 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(); - } - - 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; - } - - 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) { - 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()) { - 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; - } - 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) { -#if defined(WITH_ONLINE_COMPILER) - std::vector llvmBinaries(inputPrograms.size()); - std::vector elfSectionType(inputPrograms.size()); - auto it = inputPrograms.cbegin(); - const auto itEnd = inputPrograms.cend(); - 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 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()) { - 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_ -#if 0 - // TODO: copy source into .source section of 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); - } - } -#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_; - } - - 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; - - 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; - } - - _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()); - } - - 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)); - - 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() { - if (clBinary_ == NULL) { - clBinary_ = new ClBinary(device()); - if (clBinary_ == NULL) { - 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; -} - -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]; -#ifdef _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(); -#endif -} - -} // namespace cpu diff --git a/rocclr/runtime/device/cpu/cpuprogram.hpp b/rocclr/runtime/device/cpu/cpuprogram.hpp deleted file mode 100644 index 908956617a..0000000000 --- a/rocclr/runtime/device/cpu/cpuprogram.hpp +++ /dev/null @@ -1,107 +0,0 @@ -// -// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved. -// - -#ifndef CPUPROGRAM_HPP_ -#define CPUPROGRAM_HPP_ - -#include "top.hpp" -#include "device/device.hpp" -#include "device/cpu/cpubinary.hpp" -#include - -// forward declaration -namespace amd { -namespace option { -class Options; -} // 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 - - public: - //! Default constructor - Program(Device& cpuDev) : device::Program(cpuDev), JITBinary(NULL), handle_(NULL) {} - - //! Default destructor - ~Program(); - - //! pre-compile setup for CPU - virtual bool initBuild(amd::option::Options* options); - - //! 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); - - //! 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); - - virtual bool createBinary(amd::option::Options* options); - - //! 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 - ); - - //! Load the library into memory - bool loadDllCode(amd::option::Options* options, bool addElfSymbols = false); - - //! Initialize binary for CPU - virtual bool initClBinary(); - - //! 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()); - } - - 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(); } - - private: - //! Disable default copy constructor - Program(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)); - } - - virtual const aclTargetInfo& info(const char* str = ""); -}; - -} // namespace cpu - -#endif // CPUPROGRAM_HPP_ diff --git a/rocclr/runtime/device/cpu/cpusettings.cpp b/rocclr/runtime/device/cpu/cpusettings.cpp deleted file mode 100644 index 1389f235a9..0000000000 --- a/rocclr/runtime/device/cpu/cpusettings.cpp +++ /dev/null @@ -1,98 +0,0 @@ -// -// Copyright 2011 Advanced Micro Devices, Inc. All rights reserved. -// - -#include "device/cpu/cpusettings.hpp" -#include "os/os.hpp" - -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); - } - - 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(ClKhrSelectFpRoundingMode); - enableExtension(ClKhr3DImageWrites); - -// enableExtension(ClKhrFp16); - -#if defined(_WIN32) - 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); - } - - // 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, 0x1); - - 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); - - // 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; - } - - if (isAmd) { - amd::Os::cpuid(regs, 0x80000001); - cpuFeatures_ |= (regs[2] & fma4_features) == fma4_features ? FMA4Instructions : 0; - } - } - } -#endif // ATI_ARCH_X86 - - return true; -} - -} // namespace cpu diff --git a/rocclr/runtime/device/cpu/cpusettings.hpp b/rocclr/runtime/device/cpu/cpusettings.hpp deleted file mode 100644 index a5958d8900..0000000000 --- a/rocclr/runtime/device/cpu/cpusettings.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// -// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved. -// - -#ifndef CPUSETTINGS_HPP_ -#define CPUSETTINGS_HPP_ - -#include "top.hpp" -#include "device/device.hpp" -#include "device/cpu/cpufeat.hpp" - -//! \namespace cpu CPU Device Implementation -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 - - //! Default constructor - Settings() { cpuFeatures_ = 0; } - - //! Creates settings - bool create(); - - private: - //! Disable copy constructor - Settings(const Settings&); - - //! Disable assignment - Settings& operator=(const Settings&); -}; - -} // namespace cpu - -#endif // CPUSETTINGS_HPP_ diff --git a/rocclr/runtime/device/cpu/cputables.hpp b/rocclr/runtime/device/cpu/cputables.hpp deleted file mode 100644 index 31f02a489a..0000000000 --- a/rocclr/runtime/device/cpu/cputables.hpp +++ /dev/null @@ -1,1010 +0,0 @@ - -#ifndef TABLES_HPP_ -#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_ diff --git a/rocclr/runtime/device/cpu/cpuvirtual.cpp b/rocclr/runtime/device/cpu/cpuvirtual.cpp deleted file mode 100644 index 806cee2ed2..0000000000 --- a/rocclr/runtime/device/cpu/cpuvirtual.cpp +++ /dev/null @@ -1,534 +0,0 @@ -// -// Copyright 2011 Advanced Micro Devices, Inc. All rights reserved. -// - -#include "device/cpu/cpuvirtual.hpp" -#include "device/cpu/cpudevice.hpp" -#include "device/cpu/cpucommand.hpp" -#include "device/blit.hpp" -#include "platform/command.hpp" -#include "platform/commandqueue.hpp" -#include "platform/memory.hpp" -#include "platform/sampler.hpp" -#include "os/os.hpp" -#include - -namespace cpu { - -amd::Atomic VirtualCPU::numWorkerThreads_(0); - -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]; - } - 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); - - bool result = false; - device::Memory memory(vcmd.source()); - - // Ensure memory up-to-date - vcmd.source().cacheWriteBack(); - - switch (vcmd.type()) { - case CL_COMMAND_READ_BUFFER: - 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; - case CL_COMMAND_READ_IMAGE: - 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; - } - - 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); - - bool result = false; - device::Memory memory(vcmd.destination()); - - // Ensure memory up-to-date - vcmd.destination().cacheWriteBack(); - - // 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; - case CL_COMMAND_WRITE_BUFFER_RECT: - 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; - default: - LogError("Unsupported type for the write command"); - break; - } - - // 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); - } -} - - -void VirtualCPU::submitCopyMemory(amd::CopyMemoryCommand& vcmd) { - vcmd.setStatus(CL_RUNNING); - - // 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()); - - bool result = false; - - // 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; - case CL_COMMAND_COPY_BUFFER_RECT: - 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; - case CL_COMMAND_COPY_BUFFER_TO_IMAGE: - 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; - default: - LogError("Unsupported command type for memory copy!"); - break; - } - - // 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); - } -} - -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"); - } - - // Ensure memory up-to-date - cmd.memory().cacheWriteBack(); - - cmd.setStatus(CL_COMPLETE); -} - -void VirtualCPU::submitUnmapMemory(amd::UnmapMemoryCommand& cmd) { - cmd.setStatus(CL_RUNNING); - - // 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); -} - -void VirtualCPU::submitFillMemory(amd::FillMemoryCommand& vcmd) { - vcmd.setStatus(CL_RUNNING); - - device::Memory memory(vcmd.memory()); - - vcmd.memory().cacheWriteBack(); - - bool result = false; - - // 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; - case CL_COMMAND_FILL_IMAGE: - result = blitMgr().fillImage(memory, vcmd.pattern(), vcmd.origin(), vcmd.size(), - vcmd.isEntireMemory()); - break; - default: - LogError("Unsupported command type for FillMemory!"); - break; - } - - vcmd.memory().signalWrite(NULL); - - 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(); - - 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); - } - } - } -} - -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_); - - 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]); - - // 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) { - while (true) { - //! @todo: lmoriche: find a better way - if (globalSize % localSize == 0) break; - --localSize; - } - } - local[i] = localSize; - localSize1D /= localSize; - } - - command.setLocalWorkSize(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; - } - - return remainders; -} - -void VirtualCPU::submitKernel(amd::NDRangeKernelCommand& command) { - const amd::NDRangeContainer& sizes = command.sizes(); - const size_t numCores = device().info().maxComputeUnits_; - - amd::NDRange local = sizes.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; - - 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) { command.setStatus(CL_COMPLETE); } - -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 (const auto& it : cmd.getMemList()) { - if (it) { - bError |= !(it->mapExtObjectInCQThread()); - } - } - if (bError) { - cmd.setStatus(CL_INVALID_OPERATION); - } else { - cmd.setStatus(CL_COMPLETE); - } -} - -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); - - bool bError = false; - - for (const auto& it : cmd.getMemList()) { - if (it) { - bError |= !(it->unmapExtObjectInCQThread()); - } - } - if (bError) { - cmd.setStatus(CL_INVALID_OPERATION); - } else { - cmd.setStatus(CL_COMPLETE); - } -} - -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::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); -} - -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::submitSvmMapMemory(amd::SvmMapMemoryCommand& cmd) { cmd.setStatus(CL_COMPLETE); } - -void VirtualCPU::submitSvmUnmapMemory(amd::SvmUnmapMemoryCommand& cmd) { - cmd.setStatus(CL_COMPLETE); -} - -} // namespace cpu diff --git a/rocclr/runtime/device/cpu/cpuvirtual.hpp b/rocclr/runtime/device/cpu/cpuvirtual.hpp deleted file mode 100644 index 2f30cee28e..0000000000 --- a/rocclr/runtime/device/cpu/cpuvirtual.hpp +++ /dev/null @@ -1,69 +0,0 @@ -// -// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved. -// - -#ifndef CPUVIRTUAL_HPP_ -#define CPUVIRTUAL_HPP_ - -#include "top.hpp" -#include "device/device.hpp" -#include "thread/atomic.hpp" -#include "thread/thread.hpp" -#include "platform/ndrange.hpp" - -//! \namespace cpu CPU Device Implementation -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_; - - public: - VirtualCPU(cpu::Device& device); - ~VirtualCPU(); - bool terminate(); - - WorkerThread* getWorkerThread(size_t id) { return cores_[id]; } - - 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 submitCopyMemoryP2P(amd::CopyMemoryP2PCommand& 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); - - 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 - -#endif // CPUVIRTUAL_HPP_