MCPcopy Create free account
hub / github.com/a2flo/floor / create_queue

Method create_queue

src/device/opencl/opencl_context.cpp:739–797  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

737}
738
739std::shared_ptr<device_queue> opencl_context::create_queue(const device& dev) const {
740 // has a default queue already been created for this device?
741 bool has_default_queue = false;
742 std::shared_ptr<device_queue> dev_default_queue;
743 for (auto&& default_queue : default_queues) {
744 if(default_queue.first == &dev) {
745 has_default_queue = true;
746 dev_default_queue = default_queue.second;
747 break;
748 }
749 }
750
751 // has the user already created a queue for this device (i.e. accessed the default queue)?
752 bool user_accessed = false;
753 if(has_default_queue) {
754 const auto iter = default_queues_user_accessed.find(&dev);
755 if(iter != std::end(default_queues_user_accessed)) {
756 user_accessed = iter->second;
757 }
758
759 // default queue exists and the user is creating a queue for this device for the first time
760 // -> return the default queue
761 if(!user_accessed) {
762 // signal that the user has accessed the default queue, any subsequent create_queue calls will actually create a new queue
763 default_queues_user_accessed.emplace(&dev, 1u);
764 floor_return_no_nrvo(dev_default_queue);
765 }
766 }
767
768 // create the queue
769 cl_int create_err = CL_SUCCESS;
770#if /*defined(CL_VERSION_2_0) ||*/ 0 // TODO: should only be enabled if platform (and device?) support OpenCL 2.0+
771 const cl_queue_properties properties[] { 0 };
772 cl_command_queue cl_queue = clCreateCommandQueueWithProperties(ctx, ((const opencl_device&)dev).device_id,
773 properties, &create_err);
774#else
775
776FLOOR_PUSH_WARNINGS() // silence "clCreateCommandQueue" is deprecated warning
777FLOOR_IGNORE_WARNING(deprecated-declarations)
778
779 cl_command_queue cl_queue = clCreateCommandQueue(ctx, ((const opencl_device&)dev).device_id, 0, &create_err);
780
781FLOOR_POP_WARNINGS()
782#endif
783 if(create_err != CL_SUCCESS) {
784 log_error("failed to create command queue: $: $", create_err, cl_error_to_string(create_err));
785 return {};
786 }
787
788 auto ret = std::make_shared<opencl_queue>(dev, cl_queue);
789 queues.push_back(ret);
790
791 // set the default queue if it hasn't been set yet
792 if(!has_default_queue) {
793 default_queues.emplace(&dev, ret);
794 }
795
796 return ret;

Callers

nothing calls this directly

Calls 3

cl_error_to_stringFunction · 0.85
findMethod · 0.80
emplaceMethod · 0.80

Tested by

no test coverage detected