52
52
#endif
53
53
54
54
namespace color = tim::log::color;
55
- using tim::log::stream;
56
55
using namespace timemory ::join;
57
56
using tim::get_env;
57
+ using tim::log::colorized;
58
+ using tim::log::stream;
58
59
59
60
namespace
60
61
{
61
- int verbose = 0 ;
62
- }
62
+ int verbose = 0 ;
63
+ auto updated_envs = std::set<std::string_view>{};
64
+ auto original_envs = std::set<std::string>{};
65
+ } // namespace
63
66
64
67
std::string
65
68
get_command (const char * _argv0)
@@ -92,7 +95,11 @@ get_initial_environment()
92
95
{
93
96
int idx = 0 ;
94
97
while (environ[idx] != nullptr )
95
- _env.emplace_back (strdup (environ[idx++]));
98
+ {
99
+ auto * _v = environ[idx++];
100
+ original_envs.emplace (_v);
101
+ _env.emplace_back (strdup (_v));
102
+ }
96
103
}
97
104
98
105
update_env (_env, " LD_PRELOAD" ,
@@ -106,22 +113,25 @@ get_initial_environment()
106
113
update_env (_env, " OMNITRACE_USE_SAMPLING" , true );
107
114
update_env (_env, " OMNITRACE_CRITICAL_TRACE" , false );
108
115
update_env (_env, " OMNITRACE_USE_PROCESS_SAMPLING" , false );
116
+
109
117
// update_env(_env, "OMNITRACE_USE_PID", false);
110
118
// update_env(_env, "OMNITRACE_TIME_OUTPUT", false);
111
119
// update_env(_env, "OMNITRACE_OUTPUT_PATH", "omnitrace-output/%tag%/%launch_time%");
112
120
113
121
#if defined(OMNITRACE_USE_ROCTRACER) || defined(OMNITRACE_USE_ROCPROFILER)
114
122
update_env (_env, " HSA_TOOLS_LIB" , _dl_libpath);
115
- update_env (_env, " HSA_TOOLS_REPORT_LOAD_FAILURE" , " 1" );
123
+ if (!getenv (" HSA_TOOLS_REPORT_LOAD_FAILURE" ))
124
+ update_env (_env, " HSA_TOOLS_REPORT_LOAD_FAILURE" , " 1" );
116
125
#endif
117
126
118
127
#if defined(OMNITRACE_USE_ROCPROFILER)
119
128
update_env (_env, " ROCP_TOOL_LIB" , _omni_libpath);
120
- update_env (_env, " ROCP_HSA_INTERCEPT" , " 1" );
129
+ if (! getenv ( " ROCP_HSA_INTERCEPT " )) update_env (_env, " ROCP_HSA_INTERCEPT" , " 1" );
121
130
#endif
122
131
123
132
#if defined(OMNITRACE_USE_OMPT)
124
- update_env (_env, " OMP_TOOL_LIBRARIES" , _dl_libpath);
133
+ if (!getenv (" OMP_TOOL_LIBRARIES" ))
134
+ update_env (_env, " OMP_TOOL_LIBRARIES" , _dl_libpath, true );
125
135
#endif
126
136
127
137
free (_dl_libpath);
@@ -140,11 +150,58 @@ get_internal_libpath(const std::string& _lib)
140
150
return omnitrace::common::join (" /" , _dir, " .." , " lib" , _lib);
141
151
}
142
152
153
+ void
154
+ print_updated_environment (std::vector<char *> _env)
155
+ {
156
+ std::sort (_env.begin (), _env.end (), [](auto * _lhs, auto * _rhs) {
157
+ if (!_lhs) return false ;
158
+ if (!_rhs) return true ;
159
+ return std::string_view{ _lhs } < std::string_view{ _rhs };
160
+ });
161
+
162
+ std::vector<char *> _updates = {};
163
+ std::vector<char *> _general = {};
164
+
165
+ for (auto * itr : _env)
166
+ {
167
+ if (itr == nullptr ) continue ;
168
+
169
+ auto _is_omni = (std::string_view{ itr }.find (" OMNITRACE" ) == 0 );
170
+ auto _updated = false ;
171
+ for (const auto & vitr : updated_envs)
172
+ {
173
+ if (std::string_view{ itr }.find (vitr) == 0 )
174
+ {
175
+ _updated = true ;
176
+ break ;
177
+ }
178
+ }
179
+
180
+ if (_updated)
181
+ _updates.emplace_back (itr);
182
+ else if (verbose >= 1 && _is_omni)
183
+ _general.emplace_back (itr);
184
+ }
185
+
186
+ if (_general.size () + _updates.size () == 0 || verbose < 0 ) return ;
187
+
188
+ std::cerr << std::endl;
189
+
190
+ for (auto & itr : _general)
191
+ stream (std::cerr, color::source ()) << itr << " \n " ;
192
+ for (auto & itr : _updates)
193
+ stream (std::cerr, color::source ()) << itr << " \n " ;
194
+
195
+ std::cerr << std::endl;
196
+ }
197
+
143
198
template <typename Tp>
144
199
void
145
200
update_env (std::vector<char *>& _environ, std::string_view _env_var, Tp&& _env_val,
146
201
bool _append)
147
202
{
203
+ updated_envs.emplace (_env_var);
204
+
148
205
auto _key = join (" " , _env_var, " =" );
149
206
for (auto & itr : _environ)
150
207
{
@@ -153,11 +210,13 @@ update_env(std::vector<char*>& _environ, std::string_view _env_var, Tp&& _env_va
153
210
{
154
211
if (_append)
155
212
{
156
- auto _val = std::string{ itr }.substr (_key.length ());
157
- free (itr);
158
- itr = strdup (
159
- omnitrace::common::join (' =' , _env_var, join (" :" , _env_val, _val))
160
- .c_str ());
213
+ if (std::string_view{ itr }.find (join (" " , _env_val)) ==
214
+ std::string_view::npos)
215
+ {
216
+ auto _val = std::string{ itr }.substr (_key.length ());
217
+ free (itr);
218
+ itr = strdup (join (' =' , _env_var, join (" :" , _env_val, _val)).c_str ());
219
+ }
161
220
}
162
221
else
163
222
{
@@ -171,6 +230,22 @@ update_env(std::vector<char*>& _environ, std::string_view _env_var, Tp&& _env_va
171
230
strdup (omnitrace::common::join (' =' , _env_var, _env_val).c_str ()));
172
231
}
173
232
233
+ void
234
+ remove_env (std::vector<char *>& _environ, std::string_view _env_var)
235
+ {
236
+ auto _key = join (" " , _env_var, " =" );
237
+ auto _match = [&_key](auto itr) { return std::string_view{ itr }.find (_key) == 0 ; };
238
+
239
+ _environ.erase (std::remove_if (_environ.begin (), _environ.end (), _match),
240
+ _environ.end ());
241
+
242
+ for (const auto & itr : original_envs)
243
+ {
244
+ if (std::string_view{ itr }.find (_key) == 0 )
245
+ _environ.emplace_back (strdup (itr.c_str ()));
246
+ }
247
+ }
248
+
174
249
std::vector<char *>
175
250
parse_args (int argc, char ** argv, std::vector<char *>& _env)
176
251
{
@@ -200,6 +275,11 @@ parse_args(int argc, char** argv, std::vector<char*>& _env)
200
275
exit (_pec);
201
276
};
202
277
278
+ auto * _dl_libpath =
279
+ realpath (get_internal_libpath (" libomnitrace-dl.so" ).c_str (), nullptr );
280
+ auto * _omni_libpath =
281
+ realpath (get_internal_libpath (" libomnitrace.so" ).c_str (), nullptr );
282
+
203
283
auto parser = parser_t (argv[0 ]);
204
284
205
285
parser.on_error ([](parser_t &, const parser_err_t & _err) {
@@ -273,6 +353,7 @@ parse_args(int argc, char** argv, std::vector<char*>& _env)
273
353
.dtype (" bool" )
274
354
.action ([&](parser_t & p) {
275
355
auto _colorized = !p.get <bool >(" monochrome" );
356
+ colorized () = _colorized;
276
357
p.set_use_color (_colorized);
277
358
update_env (_env, " OMNITRACE_COLORIZED_LOG" , (_colorized) ? " 1" : " 0" );
278
359
update_env (_env, " COLORIZED_LOG" , (_colorized) ? " 1" : " 0" );
@@ -599,6 +680,12 @@ parse_args(int argc, char** argv, std::vector<char*>& _env)
599
680
_update (" OMNITRACE_TRACE_THREAD_LOCKS" , _v.count (" mutex-locks" ) > 0 );
600
681
_update (" OMNITRACE_TRACE_THREAD_RW_LOCKS" , _v.count (" rw-locks" ) > 0 );
601
682
_update (" OMNITRACE_TRACE_THREAD_SPIN_LOCKS" , _v.count (" spin-locks" ) > 0 );
683
+
684
+ if (_v.count (" all" ) > 0 || _v.count (" ompt" ) > 0 )
685
+ update_env (_env, " OMP_TOOL_LIBRARIES" , _dl_libpath, true );
686
+
687
+ if (_v.count (" all" ) > 0 || _v.count (" kokkosp" ) > 0 )
688
+ update_env (_env, " KOKKOS_PROFILE_LIBRARY" , _omni_libpath, true );
602
689
});
603
690
604
691
parser.add_argument ({ " -E" , " --exclude" }, " Exclude data from these backends" )
@@ -619,14 +706,32 @@ parse_args(int argc, char** argv, std::vector<char*>& _env)
619
706
_update (" OMNITRACE_TRACE_THREAD_LOCKS" , _v.count (" mutex-locks" ) > 0 );
620
707
_update (" OMNITRACE_TRACE_THREAD_RW_LOCKS" , _v.count (" rw-locks" ) > 0 );
621
708
_update (" OMNITRACE_TRACE_THREAD_SPIN_LOCKS" , _v.count (" spin-locks" ) > 0 );
709
+
710
+ if (_v.count (" all" ) > 0 ||
711
+ (_v.count (" roctracer" ) > 0 && _v.count (" rocprofiler" ) > 0 ))
712
+ {
713
+ remove_env (_env, " HSA_TOOLS_LIB" );
714
+ remove_env (_env, " HSA_TOOLS_REPORT_LOAD_FAILURE" );
715
+ }
716
+
717
+ if (_v.count (" all" ) > 0 || _v.count (" rocprofiler" ) > 0 )
718
+ {
719
+ remove_env (_env, " ROCP_TOOL_LIB" );
720
+ remove_env (_env, " ROCP_HSA_INTERCEPT" );
721
+ }
722
+
723
+ if (_v.count (" all" ) > 0 || _v.count (" ompt" ) > 0 )
724
+ remove_env (_env, " OMP_TOOL_LIBRARIES" );
725
+
726
+ if (_v.count (" all" ) > 0 || _v.count (" kokkosp" ) > 0 )
727
+ remove_env (_env, " KOKKOS_PROFILE_LIBRARY" );
622
728
});
623
729
624
730
_add_separator (" HARDWARE COUNTER OPTIONS" , " " );
625
731
parser
626
732
.add_argument ({ " -C" , " --cpu-events" },
627
733
" Set the CPU hardware counter events to record (ref: "
628
734
" `omnitrace-avail -H -c CPU`)" )
629
- .set_default (std::set<std::string>{})
630
735
.action ([&](parser_t & p) {
631
736
auto _events =
632
737
join (array_config{ " ," }, p.get <std::vector<std::string>>(" cpu-events" ));
@@ -638,7 +743,6 @@ parse_args(int argc, char** argv, std::vector<char*>& _env)
638
743
.add_argument ({ " -G" , " --gpu-events" },
639
744
" Set the GPU hardware counter events to record (ref: "
640
745
" `omnitrace-avail -H -c GPU`)" )
641
- .set_default (std::set<std::string>{})
642
746
.action ([&](parser_t & p) {
643
747
auto _events =
644
748
join (array_config{ " ," }, p.get <std::vector<std::string>>(" gpu-events" ));
@@ -695,5 +799,8 @@ parse_args(int argc, char** argv, std::vector<char*>& _env)
695
799
throw std::runtime_error (
696
800
" Error! '--profile' argument conflicts with '--flat-profile' argument" );
697
801
802
+ free (_dl_libpath);
803
+ free (_omni_libpath);
804
+
698
805
return _outv;
699
806
}
0 commit comments