cl_int pocl_basic_alloc_mem_obj (cl_device_id device, cl_mem mem_obj, void* host_ptr) { void *b = NULL; cl_mem_flags flags = mem_obj->flags; unsigned i; POCL_MSG_PRINT_INFO("BASIC: alloc_mem_obj, mem %p, dev %d\n", mem_obj, device->dev_id); /* check if some driver has already allocated memory for this mem_obj in our global address space, and use that*/ for (i = 0; i < mem_obj->context->num_devices; ++i) { if (!mem_obj->device_ptrs[i].available) continue; if (mem_obj->device_ptrs[i].global_mem_id == device->global_mem_id && mem_obj->device_ptrs[i].mem_ptr != NULL) { mem_obj->device_ptrs[device->dev_id].mem_ptr = mem_obj->device_ptrs[i].mem_ptr; POCL_MSG_PRINT_INFO("BASIC: alloc_mem_obj %p dev %d, using already allocated mem\n", mem_obj, device->dev_id); return CL_SUCCESS; } } /* memory for this global memory is not yet allocated -> do it */ if (flags & CL_MEM_USE_HOST_PTR) { // mem_host_ptr must be non-NULL assert(host_ptr != NULL); b = host_ptr; } else { b = pocl_memalign_alloc_global_mem (device, MAX_EXTENDED_ALIGNMENT, mem_obj->size); if (b==NULL) return CL_MEM_OBJECT_ALLOCATION_FAILURE; mem_obj->shared_mem_allocation_owner = device; } /* use this dev mem allocation as host ptr */ if (flags & CL_MEM_ALLOC_HOST_PTR && (mem_obj->mem_host_ptr == NULL)) mem_obj->mem_host_ptr = b; if (flags & CL_MEM_COPY_HOST_PTR) { // mem_host_ptr must be non-NULL assert(host_ptr != NULL); memcpy (b, host_ptr, mem_obj->size); } mem_obj->device_ptrs[device->dev_id].mem_ptr = b; return CL_SUCCESS; }
cl_int pocl_basic_alloc_mem_obj (cl_device_id device, cl_mem mem_obj) { void *b = NULL; cl_mem_flags flags = mem_obj->flags; /* if memory for this global memory is not yet allocated -> do it */ if (mem_obj->device_ptrs[device->global_mem_id].mem_ptr == NULL) { if (flags & CL_MEM_USE_HOST_PTR) { // mem_host_ptr must be non-NULL assert(mem_obj->mem_host_ptr != NULL); b = mem_obj->mem_host_ptr; } else { b = pocl_memalign_alloc_global_mem(device, MAX_EXTENDED_ALIGNMENT, mem_obj->size); if (b == NULL) return CL_MEM_OBJECT_ALLOCATION_FAILURE; } if (flags & CL_MEM_COPY_HOST_PTR) { // mem_host_ptr must be non-NULL assert(mem_obj->mem_host_ptr != NULL); memcpy (b, mem_obj->mem_host_ptr, mem_obj->size); } mem_obj->device_ptrs[device->global_mem_id].mem_ptr = b; mem_obj->device_ptrs[device->global_mem_id].global_mem_id = device->global_mem_id; } /* copy already allocated global mem info to devices own slot */ mem_obj->device_ptrs[device->dev_id] = mem_obj->device_ptrs[device->global_mem_id]; return CL_SUCCESS; }