Example #1
0
void mtapi_action_set_attribute(
  MTAPI_IN mtapi_action_hndl_t action,
  MTAPI_IN mtapi_uint_t attribute_num,
  MTAPI_IN void* attribute,
  MTAPI_IN mtapi_size_t attribute_size,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  embb_mtapi_log_trace("mtapi_action_set_attribute() called\n");

  if (embb_mtapi_node_is_initialized()) {
    embb_mtapi_node_t* node = embb_mtapi_node_get_instance();
    if (embb_mtapi_action_pool_is_handle_valid(node->action_pool, action)) {
      embb_mtapi_action_t* local_action =
        embb_mtapi_action_pool_get_storage_for_handle(
          node->action_pool, action);
      mtapi_actionattr_set(
        &local_action->attributes,
        attribute_num,
        attribute,
        attribute_size,
        &local_status);
    } else {
      local_status = MTAPI_ERR_ACTION_INVALID;
    }
  } else {
    embb_mtapi_log_error("mtapi not initialized\n");
    local_status = MTAPI_ERR_NODE_NOTINIT;
  }

  mtapi_status_set(status, local_status);
}
Example #2
0
void mtapi_group_set_attribute(
  MTAPI_IN mtapi_group_hndl_t group,
  MTAPI_IN mtapi_uint_t attribute_num,
  MTAPI_OUT void* attribute,
  MTAPI_IN mtapi_size_t attribute_size,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;
  embb_mtapi_node_t* node = embb_mtapi_node_get_instance();
  embb_mtapi_group_t* local_group;

  embb_mtapi_log_trace("mtapi_group_set_attribute() called\n");

  if (embb_mtapi_node_is_initialized()) {
    if (embb_mtapi_group_pool_is_handle_valid(node->group_pool, group)) {
      local_group = embb_mtapi_group_pool_get_storage_for_handle(
        node->group_pool, group);
      mtapi_groupattr_set(&local_group->attributes, attribute_num,
        attribute, attribute_size, &local_status);
    } else {
      local_status = MTAPI_ERR_GROUP_INVALID;
    }
  } else {
    embb_mtapi_log_error("mtapi not initialized\n");
    local_status = MTAPI_ERR_NODE_NOTINIT;
  }

  mtapi_status_set(status, local_status);
}
Example #3
0
mtapi_task_state_t mtapi_context_taskstate_get(
  MTAPI_IN mtapi_task_context_t* task_context,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;
  mtapi_task_state_t task_state = MTAPI_TASK_ERROR;

  embb_mtapi_log_trace("mtapi_context_taskstate_get() called\n");

  if (MTAPI_NULL != task_context) {
    embb_mtapi_thread_context_t* local_context =
      (embb_mtapi_thread_context_t*)embb_tss_get(
        &(task_context->thread_context->tss_id));

    if (local_context == task_context->thread_context) {
      task_state = task_context->task->state;
      local_status = MTAPI_SUCCESS;
    } else {
      local_status = MTAPI_ERR_CONTEXT_OUTOFCONTEXT;
    }
  } else {
    local_status = MTAPI_ERR_CONTEXT_INVALID;
  }

  mtapi_status_set(status, local_status);
  return task_state;
}
Example #4
0
mtapi_uint_t mtapi_context_corenum_get(
  MTAPI_IN mtapi_task_context_t* task_context,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;
  mtapi_uint_t corenum = 0;

  embb_mtapi_log_trace("mtapi_context_corenum_get() called\n");

  if (MTAPI_NULL != task_context) {
    embb_mtapi_thread_context_t* local_context =
      (embb_mtapi_thread_context_t*)embb_tss_get(
        &(task_context->thread_context->tss_id));

    if (local_context == task_context->thread_context) {
      corenum = task_context->thread_context->core_num;
      local_status = MTAPI_SUCCESS;
    } else {
      local_status = MTAPI_ERR_CONTEXT_OUTOFCONTEXT;
    }
  } else {
    local_status = MTAPI_ERR_CONTEXT_INVALID;
  }

  mtapi_status_set(status, local_status);
  return corenum;
}
Example #5
0
mtapi_boolean_t mtapi_affinity_get(
  MTAPI_OUT mtapi_affinity_t* mask,
  MTAPI_IN mtapi_uint_t core_num,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;
  mtapi_boolean_t affinity = MTAPI_FALSE;
  embb_mtapi_node_t * node = embb_mtapi_node_get_instance();

  embb_mtapi_log_trace("mtapi_affinity_get() called\n");

  if (embb_mtapi_node_is_initialized()) {
    if (MTAPI_NULL != mask) {
      if (core_num < node->attributes.num_cores) {
        affinity =
          embb_bitset_is_set(mask, core_num) ? MTAPI_TRUE : MTAPI_FALSE;
        local_status = MTAPI_SUCCESS;
      } else {
        local_status = MTAPI_ERR_CORE_NUM;
      }
    } else {
      local_status = MTAPI_ERR_PARAMETER;
    }
  } else {
    local_status = MTAPI_ERR_NODE_NOTINIT;
  }

  mtapi_status_set(status, local_status);
  return affinity;
}
Example #6
0
void mtapi_context_runtime_notify(
  MTAPI_IN mtapi_task_context_t* task_context,
  MTAPI_IN mtapi_notification_t notification,
  MTAPI_IN void* data,
  MTAPI_IN mtapi_size_t data_size,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  EMBB_UNUSED(notification);
  EMBB_UNUSED(data);
  EMBB_UNUSED(data_size);

  embb_mtapi_log_trace("mtapi_context_runtime_notify() called\n");

  if (MTAPI_NULL != task_context) {
    mtapi_task_context_t* local_context = (mtapi_task_context_t*) embb_tss_get(
      &(task_context->thread_context->tss_id));

    if (local_context == task_context) {
      local_status = MTAPI_SUCCESS;
    } else {
      local_status = MTAPI_ERR_CONTEXT_OUTOFCONTEXT;
    }
  } else {
    local_status = MTAPI_ERR_CONTEXT_INVALID;
  }

  mtapi_status_set(status, local_status);
}
Example #7
0
void mtapi_affinity_init(
  MTAPI_OUT mtapi_affinity_t* mask,
  MTAPI_IN mtapi_boolean_t affinity,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;
  embb_mtapi_node_t * node = embb_mtapi_node_get_instance();

  embb_mtapi_log_trace("mtapi_affinity_init() called\n");

  if (embb_mtapi_node_is_initialized()) {
    if (MTAPI_NULL != mask) {
      embb_bitset_clear_all(mask);
      if (affinity) {
        embb_bitset_set_n(mask, node->attributes.num_cores);
      }
      local_status = MTAPI_SUCCESS;
    } else {
      local_status = MTAPI_ERR_PARAMETER;
    }
  } else {
    local_status = MTAPI_ERR_NODE_NOTINIT;
  }

  mtapi_status_set(status, local_status);
}
Example #8
0
void mtapi_group_delete(
  MTAPI_IN mtapi_group_hndl_t group,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  if (embb_mtapi_node_is_initialized()) {
    embb_mtapi_node_t* node = embb_mtapi_node_get_instance();
    if (embb_mtapi_group_pool_is_handle_valid(node->group_pool, group)) {
      embb_mtapi_group_t* local_group =
        embb_mtapi_group_pool_get_storage_for_handle(
          node->group_pool, group);

      if (local_group->deleted) {
        local_status = MTAPI_ERR_GROUP_INVALID;
      } else {
        embb_mtapi_group_finalize(local_group);
        embb_mtapi_group_pool_deallocate(node->group_pool, local_group);
        local_status = MTAPI_SUCCESS;
      }
    } else {
      local_status = MTAPI_ERR_GROUP_INVALID;
    }
  } else {
    local_status = MTAPI_ERR_NODE_NOTINIT;
  }

  mtapi_status_set(status, local_status);
}
void mtapi_nodeattr_init(
  MTAPI_OUT mtapi_node_attributes_t* attributes,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  embb_mtapi_log_trace("mtapi_nodeattr_init() called\n");

  if (MTAPI_NULL != attributes) {
    attributes->max_tasks = MTAPI_NODE_MAX_TASKS_DEFAULT;
    attributes->type = MTAPI_NODE_TYPE_SMP;
    attributes->max_actions = MTAPI_NODE_MAX_ACTIONS_DEFAULT;
    attributes->max_groups = MTAPI_NODE_MAX_GROUPS_DEFAULT;
    attributes->max_queues = MTAPI_NODE_MAX_QUEUES_DEFAULT;
    attributes->queue_limit = MTAPI_NODE_QUEUE_LIMIT_DEFAULT;
    attributes->max_jobs = MTAPI_NODE_MAX_JOBS_DEFAULT;
    attributes->max_actions_per_job = MTAPI_NODE_MAX_ACTIONS_PER_JOB_DEFAULT;
    attributes->max_priorities = MTAPI_NODE_MAX_PRIORITIES_DEFAULT;
    attributes->reuse_main_thread = MTAPI_FALSE;
    attributes->worker_priorities = NULL;

    embb_core_set_init(&attributes->core_affinity, 1);
    attributes->num_cores = embb_core_set_count(&attributes->core_affinity);

    assert(embb_core_set_count(&attributes->core_affinity) ==
      embb_core_count_available());

    local_status = MTAPI_SUCCESS;
  } else {
    local_status = MTAPI_ERR_PARAMETER;
  }

  mtapi_status_set(status, local_status);
}
Example #10
0
void mtapi_action_enable(
  MTAPI_IN mtapi_action_hndl_t action,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  embb_mtapi_log_trace("mtapi_action_enable() called\n");

  if (embb_mtapi_node_is_initialized()) {
    embb_mtapi_node_t* node = embb_mtapi_node_get_instance();
    if (embb_mtapi_action_pool_is_handle_valid(node->action_pool, action)) {
      embb_mtapi_action_t* local_action =
        embb_mtapi_action_pool_get_storage_for_handle(
          node->action_pool, action);
      local_action->enabled = MTAPI_TRUE;
      local_status = MTAPI_SUCCESS;
    } else {
      local_status = MTAPI_ERR_ACTION_INVALID;
    }
  } else {
    embb_mtapi_log_error("mtapi not initialized\n");
    local_status = MTAPI_ERR_NODE_NOTINIT;
  }

  mtapi_status_set(status, local_status);
}
Example #11
0
static void opencl_action_finalize(
  MTAPI_IN mtapi_action_hndl_t action,
  MTAPI_OUT mtapi_status_t* status
  ) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;
  cl_int err;
  EMBB_UNUSED_IN_RELEASE(err);

  if (embb_mtapi_node_is_initialized()) {
    embb_mtapi_node_t * node = embb_mtapi_node_get_instance();
    if (embb_mtapi_action_pool_is_handle_valid(node->action_pool, action)) {
      embb_mtapi_action_t * local_action =
        embb_mtapi_action_pool_get_storage_for_handle(
        node->action_pool, action);
      embb_mtapi_opencl_action_t * opencl_action =
        (embb_mtapi_opencl_action_t *)local_action->plugin_data;
      if (NULL != opencl_action->node_local_data) {
        err = clReleaseMemObject(opencl_action->node_local_data);
        assert(CL_SUCCESS == err);
      }

      err = clReleaseKernel(opencl_action->kernel);
      assert(CL_SUCCESS == err);
      err = clReleaseProgram(opencl_action->program);
      assert(CL_SUCCESS == err);

      embb_free(opencl_action);
      local_status = MTAPI_SUCCESS;
    }
  }

  mtapi_status_set(status, local_status);
}
Example #12
0
cl_context mtapi_opencl_get_context(
  MTAPI_OUT mtapi_status_t* status     /**< [out] Pointer to error code,
                                       may be \c MTAPI_NULL */
) {
  embb_mtapi_opencl_plugin_t * plugin = &embb_mtapi_opencl_plugin;
  mtapi_status_set(status, MTAPI_SUCCESS);
  return plugin->context;
}
Example #13
0
void mtapi_taskattr_set(
  MTAPI_INOUT mtapi_task_attributes_t* attributes,
  MTAPI_IN mtapi_uint_t attribute_num,
  MTAPI_IN void* attribute,
  MTAPI_IN mtapi_size_t attribute_size,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  embb_mtapi_log_trace("mtapi_taskattr_set() called\n");

  if (MTAPI_NULL != attributes) {
    if (MTAPI_ATTRIBUTE_POINTER_AS_VALUE != attribute_size &&
      MTAPI_NULL == attribute) {
      local_status = MTAPI_ERR_PARAMETER;
    } else {
      switch (attribute_num) {
      case MTAPI_TASK_DETACHED:
        local_status = embb_mtapi_attr_set_mtapi_boolean_t(
          &attributes->is_detached, attribute, attribute_size);
        break;

      case MTAPI_TASK_INSTANCES:
        local_status = embb_mtapi_attr_set_mtapi_uint_t(
          &attributes->num_instances, attribute, attribute_size);
        break;

      case MTAPI_TASK_PRIORITY:
        local_status = embb_mtapi_attr_set_mtapi_uint_t(
          &attributes->priority, attribute, attribute_size);
        break;

      case MTAPI_TASK_AFFINITY:
        local_status = embb_mtapi_attr_set_mtapi_affinity_t(
          &attributes->affinity, attribute, attribute_size);
        break;

      case MTAPI_TASK_USER_DATA:
        attributes->user_data = (void*)attribute;
        local_status = MTAPI_SUCCESS;
        break;

      case MTAPI_TASK_COMPLETE_FUNCTION:
        memcpy(&attributes->complete_func, &attribute, sizeof(void*));
        local_status = MTAPI_SUCCESS;
        break;

      default:
        /* attribute unknown */
        local_status = MTAPI_ERR_ATTR_NUM;
        break;
      }
    }
  } else {
    local_status = MTAPI_ERR_PARAMETER;
  }

  mtapi_status_set(status, local_status);
}
Example #14
0
static void opencl_task_cancel(
  MTAPI_IN mtapi_task_hndl_t task,
  MTAPI_OUT mtapi_status_t* status
  ) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  EMBB_UNUSED(task);

  mtapi_status_set(status, local_status);
}
Example #15
0
void mtapi_action_get_attribute(
  MTAPI_IN mtapi_action_hndl_t action,
  MTAPI_IN mtapi_uint_t attribute_num,
  MTAPI_OUT void* attribute,
  MTAPI_IN mtapi_size_t attribute_size,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  embb_mtapi_log_trace("mtapi_action_get_attribute() called\n");

  if (embb_mtapi_node_is_initialized()) {
    embb_mtapi_node_t* node = embb_mtapi_node_get_instance();
    if (embb_mtapi_action_pool_is_handle_valid(node->action_pool, action)) {
      embb_mtapi_action_t* local_action =
        embb_mtapi_action_pool_get_storage_for_handle(
          node->action_pool, action);

      if (MTAPI_NULL == attribute) {
        local_status = MTAPI_ERR_PARAMETER;
      } else {
        switch (attribute_num) {
        case MTAPI_ACTION_GLOBAL:
          local_status = embb_mtapi_attr_get_mtapi_boolean_t(
            &local_action->attributes.global, attribute, attribute_size);
          break;

        case MTAPI_ACTION_AFFINITY:
          local_status = embb_mtapi_attr_get_mtapi_affinity_t(
            &local_action->attributes.affinity, attribute, attribute_size);
          break;

        case MTAPI_ACTION_DOMAIN_SHARED:
          local_status = embb_mtapi_attr_get_mtapi_boolean_t(
            &local_action->attributes.domain_shared,
            attribute,
            attribute_size);
          break;

        default:
          /* attribute unknown */
          local_status = MTAPI_ERR_ATTR_NUM;
          break;
        }
      }
    } else {
      local_status = MTAPI_ERR_ACTION_INVALID;
    }
  } else {
    embb_mtapi_log_error("mtapi not initialized\n");
    local_status = MTAPI_ERR_NODE_NOTINIT;
  }

  mtapi_status_set(status, local_status);
}
void mtapi_actionattr_init(
  MTAPI_OUT mtapi_action_attributes_t* attributes,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  embb_mtapi_log_trace("mtapi_actionattr_init() called\n");

  if (MTAPI_NULL != attributes) {
    attributes->domain_shared = MTAPI_TRUE;
    attributes->global = MTAPI_TRUE;
    mtapi_affinity_init(&attributes->affinity, MTAPI_TRUE, &local_status);
  } else {
    local_status = MTAPI_ERR_PARAMETER;
  }

  mtapi_status_set(status, local_status);
}
Example #17
0
void mtapi_opencl_plugin_finalize(
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  cl_int err;
  EMBB_UNUSED_IN_RELEASE(err);
  embb_mtapi_opencl_plugin_t * plugin = &embb_mtapi_opencl_plugin;

  /* finalization */
  err = clReleaseCommandQueue(plugin->command_queue);
  assert(CL_SUCCESS == err);
  err = clReleaseContext(plugin->context);
  assert(CL_SUCCESS == err);

  local_status = MTAPI_SUCCESS;
  mtapi_status_set(status, local_status);
}
void mtapi_actionattr_set(
  MTAPI_INOUT mtapi_action_attributes_t* attributes,
  MTAPI_IN mtapi_uint_t attribute_num,
  MTAPI_IN void* attribute,
  MTAPI_IN mtapi_size_t attribute_size,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  embb_mtapi_log_trace("mtapi_actionattr_set() called\n");

  if (MTAPI_NULL != attributes) {
    if (MTAPI_ATTRIBUTE_POINTER_AS_VALUE != attribute_size &&
      MTAPI_NULL == attribute) {
      local_status = MTAPI_ERR_PARAMETER;
    } else {
      switch (attribute_num) {
      case MTAPI_ACTION_GLOBAL:
        local_status = embb_mtapi_attr_set_mtapi_boolean_t(
          &attributes->global, attribute, attribute_size);
        break;

      case MTAPI_ACTION_AFFINITY:
        local_status = embb_mtapi_attr_set_mtapi_affinity_t(
          &attributes->affinity, attribute, attribute_size);
        break;

      case MTAPI_ACTION_DOMAIN_SHARED:
        local_status = embb_mtapi_attr_set_mtapi_boolean_t(
          &attributes->domain_shared, attribute, attribute_size);
        break;

      default:
        /* attribute unknown */
        local_status = MTAPI_ERR_ATTR_NUM;
        break;
      }
    }
  } else {
    /* this should not happen, if someone calls set, a valid action_attributes
       pointer should be supplied */
    local_status = MTAPI_ERR_PARAMETER;
  }

  mtapi_status_set(status, local_status);
}
Example #19
0
void mtapi_taskattr_init(
  MTAPI_OUT mtapi_task_attributes_t* attributes,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  embb_mtapi_log_trace("mtapi_taskattr_init() called\n");

  if (MTAPI_NULL != attributes) {
    attributes->num_instances = 1;
    attributes->is_detached = MTAPI_FALSE;
    attributes->priority = 0;
    attributes->complete_func = MTAPI_NULL;
    mtapi_affinity_init(&attributes->affinity, MTAPI_TRUE, &local_status);
  } else {
    local_status = MTAPI_ERR_PARAMETER;
  }

  mtapi_status_set(status, local_status);
}
Example #20
0
void mtapi_group_get_attribute(
  MTAPI_IN mtapi_group_hndl_t group,
  MTAPI_IN mtapi_uint_t attribute_num,
  MTAPI_OUT void* attribute,
  MTAPI_IN mtapi_size_t attribute_size,
  MTAPI_OUT mtapi_status_t* status ) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  EMBB_UNUSED(attribute_num);
  EMBB_UNUSED(attribute_size);

  embb_mtapi_log_trace("mtapi_group_get_attribute() called\n");

  if (embb_mtapi_node_is_initialized()) {
    embb_mtapi_node_t* node = embb_mtapi_node_get_instance();
    if (embb_mtapi_group_pool_is_handle_valid(node->group_pool, group)) {
      /* the following is not needed for now, since there are no attributes

      embb_mtapi_group_t* local_group =
        embb_mtapi_group_pool_get_storage_for_handle(
          node->group_pool, group); */

      if (MTAPI_NULL == attribute) {
        local_status = MTAPI_ERR_PARAMETER;
      } else {
        /* switch is not needed for now, since there are no attributes
        switch (attribute_num) {
        default: */
          local_status = MTAPI_ERR_ATTR_NUM;
        /*  break;
        }*/
      }
    } else {
      local_status = MTAPI_ERR_GROUP_INVALID;
    }
  } else {
    embb_mtapi_log_error("mtapi not initialized\n");
    local_status = MTAPI_ERR_NODE_NOTINIT;
  }

  mtapi_status_set(status, local_status);
}
Example #21
0
void mtapi_opencl_plugin_initialize(
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;
  cl_int err;
  embb_mtapi_opencl_plugin_t * plugin = &embb_mtapi_opencl_plugin;

  err = embb_mtapi_opencl_link_at_runtime();
  if (err <= 0) {
    // OpenCL not available, or wrong version
    local_status = MTAPI_ERR_FUNC_NOT_IMPLEMENTED;
  } else {
    // all good, go ahead
    err = clGetPlatformIDs(1, &plugin->platform_id, NULL);
    if (CL_SUCCESS == err) {
      err = clGetDeviceIDs(plugin->platform_id, CL_DEVICE_TYPE_DEFAULT,
        1, &plugin->device_id, NULL);
    }
    if (CL_SUCCESS == err) {
      plugin->context = clCreateContext(NULL, 1, &plugin->device_id,
        NULL, NULL, &err);
    }
    if (CL_SUCCESS == err) {
      err = clGetDeviceInfo(plugin->device_id, CL_DEVICE_MAX_WORK_GROUP_SIZE,
        sizeof(size_t), &plugin->work_group_size, NULL);
    }
    if (CL_SUCCESS == err) {
      err = clGetDeviceInfo(plugin->device_id, CL_DEVICE_MAX_WORK_ITEM_SIZES,
        3 * sizeof(size_t), &plugin->work_item_sizes[0], NULL);
    }
    if (CL_SUCCESS == err) {
      plugin->command_queue = clCreateCommandQueue(plugin->context,
        plugin->device_id, 0, &err);
    }
    if (CL_SUCCESS == err) {
      local_status = MTAPI_SUCCESS;
    }
  }

  mtapi_status_set(status, local_status);
}
Example #22
0
mtapi_group_hndl_t mtapi_group_create(
  MTAPI_IN mtapi_group_id_t group_id,
  MTAPI_IN mtapi_group_attributes_t* attributes,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;
  embb_mtapi_node_t* node = embb_mtapi_node_get_instance();
  mtapi_group_hndl_t group_hndl = { 0, EMBB_MTAPI_IDPOOL_INVALID_ID };
  embb_mtapi_group_t* group = NULL;

  embb_mtapi_log_trace("mtapi_group_create() called\n");

  if (embb_mtapi_node_is_initialized()) {
    group = embb_mtapi_group_pool_allocate(node->group_pool);
    if (MTAPI_NULL != group) {
      embb_mtapi_group_initialize_with_node(group, node);
      group->group_id = group_id;
      if (MTAPI_NULL != attributes) {
        group->attributes = *attributes;
        local_status = MTAPI_SUCCESS;
      } else {
        mtapi_groupattr_init(&group->attributes, &local_status);
      }
      if (MTAPI_SUCCESS == local_status) {
        group_hndl = group->handle;
      } else {
        embb_mtapi_group_finalize(group);
        embb_mtapi_group_pool_deallocate(node->group_pool, group);
      }
    } else {
      local_status = MTAPI_ERR_GROUP_LIMIT;
    }
  } else {
    embb_mtapi_log_error("mtapi not initialized\n");
    local_status = MTAPI_ERR_NODE_NOTINIT;
  }

  mtapi_status_set(status, local_status);
  return group_hndl;
}
Example #23
0
mtapi_action_hndl_t mtapi_opencl_action_create(
  MTAPI_IN mtapi_job_id_t job_id,
  MTAPI_IN char* kernel_source,
  MTAPI_IN char* kernel_name,
  MTAPI_IN mtapi_size_t local_work_size,
  MTAPI_IN mtapi_size_t element_size,
  MTAPI_IN void* node_local_data,
  MTAPI_IN mtapi_size_t node_local_data_size,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  cl_int err;
  embb_mtapi_opencl_plugin_t * plugin = &embb_mtapi_opencl_plugin;
  embb_mtapi_opencl_action_t * action =
    (embb_mtapi_opencl_action_t*)embb_alloc(
      sizeof(embb_mtapi_opencl_action_t));
  mtapi_action_hndl_t action_hndl = { 0, 0 }; // invalid handle
  size_t kernel_length = strlen(kernel_source);
  mtapi_boolean_t free_program_on_error = MTAPI_FALSE;
  mtapi_boolean_t free_kernel_on_error = MTAPI_FALSE;
  mtapi_boolean_t free_node_local_data_on_error = MTAPI_FALSE;

  action->local_work_size = local_work_size;
  action->element_size = element_size;

  /* initialization */
  action->program = clCreateProgramWithSource(plugin->context,
    1, &kernel_source, &kernel_length, &err);
  if (CL_SUCCESS == err) {
    free_program_on_error = MTAPI_TRUE;
    err = clBuildProgram(action->program, 1, &plugin->device_id,
      NULL, NULL, NULL);
  } else {
    err = clGetProgramBuildInfo(action->program, plugin->device_id,
      CL_PROGRAM_BUILD_LOG, 1024, buffer, NULL);
  }

  if (CL_SUCCESS == err) {
    action->kernel = clCreateKernel(action->program, kernel_name, &err);
    if (CL_SUCCESS == err) {
      free_kernel_on_error = MTAPI_TRUE;
    }
  }

  if (0 < node_local_data_size) {
    action->node_local_data = clCreateBuffer(plugin->context, CL_MEM_READ_ONLY,
      node_local_data_size, NULL, &err);
    if (CL_SUCCESS == err) {
      free_node_local_data_on_error = MTAPI_TRUE;
    }
    action->node_local_data_size = (int)node_local_data_size;
    if (CL_SUCCESS == err) {
      err = clEnqueueWriteBuffer(plugin->command_queue,
        action->node_local_data, CL_TRUE, 0,
        (size_t)action->node_local_data_size, node_local_data, 0, NULL, NULL);
    }
  } else {
    action->node_local_data = NULL;
    action->node_local_data_size = 0;
  }

  if (CL_SUCCESS == err) {
    err = clSetKernelArg(action->kernel, 4, sizeof(cl_mem),
      (const void*)&action->node_local_data);
  }
  if (CL_SUCCESS == err) {
    err = clSetKernelArg(action->kernel, 5, sizeof(cl_int),
      (const void*)&action->node_local_data_size);
  }

  if (CL_SUCCESS == err) {
    action_hndl = mtapi_ext_plugin_action_create(
      job_id,
      opencl_task_start,
      opencl_task_cancel,
      opencl_action_finalize,
      action,
      node_local_data,
      node_local_data_size,
      MTAPI_NULL,
      &local_status);
  } else {
    if (free_node_local_data_on_error) {
      clReleaseMemObject(action->node_local_data);
    }
    if (free_kernel_on_error) {
      clReleaseKernel(action->kernel);
    }
    if (free_program_on_error) {
      clReleaseProgram(action->program);
    }
    embb_free(action);
  }

  mtapi_status_set(status, local_status);

  return action_hndl;
}
void mtapi_nodeattr_set(
  MTAPI_INOUT mtapi_node_attributes_t* attributes,
  MTAPI_IN mtapi_uint_t attribute_num,
  MTAPI_IN void* attribute,
  MTAPI_IN mtapi_size_t attribute_size,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  embb_mtapi_log_trace("mtapi_nodeattr_set() called\n");

  if (MTAPI_NULL != attributes) {
    if (MTAPI_ATTRIBUTE_POINTER_AS_VALUE != attribute_size &&
      MTAPI_NULL == attribute) {
      local_status = MTAPI_ERR_PARAMETER;
    } else {
      switch (attribute_num) {
      case MTAPI_NODE_CORE_AFFINITY:
        if (MTAPI_NODE_CORE_AFFINITY_SIZE == attribute_size) {
          attributes->core_affinity = *(embb_core_set_t*)attribute;
          attributes->num_cores =
            embb_core_set_count(&attributes->core_affinity);
          local_status = MTAPI_SUCCESS;
        } else {
          local_status = MTAPI_ERR_ATTR_SIZE;
        }
        break;

      case MTAPI_NODE_NUMCORES:
        local_status = MTAPI_ERR_ATTR_READONLY;
        break;

      case MTAPI_NODE_TYPE:
        local_status = embb_mtapi_attr_set_mtapi_uint_t(
          &attributes->type, attribute, attribute_size);
        break;

      case MTAPI_NODE_MAX_TASKS:
        local_status = embb_mtapi_attr_set_mtapi_uint_t(
          &attributes->max_tasks, attribute, attribute_size);
        break;

      case MTAPI_NODE_MAX_ACTIONS:
        local_status = embb_mtapi_attr_set_mtapi_uint_t(
          &attributes->max_actions, attribute, attribute_size);
        break;

      case MTAPI_NODE_MAX_GROUPS:
        local_status = embb_mtapi_attr_set_mtapi_uint_t(
          &attributes->max_groups, attribute, attribute_size);
        break;

      case MTAPI_NODE_MAX_QUEUES:
        local_status = embb_mtapi_attr_set_mtapi_uint_t(
          &attributes->max_queues, attribute, attribute_size);
        break;

      case MTAPI_NODE_QUEUE_LIMIT:
        local_status = embb_mtapi_attr_set_mtapi_uint_t(
          &attributes->queue_limit, attribute, attribute_size);
        break;

      case MTAPI_NODE_MAX_JOBS:
        local_status = embb_mtapi_attr_set_mtapi_uint_t(
          &attributes->max_jobs, attribute, attribute_size);
        break;

      case MTAPI_NODE_MAX_ACTIONS_PER_JOB:
        local_status = embb_mtapi_attr_set_mtapi_uint_t(
          &attributes->max_actions_per_job, attribute, attribute_size);
        break;

      case MTAPI_NODE_MAX_PRIORITIES:
        local_status = embb_mtapi_attr_set_mtapi_uint_t(
          &attributes->max_priorities, attribute, attribute_size);
        break;

      case MTAPI_NODE_REUSE_MAIN_THREAD:
        local_status = embb_mtapi_attr_set_mtapi_boolean_t(
          &attributes->reuse_main_thread, attribute, attribute_size);
        break;

      case MTAPI_NODE_WORKER_PRIORITIES:
        local_status = MTAPI_SUCCESS;
        attributes->worker_priorities =
          (mtapi_worker_priority_entry_t*)attribute;
        break;

      default:
        /* attribute unknown */
        local_status = MTAPI_ERR_ATTR_NUM;
        break;
      }
    }
  } else {
    /* this should not happen, if someone calls set, a valid action_attributes
    pointer should be supplied */
    local_status = MTAPI_ERR_PARAMETER;
  }

  mtapi_status_set(status, local_status);
}
Example #25
0
void mtapi_context_status_set(
  MTAPI_INOUT mtapi_task_context_t* task_context,
  MTAPI_IN mtapi_status_t error_code,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  embb_mtapi_log_trace("mtapi_action_status_set() called\n");

  if (MTAPI_NULL != task_context) {
    embb_mtapi_thread_context_t* local_context =
      (embb_mtapi_thread_context_t*)embb_tss_get(
        &(task_context->thread_context->tss_id));

    if (local_context == task_context->thread_context) {
      /* for remote actions the result shall be transferred to the
         waiting node at the end of the task */
      switch (error_code) {
      case MTAPI_SUCCESS:
      case MTAPI_ERR_ARG_SIZE:
      case MTAPI_ERR_RESULT_SIZE:
      case MTAPI_ERR_ACTION_CANCELLED:
      case MTAPI_ERR_ACTION_FAILED:
      case MTAPI_ERR_ACTION_DELETED:
        task_context->task->error_code = error_code;
        local_status = MTAPI_SUCCESS;
        break;
      case MTAPI_ERR_CORE_NUM:
      case MTAPI_ERR_RUNTIME_LOADBALANCING_NOTSUPPORTED:
      case MTAPI_ERR_RUNTIME_REMOTETASKS_NOTSUPPORTED:
      case MTAPI_ERR_ARG_NOT_IMPLEMENTED:
      case MTAPI_ERR_FUNC_NOT_IMPLEMENTED:
      case MTAPI_ERR_WAIT_PENDING:
      case MTAPI_ERR_BUFFER_SIZE:
      case MTAPI_ERR_UNKNOWN:
      case MTAPI_GROUP_COMPLETED:
      case MTAPI_ERR_GROUP_LIMIT:
      case MTAPI_ERR_GROUP_INVALID:
      case MTAPI_ERR_QUEUE_LIMIT:
      case MTAPI_ERR_QUEUE_DISABLED:
      case MTAPI_ERR_QUEUE_DELETED:
      case MTAPI_ERR_QUEUE_INVALID:
      case MTAPI_ERR_JOB_INVALID:
      case MTAPI_ERR_TASK_LIMIT:
      case MTAPI_ERR_TASK_INVALID:
      case MTAPI_ERR_CONTEXT_OUTOFCONTEXT:
      case MTAPI_ERR_CONTEXT_INVALID:
      case MTAPI_ERR_ACTION_DISABLED:
      case MTAPI_ERR_ACTION_NUM_INVALID:
      case MTAPI_ERR_ACTION_LIMIT:
      case MTAPI_ERR_ACTION_EXISTS:
      case MTAPI_ERR_ACTION_INVALID:
      case MTAPI_ERR_NODE_NOTINIT:
      case MTAPI_ERR_DOMAIN_INVALID:
      case MTAPI_ERR_NODE_INVALID:
      case MTAPI_ERR_NODE_INITIALIZED:
      case MTAPI_ERR_NODE_INITFAILED:
      case MTAPI_ERR_ATTR_SIZE:
      case MTAPI_ERR_ATTR_READONLY:
      case MTAPI_ERR_PARAMETER:
      case MTAPI_TIMEOUT:
      case MTAPI_ERR_ATTR_NUM:
      default:
        /* trying to set invalid error code */
        local_status = MTAPI_ERR_PARAMETER;
        break;
      }
    } else {
      local_status = MTAPI_ERR_CONTEXT_OUTOFCONTEXT;
    }
  } else {
    local_status = MTAPI_ERR_CONTEXT_INVALID;
  }

  mtapi_status_set(status, local_status);
}
Example #26
0
static void opencl_task_start(
  MTAPI_IN mtapi_task_hndl_t task,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;
  cl_int err;

  if (embb_mtapi_node_is_initialized()) {
    embb_mtapi_node_t * node = embb_mtapi_node_get_instance();

    if (embb_mtapi_task_pool_is_handle_valid(node->task_pool, task)) {
      embb_mtapi_task_t * local_task =
        embb_mtapi_task_pool_get_storage_for_handle(node->task_pool, task);

      if (embb_mtapi_action_pool_is_handle_valid(
        node->action_pool, local_task->action)) {
        embb_mtapi_action_t * local_action =
          embb_mtapi_action_pool_get_storage_for_handle(
          node->action_pool, local_task->action);

        embb_mtapi_opencl_plugin_t * plugin = &embb_mtapi_opencl_plugin;
        embb_mtapi_opencl_action_t * opencl_action =
          (embb_mtapi_opencl_action_t*)local_action->plugin_data;
        embb_mtapi_opencl_task_t * opencl_task =
          (embb_mtapi_opencl_task_t*)embb_alloc(
            sizeof(embb_mtapi_opencl_task_t));

        size_t elements = local_task->result_size /
          opencl_action->element_size;
        size_t global_work_size;

        if (0 == elements)
          elements = 1;
        global_work_size =
          round_up(opencl_action->local_work_size, elements);

        opencl_task->task = task;

        opencl_task->arguments_size = (int)local_task->arguments_size;
        if (0 < local_task->arguments_size) {
          opencl_task->arguments = clCreateBuffer(plugin->context,
            CL_MEM_READ_ONLY, local_task->arguments_size, NULL, &err);
        } else {
          opencl_task->arguments = NULL;
        }
        opencl_task->result_buffer_size = (int)local_task->result_size;
        if (0 < local_task->result_size) {
          opencl_task->result_buffer = clCreateBuffer(plugin->context,
            CL_MEM_WRITE_ONLY, local_task->result_size, NULL, &err);
        } else {
          opencl_task->result_buffer = NULL;
        }

        err = clSetKernelArg(opencl_action->kernel, 0, sizeof(cl_mem),
          (const void*)&opencl_task->arguments);
        err |= clSetKernelArg(opencl_action->kernel, 1, sizeof(cl_int),
          (const void*)&opencl_task->arguments_size);

        err |= clSetKernelArg(opencl_action->kernel, 2, sizeof(cl_mem),
          (const void*)&opencl_task->result_buffer);
        err |= clSetKernelArg(opencl_action->kernel, 3, sizeof(cl_int),
          (const void*)&opencl_task->result_buffer_size);

        err |= clEnqueueWriteBuffer(plugin->command_queue,
          opencl_task->arguments, CL_FALSE, 0,
          (size_t)opencl_task->arguments_size, local_task->arguments,
          0, NULL, NULL);

        if (CL_SUCCESS == err) {
          embb_mtapi_task_set_state(local_task, MTAPI_TASK_RUNNING);

          err |= clEnqueueNDRangeKernel(plugin->command_queue,
            opencl_action->kernel, 1, NULL,
            &global_work_size, &opencl_action->local_work_size, 0, NULL, NULL);
          err |= clEnqueueReadBuffer(plugin->command_queue,
            opencl_task->result_buffer, CL_FALSE, 0,
            (size_t)opencl_task->result_buffer_size, local_task->result_buffer,
            0, NULL, &opencl_task->kernel_finish_event);
          err |= clSetEventCallback(opencl_task->kernel_finish_event,
            CL_COMPLETE, opencl_task_complete, opencl_task);
        }

        err |= clFlush(plugin->command_queue);
        if (CL_SUCCESS != err) {
          embb_mtapi_task_set_state(local_task, MTAPI_TASK_ERROR);
          local_status = MTAPI_ERR_ACTION_FAILED;
        } else {
          local_status = MTAPI_SUCCESS;
        }
      }
    }
  }

  mtapi_status_set(status, local_status);
}
Example #27
0
void mtapi_group_wait_any(
  MTAPI_IN mtapi_group_hndl_t group,
  MTAPI_OUT void** result,
  MTAPI_IN mtapi_timeout_t timeout,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  embb_mtapi_log_trace("mtapi_group_wait_any() called\n");

  if (embb_mtapi_node_is_initialized()) {
    embb_mtapi_node_t* node = embb_mtapi_node_get_instance();
    if (embb_mtapi_group_pool_is_handle_valid(node->group_pool, group)) {
      embb_mtapi_group_t* local_group =
        embb_mtapi_group_pool_get_storage_for_handle(
          node->group_pool, group);

      embb_mtapi_task_t* local_task;
      /* are there any tasks left? */
      if (0 == embb_atomic_load_int(&local_group->num_tasks)) {
        /* group becomes invalid, so delete it */
        mtapi_group_delete(group, &local_status);
        local_status = MTAPI_GROUP_COMPLETED;
      } else {
        embb_mtapi_thread_context_t * context = NULL;

        embb_duration_t wait_duration;
        embb_time_t end_time;
        if (MTAPI_INFINITE < timeout) {
          embb_duration_set_milliseconds(
            &wait_duration, (unsigned long long)timeout);
          embb_time_in(&end_time, &wait_duration);
        }

        /* find out on which thread we are */
        context = embb_mtapi_scheduler_get_current_thread_context(
          node->scheduler);

        /* wait for any task to arrive */
        local_status = MTAPI_SUCCESS;
        local_task = embb_mtapi_task_queue_pop(&local_group->queue);
        while (MTAPI_NULL == local_task) {
          if (MTAPI_INFINITE < timeout) {
            embb_time_t current_time;
            embb_time_now(&current_time);
            if (embb_time_compare(&current_time, &end_time) > 0) {
              /* timeout! */
              local_status = MTAPI_TIMEOUT;
              break;
            }
          }

          /* do other work if applicable */
          embb_mtapi_scheduler_execute_task_or_yield(
            node->scheduler,
            node,
            context);

          /* try to pop a task from the group queue */
          local_task = embb_mtapi_task_queue_pop(&local_group->queue);
        }
        /* was there a timeout, or is there a result? */
        if (MTAPI_NULL != local_task) {
          /* store result */
          if (MTAPI_NULL != result) {
            *result = local_task->result_buffer;
          }

          /* return error code set by the task */
          local_status = local_task->error_code;

          /* delete task */
          embb_mtapi_task_delete(local_task, node->task_pool);
          embb_atomic_fetch_and_add_int(&local_group->num_tasks, -1);
        }
      }
    } else {
      local_status = MTAPI_ERR_GROUP_INVALID;
    }
  } else {
    embb_mtapi_log_error("mtapi not initialized\n");
    local_status = MTAPI_ERR_NODE_NOTINIT;
  }

  mtapi_status_set(status, local_status);
  embb_mtapi_log_trace("mtapi_group_wait_any() returns\n");
}
Example #28
0
void mtapi_action_disable(
  MTAPI_IN mtapi_action_hndl_t action,
  MTAPI_IN mtapi_timeout_t timeout,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;

  embb_mtapi_log_trace("mtapi_action_disable() called\n");

  if (embb_mtapi_node_is_initialized()) {
    embb_mtapi_node_t* node = embb_mtapi_node_get_instance();
    if (embb_mtapi_action_pool_is_handle_valid(node->action_pool, action)) {
      embb_mtapi_action_t* local_action =
        embb_mtapi_action_pool_get_storage_for_handle(
          node->action_pool, action);
      local_action->enabled = MTAPI_FALSE;

      embb_mtapi_thread_context_t * context = NULL;

      embb_duration_t wait_duration;
      embb_time_t end_time;
      if (MTAPI_INFINITE < timeout) {
        embb_duration_set_milliseconds(
          &wait_duration, (unsigned long long)timeout);
        embb_time_in(&end_time, &wait_duration);
      }

      /* cancel all tasks */
      embb_mtapi_scheduler_process_tasks(
        node->scheduler, embb_mtapi_action_disable_visitor, local_action);

      /* find out on which thread we are */
      context = embb_mtapi_scheduler_get_current_thread_context(
        node->scheduler);

      local_status = MTAPI_SUCCESS;
      while (embb_atomic_load_int(&local_action->num_tasks)) {
        if (MTAPI_INFINITE < timeout) {
          embb_time_t current_time;
          embb_time_now(&current_time);
          if (embb_time_compare(&current_time, &end_time) > 0) {
            /* timeout! */
            local_status = MTAPI_TIMEOUT;
            break;
          }
        }

        /* do other work if applicable */
        embb_mtapi_scheduler_execute_task_or_yield(
          node->scheduler,
          node,
          context);
      }
    } else {
      local_status = MTAPI_ERR_ACTION_INVALID;
    }
  } else {
    embb_mtapi_log_error("mtapi not initialized\n");
    local_status = MTAPI_ERR_NODE_NOTINIT;
  }

  mtapi_status_set(status, local_status);
}
Example #29
0
mtapi_action_hndl_t mtapi_action_create(
  MTAPI_IN mtapi_job_id_t job_id,
  MTAPI_IN mtapi_action_function_t action_function,
  MTAPI_IN void* node_local_data,
  MTAPI_IN mtapi_size_t node_local_data_size,
  MTAPI_IN mtapi_action_attributes_t* attributes,
  MTAPI_OUT mtapi_status_t* status) {
  mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;
  mtapi_action_hndl_t action_handle = { 0, EMBB_MTAPI_IDPOOL_INVALID_ID };

  embb_mtapi_log_trace("mtapi_action_create() called\n");

  if (embb_mtapi_node_is_initialized()) {
    embb_mtapi_node_t* node = embb_mtapi_node_get_instance();
    /* check if job is valid */
    if (embb_mtapi_job_is_id_valid(node, job_id)) {
      embb_mtapi_job_t* job = embb_mtapi_job_get_storage_for_id(node, job_id);
      embb_mtapi_action_t* new_action =
        embb_mtapi_action_pool_allocate(node->action_pool);
      if (MTAPI_NULL != new_action) {
        new_action->domain_id = node->domain_id;
        new_action->node_id = node->node_id;
        new_action->job_id = job_id;
        new_action->node_local_data = node_local_data;
        new_action->node_local_data_size = node_local_data_size;
        new_action->enabled = MTAPI_TRUE;
        new_action->is_plugin_action = MTAPI_FALSE;
        embb_atomic_store_int(&new_action->num_tasks, 0);

        new_action->action_function = action_function;

        /* set defaults if no attributes were given */
        if (MTAPI_NULL != attributes) {
          new_action->attributes = *attributes;
          local_status = MTAPI_SUCCESS;
        } else {
          /* use the default */
          mtapi_actionattr_init(&new_action->attributes, &local_status);
        }

        /* check if affinity is sane */
        if (0 == new_action->attributes.affinity) {
          local_status = MTAPI_ERR_PARAMETER;
        }

        if (MTAPI_SUCCESS == local_status) {
          action_handle = new_action->handle;
          embb_mtapi_job_add_action(job, new_action);
        } else {
          embb_mtapi_action_pool_deallocate(node->action_pool, new_action);
        }
      } else {
        /* no more space left in action pool */
        local_status = MTAPI_ERR_ACTION_LIMIT;
      }
    } else {
      local_status = MTAPI_ERR_JOB_INVALID;
    }
  } else {
    embb_mtapi_log_error("mtapi not initialized\n");
    local_status = MTAPI_ERR_NODE_NOTINIT;
  }

  mtapi_status_set(status, local_status);
  return action_handle;
}