Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
gaoqiong
MIGraphX
Commits
884d3eb1
Commit
884d3eb1
authored
May 12, 2022
by
umangyadav
Browse files
fix errors and add another environment variable for dump_passes
parent
751fd21a
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
58 additions
and
23 deletions
+58
-23
src/include/migraphx/program.hpp
src/include/migraphx/program.hpp
+1
-1
src/include/migraphx/tracer.hpp
src/include/migraphx/tracer.hpp
+34
-9
src/pass_manager.cpp
src/pass_manager.cpp
+19
-11
src/program.cpp
src/program.cpp
+3
-1
test/verify/run_verify.cpp
test/verify/run_verify.cpp
+1
-1
No files found.
src/include/migraphx/program.hpp
View file @
884d3eb1
...
@@ -17,8 +17,8 @@
...
@@ -17,8 +17,8 @@
namespace
migraphx
{
namespace
migraphx
{
inline
namespace
MIGRAPHX_INLINE_NS
{
inline
namespace
MIGRAPHX_INLINE_NS
{
MIGRAPHX_DECLARE_ENV_VAR
(
MIGRAPHX_TRACE_COMPILE
)
MIGRAPHX_DECLARE_ENV_VAR
(
MIGRAPHX_TRACE_COMPILE
)
MIGRAPHX_DECLARE_ENV_VAR
(
MIGRAPHX_DUMP_PASSES_TO_FILE
)
MIGRAPHX_DECLARE_ENV_VAR
(
MIGRAPHX_TRACE_EVAL
)
MIGRAPHX_DECLARE_ENV_VAR
(
MIGRAPHX_TRACE_EVAL
)
struct
program_impl
;
struct
program_impl
;
...
...
src/include/migraphx/tracer.hpp
View file @
884d3eb1
...
@@ -2,6 +2,9 @@
...
@@ -2,6 +2,9 @@
#define MIGRAPHX_GUARD_RTGLIB_TRACER_HPP
#define MIGRAPHX_GUARD_RTGLIB_TRACER_HPP
#include <fstream>
#include <fstream>
#include <iostream>
#include <ostream>
#include <migraphx/requires.hpp>
#include <migraphx/functional.hpp>
#include <migraphx/functional.hpp>
#include <migraphx/config.hpp>
#include <migraphx/config.hpp>
#include <migraphx/filesystem.hpp>
#include <migraphx/filesystem.hpp>
...
@@ -12,36 +15,58 @@ struct tracer
...
@@ -12,36 +15,58 @@ struct tracer
{
{
tracer
()
{}
tracer
()
{}
tracer
(
std
::
ostream
&
s
)
:
os
(
&
s
)
{}
tracer
(
const
std
::
string
&
dump_directory
)
tracer
(
const
std
::
string
&
dump_directory
)
:
dump_dir
(
dump_directory
),
counter
(
0
),
dir_path
(
fs
::
current_path
()
/
dump_directory
)
:
dump_dir
(
dump_directory
),
counter
(
0
),
dir_path
(
fs
::
current_path
()
/
dump_directory
)
{
{
if
(
fs
::
exists
(
dir_path
))
if
(
!
dump_dir
.
empty
()
&&
fs
::
exists
(
dir_path
))
{
{
fs
::
remove_all
(
dir_path
);
fs
::
remove_all
(
dir_path
);
}
}
fs
::
create_directories
(
dir_path
);
fs
::
create_directories
(
dir_path
);
}
}
// file_stream
bool
fs_enabled
()
const
{
return
!
dump_dir
.
empty
()
&&
!
os_enabled
();
}
// output_stream
bool
os_enabled
()
const
{
return
os
&&
!
fs_enabled
();}
bool
enabled
()
const
{
return
fs_enabled
()
or
os_enabled
();};
bool
enabled
()
const
{
return
!
dump_dir
.
empty
();
}
/*
Dump any string to ostream, used for debug build or debugging purposes.
*/
void
operator
()(
const
std
::
string
&
s
=
""
)
const
{
std
::
cout
<<
s
<<
std
::
endl
;
}
template
<
class
...
Ts
>
/*
void
operator
()(
const
std
::
string
&
program_name
,
const
Ts
&
...
xs
)
Based on user's envrionment flags, either dump IR passes' output to a file or ostream i.e. cout or cerr,
:param pass_file_name : file_name to be used when dumping IR pass to a file, this param is not used when IR is
dumped to ostream.
*/
template
<
class
...
Ts
,
MIGRAPHX_REQUIRES
((
sizeof
...(
Ts
)
>
0
))
>
void
operator
()(
const
std
::
string
&
pass_file_name
,
const
Ts
&
...
xs
)
{
{
if
(
this
->
enabled
())
if
(
fs_
enabled
())
{
{
fs
::
path
ir_file_path
=
fs
::
path
ir_file_path
=
this
->
dir_path
/
(
std
::
to_string
(
this
->
counter
++
)
+
"_"
+
p
rogram
_name
+
".mxr"
);
dir_path
/
(
std
::
to_string
(
counter
++
)
+
"_"
+
p
ass_file
_name
+
".mxr"
);
std
::
ofstream
ofs
(
ir_file_path
);
std
::
ofstream
ofs
(
ir_file_path
);
swallow
{
ofs
<<
xs
...};
swallow
{
ofs
<<
xs
...};
ofs
<<
std
::
endl
;
ofs
<<
std
::
endl
;
ofs
.
close
();
ofs
.
close
();
}
else
if
(
os_enabled
())
{
swallow
{
*
os
<<
xs
...};
*
os
<<
std
::
endl
;
}
}
}
}
std
::
string
dump_dir
;
std
::
string
dump_dir
=
""
;
private:
private:
uint
counter
;
uint
counter
=
0
;
fs
::
path
dir_path
;
std
::
ostream
*
os
=
nullptr
;
fs
::
path
dir_path
=
""
;
};
};
}
// namespace MIGRAPHX_INLINE_NS
}
// namespace MIGRAPHX_INLINE_NS
...
...
src/pass_manager.cpp
View file @
884d3eb1
...
@@ -18,12 +18,12 @@ inline namespace MIGRAPHX_INLINE_NS {
...
@@ -18,12 +18,12 @@ inline namespace MIGRAPHX_INLINE_NS {
MIGRAPHX_DECLARE_ENV_VAR
(
MIGRAPHX_TRACE_PASSES
);
MIGRAPHX_DECLARE_ENV_VAR
(
MIGRAPHX_TRACE_PASSES
);
void
validate_pass
(
module
&
mod
,
const
pass
&
p
)
void
validate_pass
(
module
&
mod
,
const
pass
&
p
,
tracer
trace
)
{
{
(
void
)
mod
;
(
void
)
mod
;
(
void
)
p
;
(
void
)
p
;
#ifndef NDEBUG
#ifndef NDEBUG
std
::
cout
<<
"Validate..."
<<
std
::
endl
;
trace
(
"Validate..."
)
;
auto
invalid
=
mod
.
validate
();
auto
invalid
=
mod
.
validate
();
if
(
invalid
!=
mod
.
end
())
if
(
invalid
!=
mod
.
end
())
{
{
...
@@ -31,13 +31,17 @@ void validate_pass(module& mod, const pass& p)
...
@@ -31,13 +31,17 @@ void validate_pass(module& mod, const pass& p)
MIGRAPHX_THROW
(
p
.
name
()
+
" pass produces invalid program at instruction "
+
MIGRAPHX_THROW
(
p
.
name
()
+
" pass produces invalid program at instruction "
+
std
::
to_string
(
index
)
+
": "
+
invalid
->
name
());
std
::
to_string
(
index
)
+
": "
+
invalid
->
name
());
}
}
trace
();
#endif
#endif
}
}
void
run_pass
(
program
&
prog
,
const
pass
&
p
,
tracer
&
trace
)
void
run_pass
(
program
&
prog
,
const
pass
&
p
,
tracer
&
trace
)
{
{
auto
t_start
=
std
::
chrono
::
high_resolution_clock
::
now
();
p
.
apply
(
prog
);
p
.
apply
(
prog
);
trace
(
p
.
name
(),
prog
);
auto
t_end
=
std
::
chrono
::
high_resolution_clock
::
now
();
double
elapsed_time_ms
=
std
::
chrono
::
duration
<
double
,
std
::
milli
>
(
t_end
-
t_start
).
count
();
trace
(
p
.
name
(),
"Pass: "
,
p
.
name
(),
"
\n
"
,
prog
,
"Elapsed Wall Time (ms): "
,
elapsed_time_ms
,
"
\n
"
);
}
}
struct
module_pm
:
module_pass_manager
struct
module_pm
:
module_pass_manager
...
@@ -72,9 +76,12 @@ struct module_pm : module_pass_manager
...
@@ -72,9 +76,12 @@ struct module_pm : module_pass_manager
{
{
assert
(
mod
);
assert
(
mod
);
assert
(
mod
->
validate
()
==
mod
->
end
());
assert
(
mod
->
validate
()
==
mod
->
end
());
auto
t_start
=
std
::
chrono
::
high_resolution_clock
::
now
();
p
.
apply
(
*
this
);
p
.
apply
(
*
this
);
trace
(
p
.
name
(),
*
mod
);
auto
t_end
=
std
::
chrono
::
high_resolution_clock
::
now
();
validate_pass
(
*
mod
,
p
);
double
elapsed_time_ms
=
std
::
chrono
::
duration
<
double
,
std
::
milli
>
(
t_end
-
t_start
).
count
();
trace
(
p
.
name
(),
"Module: "
,
mod
->
name
(),
", Pass: "
,
p
.
name
(),
"
\n
"
,
*
mod
,
"Elapsed Wall Time (ms): "
,
elapsed_time_ms
);
validate_pass
(
*
mod
,
p
,
*
t
);
}
}
};
};
...
@@ -83,7 +90,7 @@ module& get_module(module_pass_manager& mpm) { return mpm.get_module(); }
...
@@ -83,7 +90,7 @@ module& get_module(module_pass_manager& mpm) { return mpm.get_module(); }
void
run_passes
(
module
&
mod
,
const
std
::
vector
<
pass
>&
passes
,
tracer
trace
)
void
run_passes
(
module
&
mod
,
const
std
::
vector
<
pass
>&
passes
,
tracer
trace
)
{
{
if
(
enabled
(
MIGRAPHX_TRACE_PASSES
{})
and
not
trace
.
enabled
())
if
(
enabled
(
MIGRAPHX_TRACE_PASSES
{})
and
not
trace
.
enabled
())
trace
=
tracer
{
mod
.
name
()
+
"_passes"
};
trace
=
tracer
{
std
::
cout
};
for
(
const
auto
&
p
:
passes
)
for
(
const
auto
&
p
:
passes
)
{
{
module_pm
{
&
mod
,
nullptr
,
&
trace
}.
run_pass
(
p
);
module_pm
{
&
mod
,
nullptr
,
&
trace
}.
run_pass
(
p
);
...
@@ -93,17 +100,18 @@ void run_passes(module& mod, const std::vector<pass>& passes, tracer trace)
...
@@ -93,17 +100,18 @@ void run_passes(module& mod, const std::vector<pass>& passes, tracer trace)
void
run_passes
(
program
&
prog
,
const
std
::
vector
<
pass
>&
passes
,
tracer
trace
)
void
run_passes
(
program
&
prog
,
const
std
::
vector
<
pass
>&
passes
,
tracer
trace
)
{
{
if
(
enabled
(
MIGRAPHX_TRACE_PASSES
{})
and
not
trace
.
enabled
())
if
(
enabled
(
MIGRAPHX_TRACE_PASSES
{})
and
not
trace
.
enabled
())
trace
=
tracer
{
"passes"
};
trace
=
tracer
{
std
::
cout
};
std
::
unordered_map
<
std
::
string
,
tracer
>
module_tracer_map
;
std
::
unordered_map
<
std
::
string
,
tracer
>
module_tracer_map
;
for
(
const
auto
&
p
:
passes
)
for
(
const
auto
&
p
:
passes
)
{
{
auto
mods
=
prog
.
get_modules
();
auto
mods
=
prog
.
get_modules
();
for
(
const
auto
&
mod
:
reverse
(
mods
))
for
(
const
auto
&
mod
:
reverse
(
mods
))
{
{
if
(
module_tracer_map
.
find
(
mod
->
name
())
==
module_tracer_map
.
end
())
// Set tracer for module passes, if tracer is set to output to file stream then set name of the dump directory.
{
// For file dumps, tracer object internally sets the counter for the individual passes' file dumps.
module_tracer_map
[
mod
->
name
()
]
=
if
(
module_tracer_map
.
find
(
mod
->
name
()
)
=
=
module_tracer_map
.
end
())
{
tracer
{
trace
.
enabled
()
?
trace
.
dump_dir
+
"/"
+
mod
->
name
()
:
""
}
;
module_tracer_map
[
mod
->
name
()]
=
trace
.
fs_
enabled
()
?
tracer
{
trace
.
dump_dir
+
"/"
+
mod
->
name
()
}
:
trace
;
}
}
if
(
mod
->
bypass
())
if
(
mod
->
bypass
())
continue
;
continue
;
...
...
src/program.cpp
View file @
884d3eb1
...
@@ -143,8 +143,10 @@ void program::compile(const target& t, compile_options options, const std::strin
...
@@ -143,8 +143,10 @@ void program::compile(const target& t, compile_options options, const std::strin
assert
(
not
this
->
is_compiled
());
assert
(
not
this
->
is_compiled
());
this
->
impl
->
target_name
=
t
.
name
();
this
->
impl
->
target_name
=
t
.
name
();
this
->
impl
->
ctx
=
t
.
get_context
();
this
->
impl
->
ctx
=
t
.
get_context
();
if
(
enabled
(
MIGRAPHX_
TRACE_COMP
ILE
{}))
if
(
enabled
(
MIGRAPHX_
DUMP_PASSES_TO_F
ILE
{}))
options
.
trace
=
tracer
{
t
.
name
()
+
"_"
+
ir_dump_path
};
options
.
trace
=
tracer
{
t
.
name
()
+
"_"
+
ir_dump_path
};
else
if
(
enabled
(
MIGRAPHX_TRACE_COMPILE
{}))
options
.
trace
=
tracer
{
std
::
cout
};
options
.
trace
(
"input_program"
,
*
this
);
options
.
trace
(
"input_program"
,
*
this
);
...
...
test/verify/run_verify.cpp
View file @
884d3eb1
...
@@ -41,7 +41,7 @@ inline void compile_check(migraphx::program& p, const migraphx::target& t, bool
...
@@ -41,7 +41,7 @@ inline void compile_check(migraphx::program& p, const migraphx::target& t, bool
std
::
stringstream
ss
;
std
::
stringstream
ss
;
migraphx
::
compile_options
options
;
migraphx
::
compile_options
options
;
if
(
show_trace
)
if
(
show_trace
)
options
.
trace
=
migraphx
::
tracer
{
t
.
name
()
+
"_passes"
};
options
.
trace
=
migraphx
::
tracer
{
std
::
cout
};
p
.
compile
(
t
,
options
);
p
.
compile
(
t
,
options
);
if
(
shapes
.
size
()
!=
p
.
get_output_shapes
().
size
())
if
(
shapes
.
size
()
!=
p
.
get_output_shapes
().
size
())
{
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment