void pocl_basic_init (cl_device_id device, const char* parameters) { struct data *d; static int first_basic_init = 1; static int device_number = 0; if (first_basic_init) { pocl_init_dlhandle_cache(); first_basic_init = 0; } device->global_mem_id = 0; d = (struct data *) calloc (1, sizeof (struct data)); d->current_kernel = NULL; d->current_dlhandle = 0; device->data = d; /* hwloc probes OpenCL device info at its initialization in case the OpenCL extension is enabled. This causes to printout an unimplemented property error because hwloc is used to initialize global_mem_size which it is not yet. Just put a nonzero there for now. */ device->global_mem_size = 1; pocl_topology_detect_device_info(device); POCL_INIT_LOCK (d->cq_lock); pocl_cpuinfo_detect_device_info(device); pocl_set_buffer_image_limits(device); /* in case hwloc doesn't provide a PCI ID, let's generate a vendor id that hopefully is unique across vendors. */ const char *magic = "pocl"; if (device->vendor_id == 0) device->vendor_id = magic[0] | magic[1] << 8 | magic[2] << 16 | magic[3] << 24; device->vendor_id += device_number; device_number++; /* The basic driver represents only one "compute unit" as it doesn't exploit multiple hardware threads. Multiple basic devices can be still used for task level parallelism using multiple OpenCL devices. */ device->max_compute_units = 1; if(device->llvm_cpu && (!strcmp(device->llvm_cpu, "(unknown)"))) device->llvm_cpu = NULL; // work-around LLVM bug where sizeof(long)=4 #ifdef _CL_DISABLE_LONG device->has_64bit_long=0; #endif }
void pocl_basic_init (cl_device_id device, const char* parameters) { struct data *d; d = (struct data *) malloc (sizeof (struct data)); d->current_kernel = NULL; d->current_dlhandle = 0; device->data = d; pocl_cpuinfo_detect_device_info(device); pocl_topology_detect_device_info(device); /* The basic driver represents only one "compute unit" as it doesn't exploit multiple hardware threads. Multiple basic devices can be still used for task level parallelism using multiple OpenCL devices. */ device->max_compute_units = 1; }
void pocl_hsa_init (cl_device_id device, const char* parameters) { struct data *d; static int global_mem_id; static int first_hsa_init = 1; hsa_device_type_t dev_type; hsa_status_t status; if (first_hsa_init) { first_hsa_init = 0; global_mem_id = device->dev_id; } device->global_mem_id = global_mem_id; d = (struct data *) calloc (1, sizeof (struct data)); d->current_kernel = NULL; device->data = d; assert (found_hsa_agents > 0); /* TODO: support controlling multiple agents. Now all pocl devices control the same one. */ d->agent = &hsa_agents[0]; if (hsa_queue_create(*d->agent, 1, HSA_QUEUE_TYPE_MULTI, NULL, NULL, &d->queue) != HSA_STATUS_SUCCESS) { POCL_ABORT("pocl-hsa: could not create the queue."); } /* TODO: replace with HSA calls: */ #if 0 pocl_topology_detect_device_info(device); pocl_cpuinfo_detect_device_info(device); #endif /* TODO: detect with HSA calls: */ device->max_compute_units = 1; }