MCPcopy Create free account
hub / github.com/arrayfire/arrayfire / addDeviceContext

Function addDeviceContext

src/backend/opencl/platform.cpp:530–585  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

528}
529
530void addDeviceContext(cl_device_id dev, cl_context ctx, cl_command_queue que) {
531 DeviceManager& devMngr = DeviceManager::getInstance();
532
533 int nDevices = 0;
534 {
535 common::lock_guard_t lock(devMngr.deviceMutex);
536
537 cl::Device tDevice(dev, true);
538 cl::Context tContext(ctx, true);
539 auto tQueue =
540 (que == NULL ? make_unique<cl::CommandQueue>(tContext, tDevice)
541 : make_unique<cl::CommandQueue>(que, true));
542 // FIXME: add OpenGL Interop for user provided contexts later
543 devMngr.mIsGLSharingOn.push_back(false);
544 devMngr.mDeviceTypes.push_back(
545 static_cast<int>(tDevice.getInfo<CL_DEVICE_TYPE>()));
546
547 // For OpenCL-HPP >= v2023.12.14 type is cl::Platform instead of
548 // cl_platform_id
549 cl::Platform device_platform;
550 device_platform = tDevice.getInfo<CL_DEVICE_PLATFORM>();
551 devMngr.mPlatforms.push_back(
552 std::make_pair<std::unique_ptr<cl::Platform>, afcl_platform>(
553 make_unique<cl::Platform>(device_platform(), true),
554 getPlatformEnum(tDevice)));
555
556 devMngr.mDevices.emplace_back(make_unique<cl::Device>(move(tDevice)));
557 devMngr.mContexts.emplace_back(
558 make_unique<cl::Context>(move(tContext)));
559 devMngr.mQueues.push_back(move(tQueue));
560 nDevices = static_cast<int>(devMngr.mDevices.size()) - 1;
561
562 auto versions = getOpenCLCDeviceVersion(*(devMngr.mDevices.back()));
563#ifdef AF_WITH_FAST_MATH
564 std::string options =
565 fmt::format(" -cl-std=CL{:Mm} -D dim_t={} -cl-fast-relaxed-math",
566 versions.back(), dtype_traits<dim_t>::getName());
567#else
568 std::string options =
569 fmt::format(" -cl-std=CL{:Mm} -D dim_t={}", versions.back(),
570 dtype_traits<dim_t>::getName());
571#endif
572 devMngr.mBaseBuildFlags.push_back(options);
573
574 // cache the boost program_cache object, clean up done on program exit
575 // not during removeDeviceContext
576 namespace compute = boost::compute;
577 using BPCache = DeviceManager::BoostProgCache;
578 compute::context c(ctx);
579 BPCache currCache = compute::program_cache::get_global_cache(c);
580 devMngr.mBoostProgCacheVector.emplace_back(new BPCache(currCache));
581 }
582
583 // Last/newly added device needs memory management
584 memoryManager().addMemoryManagement(nDevices);
585}
586
587void setDeviceContext(cl_device_id dev, cl_context ctx) {

Callers 1

afcl_add_device_contextFunction · 0.70

Calls 4

getOpenCLCDeviceVersionFunction · 0.85
getNameFunction · 0.85
getPlatformEnumFunction · 0.70
addMemoryManagementMethod · 0.45

Tested by

no test coverage detected