Skip to content

Commit 696e820

Browse files
Refactor producer and consumer kernels to support tile and subtile sizes; remove unused API type
1 parent 681ef20 commit 696e820

1 file changed

Lines changed: 56 additions & 45 deletions

File tree

extensions/cl_mobileye_reservation_sets.asciidoc

Lines changed: 56 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
466465
Kernel 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

486491
Host 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

Comments
 (0)