<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/19650">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
fixeria: Looks good to me, but someone else must approve
laforge: Looks good to me, approved
pespin: Looks good to me, but someone else must approve
</div><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, 27 insertions(+), 18 deletions(-)<br><br></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..2ca6406 100644</span><br><span>--- a/Transceiver52M/Resampler.cpp</span><br><span>+++ b/Transceiver52M/Resampler.cpp</span><br><span>@@ -99,6 +99,7 @@</span><br><span> reverse(&part[0], &part[filt_len]);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef __OPTIMIZE__</span><br><span> static bool check_vec_len(int in_len, int out_len, int p, int q)</span><br><span> {</span><br><span> if (in_len % q) {</span><br><span>@@ -129,14 +130,15 @@</span><br><span> </span><br><span> return true;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </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: 13 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>