| 40 | |
| 41 | |
| 42 | result submit_ocl_kernel(cl::Kernel& kernel, |
| 43 | cl::CommandQueue& queue, |
| 44 | const rt::range<3> &group_size, |
| 45 | const rt::range<3> &num_groups, void **kernel_args, |
| 46 | const std::size_t *arg_sizes, std::size_t num_args, |
| 47 | ocl_usm* usm, |
| 48 | const hcf_kernel_info *info, |
| 49 | cl::Event* evt_out = nullptr) { |
| 50 | |
| 51 | cl_int err = 0; |
| 52 | for(std::size_t i = 0; i < num_args; ++i ){ |
| 53 | HIPSYCL_DEBUG_INFO << "ocl_queue: Setting kernel argument " << i |
| 54 | << " of size " << arg_sizes[i] << " at " << kernel_args[i] |
| 55 | << std::endl; |
| 56 | |
| 57 | err = kernel.setArg(i, static_cast<std::size_t>(arg_sizes[i]), kernel_args[i]); |
| 58 | |
| 59 | if(err != CL_SUCCESS) { |
| 60 | return make_error( |
| 61 | __acpp_here(), |
| 62 | error_info{"ocl_queue: Could not set kernel argument", |
| 63 | error_code{"CL", static_cast<int>(err)}}); |
| 64 | } |
| 65 | } |
| 66 | |
| 67 | // This is necessary for USM pointers, which hipSYCL *always* |
| 68 | // relies on. |
| 69 | err = usm->enable_indirect_usm_access(kernel); |
| 70 | |
| 71 | if(err != CL_SUCCESS) { |
| 72 | return make_error( |
| 73 | __acpp_here(), |
| 74 | error_info{"ocl_queue: Could not set indirect access flags", |
| 75 | error_code{"CL", static_cast<int>(err)}}); |
| 76 | } |
| 77 | |
| 78 | HIPSYCL_DEBUG_INFO << "ocl_queue: Submitting kernel!" << std::endl; |
| 79 | rt::range<3> global_size = num_groups * group_size; |
| 80 | |
| 81 | cl::NDRange cl_global_size{global_size[0], global_size[1], global_size[2]}; |
| 82 | cl::NDRange cl_local_size{group_size[0], group_size[1], group_size[2]}; |
| 83 | cl::NDRange offset{0, 0, 0}; |
| 84 | if (global_size[2] == 1) { |
| 85 | cl_global_size = cl::NDRange{global_size[0], global_size[1]}; |
| 86 | cl_local_size = cl::NDRange{group_size[0], group_size[1]}; |
| 87 | offset = cl::NDRange{0, 0}; |
| 88 | if (global_size[1] == 1) { |
| 89 | cl_global_size = cl::NDRange{global_size[0]}; |
| 90 | cl_local_size = cl::NDRange{group_size[0]}; |
| 91 | offset = cl::NDRange{0}; |
| 92 | } |
| 93 | } |
| 94 | |
| 95 | err = queue.enqueueNDRangeKernel(kernel, offset, cl_global_size, |
| 96 | cl_local_size, nullptr, evt_out); |
| 97 | |
| 98 | if(err != CL_SUCCESS) { |
| 99 | return make_error( |
no test coverage detected