#pragma once #define CL_HPP_TARGET_OPENCL_VERSION 120 #define CL_HPP_MINIMUM_OPENCL_VERSION 110 #define CL_HPP_ENABLE_EXCEPTIONS 1 #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-parameter" #elif defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wignored-qualifiers" #pragma GCC diagnostic ignored "-Wignored-attributes" #endif #include "CL/cl.hpp" #if defined(__clang__) #pragma clang diagnostic pop #elif defined(__GNUC__) #pragma GCC diagnostic pop #endif #include #include #include class ethash_cl_miner { private: enum { c_maxSearchResults = 63, c_bufferCount = 2, c_hashBatchSize = 1024 }; public: struct search_hook { virtual ~search_hook(); // always a virtual destructor for a class with virtuals. // reports progress, return true to abort virtual bool found(uint64_t const* nonces, uint32_t count) = 0; virtual bool searched(uint64_t start_nonce, uint32_t count) = 0; }; ethash_cl_miner(); ~ethash_cl_miner(); static bool searchForAllDevices(unsigned _platformId, std::function _callback); static bool searchForAllDevices(std::function _callback); static void doForAllDevices(unsigned _platformId, std::function _callback); static void doForAllDevices(std::function _callback); static unsigned getNumPlatforms(); static unsigned getNumDevices(unsigned _platformId = 0); static std::string platform_info(unsigned _platformId = 0, unsigned _deviceId = 0); static void listDevices(); static bool configureGPU( unsigned _platformId, unsigned _localWorkSize, unsigned _globalWorkSize, bool _allowCPU, unsigned _extraGPUMemory, uint64_t _currentBlock ); bool init( ethash_light_t _light, uint8_t const* _lightData, uint64_t _lightSize, unsigned _platformId, unsigned _deviceId ); void finish(); void search(uint8_t const* _header, uint64_t _target, search_hook& _hook, bool _ethStratum, uint64_t _startN); /* -- default values -- */ /// Default value of the local work size. Also known as workgroup size. static unsigned const c_defaultLocalWorkSize; /// Default value of the global work size as a multiplier of the local work size static unsigned const c_defaultGlobalWorkSizeMultiplier; private: static std::vector getDevices(std::vector const& _platforms, unsigned _platformId); static std::vector getPlatforms(); cl::Context m_context; cl::CommandQueue m_queue; cl::Kernel m_searchKernel; cl::Kernel m_dagKernel; cl::Buffer m_dag; cl::Buffer m_light; cl::Buffer m_header; cl::Buffer m_searchBuffer[c_bufferCount]; unsigned m_globalWorkSize; bool m_openclOnePointOne; /// The local work size for the search static unsigned s_workgroupSize; /// The initial global work size for the searches static unsigned s_initialGlobalWorkSize; /// The target milliseconds per batch for the search. If 0, then no adjustment will happen static unsigned s_msPerBatch; /// Allow CPU to appear as an OpenCL device or not. Default is false static bool s_allowCPU; /// GPU memory required for other things, like window rendering e.t.c. /// User can set it via the --cl-extragpu-mem argument. static unsigned s_extraRequiredGPUMem; };