<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.Code, li.Code, div.Code
        {mso-style-name:Code;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:9.0pt;
        font-family:"Courier New";}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;
        font-weight:normal;
        font-style:normal;
        text-decoration:none none;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
.MsoPapDefault
        {mso-style-type:export-only;
        margin-top:6.0pt;
        margin-right:0cm;
        margin-bottom:6.0pt;
        margin-left:0cm;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:12.0pt">Doug<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt">Good stuff.   <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt">Do you know about ticky-ticky profiling?   It is /guaranteed/ not to affect optimisation.  Moreover you can mix modules compiled with and without profiling.  But it’s very low level.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt">I had not thought of doing /cost-centre/ profiling after optimisation.  That’s an interesting thought.  You’d still have to compile the entire program with profiling (because runtime representations change). 
 But you’d get the call-stack information etc that cost centres give you, but with a guarantee that optimisation was unaffected.  It’s a sort of middle ground.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt">Is the end of corePrepPgm the right place to insert the cost-centres? I chose it<br>
because it can't affect any core optimizations if it's last, but perhaps it<br>
could be earlier, or perhaps it needs to act on Stg?<br>
<br>
<span style="font-size:12.0pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt">I’d be inclined to do it on STG, just before codegen.  Because it really is a codgen tactic “compile this with cost centres please”.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:36.0pt">I need to strip (probably only non-user) ticks out of unfoldings before they are<br>
substituted into a module that uses -fprof-core.<span style="font-size:12.0pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt">Why?  If you are only adding these cost centres after CorePrep, or in STG, they will never show up in unfoldings anyway.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt">Simon<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span lang="EN-US"> ghc-devs [mailto:ghc-devs-bounces@haskell.org]
<b>On Behalf Of </b>Douglas Wilson<br>
<b>Sent:</b> 14 November 2017 22:34<br>
<b>To:</b> ghc-devs@haskell.org<br>
<b>Subject:</b> New core profiling mode<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
Hi ghc-devs,<br>
<br>
I've been working on a new mode of adding cost-centres to programs and I'd<br>
like to ask some questions and solicit some feedback. The code is here [fn:1],<br>
it works, provided one enables -fprof-core on all modules.<br>
<br>
I've recently been trying to pick some low hanging fruit from ghc compilation<br>
performance. A common frustration was in the difference between profiled and<br>
non-profiled builds. Often I thought had I found a problem in the profiled<br>
build, only to find it was optimized away in the non-profiled build. Several<br>
times an issue was tail-calls not happening in profiled builds.<br>
<br>
To solve this problem I've been working on a new way of inserting cost-centres:<br>
adding them to core after simplification (currently at the end of corePrepPgm)<br>
rather than adding them to HsSyn before simplification. This makes it harder to<br>
map cost-centres into source code (You have to -ddump-prep currently), but in<br>
exchange you are profiling the same core program as the non-profilied build.<br>
<br>
I intend to investigate whether I can use SourceNotes to create SrcSpans for the<br>
generated cost-centres to somewhat alleviate the need to inspect dumped core.<br>
<br>
There are several new flags:<br>
<br>
-fprof-core: Enables the aforementioned mode. This is mutually exclusive with<br>
-fprof-auto etc.<br>
<br>
-fprof-core-drop-ticks: Non-user ticks are dropped from unfoldings(though I<br>
  don't know how to do this yet).<br>
<br>
-fprof-core-tick-binds: ticks are inserted around the RHS of bindings (except<br>
  top-level unlifted bindings).<br>
<br>
-fprof-core-tick-cases: ticks are inserted around the scrutinees of cases.<br>
<br>
-fprof-core-tick-alts: ticks are inserted around Alt expressions (unless there<br>
  is only one).<br>
<br>
Some questions:<br>
<br>
I need to strip (probably only non-user) ticks out of unfoldings before they are<br>
substituted into a module that uses -fprof-core. Where is the right place to do<br>
this? I need inlining to proceed exactly as if the ticks were not present,<br>
however I don't want to strip ticks when the unfoldings are created as other<br>
modules may still need them.<br>
<br>
Is the end of corePrepPgm the right place to insert the cost-centres? I chose it<br>
because it can't affect any core optimizations if it's last, but perhaps it<br>
could be earlier, or perhaps it needs to act on Stg?<br>
<br>
Do you have any examples of programs for which existing profiling tools are<br>
inadequate due to how cost-centres affect simplification? There is an example in<br>
#12893 but something self-contained would be great!<br>
<br>
Regards,<br>
Doug Wilson<o:p></o:p></p>
</div>
</div>
</div>
</body>
</html>