grasp_mpi_engine.h
Go to the documentation of this file.
1 /*
2  * Copyright 2016 CNRS & Universite Lille 1. All rights reserved.
3  *
4  * Licensed under the GRASP Open Source License V1.0 (see LICENSE file)
5  */
6 
7 /* grasp_mpi_engine.h */
8 
9 /* Fabrice Ducos <fabrice.ducos@univ-lille1.fr> 2014 */
10 
11 #ifndef GRASP_MPI_ENGINE_H
12 #define GRASP_MPI_ENGINE_H
13 
14 #include <stdbool.h>
15 
16 typedef struct order_t_ order_t;
17 typedef struct result_t_ result_t;
18 
19 /* master_info and worker_info are opaque data that can be interpreted only by the callback functions
20  * If the author of callback functions don't need to pass extra information, he or she can leave these
21  * arguments to NULL.
22  */
23 typedef order_t * (*order_callback_t)(int worker_rank, const void *master_info, bool *no_more_order, int *num_orders); /* master_info is optional and can be left to NULL
24  * no_more_order must be set to true by the callback routine when
25 
26  * num_orders must be given the address of a variable in which the number of orders previously performed will be stored
27  * the production of orders is exhausted (with a NULL return value)
28  */
29 typedef result_t * (*task_callback_t)(const order_t *order, const void *worker_info); /* worker_info is optional and can be left to NULL */
30 typedef int (*collect_callback_t)(const result_t *result, const void *master_info);
31 typedef void (*progress_info_callback_t)(int num_orders_performed, const result_t *result, const void *master_info);
32 
33 extern void grasp_mpi_engine_set_appname(const char *appname);
34 
35 /* The user can provide callback routines for preparing orders, preparing results, collecting results and ending the processing */
36 extern void grasp_mpi_engine_set_order_callback(order_callback_t order_callback, int order_payload_max_size);
37 extern void grasp_mpi_engine_set_task_callback(task_callback_t task_callback, int result_payload_max_size);
38 extern void grasp_mpi_engine_set_collect_callback(collect_callback_t collect_callback);
40 
41 extern order_t *grasp_mpi_engine_new_order(const char *label, size_t payload_size, const void *payload); /* to be called by an order callback function (see dummy example in grasp_mpi_engine.c) */
42 extern result_t *grasp_mpi_engine_new_result(const char *label, size_t payload_size, const void *payload); /* to be called by a result callback function (see dummy example in grasp_mpi_engine.c) */
43 extern void grasp_mpi_engine_delete_order(order_t *order); /* to be called only by the MPI workflow (implemented by grasp_mpi_engine.c) */
44 extern void grasp_mpi_engine_delete_result(result_t *result); /* to be called only by the MPI workflow (implemented by grasp_mpi_engine.c) */
45 extern void grasp_mpi_engine_get_order_label(const order_t *order, size_t label_max_size, char *label); /* label is assumed to be allocated by the caller */
46 extern void grasp_mpi_engine_get_result_labbel(const result_t *result, size_t label_max_size, char *label); /* label is assumed to be allocated by the caller */
47 
48 extern void *grasp_mpi_engine_get_order_payload(const order_t *order); /* returns a read-only reference to the payload of an order */
49 extern void *grasp_mpi_engine_get_result_payload(const result_t *result); /* returns a read-only reference to the payload of a result */
50 
51 extern void grasp_mpi_engine_set_debug_level(int debug_level);
52 extern bool grasp_mpi_engine_is_master(void); /* returns true if the current processing is the master */
53 extern bool grasp_mpi_engine_is_worker(void); /* returns true if the current processing is a worker */
54 extern int grasp_mpi_engine_main_loop(const void *master_info, const void *worker_info); /* master_info and worker_info are optional information that can be passed
55  * to the callback functions (master_info will be passed to order_callback
56  * and worker_info to task_callback). They can be left to NULL if
57  * the callback functions don't need extra information.
58  */
59 
60 extern void grasp_mpi_engine_set_polling_time(int polling_time); /* sets the polling time, in seconds (the master will sleep during polling_time seconds before checking the list of available workers). Default value is 1 second. Setting polling_time to 0 is possible but not recommended (it would produce busy waiting and increase considerably the overhead on the system). A too large value will degrade the performance of the application. */
61 
62 extern void grasp_mpi_engine_set_maximum_job_time(int maximum_job_time); /* sets the maximum time, in seconds, allowed for a task. If the task takes longer, it will be interrupted (default value is 0, meaning no interruption) */
63 
64 /* these are not really part of the API but dummy callback functions for quick tests, debugging and example of usage */
65 extern order_t *grasp_mpi_engine_dummy_order_callback(int worker_rank, const void *master_info, bool *no_more_order, int *num_orders); /* called by the master to prepare an order for a worker */
66 extern result_t *grasp_mpi_engine_dummy_task_callback(const order_t *order, const void *worker_info); /* called by a worker in response to an order */
67 extern bool grasp_mpi_engine_dummy_termination_condition_callback(int num_results_received, const void *master_info); /* called by the master to stop the processing */
68 
69 #endif /* GRASP_MPI_ENGINE_H */
order_t * grasp_mpi_engine_new_order(const char *label, size_t payload_size, const void *payload)
Definition: grasp_mpi_engine.c:236
void * grasp_mpi_engine_get_result_payload(const result_t *result)
Definition: grasp_mpi_engine.c:716
void grasp_mpi_engine_set_maximum_job_time(int maximum_job_time)
int grasp_mpi_engine_main_loop(const void *master_info, const void *worker_info)
Definition: grasp_mpi_engine.c:848
result_t *(* task_callback_t)(const order_t *order, const void *worker_info)
Definition: grasp_mpi_engine.h:29
void grasp_mpi_engine_set_collect_callback(collect_callback_t collect_callback)
Definition: grasp_mpi_engine.c:792
void grasp_mpi_engine_set_polling_time(int polling_time)
void grasp_mpi_engine_set_progress_info_callback(progress_info_callback_t progress_info_callback)
Definition: grasp_mpi_engine.c:796
void grasp_mpi_engine_get_order_label(const order_t *order, size_t label_max_size, char *label)
Definition: grasp_mpi_engine.c:310
void grasp_mpi_engine_delete_order(order_t *order)
Definition: grasp_mpi_engine.c:296
void grasp_mpi_engine_get_result_labbel(const result_t *result, size_t label_max_size, char *label)
void * grasp_mpi_engine_get_order_payload(const order_t *order)
Definition: grasp_mpi_engine.c:711
result_t * grasp_mpi_engine_dummy_task_callback(const order_t *order, const void *worker_info)
Definition: grasp_mpi_engine.c:746
order_t * grasp_mpi_engine_dummy_order_callback(int worker_rank, const void *master_info, bool *no_more_order, int *num_orders)
Definition: grasp_mpi_engine.c:721
void * payload
Definition: grasp_mpi_engine.c:73
void grasp_mpi_engine_set_task_callback(task_callback_t task_callback, int result_payload_max_size)
Definition: grasp_mpi_engine.c:778
int(* collect_callback_t)(const result_t *result, const void *master_info)
Definition: grasp_mpi_engine.h:30
bool grasp_mpi_engine_is_worker(void)
Definition: grasp_mpi_engine.c:844
bool grasp_mpi_engine_is_master(void)
Definition: grasp_mpi_engine.c:840
void(* progress_info_callback_t)(int num_orders_performed, const result_t *result, const void *master_info)
Definition: grasp_mpi_engine.h:31
Definition: grasp_mpi_engine.c:70
char * label
Definition: grasp_mpi_engine.c:72
order_t *(* order_callback_t)(int worker_rank, const void *master_info, bool *no_more_order, int *num_orders)
Definition: grasp_mpi_engine.h:23
void grasp_mpi_engine_set_appname(const char *appname)
Definition: grasp_mpi_engine.c:707
result_t * grasp_mpi_engine_new_result(const char *label, size_t payload_size, const void *payload)
Definition: grasp_mpi_engine.c:266
void grasp_mpi_engine_set_order_callback(order_callback_t order_callback, int order_payload_max_size)
Definition: grasp_mpi_engine.c:765
void grasp_mpi_engine_delete_result(result_t *result)
Definition: grasp_mpi_engine.c:303
void grasp_mpi_engine_set_debug_level(int debug_level)
Definition: grasp_mpi_engine.c:703
bool grasp_mpi_engine_dummy_termination_condition_callback(int num_results_received, const void *master_info)
Definition: grasp_mpi_engine.c:61