Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Indent include and src using this command:
[simgrid.git] / src / instr / smpi_instr.c
1 /* Copyright (c) 2010. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5   * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #include "instr/private.h"
8
9 #ifdef HAVE_TRACING
10
11 static xbt_dict_t keys;
12
13 static char *TRACE_smpi_container(int rank, char *container, int n)
14 {
15   snprintf(container, n, "rank-%d", rank);
16   return container;
17 }
18
19 static char *TRACE_smpi_put_key(int src, int dst, char *key, int n)
20 {
21   //get the dynar for src#dst
22   char aux[100];
23   snprintf(aux, 100, "%d#%d", src, dst);
24   xbt_dynar_t d = xbt_dict_get_or_null(keys, aux);
25   if (d == NULL) {
26     d = xbt_dynar_new(sizeof(char *), xbt_free);
27     xbt_dict_set(keys, aux, d, xbt_free);
28   }
29   //generate the key
30   static long long counter = 0;
31   snprintf(key, n, "%d%d%lld", src, dst, counter++);
32
33   xbt_dynar_insert_at(d, 0, xbt_strdup(key));
34   return key;
35 }
36
37 static char *TRACE_smpi_get_key(int src, int dst, char *key, int n)
38 {
39   char aux[100];
40   snprintf(aux, 100, "%d#%d", src, dst);
41   xbt_dynar_t d = xbt_dict_get_or_null(keys, aux);
42
43   int length = xbt_dynar_length(d);
44   char stored_key[n];
45   xbt_dynar_remove_at(d, length - 1, stored_key);
46   strncpy(key, stored_key, n);
47   return key;
48 }
49
50 void TRACE_smpi_alloc()
51 {
52   keys = xbt_dict_new();
53 }
54
55 void TRACE_smpi_start(void)
56 {
57   if (IS_TRACING_SMPI) {
58     TRACE_start();
59   }
60 }
61
62 void TRACE_smpi_release(void)
63 {
64   TRACE_surf_release();
65   if (IS_TRACING_SMPI) {
66     TRACE_end();
67   }
68 }
69
70 void TRACE_smpi_init(int rank)
71 {
72   if (!IS_TRACING_SMPI)
73     return;
74
75   char str[100];
76   TRACE_smpi_container(rank, str, 100);
77   pajeCreateContainer(SIMIX_get_clock(), str, "MPI_PROCESS",
78                       SIMIX_host_get_name(SIMIX_host_self()), str);
79 }
80
81 void TRACE_smpi_finalize(int rank)
82 {
83   if (!IS_TRACING_SMPI)
84     return;
85
86   char str[100];
87   pajeDestroyContainer(SIMIX_get_clock(), "MPI_PROCESS",
88                        TRACE_smpi_container(rank, str, 100));
89 }
90
91 void TRACE_smpi_collective_in(int rank, int root, const char *operation)
92 {
93   if (!IS_TRACING_SMPI)
94     return;
95
96   char str[100];
97   pajePushState(SIMIX_get_clock(), "MPI_STATE",
98                 TRACE_smpi_container(rank, str, 100), operation);
99 }
100
101 void TRACE_smpi_collective_out(int rank, int root, const char *operation)
102 {
103   if (!IS_TRACING_SMPI)
104     return;
105
106   char str[100];
107   pajePopState(SIMIX_get_clock(), "MPI_STATE",
108                TRACE_smpi_container(rank, str, 100));
109 }
110
111 void TRACE_smpi_ptp_in(int rank, int src, int dst, const char *operation)
112 {
113   if (!IS_TRACING_SMPI)
114     return;
115
116   char str[100];
117   pajePushState(SIMIX_get_clock(), "MPI_STATE",
118                 TRACE_smpi_container(rank, str, 100), operation);
119 }
120
121 void TRACE_smpi_ptp_out(int rank, int src, int dst, const char *operation)
122 {
123   if (!IS_TRACING_SMPI)
124     return;
125
126   char str[100];
127   pajePopState(SIMIX_get_clock(), "MPI_STATE",
128                TRACE_smpi_container(rank, str, 100));
129 }
130
131 void TRACE_smpi_send(int rank, int src, int dst)
132 {
133   if (!IS_TRACING_SMPI)
134     return;
135
136   char key[100], str[100];
137   TRACE_smpi_put_key(src, dst, key, 100);
138   pajeStartLink(SIMIX_get_clock(), "MPI_LINK", "0", "PTP",
139                 TRACE_smpi_container(src, str, 100), key);
140 }
141
142 void TRACE_smpi_recv(int rank, int src, int dst)
143 {
144   if (!IS_TRACING_SMPI)
145     return;
146
147   char key[100], str[100];
148   TRACE_smpi_get_key(src, dst, key, 100);
149   pajeEndLink(SIMIX_get_clock(), "MPI_LINK", "0", "PTP",
150               TRACE_smpi_container(dst, str, 100), key);
151 }
152 #endif