From ee9d6c6f6c12d9c142039f5c642c01ff90d8e3e3 Mon Sep 17 00:00:00 2001 From: "A. Maitland Bottoms" Date: Sun, 4 Feb 2018 18:12:21 +0000 Subject: [PATCH] Import volk_1.3-3.debian.tar.xz [dgit import tarball volk 1.3-3 volk_1.3-3.debian.tar.xz] --- changelog | 319 +++++++++++++ compat | 1 + control | 68 +++ copyright | 191 ++++++++ libvolk1-bin.install | 1 + libvolk1-bin.manpages | 3 + libvolk1-dev.abi.tar.gz.amd64 | Bin 0 -> 54278 bytes libvolk1-dev.acc | 12 + libvolk1-dev.install | 4 + libvolk1.3.install | 1 + ...ompatible-YAML-file-for-building-on-.patch | 76 ++++ ...pdate-CMakeLists-for-1.3-development.patch | 25 ++ ...-profile-update-reading-end-of-lines.patch | 25 ++ ...-profile-update-reading-end-of-lines.patch | 25 ++ ...lerance-for-32fc_mag-to-fix-issue-96.patch | 34 ++ ...-unaligned-versions-of-SSE4.1-and-SS.patch | 346 ++++++++++++++ ...-__VOLK_PREFETCH-compatibility-macro.patch | 357 +++++++++++++++ ..._64u_popcnt-bug-in-generic-implement.patch | 26 ++ ...ct-module-include-guards-from-main-v.patch | 39 ++ ...-the-cmake-find-module-for-volk-mods.patch | 27 ++ ...h-variables-and-avoid-implicit-type-.patch | 44 ++ ...e-support-empty-CMAKE_INSTALL_PREFIX.patch | 26 ++ ...ted-install-with-VOLK_PREFIX-env-var.patch | 35 ++ ...-a-minimal-bug-in-the-log2-docstring.patch | 25 ++ ...igned-protokernles-to-32f_x2_s32f_in.patch | 140 ++++++ ...dds-AVX-support-to-volk_32f_-kernels.patch | 422 ++++++++++++++++++ ...support-to-32f_x2_divide_32f-32f_x2_.patch | 271 +++++++++++ ...ssue-139-for-32fc_index_max_-kernels.patch | 42 ++ patches/install-all-headers | 33 ++ patches/libm-link | 11 + patches/make-acc-happy | 53 +++ patches/native-armv7-build-support | 59 +++ patches/series | 22 + patches/sort-cmake-glob-lists | 20 + patches/sort-input-files.patch | 51 +++ rules | 17 + source/format | 1 + source/include-binaries | 1 + upstream/signing-key.asc | 52 +++ volk-config-info.1 | 45 ++ volk_modtool.1 | 112 +++++ volk_profile.1 | 5 + watch | 3 + 43 files changed, 3070 insertions(+) create mode 100644 changelog create mode 100644 compat create mode 100644 control create mode 100644 copyright create mode 100644 libvolk1-bin.install create mode 100644 libvolk1-bin.manpages create mode 100644 libvolk1-dev.abi.tar.gz.amd64 create mode 100644 libvolk1-dev.acc create mode 100644 libvolk1-dev.install create mode 100644 libvolk1.3.install create mode 100644 patches/0001-Add-a-AppVeyor-compatible-YAML-file-for-building-on-.patch create mode 100644 patches/0002-Update-CMakeLists-for-1.3-development.patch create mode 100644 patches/0003-apps-fix-profile-update-reading-end-of-lines.patch create mode 100644 patches/0004-apps-fix-profile-update-reading-end-of-lines.patch create mode 100644 patches/0005-qa-lower-tolerance-for-32fc_mag-to-fix-issue-96.patch create mode 100644 patches/0006-Add-NEON-AVX-and-unaligned-versions-of-SSE4.1-and-SS.patch create mode 100644 patches/0007-added-__VOLK_PREFETCH-compatibility-macro.patch create mode 100644 patches/0008-Fix-bug-106-volk_64u_popcnt-bug-in-generic-implement.patch create mode 100644 patches/0009-modtool-deconflict-module-include-guards-from-main-v.patch create mode 100644 patches/0010-modtool-update-the-cmake-find-module-for-volk-mods.patch create mode 100644 patches/0011-Use-powf-to-match-variables-and-avoid-implicit-type-.patch create mode 100644 patches/0012-cmake-support-empty-CMAKE_INSTALL_PREFIX.patch create mode 100644 patches/0013-Support-relocated-install-with-VOLK_PREFIX-env-var.patch create mode 100644 patches/0014-Fixing-a-minimal-bug-in-the-log2-docstring.patch create mode 100644 patches/0015-kernel-Adds-unaligned-protokernles-to-32f_x2_s32f_in.patch create mode 100644 patches/0016-kernels-Adds-AVX-support-to-volk_32f_-kernels.patch create mode 100644 patches/0017-kernels-Add-AVX-support-to-32f_x2_divide_32f-32f_x2_.patch create mode 100644 patches/0018-fix-GH-issue-139-for-32fc_index_max_-kernels.patch create mode 100644 patches/install-all-headers create mode 100644 patches/libm-link create mode 100644 patches/make-acc-happy create mode 100644 patches/native-armv7-build-support create mode 100644 patches/series create mode 100644 patches/sort-cmake-glob-lists create mode 100644 patches/sort-input-files.patch create mode 100755 rules create mode 100644 source/format create mode 100644 source/include-binaries create mode 100644 upstream/signing-key.asc create mode 100644 volk-config-info.1 create mode 100644 volk_modtool.1 create mode 100644 volk_profile.1 create mode 100644 watch diff --git a/changelog b/changelog new file mode 100644 index 0000000..7bd8a0a --- /dev/null +++ b/changelog @@ -0,0 +1,319 @@ +volk (1.3-3) unstable; urgency=medium + + * update to v1.3-23-g0109b2e + * update debian/libvolk1-dev.abi.tar.gz.amd64 + * Add breaks/replaces gnuradio (<=3.7.2.1) (LP: #1614235) + + -- A. Maitland Bottoms Sun, 04 Feb 2018 13:12:21 -0500 + +volk (1.3-2) unstable; urgency=medium + + * update to v1.3-16-g28b03a9 + apps: fix profile update reading end of lines + qa: lower tolerance for 32fc_mag to fix issue #96 + * include upstream master patch to sort input files + + -- A. Maitland Bottoms Sun, 27 Aug 2017 13:44:55 -0400 + +volk (1.3-1) unstable; urgency=medium + + * New upstream release + * The index_max kernels were named with the wrong output datatype. To + fix this there are new kernels that return a 32u (int32_t) and the + existing kernels had their signatures changed to return 16u (int16_t). + * The output to stdout and stderr has been shuffled around. There is no + longer a message that prints what VOLK machine is being used and the + warning messages go to stderr rather than stdout. + * The 32fc_index_max kernels previously were only accurate to the SSE + register width (4 points). This was a pretty serious and long-lived + bug that's been fixed and the QA updated appropriately. + + -- A. Maitland Bottoms Sat, 02 Jul 2016 16:30:47 -0400 + +volk (1.2.2-2) unstable; urgency=medium + + * update to v1.2.2-11-g78c8bc4 (to follow gnuradio maint branch) + + -- A. Maitland Bottoms Sun, 19 Jun 2016 14:44:15 -0400 + +volk (1.2.2-1) unstable; urgency=medium + + * New upstream release + + -- A. Maitland Bottoms Fri, 08 Apr 2016 00:12:10 -0400 + +volk (1.2.1-2) unstable; urgency=medium + + * Upstream patches: + Fix some CMake complaints + The fix for compilation with cmake 3.5 + + -- A. Maitland Bottoms Wed, 23 Mar 2016 17:47:54 -0400 + +volk (1.2.1-1) unstable; urgency=medium + + * New upstream release + + -- A. Maitland Bottoms Sun, 07 Feb 2016 19:38:32 -0500 + +volk (1.2-1) unstable; urgency=medium + + * New upstream release + + -- A. Maitland Bottoms Thu, 24 Dec 2015 20:28:13 -0500 + +volk (1.1.1-5) experimental; urgency=medium + + * update to v1.1.1-22-gef53547 to support gnuradio 3.7.9 + + -- A. Maitland Bottoms Fri, 11 Dec 2015 13:12:55 -0500 + +volk (1.1.1-4) unstable; urgency=medium + + * more lintian fixes + + -- A. Maitland Bottoms Wed, 25 Nov 2015 21:49:58 -0500 + +volk (1.1.1-3) unstable; urgency=medium + + * Lintian fixes Pre-Depends + + -- A. Maitland Bottoms Thu, 19 Nov 2015 21:24:27 -0500 + +volk (1.1.1-2) unstable; urgency=medium + + * Note that libvolk1-dev replaces files in gnuradio-dev versions <<3.7.8 + (Closes: #802646) again. Thanks Andreas Beckmann. + + -- A. Maitland Bottoms Fri, 13 Nov 2015 18:45:49 -0500 + +volk (1.1.1-1) unstable; urgency=medium + + * New upstream release + * New architectures exist for the AVX2 and FMA ISAs. + * The profiler now generates buffers that are vlen + a tiny amount and + generates random data to fill buffers. This is intended to catch bugs + in protokernels that write beyond num_points. + * Note that libvolk1-dev replaces files in earlier gnuradio-dev versions + (Closes: #802646) + + -- A. Maitland Bottoms Sun, 01 Nov 2015 18:45:43 -0500 + +volk (1.1-4) unstable; urgency=medium + + * update to v1.1-12-g264addc + + -- A. Maitland Bottoms Tue, 29 Sep 2015 23:41:50 -0400 + +volk (1.1-3) unstable; urgency=low + + * drop dh_acc to get reproducible builds + + -- A. Maitland Bottoms Fri, 11 Sep 2015 22:57:06 -0400 + +volk (1.1-2) unstable; urgency=low + + * use dh-acc + + -- A. Maitland Bottoms Mon, 07 Sep 2015 15:45:20 -0400 + +volk (1.1-1) unstable; urgency=medium + + * re-organize package naming convention + * New upstream release tag v1.1 + New architectures exist for the AVX2 and FMA ISAs. Along + with the build-system support the following kernels have + no proto-kernels taking advantage of these architectures: + + * 32f_x2_dot_prod_32f + * 32fc_x2_multiply_32fc + * 64_byteswap + * 32f_binary_slicer_8i + * 16u_byteswap + * 32u_byteswap + + QA/profiler + ----------- + + The profiler now generates buffers that are vlen + a tiny + amount and generates random data to fill buffers. This is + intended to catch bugs in protokernels that write beyond + num_points. + + -- A. Maitland Bottoms Wed, 26 Aug 2015 09:22:48 -0400 + +volk (1.0.2-2) unstable; urgency=low + + * Use SOURCE_DATE_EPOCH from the environment, if defined, + rather than current date and time to implement volk_build_date() + (embedding build date in a library does not help reproducible builds) + * add watch file + + -- A. Maitland Bottoms Sat, 15 Aug 2015 17:43:15 -0400 + +volk (1.0.2-1) unstable; urgency=medium + + * Maintenance release 24 Jul 2015 by Nathan West + * The major change is the CMake logic to add ASM protokernels. Rather + than depending on CFLAGS and ASMFLAGS we use the results of VOLK's + built in has_ARCH tests. All configurations should work the same as + before, but manually specifying CFLAGS and ASMFLAGS on the cmake call + for ARM native builds should no longer be necessary. + * The 32fc_s32fc_x2_rotator_32fc generic protokernel now includes a + previously implied header. + * Finally, there is a fix to return the "best" protokernel to the + dispatcher when no volk_config exists. Thanks to Alexandre Raymond for + pointing this out. + * with maint branch patch: + kernels-add-missing-include-arm_neon.h + * removed unused build-dependency on liboil0.3-dev (closes: #793626) + + -- A. Maitland Bottoms Wed, 05 Aug 2015 00:43:40 -0400 + +volk (1.0.1-1) unstable; urgency=low + + * Maintenance Release v1.0.1 08 Jul 2015 by Nathan West + This is a maintenance release with bug fixes since the initial release of + v1.0 in April. + + * Contributors + + The following authors have contributed code to this release: + + Doug Geiger doug.geiger@bioradiation.net + Elliot Briggs elliot.briggs@gmail.com + Marcus Mueller marcus@hostalia.de + Nathan West nathan.west@okstate.edu + Tom Rondeau tom@trondeau.com + + * Kernels + + Several bug fixes in different kernels. The NEON implementations of the + following kernels have been fixed: + + 32f_x2_add_32f + 32f_x2_dot_prod_32f + 32fc_s32fc_multiply_32fc + 32fc_x2_multiply_32fc + + Additionally the NEON asm based 32f_x2_add_32f protokernels were not being + used and are now included and available for use via the dispatcher. + + The 32f_s32f_x2_fm_detect_32f kernel now has a puppet. This solves QA seg + faults on 32-bit machines and provide a better test for this kernel. + + The 32fc_s32fc_x2_rotator_32fc generic protokernel replaced cabsf with + hypotf for better Android support. + + * Building + + Static builds now trigger the applications (volk_profile and + volk-config-info) to be statically linked. + + The file gcc_x86_cpuid.h has been removed since it was no longer being + used. Previously it provided cpuid functionality for ancient compilers + that we do not support. + + All build types now use -Wall. + + * QA and Testing + + The documentation around the --update option to volk_profile now makes it + clear that the option will only profile kernels without entries in + volk_profile. The signature of run_volk_tests with expanded args changed + signed types to unsigned types to reflect the actual input. + + The remaining changes are all non-functional changes to address issues + from Coverity. + + -- A. Maitland Bottoms Fri, 10 Jul 2015 17:57:42 -0400 + +volk (1.0-5) unstable; urgency=medium + + * native-armv7-build-support skips neon on Debian armel (Closes: #789972) + + -- A. Maitland Bottoms Sat, 04 Jul 2015 12:36:36 -0400 + +volk (1.0-4) unstable; urgency=low + + * update native-armv7-build-support patch from gnuradio volk package + + -- A. Maitland Bottoms Thu, 25 Jun 2015 16:38:49 -0400 + +volk (1.0-3) unstable; urgency=medium + + * Add Breaks/Replaces (Closes: #789893, #789894) + * Allow failing tests + + -- A. Maitland Bottoms Thu, 25 Jun 2015 12:46:06 -0400 + +volk (1.0-2) unstable; urgency=medium + + * kernels-add-missing-math.h-include-to-rotator + + -- A. Maitland Bottoms Wed, 24 Jun 2015 21:09:32 -0400 + +volk (1.0-1) unstable; urgency=low + + * Initial package (Closes: #782417) + Initial Release 11 Apr 2015 by Nathan West + + VOLK 1.0 is available. This is the first release of VOLK as an independently + tracked sub-project of GNU Radio. + + * Contributors + + VOLK has been tracked separately from GNU Radio since 2014 Dec 23. + Contributors between the split and the initial release are + + Albert Holguin aholguin_77@yahoo.com + Doug Geiger doug.geiger@bioradiation.net + Elliot Briggs elliot.briggs@gmail.com + Julien Olivain julien.olivain@lsv.ens-cachan.fr + Michael Dickens michael.dickens@ettus.com + Nathan West nathan.west@okstate.edu + Tom Rondeau tom@trondeau.com + + * QA + + The test and profiler have significantly changed. The profiler supports + run-time changes to vlen and iters to help kernel development and provide + more flexibility on embedded systems. Additionally there is a new option + to update an existing volk_profile results file with only new kernels which + will save time when updating to newer versions of VOLK + + The QA system creates a static list of kernels and test cases. The QA + testing and profiler iterate over this static list rather than each source + file keeping its own list. The QA also emits XML results to + lib/.unittest/kernels.xml which is formatted similarly to JUnit results. + + * Modtool + + Modtool was updated to support the QA and profiler changes. + + * Kernels + + New proto-kernels: + + 16ic_deinterleave_real_8i_neon + 16ic_s32f_deinterleave_32f_neon + fix preprocessor errors for some compilers on byteswap and popcount puppets + + ORC was moved to the asm kernels directory. + volk_malloc + + The posix_memalign implementation of Volk_malloc now falls back to a standard + malloc if alignment is 1. + + * Miscellaneous + + Several build system and cmake changes have made it possible to build VOLK + both independently with proper soname versions and in-tree for projects + such as GNU Radio. + + The static builds take advantage of cmake object libraries to speed up builds. + + Finally, there are a number of changes to satisfy compiler warnings and make + QA work on multiple machines. + + -- A. Maitland Bottoms Sun, 12 Apr 2015 23:20:41 -0400 diff --git a/compat b/compat new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/compat @@ -0,0 +1 @@ +9 diff --git a/control b/control new file mode 100644 index 0000000..245b061 --- /dev/null +++ b/control @@ -0,0 +1,68 @@ +Source: volk +Section: libdevel +Priority: extra +Maintainer: A. Maitland Bottoms +Build-Depends: cmake, + debhelper (>= 9.0.0~), + dh-python, + doxygen, + libboost-filesystem-dev, + libboost-program-options-dev, + libboost-system-dev, + libboost-test-dev, + liborc-0.4-dev, + pkg-config, + python, + python-cheetah +Standards-Version: 4.1.3 +Homepage: http://libvolk.org +Vcs-Browser: https://salsa.debian.org/bottoms/pkg-volk +Vcs-Git: https://salsa.debian.org/bottoms/pkg-volk.git + +Package: libvolk1.3 +Section: libs +Architecture: any +Pre-Depends: ${misc:Pre-Depends} +Depends: ${misc:Depends}, ${shlibs:Depends} +Multi-Arch: same +Recommends: libvolk1-bin +Suggests: libvolk1-dev +Description: vector optimized functions + Vector-Optimized Library of Kernels is designed to help + applications work with the processor's SIMD instruction sets. These are + very powerful vector operations that can give signal processing a + huge boost in performance. + +Package: libvolk1-dev +Architecture: any +Pre-Depends: ${misc:Pre-Depends} +Depends: libvolk1.3 (=${binary:Version}), ${misc:Depends} +Breaks: gnuradio-dev (<<3.7.8), libvolk-dev, libvolk1.0-dev +Replaces: gnuradio-dev (<<3.7.8), libvolk-dev, libvolk1.0-dev +Multi-Arch: same +Description: vector optimized function headers + Vector-Optimized Library of Kernels is designed to help + applications work with the processor's SIMD instruction sets. These are + very powerful vector operations that can give signal processing a + huge boost in performance. + . + This package contains the header files. + For documentation, see libvolk-doc. + +Package: libvolk1-bin +Section: libs +Architecture: any +Pre-Depends: ${misc:Pre-Depends} +Depends: libvolk1.3 (=${binary:Version}), + ${misc:Depends}, + ${python:Depends}, + ${shlibs:Depends} +Breaks: libvolk-bin, libvolk1.0-bin, gnuradio (<=3.7.2.1) +Replaces: libvolk-bin, libvolk1.0-bin, gnuradio (<=3.7.2.1) +Description: vector optimized runtime tools + Vector-Optimized Library of Kernels is designed to help + applications work with the processor's SIMD instruction sets. These are + very powerful vector operations that can give signal processing a + huge boost in performance. + . + This package includes the volk_profile tool. diff --git a/copyright b/copyright new file mode 100644 index 0000000..34e4faf --- /dev/null +++ b/copyright @@ -0,0 +1,191 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: volk +Upstream-Contact: http://libvolk.org/ +Source: + https://github.com/gnuradio/volk +Comment: + Debian packages by A. Maitland Bottoms + . + Upstream Authors: + Albert Holguin + Doug Geiger + Elliot Briggs + Julien Olivain + Michael Dickens + Nathan West + Tom Rondeau +Copyright: 2014-2015 Free Software Foundation, Inc. +License: GPL-3+ + +Files: * +Copyright: 2006, 2009-2016, Free Software Foundation, Inc. +License: GPL-3+ + +Files: Doxyfile.in + DoxygenLayout.xml + volk.pc.in +Copyright: 2014-2015 Free Software Foundation, Inc. +License: GPL-3+ + +Files: apps/volk_profile.h +Copyright: 2014-2015 Free Software Foundation, Inc. +License: GPL-3+ + +Files: appveyor.yml +Copyright: 2016 Paul Cercueil +License: GPL-3+ + +Files: cmake/* +Copyright: 2014-2015 Free Software Foundation, Inc. +License: GPL-3+ + +Files: cmake/Modules/* +Copyright: 2006, 2009-2016, Free Software Foundation, Inc. +License: GPL-3+ + +Files: cmake/Modules/CMakeParseArgumentsCopy.cmake +Copyright: 2010 Alexander Neundorf +License: Kitware-BSD + All rights reserved. + . + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + . + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + . + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + . + * Neither the names of Kitware, Inc., the Insight Software Consortium, + nor the names of their contributors may be used to endorse or promote + products derived from this software without specific prior written + permission. + . + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Files: cmake/Modules/FindORC.cmake + cmake/Modules/VolkConfig.cmake.in +Copyright: 2014-2015 Free Software Foundation, Inc. +License: GPL-3+ + +Files: cmake/msvc/* +Copyright: 2006-2008, Alexander Chemeris +License: BSD-2-clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + . + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + . + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + . + 3. The name of the author may be used to endorse or promote products + derived from this software without specific prior written permission. + . + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Files: cmake/msvc/config.h +Copyright: 2005, 2006 Apple Computer, Inc. +License: LGPL-2+ + +Files: cmake/msvc/stdbool.h +Copyright: 2005, 2006, Apple Computer, Inc. +License: LGPL-2+ + +Files: debian/* +Copyright: 2015 Free Software Foundation, Inc +License: GPL-3+ +Comment: assigned by A. Maitland Bottoms + +Files: debian/libvolk1-dev.abi.tar.gz.amd64 +Copyright: 2016 Free Software Foundation, Inc +License: GPL-3+ + +Files: docs/* +Copyright: 2014-2015 Free Software Foundation, Inc. +License: GPL-3+ + +Files: gen/archs.xml + gen/machines.xml +Copyright: 2014-2015 Free Software Foundation, Inc. +License: GPL-3+ + +Files: include/volk/volk_common.h + include/volk/volk_complex.h + include/volk/volk_prefs.h +Copyright: 2014-2015 Free Software Foundation, Inc. +License: GPL-3+ + +Files: kernels/volk/asm/* +Copyright: 2014-2015 Free Software Foundation, Inc. +License: GPL-3+ + +Files: kernels/volk/volk_16u_byteswappuppet_16u.h + kernels/volk/volk_32u_byteswappuppet_32u.h + kernels/volk/volk_64u_byteswappuppet_64u.h +Copyright: 2014-2015 Free Software Foundation, Inc. +License: GPL-3+ + +Files: lib/kernel_tests.h + lib/qa_utils.cc + lib/qa_utils.h + lib/volk_prefs.c +Copyright: 2014-2015 Free Software Foundation, Inc. +License: GPL-3+ + +License: LGPL-2+ + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + . + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + . + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +License: GPL-3+ + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see . + . + On Debian systems, the complete text of the GNU General + Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". diff --git a/libvolk1-bin.install b/libvolk1-bin.install new file mode 100644 index 0000000..b8fc484 --- /dev/null +++ b/libvolk1-bin.install @@ -0,0 +1 @@ +usr/bin/volk* diff --git a/libvolk1-bin.manpages b/libvolk1-bin.manpages new file mode 100644 index 0000000..95bae9e --- /dev/null +++ b/libvolk1-bin.manpages @@ -0,0 +1,3 @@ +debian/volk-config-info.1 +debian/volk_modtool.1 +debian/volk_profile.1 diff --git a/libvolk1-dev.abi.tar.gz.amd64 b/libvolk1-dev.abi.tar.gz.amd64 new file mode 100644 index 0000000000000000000000000000000000000000..c67d783ebdff5bc22bfbd885c6227a15812be9cf GIT binary patch literal 54278 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 literal 0 HcmV?d00001 diff --git a/libvolk1-dev.acc b/libvolk1-dev.acc new file mode 100644 index 0000000..465e6a5 --- /dev/null +++ b/libvolk1-dev.acc @@ -0,0 +1,12 @@ + + + + +debian/libvolk1-dev/usr/include/ + + + +debian/libvolk1.3/usr/lib/ + + + diff --git a/libvolk1-dev.install b/libvolk1-dev.install new file mode 100644 index 0000000..4b391be --- /dev/null +++ b/libvolk1-dev.install @@ -0,0 +1,4 @@ +usr/include/* +usr/lib/*/*volk*so +usr/lib/*/cmake/volk +usr/lib/*/pkgconfig/*volk* diff --git a/libvolk1.3.install b/libvolk1.3.install new file mode 100644 index 0000000..2c3cb05 --- /dev/null +++ b/libvolk1.3.install @@ -0,0 +1 @@ +usr/lib/*/libvolk.so.1.3 diff --git a/patches/0001-Add-a-AppVeyor-compatible-YAML-file-for-building-on-.patch b/patches/0001-Add-a-AppVeyor-compatible-YAML-file-for-building-on-.patch new file mode 100644 index 0000000..09e2420 --- /dev/null +++ b/patches/0001-Add-a-AppVeyor-compatible-YAML-file-for-building-on-.patch @@ -0,0 +1,76 @@ +From 4461f27f6533cf29baaac0ff9cdd9b6241c0840b Mon Sep 17 00:00:00 2001 +From: Paul Cercueil +Date: Wed, 17 Feb 2016 14:51:00 +0100 +Subject: [PATCH 01/18] Add a AppVeyor compatible YAML file for building on the + AppVeyor CI + +Signed-off-by: Paul Cercueil +--- + appveyor.yml | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 55 insertions(+) + create mode 100644 appveyor.yml + +diff --git a/appveyor.yml b/appveyor.yml +new file mode 100644 +index 0000000..052ea51 +--- /dev/null ++++ b/appveyor.yml +@@ -0,0 +1,55 @@ ++clone_depth: 1 ++ ++os: Visual Studio 2013 ++ ++install: ++ - echo "Installing Boost libraries..." ++ - nuget install boost_system-vc120 ++ - nuget install boost_filesystem-vc120 ++ - nuget install boost_chrono-vc120 ++ - nuget install boost_program_options-vc120 ++ - nuget install boost_unit_test_framework-vc120 ++ ++ - echo "Installing Cheetah templates..." ++ - appveyor DownloadFile https://pypi.python.org/packages/source/C/Cheetah/Cheetah-2.4.4.tar.gz ++ - 7z x Cheetah-2.4.4.tar.gz ++ - 7z x -y Cheetah-2.4.4.tar ++ - cd Cheetah-2.4.4 ++ - c:\Python27\python.exe setup.py build ++ - c:\Python27\python.exe setup.py install ++ ++build_script: ++ - cd c:\projects\volk ++ ++ # Without this directory in the %PATH%, compiler tests fail because of missing DLLs ++ - set PATH=%PATH%;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin ++ ++ - cmake -G "Visual Studio 12 Win64" \ ++ -DBoost_CHRONO_LIBRARY_RELEASE:FILEPATH=c:/projects/volk/boost_chrono-vc120.1.59.0.0/lib/native/address-model-64/lib/boost_chrono-vc120-mt-1_59.lib \ ++ -DBoost_FILESYSTEM_LIBRARY_RELEASE:FILEPATH=c:/projects/volk/boost_filesystem-vc120.1.59.0.0/lib/native/address-model-64/lib/boost_filesystem-vc120-mt-1_59.lib \ ++ -DBoost_PROGRAM_OPTIONS_LIBRARY_RELEASE:FILEPATH=c:/projects/volk/boost_program_options-vc120.1.59.0.0/lib/native/address-model-64/lib/boost_program_options-vc120-mt-1_59.lib \ ++ -DBoost_SYSTEM_LIBRARY_RELEASE:FILEPATH=c:/projects/volk/boost_system-vc120.1.59.0.0/lib/native/address-model-64/lib/boost_system-vc120-mt-1_59.lib \ ++ -DBoost_UNIT_TEST_FRAMEWORK_LIBRARY_RELEASE:FILEPATH=c:/projects/volk/boost_unit_test_framework-vc120.1.59.0.0/lib/native/address-model-64/lib/boost_unit_test_framework-vc120-mt-1_59.lib \ ++ -DBoost_INCLUDE_DIR:PATH=c:/projects/volk/boost.1.59.0.0/lib/native/include \ ++ -DCMAKE_BUILD_TYPE:STRING=Release -DENABLE_ORC:BOOL=OFF -DENABLE_TESTING:BOOL=OFF \ ++ . ++ ++ - cmake --build . --config Release --target INSTALL ++ ++ # Create an archive ++ - cd "c:\Program Files" ++ - 7z a "c:\libvolk-x64.zip" volk ++ ++ # Create the deps archive ++ - mkdir dlls ++ - copy c:\projects\volk\boost_chrono-vc120.1.59.0.0\lib\native\address-model-64\lib\boost_chrono-vc120-mt-1_59.dll dlls\boost_chrono-vc120-mt-1_59.dll ++ - copy c:\projects\volk\boost_filesystem-vc120.1.59.0.0\lib\native\address-model-64\lib\boost_filesystem-vc120-mt-1_59.dll dlls\boost_filesystem-vc120-mt-1_59.dll ++ - copy c:\projects\volk\boost_program_options-vc120.1.59.0.0\lib\native\address-model-64\lib\boost_program_options-vc120-mt-1_59.dll dlls\boost_program_options-vc120-mt-1_59.dll ++ - copy c:\projects\volk\boost_system-vc120.1.59.0.0\lib\native\address-model-64\lib\boost_system-vc120-mt-1_59.dll dlls\boost_system-vc120-mt-1_59.dll ++ - copy c:\projects\volk\boost_unit_test_framework-vc120.1.59.0.0\lib\native\address-model-64\lib\boost_unit_test_framework-vc120-mt-1_59.dll dlls\boost_unit_test_framework-vc120-mt-1_59.dll ++ - cd dlls ++ - 7z a "c:\libvolk-x64-deps.zip" * ++ ++ # Push it! ++ - appveyor PushArtifact c:\libvolk-x64.zip ++ - appveyor PushArtifact c:\libvolk-x64-deps.zip +-- +2.11.0 + diff --git a/patches/0002-Update-CMakeLists-for-1.3-development.patch b/patches/0002-Update-CMakeLists-for-1.3-development.patch new file mode 100644 index 0000000..48070da --- /dev/null +++ b/patches/0002-Update-CMakeLists-for-1.3-development.patch @@ -0,0 +1,25 @@ +From 18428fb9f718f5f7fa34707dd47ab6db07d88683 Mon Sep 17 00:00:00 2001 +From: Nathan West +Date: Sat, 2 Jul 2016 12:01:28 -0400 +Subject: [PATCH 02/18] Update CMakeLists for 1.3 development + +--- + CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 5ecc9c2..0d0b647 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -45,7 +45,7 @@ message(STATUS "Build type set to ${CMAKE_BUILD_TYPE}.") + + set(VERSION_INFO_MAJOR_VERSION 1) + set(VERSION_INFO_MINOR_VERSION 3) +-set(VERSION_INFO_MAINT_VERSION 0) ++set(VERSION_INFO_MAINT_VERSION 0git) + include(VolkVersion) #setup version info + + +-- +2.11.0 + diff --git a/patches/0003-apps-fix-profile-update-reading-end-of-lines.patch b/patches/0003-apps-fix-profile-update-reading-end-of-lines.patch new file mode 100644 index 0000000..db94b06 --- /dev/null +++ b/patches/0003-apps-fix-profile-update-reading-end-of-lines.patch @@ -0,0 +1,25 @@ +From e296749b8fe936f72e85cbaca57215cb528ed2e5 Mon Sep 17 00:00:00 2001 +From: Nathan West +Date: Mon, 1 Aug 2016 17:12:24 -0400 +Subject: [PATCH 03/18] apps: fix profile update reading end of lines + +--- + apps/volk_profile.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/apps/volk_profile.cc b/apps/volk_profile.cc +index 2086e3f..51591cc 100644 +--- a/apps/volk_profile.cc ++++ b/apps/volk_profile.cc +@@ -261,7 +261,7 @@ void read_results(std::vector *results, std::string path) + found = 127; + } + str_size = config_str.size(); +- char buffer[128]; ++ char buffer[128] = {'\0'}; + config_str.copy(buffer, found + 1, 0); + buffer[found] = '\0'; + single_kernel_result.push_back(std::string(buffer)); +-- +2.11.0 + diff --git a/patches/0004-apps-fix-profile-update-reading-end-of-lines.patch b/patches/0004-apps-fix-profile-update-reading-end-of-lines.patch new file mode 100644 index 0000000..9e2f048 --- /dev/null +++ b/patches/0004-apps-fix-profile-update-reading-end-of-lines.patch @@ -0,0 +1,25 @@ +From 0d672945dfca506d4e49e857ce886d2b3dc80e96 Mon Sep 17 00:00:00 2001 +From: Nathan West +Date: Mon, 1 Aug 2016 17:12:24 -0400 +Subject: [PATCH 04/18] apps: fix profile update reading end of lines + +--- + apps/volk_profile.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/apps/volk_profile.cc b/apps/volk_profile.cc +index 2086e3f..51591cc 100644 +--- a/apps/volk_profile.cc ++++ b/apps/volk_profile.cc +@@ -261,7 +261,7 @@ void read_results(std::vector *results, std::string path) + found = 127; + } + str_size = config_str.size(); +- char buffer[128]; ++ char buffer[128] = {'\0'}; + config_str.copy(buffer, found + 1, 0); + buffer[found] = '\0'; + single_kernel_result.push_back(std::string(buffer)); +-- +2.11.0 + diff --git a/patches/0005-qa-lower-tolerance-for-32fc_mag-to-fix-issue-96.patch b/patches/0005-qa-lower-tolerance-for-32fc_mag-to-fix-issue-96.patch new file mode 100644 index 0000000..e753e95 --- /dev/null +++ b/patches/0005-qa-lower-tolerance-for-32fc_mag-to-fix-issue-96.patch @@ -0,0 +1,34 @@ +From 0f6d889b891bc2ac78c56ad18e43c4ec5a372574 Mon Sep 17 00:00:00 2001 +From: Nathan West +Date: Thu, 4 Aug 2016 11:30:55 -0400 +Subject: [PATCH 05/18] qa: lower tolerance for 32fc_mag to fix issue #96 + +--- + lib/kernel_tests.h | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/lib/kernel_tests.h b/lib/kernel_tests.h +index 2bf1f0c..7c82733 100644 +--- a/lib/kernel_tests.h ++++ b/lib/kernel_tests.h +@@ -24,6 +24,8 @@ std::vector init_test_list(volk_test_params_t test_params) + // Some kernels need a lower tolerance + volk_test_params_t test_params_inacc = volk_test_params_t(1e-2, test_params.scalar(), + test_params.vlen(), test_params.iter(), test_params.benchmark_mode(), test_params.kernel_regex()); ++ volk_test_params_t test_params_inacc_tenth = volk_test_params_t(1e-1, test_params.scalar(), ++ test_params.vlen(), test_params.iter(), test_params.benchmark_mode(), test_params.kernel_regex()); + volk_test_params_t test_params_int1 = volk_test_params_t(1, test_params.scalar(), + test_params.vlen(), test_params.iter(), test_params.benchmark_mode(), test_params.kernel_regex()); + +@@ -79,7 +81,7 @@ std::vector init_test_list(volk_test_params_t test_params) + (VOLK_INIT_TEST(volk_32fc_index_max_16u, volk_test_params_t(3, test_params.scalar(), test_params.vlen(), test_params.iter(), test_params.benchmark_mode(), test_params.kernel_regex()))) + (VOLK_INIT_TEST(volk_32fc_index_max_32u, volk_test_params_t(3, test_params.scalar(), test_params.vlen(), test_params.iter(), test_params.benchmark_mode(), test_params.kernel_regex()))) + (VOLK_INIT_TEST(volk_32fc_s32f_magnitude_16i, test_params_int1)) +- (VOLK_INIT_TEST(volk_32fc_magnitude_32f, test_params_inacc)) ++ (VOLK_INIT_TEST(volk_32fc_magnitude_32f, test_params_inacc_tenth)) + (VOLK_INIT_TEST(volk_32fc_magnitude_squared_32f, test_params)) + (VOLK_INIT_TEST(volk_32fc_x2_multiply_32fc, test_params)) + (VOLK_INIT_TEST(volk_32fc_x2_multiply_conjugate_32fc, test_params)) +-- +2.11.0 + diff --git a/patches/0006-Add-NEON-AVX-and-unaligned-versions-of-SSE4.1-and-SS.patch b/patches/0006-Add-NEON-AVX-and-unaligned-versions-of-SSE4.1-and-SS.patch new file mode 100644 index 0000000..43b0c0b --- /dev/null +++ b/patches/0006-Add-NEON-AVX-and-unaligned-versions-of-SSE4.1-and-SS.patch @@ -0,0 +1,346 @@ +From aeaf56828ba0a08728a0cf2d2370b5d0153332b1 Mon Sep 17 00:00:00 2001 +From: Carles Fernandez +Date: Fri, 23 Sep 2016 19:16:27 +0200 +Subject: [PATCH 06/18] Add NEON, AVX and unaligned versions of SSE4.1 and SSE + +--- + kernels/volk/volk_32f_index_max_32u.h | 316 ++++++++++++++++++++++++++++++++++ + 1 file changed, 316 insertions(+) + +diff --git a/kernels/volk/volk_32f_index_max_32u.h b/kernels/volk/volk_32f_index_max_32u.h +index 17b8f70..1888405 100644 +--- a/kernels/volk/volk_32f_index_max_32u.h ++++ b/kernels/volk/volk_32f_index_max_32u.h +@@ -130,6 +130,69 @@ volk_32f_index_max_32u_a_sse4_1(uint32_t* target, const float* src0, uint32_t nu + #endif /*LV_HAVE_SSE4_1*/ + + ++#ifdef LV_HAVE_SSE4_1 ++#include ++ ++static inline void volk_32f_index_max_32u_u_sse4_1(uint32_t* target, const float* src0, uint32_t num_points) ++{ ++ if(num_points > 0) ++ { ++ uint32_t number = 0; ++ const uint32_t quarterPoints = num_points / 4; ++ ++ float* inputPtr = (float*)src0; ++ ++ __m128 indexIncrementValues = _mm_set1_ps(4); ++ __m128 currentIndexes = _mm_set_ps(-1,-2,-3,-4); ++ ++ float max = src0[0]; ++ float index = 0; ++ __m128 maxValues = _mm_set1_ps(max); ++ __m128 maxValuesIndex = _mm_setzero_ps(); ++ __m128 compareResults; ++ __m128 currentValues; ++ ++ __VOLK_ATTR_ALIGNED(16) float maxValuesBuffer[4]; ++ __VOLK_ATTR_ALIGNED(16) float maxIndexesBuffer[4]; ++ ++ for(;number < quarterPoints; number++) ++ { ++ currentValues = _mm_loadu_ps(inputPtr); inputPtr += 4; ++ currentIndexes = _mm_add_ps(currentIndexes, indexIncrementValues); ++ compareResults = _mm_cmpgt_ps(maxValues, currentValues); ++ maxValuesIndex = _mm_blendv_ps(currentIndexes, maxValuesIndex, compareResults); ++ maxValues = _mm_blendv_ps(currentValues, maxValues, compareResults); ++ } ++ ++ // Calculate the largest value from the remaining 4 points ++ _mm_store_ps(maxValuesBuffer, maxValues); ++ _mm_store_ps(maxIndexesBuffer, maxValuesIndex); ++ ++ for(number = 0; number < 4; number++) ++ { ++ if(maxValuesBuffer[number] > max) ++ { ++ index = maxIndexesBuffer[number]; ++ max = maxValuesBuffer[number]; ++ } ++ } ++ ++ number = quarterPoints * 4; ++ for(;number < num_points; number++) ++ { ++ if(src0[number] > max) ++ { ++ index = number; ++ max = src0[number]; ++ } ++ } ++ target[0] = (uint32_t)index; ++ } ++} ++ ++#endif /*LV_HAVE_SSE4_1*/ ++ ++ + #ifdef LV_HAVE_SSE + + #include +@@ -193,6 +256,259 @@ volk_32f_index_max_32u_a_sse(uint32_t* target, const float* src0, uint32_t num_p + #endif /*LV_HAVE_SSE*/ + + ++#ifdef LV_HAVE_SSE ++#include ++ ++static inline void volk_32f_index_max_32u_u_sse(uint32_t* target, const float* src0, uint32_t num_points) ++{ ++ if(num_points > 0) ++ { ++ uint32_t number = 0; ++ const uint32_t quarterPoints = num_points / 4; ++ ++ float* inputPtr = (float*)src0; ++ ++ __m128 indexIncrementValues = _mm_set1_ps(4); ++ __m128 currentIndexes = _mm_set_ps(-1,-2,-3,-4); ++ ++ float max = src0[0]; ++ float index = 0; ++ __m128 maxValues = _mm_set1_ps(max); ++ __m128 maxValuesIndex = _mm_setzero_ps(); ++ __m128 compareResults; ++ __m128 currentValues; ++ ++ __VOLK_ATTR_ALIGNED(16) float maxValuesBuffer[4]; ++ __VOLK_ATTR_ALIGNED(16) float maxIndexesBuffer[4]; ++ ++ for(;number < quarterPoints; number++) ++ { ++ currentValues = _mm_loadu_ps(inputPtr); inputPtr += 4; ++ currentIndexes = _mm_add_ps(currentIndexes, indexIncrementValues); ++ compareResults = _mm_cmpgt_ps(maxValues, currentValues); ++ maxValuesIndex = _mm_or_ps(_mm_and_ps(compareResults, maxValuesIndex) , _mm_andnot_ps(compareResults, currentIndexes)); ++ maxValues = _mm_or_ps(_mm_and_ps(compareResults, maxValues) , _mm_andnot_ps(compareResults, currentValues)); ++ } ++ ++ // Calculate the largest value from the remaining 4 points ++ _mm_store_ps(maxValuesBuffer, maxValues); ++ _mm_store_ps(maxIndexesBuffer, maxValuesIndex); ++ ++ for(number = 0; number < 4; number++) ++ { ++ if(maxValuesBuffer[number] > max) ++ { ++ index = maxIndexesBuffer[number]; ++ max = maxValuesBuffer[number]; ++ } ++ } ++ ++ number = quarterPoints * 4; ++ for(;number < num_points; number++) ++ { ++ if(src0[number] > max) ++ { ++ index = number; ++ max = src0[number]; ++ } ++ } ++ target[0] = (uint32_t)index; ++ } ++} ++ ++#endif /*LV_HAVE_SSE*/ ++ ++ ++#ifdef LV_HAVE_AVX ++#include ++ ++static inline void volk_32f_index_max_32u_a_avx(uint32_t* target, const float* src0, uint32_t num_points) ++{ ++ if(num_points > 0) ++ { ++ uint32_t number = 0; ++ const uint32_t quarterPoints = num_points / 8; ++ ++ float* inputPtr = (float*)src0; ++ ++ __m256 indexIncrementValues = _mm256_set1_ps(8); ++ __m256 currentIndexes = _mm256_set_ps(-1,-2,-3,-4,-5,-6,-7,-8); ++ ++ float max = src0[0]; ++ float index = 0; ++ __m256 maxValues = _mm256_set1_ps(max); ++ __m256 maxValuesIndex = _mm256_setzero_ps(); ++ __m256 compareResults; ++ __m256 currentValues; ++ ++ __VOLK_ATTR_ALIGNED(32) float maxValuesBuffer[8]; ++ __VOLK_ATTR_ALIGNED(32) float maxIndexesBuffer[8]; ++ ++ for(;number < quarterPoints; number++) ++ { ++ currentValues = _mm256_load_ps(inputPtr); inputPtr += 8; ++ currentIndexes = _mm256_add_ps(currentIndexes, indexIncrementValues); ++ compareResults = _mm256_cmp_ps(maxValues, currentValues, 0x1e); ++ maxValuesIndex = _mm256_blendv_ps(currentIndexes, maxValuesIndex, compareResults); ++ maxValues = _mm256_blendv_ps(currentValues, maxValues, compareResults); ++ } ++ ++ // Calculate the largest value from the remaining 8 points ++ _mm256_store_ps(maxValuesBuffer, maxValues); ++ _mm256_store_ps(maxIndexesBuffer, maxValuesIndex); ++ ++ for(number = 0; number < 8; number++) ++ { ++ if(maxValuesBuffer[number] > max) ++ { ++ index = maxIndexesBuffer[number]; ++ max = maxValuesBuffer[number]; ++ } ++ } ++ ++ number = quarterPoints * 8; ++ for(;number < num_points; number++) ++ { ++ if(src0[number] > max) ++ { ++ index = number; ++ max = src0[number]; ++ } ++ } ++ target[0] = (uint32_t)index; ++ } ++} ++ ++#endif /*LV_HAVE_AVX*/ ++ ++ ++#ifdef LV_HAVE_AVX ++#include ++ ++static inline void volk_32f_index_max_32u_u_avx(uint32_t* target, const float* src0, uint32_t num_points) ++{ ++ if(num_points > 0) ++ { ++ uint32_t number = 0; ++ const uint32_t quarterPoints = num_points / 8; ++ ++ float* inputPtr = (float*)src0; ++ ++ __m256 indexIncrementValues = _mm256_set1_ps(8); ++ __m256 currentIndexes = _mm256_set_ps(-1,-2,-3,-4,-5,-6,-7,-8); ++ ++ float max = src0[0]; ++ float index = 0; ++ __m256 maxValues = _mm256_set1_ps(max); ++ __m256 maxValuesIndex = _mm256_setzero_ps(); ++ __m256 compareResults; ++ __m256 currentValues; ++ ++ __VOLK_ATTR_ALIGNED(32) float maxValuesBuffer[8]; ++ __VOLK_ATTR_ALIGNED(32) float maxIndexesBuffer[8]; ++ ++ for(;number < quarterPoints; number++) ++ { ++ currentValues = _mm256_loadu_ps(inputPtr); inputPtr += 8; ++ currentIndexes = _mm256_add_ps(currentIndexes, indexIncrementValues); ++ compareResults = _mm256_cmp_ps(maxValues, currentValues, 0x1e); ++ maxValuesIndex = _mm256_blendv_ps(currentIndexes, maxValuesIndex, compareResults); ++ maxValues = _mm256_blendv_ps(currentValues, maxValues, compareResults); ++ } ++ ++ // Calculate the largest value from the remaining 8 points ++ _mm256_store_ps(maxValuesBuffer, maxValues); ++ _mm256_store_ps(maxIndexesBuffer, maxValuesIndex); ++ ++ for(number = 0; number < 8; number++) ++ { ++ if(maxValuesBuffer[number] > max) ++ { ++ index = maxIndexesBuffer[number]; ++ max = maxValuesBuffer[number]; ++ } ++ } ++ ++ number = quarterPoints * 8; ++ for(;number < num_points; number++) ++ { ++ if(src0[number] > max) ++ { ++ index = number; ++ max = src0[number]; ++ } ++ } ++ target[0] = (uint32_t)index; ++ } ++} ++ ++#endif /*LV_HAVE_AVX*/ ++ ++ ++#ifdef LV_HAVE_NEON ++#include ++ ++static inline void volk_32f_index_max_32u_neon(uint32_t* target, const float* src0, uint32_t num_points) ++{ ++ if(num_points > 0) ++ { ++ uint32_t number = 0; ++ const uint32_t quarterPoints = num_points / 4; ++ ++ float* inputPtr = (float*)src0; ++ float32x4_t indexIncrementValues = vdupq_n_f32(4); ++ __VOLK_ATTR_ALIGNED(16) float currentIndexes_float[4] = { -4.0f, -3.0f, -2.0f, -1.0f }; ++ float32x4_t currentIndexes = vld1q_f32(currentIndexes_float); ++ ++ float max = src0[0]; ++ float index = 0; ++ float32x4_t maxValues = vdupq_n_f32(max); ++ uint32x4_t maxValuesIndex = vmovq_n_u32(0); ++ uint32x4_t compareResults; ++ uint32x4_t currentIndexes_u; ++ float32x4_t currentValues; ++ ++ __VOLK_ATTR_ALIGNED(16) float maxValuesBuffer[4]; ++ __VOLK_ATTR_ALIGNED(16) float maxIndexesBuffer[4]; ++ ++ for(;number < quarterPoints; number++) ++ { ++ currentValues = vld1q_f32(inputPtr); inputPtr += 4; ++ currentIndexes = vaddq_f32(currentIndexes, indexIncrementValues); ++ currentIndexes_u = vcvtq_u32_f32(currentIndexes); ++ compareResults = vcgtq_f32( maxValues, currentValues); ++ maxValuesIndex = vorrq_u32( vandq_u32( compareResults, maxValuesIndex ), vbicq_u32(currentIndexes_u, compareResults) ); ++ maxValues = vmaxq_f32(currentValues, maxValues); ++ } ++ ++ // Calculate the largest value from the remaining 4 points ++ vst1q_f32(maxValuesBuffer, maxValues); ++ vst1q_f32(maxIndexesBuffer, vcvtq_f32_u32(maxValuesIndex)); ++ for(number = 0; number < 4; number++) ++ { ++ if(maxValuesBuffer[number] > max) ++ { ++ index = maxIndexesBuffer[number]; ++ max = maxValuesBuffer[number]; ++ } ++ } ++ ++ number = quarterPoints * 4; ++ for(;number < num_points; number++) ++ { ++ if(src0[number] > max) ++ { ++ index = number; ++ max = src0[number]; ++ } ++ } ++ target[0] = (uint32_t)index; ++ } ++} ++ ++#endif /*LV_HAVE_NEON*/ ++ ++ + #ifdef LV_HAVE_GENERIC + + static inline void +-- +2.11.0 + diff --git a/patches/0007-added-__VOLK_PREFETCH-compatibility-macro.patch b/patches/0007-added-__VOLK_PREFETCH-compatibility-macro.patch new file mode 100644 index 0000000..564afa2 --- /dev/null +++ b/patches/0007-added-__VOLK_PREFETCH-compatibility-macro.patch @@ -0,0 +1,357 @@ +From d065c1cdd34c0f5c78911331381e10687faa14a0 Mon Sep 17 00:00:00 2001 +From: Josh Blum +Date: Fri, 20 Jan 2017 10:03:49 -0800 +Subject: [PATCH 07/18] added __VOLK_PREFETCH() compatibility macro + +__VOLK_PREFETCH() performs __builtin_prefetch() on GCC compilers +and is otherwise a NOP for other systems. The use of __builtin_prefetch +was replaced with __VOLK_PREFETCH() to make the kernels portable. +--- + include/volk/volk_common.h | 3 +++ + kernels/volk/volk_16i_max_star_16i.h | 2 +- + kernels/volk/volk_16i_max_star_horizontal_16i.h | 2 +- + kernels/volk/volk_16ic_convert_32fc.h | 2 +- + kernels/volk/volk_16ic_x2_dot_prod_16ic.h | 28 +++++++++++----------- + kernels/volk/volk_16ic_x2_multiply_16ic.h | 4 ++-- + kernels/volk/volk_32f_x2_add_32f.h | 4 ++-- + kernels/volk/volk_32fc_conjugate_32fc.h | 2 +- + kernels/volk/volk_32fc_convert_16ic.h | 6 ++--- + .../volk/volk_32fc_x2_conjugate_dot_prod_32fc.h | 4 ++-- + kernels/volk/volk_32fc_x2_dot_prod_32fc.h | 16 ++++++------- + kernels/volk/volk_32fc_x2_multiply_32fc.h | 8 +++---- + .../volk/volk_32fc_x2_multiply_conjugate_32fc.h | 4 ++-- + 13 files changed, 44 insertions(+), 41 deletions(-) + +diff --git a/include/volk/volk_common.h b/include/volk/volk_common.h +index 4d35f5c..a53b139 100644 +--- a/include/volk/volk_common.h ++++ b/include/volk/volk_common.h +@@ -16,6 +16,7 @@ + # define __VOLK_ATTR_EXPORT + # define __VOLK_ATTR_IMPORT + # endif ++# define __VOLK_PREFETCH(addr) __builtin_prefetch(addr) + #elif _MSC_VER + # define __VOLK_ATTR_ALIGNED(x) __declspec(align(x)) + # define __VOLK_ATTR_UNUSED +@@ -23,6 +24,7 @@ + # define __VOLK_ATTR_DEPRECATED __declspec(deprecated) + # define __VOLK_ATTR_EXPORT __declspec(dllexport) + # define __VOLK_ATTR_IMPORT __declspec(dllimport) ++# define __VOLK_PREFETCH(addr) + #else + # define __VOLK_ATTR_ALIGNED(x) + # define __VOLK_ATTR_UNUSED +@@ -30,6 +32,7 @@ + # define __VOLK_ATTR_DEPRECATED + # define __VOLK_ATTR_EXPORT + # define __VOLK_ATTR_IMPORT ++# define __VOLK_PREFETCH(addr) + #endif + + //////////////////////////////////////////////////////////////////////// +diff --git a/kernels/volk/volk_16i_max_star_16i.h b/kernels/volk/volk_16i_max_star_16i.h +index e470642..531a8b5 100644 +--- a/kernels/volk/volk_16i_max_star_16i.h ++++ b/kernels/volk/volk_16i_max_star_16i.h +@@ -139,7 +139,7 @@ volk_16i_max_star_16i_neon(short* target, short* src0, unsigned int num_points) + + for(number=0; number < eighth_points; ++number) { + input_vec = vld1q_s16(src0); +- __builtin_prefetch(src0+16); ++ __VOLK_PREFETCH(src0+16); + diff = vsubq_s16(candidate_vec, input_vec); + comp1 = vcgeq_s16(diff, zeros); + comp2 = vcltq_s16(diff, zeros); +diff --git a/kernels/volk/volk_16i_max_star_horizontal_16i.h b/kernels/volk/volk_16i_max_star_horizontal_16i.h +index 1da8356..964587c 100644 +--- a/kernels/volk/volk_16i_max_star_horizontal_16i.h ++++ b/kernels/volk/volk_16i_max_star_horizontal_16i.h +@@ -169,7 +169,7 @@ volk_16i_max_star_horizontal_16i_neon(int16_t* target, int16_t* src0, unsigned i + zeros = veorq_s16(zeros, zeros); + for(number=0; number < eighth_points; ++number) { + input_vec = vld2q_s16(src0); +- //__builtin_prefetch(src0+16); ++ //__VOLK_PREFETCH(src0+16); + diff = vsubq_s16(input_vec.val[0], input_vec.val[1]); + comp1 = vcgeq_s16(diff, zeros); + comp2 = vcltq_s16(diff, zeros); +diff --git a/kernels/volk/volk_16ic_convert_32fc.h b/kernels/volk/volk_16ic_convert_32fc.h +index 88e079d..9779b0f 100644 +--- a/kernels/volk/volk_16ic_convert_32fc.h ++++ b/kernels/volk/volk_16ic_convert_32fc.h +@@ -198,7 +198,7 @@ static inline void volk_16ic_convert_32fc_neon(lv_32fc_t* outputVector, const lv + for(number = 0; number < sse_iters; number++) + { + a16x4 = vld1_s16((const int16_t*)_in); +- __builtin_prefetch(_in + 4); ++ __VOLK_PREFETCH(_in + 4); + a32x4 = vmovl_s16(a16x4); + f32x4 = vcvtq_f32_s32(a32x4); + vst1q_f32((float32_t*)_out, f32x4); +diff --git a/kernels/volk/volk_16ic_x2_dot_prod_16ic.h b/kernels/volk/volk_16ic_x2_dot_prod_16ic.h +index 9d4c882..8e6de4c 100644 +--- a/kernels/volk/volk_16ic_x2_dot_prod_16ic.h ++++ b/kernels/volk/volk_16ic_x2_dot_prod_16ic.h +@@ -96,9 +96,9 @@ static inline void volk_16ic_x2_dot_prod_16ic_a_sse2(lv_16sc_t* out, const lv_16 + { + // a[127:0]=[a3.i,a3.r,a2.i,a2.r,a1.i,a1.r,a0.i,a0.r] + a = _mm_load_si128((__m128i*)_in_a); //load (2 byte imag, 2 byte real) x 4 into 128 bits reg +- __builtin_prefetch(_in_a + 8); ++ __VOLK_PREFETCH(_in_a + 8); + b = _mm_load_si128((__m128i*)_in_b); +- __builtin_prefetch(_in_b + 8); ++ __VOLK_PREFETCH(_in_b + 8); + c = _mm_mullo_epi16(a, b); // a3.i*b3.i, a3.r*b3.r, .... + + c_sr = _mm_srli_si128(c, 2); // Shift a right by imm8 bytes while shifting in zeros, and store the results in dst. +@@ -173,9 +173,9 @@ static inline void volk_16ic_x2_dot_prod_16ic_u_sse2(lv_16sc_t* out, const lv_16 + { + // a[127:0]=[a3.i,a3.r,a2.i,a2.r,a1.i,a1.r,a0.i,a0.r] + a = _mm_loadu_si128((__m128i*)_in_a); //load (2 byte imag, 2 byte real) x 4 into 128 bits reg +- __builtin_prefetch(_in_a + 8); ++ __VOLK_PREFETCH(_in_a + 8); + b = _mm_loadu_si128((__m128i*)_in_b); +- __builtin_prefetch(_in_b + 8); ++ __VOLK_PREFETCH(_in_b + 8); + c = _mm_mullo_epi16(a, b); // a3.i*b3.i, a3.r*b3.r, .... + + c_sr = _mm_srli_si128(c, 2); // Shift a right by imm8 bytes while shifting in zeros, and store the results in dst. +@@ -248,9 +248,9 @@ static inline void volk_16ic_x2_dot_prod_16ic_u_axv2(lv_16sc_t* out, const lv_16 + for(number = 0; number < avx_iters; number++) + { + a = _mm256_loadu_si256((__m256i*)_in_a); +- __builtin_prefetch(_in_a + 16); ++ __VOLK_PREFETCH(_in_a + 16); + b = _mm256_loadu_si256((__m256i*)_in_b); +- __builtin_prefetch(_in_b + 16); ++ __VOLK_PREFETCH(_in_b + 16); + c = _mm256_mullo_epi16(a, b); + + c_sr = _mm256_srli_si256(c, 2); // Shift a right by imm8 bytes while shifting in zeros, and store the results in dst. +@@ -324,9 +324,9 @@ static inline void volk_16ic_x2_dot_prod_16ic_a_axv2(lv_16sc_t* out, const lv_16 + for(number = 0; number < avx_iters; number++) + { + a = _mm256_load_si256((__m256i*)_in_a); +- __builtin_prefetch(_in_a + 16); ++ __VOLK_PREFETCH(_in_a + 16); + b = _mm256_load_si256((__m256i*)_in_b); +- __builtin_prefetch(_in_b + 16); ++ __VOLK_PREFETCH(_in_b + 16); + c = _mm256_mullo_epi16(a, b); + + c_sr = _mm256_srli_si256(c, 2); // Shift a right by imm8 bytes while shifting in zeros, and store the results in dst. +@@ -399,8 +399,8 @@ static inline void volk_16ic_x2_dot_prod_16ic_neon(lv_16sc_t* out, const lv_16sc + { + a_val = vld2_s16((int16_t*)a_ptr); // a0r|a1r|a2r|a3r || a0i|a1i|a2i|a3i + b_val = vld2_s16((int16_t*)b_ptr); // b0r|b1r|b2r|b3r || b0i|b1i|b2i|b3i +- __builtin_prefetch(a_ptr + 8); +- __builtin_prefetch(b_ptr + 8); ++ __VOLK_PREFETCH(a_ptr + 8); ++ __VOLK_PREFETCH(b_ptr + 8); + + // multiply the real*real and imag*imag to get real result + // a0r*b0r|a1r*b1r|a2r*b2r|a3r*b3r +@@ -465,8 +465,8 @@ static inline void volk_16ic_x2_dot_prod_16ic_neon_vma(lv_16sc_t* out, const lv_ + { + a_val = vld2_s16((int16_t*)a_ptr); // a0r|a1r|a2r|a3r || a0i|a1i|a2i|a3i + b_val = vld2_s16((int16_t*)b_ptr); // b0r|b1r|b2r|b3r || b0i|b1i|b2i|b3i +- __builtin_prefetch(a_ptr + 8); +- __builtin_prefetch(b_ptr + 8); ++ __VOLK_PREFETCH(a_ptr + 8); ++ __VOLK_PREFETCH(b_ptr + 8); + + tmp.val[0] = vmul_s16(a_val.val[0], b_val.val[0]); + tmp.val[1] = vmul_s16(a_val.val[1], b_val.val[0]); +@@ -519,8 +519,8 @@ static inline void volk_16ic_x2_dot_prod_16ic_neon_optvma(lv_16sc_t* out, const + { + a_val = vld2_s16((int16_t*)a_ptr); // a0r|a1r|a2r|a3r || a0i|a1i|a2i|a3i + b_val = vld2_s16((int16_t*)b_ptr); // b0r|b1r|b2r|b3r || b0i|b1i|b2i|b3i +- __builtin_prefetch(a_ptr + 8); +- __builtin_prefetch(b_ptr + 8); ++ __VOLK_PREFETCH(a_ptr + 8); ++ __VOLK_PREFETCH(b_ptr + 8); + + // use 2 accumulators to remove inter-instruction data dependencies + accumulator1.val[0] = vmla_s16(accumulator1.val[0], a_val.val[0], b_val.val[0]); +diff --git a/kernels/volk/volk_16ic_x2_multiply_16ic.h b/kernels/volk/volk_16ic_x2_multiply_16ic.h +index 17033ae..9dcf06f 100644 +--- a/kernels/volk/volk_16ic_x2_multiply_16ic.h ++++ b/kernels/volk/volk_16ic_x2_multiply_16ic.h +@@ -291,8 +291,8 @@ static inline void volk_16ic_x2_multiply_16ic_neon(lv_16sc_t* out, const lv_16sc + { + a_val = vld2_s16((int16_t*)a_ptr); // a0r|a1r|a2r|a3r || a0i|a1i|a2i|a3i + b_val = vld2_s16((int16_t*)b_ptr); // b0r|b1r|b2r|b3r || b0i|b1i|b2i|b3i +- __builtin_prefetch(a_ptr + 4); +- __builtin_prefetch(b_ptr + 4); ++ __VOLK_PREFETCH(a_ptr + 4); ++ __VOLK_PREFETCH(b_ptr + 4); + + // multiply the real*real and imag*imag to get real result + // a0r*b0r|a1r*b1r|a2r*b2r|a3r*b3r +diff --git a/kernels/volk/volk_32f_x2_add_32f.h b/kernels/volk/volk_32f_x2_add_32f.h +index fc9cf5b..28cf73d 100644 +--- a/kernels/volk/volk_32f_x2_add_32f.h ++++ b/kernels/volk/volk_32f_x2_add_32f.h +@@ -191,8 +191,8 @@ volk_32f_x2_add_32f_u_neon(float* cVector, const float* aVector, + // Load in to NEON registers + aVal = vld1q_f32(aPtr); + bVal = vld1q_f32(bPtr); +- __builtin_prefetch(aPtr+4); +- __builtin_prefetch(bPtr+4); ++ __VOLK_PREFETCH(aPtr+4); ++ __VOLK_PREFETCH(bPtr+4); + + // vector add + cVal = vaddq_f32(aVal, bVal); +diff --git a/kernels/volk/volk_32fc_conjugate_32fc.h b/kernels/volk/volk_32fc_conjugate_32fc.h +index 1fdb6c2..6994d0e 100644 +--- a/kernels/volk/volk_32fc_conjugate_32fc.h ++++ b/kernels/volk/volk_32fc_conjugate_32fc.h +@@ -248,7 +248,7 @@ volk_32fc_conjugate_32fc_a_neon(lv_32fc_t* cVector, const lv_32fc_t* aVector, un + const lv_32fc_t* a = aVector; + + for(number=0; number < quarterPoints; number++){ +- __builtin_prefetch(a+4); ++ __VOLK_PREFETCH(a+4); + x = vld2q_f32((float*)a); // Load the complex data as ar,br,cr,dr; ai,bi,ci,di + + // xor the imaginary lane +diff --git a/kernels/volk/volk_32fc_convert_16ic.h b/kernels/volk/volk_32fc_convert_16ic.h +index 4f6e6a5..307ab36 100644 +--- a/kernels/volk/volk_32fc_convert_16ic.h ++++ b/kernels/volk/volk_32fc_convert_16ic.h +@@ -75,7 +75,7 @@ static inline void volk_32fc_convert_16ic_u_sse2(lv_16sc_t* outputVector, const + { + inputVal1 = _mm_loadu_ps((float*)inputVectorPtr); inputVectorPtr += 4; + inputVal2 = _mm_loadu_ps((float*)inputVectorPtr); inputVectorPtr += 4; +- __builtin_prefetch(inputVectorPtr + 8); ++ __VOLK_PREFETCH(inputVectorPtr + 8); + + // Clip + ret1 = _mm_max_ps(_mm_min_ps(inputVal1, vmax_val), vmin_val); +@@ -128,7 +128,7 @@ static inline void volk_32fc_convert_16ic_a_sse2(lv_16sc_t* outputVector, const + { + inputVal1 = _mm_load_ps((float*)inputVectorPtr); inputVectorPtr += 4; + inputVal2 = _mm_load_ps((float*)inputVectorPtr); inputVectorPtr += 4; +- __builtin_prefetch(inputVectorPtr + 8); ++ __VOLK_PREFETCH(inputVectorPtr + 8); + + // Clip + ret1 = _mm_max_ps(_mm_min_ps(inputVal1, vmax_val), vmin_val); +@@ -184,7 +184,7 @@ static inline void volk_32fc_convert_16ic_neon(lv_16sc_t* outputVector, const lv + { + a = vld1q_f32((const float32_t*)(inputVectorPtr)); inputVectorPtr += 4; + b = vld1q_f32((const float32_t*)(inputVectorPtr)); inputVectorPtr += 4; +- __builtin_prefetch(inputVectorPtr + 8); ++ __VOLK_PREFETCH(inputVectorPtr + 8); + + ret1 = vmaxq_f32(vminq_f32(a, max_val), min_val); + ret2 = vmaxq_f32(vminq_f32(b, max_val), min_val); +diff --git a/kernels/volk/volk_32fc_x2_conjugate_dot_prod_32fc.h b/kernels/volk/volk_32fc_x2_conjugate_dot_prod_32fc.h +index 981899c..4addf80 100644 +--- a/kernels/volk/volk_32fc_x2_conjugate_dot_prod_32fc.h ++++ b/kernels/volk/volk_32fc_x2_conjugate_dot_prod_32fc.h +@@ -219,8 +219,8 @@ static inline void volk_32fc_x2_conjugate_dot_prod_32fc_neon(lv_32fc_t* result, + for(number = 0; number < quarter_points; ++number) { + a_val = vld2q_f32((float*)a_ptr); // a0r|a1r|a2r|a3r || a0i|a1i|a2i|a3i + b_val = vld2q_f32((float*)b_ptr); // b0r|b1r|b2r|b3r || b0i|b1i|b2i|b3i +- __builtin_prefetch(a_ptr+8); +- __builtin_prefetch(b_ptr+8); ++ __VOLK_PREFETCH(a_ptr+8); ++ __VOLK_PREFETCH(b_ptr+8); + + // do the first multiply + tmp_imag.val[1] = vmulq_f32(a_val.val[1], b_val.val[0]); +diff --git a/kernels/volk/volk_32fc_x2_dot_prod_32fc.h b/kernels/volk/volk_32fc_x2_dot_prod_32fc.h +index 39d0c78..0c3271c 100644 +--- a/kernels/volk/volk_32fc_x2_dot_prod_32fc.h ++++ b/kernels/volk/volk_32fc_x2_dot_prod_32fc.h +@@ -894,8 +894,8 @@ static inline void volk_32fc_x2_dot_prod_32fc_neon(lv_32fc_t* result, const lv_3 + for(number = 0; number < quarter_points; ++number) { + a_val = vld2q_f32((float*)a_ptr); // a0r|a1r|a2r|a3r || a0i|a1i|a2i|a3i + b_val = vld2q_f32((float*)b_ptr); // b0r|b1r|b2r|b3r || b0i|b1i|b2i|b3i +- __builtin_prefetch(a_ptr+8); +- __builtin_prefetch(b_ptr+8); ++ __VOLK_PREFETCH(a_ptr+8); ++ __VOLK_PREFETCH(b_ptr+8); + + // multiply the real*real and imag*imag to get real result + // a0r*b0r|a1r*b1r|a2r*b2r|a3r*b3r +@@ -949,8 +949,8 @@ static inline void volk_32fc_x2_dot_prod_32fc_neon_opttests(lv_32fc_t* result, c + for(number = 0; number < quarter_points; ++number) { + a_val = vld2q_f32((float*)a_ptr); // a0r|a1r|a2r|a3r || a0i|a1i|a2i|a3i + b_val = vld2q_f32((float*)b_ptr); // b0r|b1r|b2r|b3r || b0i|b1i|b2i|b3i +- __builtin_prefetch(a_ptr+8); +- __builtin_prefetch(b_ptr+8); ++ __VOLK_PREFETCH(a_ptr+8); ++ __VOLK_PREFETCH(b_ptr+8); + + // do the first multiply + tmp_imag.val[1] = vmulq_f32(a_val.val[1], b_val.val[0]); +@@ -998,8 +998,8 @@ static inline void volk_32fc_x2_dot_prod_32fc_neon_optfma(lv_32fc_t* result, con + for(number = 0; number < quarter_points; ++number) { + a_val = vld2q_f32((float*)a_ptr); // a0r|a1r|a2r|a3r || a0i|a1i|a2i|a3i + b_val = vld2q_f32((float*)b_ptr); // b0r|b1r|b2r|b3r || b0i|b1i|b2i|b3i +- __builtin_prefetch(a_ptr+8); +- __builtin_prefetch(b_ptr+8); ++ __VOLK_PREFETCH(a_ptr+8); ++ __VOLK_PREFETCH(b_ptr+8); + + // use 2 accumulators to remove inter-instruction data dependencies + accumulator1.val[0] = vmlaq_f32(accumulator1.val[0], a_val.val[0], b_val.val[0]); +@@ -1050,8 +1050,8 @@ static inline void volk_32fc_x2_dot_prod_32fc_neon_optfmaunroll(lv_32fc_t* resul + for(number = 0; number < quarter_points; ++number) { + a_val = vld4q_f32((float*)a_ptr); // a0r|a1r|a2r|a3r || a0i|a1i|a2i|a3i + b_val = vld4q_f32((float*)b_ptr); // b0r|b1r|b2r|b3r || b0i|b1i|b2i|b3i +- __builtin_prefetch(a_ptr+8); +- __builtin_prefetch(b_ptr+8); ++ __VOLK_PREFETCH(a_ptr+8); ++ __VOLK_PREFETCH(b_ptr+8); + + // use 2 accumulators to remove inter-instruction data dependencies + accumulator1.val[0] = vmlaq_f32(accumulator1.val[0], a_val.val[0], b_val.val[0]); +diff --git a/kernels/volk/volk_32fc_x2_multiply_32fc.h b/kernels/volk/volk_32fc_x2_multiply_32fc.h +index 1709140..0b9d3fe 100644 +--- a/kernels/volk/volk_32fc_x2_multiply_32fc.h ++++ b/kernels/volk/volk_32fc_x2_multiply_32fc.h +@@ -372,8 +372,8 @@ volk_32fc_x2_multiply_32fc_neon(lv_32fc_t* cVector, const lv_32fc_t* aVector, + for(number = 0; number < quarter_points; ++number) { + a_val = vld2q_f32((float*)a_ptr); // a0r|a1r|a2r|a3r || a0i|a1i|a2i|a3i + b_val = vld2q_f32((float*)b_ptr); // b0r|b1r|b2r|b3r || b0i|b1i|b2i|b3i +- __builtin_prefetch(a_ptr+4); +- __builtin_prefetch(b_ptr+4); ++ __VOLK_PREFETCH(a_ptr+4); ++ __VOLK_PREFETCH(b_ptr+4); + + // multiply the real*real and imag*imag to get real result + // a0r*b0r|a1r*b1r|a2r*b2r|a3r*b3r +@@ -420,8 +420,8 @@ volk_32fc_x2_multiply_32fc_neon_opttests(lv_32fc_t* cVector, const lv_32fc_t* aV + for(number = 0; number < quarter_points; ++number) { + a_val = vld2q_f32((float*)a_ptr); // a0r|a1r|a2r|a3r || a0i|a1i|a2i|a3i + b_val = vld2q_f32((float*)b_ptr); // b0r|b1r|b2r|b3r || b0i|b1i|b2i|b3i +- __builtin_prefetch(a_ptr+4); +- __builtin_prefetch(b_ptr+4); ++ __VOLK_PREFETCH(a_ptr+4); ++ __VOLK_PREFETCH(b_ptr+4); + + // do the first multiply + tmp_imag.val[1] = vmulq_f32(a_val.val[1], b_val.val[0]); +diff --git a/kernels/volk/volk_32fc_x2_multiply_conjugate_32fc.h b/kernels/volk/volk_32fc_x2_multiply_conjugate_32fc.h +index 703c78d..c13a32e 100644 +--- a/kernels/volk/volk_32fc_x2_multiply_conjugate_32fc.h ++++ b/kernels/volk/volk_32fc_x2_multiply_conjugate_32fc.h +@@ -262,8 +262,8 @@ volk_32fc_x2_multiply_conjugate_32fc_neon(lv_32fc_t* cVector, const lv_32fc_t* a + a_val = vld2q_f32((float*)a_ptr); // a0r|a1r|a2r|a3r || a0i|a1i|a2i|a3i + b_val = vld2q_f32((float*)b_ptr); // b0r|b1r|b2r|b3r || b0i|b1i|b2i|b3i + b_val.val[1] = vnegq_f32(b_val.val[1]); +- __builtin_prefetch(a_ptr+4); +- __builtin_prefetch(b_ptr+4); ++ __VOLK_PREFETCH(a_ptr+4); ++ __VOLK_PREFETCH(b_ptr+4); + + // multiply the real*real and imag*imag to get real result + // a0r*b0r|a1r*b1r|a2r*b2r|a3r*b3r +-- +2.11.0 + diff --git a/patches/0008-Fix-bug-106-volk_64u_popcnt-bug-in-generic-implement.patch b/patches/0008-Fix-bug-106-volk_64u_popcnt-bug-in-generic-implement.patch new file mode 100644 index 0000000..01b77bb --- /dev/null +++ b/patches/0008-Fix-bug-106-volk_64u_popcnt-bug-in-generic-implement.patch @@ -0,0 +1,26 @@ +From b0b9615e4e5d38c0d8d6bcc06ccefe08682ec352 Mon Sep 17 00:00:00 2001 +From: Nick Foster +Date: Fri, 20 Jan 2017 16:36:01 -0800 +Subject: [PATCH 08/18] Fix bug 106 (volk_64u_popcnt bug in generic + implementation) + +--- + kernels/volk/volk_64u_popcnt.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernels/volk/volk_64u_popcnt.h b/kernels/volk/volk_64u_popcnt.h +index 653bfb9..cbce2ec 100644 +--- a/kernels/volk/volk_64u_popcnt.h ++++ b/kernels/volk/volk_64u_popcnt.h +@@ -84,7 +84,7 @@ volk_64u_popcnt_generic(uint64_t* ret, const uint64_t value) + uint64_t retVal64 = retVal; + + //retVal = valueVector[1]; +- retVal = (uint32_t)((value & 0xFFFFFFFF00000000ull) >> 31); ++ retVal = (uint32_t)((value & 0xFFFFFFFF00000000ull) >> 32); + retVal = (retVal & 0x55555555) + (retVal >> 1 & 0x55555555); + retVal = (retVal & 0x33333333) + (retVal >> 2 & 0x33333333); + retVal = (retVal + (retVal >> 4)) & 0x0F0F0F0F; +-- +2.11.0 + diff --git a/patches/0009-modtool-deconflict-module-include-guards-from-main-v.patch b/patches/0009-modtool-deconflict-module-include-guards-from-main-v.patch new file mode 100644 index 0000000..b0beaca --- /dev/null +++ b/patches/0009-modtool-deconflict-module-include-guards-from-main-v.patch @@ -0,0 +1,39 @@ +From 5af8aa45fa23f72aff8593f54e7b67e449927681 Mon Sep 17 00:00:00 2001 +From: Nathan West +Date: Mon, 13 Mar 2017 12:25:35 -0400 +Subject: [PATCH 09/18] modtool: deconflict module include guards from main + volk + +--- + python/volk_modtool/volk_modtool_generate.py | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/python/volk_modtool/volk_modtool_generate.py b/python/volk_modtool/volk_modtool_generate.py +index 83e0d26..6040a7d 100644 +--- a/python/volk_modtool/volk_modtool_generate.py ++++ b/python/volk_modtool/volk_modtool_generate.py +@@ -98,6 +98,9 @@ class volk_modtool: + os.makedirs(os.path.join(self.my_dict['destination'], 'volk_' + self.my_dict['name'], 'kernels/volk_' + self.my_dict['name'])) + + current_kernel_names = self.get_current_kernels() ++ need_ifdef_updates = ["constant.h", "volk_complex.h", "volk_malloc.h", "volk_prefs.h", ++ "volk_common.h", "volk_cpu.tmpl.h", "volk_config_fixed.tmpl.h", ++ "volk_typedefs.h", "volk.tmpl.h"] + for root, dirnames, filenames in os.walk(self.my_dict['base']): + for name in filenames: + t_table = map(lambda a: re.search(a, name), current_kernel_names) +@@ -107,10 +110,7 @@ class volk_modtool: + instring = open(infile, 'r').read() + outstring = re.sub(self.volk, 'volk_' + self.my_dict['name'], instring) + # Update the header ifdef guards only where needed +- if((name == "constants.h") or +- (name == "volk_complex.h") or +- (name == "volk_malloc.h") or +- (name == "volk_prefs.h")): ++ if name in need_ifdef_updates: + outstring = re.sub(self.volk_included, 'INCLUDED_VOLK_' + self.my_dict['name'].upper(), outstring) + newname = re.sub(self.volk, 'volk_' + self.my_dict['name'], name) + relpath = os.path.relpath(infile, self.my_dict['base']) +-- +2.11.0 + diff --git a/patches/0010-modtool-update-the-cmake-find-module-for-volk-mods.patch b/patches/0010-modtool-update-the-cmake-find-module-for-volk-mods.patch new file mode 100644 index 0000000..7553987 --- /dev/null +++ b/patches/0010-modtool-update-the-cmake-find-module-for-volk-mods.patch @@ -0,0 +1,27 @@ +From 663dbd00b3e4bd3ddb0b7f8a9360df132d7f0d56 Mon Sep 17 00:00:00 2001 +From: Nathan West +Date: Mon, 13 Mar 2017 12:37:18 -0400 +Subject: [PATCH 10/18] modtool: update the cmake find module for volk mods + +--- + python/volk_modtool/volk_modtool_generate.py | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/python/volk_modtool/volk_modtool_generate.py b/python/volk_modtool/volk_modtool_generate.py +index 6040a7d..75232ed 100644 +--- a/python/volk_modtool/volk_modtool_generate.py ++++ b/python/volk_modtool/volk_modtool_generate.py +@@ -113,6 +113,10 @@ class volk_modtool: + if name in need_ifdef_updates: + outstring = re.sub(self.volk_included, 'INCLUDED_VOLK_' + self.my_dict['name'].upper(), outstring) + newname = re.sub(self.volk, 'volk_' + self.my_dict['name'], name) ++ if name == 'VolkConfig.cmake.in': ++ outstring = re.sub("VOLK", 'VOLK_' + self.my_dict['name'].upper(), outstring) ++ newname = "Volk%sConfig.cmake.in" % self.my_dict['name'] ++ + relpath = os.path.relpath(infile, self.my_dict['base']) + newrelpath = re.sub(self.volk, 'volk_' + self.my_dict['name'], relpath) + dest = os.path.join(self.my_dict['destination'], 'volk_' + self.my_dict['name'], os.path.dirname(newrelpath), newname) +-- +2.11.0 + diff --git a/patches/0011-Use-powf-to-match-variables-and-avoid-implicit-type-.patch b/patches/0011-Use-powf-to-match-variables-and-avoid-implicit-type-.patch new file mode 100644 index 0000000..4f3b849 --- /dev/null +++ b/patches/0011-Use-powf-to-match-variables-and-avoid-implicit-type-.patch @@ -0,0 +1,44 @@ +From 28b03a9a338dc24b002413e880222fe1d49f77f5 Mon Sep 17 00:00:00 2001 +From: Michael Dickens +Date: Sat, 1 Apr 2017 15:24:46 -0400 +Subject: [PATCH 11/18] Use 'powf' to match variables and avoid implicit type + converstion. Makes some older compilers happy, allowing 'make test' to pass. + +--- + kernels/volk/volk_32f_x2_pow_32f.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/kernels/volk/volk_32f_x2_pow_32f.h b/kernels/volk/volk_32f_x2_pow_32f.h +index 58fecb6..a8cb2e1 100644 +--- a/kernels/volk/volk_32f_x2_pow_32f.h ++++ b/kernels/volk/volk_32f_x2_pow_32f.h +@@ -190,7 +190,7 @@ volk_32f_x2_pow_32f_a_sse4_1(float* cVector, const float* bVector, + + number = quarterPoints * 4; + for(;number < num_points; number++){ +- *cPtr++ = pow(*aPtr++, *bPtr++); ++ *cPtr++ = powf(*aPtr++, *bPtr++); + } + } + +@@ -215,7 +215,7 @@ volk_32f_x2_pow_32f_generic(float* cVector, const float* bVector, + unsigned int number = 0; + + for(number = 0; number < num_points; number++){ +- *cPtr++ = pow(*aPtr++, *bPtr++); ++ *cPtr++ = powf(*aPtr++, *bPtr++); + } + } + #endif /* LV_HAVE_GENERIC */ +@@ -326,7 +326,7 @@ volk_32f_x2_pow_32f_u_sse4_1(float* cVector, const float* bVector, + + number = quarterPoints * 4; + for(;number < num_points; number++){ +- *cPtr++ = pow(*aPtr++, *bPtr++); ++ *cPtr++ = powf(*aPtr++, *bPtr++); + } + } + +-- +2.11.0 + diff --git a/patches/0012-cmake-support-empty-CMAKE_INSTALL_PREFIX.patch b/patches/0012-cmake-support-empty-CMAKE_INSTALL_PREFIX.patch new file mode 100644 index 0000000..4680ed4 --- /dev/null +++ b/patches/0012-cmake-support-empty-CMAKE_INSTALL_PREFIX.patch @@ -0,0 +1,26 @@ +From 67202d7b46f9ce55625d0ce5c3a2d98dff56b09a Mon Sep 17 00:00:00 2001 +From: Josh Blum +Date: Wed, 5 Oct 2016 14:09:05 -0700 +Subject: [PATCH 12/18] cmake: support empty CMAKE_INSTALL_PREFIX + +Needed quotes for the string escape command +--- + lib/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt +index ad5653c..45b6c51 100644 +--- a/lib/CMakeLists.txt ++++ b/lib/CMakeLists.txt +@@ -489,7 +489,7 @@ endif() + message(STATUS "Loading version ${VERSION} into constants...") + + #double escape for windows backslash path separators +-string(REPLACE "\\" "\\\\" prefix ${prefix}) ++string(REPLACE "\\" "\\\\" prefix "${prefix}") + + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/constants.c.in +-- +2.11.0 + diff --git a/patches/0013-Support-relocated-install-with-VOLK_PREFIX-env-var.patch b/patches/0013-Support-relocated-install-with-VOLK_PREFIX-env-var.patch new file mode 100644 index 0000000..d65686d --- /dev/null +++ b/patches/0013-Support-relocated-install-with-VOLK_PREFIX-env-var.patch @@ -0,0 +1,35 @@ +From 0d1065854848494f211c990ed26267565cc44647 Mon Sep 17 00:00:00 2001 +From: Josh Blum +Date: Thu, 6 Oct 2016 15:06:09 -0700 +Subject: [PATCH 13/18] Support relocated install with VOLK_PREFIX env var + +Some packaging systems such as snaps will install +the volk library to a dynamically chosen location. +The install script can set an evironment variable +so that the library reports the correct prefix. +--- + lib/constants.c.in | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/lib/constants.c.in b/lib/constants.c.in +index 3839f53..a81c7cb 100644 +--- a/lib/constants.c.in ++++ b/lib/constants.c.in +@@ -24,11 +24,14 @@ + #include + #endif + ++#include + #include + + char* + volk_prefix() + { ++ const char *prefix = getenv("VOLK_PREFIX"); ++ if (prefix != NULL) return (char *)prefix; + return "@prefix@"; + } + +-- +2.11.0 + diff --git a/patches/0014-Fixing-a-minimal-bug-in-the-log2-docstring.patch b/patches/0014-Fixing-a-minimal-bug-in-the-log2-docstring.patch new file mode 100644 index 0000000..b14cebb --- /dev/null +++ b/patches/0014-Fixing-a-minimal-bug-in-the-log2-docstring.patch @@ -0,0 +1,25 @@ +From ee70be38a66beb5eb236a3ffb3fc147a5d053979 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marcus=20M=C3=BCller?= +Date: Mon, 20 Nov 2017 15:12:06 +0100 +Subject: [PATCH 14/18] Fixing a minimal bug in the log2 docstring + +--- + kernels/volk/volk_32f_log2_32f.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernels/volk/volk_32f_log2_32f.h b/kernels/volk/volk_32f_log2_32f.h +index 6704129..c3bfeaa 100644 +--- a/kernels/volk/volk_32f_log2_32f.h ++++ b/kernels/volk/volk_32f_log2_32f.h +@@ -62,7 +62,7 @@ + * \li num_points: The number of data points. + * + * \b Outputs +- * \li cVector: The output vector. ++ * \li bVector: The output vector. + * + * \b Example + * \code +-- +2.11.0 + diff --git a/patches/0015-kernel-Adds-unaligned-protokernles-to-32f_x2_s32f_in.patch b/patches/0015-kernel-Adds-unaligned-protokernles-to-32f_x2_s32f_in.patch new file mode 100644 index 0000000..1fc53d4 --- /dev/null +++ b/patches/0015-kernel-Adds-unaligned-protokernles-to-32f_x2_s32f_in.patch @@ -0,0 +1,140 @@ +From 82a88672d80ef7652548182e819e726874e0adc0 Mon Sep 17 00:00:00 2001 +From: Damian Miralles +Date: Wed, 13 Dec 2017 13:27:17 -0700 +Subject: [PATCH 15/18] kernel: Adds unaligned protokernles to + `32f_x2_s32f_interleave_16ic` and `32f_x2_subtract_32f` + +Adds unaligned versions to the afore mentioned kernels, relative speeds +improvements shown in both cases. +--- + kernels/volk/volk_32f_x2_s32f_interleave_16ic.h | 63 +++++++++++++++++++++++++ + kernels/volk/volk_32f_x2_subtract_32f.h | 45 ++++++++++++++++++ + 2 files changed, 108 insertions(+) + +diff --git a/kernels/volk/volk_32f_x2_s32f_interleave_16ic.h b/kernels/volk/volk_32f_x2_s32f_interleave_16ic.h +index 99f1b5e..20f66ff 100644 +--- a/kernels/volk/volk_32f_x2_s32f_interleave_16ic.h ++++ b/kernels/volk/volk_32f_x2_s32f_interleave_16ic.h +@@ -214,3 +214,66 @@ volk_32f_x2_s32f_interleave_16ic_generic(lv_16sc_t* complexVector, const float* + + + #endif /* INCLUDED_volk_32f_x2_s32f_interleave_16ic_a_H */ ++ ++#ifndef INCLUDED_volk_32f_x2_s32f_interleave_16ic_u_H ++#define INCLUDED_volk_32f_x2_s32f_interleave_16ic_u_H ++ ++#include ++#include ++#include ++ ++#ifdef LV_HAVE_AVX2 ++#include ++ ++static inline void ++volk_32f_x2_s32f_interleave_16ic_u_avx2(lv_16sc_t* complexVector, const float* iBuffer, ++ const float* qBuffer, const float scalar, unsigned int num_points) ++{ ++ unsigned int number = 0; ++ const float* iBufferPtr = iBuffer; ++ const float* qBufferPtr = qBuffer; ++ ++ __m256 vScalar = _mm256_set1_ps(scalar); ++ ++ const unsigned int eighthPoints = num_points / 8; ++ ++ __m256 iValue, qValue, cplxValue1, cplxValue2; ++ __m256i intValue1, intValue2; ++ ++ int16_t* complexVectorPtr = (int16_t*)complexVector; ++ ++ for(;number < eighthPoints; number++){ ++ iValue = _mm256_loadu_ps(iBufferPtr); ++ qValue = _mm256_loadu_ps(qBufferPtr); ++ ++ // Interleaves the lower two values in the i and q variables into one buffer ++ cplxValue1 = _mm256_unpacklo_ps(iValue, qValue); ++ cplxValue1 = _mm256_mul_ps(cplxValue1, vScalar); ++ ++ // Interleaves the upper two values in the i and q variables into one buffer ++ cplxValue2 = _mm256_unpackhi_ps(iValue, qValue); ++ cplxValue2 = _mm256_mul_ps(cplxValue2, vScalar); ++ ++ intValue1 = _mm256_cvtps_epi32(cplxValue1); ++ intValue2 = _mm256_cvtps_epi32(cplxValue2); ++ ++ intValue1 = _mm256_packs_epi32(intValue1, intValue2); ++ ++ _mm256_storeu_si256((__m256i*)complexVectorPtr, intValue1); ++ complexVectorPtr += 16; ++ ++ iBufferPtr += 8; ++ qBufferPtr += 8; ++ } ++ ++ number = eighthPoints * 8; ++ complexVectorPtr = (int16_t*)(&complexVector[number]); ++ for(; number < num_points; number++){ ++ *complexVectorPtr++ = (int16_t)(*iBufferPtr++ * scalar); ++ *complexVectorPtr++ = (int16_t)(*qBufferPtr++ * scalar); ++ } ++} ++#endif /* LV_HAVE_AVX2 */ ++ ++ ++#endif /* INCLUDED_volk_32f_x2_s32f_interleave_16ic_u_H */ +diff --git a/kernels/volk/volk_32f_x2_subtract_32f.h b/kernels/volk/volk_32f_x2_subtract_32f.h +index 4a452fd..b7f36cf 100644 +--- a/kernels/volk/volk_32f_x2_subtract_32f.h ++++ b/kernels/volk/volk_32f_x2_subtract_32f.h +@@ -176,3 +176,48 @@ volk_32f_x2_subtract_32f_u_orc(float* cVector, const float* aVector, + + + #endif /* INCLUDED_volk_32f_x2_subtract_32f_a_H */ ++ ++ ++#ifndef INCLUDED_volk_32f_x2_subtract_32f_u_H ++#define INCLUDED_volk_32f_x2_subtract_32f_u_H ++ ++#include ++#include ++ ++#ifdef LV_HAVE_AVX ++#include ++ ++static inline void ++volk_32f_x2_subtract_32f_u_avx(float* cVector, const float* aVector, ++ const float* bVector, unsigned int num_points) ++{ ++ unsigned int number = 0; ++ const unsigned int eighthPoints = num_points / 8; ++ ++ float* cPtr = cVector; ++ const float* aPtr = aVector; ++ const float* bPtr = bVector; ++ ++ __m256 aVal, bVal, cVal; ++ for(;number < eighthPoints; number++){ ++ ++ aVal = _mm256_loadu_ps(aPtr); ++ bVal = _mm256_loadu_ps(bPtr); ++ ++ cVal = _mm256_sub_ps(aVal, bVal); ++ ++ _mm256_storeu_ps(cPtr,cVal); // Store the results back into the C container ++ ++ aPtr += 8; ++ bPtr += 8; ++ cPtr += 8; ++ } ++ ++ number = eighthPoints * 8; ++ for(;number < num_points; number++){ ++ *cPtr++ = (*aPtr++) - (*bPtr++); ++ } ++} ++#endif /* LV_HAVE_AVX */ ++ ++#endif /* INCLUDED_volk_32f_x2_subtract_32f_u_H */ +-- +2.11.0 + diff --git a/patches/0016-kernels-Adds-AVX-support-to-volk_32f_-kernels.patch b/patches/0016-kernels-Adds-AVX-support-to-volk_32f_-kernels.patch new file mode 100644 index 0000000..5324a5c --- /dev/null +++ b/patches/0016-kernels-Adds-AVX-support-to-volk_32f_-kernels.patch @@ -0,0 +1,422 @@ +From 940489f72b2c80f6b5dc514401773bf67a992f23 Mon Sep 17 00:00:00 2001 +From: Damian Miralles +Date: Fri, 15 Dec 2017 23:05:58 -0700 +Subject: [PATCH 16/18] kernels: Adds AVX support to `volk_32f_*` kernels + +Adds AVX support to `volk_32f_s32f_normalize`,`volk_32f_s32f_stddev_32f`, +`volk_32f_sqrt_32f`, `volk_32f_x2_max_32f` and `volk_32f_x2_min_32f`. +Some speed improvements can be seen with the new protokernel addition. +--- + kernels/volk/volk_32f_s32f_normalize.h | 74 ++++++++++++++++++++++++++++- + kernels/volk/volk_32f_s32f_stddev_32f.h | 59 +++++++++++++++++++++++ + kernels/volk/volk_32f_sqrt_32f.h | 33 +++++++++++++ + kernels/volk/volk_32f_x2_max_32f.h | 84 +++++++++++++++++++++++++++++++++ + kernels/volk/volk_32f_x2_min_32f.h | 84 +++++++++++++++++++++++++++++++++ + 5 files changed, 333 insertions(+), 1 deletion(-) + +diff --git a/kernels/volk/volk_32f_s32f_normalize.h b/kernels/volk/volk_32f_s32f_normalize.h +index 52bf006..17d9da9 100644 +--- a/kernels/volk/volk_32f_s32f_normalize.h ++++ b/kernels/volk/volk_32f_s32f_normalize.h +@@ -105,6 +105,39 @@ static inline void volk_32f_s32f_normalize_a_sse(float* vecBuffer, const float s + } + #endif /* LV_HAVE_SSE */ + ++ ++#ifdef LV_HAVE_AVX ++#include ++ ++static inline void volk_32f_s32f_normalize_a_avx(float* vecBuffer, const float scalar, unsigned int num_points){ ++ unsigned int number = 0; ++ float* inputPtr = vecBuffer; ++ ++ const float invScalar = 1.0 / scalar; ++ __m256 vecScalar = _mm256_set1_ps(invScalar); ++ __m256 input1; ++ ++ const uint64_t eigthPoints = num_points / 8; ++ for(;number < eigthPoints; number++){ ++ ++ input1 = _mm256_load_ps(inputPtr); ++ ++ input1 = _mm256_mul_ps(input1, vecScalar); ++ ++ _mm256_store_ps(inputPtr, input1); ++ ++ inputPtr += 8; ++ } ++ ++ number = eigthPoints*8; ++ for(; number < num_points; number++){ ++ *inputPtr *= invScalar; ++ inputPtr++; ++ } ++} ++#endif /* LV_HAVE_AVX */ ++ ++ + #ifdef LV_HAVE_GENERIC + + static inline void volk_32f_s32f_normalize_generic(float* vecBuffer, const float scalar, unsigned int num_points){ +@@ -128,6 +161,45 @@ static inline void volk_32f_s32f_normalize_u_orc(float* vecBuffer, const float s + #endif /* LV_HAVE_GENERIC */ + + ++#endif /* INCLUDED_volk_32f_s32f_normalize_a_H */ + + +-#endif /* INCLUDED_volk_32f_s32f_normalize_a_H */ ++#ifndef INCLUDED_volk_32f_s32f_normalize_u_H ++#define INCLUDED_volk_32f_s32f_normalize_u_H ++ ++#include ++#include ++ ++#ifdef LV_HAVE_AVX ++#include ++ ++static inline void volk_32f_s32f_normalize_u_avx(float* vecBuffer, const float scalar, unsigned int num_points){ ++ unsigned int number = 0; ++ float* inputPtr = vecBuffer; ++ ++ const float invScalar = 1.0 / scalar; ++ __m256 vecScalar = _mm256_set1_ps(invScalar); ++ __m256 input1; ++ ++ const uint64_t eigthPoints = num_points / 8; ++ for(;number < eigthPoints; number++){ ++ ++ input1 = _mm256_loadu_ps(inputPtr); ++ ++ input1 = _mm256_mul_ps(input1, vecScalar); ++ ++ _mm256_storeu_ps(inputPtr, input1); ++ ++ inputPtr += 8; ++ } ++ ++ number = eigthPoints*8; ++ for(; number < num_points; number++){ ++ *inputPtr *= invScalar; ++ inputPtr++; ++ } ++} ++#endif /* LV_HAVE_AVX */ ++ ++ ++#endif /* INCLUDED_volk_32f_s32f_normalize_u_H */ +diff --git a/kernels/volk/volk_32f_s32f_stddev_32f.h b/kernels/volk/volk_32f_s32f_stddev_32f.h +index 30f0ed6..f97a783 100644 +--- a/kernels/volk/volk_32f_s32f_stddev_32f.h ++++ b/kernels/volk/volk_32f_s32f_stddev_32f.h +@@ -132,6 +132,65 @@ volk_32f_s32f_stddev_32f_a_sse4_1(float* stddev, const float* inputBuffer, + #endif /* LV_HAVE_SSE4_1 */ + + ++#ifdef LV_HAVE_AVX ++#include ++ ++static inline void ++volk_32f_s32f_stddev_32f_a_avx(float* stddev, const float* inputBuffer, ++ const float mean, unsigned int num_points) ++{ ++ float returnValue = 0; ++ if(num_points > 0){ ++ unsigned int number = 0; ++ const unsigned int thirtySecondPoints = num_points / 32; ++ ++ const float* aPtr = inputBuffer; ++ ++ __VOLK_ATTR_ALIGNED(32) float squareBuffer[8]; ++ ++ __m256 squareAccumulator = _mm256_setzero_ps(); ++ __m256 aVal1, aVal2, aVal3, aVal4; ++ __m256 cVal1, cVal2, cVal3, cVal4; ++ for(;number < thirtySecondPoints; number++) { ++ aVal1 = _mm256_load_ps(aPtr); aPtr += 8; ++ cVal1 = _mm256_dp_ps(aVal1, aVal1, 0xF1); ++ ++ aVal2 = _mm256_load_ps(aPtr); aPtr += 8; ++ cVal2 = _mm256_dp_ps(aVal2, aVal2, 0xF2); ++ ++ aVal3 = _mm256_load_ps(aPtr); aPtr += 8; ++ cVal3 = _mm256_dp_ps(aVal3, aVal3, 0xF4); ++ ++ aVal4 = _mm256_load_ps(aPtr); aPtr += 8; ++ cVal4 = _mm256_dp_ps(aVal4, aVal4, 0xF8); ++ ++ cVal1 = _mm256_or_ps(cVal1, cVal2); ++ cVal3 = _mm256_or_ps(cVal3, cVal4); ++ cVal1 = _mm256_or_ps(cVal1, cVal3); ++ ++ squareAccumulator = _mm256_add_ps(squareAccumulator, cVal1); // squareAccumulator += x^2 ++ } ++ _mm256_store_ps(squareBuffer,squareAccumulator); // Store the results back into the C container ++ returnValue = squareBuffer[0]; returnValue += squareBuffer[1]; ++ returnValue += squareBuffer[2]; returnValue += squareBuffer[3]; ++ returnValue += squareBuffer[4]; returnValue += squareBuffer[5]; ++ returnValue += squareBuffer[6]; returnValue += squareBuffer[7]; ++ ++ number = thirtySecondPoints * 32; ++ for(;number < num_points; number++){ ++ returnValue += (*aPtr) * (*aPtr); ++ aPtr++; ++ } ++ returnValue /= num_points; ++ returnValue -= (mean * mean); ++ returnValue = sqrtf(returnValue); ++ } ++ *stddev = returnValue; ++} ++ ++#endif /* LV_HAVE_AVX */ ++ ++ + #ifdef LV_HAVE_SSE + #include + +diff --git a/kernels/volk/volk_32f_sqrt_32f.h b/kernels/volk/volk_32f_sqrt_32f.h +index a5851a0..174f8e3 100644 +--- a/kernels/volk/volk_32f_sqrt_32f.h ++++ b/kernels/volk/volk_32f_sqrt_32f.h +@@ -102,6 +102,39 @@ volk_32f_sqrt_32f_a_sse(float* cVector, const float* aVector, unsigned int num_p + #endif /* LV_HAVE_SSE */ + + ++#ifdef LV_HAVE_AVX ++#include ++ ++static inline void ++volk_32f_sqrt_32f_a_avx(float* cVector, const float* aVector, unsigned int num_points) ++{ ++ unsigned int number = 0; ++ const unsigned int eigthPoints = num_points / 8; ++ ++ float* cPtr = cVector; ++ const float* aPtr = aVector; ++ ++ __m256 aVal, cVal; ++ for(;number < eigthPoints; number++) { ++ aVal = _mm256_load_ps(aPtr); ++ ++ cVal = _mm256_sqrt_ps(aVal); ++ ++ _mm256_store_ps(cPtr,cVal); // Store the results back into the C container ++ ++ aPtr += 8; ++ cPtr += 8; ++ } ++ ++ number = eigthPoints * 8; ++ for(;number < num_points; number++) { ++ *cPtr++ = sqrtf(*aPtr++); ++ } ++} ++ ++#endif /* LV_HAVE_AVX */ ++ ++ + #ifdef LV_HAVE_NEON + #include + +diff --git a/kernels/volk/volk_32f_x2_max_32f.h b/kernels/volk/volk_32f_x2_max_32f.h +index 14747c2..1dc0f7d 100644 +--- a/kernels/volk/volk_32f_x2_max_32f.h ++++ b/kernels/volk/volk_32f_x2_max_32f.h +@@ -112,6 +112,44 @@ volk_32f_x2_max_32f_a_sse(float* cVector, const float* aVector, + #endif /* LV_HAVE_SSE */ + + ++#ifdef LV_HAVE_AVX ++#include ++ ++static inline void ++volk_32f_x2_max_32f_a_avx(float* cVector, const float* aVector, ++ const float* bVector, unsigned int num_points) ++{ ++ unsigned int number = 0; ++ const unsigned int eigthPoints = num_points / 8; ++ ++ float* cPtr = cVector; ++ const float* aPtr = aVector; ++ const float* bPtr= bVector; ++ ++ __m256 aVal, bVal, cVal; ++ for(;number < eigthPoints; number++){ ++ aVal = _mm256_load_ps(aPtr); ++ bVal = _mm256_load_ps(bPtr); ++ ++ cVal = _mm256_max_ps(aVal, bVal); ++ ++ _mm256_store_ps(cPtr,cVal); // Store the results back into the C container ++ ++ aPtr += 8; ++ bPtr += 8; ++ cPtr += 8; ++ } ++ ++ number = eigthPoints * 8; ++ for(;number < num_points; number++){ ++ const float a = *aPtr++; ++ const float b = *bPtr++; ++ *cPtr++ = ( a > b ? a : b); ++ } ++} ++#endif /* LV_HAVE_AVX */ ++ ++ + #ifdef LV_HAVE_NEON + #include + +@@ -180,3 +218,49 @@ volk_32f_x2_max_32f_u_orc(float* cVector, const float* aVector, + + + #endif /* INCLUDED_volk_32f_x2_max_32f_a_H */ ++ ++ ++#ifndef INCLUDED_volk_32f_x2_max_32f_u_H ++#define INCLUDED_volk_32f_x2_max_32f_u_H ++ ++#include ++#include ++ ++#ifdef LV_HAVE_AVX ++#include ++ ++static inline void ++volk_32f_x2_max_32f_u_avx(float* cVector, const float* aVector, ++ const float* bVector, unsigned int num_points) ++{ ++ unsigned int number = 0; ++ const unsigned int eigthPoints = num_points / 8; ++ ++ float* cPtr = cVector; ++ const float* aPtr = aVector; ++ const float* bPtr= bVector; ++ ++ __m256 aVal, bVal, cVal; ++ for(;number < eigthPoints; number++){ ++ aVal = _mm256_loadu_ps(aPtr); ++ bVal = _mm256_loadu_ps(bPtr); ++ ++ cVal = _mm256_max_ps(aVal, bVal); ++ ++ _mm256_storeu_ps(cPtr,cVal); // Store the results back into the C container ++ ++ aPtr += 8; ++ bPtr += 8; ++ cPtr += 8; ++ } ++ ++ number = eigthPoints * 8; ++ for(;number < num_points; number++){ ++ const float a = *aPtr++; ++ const float b = *bPtr++; ++ *cPtr++ = ( a > b ? a : b); ++ } ++} ++#endif /* LV_HAVE_AVX */ ++ ++#endif /* INCLUDED_volk_32f_x2_max_32f_u_H */ +diff --git a/kernels/volk/volk_32f_x2_min_32f.h b/kernels/volk/volk_32f_x2_min_32f.h +index f3cbae1..3beb5fa 100644 +--- a/kernels/volk/volk_32f_x2_min_32f.h ++++ b/kernels/volk/volk_32f_x2_min_32f.h +@@ -112,6 +112,44 @@ volk_32f_x2_min_32f_a_sse(float* cVector, const float* aVector, + #endif /* LV_HAVE_SSE */ + + ++#ifdef LV_HAVE_AVX ++#include ++ ++static inline void ++volk_32f_x2_min_32f_a_avx(float* cVector, const float* aVector, ++ const float* bVector, unsigned int num_points) ++{ ++ unsigned int number = 0; ++ const unsigned int eigthPoints = num_points / 8; ++ ++ float* cPtr = cVector; ++ const float* aPtr = aVector; ++ const float* bPtr= bVector; ++ ++ __m256 aVal, bVal, cVal; ++ for(;number < eigthPoints; number++){ ++ aVal = _mm256_load_ps(aPtr); ++ bVal = _mm256_load_ps(bPtr); ++ ++ cVal = _mm256_min_ps(aVal, bVal); ++ ++ _mm256_store_ps(cPtr,cVal); // Store the results back into the C container ++ ++ aPtr += 8; ++ bPtr += 8; ++ cPtr += 8; ++ } ++ ++ number = eigthPoints * 8; ++ for(;number < num_points; number++){ ++ const float a = *aPtr++; ++ const float b = *bPtr++; ++ *cPtr++ = ( a < b ? a : b); ++ } ++} ++#endif /* LV_HAVE_AVX */ ++ ++ + #ifdef LV_HAVE_NEON + #include + +@@ -183,3 +221,49 @@ volk_32f_x2_min_32f_u_orc(float* cVector, const float* aVector, + + + #endif /* INCLUDED_volk_32f_x2_min_32f_a_H */ ++ ++ ++#ifndef INCLUDED_volk_32f_x2_min_32f_u_H ++#define INCLUDED_volk_32f_x2_min_32f_u_H ++ ++#include ++#include ++ ++#ifdef LV_HAVE_AVX ++#include ++ ++static inline void ++volk_32f_x2_min_32f_u_avx(float* cVector, const float* aVector, ++ const float* bVector, unsigned int num_points) ++{ ++ unsigned int number = 0; ++ const unsigned int eigthPoints = num_points / 8; ++ ++ float* cPtr = cVector; ++ const float* aPtr = aVector; ++ const float* bPtr= bVector; ++ ++ __m256 aVal, bVal, cVal; ++ for(;number < eigthPoints; number++){ ++ aVal = _mm256_loadu_ps(aPtr); ++ bVal = _mm256_loadu_ps(bPtr); ++ ++ cVal = _mm256_min_ps(aVal, bVal); ++ ++ _mm256_storeu_ps(cPtr,cVal); // Store the results back into the C container ++ ++ aPtr += 8; ++ bPtr += 8; ++ cPtr += 8; ++ } ++ ++ number = eigthPoints * 8; ++ for(;number < num_points; number++){ ++ const float a = *aPtr++; ++ const float b = *bPtr++; ++ *cPtr++ = ( a < b ? a : b); ++ } ++} ++#endif /* LV_HAVE_AVX */ ++ ++#endif /* INCLUDED_volk_32f_x2_min_32f_u_H */ +-- +2.11.0 + diff --git a/patches/0017-kernels-Add-AVX-support-to-32f_x2_divide_32f-32f_x2_.patch b/patches/0017-kernels-Add-AVX-support-to-32f_x2_divide_32f-32f_x2_.patch new file mode 100644 index 0000000..2f49f7c --- /dev/null +++ b/patches/0017-kernels-Add-AVX-support-to-32f_x2_divide_32f-32f_x2_.patch @@ -0,0 +1,271 @@ +From 0dd53d3ad8e24a833342b369743f274a15a66274 Mon Sep 17 00:00:00 2001 +From: Damian Miralles +Date: Wed, 20 Dec 2017 21:01:52 -0700 +Subject: [PATCH 17/18] kernels: Add AVX support to + `32f_x2_divide_32f`,`32f_x2_dot_prod_16i` + +Adds protokernels for AVX support. Modest speed improvements in some of +the kernels, however, it seems to be related to the host architecture +being used +--- + kernels/volk/volk_32f_x2_divide_32f.h | 80 +++++++++++++++++ + kernels/volk/volk_32f_x2_dot_prod_16i.h | 148 ++++++++++++++++++++++++++++++++ + 2 files changed, 228 insertions(+) + +diff --git a/kernels/volk/volk_32f_x2_divide_32f.h b/kernels/volk/volk_32f_x2_divide_32f.h +index d724173..7cc34ca 100644 +--- a/kernels/volk/volk_32f_x2_divide_32f.h ++++ b/kernels/volk/volk_32f_x2_divide_32f.h +@@ -110,6 +110,42 @@ volk_32f_x2_divide_32f_a_sse(float* cVector, const float* aVector, + #endif /* LV_HAVE_SSE */ + + ++#ifdef LV_HAVE_AVX ++#include ++ ++static inline void ++volk_32f_x2_divide_32f_a_avx(float* cVector, const float* aVector, ++ const float* bVector, unsigned int num_points) ++{ ++ unsigned int number = 0; ++ const unsigned int eigthPoints = num_points / 8; ++ ++ float* cPtr = cVector; ++ const float* aPtr = aVector; ++ const float* bPtr= bVector; ++ ++ __m256 aVal, bVal, cVal; ++ for(;number < eigthPoints; number++){ ++ aVal = _mm256_load_ps(aPtr); ++ bVal = _mm256_load_ps(bPtr); ++ ++ cVal = _mm256_div_ps(aVal, bVal); ++ ++ _mm256_store_ps(cPtr,cVal); // Store the results back into the C container ++ ++ aPtr += 8; ++ bPtr += 8; ++ cPtr += 8; ++ } ++ ++ number = eigthPoints * 8; ++ for(;number < num_points; number++){ ++ *cPtr++ = (*aPtr++) / (*bPtr++); ++ } ++} ++#endif /* LV_HAVE_AVX */ ++ ++ + #ifdef LV_HAVE_GENERIC + + static inline void +@@ -145,3 +181,47 @@ volk_32f_x2_divide_32f_u_orc(float* cVector, const float* aVector, + + + #endif /* INCLUDED_volk_32f_x2_divide_32f_a_H */ ++ ++ ++#ifndef INCLUDED_volk_32f_x2_divide_32f_u_H ++#define INCLUDED_volk_32f_x2_divide_32f_u_H ++ ++#include ++#include ++ ++#ifdef LV_HAVE_AVX ++#include ++ ++static inline void ++volk_32f_x2_divide_32f_u_avx(float* cVector, const float* aVector, ++ const float* bVector, unsigned int num_points) ++{ ++ unsigned int number = 0; ++ const unsigned int eigthPoints = num_points / 8; ++ ++ float* cPtr = cVector; ++ const float* aPtr = aVector; ++ const float* bPtr= bVector; ++ ++ __m256 aVal, bVal, cVal; ++ for(;number < eigthPoints; number++){ ++ aVal = _mm256_loadu_ps(aPtr); ++ bVal = _mm256_loadu_ps(bPtr); ++ ++ cVal = _mm256_div_ps(aVal, bVal); ++ ++ _mm256_storeu_ps(cPtr,cVal); // Store the results back into the C container ++ ++ aPtr += 8; ++ bPtr += 8; ++ cPtr += 8; ++ } ++ ++ number = eigthPoints * 8; ++ for(;number < num_points; number++){ ++ *cPtr++ = (*aPtr++) / (*bPtr++); ++ } ++} ++#endif /* LV_HAVE_AVX */ ++ ++#endif /* INCLUDED_volk_32f_x2_divide_32f_u_H */ +diff --git a/kernels/volk/volk_32f_x2_dot_prod_16i.h b/kernels/volk/volk_32f_x2_dot_prod_16i.h +index 15f01b7..a1279cf 100644 +--- a/kernels/volk/volk_32f_x2_dot_prod_16i.h ++++ b/kernels/volk/volk_32f_x2_dot_prod_16i.h +@@ -82,6 +82,154 @@ static inline void volk_32f_x2_dot_prod_16i_generic(int16_t* result, const float + #endif /*LV_HAVE_GENERIC*/ + + ++#ifdef LV_HAVE_AVX ++ ++static inline void volk_32f_x2_dot_prod_16i_a_avx(int16_t* result, const float* input, const float* taps, unsigned int num_points) { ++ ++ unsigned int number = 0; ++ const unsigned int thirtySecondPoints = num_points / 32; ++ ++ float dotProduct = 0; ++ const float* aPtr = input; ++ const float* bPtr = taps; ++ ++ __m256 a0Val, a1Val, a2Val, a3Val; ++ __m256 b0Val, b1Val, b2Val, b3Val; ++ __m256 c0Val, c1Val, c2Val, c3Val; ++ ++ __m256 dotProdVal0 = _mm256_setzero_ps(); ++ __m256 dotProdVal1 = _mm256_setzero_ps(); ++ __m256 dotProdVal2 = _mm256_setzero_ps(); ++ __m256 dotProdVal3 = _mm256_setzero_ps(); ++ ++ for(;number < thirtySecondPoints; number++){ ++ ++ a0Val = _mm256_load_ps(aPtr); ++ a1Val = _mm256_load_ps(aPtr+8); ++ a2Val = _mm256_load_ps(aPtr+16); ++ a3Val = _mm256_load_ps(aPtr+24); ++ ++ b0Val = _mm256_load_ps(bPtr); ++ b1Val = _mm256_load_ps(bPtr+8); ++ b2Val = _mm256_load_ps(bPtr+16); ++ b3Val = _mm256_load_ps(bPtr+24); ++ ++ c0Val = _mm256_mul_ps(a0Val, b0Val); ++ c1Val = _mm256_mul_ps(a1Val, b1Val); ++ c2Val = _mm256_mul_ps(a2Val, b2Val); ++ c3Val = _mm256_mul_ps(a3Val, b3Val); ++ ++ dotProdVal0 = _mm256_add_ps(c0Val, dotProdVal0); ++ dotProdVal1 = _mm256_add_ps(c1Val, dotProdVal1); ++ dotProdVal2 = _mm256_add_ps(c2Val, dotProdVal2); ++ dotProdVal3 = _mm256_add_ps(c3Val, dotProdVal3); ++ ++ aPtr += 32; ++ bPtr += 32; ++ } ++ ++ dotProdVal0 = _mm256_add_ps(dotProdVal0, dotProdVal1); ++ dotProdVal0 = _mm256_add_ps(dotProdVal0, dotProdVal2); ++ dotProdVal0 = _mm256_add_ps(dotProdVal0, dotProdVal3); ++ ++ __VOLK_ATTR_ALIGNED(32) float dotProductVector[8]; ++ ++ _mm256_store_ps(dotProductVector,dotProdVal0); // Store the results back into the dot product vector ++ ++ dotProduct = dotProductVector[0]; ++ dotProduct += dotProductVector[1]; ++ dotProduct += dotProductVector[2]; ++ dotProduct += dotProductVector[3]; ++ dotProduct += dotProductVector[4]; ++ dotProduct += dotProductVector[5]; ++ dotProduct += dotProductVector[6]; ++ dotProduct += dotProductVector[7]; ++ ++ number = thirtySecondPoints*32; ++ for(;number < num_points; number++){ ++ dotProduct += ((*aPtr++) * (*bPtr++)); ++ } ++ ++ *result = (short)dotProduct; ++} ++ ++#endif /*LV_HAVE_AVX*/ ++ ++ ++#ifdef LV_HAVE_AVX ++ ++static inline void volk_32f_x2_dot_prod_16i_u_avx(int16_t* result, const float* input, const float* taps, unsigned int num_points) { ++ ++ unsigned int number = 0; ++ const unsigned int thirtySecondPoints = num_points / 32; ++ ++ float dotProduct = 0; ++ const float* aPtr = input; ++ const float* bPtr = taps; ++ ++ __m256 a0Val, a1Val, a2Val, a3Val; ++ __m256 b0Val, b1Val, b2Val, b3Val; ++ __m256 c0Val, c1Val, c2Val, c3Val; ++ ++ __m256 dotProdVal0 = _mm256_setzero_ps(); ++ __m256 dotProdVal1 = _mm256_setzero_ps(); ++ __m256 dotProdVal2 = _mm256_setzero_ps(); ++ __m256 dotProdVal3 = _mm256_setzero_ps(); ++ ++ for(;number < thirtySecondPoints; number++){ ++ ++ a0Val = _mm256_loadu_ps(aPtr); ++ a1Val = _mm256_loadu_ps(aPtr+8); ++ a2Val = _mm256_loadu_ps(aPtr+16); ++ a3Val = _mm256_loadu_ps(aPtr+24); ++ ++ b0Val = _mm256_loadu_ps(bPtr); ++ b1Val = _mm256_loadu_ps(bPtr+8); ++ b2Val = _mm256_loadu_ps(bPtr+16); ++ b3Val = _mm256_loadu_ps(bPtr+24); ++ ++ c0Val = _mm256_mul_ps(a0Val, b0Val); ++ c1Val = _mm256_mul_ps(a1Val, b1Val); ++ c2Val = _mm256_mul_ps(a2Val, b2Val); ++ c3Val = _mm256_mul_ps(a3Val, b3Val); ++ ++ dotProdVal0 = _mm256_add_ps(c0Val, dotProdVal0); ++ dotProdVal1 = _mm256_add_ps(c1Val, dotProdVal1); ++ dotProdVal2 = _mm256_add_ps(c2Val, dotProdVal2); ++ dotProdVal3 = _mm256_add_ps(c3Val, dotProdVal3); ++ ++ aPtr += 32; ++ bPtr += 32; ++ } ++ ++ dotProdVal0 = _mm256_add_ps(dotProdVal0, dotProdVal1); ++ dotProdVal0 = _mm256_add_ps(dotProdVal0, dotProdVal2); ++ dotProdVal0 = _mm256_add_ps(dotProdVal0, dotProdVal3); ++ ++ __VOLK_ATTR_ALIGNED(32) float dotProductVector[8]; ++ ++ _mm256_storeu_ps(dotProductVector,dotProdVal0); // Store the results back into the dot product vector ++ ++ dotProduct = dotProductVector[0]; ++ dotProduct += dotProductVector[1]; ++ dotProduct += dotProductVector[2]; ++ dotProduct += dotProductVector[3]; ++ dotProduct += dotProductVector[4]; ++ dotProduct += dotProductVector[5]; ++ dotProduct += dotProductVector[6]; ++ dotProduct += dotProductVector[7]; ++ ++ number = thirtySecondPoints*32; ++ for(;number < num_points; number++){ ++ dotProduct += ((*aPtr++) * (*bPtr++)); ++ } ++ ++ *result = (short)dotProduct; ++} ++ ++#endif /*LV_HAVE_AVX*/ ++ ++ + #ifdef LV_HAVE_SSE + + static inline void volk_32f_x2_dot_prod_16i_a_sse(int16_t* result, const float* input, const float* taps, unsigned int num_points) { +-- +2.11.0 + diff --git a/patches/0018-fix-GH-issue-139-for-32fc_index_max_-kernels.patch b/patches/0018-fix-GH-issue-139-for-32fc_index_max_-kernels.patch new file mode 100644 index 0000000..e6fcad1 --- /dev/null +++ b/patches/0018-fix-GH-issue-139-for-32fc_index_max_-kernels.patch @@ -0,0 +1,42 @@ +From 0109b2ed06f907363d3ea5a05d24db4992e2d1a5 Mon Sep 17 00:00:00 2001 +From: Nathan West +Date: Tue, 23 Jan 2018 12:02:03 -0500 +Subject: [PATCH 18/18] fix GH issue #139 for 32fc_index_max_* kernels + +--- + kernels/volk/volk_32fc_index_max_16u.h | 3 +-- + kernels/volk/volk_32fc_index_max_32u.h | 2 +- + 2 files changed, 2 insertions(+), 3 deletions(-) + +diff --git a/kernels/volk/volk_32fc_index_max_16u.h b/kernels/volk/volk_32fc_index_max_16u.h +index c13196a..14b0d22 100644 +--- a/kernels/volk/volk_32fc_index_max_16u.h ++++ b/kernels/volk/volk_32fc_index_max_16u.h +@@ -115,10 +115,9 @@ volk_32fc_index_max_16u_a_sse3(uint16_t* target, lv_32fc_t* src0, + int i = 0; + + xmm8 = _mm_set_epi32(3, 2, 1, 0);//remember the crazy reverse order! +- xmm9 = xmm8 = _mm_setzero_si128(); ++ xmm9 = _mm_setzero_si128(); + xmm10 = _mm_set_epi32(4, 4, 4, 4); + xmm3 = _mm_setzero_ps(); +- + //printf("%f, %f, %f, %f\n", ((float*)&xmm10)[0], ((float*)&xmm10)[1], ((float*)&xmm10)[2], ((float*)&xmm10)[3]); + + for(; i < bound; ++i) { +diff --git a/kernels/volk/volk_32fc_index_max_32u.h b/kernels/volk/volk_32fc_index_max_32u.h +index ad794fb..5665582 100644 +--- a/kernels/volk/volk_32fc_index_max_32u.h ++++ b/kernels/volk/volk_32fc_index_max_32u.h +@@ -104,7 +104,7 @@ volk_32fc_index_max_32u_a_sse3(uint32_t* target, lv_32fc_t* src0, + int i = 0; + + xmm8 = _mm_set_epi32(3, 2, 1, 0);//remember the crazy reverse order! +- xmm9 = xmm8 = _mm_setzero_si128(); ++ xmm9 = _mm_setzero_si128(); + xmm10 = _mm_set_epi32(4, 4, 4, 4); + xmm3 = _mm_setzero_ps(); + +-- +2.11.0 + diff --git a/patches/install-all-headers b/patches/install-all-headers new file mode 100644 index 0000000..dfaed77 --- /dev/null +++ b/patches/install-all-headers @@ -0,0 +1,33 @@ +From: A. Maitland Bottoms +Subject: install all headers + +(Along with some sorting) + +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -158,17 +158,20 @@ + ) + + install(FILES +- ${CMAKE_SOURCE_DIR}/include/volk/volk_prefs.h +- ${CMAKE_SOURCE_DIR}/include/volk/volk_complex.h +- ${CMAKE_SOURCE_DIR}/include/volk/volk_common.h ++ ${CMAKE_SOURCE_DIR}/include/volk/constants.h ++ ${CMAKE_SOURCE_DIR}/include/volk/saturation_arithmetic.h + ${CMAKE_SOURCE_DIR}/include/volk/volk_avx_intrinsics.h +- ${CMAKE_SOURCE_DIR}/include/volk/volk_sse3_intrinsics.h ++ ${CMAKE_SOURCE_DIR}/include/volk/volk_common.h ++ ${CMAKE_SOURCE_DIR}/include/volk/volk_complex.h ++ ${CMAKE_SOURCE_DIR}/include/volk/volk_malloc.h + ${CMAKE_SOURCE_DIR}/include/volk/volk_neon_intrinsics.h ++ ${CMAKE_SOURCE_DIR}/include/volk/volk_prefs.h ++ ${CMAKE_SOURCE_DIR}/include/volk/volk_sse3_intrinsics.h ++ ${CMAKE_SOURCE_DIR}/include/volk/volk_sse_intrinsics.h + ${CMAKE_BINARY_DIR}/include/volk/volk.h + ${CMAKE_BINARY_DIR}/include/volk/volk_cpu.h + ${CMAKE_BINARY_DIR}/include/volk/volk_config_fixed.h + ${CMAKE_BINARY_DIR}/include/volk/volk_typedefs.h +- ${CMAKE_SOURCE_DIR}/include/volk/volk_malloc.h + DESTINATION include/volk + COMPONENT "volk_devel" + ) diff --git a/patches/libm-link b/patches/libm-link new file mode 100644 index 0000000..3387f36 --- /dev/null +++ b/patches/libm-link @@ -0,0 +1,11 @@ +--- a/lib/CMakeLists.txt ++++ b/lib/CMakeLists.txt +@@ -544,7 +544,7 @@ + + #Add dynamic library + add_library(volk SHARED $) +- target_link_libraries(volk ${volk_libraries}) ++ target_link_libraries(volk ${volk_libraries} m) + + #Configure target properties + set_target_properties(volk_obj PROPERTIES COMPILE_FLAGS "-fPIC") diff --git a/patches/make-acc-happy b/patches/make-acc-happy new file mode 100644 index 0000000..9ca7cb3 --- /dev/null +++ b/patches/make-acc-happy @@ -0,0 +1,53 @@ +From: A. Maitland Bottoms +Subject: make acc happy + +The abi-compliance-checker grabs all the .h files it finds +and tries to compile them all. Even though some are not +appropriate for the architecture being run on. Being careful +with preprocessor protections avoids probplems. + +--- a/kernels/volk/volk_32f_8u_polarbutterflypuppet_32f.h ++++ b/kernels/volk/volk_32f_8u_polarbutterflypuppet_32f.h +@@ -31,6 +31,7 @@ + #include + #include + #include ++#include + + + static inline void +--- a/include/volk/volk_neon_intrinsics.h ++++ b/include/volk/volk_neon_intrinsics.h +@@ -27,6 +27,7 @@ + + #ifndef INCLUDE_VOLK_VOLK_NEON_INTRINSICS_H_ + #define INCLUDE_VOLK_VOLK_NEON_INTRINSICS_H_ ++#ifdef LV_HAVE_NEON + #include + + static inline float32x4_t +@@ -119,4 +120,5 @@ + return log2_approx; + } + ++#endif /*LV_HAVE_NEON*/ + #endif /* INCLUDE_VOLK_VOLK_NEON_INTRINSICS_H_ */ +--- a/kernels/volk/volk_8u_x2_encodeframepolar_8u.h ++++ b/kernels/volk/volk_8u_x2_encodeframepolar_8u.h +@@ -58,8 +58,6 @@ + } + } + +-#ifdef LV_HAVE_GENERIC +- + static inline void + volk_8u_x2_encodeframepolar_8u_generic(unsigned char* frame, unsigned char* temp, + unsigned int frame_size) +@@ -79,7 +77,6 @@ + --stage; + } + } +-#endif /* LV_HAVE_GENERIC */ + + #ifdef LV_HAVE_SSSE3 + #include diff --git a/patches/native-armv7-build-support b/patches/native-armv7-build-support new file mode 100644 index 0000000..a0ce781 --- /dev/null +++ b/patches/native-armv7-build-support @@ -0,0 +1,59 @@ +From: A. Maitland Bottoms +Subject: native armv7 build support + +Debian, unlike other GNU Radio deployments, does not cross-compile +packages, but builds natively on a set of build machines, including +both arm and armhf. + +--- a/lib/CMakeLists.txt ++++ b/lib/CMakeLists.txt +@@ -250,6 +250,13 @@ + endif(NOT CPU_IS_x86) + + ######################################################################## ++# if building Debian armel, eliminate neon ++######################################################################## ++if(${CMAKE_LIBRARY_ARCHITECTURE} STREQUAL "arm-linux-gnueabi") ++ OVERRULE_ARCH(neon "Architecture is not armhf") ++endif(${CMAKE_LIBRARY_ARCHITECTURE} STREQUAL "arm-linux-gnueabi") ++ ++######################################################################## + # implement overruling in the ORC case, + # since ORC always passes flag detection + ######################################################################## +@@ -414,7 +421,7 @@ + # Handle ASM support + # on by default, but let users turn it off + ######################################################################## +-if(${CMAKE_VERSION} VERSION_GREATER "2.8.9") ++if((${CMAKE_VERSION} VERSION_GREATER "2.8.9") AND NOT (${CMAKE_LIBRARY_ARCHITECTURE} STREQUAL "arm-linux-gnueabi")) + set(ASM_ARCHS_AVAILABLE "neon") + + set(FULL_C_FLAGS "${CMAKE_C_FLAGS}" "${CMAKE_CXX_COMPILER_ARG1}") +@@ -424,7 +431,7 @@ + # set up the assembler flags and include the source files + foreach(ARCH ${ASM_ARCHS_AVAILABLE}) + string(REGEX MATCH "${ARCH}" ASM_ARCH "${available_archs}") +- if( ASM_ARCH STREQUAL "neon" ) ++ if(( ASM_ARCH STREQUAL "neon" ) OR ( ${CMAKE_SYSTEM_PROCESSOR} MATCHES "armv7")) + message(STATUS "---- Adding ASM files") # we always use ATT syntax + message(STATUS "-- Detected neon architecture; enabling ASM") + # setup architecture specific assembler flags +@@ -443,7 +450,7 @@ + message(STATUS "asm flags: ${CMAKE_ASM_FLAGS}") + endforeach(ARCH) + +-else(${CMAKE_VERSION} VERSION_GREATER "2.8.9") ++else((${CMAKE_VERSION} VERSION_GREATER "2.8.9") AND NOT (${CMAKE_LIBRARY_ARCHITECTURE} STREQUAL "arm-linux-gnueabi")) + message(STATUS "Not enabling ASM support. CMake >= 2.8.10 required.") + foreach(machine_name ${available_machines}) + string(REGEX MATCH "neon" NEON_MACHINE ${machine_name}) +@@ -451,7 +458,7 @@ + message(FATAL_ERROR "CMake >= 2.8.10 is required for ARM NEON support") + endif() + endforeach() +-endif(${CMAKE_VERSION} VERSION_GREATER "2.8.9") ++endif((${CMAKE_VERSION} VERSION_GREATER "2.8.9") AND NOT (${CMAKE_LIBRARY_ARCHITECTURE} STREQUAL "arm-linux-gnueabi")) + + ######################################################################## + # Handle orc support diff --git a/patches/series b/patches/series new file mode 100644 index 0000000..90dacbd --- /dev/null +++ b/patches/series @@ -0,0 +1,22 @@ +0001-Add-a-AppVeyor-compatible-YAML-file-for-building-on-.patch +0003-apps-fix-profile-update-reading-end-of-lines.patch +0005-qa-lower-tolerance-for-32fc_mag-to-fix-issue-96.patch +0006-Add-NEON-AVX-and-unaligned-versions-of-SSE4.1-and-SS.patch +0007-added-__VOLK_PREFETCH-compatibility-macro.patch +0008-Fix-bug-106-volk_64u_popcnt-bug-in-generic-implement.patch +0009-modtool-deconflict-module-include-guards-from-main-v.patch +0010-modtool-update-the-cmake-find-module-for-volk-mods.patch +0011-Use-powf-to-match-variables-and-avoid-implicit-type-.patch +0012-cmake-support-empty-CMAKE_INSTALL_PREFIX.patch +0013-Support-relocated-install-with-VOLK_PREFIX-env-var.patch +0014-Fixing-a-minimal-bug-in-the-log2-docstring.patch +0015-kernel-Adds-unaligned-protokernles-to-32f_x2_s32f_in.patch +0016-kernels-Adds-AVX-support-to-volk_32f_-kernels.patch +0017-kernels-Add-AVX-support-to-32f_x2_divide_32f-32f_x2_.patch +0018-fix-GH-issue-139-for-32fc_index_max_-kernels.patch +native-armv7-build-support +make-acc-happy +sort-cmake-glob-lists +install-all-headers +sort-input-files.patch +libm-link diff --git a/patches/sort-cmake-glob-lists b/patches/sort-cmake-glob-lists new file mode 100644 index 0000000..dfb8699 --- /dev/null +++ b/patches/sort-cmake-glob-lists @@ -0,0 +1,20 @@ +From: A. Maitland Bottoms +Subject sort cmake glob lists + +File lists are generated in a CMakeLists.txt file with file(GLOB ...), which varies +with the readdir() order. Sorting the lists should help make reproducinble builds. + +--- a/lib/CMakeLists.txt ++++ b/lib/CMakeLists.txt +@@ -328,8 +328,11 @@ + + #dependencies are all python, xml, and header implementation files + file(GLOB xml_files ${PROJECT_SOURCE_DIR}/gen/*.xml) ++list(SORT xml_files) + file(GLOB py_files ${PROJECT_SOURCE_DIR}/gen/*.py) ++list(SORT py_files) + file(GLOB h_files ${PROJECT_SOURCE_DIR}/kernels/volk/*.h) ++list(SORT h_files) + + macro(gen_template tmpl output) + list(APPEND volk_gen_sources ${output}) diff --git a/patches/sort-input-files.patch b/patches/sort-input-files.patch new file mode 100644 index 0000000..42e53f0 --- /dev/null +++ b/patches/sort-input-files.patch @@ -0,0 +1,51 @@ +From f6dbb5f8ba840075dde9f0aa1cc48b805ea4d1c5 Mon Sep 17 00:00:00 2001 +From: "Bernhard M. Wiedemann" +Date: Mon, 5 Jun 2017 21:37:38 +0200 +Subject: [PATCH 2/5] sort input files + +when building packages (e.g. for openSUSE Linux) +(random) filesystem order of input files +influences ordering of entries in the output, +thus without the patch, builds (in disposable VMs) would usually differ. + +See https://reproducible-builds.org/ for why this matters. +--- + gen/volk_kernel_defs.py | 2 +- + python/volk_modtool/volk_modtool_generate.py | 6 +++--- + 2 files changed, 4 insertions(+), 4 deletions(-) + +--- a/gen/volk_kernel_defs.py ++++ b/gen/volk_kernel_defs.py +@@ -202,7 +202,7 @@ + ######################################################################## + __file__ = os.path.abspath(__file__) + srcdir = os.path.dirname(os.path.dirname(__file__)) +-kernel_files = glob.glob(os.path.join(srcdir, "kernels", "volk", "*.h")) ++kernel_files = sorted(glob.glob(os.path.join(srcdir, "kernels", "volk", "*.h"))) + kernels = map(kernel_class, kernel_files) + + if __name__ == '__main__': +--- a/python/volk_modtool/volk_modtool_generate.py ++++ b/python/volk_modtool/volk_modtool_generate.py +@@ -58,10 +58,10 @@ + else: + name = self.get_basename(base) + if name == '': +- hdr_files = glob.glob(os.path.join(base, "kernels/volk/*.h")) ++ hdr_files = sorted(glob.glob(os.path.join(base, "kernels/volk/*.h"))) + begins = re.compile("(?<=volk_).*") + else: +- hdr_files = glob.glob(os.path.join(base, "kernels/volk_" + name + "/*.h")) ++ hdr_files = sorted(glob.glob(os.path.join(base, "kernels/volk_" + name + "/*.h"))) + begins = re.compile("(?<=volk_" + name + "_).*") + + datatypes = [] +@@ -156,7 +156,7 @@ + open(dest, 'w+').write(outstring) + + # copy orc proto-kernels if they exist +- for orcfile in glob.glob(inpath + '/kernels/volk/asm/orc/' + top + name + '*.orc'): ++ for orcfile in sorted(glob.glob(inpath + '/kernels/volk/asm/orc/' + top + name + '*.orc')): + if os.path.isfile(orcfile): + instring = open(orcfile, 'r').read() + outstring = re.sub(oldvolk, 'volk_' + self.my_dict['name'], instring) diff --git a/rules b/rules new file mode 100755 index 0000000..d58ca4b --- /dev/null +++ b/rules @@ -0,0 +1,17 @@ +#!/usr/bin/make -f +DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) +export DEB_HOST_MULTIARCH +DH_VERBOSE=1 +export DH_VERBOSE + +%: + dh $@ --with python2 + +override_dh_auto_configure: + dh_auto_configure -- -DLIB_SUFFIX="/$(DEB_HOST_MULTIARCH)" -DPYTHON_EXECUTABLE=/usr/bin/python + +override_dh_auto_test: + - dh_auto_test -- CTEST_TEST_TIMEOUT=60 + +override_dh_acc: + - dh_acc diff --git a/source/format b/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/source/include-binaries b/source/include-binaries new file mode 100644 index 0000000..bc68a00 --- /dev/null +++ b/source/include-binaries @@ -0,0 +1 @@ +debian/libvolk1-dev.abi.tar.gz.amd64 diff --git a/upstream/signing-key.asc b/upstream/signing-key.asc new file mode 100644 index 0000000..f6d7f93 --- /dev/null +++ b/upstream/signing-key.asc @@ -0,0 +1,52 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +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 +CLIM6szb01rYgHTn9/vDgJE= +=MlbD +-----END PGP PUBLIC KEY BLOCK----- diff --git a/volk-config-info.1 b/volk-config-info.1 new file mode 100644 index 0000000..e8d6efd --- /dev/null +++ b/volk-config-info.1 @@ -0,0 +1,45 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. +.TH VOLK-CONFIG-INFO "1" "July 2014" "volk-config-info 0.1" "User Commands" +.SH NAME +volk-config-info \- pkgconfig-like tool for Vector Optimized Library of Kernels 0.1 +.SH DESCRIPTION +.SS "Program options: volk-config-info [options]:" +.TP +\fB\-h\fR [ \fB\-\-help\fR ] +print help message +.TP +\fB\-\-prefix\fR +print VOLK installation prefix +.TP +\fB\-\-builddate\fR +print VOLK build date (RFC2822 format) +.TP +\fB\-\-cc\fR +print VOLK C compiler version +.TP +\fB\-\-cflags\fR +print VOLK CFLAGS +.TP +\fB\-\-all\-machines\fR +print VOLK machines built into library +.TP +\fB\-\-avail\-machines\fR +print VOLK machines the current platform can use +.TP +\fB\-\-machine\fR +print the VOLK machine that will be used +.TP +\fB\-v\fR [ \fB\-\-version\fR ] +print VOLK version +.SH "SEE ALSO" +The full documentation for +.B volk-config-info +is maintained as a Texinfo manual. If the +.B info +and +.B volk-config-info +programs are properly installed at your site, the command +.IP +.B info volk-config-info +.PP +should give you access to the complete manual. diff --git a/volk_modtool.1 b/volk_modtool.1 new file mode 100644 index 0000000..752e7f5 --- /dev/null +++ b/volk_modtool.1 @@ -0,0 +1,112 @@ +.TH GNURADIO "1" "August 2013" "volk_modtool 3.7" "User Commands" +.SH NAME +volk_modtool \- tailor VOLK modules +.SH DESCRIPTION +The volk_modtool tool is installed along with VOLK as a way of helping +to construct, add to, and interogate the VOLK library or companion +libraries. +.P +volk_modtool is installed into $prefix/bin. +.P +VOLK modtool enables creating standalone (out-of-tree) VOLK modules +and provides a few tools for sharing VOLK kernels between VOLK +modules. If you need to design or work with VOLK kernels away from +the canonical VOLK library, this is the tool. If you need to tailor +your own VOLK library for whatever reason, this is the tool. +.P +The canonical VOLK library installs a volk.h and a libvolk.so. Your +own library will install volk_$name.h and libvolk_$name.so. Ya Gronk? +Good. +.P +There isn't a substantial difference between the canonical VOLK +module and any other VOLK module. They're all peers. Any module +created via VOLK modtool will come complete with a default +volk_modtool.cfg file associating the module with the base from which +it came, its distinctive $name and its destination (or path). These +values (created from user input if VOLK modtool runs without a +user-supplied config file or a default config file) serve as default +values for some VOLK modtool actions. It's more or less intended for +the user to change directories to the top level of a created VOLK +module and then run volk_modtool to take advantage of the values +stored in the default volk_modtool.cfg file. +.P +Apart from creating new VOLK modules, VOLK modtool allows you to list +the names of kernels in other modules, list the names of kernels in +the current module, add kernels from another module into the current +module, and remove kernels from the current module. When moving +kernels between modules, VOLK modtool does its best to keep the qa +and profiling code for those kernels intact. If the base has a test +or a profiling call for some kernel, those calls will follow the +kernel when VOLK modtool adds that kernel. If QA or profiling +requires a puppet kernel, the puppet kernel will follow the original +kernel when VOLK modtool adds that original kernel. VOLK modtool +respects puppets. +.P +====================================================================== +.P +.SH Installing a new VOLK Library: +.P +Run the command "volk_modtool -i". This will ask you three questions: +.P + name: // the name to give your VOLK library: volk_ + destination: // directory new source tree is built under -- must exists. + // It will create /volk_ + base: // the directory containing the original VOLK source code +.P +This will build a new skeleton directory in the destination provided +with the name volk_. It will contain the necessary structure to +build: +.P + mkdir build + cd build + cmake -DCMAKE_INSTALL_PREFIX=/opt/volk ../ + make + sudo make install +.P +Right now, the library is empty and contains no kernels. Kernels can +be added from another VOLK library using the '-a' option. If not +specified, the kernel will be extracted from the base VOLK +directory. Using the '-b' allows us to specify another VOLK library to +use for this purpose. +.P + volk_modtool -a -n 32fc_x2_conjugate_dot_prod_32fc +.P +This will put the code for the new kernel into +/volk_/kernels/volk_/ +.P +Other kernels must be added by hand. See the following webpages for +more information about creating VOLK kernels: + http://gnuradio.org/doc/doxygen/volk_guide.html + http://gnuradio.org/redmine/projects/gnuradio/wiki/Volk +.P +====================================================================== +.P +.SH OPTIONS +.P +Options for Adding and Removing Kernels: + -a, --add_kernel + Add kernel from existing VOLK module. Uses the base VOLK module + unless -b is used. Use -n to specify the kernel name. + Requires: -n. + Optional: -b +.P + -A, --add_all_kernels + Add all kernels from existing VOLK module. Uses the base VOLK + module unless -b is used. + Optional: -b +.P + -x, --remove_kernel + Remove kernel from module. + Required: -n. + Optional: -b +.P +Options for Listing Kernels: + -l, --list + Lists all kernels available in the base VOLK module. +.P + -k, --kernels + Lists all kernels in this VOLK module. +.P + -r, --remote-list + Lists all kernels in another VOLK module that is specified + using the -b option. diff --git a/volk_profile.1 b/volk_profile.1 new file mode 100644 index 0000000..405facb --- /dev/null +++ b/volk_profile.1 @@ -0,0 +1,5 @@ +.TH UHD_FFT "1" "March 2012" "volk_profile 3.5" "User Commands" +.SH NAME +volk_profile \- Quality Assurance application for libvolk functions +.SH DESCRIPTION +Writes profile results to a file. diff --git a/watch b/watch new file mode 100644 index 0000000..d755268 --- /dev/null +++ b/watch @@ -0,0 +1,3 @@ +version=3 +opts="pgpsigurlmangle=s/$/.asc/" \ + http://libvolk.org/releases/volk-(\d\S*)\.tar\.gz -- 2.30.2