From 7ae34e1b452c00830f54d1a665e4fb849ed04540 Mon Sep 17 00:00:00 2001 From: Evgeny Mankov Date: Sun, 29 Sep 2019 14:20:32 +0300 Subject: [PATCH] [HIPIFY][perl] Generate stat functions TODO: make statistics as much as similar to hipify-clang's [ROCm/hip commit: 849b2678a8d09ba571be479cf1615e5f53e8b2f0] --- .../hip/hipify-clang/src/CUDA2HIP_Perl.cpp | 39 ++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/projects/hip/hipify-clang/src/CUDA2HIP_Perl.cpp b/projects/hip/hipify-clang/src/CUDA2HIP_Perl.cpp index d1f4423887..db9831b315 100644 --- a/projects/hip/hipify-clang/src/CUDA2HIP_Perl.cpp +++ b/projects/hip/hipify-clang/src/CUDA2HIP_Perl.cpp @@ -124,8 +124,36 @@ namespace perl { *streamPtr.get() << "push(@whitelist, split(',', $whitelist));" << std::endl << std::endl; } + void generateStatFunctions(std::unique_ptr& streamPtr) { + *streamPtr.get() << std::endl << sSub << " totalStats" << " {" << std::endl; + *streamPtr.get() << tab << "my %count = %{ shift() };" << std::endl; + *streamPtr.get() << tab << "my $total = 0;" << std::endl; + *streamPtr.get() << tab << "foreach $key (keys %count) {" << std::endl; + *streamPtr.get() << double_tab << "$total += $count{$key};" << std::endl << tab << "}" << std::endl; + *streamPtr.get() << tab << "return $total;" << std::endl << "};" << std::endl; + *streamPtr.get() << std::endl << sSub << " printStats" << " {" << std::endl; + *streamPtr.get() << tab << "my $label = shift();" << std::endl; + *streamPtr.get() << tab << "my @statNames = @{ shift() };" << std::endl; + *streamPtr.get() << tab << "my %counts = %{ shift() };" << std::endl; + *streamPtr.get() << tab << "my $warnings = shift();" << std::endl; + *streamPtr.get() << tab << "my $loc = shift();" << std::endl; + *streamPtr.get() << tab << "my $total = totalStats(\\%counts);" << std::endl; + *streamPtr.get() << tab << "printf STDERR \"%s %d CUDA->HIP refs ( \", $label, $total;" << std::endl; + *streamPtr.get() << tab << "foreach $stat (@statNames) {" << std::endl; + *streamPtr.get() << double_tab << "printf STDERR \"%s:%d \", $stat, $counts{$stat};" << std::endl; + *streamPtr.get() << tab << "}" << std::endl; + *streamPtr.get() << tab << "printf STDERR \")\\n warn:%d LOC:%d\", $warnings, $loc;" << std::endl << "};" << std::endl; + for (int i = 0; i < 2; ++i) { + *streamPtr.get() << std::endl << sSub << " " << (i ? "clearStats" : "addStats") << " {" << std::endl; + *streamPtr.get() << tab << "my $dest_ref = shift();" << std::endl; + *streamPtr.get() << tab << (i ? "my @statNames = @{ shift() };" : "my %adder = %{ shift() };") << std::endl; + *streamPtr.get() << tab << "foreach " << (i ? "$stat(@statNames)" : "$key (keys %adder)") << " {" << std::endl; + *streamPtr.get() << double_tab << "$dest_ref->" << (i ? "{$stat} = 0;" : "{$key} += $adder{$key};") << std::endl << tab << "}" << std::endl << "};" << std::endl; + } + } + void generateHostFunctions(std::unique_ptr& streamPtr) { - *streamPtr.get() << std::endl << sSub << " transformHostFunctions" << std::endl << "{" << std::endl << tab << sMy; + *streamPtr.get() << std::endl << sSub << " transformHostFunctions" << "{" << std::endl << tab << sMy; std::set &funcSet = DeviceSymbolFunctions0; const std::string s0 = "$m += s/(?