<div dir="ltr"><div>Hi Michael,<br><br>&gt; If you are interested in the perf difference with ARC atomics, Roman recently added a mode to the compiler called -assume-single-threaded that uses non-atomic reference counts anywhere.<br><br>I think that is not exactly true.   As of now, -assume-single-threaded option can eliminate atomic reference counts only for reference types. <br><br>I tried -assume-single-threaded for compiling applications as well as swift runtime, and found that atomic reference counts were still used for value types and improvements were limited because of them.<br><br>SIL Instructions on value types (such as CopyValue) are not subtype of RefCountingInst, therefore they don&#39;t have a mechanism to represent atomicity.  COW requires reference counts and, because of the lack of information, atomic reference counts are assumed at many places in their codegen and runtime.<br><br>I made a prototype which returns the right atomicity based on the compiler option in order to eliminate atomic reference counts from generated code. I also modified value witness functions to eliminate atomic reference counts from them.  With these changes, atomic reference counts almost disappeared. <br><br>If it makes sense, I am happy to contribute my changes to the community.  <br><br>I understand there are two problems with my prototype. <br>1) We may need to introduce a mechanism to represent atomicity for value types as well.  It will open an opportunity for compiler to use non-atomic reference counts for thread-local values. <br>2) We need to either extend value witness table to add non-atomic version of functions, or pass atomicity information to the functions as an extra parameter.<br><br>Since they are not trivial changes, I would like your endorsement before starting serious work.<br><br></div>-- Mikio<br><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2016-12-18 5:49 GMT+09:00 Michael Gottesman via swift-dev <span dir="ltr">&lt;<a href="mailto:swift-dev@swift.org" target="_blank">swift-dev@swift.org</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><blockquote type="cite"><span class=""><div>On Dec 17, 2016, at 11:13 AM, Brian Gesiak via swift-dev &lt;<a href="mailto:swift-dev@swift.org" target="_blank">swift-dev@swift.org</a>&gt; wrote:</div><br class="m_-1088950599532420518Apple-interchange-newline"></span><span class=""><div><div dir="ltr">Hello all!<div><br></div><div>I really enjoyed Chris Lattner&#39;s slides from his talk at IBM &lt;<a href="http://researcher.watson.ibm.com/researcher/files/us-lmandel/lattner.pdf" target="_blank">http://researcher.watson.ibm.<wbr>com/researcher/files/us-<wbr>lmandel/lattner.pdf</a>&gt;. </div><div><br></div><div>The speaker notes mention ARC:</div><div><br></div><div>&quot;There are two principle downsides to ARC that people cite: one is the need for atomic increment/decrements, which can be slow.&quot; [...] &quot;The performance problems it can cause are real in some important cases&quot;</div><div><br></div><div>Can someone point me to a good resource that explains these problems? I guess atomic reference count changes create overhead in multithreaded applications? Are there more detailed explorations into this topic?</div></div></div></span></blockquote><div><br></div><div>With a proper concurrency model, I believe you can make most reference counting operations local (my opinion). I have done some explorations in this area in the past using what I call thread local vs global reference counts and using marked concurrency boundaries to mediate transitions in between them (moving from thread local -&gt; atomic of course if one escapes in an undefined way).</div><div><br></div><div>If you are interested in the perf difference with ARC atomics, Roman recently added a mode to the compiler called -assume-single-threaded that uses non-atomic reference counts anywhere.</div><div><br></div><div>There are some interesting optimizations in this area as well, specifically even today, COW gives a nice guarantee of thread localness allowing you to eliminate atomic reference counts once you have a uniqued cow data structure.</div><div><br></div><div>Michael</div><br><blockquote type="cite"><div><div dir="ltr"><div><br></div><div>Thanks!</div><div><br></div><div>- Brian Gesiak</div><div><br></div></div>
______________________________<wbr>_________________<br>swift-dev mailing list<br><a href="mailto:swift-dev@swift.org" target="_blank">swift-dev@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-dev" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-dev</a><br></div></blockquote></div><br></div><br>______________________________<wbr>_________________<br>
swift-dev mailing list<br>
<a href="mailto:swift-dev@swift.org">swift-dev@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-dev" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-dev</a><br>
<br></blockquote></div><br></div>