: smpi_shared_set_call(#func, input, func(__VA_ARGS__)))
/* Fortran specific stuff */
-XBT_PUBLIC(int) __attribute__((weak)) smpi_simulated_main__(int argc, char** argv);
-XBT_PUBLIC(int) __attribute__((weak)) MAIN__(void);
+XBT_PUBLIC(int) __attribute__((weak)) smpi_simulated_main_(int argc, char** argv);
+XBT_PUBLIC(int) __attribute__((weak)) MAIN_(void);
XBT_PUBLIC(int) smpi_main(int (*realmain) (int argc, char *argv[]),int argc, char *argv[]);
-XBT_PUBLIC(void) __attribute__((weak)) user_main__(void);
+XBT_PUBLIC(void) __attribute__((weak)) user_main_(void);
XBT_PUBLIC(int) smpi_process_index(void);
#define OPT_TRACING_SMPI "tracing/smpi"
#define OPT_TRACING_SMPI_GROUP "tracing/smpi/group"
#define OPT_TRACING_SMPI_COMPUTING "tracing/smpi/computing"
+#define OPT_TRACING_SMPI_INTERNALS "tracing/smpi/internals"
#define OPT_TRACING_CATEGORIZED "tracing/categorized"
#define OPT_TRACING_UNCATEGORIZED "tracing/uncategorized"
#define OPT_TRACING_MSG_PROCESS "tracing/msg/process"
static int trace_smpi_enabled;
static int trace_smpi_grouped;
static int trace_smpi_computing;
+static int trace_view_internals;
static int trace_categorized;
static int trace_uncategorized;
static int trace_msg_process_enabled;
trace_smpi_enabled = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_SMPI);
trace_smpi_grouped = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_SMPI_GROUP);
trace_smpi_computing = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_SMPI_COMPUTING);
+ trace_view_internals = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_SMPI_INTERNALS);
trace_categorized = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_CATEGORIZED);
trace_uncategorized = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_UNCATEGORIZED);
trace_msg_process_enabled = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_MSG_PROCESS);
return trace_smpi_computing;
}
+int TRACE_smpi_view_internals(void)
+{
+ return trace_view_internals;
+}
int TRACE_categorized (void)
{
xbt_cfgelm_int, &default_tracing_smpi_computing, 0, 1,
NULL, NULL);
+ /* smpi internals */
+ int default_tracing_smpi_internals = 0;
+ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI_INTERNALS,
+ "View internal messages sent by Collective communications in SMPI",
+ xbt_cfgelm_int, &default_tracing_smpi_internals, 0, 1,
+ NULL, NULL);
+
/* tracing categorized resource utilization traces */
int default_tracing_categorized = 0;
xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_CATEGORIZED,
" This option aims at tracing computations in the application, outside SMPI\n"
" to allow further study of simulated or real computation time",
detailed);
+ print_line (OPT_TRACING_SMPI_INTERNALS, "Generates tracing events corresponding",
+ " to point-to-point messages sent by collective communications",
+ detailed);
print_line (OPT_TRACING_MSG_PROCESS, "Trace processes behavior (MSG)",
" This option only has effect if this simulator is MSG-based. It traces the\n"
" behavior of all categorized MSG processes, grouping them by hosts. This option\n"
XBT_PUBLIC(int) TRACE_smpi_is_enabled(void);
XBT_PUBLIC(int) TRACE_smpi_is_grouped(void);
XBT_PUBLIC(int) TRACE_smpi_is_computing(void);
+XBT_PUBLIC(int) TRACE_smpi_view_internals(void);
/* from resource_utilization.c */
void TRACE_surf_host_set_utilization(const char *resource,
xbt_assert(!request->action,
"Cannot (re)start a non-finished communication");
if(request->flags & RECV) {
+ #ifdef HAVE_TRACING
+ int rank = smpi_process_index();
+ if (TRACE_smpi_view_internals()) {
+ TRACE_smpi_computing_out(rank);
+ TRACE_smpi_ptp_in(rank, 0, rank, __FUNCTION__);
+ }
+ #endif
print_request("New recv", request);
if (request->size < sg_cfg_get_int("smpi/async_small_thres"))
mailbox = smpi_process_mailbox_small();
} else {
+
+
+
+
int receiver = smpi_group_index(smpi_comm_group(request->comm), request->dst);
+
+ #ifdef HAVE_TRACING
+ int rank = smpi_process_index();
+ if (TRACE_smpi_view_internals()) {
+ TRACE_smpi_ptp_in(rank, rank, receiver, __FUNCTION__);
+ TRACE_smpi_send(rank, rank, receiver);
+ }
+ #endif
/* if(receiver == MPI_UNDEFINED) {*/
/* XBT_WARN("Trying to send a message to a wrong rank");*/
/* return;*/
/* FIXME: detached sends are not traceable (request->action == NULL) */
if (request->action)
simcall_set_category(request->action, TRACE_internal_smpi_get_category());
+
#endif
}
if(req->detached == 0) free(req->buf);
}
smpi_datatype_unuse(datatype);
+
+#ifdef HAVE_TRACING
+ if (TRACE_smpi_view_internals()) {
+ int rank = smpi_process_index();
+ TRACE_smpi_ptp_out(rank, rank, 0, __FUNCTION__);
+ }
+#endif
+
}
+#ifdef HAVE_TRACING
+ if (TRACE_smpi_view_internals()) {
+ if(req->flags & RECV)
+ {
+ int rank = smpi_process_index();
+
+ //the src may not have been known at the beginning of the recv (MPI_ANY_SOURCE)
+ TRACE_smpi_ptp_out(rank, 0, rank, __FUNCTION__);
+ int src_traced = smpi_group_index(smpi_comm_group(req->comm), req->src);
+ TRACE_smpi_recv(rank, src_traced, rank);
+ TRACE_smpi_computing_in(rank);
+ }
+ }
+#endif
+
if(req->detached_sender!=NULL){
smpi_mpi_request_free(&(req->detached_sender));
}