<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/19650">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">transceiver: optimize code if optimizations are enabled<br><br>There is no point in checking basic stuff ten thousand times per second<br>since the sizes never change, so it's enough to enable the<br>checks/assertions for unoptimized (debug) builds.<br><br>This significantly decreases branch mispredictions.<br><br>Change-Id: Iebd9e91b3c7f37f2dc646d3017c45139977e4d15<br>---<br>M CommonLibs/Vector.h<br>M Transceiver52M/Resampler.cpp<br>M Transceiver52M/arch/x86/convolve.c<br>3 files changed, 25 insertions(+), 18 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/50/19650/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/CommonLibs/Vector.h b/CommonLibs/Vector.h</span><br><span>index d55c5b3..6d1045d 100644</span><br><span>--- a/CommonLibs/Vector.h</span><br><span>+++ b/CommonLibs/Vector.h</span><br><span>@@ -36,6 +36,11 @@</span><br><span> #include <assert.h></span><br><span> #include <stdlib.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef __OPTIMIZE__</span><br><span style="color: hsl(120, 100%, 40%);">+#define assert_no_opt(x) assert(x)</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+#define assert_no_opt(x)</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> // We can't use Logger.h in this file...</span><br><span> extern int gVectorDebug;</span><br><span> #define BVDEBUG(msg) if (gVectorDebug) {std::cout << msg;}</span><br><span>@@ -81,8 +86,8 @@</span><br><span>   /** Return the size of the Vector. */</span><br><span>        size_t size() const</span><br><span>  {</span><br><span style="color: hsl(0, 100%, 40%);">-               assert(mStart>=mData);</span><br><span style="color: hsl(0, 100%, 40%);">-               assert(mEnd>=mStart);</span><br><span style="color: hsl(120, 100%, 40%);">+              assert_no_opt(mStart>=mData);</span><br><span style="color: hsl(120, 100%, 40%);">+              assert_no_opt(mEnd>=mStart);</span><br><span>              return mEnd - mStart;</span><br><span>        }</span><br><span> </span><br><span>@@ -112,7 +117,7 @@</span><br><span>  /** Reduce addressable size of the Vector, keeping content. */</span><br><span>       void shrink(size_t newSize)</span><br><span>  {</span><br><span style="color: hsl(0, 100%, 40%);">-               assert(newSize <= mEnd - mStart);</span><br><span style="color: hsl(120, 100%, 40%);">+          assert_no_opt(newSize <= mEnd - mStart);</span><br><span>          mEnd = mStart + newSize;</span><br><span>     }</span><br><span> </span><br><span>@@ -199,7 +204,7 @@</span><br><span>  {</span><br><span>            T* wStart = mStart + start;</span><br><span>          T* wEnd = wStart + span;</span><br><span style="color: hsl(0, 100%, 40%);">-                assert(wEnd<=mEnd);</span><br><span style="color: hsl(120, 100%, 40%);">+                assert_no_opt(wEnd<=mEnd);</span><br><span>                return Vector<T>(NULL,wStart,wEnd);</span><br><span>    }</span><br><span> </span><br><span>@@ -208,7 +213,7 @@</span><br><span>  {</span><br><span>            T* wStart = mStart + start;</span><br><span>          T* wEnd = wStart + span;</span><br><span style="color: hsl(0, 100%, 40%);">-                assert(wEnd<=mEnd);</span><br><span style="color: hsl(120, 100%, 40%);">+                assert_no_opt(wEnd<=mEnd);</span><br><span>                return Vector<T>(NULL,wStart,wEnd);</span><br><span>    }</span><br><span> </span><br><span>@@ -228,8 +233,8 @@</span><br><span>          unsigned int i;</span><br><span>              T* dst = other.mStart + start;</span><br><span>               T* src = mStart;</span><br><span style="color: hsl(0, 100%, 40%);">-                assert(dst+span<=other.mEnd);</span><br><span style="color: hsl(0, 100%, 40%);">-                assert(mStart+span<=mEnd);</span><br><span style="color: hsl(120, 100%, 40%);">+         assert_no_opt(dst+span<=other.mEnd);</span><br><span style="color: hsl(120, 100%, 40%);">+               assert_no_opt(mStart+span<=mEnd);</span><br><span>                 for (i = 0; i < span; i++, src++, dst++)</span><br><span>                  *dst = *src;</span><br><span>                 /*TODO if not non-trivially copiable type class, optimize:</span><br><span>@@ -250,8 +255,8 @@</span><br><span>     void segmentCopyTo(Vector<T>& other, size_t start, size_t span) const</span><br><span>      {</span><br><span>            const T* base = mStart + start;</span><br><span style="color: hsl(0, 100%, 40%);">-         assert(base+span<=mEnd);</span><br><span style="color: hsl(0, 100%, 40%);">-             assert(other.mStart+span<=other.mEnd);</span><br><span style="color: hsl(120, 100%, 40%);">+             assert_no_opt(base+span<=mEnd);</span><br><span style="color: hsl(120, 100%, 40%);">+            assert_no_opt(other.mStart+span<=other.mEnd);</span><br><span>             memcpy(other.mStart,base,span*sizeof(T));</span><br><span>    }</span><br><span> </span><br><span>@@ -265,8 +270,8 @@</span><br><span>  {</span><br><span>            const T* baseFrom = mStart + from;</span><br><span>           T* baseTo = mStart + to;</span><br><span style="color: hsl(0, 100%, 40%);">-                assert(baseFrom+span<=mEnd);</span><br><span style="color: hsl(0, 100%, 40%);">-         assert(baseTo+span<=mEnd);</span><br><span style="color: hsl(120, 100%, 40%);">+         assert_no_opt(baseFrom+span<=mEnd);</span><br><span style="color: hsl(120, 100%, 40%);">+                assert_no_opt(baseTo+span<=mEnd);</span><br><span>                 memmove(baseTo,baseFrom,span*sizeof(T));</span><br><span>     }</span><br><span> </span><br><span>@@ -280,7 +285,7 @@</span><br><span>  {</span><br><span>            T* dp=mStart+start;</span><br><span>          T* end=dp+length;</span><br><span style="color: hsl(0, 100%, 40%);">-               assert(end<=mEnd);</span><br><span style="color: hsl(120, 100%, 40%);">+         assert_no_opt(end<=mEnd);</span><br><span>                 while (dp<end) *dp++=val;</span><br><span>         }</span><br><span> </span><br><span>@@ -292,13 +297,13 @@</span><br><span> </span><br><span>    T& operator[](size_t index)</span><br><span>      {</span><br><span style="color: hsl(0, 100%, 40%);">-               assert(mStart+index<mEnd);</span><br><span style="color: hsl(120, 100%, 40%);">+         assert_no_opt(mStart+index<mEnd);</span><br><span>                 return mStart[index];</span><br><span>        }</span><br><span> </span><br><span>        const T& operator[](size_t index) const</span><br><span>  {</span><br><span style="color: hsl(0, 100%, 40%);">-               assert(mStart+index<mEnd);</span><br><span style="color: hsl(120, 100%, 40%);">+         assert_no_opt(mStart+index<mEnd);</span><br><span>                 return mStart[index];</span><br><span>        }</span><br><span> </span><br><span>diff --git a/Transceiver52M/Resampler.cpp b/Transceiver52M/Resampler.cpp</span><br><span>index 7ba0219..25324f8 100644</span><br><span>--- a/Transceiver52M/Resampler.cpp</span><br><span>+++ b/Transceiver52M/Resampler.cpp</span><br><span>@@ -133,10 +133,10 @@</span><br><span> int Resampler::rotate(const float *in, size_t in_len, float *out, size_t out_len)</span><br><span> {</span><br><span>         int n, path;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef __OPTIMIZE__</span><br><span>   if (!check_vec_len(in_len, out_len, p, q))</span><br><span>           return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>   /* Generate output from precomputed input/output paths */</span><br><span>    for (size_t i = 0; i < out_len; i++) {</span><br><span>            n = in_index[i];</span><br><span>diff --git a/Transceiver52M/arch/x86/convolve.c b/Transceiver52M/arch/x86/convolve.c</span><br><span>index 66fca74..81ea782 100644</span><br><span>--- a/Transceiver52M/arch/x86/convolve.c</span><br><span>+++ b/Transceiver52M/arch/x86/convolve.c</span><br><span>@@ -99,11 +99,12 @@</span><br><span>            const float *h, int h_len,</span><br><span>                   float *y, int y_len, int start, int len)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef __OPTIMIZE__</span><br><span>        if (bounds_check(x_len, h_len, y_len, start, len) < 0)</span><br><span>            return -1;</span><br><span> </span><br><span>       memset(y, 0, len * 2 * sizeof(float));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>       switch (h_len) {</span><br><span>     case 4:</span><br><span>              c.conv_real4(x, x_len, h, h_len, y, y_len, start, len);</span><br><span>@@ -138,11 +139,12 @@</span><br><span>                   float *y, int y_len,</span><br><span>                 int start, int len)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef __OPTIMIZE__</span><br><span>  if (bounds_check(x_len, h_len, y_len, start, len) < 0)</span><br><span>            return -1;</span><br><span> </span><br><span>       memset(y, 0, len * 2 * sizeof(float));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>       if (!(h_len % 8))</span><br><span>            c.conv_cmplx_8n(x, x_len, h, h_len, y, y_len, start, len);</span><br><span>   else if (!(h_len % 4))</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/19650">change 19650</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-trx/+/19650"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-trx </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Iebd9e91b3c7f37f2dc646d3017c45139977e4d15 </div>
<div style="display:none"> Gerrit-Change-Number: 19650 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>