mirror of
https://github.com/wolfpld/tracy
synced 2025-04-29 12:23:53 +00:00
Add a flag -g to export gpu zones to csv file
Signed-off-by: Liao <dezhliao@amd.com>
This commit is contained in:
parent
f583d1c855
commit
2020ef6c6e
@ -28,7 +28,8 @@ void print_usage_exit(int e)
|
|||||||
fprintf(stderr, " -s, --sep arg CSV separator (default: ,)\n");
|
fprintf(stderr, " -s, --sep arg CSV separator (default: ,)\n");
|
||||||
fprintf(stderr, " -c, --case Case sensitive filtering\n");
|
fprintf(stderr, " -c, --case Case sensitive filtering\n");
|
||||||
fprintf(stderr, " -e, --self Get self times\n");
|
fprintf(stderr, " -e, --self Get self times\n");
|
||||||
fprintf(stderr, " -u, --unwrap Report each zone event\n");
|
fprintf(stderr, " -u, --unwrap Report each cpu zone event\n");
|
||||||
|
fprintf(stderr, " -g, --gpu Report each gpu zone event\n" );
|
||||||
fprintf(stderr, " -m, --messages Report only messages\n");
|
fprintf(stderr, " -m, --messages Report only messages\n");
|
||||||
fprintf(stderr, " -p, --plot Report plot data (only with -u)\n");
|
fprintf(stderr, " -p, --plot Report plot data (only with -u)\n");
|
||||||
|
|
||||||
@ -42,6 +43,7 @@ struct Args {
|
|||||||
bool case_sensitive;
|
bool case_sensitive;
|
||||||
bool self_time;
|
bool self_time;
|
||||||
bool unwrap;
|
bool unwrap;
|
||||||
|
bool show_gpu;
|
||||||
bool unwrapMessages;
|
bool unwrapMessages;
|
||||||
bool plot;
|
bool plot;
|
||||||
};
|
};
|
||||||
@ -53,7 +55,7 @@ Args parse_args(int argc, char** argv)
|
|||||||
print_usage_exit(1);
|
print_usage_exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Args args = { "", ",", "", false, false, false, false };
|
Args args = { "", ",", "", false, false, false, false, false, false };
|
||||||
|
|
||||||
struct option long_opts[] = {
|
struct option long_opts[] = {
|
||||||
{ "help", no_argument, NULL, 'h' },
|
{ "help", no_argument, NULL, 'h' },
|
||||||
@ -62,13 +64,14 @@ Args parse_args(int argc, char** argv)
|
|||||||
{ "case", no_argument, NULL, 'c' },
|
{ "case", no_argument, NULL, 'c' },
|
||||||
{ "self", no_argument, NULL, 'e' },
|
{ "self", no_argument, NULL, 'e' },
|
||||||
{ "unwrap", no_argument, NULL, 'u' },
|
{ "unwrap", no_argument, NULL, 'u' },
|
||||||
|
{ "gpu", no_argument, NULL, 'g' },
|
||||||
{ "messages", no_argument, NULL, 'm' },
|
{ "messages", no_argument, NULL, 'm' },
|
||||||
{ "plot", no_argument, NULL, 'p' },
|
{ "plot", no_argument, NULL, 'p' },
|
||||||
{ NULL, 0, NULL, 0 }
|
{ NULL, 0, NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
int c;
|
int c;
|
||||||
while ((c = getopt_long(argc, argv, "hf:s:ceump", long_opts, NULL)) != -1)
|
while ((c = getopt_long(argc, argv, "hf:s:ceugmp", long_opts, NULL)) != -1)
|
||||||
{
|
{
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
@ -90,6 +93,9 @@ Args parse_args(int argc, char** argv)
|
|||||||
case 'u':
|
case 'u':
|
||||||
args.unwrap = true;
|
args.unwrap = true;
|
||||||
break;
|
break;
|
||||||
|
case 'g':
|
||||||
|
args.show_gpu = true;
|
||||||
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
args.unwrapMessages = true;
|
args.unwrapMessages = true;
|
||||||
break;
|
break;
|
||||||
@ -247,6 +253,8 @@ int main(int argc, char** argv)
|
|||||||
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!args.show_gpu)
|
||||||
|
{
|
||||||
auto& slz = worker.GetSourceLocationZones();
|
auto& slz = worker.GetSourceLocationZones();
|
||||||
tracy::Vector<decltype( slz.begin() )> slz_selected;
|
tracy::Vector<decltype( slz.begin() )> slz_selected;
|
||||||
slz_selected.reserve( slz.size() );
|
slz_selected.reserve( slz.size() );
|
||||||
@ -275,16 +283,12 @@ int main(int argc, char** argv)
|
|||||||
std::vector<const char*> columns;
|
std::vector<const char*> columns;
|
||||||
if( args.unwrap )
|
if( args.unwrap )
|
||||||
{
|
{
|
||||||
columns = {
|
columns = { "name", "src_file", "src_line", "ns_since_start", "exec_time_ns", "thread", "value" };
|
||||||
"name", "src_file", "src_line", "ns_since_start", "exec_time_ns", "thread", "value"
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
columns = {
|
columns = { "name", "src_file", "src_line", "total_ns", "total_perc",
|
||||||
"name", "src_file", "src_line", "total_ns", "total_perc",
|
"counts", "mean_ns", "min_ns", "max_ns", "std_ns" };
|
||||||
"counts", "mean_ns", "min_ns", "max_ns", "std_ns"
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
std::string header = join( columns, args.separator );
|
std::string header = join( columns, args.separator );
|
||||||
printf( "%s\n", header.data() );
|
printf( "%s\n", header.data() );
|
||||||
@ -305,7 +309,8 @@ int main(int argc, char** argv)
|
|||||||
if( args.unwrap )
|
if( args.unwrap )
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (const auto& zone_thread_data : zone_data.zones) {
|
for( const auto& zone_thread_data : zone_data.zones )
|
||||||
|
{
|
||||||
const auto zone_event = zone_thread_data.Zone();
|
const auto zone_event = zone_thread_data.Zone();
|
||||||
const auto tId = zone_thread_data.Thread();
|
const auto tId = zone_thread_data.Thread();
|
||||||
const auto start = zone_event->Start();
|
const auto start = zone_event->Start();
|
||||||
@ -314,7 +319,8 @@ int main(int argc, char** argv)
|
|||||||
values[3] = std::to_string( start );
|
values[3] = std::to_string( start );
|
||||||
|
|
||||||
auto timespan = end - start;
|
auto timespan = end - start;
|
||||||
if (args.self_time) {
|
if( args.self_time )
|
||||||
|
{
|
||||||
timespan -= GetZoneChildTimeFast( worker, *zone_event );
|
timespan -= GetZoneChildTimeFast( worker, *zone_event );
|
||||||
}
|
}
|
||||||
values[4] = std::to_string( timespan );
|
values[4] = std::to_string( timespan );
|
||||||
@ -332,8 +338,7 @@ int main(int argc, char** argv)
|
|||||||
|
|
||||||
values[5] = std::to_string( zone_data.zones.size() );
|
values[5] = std::to_string( zone_data.zones.size() );
|
||||||
|
|
||||||
const auto avg = (args.self_time ? zone_data.selfTotal : zone_data.total)
|
const auto avg = ( args.self_time ? zone_data.selfTotal : zone_data.total ) / zone_data.zones.size();
|
||||||
/ zone_data.zones.size();
|
|
||||||
values[6] = std::to_string( avg );
|
values[6] = std::to_string( avg );
|
||||||
|
|
||||||
const auto tmin = args.self_time ? zone_data.selfMin : zone_data.min;
|
const auto tmin = args.self_time ? zone_data.selfMin : zone_data.min;
|
||||||
@ -342,12 +347,9 @@ int main(int argc, char** argv)
|
|||||||
values[8] = std::to_string( tmax );
|
values[8] = std::to_string( tmax );
|
||||||
|
|
||||||
const auto sz = zone_data.zones.size();
|
const auto sz = zone_data.zones.size();
|
||||||
const auto ss = zone_data.sumSq
|
const auto ss = zone_data.sumSq - 2. * zone_data.total * avg + avg * avg * sz;
|
||||||
- 2. * zone_data.total * avg
|
|
||||||
+ avg * avg * sz;
|
|
||||||
double std = 0;
|
double std = 0;
|
||||||
if( sz > 1 )
|
if( sz > 1 ) std = sqrt( ss / ( sz - 1 ) );
|
||||||
std = sqrt(ss / (sz - 1));
|
|
||||||
values[9] = std::to_string( std );
|
values[9] = std::to_string( std );
|
||||||
|
|
||||||
std::string row = join( values, args.separator );
|
std::string row = join( values, args.separator );
|
||||||
@ -375,6 +377,67 @@ int main(int argc, char** argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else // only show gpu event statistics
|
||||||
|
{
|
||||||
|
auto& gpu_slz = worker.GetGpuSourceLocationZones();
|
||||||
|
tracy::Vector<decltype( gpu_slz.begin() )> gpu_slz_selected;
|
||||||
|
gpu_slz_selected.reserve( gpu_slz.size() );
|
||||||
|
|
||||||
|
uint32_t total_cnt = 0;
|
||||||
|
for( auto it = gpu_slz.begin(); it != gpu_slz.end(); ++it )
|
||||||
|
{
|
||||||
|
if( it->second.total != 0 )
|
||||||
|
{
|
||||||
|
++total_cnt;
|
||||||
|
if( args.filter[0] == '\0' )
|
||||||
|
{
|
||||||
|
gpu_slz_selected.push_back_no_space_check( it );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto name = get_name( it->first, worker );
|
||||||
|
if( is_substring( args.filter, name, args.case_sensitive ) )
|
||||||
|
{
|
||||||
|
gpu_slz_selected.push_back_no_space_check( it );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<const char*> columns;
|
||||||
|
columns = { "name", "src_file", "Time from start of program", "GPU execution time"};
|
||||||
|
|
||||||
|
std::string header = join( columns, args.separator );
|
||||||
|
printf( "%s\n", header.data() );
|
||||||
|
|
||||||
|
const auto last_time = worker.GetLastTime();
|
||||||
|
for( auto& it : gpu_slz_selected )
|
||||||
|
{
|
||||||
|
std::vector<std::string> values( columns.size() );
|
||||||
|
|
||||||
|
values[0] = get_name( it->first, worker );
|
||||||
|
|
||||||
|
const auto& srcloc = worker.GetSourceLocation( it->first );
|
||||||
|
values[1] = worker.GetString( srcloc.file );
|
||||||
|
|
||||||
|
const auto& zone_data = it->second;
|
||||||
|
for( const auto& zone_thread_data : zone_data.zones )
|
||||||
|
{
|
||||||
|
tracy::GpuEvent* gpu_event = zone_thread_data.Zone();
|
||||||
|
const auto start = gpu_event->GpuStart();
|
||||||
|
const auto end = gpu_event->GpuEnd();
|
||||||
|
|
||||||
|
values[2] = std::to_string( start );
|
||||||
|
|
||||||
|
auto timespan = end - start;
|
||||||
|
values[3] = std::to_string( timespan );
|
||||||
|
|
||||||
|
std::string row = join( values, args.separator );
|
||||||
|
printf( "%s\n", row.data() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user