1 /* 2 * Copyright 2018 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can 5 * be found in the LICENSE file. 6 * 7 */ 8 9 // 10 // 11 // 12 13 #include "runtime_cl_12.h" 14 #include "config_cl.h" 15 #include "common/cl/assert_cl.h" 16 17 // 18 // PERM 19 // 20 21 cl_mem 22 skc_runtime_device_perm_alloc(struct skc_runtime * const runtime, 23 cl_mem_flags const flags, 24 size_t const size) 25 { 26 cl_int cl_err; 27 28 cl_mem mem = clCreateBuffer(runtime->cl.context, 29 flags, 30 size, 31 NULL, 32 &cl_err); cl_ok(cl_err); 33 return mem; 34 } 35 36 void 37 skc_runtime_device_perm_free(struct skc_runtime * const runtime, 38 cl_mem const mem) 39 { 40 cl(ReleaseMemObject(mem)); 41 } 42 43 // 44 // TEMP 45 // 46 47 cl_mem 48 skc_runtime_device_temp_alloc(struct skc_runtime * const runtime, 49 cl_mem_flags const flags, 50 size_t const size, 51 skc_subbuf_id_t * const subbuf_id, 52 size_t * const subbuf_size) 53 { 54 if (size == 0) 55 { 56 *subbuf_id = (skc_subbuf_id_t)-1; 57 58 if (subbuf_size != NULL) 59 *subbuf_size = 0; 60 61 return NULL; 62 } 63 64 cl_buffer_region br; 65 66 br.origin = skc_suballocator_subbuf_alloc(&runtime->allocator.device.temp.suballocator, 67 runtime->scheduler, 68 size,subbuf_id,&br.size); 69 70 if (subbuf_size != NULL) 71 *subbuf_size = br.size; 72 73 cl_int cl_err; 74 75 cl_mem mem = clCreateSubBuffer(runtime->allocator.device.temp.extent, 76 flags, 77 CL_BUFFER_CREATE_TYPE_REGION, 78 &br, 79 &cl_err); cl_ok(cl_err); 80 81 return mem; 82 } 83 84 85 void 86 skc_runtime_device_temp_free(struct skc_runtime * const runtime, 87 cl_mem const mem, 88 skc_subbuf_id_t const subbuf_id) 89 { 90 if (mem == NULL) 91 return; 92 93 skc_suballocator_subbuf_free(&runtime->allocator.device.temp.suballocator,subbuf_id); 94 95 cl(ReleaseMemObject(mem)); 96 } 97 98 // 99 // 100 // 101 102 void 103 skc_allocator_device_create(struct skc_runtime * const runtime) 104 { 105 skc_suballocator_create(runtime, 106 &runtime->allocator.device.temp.suballocator, 107 "DEVICE", 108 runtime->config->suballocator.device.subbufs, 109 runtime->cl.align_bytes, 110 runtime->config->suballocator.device.size); 111 112 #ifndef NDEBUG 113 #pragma message("Get rid of CL_MEM_ALLOC_HOST_PTR as soon as the sorter is installed") 114 cl_mem_flags const flags = CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR; 115 #else 116 cl_mem_flags const flags = CL_MEM_READ_WRITE; 117 #endif 118 119 runtime->allocator.device.temp.extent = 120 skc_runtime_device_perm_alloc(runtime, 121 flags, 122 runtime->config->suballocator.device.size); 123 } 124 125 void 126 skc_allocator_device_dispose(struct skc_runtime * const runtime) 127 { 128 skc_suballocator_dispose(runtime,&runtime->allocator.device.temp.suballocator); 129 130 skc_runtime_device_perm_free(runtime,runtime->allocator.device.temp.extent); 131 } 132 133 // 134 // 135 // 136