@@ -125,7 +125,6 @@ image::../images/reservation_set_pipe.png[align="center", title="Reservation-set
125125== New API Types
126126
127127 * `cl_reservation_set_mobileye`
128- * `cl_reservation_set_pipe_mobileye`
129128
130129== New API Enums
131130
@@ -466,59 +465,71 @@ the write is complete; otherwise, it blocks until there is space in the pipe.
466465Kernel code:
467466[source,opencl_c]
468467----
469- __kernel void producer(rs_pipe_mobileye pipe) {
470- size_t group_linear_id =
471- get_group_id(2) * get_num_groups(1) * get_num_groups(0) +
472- get_group_id(1) * get_num_groups(0) + get_group_id(0);
473-
474- const int write_val = group_linear_id;
475- write_rs_pipe_mobileye(pipe, &group_linear_id);
468+ __kernel void producer(__global int *buf, size_t tile_size, size_t subtile_size,
469+ rs_pipe_mobileye pipe) {
470+ __global int *tile_addr = &buf[get_group_id(0) * tile_size];
471+ for (size_t i = 0; i < tile_size; i += subtile_size) {
472+ __global int *subtile_addr = &tile_addr[i];
473+ do_production(subtile_addr);
474+ unsigned char pipe_data; // dummy data - we only use the pipe is a semaphore
475+ write_rs_pipe_mobileye(pipe, &pipe_data);
476+ }
476477}
477478
478- __kernel void consumer(__global int *res, rs_pipe_mobileye pipe) {
479- size_t group_linear_id =
480- get_group_id(2) * get_num_groups(1) * get_num_groups(0) +
481- get_group_id(1) * get_num_groups(0) + get_group_id(0);
482- read_rs_pipe_mobileye(pipe, &res[group_linear_id]);
479+ __kernel void consumer(__global int *buf, size_t tile_size, size_t subtile_size,
480+ rs_pipe_mobileye pipe) {
481+ __global int *tile_addr = &buf[get_group_id(0) * tile_size];
482+ for (size_t i = 0; i < tile_size; i += subtile_size) {
483+ __global int *subtile_addr = &tile_addr[i];
484+ unsigned char pipe_data;
485+ read_rs_pipe_mobileye(pipe, &pipe_data);
486+ do_consumption(subtile_addr);
487+ }
483488}
484489----
485490
486491Host code:
487492
488493[source,c]
489494----
490- cl_context context;
491- cl_command_queue queue;
492- cl_kernel producer_kernel, consumer_kernel;
493- ...
494- const cl_int width = 4;
495- cl_mem res_buffer = clCreateBuffer(context, CL_MEM_READ_WRITE,
496- width * sizeof(cl_int), nullptr, nullptr);
497- cl_command_buffer_khr cmd_buf =
498- clCreateCommandBufferKHR(1, &queue, nullptr, nullptr);
499- cl_reservation_set_mobileye reservation_set = clCreateReservationSetMOBILEYE(
500- cmd_buf, CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE, 0, nullptr, nullptr);
501- cl_mem pipe = clCreateReservationSetPipeMOBILEYE(reservation_set,
502- sizeof(cl_int), width,
503- nullptr);
504-
505- clSetKernelArg(consumer_kernel, 0, sizeof(cl_mem), &res_buffer);
506- clSetKernelArg(consumer_kernel, 1, sizeof(cl_mem), &pipe);
507-
508- clSetKernelArg(producer_kernel, 0, sizeof(cl_mem), &pipe);
509-
510- const size_t gwz = width, lwz = 1;
511- clCommandNDRangeKernelReservationSetMOBILEYE(reservation_set, queue, nullptr,
512- producer_kernel, 1, nullptr,
513- &gwz, &lwz, nullptr, nullptr);
514- clCommandNDRangeKernelReservationSetMOBILEYE(reservation_set, queue, nullptr,
515- consumer_kernel, 1, nullptr,
516- &gwz, &lwz, nullptr, nullptr);
517- clFinalizeCommandBufferKHR(cmd_buf);
518-
519- cl_event event;
520- clEnqueueCommandBufferKHR(1, &queue, cmd_buf, 0, nullptr, &event);
521- clWaitForEvents(1, &event);
495+ cl_context context;
496+ cl_command_queue queue;
497+ cl_kernel producer_kernel, consumer_kernel;
498+ // ...
499+ size_t num_tiles = 4;
500+ cl_int tile_size = 128, subtile_size = 16;
501+ cl_mem res_buffer =
502+ clCreateBuffer(context, CL_MEM_READ_WRITE,
503+ num_tiles * tile_size * sizeof(cl_int), nullptr, nullptr);
504+ cl_command_buffer_khr cmd_buf =
505+ clCreateCommandBufferKHR(1, &queue, nullptr, nullptr);
506+ cl_reservation_set_mobileye reservation_set = clCreateReservationSetMOBILEYE(
507+ cmd_buf, CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE, 0, nullptr, nullptr);
508+ cl_mem pipe = clCreateReservationSetPipeMOBILEYE(
509+ reservation_set, sizeof(cl_uchar), tile_size / subtile_size, nullptr);
510+
511+ clSetKernelArg(consumer_kernel, 0, sizeof(cl_mem), &res_buffer);
512+ clSetKernelArg(consumer_kernel, 1, sizeof(cl_int), &tile_size);
513+ clSetKernelArg(consumer_kernel, 2, sizeof(cl_int), &subtile_size);
514+ clSetKernelArg(consumer_kernel, 3, sizeof(cl_mem), &pipe);
515+
516+ clSetKernelArg(producer_kernel, 0, sizeof(cl_mem), &res_buffer);
517+ clSetKernelArg(producer_kernel, 1, sizeof(cl_int), &tile_size);
518+ clSetKernelArg(producer_kernel, 2, sizeof(cl_int), &subtile_size);
519+ clSetKernelArg(producer_kernel, 3, sizeof(cl_mem), &pipe);
520+
521+ size_t lwz = 1;
522+ clCommandNDRangeKernelReservationSetMOBILEYE(
523+ reservation_set, queue, nullptr, producer_kernel, 1, nullptr, &num_tiles,
524+ &lwz, nullptr, nullptr);
525+ clCommandNDRangeKernelReservationSetMOBILEYE(
526+ reservation_set, queue, nullptr, consumer_kernel, 1, nullptr, &num_tiles,
527+ &lwz, nullptr, nullptr);
528+ clFinalizeCommandBufferKHR(cmd_buf);
529+
530+ cl_event event;
531+ clEnqueueCommandBufferMOBILEYE(1, &queue, cmd_buf, 0, nullptr, &event);
532+ clWaitForEvents(1, &event);
522533----
523534
524535== Issues
0 commit comments