5 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi, XBT_LOG_ROOT_CAT, "All SMPI categories");
7 SMPI_Global_t smpi_global = NULL;
9 void *smpi_request_new()
11 smpi_mpi_request_t request = xbt_new(s_smpi_mpi_request_t, 1);
13 request->completed = 0;
14 request->mutex = SIMIX_mutex_init();
15 request->cond = SIMIX_cond_init();
20 void smpi_request_free(void *pointer)
23 smpi_mpi_request_t request = pointer;
25 if (NULL != request) {
26 SIMIX_cond_destroy(request->cond);
27 SIMIX_mutex_destroy(request->mutex);
34 void smpi_request_reset(void *pointer)
36 smpi_mpi_request_t request = pointer;
38 request->completed = 0;
44 void *smpi_message_new()
46 return xbt_new(s_smpi_received_message_t, 1);
49 void smpi_message_free(void *pointer)
51 if (NULL != pointer) {
58 void smpi_message_reset(void *pointer)
63 void smpi_global_init()
67 int size = SIMIX_host_get_number();
69 smpi_global = xbt_new(s_SMPI_Global_t, 1);
72 smpi_global->reference_speed = SMPI_DEFAULT_SPEED;
74 smpi_global->root_ready = 0;
75 smpi_global->ready_process_count = 0;
78 smpi_global->start_stop_mutex = SIMIX_mutex_init();
79 smpi_global->start_stop_cond = SIMIX_cond_init();
82 smpi_global->sender_processes = xbt_new(smx_process_t, size);
83 smpi_global->receiver_processes = xbt_new(smx_process_t, size);
86 smpi_global->running_hosts_count_mutex = SIMIX_mutex_init();
87 smpi_global->running_hosts_count = 0;
90 smpi_global->request_mallocator = xbt_mallocator_new(SMPI_REQUEST_MALLOCATOR_SIZE,
91 smpi_request_new, smpi_request_free, smpi_request_reset);
92 smpi_global->message_mallocator = xbt_mallocator_new(SMPI_MESSAGE_MALLOCATOR_SIZE,
93 smpi_message_new, smpi_message_free, smpi_message_reset);
96 smpi_global->pending_send_request_queues = xbt_new(xbt_fifo_t, size);
97 smpi_global->pending_send_request_queues_mutexes = xbt_new(smx_mutex_t, size);
98 smpi_global->pending_recv_request_queues = xbt_new(xbt_fifo_t, size);
99 smpi_global->pending_recv_request_queues_mutexes = xbt_new(smx_mutex_t, size);
100 smpi_global->received_message_queues = xbt_new(xbt_fifo_t, size);
101 smpi_global->received_message_queues_mutexes = xbt_new(smx_mutex_t, size);
104 smpi_global->timers = xbt_new(xbt_os_timer_t, size);
105 smpi_global->timers_mutexes = xbt_new(smx_mutex_t, size);
107 for(i = 0; i < size; i++) {
108 smpi_global->pending_send_request_queues[i] = xbt_fifo_new();
109 smpi_global->pending_send_request_queues_mutexes[i] = SIMIX_mutex_init();
110 smpi_global->pending_recv_request_queues[i] = xbt_fifo_new();
111 smpi_global->pending_recv_request_queues_mutexes[i] = SIMIX_mutex_init();
112 smpi_global->received_message_queues[i] = xbt_fifo_new();
113 smpi_global->received_message_queues_mutexes[i] = SIMIX_mutex_init();
114 smpi_global->timers[i] = xbt_os_timer_new();
115 smpi_global->timers_mutexes[i] = SIMIX_mutex_init();
120 void smpi_global_destroy()
124 int size = SIMIX_host_get_number();
127 SIMIX_mutex_destroy(smpi_global->start_stop_mutex);
128 SIMIX_cond_destroy(smpi_global->start_stop_cond);
131 xbt_free(smpi_global->sender_processes);
132 xbt_free(smpi_global->receiver_processes);
135 SIMIX_mutex_destroy(smpi_global->running_hosts_count_mutex);
138 xbt_mallocator_free(smpi_global->request_mallocator);
139 xbt_mallocator_free(smpi_global->message_mallocator);
141 for(i = 0; i < size; i++) {
142 xbt_fifo_free(smpi_global->pending_send_request_queues[i]);
143 SIMIX_mutex_destroy(smpi_global->pending_send_request_queues_mutexes[i]);
144 xbt_fifo_free(smpi_global->pending_recv_request_queues[i]);
145 SIMIX_mutex_destroy(smpi_global->pending_recv_request_queues_mutexes[i]);
146 xbt_fifo_free(smpi_global->received_message_queues[i]);
147 SIMIX_mutex_destroy(smpi_global->received_message_queues_mutexes[i]);
148 xbt_os_timer_free(smpi_global->timers[i]);
149 SIMIX_mutex_destroy(smpi_global->timers_mutexes[i]);
152 xbt_free(smpi_global->pending_send_request_queues);
153 xbt_free(smpi_global->pending_send_request_queues_mutexes);
154 xbt_free(smpi_global->pending_recv_request_queues);
155 xbt_free(smpi_global->pending_recv_request_queues_mutexes);
156 xbt_free(smpi_global->received_message_queues);
157 xbt_free(smpi_global->received_message_queues_mutexes);
158 xbt_free(smpi_global->timers);
159 xbt_free(smpi_global->timers_mutexes);
161 xbt_free(smpi_global);
166 int smpi_run_simulation(int argc, char **argv)
168 xbt_fifo_item_t cond_item = NULL;
169 smx_cond_t cond = NULL;
170 xbt_fifo_item_t action_item = NULL;
171 smx_action_t action = NULL;
173 xbt_fifo_t actions_failed = xbt_fifo_new();
174 xbt_fifo_t actions_done = xbt_fifo_new();
176 srand(SMPI_RAND_SEED);
178 SIMIX_global_init(&argc, argv);
180 SIMIX_function_register("smpi_simulated_main", smpi_simulated_main);
181 SIMIX_function_register("smpi_sender", smpi_sender);
182 SIMIX_function_register("smpi_receiver", smpi_receiver);
184 // FIXME: ought to verify these files...
185 SIMIX_create_environment(argv[1]);
187 // must initialize globals between creating environment and launching app....
190 SIMIX_launch_application(argv[2]);
192 /* Prepare to display some more info when dying on Ctrl-C pressing */
193 // FIXME: doesn't work
194 //signal(SIGINT, inthandler);
196 /* Clean IO before the run */
200 while (SIMIX_solve(actions_done, actions_failed) != -1.0) {
201 xbt_fifo_foreach(actions_failed, action_item, action, smx_action_t) {
202 DEBUG1("** %s failed **", action->name);
203 xbt_fifo_foreach(action->cond_list, cond_item, cond, smx_cond_t) {
204 SIMIX_cond_broadcast(cond);
207 xbt_fifo_foreach(actions_done, action_item, action, smx_action_t) {
208 DEBUG1("** %s done **",action->name);
209 xbt_fifo_foreach(action->cond_list, cond_item, cond, smx_cond_t) {
210 SIMIX_cond_broadcast(cond);
215 // FIXME: cleanup incomplete
216 xbt_fifo_free(actions_failed);
217 xbt_fifo_free(actions_done);
219 INFO1("simulation time %g", SIMIX_get_clock());
221 smpi_global_destroy();