| 528 | } |
| 529 | |
| 530 | void 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 | |
| 587 | void setDeviceContext(cl_device_id dev, cl_context ctx) { |
no test coverage detected