void oskar_imager_free(oskar_Imager* h, int* status) { int i; if (!h) return; oskar_imager_reset_cache(h, status); oskar_mem_free(h->uu_im, status); oskar_mem_free(h->vv_im, status); oskar_mem_free(h->ww_im, status); oskar_mem_free(h->uu_tmp, status); oskar_mem_free(h->vv_tmp, status); oskar_mem_free(h->ww_tmp, status); oskar_mem_free(h->vis_im, status); oskar_mem_free(h->weight_im, status); oskar_mem_free(h->weight_tmp, status); oskar_mem_free(h->time_im, status); oskar_timer_free(h->tmr_grid_finalise); oskar_timer_free(h->tmr_grid_update); oskar_timer_free(h->tmr_init); oskar_timer_free(h->tmr_read); oskar_timer_free(h->tmr_write); oskar_mutex_free(h->mutex); oskar_imager_free_device_data(h, status); for (i = 0; i < h->num_files; ++i) free(h->input_files[i]); free(h->input_files); free(h->input_root); free(h->output_root); free(h->ms_column); free(h->gpu_ids); free(h->d); free(h); }
void oskar_imager_set_num_devices(oskar_Imager* h, int value) { int status = 0; oskar_imager_free_device_data(h, &status); if (value < 1) value = (h->num_gpus == 0) ? oskar_get_num_procs() : h->num_gpus; if (value < 1) value = 1; h->num_devices = value; h->d = (DeviceData*) realloc(h->d, h->num_devices * sizeof(DeviceData)); memset(h->d, 0, h->num_devices * sizeof(DeviceData)); }
void oskar_imager_set_gpus(oskar_Imager* h, int num, const int* ids, int* status) { int i, num_gpus_avail; if (*status) return; oskar_imager_free_device_data(h, status); num_gpus_avail = oskar_device_count(status); if (*status) return; if (num < 0) { h->num_gpus = num_gpus_avail; h->gpu_ids = (int*) realloc(h->gpu_ids, h->num_gpus * sizeof(int)); for (i = 0; i < h->num_gpus; ++i) h->gpu_ids[i] = i; } else if (num > 0) { if (num > num_gpus_avail) { *status = OSKAR_ERR_COMPUTE_DEVICES; return; } h->num_gpus = num; h->gpu_ids = (int*) realloc(h->gpu_ids, h->num_gpus * sizeof(int)); for (i = 0; i < h->num_gpus; ++i) h->gpu_ids[i] = ids[i]; } else /* num == 0 */ { free(h->gpu_ids); h->gpu_ids = 0; h->num_gpus = 0; } for (i = 0; i < h->num_gpus; ++i) { oskar_device_set(h->gpu_ids[i], status); if (*status) return; } }