Release v3.1.2

25 Feb 2024 by Johannes Demel

Hi everyone!

This is the VOLK v3.1.2 release! We want to thank all contributors. This release wouldn't have been possible without them.

The last maintenance release revealed issues in areas that are difficult to test. While the changes to the library should be minimal, usability should be improved. Most notably, we build and deploy the VOLK documentation automatically now.



  • Documentation improvements, and automatically generate and publish
    • docs: Add VOLK doc build to CI
    • docs: Add upload to GitHub actions
    • cpu_features: Update hints in README
  • Remove sse2neon with a native NEON implementation
    • Replace sse2neon with native NEON
    • Remove loop unrolling
    • Simplify Spiral-generated code
  • Improve CI pipeline with new runner
    • flyci: Test CI service with M2 instance
    • actions: Update GH Actions checkout
  • Auto-format CMake files
    • cmake: Add .cmake-format.py
    • cmake: Apply .cmake-format.py
  • Release script fixes
    • scripts/release: fix multi-concatenation of submodule tars
    • shellcheck fixes
    • bash negative exit codes are not portable, let's be positive

Release v3.1.1

29 Jan 2024 by Johannes Demel

Hi everyone!

This is the VOLK v3.1.1 release! We want to thank all contributors. This release wouldn't have been possible without them.

This is a maintenance release to fix subtle bugs in many areas and to improve our tests where possible. All in all, our CI is more stable now and catches more errors.



  • CI fixes
  • Allow for rounding error in float-to-int conversions
  • Allow for rounding error in volk_32fc_s32f_magnitude_16i
  • Allow for rounding error in float-to-int interleave
  • Add missing volk_16_byteswap_u_orc to puppet
  • Fix 64-bit integer testing
  • Build and test neonv7 protokernels on armv7

  • kernels

  • Remove broken sse32 kernels
  • Fix flaky fm_detect test
  • Fix flaky mod_range test
  • Remove unnecessary volatiles from volk_32fc_s32f_magnitude_16i
  • Remove SSE protokernels written in assembly
  • Remove inline assembler from volk_32fc_convert_16ic_neon
  • Use bit shifts in generic and byte_shuffle reverse
  • Remove disabled SSE4.1 dot product
  • Fix conv_k7_r2 kernel and puppet
  • Remove unused argument from renormalize
  • Align types in ORC function signatures
  • Uncomment AVX2 implementation
  • Renormalize in every iteration on AVX2
  • Remove extraneous permutations
  • Compute the minimum over both register lanes
  • volk_32fc_s32f_atan2_32f: Add NaN tests for avx2 and avx2fma code

  • fixes

  • Express version information in decimal
  • Remove __VOLK_VOLATILE
  • Remove references to simdmath library
  • cmake: Switch to GNUInstallDirs
  • fprintf: Remove fprintf statements from volk_malloc
  • release: Prepare release with updated files
  • Get the sse2neon.h file to a git submodule to avoid random copies.

Release v3.1.0

05 Dec 2023 by Johannes Demel

Hi everyone!

This is the VOLK v3.1.0 release! We want to thank all contributors. This release wouldn't have been possible without them.

This release introduces new kernels, fixes a lot of subtle bugs, and introduces an updated API that allows VOLK to run on PowerPC and MIPS platforms without issues. Namely, complex scalar values are passed to kernels by pointer instead of by value. The old API is still around and will be for the whole VOLK v3 release cycle. However, it is recommended to switch to the new API for improved compatibility. Besides, we saw improvements to our cpu_features usage that should make it easier for package maintainers. Finally, a lot of tests received fixes that allow our CI to run without hiccups.



  • Build and dependency updates

    • omit build path
    • cmake: Link to cpu_features only in BUILD_INTERFACE
    • cpu_features: Update submodule pointer and new CMake target name
    • cmake: Removed duplicated logic
    • cmake: Do not install cpu_features with volk
    • Use CMake target in one more place
    • Fix typo in the CMake target name
    • Use CpuFeatures target
    • Use cpu_features on RISC-V platforms
    • cpu_features: Update submodule pointer
    • Add UBSAN to ASAN builds
  • CI fixes

    • Add length checks to volk_8u_x2_encodeframepolar_8u
    • Fix flaky qa_volk_32f_s32f_convertpuppet_8u
    • Use absolute tolerance for stddev_and_mean
    • Use absolute tolerance for sum_of_poly kernel
    • Add length checks to conv_k7 kernels
    • Fix variable name in dot product kernels
    • Fix buffer overflow in volk_32fc_x2_square_dist_32f_a_sse3
    • Increase tolerance for volk_32f_log2_32f
    • Re-enable tests on aarch64 clang-14
    • Fix undefined behaviour in volk_8u_x4_conv_k7_r2_8u
    • Fix undefined behaviour in volk_32u_reverse_32u
    • Fix aligned loads and stores in unaligned kernels
    • Fix register size warnings in reverse kernel
    • Fix undefined behaviour in dot product kernels
    • Use an absolute tolerance to test the dot product kernels
    • Always initialize returnValue
    • Add length checks to puppets
    • Add carriage return to error message
    • Include ORC in neonv8 machine definition
    • Add back volk_32f_exp_32f test
    • Generate random integers with uniform_int_distribution
    • Fix puppet master name for volk_32u_popcnt
    • Avoid integer overflow in volk_8ic_x2_multiply_conjugate_16ic corner case
    • Use a reasonable scalar and tolerance for spectral_noise_floor
    • Increase volk_32f_x2_dot_prod_16i tolerance to 1
    • Increase tolerance for the power_spectrum test
    • Decrease the range for signed 16-bit integer testing
    • Use a puppet to pass positive values to volk_32f_x2_pow_32f
    • Use absolute tolerances for accumulator and dot product
    • Fix AppVeyor git checkout
  • new kernel API

    • Use pointers to pass in s32fc arguments
      • The old API is deprecated but will be available for the foreseeable future
  • updated kernels

    • Remove unused ORC code
    • Prefer NEON kernels over ORC
    • Require all kernels to have a generic implementation
    • Remove redundant a_generic kernels
    • Remove ORC kernels that use sqrtf
    • reverse: Rename dword_shuffle to generic
    • volk_32f_s32f_convert_8i: code style
    • volk_32fc_x2_divide_32fc: add documentation about numerical accuracy
    • kernel: Refactor 32f_s32f_multiply_32f kernel
    • kernel: Refactor 32f_x2_subtract_32f kernel
    • convert 32f->32i: fix compiler warnings about loss of int precision
    • 64u_ byteswape: remove buggy Neonv8 protokernel
    • 64u_ byteswape: remove buggy Neon protokernel
    • Remove broken volk_16i_max_star_16i_neon protokernel
    • Fix truncate-toward-zero distortion
    • Fix encodepolar documentation
  • new kernels

    • add volk_32f_s32f_x2_convert_8u kernel
    • Fix documentation for the clamp kernel
    • added new kernel: volk_32f_s32f_x2_clamp
    • new kernels for atan2
    • Add 32f_s32f_multiply_32f RISC-V manually optimized assembly
    • Add .size to volk_32f_s32f_multiply_32f_sifive_u74
    • Add volk_32fc_x2_dot_prod_32fc_sifive_u74

Major release v3.0.0

14 Jan 2023 by Johannes Demel

Hi everyone!

This is the VOLK v3.0.0 major release! This release marks the conclusion of a long lasting effort to complete GREP 23 that proposes to change the VOLK license to LGPLv3+. We would like to thank all VOLK contributors that they allowed this re-licensing effort to complete. This release wouldn't have been possible without them.

For VOLK users it is important to note that the VOLK API does NOT change in this major release. After a series of discussion we are convinced a license change justifies a major release. Thus, you may switch to VOLK 3 and enjoy the additional freedom the LGPL offers.

Motivation for the switch to LGPLv3+

We want to remove usage entry barriers from VOLK. As a result, we expect greater adoption and a growing user and contributor base of VOLK. This move helps to spread the value of Free and Open Source Software in the SIMD community, which so far is dominated by non-FOSS software. Moreover, we recognize the desire of our long term contributors to be able to use VOLK with their contributions in their projects. This may explicitly include proprietary projects. We want to enable all contributors to be able to use VOLK wherever they want. At the same time, we want to make sure that improvements to VOLK itself are easily obtained by everyone, i.e. strike a balance between permissiveness and strict copyleft.

Since VOLK is a library it should choose a fitting license. If we see greater adoption of VOLK in more projects, we are confident that we will receive more contributions. May it be bug fixes, new kernels or even contributions to core features.

Historically, VOLK was part of GNU Radio. Thus, it made total sense to use GPLv3+ just like GNU Radio. Since then, VOLK became its own project with its own repository and leadership. While it is still a core dependency of GNU Radio and considers GNU Radio as its main user, others may want to use it too. Especially, long term VOLK contributors may be able to use VOLK in a broader set of projects now.

After a fruitful series of discussions we settled on the LGPLv3+. We believe this license strikes a good balance between permissiveness and strict copyleft for VOLK. We hope to foster contributions to VOLK. Furthermore, we hope to see VOLK usage in a wider set of projects.


The VOLK 3.0.0 release is only possible because all contributors helped to make it possible. Thus, we omit a list of contributors that contributed since the last release. Instead we want to thank everyone again!


  • License switch to LGPLv3+
  • Fix build for 32 bit arm with neon
  • Add experimental support for MIPS and RISC-V

Release v2.5.2

04 Sep 2022 by Johannes Demel

Hi everyone!

We have a new VOLK release! We are happy to announce VOLK v2.5.2! We want to thank all contributors. This release wouldn't have been possible without them.

We are happy to announce that our re-licensing effort is complete. This has been a long and challenging journey. Being technical: There are 3 people left (out of 74) who we haven't been able to get in contact with (at all), for a total of 4 (out of 1092) commits, 13 (of 282822) additions, and 7 (of 170421) deletions. We have reviewed these commits and all are simple changes (e.g., 1 line change) and most are no longer relevant (e.g., to a file that no longer exists). VOLK maintainers are in agreement that the combination -- small numbers of changes per committer, simple changes per commit, commits no longer relevant -- means that we can proceed with re-licensing without the approval of the folks. We will try reaching out periodically to these folks, but we believe it unlikely we will get a reply.

This maintainance release is intended to be the last VOLK 2.x release. After we completed our re-licensing effort, we want to make a VOLK 3.0 release soon. VOLK 3.0 will be fully compatible with VOLK 2.x on a technical level. However, VOLK 3+ will be released under LGPL. We are convinced a license change justifies a major release.



  • Android
    • Add Android CI
    • Fix armeabi-v7a on Android
  • CI
    • Update all test jobs to more recent actions
  • volk_8u_x4_conv_k7_r2_8u
    • Add NEON implementation neonspiral via sse2neon.h
  • Fixes
    • Fix out-of-bounds reads
    • Fix broken neon kernels
    • Fix float to int conversion
  • CMake
    • Suppress superfluous warning
    • Fix Python install path calculation and documentation
  • cpu_features
    • Update submodule pointer
  • VOLK 3.0 release preparations
    • Use SPDX license identifiers everywhere
    • Re-arrange files in top-level folder
    • Update Doxygen and all Doxygen related tasks into docs

Release v2.5.1

12 Feb 2022 by Johannes Demel

Hi everyone!

We have a new VOLK release! We are happy to announce VOLK v2.5.1! We want to thank all contributors. This release wouldn't have been possible without them.

The list of contributors is pretty long this time due to a lot of support to relicense VOLK under LGPL. Currently, we are "almost there" but need a few more approvals, please support us. We thank everyone for their support in this effort.

We use cpu_features for a while now. This maintainance release should make it easier for package maintainers, FreeBSD users, and M1 users to use VOLK. Package maintainers should be able to use an external cpu_features module. For everyone else, cpu_features received support for M1 and FreeBSD.

You can find VOLK on Zenodo DOI: 10.5281/zenodo.3360942. We started to actively support Zenodo now via a .zenodo.json file. This might come in handy for people who use VOLK in publications. As a contributor, if you want more information about yourself added to VOLK, feel free to add your ORCiD and affiliation.

In the past, we relied on Boost for several tasks in volk_profile. For years, we minimized Boost usage to boost::filesystem. We mostly switched to C++17 std::filesystem years ago. The last distribution in our CI system that required Boost to build VOLK, was Ubuntu 14.04. Thus, now is the time to remove the Boost dependency completely and rely on C++17 features.

Some VOLK kernels are untested for years. We decided to deprecate these kernels but assume that nobody uses them anyways. If your compiler spits out a warning that you use a deprecated kernel, get in touch. Besides, we received fixes for various kernels. Especially FEC kernels are notoriously difficult to debug because issues often pop up as performance regressions.

Finally, we saw a lot of housekeeping in different areas. Scripts to support us in our LGPL relicensing effort, updated docs, and updated our code of conduct. We could remove some double entries in our QA system and fixed a volk_malloc bug that ASAN reported. Finally, we switched to the Python sysconfig module in our build system to ensure Python 3.12+ does not break our builds.



  • Kernels

    • Fixup underperforming GENERIC kernel for volk_8u_x4_conv_k7_r2_8u
    • volk_32fc_x2_conjugate_dot_prod_32fc: New generic implementation
    • Add volk_32f(c)_index_min_16/32u
    • Fix volk_32fc_index_min_32u_neon
    • Fix volk_32fc_index_min_32u_neon
  • Misc

    • Fix volk_malloc alignment bug
    • qa: Remove repeating tests
    • python: Switch to sysconfig module
    • deprecate: Add attribute deprecated
    • deprecate: Exclude warnings on Windows
    • docs: Update docs
    • Add the list of contributors agreeing to LGPL licensing
    • Add a script to count the lines that are pending resubmission
    • Testing: Add test for LGPL licensing
    • Update CODE_OF_CONDUCT file
  • Boost

    • boost: Remove boost dependency
    • c++: Require C++17 for std::filesystem
  • cpu_features cpu_features: Update submodule pointer cpu_features: Make cpu_features submodule optional

  • Zenodo zenodo: Add metadata file zenodo: Re-organize .zenodo.json

Help us relicense VOLK under LGPL

26 Sep 2021 by Johannes Demel

Dear VOLK community,

we are writing to let you know that we are working towards a new major release of VOLK. The possibly biggest change will be that we intend to use a different license for this release: VOLK 3.0 shall be licensed under the LGPL 3.0 (or later). To do this effectively, we will need your help, should you agree. If you are already aware of this effort and are in support, you can skip to "What are you asking from contributors?" below, but we recommend you read this letter in its entirety to make sure you understand our intentions and process.

Thanks for your support!

Why are we doing this?

In retrospect, LGPL would probably have been the better choice for VOLK from the get-go. The FSF recommendations on libraries states that "If developers are already using an established alternative library released under a nonfree license or a lax pushover license, then we recommend using the GNU Lesser General Public License (LGPL).".

We agree with this recommendation, and want to avoid VOLK being a SIMD library exclusively used by GNU Radio (and a few others), while other software packages rally behind other SIMD libraries, that are more liberally licensed.

We could have chosen an even less restrictive license, but we are believers in copyleft, and believe the LGPL strikes the right balance between not restricting users in which types of software they may use VOLK, and requiring users to continue upstreaming their modifications to VOLK.

How are we going to do this?

Relicensing codebases is a complex process, full of potential pitfalls. To avoid any misconceptions, ambiguities, or legal issues, we have decided to go for the nuclear option: We will delete all of VOLK, and start from scratch, using the LGPL from the beginning of VOLK 3.0. It would be a futile attempt to try and recreate the decades of work that went into previous versions of VOLK without violating the VOLK 2.0 license. We are therefore asking all contributors to re-grant us permission to include their code, previously submitted into VOLK versions 1 and 2, into the newly licensed VOLK 3. The process for contributors is simple (see below), but first, we want to explain how this works.

For contributing to VOLK 2.0, most of you signed a CLA, granting the copyright to the FSF. This CLA includes a paragraph stating that the FSF grants back to the developer the rights to use their contributions as they see fit.

We cannot copy code from VOLK 2.0, since that is GPL licensed. But we can ask you to resubmit your contributions to VOLK 3.0, which is LGPL licensed. And that's what we're asking you to do in this letter. The process to do so is really simple and will be explained shortly.

Once your previous contributions are re-submitted, the copyright will fall back onto the original authors.

What's going to happen to VOLK 2?

VOLK 2 will remain GPL-licensed. We may choose to continue supporting it with bug fixes, but the main development focus will lie on VOLK 3 going forward.

Will there be other changes in VOLK 3.0 other than the license change?

The roadmap for VOLK 3.0 is not yet fully laid out, but we are considering making some API-breaking changes in VOLK 3 along with the relicensing. At the moment, we consider approaches to fix complex data type incompatibilities between C and C++.

What are you asking from contributors?

To grant us permission to use your contributions under the LGPLv3+ license for VOLK 3.0, we ask that you sign the paragraph HERE. You can do this either by submitting a pull request against THIS FiLE, adding your name and email address as they appear in previous commits. Alternatively, you can send us an email, in which you state that you've read and understood the following paragraph, and we will add your name on your behalf. You should have received an email asking for code re-submissions.

There is no need to submit pull requests with your previous submissions. Once you have agreed to re-submit your code to VOLK 3, we will pull your submissions out of git history and apply them to the VOLK 3 branch under the new license on your behalf.

Should you not wish to re-use your contributions for VOLK 3, we understand and respect that, and will not include your code in future versions of VOLK. For logistical purposes, it would be very helpful if you still respond and let us know about your decision, so we can more easily track how many contributors are in agreement with this change.

Relicensing Agreement (this goes into the repo)

This statement goes into the commit message.

I, {contributor name}, hereby resubmit all my contributions to the VOLK project and repository under the terms of the LGPL-3.0-or-later.

My GitHub handle is {github handle}.

My email addresses used for contributions are: {email address}, ... .

I hereby agree that contributions made by me in the past, to previous versions of VOLK, may be re-used for inclusion in VOLK 3. I understand that VOLK 3 will be relicensed under LGPL-3.0-or-later.

Release v2.5.0

06 May 2021 by Johannes Demel

Hi everyone!

We have a new VOLK release! We are happy to announce VOLK v2.5.0! We want to thank all contributors. This release wouldn't have been possible without them.

This release adds new kernel implementations and fixes. Some of these were longstanding PRs that could only be merged recently thanks to our switch from CLA to DCO.


I would like to point out one upcoming change. After this release, we will rename our development branch to main as discussed in issue #461.

I'd like to point the community to this VOLK relicensing GREP. This is an ongoing effort to relicense VOLK under LGPLv3. We're looking for people and organizations that are interested in leading this effort.



  • Kernels

    • volk_32f_stddev_and_mean_32f_x2: implemented Young and Cramer's algorithm
    • volk_32fc_accumulator_s32fc: Add new kernel
    • volk_16ic_x2_dot_prod_16ic_u_avx2: Fix Typo, was _axv2.
    • Remove _mm256_zeroupper() calls
    • Enforce consistent function prototypes
    • 32fc_index_max: Improve speed of AVX2 version
    • conv_k7_r2: Disable broken AVX2 code
    • improve volk_8i_s32f_convert_32f for ARM NEON
    • Calculate cos in AVX512F
    • Calculate sin using AVX512F
  • Compilers

    • MSVC
      • Fix MSVC builds
    • GCC
      • Fix segmentation fault when using GCC 8
    • MinGW
      • add support and test for MinGW/MSYS2
  • The README has received several improvements

  • Build

    • Fix python version detection
    • cmake: Check that 'distutils' is available
    • c11: Remove pre-C11 preprocessor instructions
  • CI

    • Add more CI to GitHub Actions
    • Remove redundant tests from TravisCI
    • Add non-x86 GitHub Actions
    • Update compiler names in CI
    • Disable fail-fast CI
    • Add more debug output to tests
  • Contributing

    • contributing: Add CONTRIBUTING.md and DCO.txt

Release v2.4.1

17 Dec 2020 by Johannes Demel

Hi everyone!

We have a new VOLK bugfix release! We are happy to announce VOLK v2.4.1! We want to thank all contributors. This release wouldn't have been possible without them.

Our v2.4.0 release introduced quite a lot of changes under the hood. With this bugfix release, we want to make sure that everything works as expected again.



  • Build

    • cpu_features CMake option
    • Add cpu_features to static library build.
    • Use static liborc-0.4 library for static library build.
    • cmake: Detect if cpu_features submodule is present.
  • Install

    • Check for lib64 versus lib and set LIB_SUFFIX accordingly.
  • CI

    • Add CI test for static library build.
  • Releases

    • project: Include git submodules (i.e. cpu_features) in release tarball.
    • scripts: Add GPG signature to release script
  • Other

    • readme: Update TravisCI status badge

Release v2.4.0

22 Nov 2020 by Johannes Demel

Hi everyone!

We have another VOLK release! We're happy to announce VOLK v2.4.0! We want to thank all contributors. This release wouldn't have been possible without them.

We introduce cpu_features as a private submodule in this release because we use it to detect CPU features during runtime now. This should enable more reliable feature detection. Further, it takes away the burden to implement platform specific code. As a result, optimized VOLK kernels build for MacOS and Windows with AppleClang/MSVC out-of-the-box now.


  • Documentation

    • Update README to be more verbose and to improve usefulness.
  • Compilers

    • MSVC: Handle compiler flags and thus architecture specific kernels correctly. This enables optimized kernels with MSVC builds.
    • AppleClang: Treat AppleClang as Clang.
    • Paired with the cpu_features introduction, this enables us to use architecture specific kernels on a broader set of platforms.
  • CI
    • Update to newest version of the Intel SDE
    • Test the rotator kernel with a realistic scalar
    • Introduce more test cases with newer GCC and newer Clang versions.
  • CMake
    • Enable to not install volk_modtool.
    • Remove "find_package_handle_standard_args" warning.
  • cpu_features
    • Use cpu_features v0.6.0 as a private submodule to detect available CPU features.
    • Fix incorrect feature detection for newer AVX versions.
    • Circumvent platform specific feature detection.
    • Enable more architecture specific kernels on more platforms.
  • Kernels
    • Disable slow and broken SSE4.1 kernel in volk_32fc_x2_dot_prod_32fc
    • Adjust min/max for 32f_s32f_convert_8i kernel
    • Use INT8_* instead of CHAR_*



  • Documentation

    • Update README to include ldconfig upon volk build and install completion
    • Update README based on review
    • readme: Fix wording
    • docs: Fix conversion inaccuracy
  • MSVC

    • archs: MSVC 2013 and greater don't have a SSE flag
  • CI

    • update to newest version of the Intel SDE
    • Test the rotator kernel with a realistic scalar
  • CMake

    • build: Enable to not install volk_modtool
    • cmake: Remove "find_package_handle_standard_args" warning.
    • cmake: Ensure that cpu_features is built as a static library.
  • cpu_features

    • readme: Add section on supported platforms
    • readme: Make supported compiler section more specific
    • travis: Add GCC 9 test on focal
    • travis: Add tests for clang 8, 9, 10
    • travis: Fix incorrect CXX compiler assignment
    • cpu_features: Remove unused feature checks
    • ci: Update TravisCI for cpu_features
    • cpu_features: Fix MSVC build
    • pic: Fix BUILD_PIC issue
    • ci: Update CI system configuration
    • cpu_features: Bump submodule pointer to v0.6.0
    • docs: Add hints how to handle required submodules
    • cpu_features: Switch to cpu_features
    • ci: Update CI system for cpu_features
    • cpu_features: Force PIC build flag
    • appveyor: Add recursive clone command
    • cpu_features: Remove xgetbv checks
    • pic: Cache and force BUILD_PIC
    • ci: Remove explicit BUILD_PIC from cmake args
    • ci: Remove BUILD_PIC from CI cmake args
    • cpu_features: Remove commented code
    • cpu_features: Assume AppleClang == Clang
    • cpu_features: Remove obsolete code in archs.xml
    • fix for ARM cross-compiling CI
    • ARM CI: remove unneeded environment variables
  • Housekeeping

    • structure: Move release scripts to scripts folder
  • Kernels

    • emit an emms instruction after using the mmx extension
    • volk_32fc_x2_dot_prod_32fc: disable slow & broken SSE4.1 kernel
    • fix: Adjust min/max for 32f_s32f_convert_8i kernel
    • fix: Use INT8_ instead of CHAR_

Release v2.3.0

09 May 2020 by Johannes Demel

Hi everyone!

VOLK 2.3 is out! We want to thank all contributors. This release wouldn't have been possible without them. We saw lots of great improvements.

On GNU Radio 'master' VOLK was finally removed as a submodule.

Currently we see ongoing discussions on how to improve CPU feature detection because VOLK is not as reliable as we'd like it to be in that department. We'd like to benefit from other open source projects and don't want to reinvent the wheel. Thus, one approach would be to include cpu_features as a submodule.


  • Better reproducible builds
  • CMake improvements
    • ORC is removed from the public interface where it was never supposed to be.
    • CMake fixes for better usability
  • Updated and new CI chain
    • TravisCI moved to new distro and does more tests for newer GCC/Clang
    • Github Actions
      • Add Action to check proper code formatting.
      • Add CI that also runs on MacOS with XCode.
  • Enforce C/C++ coding style via clang-format
  • Kernel fixes
    • Add puppet for power_spectral_density kernel
    • Treat the mod_range puppet as a puppet for correct use with volk_profile
    • Fix index_max kernels
    • Fix rotator. We hope that we finally found the root cause of the issue.
  • Kernel optimizations
    • Updated log10 calcs to use faster log2 approach
    • Optimize complexmultiplyconjugate
  • New kernels
    • accurate exp kernel is finally merged after years
    • Add 32f_s32f_add_32f kernel to perform vector + scalar float operation



  • Reproducible builds
    • Drop compile-time CPU detection
    • Drop another instance of compile-time CPU detection
  • CI updates
    • ci: Add Github CI Action
    • ci: Remove Ubuntu 16.04 GCC5 test on TravisCI
    • TravisCI: Update CI to bionic distro
    • TravisCI: Add GCC 8 test
    • TravisCI: Structure CI file
    • TravisCI: Clean-up .travis.yml
  • Enforce C/C++ coding style
    • clang-format: Apply clang-format
    • clang-format: Update PR with GitHub Action
    • clang-format: Rebase onto current master
  • Fix compiler warnings
    • shadow: rebase kernel fixes
    • shadow: rebase volk_profile fix
  • CMake
    • cmake: Remove the ORC from the VOLK public link interface
    • versioning: Remove .Maint from libvolk version
    • Fix endif macro name in comment
  • Kernels
    • volk: accurate exp kernel
      • exp: Rename SSE4.1 to SSE2 kernel
    • Add 32f_s32f_add_32f kernel
      • This kernel adds in vector + scalar functionality
    • Fix the broken index max kernels
    • Treat the mod_range puppet as such
    • Add puppet for power spectral density kernel
    • Updated log10 calcs to use faster log2 approach
    • fix: Use unaligned load
    • divide: Optimize complexmultiplyconjugate

Release v2.2.1

24 Feb 2020 by Johannes Demel

Hi everyone,

with VOLK 2.2.0, we introduced another AVX rotator bug which is fixed with this release. In the process 2 more bugs were identified and fixed. Further, we saw some documentation improvements.



  • Fix loop bound in AVX rotator
  • Fix out-of-bounds read in AVX2 square dist kernel
  • Fix length checks in AVX2 index max kernels
  • includes: rearrange attributes to simplify macros Whitespace
  • kernels: fix usage in header comments

Release v2.2.0

16 Feb 2020 by Johannes Demel

Hi everyone,

we have a new VOLK release v2.2.0!

We want to thank all contributors. This release wouldn't have been possible without them.

We're curious about VOLK users. Especially we'd like to learn about VOLK users who use VOLK outside GNU Radio.

If you have ideas for VOLK enhancements, let us know. Start with an issue to discuss your idea. We'll be happy to see new features get merged into VOLK.

The v2.1.0 release was rather large because we had a lot of backlog. We aim for more incremental releases in order to get new features out there.


VOLK v2.2.0 updates our build tools and adds support functionality to make it easier to use VOLK in your projects.

  • Dropped Python 2 build support
    • Removed Python six module dependency
  • Use C11 aligned_alloc whenever possible
    • MacOS posix_memalign fall-back
    • MSVC _aligned_malloc fall-back
  • Add VOLK version in volk_version.h (included in volk.h)
  • Improved CMake code
  • Improved code with lots of refactoring and performance tweaks



  • CMake
    • Fix detection of AVX and NEON
    • Fix for macOS
    • lib/CMakeLists: use asm instead of asm for ARM tests
    • lib/CMakeLists: fix detection when compiler support NEON but nor neonv7 nor neonv8
    • lib/CMakeLists.txt: use VOLK_ASM instead of __asm
    • lib/CMakeLists.txt: let VOLK choose preferred neon version when both are supported
    • lib/CMakeLists.txt: simplify neon test support. Unset neon version if not supported
    • For attribute, change from clang to "clang but not MSC"
  • Readme
    • logo: Add logo at top of README.md
  • Build dependencies
    • python: Drop Python2 support
    • python: Reduce six usage
    • python: Move to Python3 syntax and modules
    • six: Remove build dependency on python six
  • Allocation
    • alloc: Use C11 aligned_alloc
    • alloc: Implement fall backs for C11 aligned_alloc
    • alloc: Fix for incomplete MSVC standard compliance
    • alloc: update to reflect alloc changes
  • Library usage
    • Fixup VolkConfigVersion
    • add volk_version.h
  • Refactoring
    • qa_utils.cc: fix always false expression
    • volk_prefs.c: check null realloc and use temporary pointer
    • volk_profile.cc: double assignment and return 0
    • volk_32f_x2_pow_32f.h: do not need to _mm256_setzero_ps()
    • volk_8u_conv_k7_r2puppet_8u.h: d_polys[i] is positive
    • kernels: change one iteration for's to if's
    • kernels: get rid of some assignments
    • qa_utils.cc: actually throw something
    • qa_utils.cc: fix always true code
    • rotator: Refactor AVX kernels
    • rotator: Remove unnecessary variable
    • kernel: Refactor square_dist_scalar_mult
    • square_dist_scalar_mult: Speed-Up AVX, Add unaligned
    • square_dist_scalar_mult: refactor AVX2 kernel
    • kernel: create AVX2 meta intrinsics
  • CI
    • appveyor: Test with python 3.4 and 3.8
    • appveyor: Add job names
    • appveyor: Make ctest more verbose
  • Performance
    • Improve performance of generic kernels with complex multiply
    • square_dist_scalar_mult: Add SSE version
    • Adds NEON versions of cos, sin and tan

Website Updates

02 Jan 2020 by Andrej Rode

After a long time libvolk.org is brought to you from the GNU Radio infrastructure at OSUOSL with love! The canonical URL now is: https://www.libvolk.org. A big thank to the OSU Open Source Lab for providing the GNU Radio project with server infrastructure to run websites, Continuous Integration and other web services.

Website repository

You can find the source code of libvolk.org now at https://github.com/gnuradio/libvolk.org and submit pull-requests with updates and corrections. Once your pull-request is accepted it will be automatically deployed here and it's easy to get content online on libvolk.org now!

Future updates

Stay tuned for future additions to this website and infrastructure!

Release v2.1.0

22 Dec 2019 by Johannes Demel

Hi everyone,

we would like to announce that Michael Dickens and Johannes Demel are the new VOLK maintainers. We want to review and merge PRs in a timely manner as well as commenting on issues in order to resolve them.

We want to thank all contributors. This release wouldn't have been possible without them.

We're curious about VOLK users. Especially we'd like to learn about VOLK users who use VOLK outside GNU Radio.

If you have ideas for VOLK enhancements, let us know. Start with an issue to discuss your idea. We'll be happy to see new features get merged into VOLK.


VOLK v2.1.0 is a collection of really cool changes. We'd like to highlight some of them.

  • The AVX FMA rotator bug is fixed
  • VOLK offers volk::vector<> for C++ to follow RAII
  • Move towards modern dependencies
    • CMake 3.8
    • Prefer Python3
      • We will drop Python2 support in a future release!
    • Use C++17 std::filesystem
      • This enables VOLK to be built without Boost if available!
  • more stable CI
  • lots of bugfixes
  • more optimized kernels, especially more NEON versions



  • Usage

    • Update README to reflect how to build on Raspberry Pi and the importance of running volk_profile
  • Toolchain

    • Add toolchain file for Raspberry Pi 3
    • Update Raspberry 4 toolchain file
  • Kernels

    • Add neonv7 to volk_16ic_magnitude_16i
    • Add neonv7 to volk_32fc_index_max_32u
    • Add neonv7 to volk_32fc_s32f_power_spectrum_32f
    • Add NEONv8 to volk_32f_64f_add_64f
    • Add Neonv8 to volk_32fc_deinterleave_64f_x2
    • Add volk_32fc_x2_s32fc_multiply_conjugate_add_32fc
    • Add NEONv8 to volk_32fc_convert_16ic
  • CI

    • Fix AVX FMA rotator
    • appveyor: Enable testing on windows
    • Fixes for flaky kernels for more reliable CI
      • volk_32f_log2_32f
      • volk_32f_x3_sum_of_poly_32f
      • volk_32f_index_max_{16,32}u
      • volk_32f_8u_polarbutterflypuppet_32f
      • volk_8u_conv_k7_r2puppet_8u
      • volk_32fc_convert_16ic
      • volk_32fc_s32f_magnitude_16i
      • volk_32f_s32f_convert_{8,16,32}i
      • volk_16ic_magnitude_16i
      • volk_32f_64f_add_64f
    • Use Intel SDE to test all kernels
    • TravisCI
      • Add native tests on arm64
      • Add native tests on s390x and ppc64le (allow failure)
  • Build

    • Build Volk without Boost if C++17 std::filesystem or std::experimental::filesystem is available
    • Update to more modern CMake
    • Prevent CMake to choose previously installed VOLK headers
    • CMake
      • bump minimum version to 3.8
      • Use sha256 instead of md5 for unique target name hash
    • Python: Prefer Python3 over Python2 if available
  • C++

    • VOLK C++ allocator and C++11 std::vector type alias added

Release v1.4

26 Mar 2018 by Nathan West

A lot of really good changes came to VOLK with v1.4. It wouldn't have been possible without the following contributors:



Generally, there are a lot of kernel changes and some minor dependency changes. I'm trying to remove boost as a dependency and we've introduced mako templates rather than the old Cheetah-templates to keep in line with GNU Radio. There are also several new CI files that support appveyor, travis-ci, and gitlab. Right now all pull requests must pass travis-ci.


The easiest way to show these changes is simply with two lists:

New kernels

  • 32 bit reversal
  • 32f_s32f_s32f_mod_range_32f
  • double precision (64f_XXX...)
    • multiply
    • add
  • 32f_64f_multiply_64f
  • add 32f_64f_add_64f
  • 32fc_x2_add_32fc

New proto-kernels by architecture


Note that in some cases an unaligned version was added where an aligned version already existed

  • volk_64f_convert_32f
  • volk_64f_x2_max_64f
  • volk_64f_x2_min_64f
  • volk_32f_x2_add_32f
  • 32i_x2_and_32i
  • 32i_x2_or_32i
  • conjugate dot products
  • 32f_accumulator_32f
  • stddev_and_mean
  • volk_32f_* kernels
  • 32f_x2_divide_32f
  • 32f_x2_dot_prod_16i
  • volk_32f_s32f_normalize
  • volk_32f_s32f_stddev_32f
  • volk_32f_sqrt_32f
  • volk_32f_x2_max_32f
  • volk_32f_x2_min_32f
  • 32f_x2_s32f_interleave_16ic
  • 32f_x2_subtract_32f
  • 32f_x2_s32f_interleave_16ic
  • 32f_x2_subtract_32f
  • 32f_x2_subtract_32f
  • 32f_x2_s32f_interleave_16ic
  • volk_8ic_s32f_deinterleave_*
  • 32f_log2_32f
  • volk_32f_s32f_convert_8i and 16i


  • move all neonasm to aligned protokernels
  • added ARM version of volk_32u_reverse_32u (RBIT)
  • volk_32fc_x2_divide_32fc
  • volk_32fc_32f_add_32fc
  • volk_32f_x2_divide_32f
  • volk_8i_s32f_convert_32f

Additionally, there are new protokernel intrinsics available for use in writing new kernels.

Then, we also had some general kernel and protokernel bug fixes and using proper type-named C functions which happened to increase performance:

The polarbutterfly went through some heavy refactoring and bug fixes as well as adding an AVX version. Fix GH issue #139 for 32fc_index_max_* kernels resulting in a slightly wrong index being returned. Fix bug 106 (volk_64u_popcnt bug in generic implementation)

CI and Builds

As previously mentioned there are appveyor, travis-ci, and gitlab CI files available. There is a travis-ci instance checking all pull requests at https://travis-ci.org/gnuradio/volk/ and a gitlab mirror running CI checks at https://gitlab.com/n-west/volk.

While working on these CI files the kernel tests were split in to individual ctest targets so that each kernel is its own test rather than running them as a monolithic binary. This allows parallel testing, but mostly enables easier diagnostics when a test fails. The readme is now a markdown file that renders well on GitHub and Gitlab along with the travis-ci status as a badge.

Within this release two tools were run that reorganized includes and fixed a bunch of typos within code.

As part of the attempt to build VOLK without boost a bunch of app and build utilities were written to replace boost-code. This shouldnt be visible to the user, but will hopefully make future builds easier and smaller with fewer build and run-time dependencies. Builds with python 2.7 and 3 should work-- although six is required for python2.7 support.

Some build changes make it easier to do a relocatable build and order all files before building so that building from a particular revision (from now on) should be reproducible across machines building the same architectures. To use a relocatable install use the VOLK_PREFIX environment variable. This should support snaps (Canonical packaging environment).


modtool: update the cmake find module for volk mods
modtool: deconflict module include guards from main volk

Release v1.3.1

25 Mar 2018 by Nathan West


The following people had commits in this release. Thanks to them for making VOLK possible!


This is an API-compatible support release that only includes bug fixes.


Fix GH issue #139 for 32fc_index_max_* kernels. Note that this is a minor API change that modern compilers should be OK with if they can handle the implicit type conversion.

Use 'powf' to match variables and avoid implicit type converstion. Makes some older compilers happy, allowing 'make test' to pass. kernels: Add AVX support to 32f_x2_divide_32f,32f_x2_dot_prod_16i.

Fix bug 106 (volk_64u_popcnt bug in generic implementation)

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

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.

Adds unaligned protokernels 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.

Add NEON, AVX and unaligned versions of SSE4.1 and SSE.

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.


Fixing a minimal bug in the log2 docstring

Build Support

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.

cmake: support empty CMAKE_INSTALL_PREFIX

QA and CI

qa: lower tolerance for 32fc_mag to fix issue #96 apps: fix profile update reading end of lines Add a AppVeyor compatible YAML file for building on the AppVeyor CI


Update the cmake find module for volk mods and deconflict module include guards from main volk.

Release v1.2.3

02 Jul 2016 by Nathan West

Release v1.2.3



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.

MSVC builds without explicitly set flags.

VolkConfig.cmake includes a hardcoded install path so that VOLK is easier to find in non-standard prefixes. Similarly the BOOST_ROOT environment variable is no longer overridden so that it is easier to find BOOST in non-standard prefixes.

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.

Release v1.3

02 Jul 2016 by Nathan West

Release v1.3



Several new kernels are available. These include several type conversions, some fixed point complex operations, and a complex float divide.

Volk_config functions are now overloaded to be able to read and write to a custom volk_config path which can be controlled with a new --path option in volk_profile.

Volk-config-info can now tell you the alignment VOLK is using for your CPU and malloc implementation used in volk_profile.

Builds define the Dual ABI macro _GLIBCXX_USE_CXX11_ABI to 1, which should allow builds with GCC 4 when linking against C++ libraries that are built with GCC 5.

Release v1.2.2

07 Apr 2016 by Nathan West

Release v1.2.2



This is a maintenance release the primarily addresses build issues, primarily for MSVC. Additionally, this fixes an issue when building as a sub-project of GNU Radio with cmake versions >= 3.5

Release v1.2.1

07 Feb 2016 by Nathan West

Release v1.2.1




  • Fixed a segfault in the polar butterfly puppet
  • Reverted back to input values in range [-1, 1] rather than [-pi, pi].

Builds (all windows related)

  • Add MSVC 14 to processor detection
  • Minor tweaks to fix builds on MSVC 2015


Small performance improvement in log2 by switching to log2f, which is explicitly for floats.

Add reusable intrinsics for NEON. This continues the push for creating an internal library of intrinsics that will make composing more complex kernels from simpler reusable building blocks without going back to memory.

Release v1.2

23 Dec 2015 by Nathan West

Release v1.2




New kernels for doing polar codes are available with generic, SSE3, and AVX implementations. This is the result of ESA SoC by Jannes Demel and used in GNU Radio.

The rotator protokernels now normalize phase after every time finished through the main for loop to guarantee normalization happens for a series of calls with smaller vector lengths.

Some kernels now use inacc tolerances for QA. The kernels themselves are exactly the same funcationality as before, but with the existing QA tolerance would fail on NEON due to sqrt and inverse approximations in NEON.

Release v1.1.1

31 Oct 2015 by Nathan West

Release v1.1.1

This is the first maintenance release with only bug fixes since v1.1


The following authors have contributed code to this release:



Ben spent the post-GRcon hackfest fixing a few errors that the GNU Radio coverity scan reported. The critical fix was a potential buffer overflow in the profiler while reading existing results.


Based on feedback from packagers VOLK has made strides towards reproducible builds. The latest effort is removing the builddate.

Several header includes and ifdef guards have been shuffled around to make VOLK out of tree modules easier to work with and ARM builds more robust to compiler whims.

Release v1.1

24 Aug 2015 by Nathan West

Release v1.1


The following authors have contributed code to this release:


This release contains all of the bug fixes from v1.0.1 and v1.0.2 as well as new features and other changes that didn't belong on maint. The following is a summary of non-maint changes.


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


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.


  • All builds now use '-Wall'
  • Removed stray references to PCC and Altivec

Maintenance Release v1.0.2

24 Jul 2015 by Nathan West

Release v1.0.2

This is a relatively minor maintenance release with bug fixes since v1.0.1.


The following have contributed code to this release:


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.

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.


The following authors have contributed code to this release:



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.


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.

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.


VOLK has been tracked separately from GNU Radio since 2014 Dec 23. Contributors between the split and the initial release are



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 was updated to support the QA and profiler changes.


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.


The posix_memalign implementation of Volk_malloc now falls back to a standard malloc if alignment is 1.


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.