15814078686
support@rssdr.com

GNURadio CPU指令集加速库VOLK介绍

发 布:2020/7/25 16:31:40查 看:1817

介绍

        VOLK是Vector-Optimized Library of Kernels的缩写,是一个使用CPU的SIMD指令集对向量运行进行加速运行运算的函数库。它是一个包含不同数学运算的手写SIMD代码内核的库。由于每个SIMD体系结构可能有很大的不同,而且还没有编译器能够正确或高效地处理矢量化,所以VOLK对问题的处理方式不同:对于开发人员希望矢量化的每个架构或平台,都会向VOLK添加一个新的原型内核。在运行时,VOLK将选择正确的原型内核。这样,VOLK的用户调用一个内核来执行与平台/体系结构无关的操作。这允许我们编写可移植的SIMD代码。

        VOLK内核总是用一个“通用”原型内核来定义,它是用纯C编写的。有了通用内核,内核就可以移植到任何平台上。然后通过为需要的新平台添加原型内核来扩展内核。 

        定义了多个原核的VOLK内核的一个很好的例子是volk_32f_s32f_multiply_32f_a。该内核实现浮点数向量的标量乘法(矢量中的每个项目都乘以相同的值)。这个内核有以下为“generic”、“avx”、“sse”和“neon”定义的原型内核:

   void volk_32f_s32f_multiply_32f_a_generic

   void volk_32f_s32f_multiply_32f_a_sse

   void volk_32f_s32f_multiply_32f_a_avx

   void volk_32f_s32f_multiply_32f_a_neon

        这些原型内核意味着在具有AVX支持的平台上,VOLK可以选择此选项或SSE选项,具体取决于哪个速度更快。如果其他所有方法均失败,则VOLK可以退回到通用原型内核上,该内核始终有效。

        有关VOLK命名方案的详细信息,请参见libvolk.org。


设置和使用内存对齐信息

为了使VOLK尽可能发挥最佳性能,我们想使用内存对齐的SIMD调用,这意味着我们必须有某种方式来了解和控制传递给gr_block的work函数的缓冲区的对齐方式。我们为SIMD对齐的内存调用设置对齐要求:

const int alignment_multiple = volk_get_alignment() / output_item_size;

set_alignment(std::max(1,alignment_multiple));

VOLK函数“volk_get_alignment”提供机器架构的对齐。然后,我们根据保持对齐所需的输出项数量来进行对齐,因此我们将对齐字节数除以输出项中的字节数(sizeof(float)、sizeof(gr_complex)等)。然后使用“set_alignment”函数为每个块设置此值。

由于调度程序试图优化吞吐量,每次工作调用可用的采样点数将发生变化,并取决于可用的读写缓冲区的大小。这意味着它有时无法生成正确对齐内存的缓冲区。这是调度系统不可避免的结果。调度器不需要对齐,而是尽可能多地强制对齐,当缓冲区变为未对齐时,调度程序将尽可能地纠正它。如果一个块的缓冲区未对齐,那么调度程序会设置一个标志来指示尽可能多的缓冲区,这样块就可以决定最好做什么。下一节讨论对齐/未对齐信息在gr_块的work函数中的使用。


在Work()中调用VOLK内核

不能保证在gr_block中传递给work / general_work的缓冲区是对齐的,但是在可能的情况下,它们大多会对齐。不对齐时,将设置“ is_unaligned()”标志,以便调度程序尝试重新对齐缓冲区。实际上,我们调用VOLK调度程序,该调度程序主要用于检查缓冲区对齐并为我们调用正确的内核版本。从VOLK的用户级别的角度来看,调用调度程序使我们可以忽略对齐和不对齐的概念。看起来像:

int

 gr_some_block::work (int noutput_items,

                      gr_vector_const_void_star &input_items,

                      gr_vector_void_star &output_items)

 {

   const float *in = (const float *) input_items[0];

   float *out = (float *) output_items[0];

 

   // Call the dispatcher to check alignment and call the _a or _u

   // version of the kernel.

   volk_32f_something_32f(out, in, noutput_items);

 

   return noutput_items;

 }


调整VOLK性能

VOLK附带了一个profiler工具,它将为您的处理器构建一个最佳SIMD架构的配置文件。运行安装在$PREFIX/bin中的volk_profile程序。这个程序测试处理器支持的每个体系结构的所有已知的VOLK内核。

完成后,它将把VOLK函数的最佳体系结构写入$HOME/.volk/volk_config。在使用VOLK函数时,将读取此文件来了解要执行的函数的最佳版本。

手动调整性能

如果您知道特定的体系结构最适合您的处理器,则可以在VOLK首选项文件中指定要使用的特定体系结构:$HOME/.volk/volk_config

该文件如下所示:

volk_<FUNCTION_NAME> <ARCHITECTURE>

其中“ FUNCTION_NAME”是要覆盖默认值的特定功能,而“ ARCHITECTURE”是要使用的VOLK SIMD体系结构(generic,sse,sse2,sse3,avx等)。例如,以下配置文件告诉VOLK将SSE3用于将两个复数流相乘的函数的对齐和不对齐版本。

volk_32fc_x2_multiply_32fc_a sse3

volk_32fc_x2_multiply_32fc_u sse3


未来VOLK将会最为一个独立的开源项目存在,而不仅限于作为GNURadio的一个子模块。VOLK项目独立后,可以方便更多的其他领域用户使用。


SDR软件
RFNoC
UHD
GNURadio
LabVIEW
MATLAB & SIMULINK
OpenBTS
OpenAirInterface (OAI)
srsLTE
gqrx
关于我们
联系我们
关于在右科技
关于Ettus
产品介绍
USRP X系列
USRP 网口系列
USRP USB接口系列
USRP嵌入式系列
射频子板
天线
线缆
附件
SDR解决方案
其他服务
公司新闻
行业动态
入门培训
GNU Radio培训
Visual Studio开发环境配置
硬件安装指导
关注我们
版权信息
USRP中文网(ettus.com.cn)所发布展示的“产品信息”,“培训资料”版权归USRP中文网所有和发布企业所有,任何收集本站产品信息并未经USRP中文网许可,USRP中文网将保留追究侵权者法律责任的权利。

粤ICP备20009059号 © Copyright 2019. All rights reserved. ettus.com.cn