<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>Hi all,</div><div><br></div>Let me rebase this patch, because due to the memory cost patch there has been some churn.<div><br></div><div><br><div><div>On Feb 7, 2013, at 1:32 PM, Renato Golin <<a href="mailto:renato.golin@linaro.org">renato.golin@linaro.org</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr">On 7 February 2013 14:31, Arnold <span dir="ltr"><<a href="mailto:aschwaighofer@apple.com" target="_blank">aschwaighofer@apple.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="auto" style="word-wrap:break-word"><div class="im">
<div><span style="color:rgb(34,34,34)">I agree with you, it is unfortunate. However, I am trying to model an idiosyncrasy of the processor that has a big implication on performance. It is very expensive on swift if you happen to load into a S register, or D sub lane. Two such instructions are not pipelined but sequentialized.</span></div>
</div></div></blockquote><div><br></div><div style="">In that case, the cost will be much more than 2 or 3, no?       </div><div><br></div><div><br></div></div></div></div></blockquote><div><br></div>3 is a number based on the architecture. 2 was just saying assume double the cost. But yeah, it is just a guess in the wind. I don't want to make it to expensive though, because I have to penalize all inserts even those that are not really effected (not coming from a load).</div><div>What we are saying here is that throughput of this instruction is estimated three times as low. This matters if the code is dominated by this instruction.</div><div><br></div><div>And the code where this matters is not so special. Any code that has a gather in it (and is mostly dominated by it) will suffer from it:</div><div><br></div><div><div>void example14(int **in, int **coeff, int *out) {</div><div>  int k,j,i=0;</div><div>  for (k = 0; k < K; k++) {</div><div>    int sum = 0;</div><div>    for (j = 0; j < M; j++)</div><div>      for (i = 0; i < N/64; i++)</div><div>          sum += in[i+k][j] * coeff[i][j];</div><div><br></div><div>    out[k] = sum;</div><div>  }</div><div><br></div><div>}</div></div><div><br></div><div><br></div><div><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="auto" style="word-wrap:break-word"><div class="im"><span style="color:rgb(34,34,34)">Stride has the value of the isConsecutivePtr method:</span></div></div></blockquote><div><br></div></div></div></div></blockquote><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div style="">Ok, in the original code you had:</div>
<div style=""><br></div><div style="">if (Stride < 0)</div><div style="">  return parent::cost();</div><div style="">return Cost;</div><div style=""><br></div><div style="">In this you have:</div><div style=""><br></div><div style=""><div>if (Stride > 0)</div>
<div>  return Cost;<br></div><div>return parent::cost();</div><div><br></div><div style="">It seems you're missing the case where it's == 0, but I can't tell which way it should go.</div></div></div></div></div></blockquote><div><br></div><div>We don't get here with a zero stride. This will become clear again if I rebase this patch</div><div><br></div><div><div>if ((Stride = Legality->isConsecutivePtr(PointerOperand)))</div><div>         return costOfWideMemInst();</div><div><br></div><div><div>+    /// \return the cost of a vector memory instruction.</div><div>+    unsigned costOfWideMemInst() {</div><div>+      // We assume that address computation is involved.</div><div>+      unsigned Cost = TTI.getAddressComputationCost(VectorTy) +</div><div>+        TTI.getMemoryOpCost(Opcode, VectorTy, Alignment, AddressSpace);</div><div>+</div><div>+      if (Stride > 0)</div><div>+        return Cost;</div><div>+</div><div>+      // Reverse stride.</div><div>+      Cost += TTI.getShuffleCost(TargetTransformInfo::SK_Reverse, VectorTy, 0);</div><div>+      return Cost;</div><div>+    }</div></div></div><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div style=""><div style=""><br></div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="auto" style="word-wrap:break-word">
<div>I don't think we need a function call for the value 3 here. It is a value just like any other that is returned by TTI.<br></div></div></blockquote><div><br></div><div style="">What I'm trying to say is that this value seems to come out of the blue. I could be wrong, obviously, but it seems to me that you're experimenting with a micro-benchmark and fine-tuning to your particular example, which is dangerous on a wider perspective.</div>
<div style=""><br></div><div style="">I understand that this might be a big hit on a set of examples, but we should get some constants out, just to make it clear that we're not talking about "idealized cycle count", but something else entirely.</div>
<div style=""><br></div><div style="">Like:</div><div style=""><br></div><div style="">const int AVOID_AT_ALL_COSTS = 100;</div><div style="">const int DANGEROUS_IN_MOST_CASES = 10;</div><div style="">const int NOT_GOOD_BUT_COULD_BE_OK = 5;</div>
<div style=""><br></div><div style="">etc…</div></div></div></div></blockquote><div><br></div>I am not sure about this. We are talking about estimated throughput of an instruction.</div><div><br></div><div><br><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div style=""><br></div><div style="">cheers,</div><div style="">--renato</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="auto" style="word-wrap:break-word"><blockquote type="cite">
</blockquote></div></blockquote></div></div></div>
</blockquote></div><br></div></body></html>