18 #error OpenCL has not been enabled
21 #if defined(_WIN32) && !defined(__CYGWIN__)
35 #elif defined(OPENCL_V3)
36 #include <CL/opencl.hpp>
37 #elif defined(__APPLE__)
38 #define CL_SILENCE_DEPRECATION
39 #include <CL/opencl.hpp>
50 class OCLDeviceContext;
69 std::lock_guard<std::mutex>
guard;
106 std::map<OCLAPI, std::unique_ptr<std::mutex>>
mutexes;
121 bool isGpu,
bool isCpu,
bool useHostMem)
131 #if ENABLE_OCL_MEM_GUARDS
142 if (getenv(
"DISABLE_OOO_OCL")) {
143 queue = cl::CommandQueue(c, d, 0, &error);
144 if (error != CL_SUCCESS) {
145 throw std::runtime_error(
"Failed to create OpenCL command queue!");
148 queue = cl::CommandQueue(c, d, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &error);
149 if (error != CL_SUCCESS) {
150 queue = cl::CommandQueue(c, d, 0, &error);
151 if (error != CL_SUCCESS) {
152 throw std::runtime_error(
"Failed to create OpenCL command queue!");
157 queue = cl::CommandQueue(c, d, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &error);
158 if (error != CL_SUCCESS) {
159 queue = cl::CommandQueue(c, d, 0, &error);
160 if (error != CL_SUCCESS) {
161 throw std::runtime_error(
"Failed to create OpenCL command queue!");
166 queue = cl::CommandQueue(c, d, 0, &error);
167 if (error != CL_SUCCESS) {
168 throw std::runtime_error(
"Failed to create OpenCL command queue!");
214 int hybridOffset = 3U;
216 if (getenv(
"QRACK_GPU_OFFSET_QB")) {
217 hybridOffset = std::stoi(std::string(getenv(
"QRACK_GPU_OFFSET_QB")));
279 if (getenv(
"QRACK_OCL_PATH")) {
280 std::string toRet = std::string(getenv(
"QRACK_OCL_PATH"));
281 if ((toRet.back() !=
'/') && (toRet.back() !=
'\\')) {
282 #if defined(_WIN32) && !defined(__CYGWIN__)
293 #if defined(_WIN32) && !defined(__CYGWIN__)
294 return std::string(getenv(
"HOMEDRIVE") ? getenv(
"HOMEDRIVE") :
"") +
295 std::string(getenv(
"HOMEPATH") ? getenv(
"HOMEPATH") :
"") +
"\\.qrack\\";
297 return std::string(getenv(
"HOME") ? getenv(
"HOME") :
"") +
"/.qrack/";
303 static InitOClResult InitOCL(
bool buildFromSource =
false,
bool saveBinaries =
false, std::string home =
"*",
304 std::vector<int64_t> maxAllocVec = { -1 });
325 throw std::invalid_argument(
"OCLEngine::GetActiveAllocSize device ID is too high!");
333 throw std::invalid_argument(
"OCLEngine::GetActiveAllocSize device ID is too high!");
350 throw std::invalid_argument(
"OCLEngine::GetActiveAllocSize device ID is too high!");
371 throw std::invalid_argument(
"OCLEngine::GetActiveAllocSize device ID is too high!");
396 static cl::Program
MakeProgram(
bool buildFromSource, std::string path, std::shared_ptr<OCLDeviceContext> devCntxt);
398 static void SaveBinary(cl::Program program, std::string path, std::string fileName);
Definition: oclengine.hpp:67
std::lock_guard< std::mutex > guard
Definition: oclengine.hpp:69
OCLDeviceCall & operator=(const OCLDeviceCall &)=delete
cl::Kernel & call
Definition: oclengine.hpp:74
OCLDeviceCall(std::mutex &m, cl::Kernel &c)
Definition: oclengine.hpp:78
OCLDeviceCall(const OCLDeviceCall &)
Definition: oclengine.hpp:90
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:120
const cl::Device device
Definition: oclengine.hpp:93
const size_t globalSize
Definition: oclengine.hpp:113
size_t globalLimit
Definition: oclengine.hpp:115
size_t GetPreferredSizeMultiple()
Definition: oclengine.hpp:199
const size_t localSize
Definition: oclengine.hpp:114
std::mutex waitEventsMutex
Definition: oclengine.hpp:104
const bool use_host_mem
Definition: oclengine.hpp:99
const int64_t context_id
Definition: oclengine.hpp:95
std::map< OCLAPI, cl::Kernel > calls
Definition: oclengine.hpp:105
void EmplaceEvent(Fn fn)
Definition: oclengine.hpp:183
size_t GetGlobalSize()
Definition: oclengine.hpp:239
size_t GetMaxAlloc()
Definition: oclengine.hpp:238
std::map< OCLAPI, std::unique_ptr< std::mutex > > mutexes
Definition: oclengine.hpp:106
const bool is_cpu
Definition: oclengine.hpp:98
OCLDeviceCall Reserve(OCLAPI call)
Definition: oclengine.hpp:173
size_t GetMaxWorkGroupSize()
Definition: oclengine.hpp:237
void WaitOnAllEvents()
Definition: oclengine.hpp:190
size_t GetLocalSize()
Definition: oclengine.hpp:240
const int64_t device_id
Definition: oclengine.hpp:96
const size_t maxWorkGroupSize
Definition: oclengine.hpp:111
cl::CommandQueue queue
Definition: oclengine.hpp:100
size_t preferredConcurrency
Definition: oclengine.hpp:117
size_t GetMaxWorkItems()
Definition: oclengine.hpp:236
const size_t procElemCount
Definition: oclengine.hpp:109
EventVecPtr ResetWaitEvents()
Definition: oclengine.hpp:175
const cl::Context context
Definition: oclengine.hpp:94
size_t GetPreferredConcurrency()
Definition: oclengine.hpp:208
size_t preferredSizeMultiple
Definition: oclengine.hpp:116
const bool is_gpu
Definition: oclengine.hpp:97
size_t GetGlobalAllocLimit()
Definition: oclengine.hpp:241
size_t GetProcElementCount()
Definition: oclengine.hpp:235
EventVecPtr wait_events
Definition: oclengine.hpp:101
const size_t maxWorkItems
Definition: oclengine.hpp:110
const cl::Platform platform
Definition: oclengine.hpp:92
const size_t maxAlloc
Definition: oclengine.hpp:112
"Qrack::OCLEngine" manages the single OpenCL context.
Definition: oclengine.hpp:266
size_t AddToActiveAllocSize(const int64_t &dev, size_t size)
Definition: oclengine.hpp:330
static const std::string binary_file_ext
Definition: oclengine.hpp:385
std::vector< int64_t > maxActiveAllocSizes
Definition: oclengine.hpp:388
int GetDeviceCount()
Get the count of devices in the current list.
Definition: oclengine.hpp:316
std::vector< DeviceContextPtr > all_device_contexts
Definition: oclengine.hpp:390
OCLEngine(OCLEngine const &)=delete
std::vector< size_t > activeAllocSizes
Definition: oclengine.hpp:387
void ResetActiveAllocSize(const int64_t &dev)
Definition: oclengine.hpp:368
void operator=(OCLEngine const &)=delete
static const std::vector< OCLKernelHandle > kernelHandles
Definition: oclengine.hpp:383
std::vector< DeviceContextPtr > GetDeviceContextPtrVector()
Get the list of all available devices (and their supporting objects).
Definition: oclengine.cpp:153
size_t SubtractFromActiveAllocSize(const int64_t &dev, size_t size)
Definition: oclengine.hpp:347
OCLEngine()
Definition: oclengine.cpp:447
static const std::string binary_file_prefix
Definition: oclengine.hpp:384
std::mutex allocMutex
Definition: oclengine.hpp:389
static OCLEngine & Instance()
Get a pointer to the Instance of the singleton. (The instance will be instantiated,...
Definition: oclengine.hpp:270
static void SaveBinary(cl::Program program, std::string path, std::string fileName)
Save the program binary:
Definition: oclengine.cpp:243
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:281
void SetDefaultDeviceContext(DeviceContextPtr dcp)
Pick a default device, for QEngineOCL instances that don't specify a preferred device.
Definition: oclengine.cpp:162
DeviceContextPtr default_device_context
Definition: oclengine.hpp:391
size_t GetActiveAllocSize(const int64_t &dev)
Definition: oclengine.hpp:322
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:164
static std::string GetDefaultBinaryPath()
Get default location for precompiled binaries:
Definition: oclengine.hpp:276
size_t GetDefaultDeviceID()
Get default device ID.
Definition: oclengine.hpp:318
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:154
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:50
std::shared_ptr< EventVec > EventVecPtr
Definition: oclengine.hpp:54
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:1199
OCLAPI
Definition: oclapi.hpp:19
@ OCL_API_APPLY2X2_NORM_SINGLE
Definition: oclapi.hpp:23
std::vector< cl::Event > EventVec
Definition: oclengine.hpp:53
Definition: oclengine.hpp:246
std::vector< DeviceContextPtr > all_dev_contexts
Definition: oclengine.hpp:247
InitOClResult()
Definition: oclengine.hpp:250
InitOClResult(std::vector< DeviceContextPtr > adc, DeviceContextPtr ddc)
Definition: oclengine.hpp:257
DeviceContextPtr default_dev_context
Definition: oclengine.hpp:248
Definition: oclengine.hpp:56
std::string kernelname
Definition: oclengine.hpp:58
OCLAPI oclapi
Definition: oclengine.hpp:57
OCLKernelHandle(OCLAPI o, std::string kn)
Definition: oclengine.hpp:60