static gboolean ufo_refeed_task_process (UfoTask *task, UfoBuffer **inputs, UfoBuffer *output, UfoRequisition *requisition) { UfoRefeedTaskPrivate *priv; priv = UFO_REFEED_TASK_GET_PRIVATE (task); priv->buffers = g_list_append (priv->buffers, ufo_buffer_dup (inputs[0])); ufo_buffer_copy (inputs[0], output); return TRUE; }
static gboolean ufo_refeed_task_generate (UfoTask *task, UfoBuffer *output, UfoRequisition *requisition) { UfoRefeedTaskPrivate *priv; priv = UFO_REFEED_TASK_GET_PRIVATE (task); if (priv->current == NULL) return FALSE; ufo_buffer_copy (UFO_BUFFER (priv->current->data), output); priv->current = g_list_next (priv->current); return TRUE; }
static gboolean ufo_ir_sart_process_real (UfoMethod *method, UfoBuffer *input, UfoBuffer *output) { UfoIrSARTPrivate *priv = UFO_IR_SART_GET_PRIVATE (method); UfoResources *resources = NULL; UfoProjector *projector = NULL; gpointer *cmd_queue = NULL; gfloat relaxation_factor = 0; guint max_iterations = 0; g_object_get (method, "ufo-resources", &resources, "command-queue", &cmd_queue, "projection-model", &projector, "relaxation-factor", &relaxation_factor, "max-iterations", &max_iterations, NULL); UfoGeometry *geometry = NULL; g_object_get (projector, "geometry", &geometry, NULL); // // resize UfoBuffer **method_buffers[4] = { &priv->singular_volume, &priv->singular_sino, &priv->ray_weights, &priv->b_temp }; UfoBuffer *ref_buffers[4] = { output, input, input, input }; for (guint i = 0; i < 4; ++i) { UfoRequisition _req; if (*method_buffers[i]) { ufo_buffer_get_requisition (ref_buffers[i], &_req); ufo_buffer_resize (*method_buffers[i], &_req); } else { *method_buffers[i] = ufo_buffer_dup (ref_buffers [i]); } } ufo_op_set (priv->singular_volume, 1.0f, resources, cmd_queue); ufo_op_set (priv->singular_sino, 1.0f, resources, cmd_queue); ufo_op_set (priv->ray_weights, 0, resources, cmd_queue); guint n_subsets = 0; UfoProjectionsSubset *subset = generate_subsets (geometry, &n_subsets); for (guint i = 0 ; i < n_subsets; ++i) { ufo_projector_FP (projector, priv->singular_volume, priv->ray_weights, &subset[i], 1.0f, NULL); } ufo_op_inv (priv->ray_weights, resources, cmd_queue); guint iteration = 0; while (iteration < max_iterations) { ufo_buffer_copy (input, priv->b_temp); for (guint i = 0 ; i < n_subsets; i++) { ufo_projector_FP (projector, output, priv->b_temp, &subset[i], -1.0f, NULL); ufo_op_mul_rows (priv->b_temp, priv->ray_weights, priv->b_temp, subset[i].offset, subset[i].n, resources, cmd_queue); ufo_projector_BP (projector, output, priv->b_temp, &subset[i], relaxation_factor, NULL); } iteration++; } return TRUE; }
static void test_create_lots_of_buffers (Fixture *fixture, gconstpointer unused) { gint num_buffers = 10000; UfoConfig *config = ufo_config_new (); UfoResources *resources = ufo_resources_new (config, NULL); gpointer context = ufo_resources_get_context (resources); UfoRequisition requisition = { .n_dims = 2, .dims[0] = 800, .dims[1] = 800 }; while (num_buffers-- > 0) { UfoBuffer *buffer = ufo_buffer_new (&requisition, NULL, context); gpointer device_array = ufo_buffer_get_device_array (buffer, NULL); ufo_buffer_discard_location (buffer); g_assert (device_array != NULL); g_object_unref (buffer); } } static void test_copy_lots_of_buffers (Fixture *fixture, gconstpointer *unused) { gint num_buffers = 10000; UfoConfig *config = ufo_config_new (); UfoResources *resources = ufo_resources_new (config, NULL); gpointer context = ufo_resources_get_context (resources); UfoRequisition requisition = { .n_dims = 2, .dims[0] = 800, .dims[1] = 800 }; // TODO enforce copy between GPUs UfoBuffer *src = ufo_buffer_new (&requisition, NULL, context); UfoBuffer *dest = ufo_buffer_new (&requisition, NULL, context); while (num_buffers-- > 0) { g_debug("copy"); ufo_buffer_copy (src, dest); } } static void test_convert_8 (Fixture *fixture, gconstpointer unused) { gfloat *host_data; host_data = ufo_buffer_get_host_array (fixture->buffer, NULL); g_memmove (host_data, fixture->data8, fixture->n_data); ufo_buffer_convert (fixture->buffer, UFO_BUFFER_DEPTH_8U); host_data = ufo_buffer_get_host_array (fixture->buffer, NULL); for (guint i = 0; i < fixture->n_data; i++) g_assert (host_data[i] == ((gfloat) fixture->data8[i])); }