18 #error OpenCL has not been enabled
21 #if defined(_WIN32) && !defined(__CYGWIN__)
32 #if defined(OPENCL_V3)
33 #include <CL/opencl.hpp>
34 #elif defined(__APPLE__)
35 #define CL_SILENCE_DEPRECATION
36 #include <CL/opencl.hpp>
37 #elif defined(_WIN32) || ENABLE_SNUCL
47 class OCLDeviceContext;
66 std::lock_guard<std::mutex>
guard;
103 std::map<OCLAPI, std::unique_ptr<std::mutex>>
mutexes;
118 bool isGpu,
bool isCpu,
bool useHostMem)
128 #if ENABLE_OCL_MEM_GUARDS
138 queue = cl::CommandQueue(c, d, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &error);
139 if (error != CL_SUCCESS) {
140 queue = cl::CommandQueue(c, d, 0, &error);
141 if (error != CL_SUCCESS) {
142 throw std::runtime_error(
"Failed to create OpenCL command queue!");
146 queue = cl::CommandQueue(c, d, 0, &error);
147 if (error != CL_SUCCESS) {
148 throw std::runtime_error(
"Failed to create OpenCL command queue!");
194 int hybridOffset = 3U;
196 if (getenv(
"QRACK_GPU_OFFSET_QB")) {
197 hybridOffset = std::stoi(std::string(getenv(
"QRACK_GPU_OFFSET_QB")));
259 if (getenv(
"QRACK_OCL_PATH")) {
260 std::string toRet = std::string(getenv(
"QRACK_OCL_PATH"));
261 if ((toRet.back() !=
'/') && (toRet.back() !=
'\\')) {
262 #if defined(_WIN32) && !defined(__CYGWIN__)
271 #if defined(_WIN32) && !defined(__CYGWIN__)
272 return std::string(getenv(
"HOMEDRIVE") ? getenv(
"HOMEDRIVE") :
"") +
273 std::string(getenv(
"HOMEPATH") ? getenv(
"HOMEPATH") :
"") +
"\\.qrack\\";
275 return std::string(getenv(
"HOME") ? getenv(
"HOME") :
"") +
"/.qrack/";
281 static InitOClResult InitOCL(
bool buildFromSource =
false,
bool saveBinaries =
false, std::string home =
"*",
282 std::vector<int64_t> maxAllocVec = { -1 });
303 throw std::invalid_argument(
"OCLEngine::GetActiveAllocSize device ID is too high!");
310 throw std::invalid_argument(
"OCLEngine::GetActiveAllocSize device ID is too high!");
327 throw std::invalid_argument(
"OCLEngine::GetActiveAllocSize device ID is too high!");
347 throw std::invalid_argument(
"OCLEngine::GetActiveAllocSize device ID is too high!");
372 static cl::Program
MakeProgram(
bool buildFromSource, std::string path, std::shared_ptr<OCLDeviceContext> devCntxt);
374 static void SaveBinary(cl::Program program, std::string path, std::string fileName);
Definition: oclengine.hpp:64
std::lock_guard< std::mutex > guard
Definition: oclengine.hpp:66
OCLDeviceCall & operator=(const OCLDeviceCall &)=delete
cl::Kernel & call
Definition: oclengine.hpp:71
OCLDeviceCall(std::mutex &m, cl::Kernel &c)
Definition: oclengine.hpp:75
OCLDeviceCall(const OCLDeviceCall &)
Definition: oclengine.hpp:87
OCLDeviceContext(cl::Platform &p, cl::Device &d, cl::Context &c, int64_t dev_id, int64_t cntxt_id, int64_t maxAlloc, bool isGpu, bool isCpu, bool useHostMem)
Definition: oclengine.hpp:117
const cl::Device device
Definition: oclengine.hpp:90
const size_t globalSize
Definition: oclengine.hpp:110
size_t globalLimit
Definition: oclengine.hpp:112
size_t GetPreferredSizeMultiple()
Definition: oclengine.hpp:179
const size_t localSize
Definition: oclengine.hpp:111
std::mutex waitEventsMutex
Definition: oclengine.hpp:101
const bool use_host_mem
Definition: oclengine.hpp:96
const int64_t context_id
Definition: oclengine.hpp:92
std::map< OCLAPI, cl::Kernel > calls
Definition: oclengine.hpp:102
void EmplaceEvent(Fn fn)
Definition: oclengine.hpp:163
size_t GetGlobalSize()
Definition: oclengine.hpp:219
size_t GetMaxAlloc()
Definition: oclengine.hpp:218
std::map< OCLAPI, std::unique_ptr< std::mutex > > mutexes
Definition: oclengine.hpp:103
const bool is_cpu
Definition: oclengine.hpp:95
OCLDeviceCall Reserve(OCLAPI call)
Definition: oclengine.hpp:153
size_t GetMaxWorkGroupSize()
Definition: oclengine.hpp:217
void WaitOnAllEvents()
Definition: oclengine.hpp:170
size_t GetLocalSize()
Definition: oclengine.hpp:220
const int64_t device_id
Definition: oclengine.hpp:93
const size_t maxWorkGroupSize
Definition: oclengine.hpp:108
cl::CommandQueue queue
Definition: oclengine.hpp:97
size_t preferredConcurrency
Definition: oclengine.hpp:114
size_t GetMaxWorkItems()
Definition: oclengine.hpp:216
const size_t procElemCount
Definition: oclengine.hpp:106
EventVecPtr ResetWaitEvents()
Definition: oclengine.hpp:155
const cl::Context context
Definition: oclengine.hpp:91
size_t GetPreferredConcurrency()
Definition: oclengine.hpp:188
size_t preferredSizeMultiple
Definition: oclengine.hpp:113
const bool is_gpu
Definition: oclengine.hpp:94
size_t GetGlobalAllocLimit()
Definition: oclengine.hpp:221
size_t GetProcElementCount()
Definition: oclengine.hpp:215
EventVecPtr wait_events
Definition: oclengine.hpp:98
const size_t maxWorkItems
Definition: oclengine.hpp:107
const cl::Platform platform
Definition: oclengine.hpp:89
const size_t maxAlloc
Definition: oclengine.hpp:109
"Qrack::OCLEngine" manages the single OpenCL context.
Definition: oclengine.hpp:246
size_t AddToActiveAllocSize(const int64_t &dev, size_t size)
Definition: oclengine.hpp:307
static const std::string binary_file_ext
Definition: oclengine.hpp:361
std::vector< int64_t > maxActiveAllocSizes
Definition: oclengine.hpp:364
int GetDeviceCount()
Get the count of devices in the current list.
Definition: oclengine.hpp:294
std::vector< DeviceContextPtr > all_device_contexts
Definition: oclengine.hpp:366
OCLEngine(OCLEngine const &)=delete
std::vector< size_t > activeAllocSizes
Definition: oclengine.hpp:363
void ResetActiveAllocSize(const int64_t &dev)
Definition: oclengine.hpp:344
void operator=(OCLEngine const &)=delete
static const std::vector< OCLKernelHandle > kernelHandles
Definition: oclengine.hpp:359
std::vector< DeviceContextPtr > GetDeviceContextPtrVector()
Get the list of all available devices (and their supporting objects).
Definition: oclengine.cpp:151
size_t SubtractFromActiveAllocSize(const int64_t &dev, size_t size)
Definition: oclengine.hpp:324
OCLEngine()
Definition: oclengine.cpp:443
static const std::string binary_file_prefix
Definition: oclengine.hpp:360
std::mutex allocMutex
Definition: oclengine.hpp:365
static OCLEngine & Instance()
Get a pointer to the Instance of the singleton. (The instance will be instantiated,...
Definition: oclengine.hpp:250
static void SaveBinary(cl::Program program, std::string path, std::string fileName)
Save the program binary:
Definition: oclengine.cpp:241
static InitOClResult InitOCL(bool buildFromSource=false, bool saveBinaries=false, std::string home="*", std::vector< int64_t > maxAllocVec={ -1 })
Initialize the OCL environment, with the option to save the generated binaries.
Definition: oclengine.cpp:279
void SetDefaultDeviceContext(DeviceContextPtr dcp)
Pick a default device, for QEngineOCL instances that don't specify a preferred device.
Definition: oclengine.cpp:160
DeviceContextPtr default_device_context
Definition: oclengine.hpp:367
size_t GetActiveAllocSize(const int64_t &dev)
Definition: oclengine.hpp:300
static cl::Program MakeProgram(bool buildFromSource, std::string path, std::shared_ptr< OCLDeviceContext > devCntxt)
Make the program, from either source or binary.
Definition: oclengine.cpp:162
static std::string GetDefaultBinaryPath()
Get default location for precompiled binaries:
Definition: oclengine.hpp:256
size_t GetDefaultDeviceID()
Get default device ID.
Definition: oclengine.hpp:296
DeviceContextPtr GetDeviceContextPtr(const int64_t &dev=-1)
Get a pointer one of the available OpenCL contexts, by its index in the list of all contexts.
Definition: oclengine.cpp:54
void SetDeviceContextPtrVector(std::vector< DeviceContextPtr > vec, DeviceContextPtr dcp=nullptr)
Set the list of DeviceContextPtr object available for use.
Definition: oclengine.cpp:152
GLOSSARY: bitLenInt - "bit-length integer" - unsigned integer ID of qubit position in register bitCap...
Definition: complex16x2simd.hpp:25
std::shared_ptr< OCLDeviceContext > DeviceContextPtr
Definition: oclengine.hpp:47
std::shared_ptr< EventVec > EventVecPtr
Definition: oclengine.hpp:51
void U(quid sid, bitLenInt q, real1_f theta, real1_f phi, real1_f lambda)
(External API) 3-parameter unitary gate
Definition: wasm_api.cpp:1143
OCLAPI
Definition: oclapi.hpp:19
@ OCL_API_APPLY2X2_NORM_SINGLE
Definition: oclapi.hpp:23
std::vector< cl::Event > EventVec
Definition: oclengine.hpp:50
Definition: oclengine.hpp:226
std::vector< DeviceContextPtr > all_dev_contexts
Definition: oclengine.hpp:227
InitOClResult()
Definition: oclengine.hpp:230
InitOClResult(std::vector< DeviceContextPtr > adc, DeviceContextPtr ddc)
Definition: oclengine.hpp:237
DeviceContextPtr default_dev_context
Definition: oclengine.hpp:228
Definition: oclengine.hpp:53
std::string kernelname
Definition: oclengine.hpp:55
OCLAPI oclapi
Definition: oclengine.hpp:54
OCLKernelHandle(OCLAPI o, std::string kn)
Definition: oclengine.hpp:57