不稳定的 SIMD 模块

此模块提供辅助功能来构建使用 SIMD 指令的代码。 自 0.42.0 版本起可用。

注意:此模块不稳定。 它仅作为技术预览提供。 它的 API 可能会在版本之间以任意方式更改,或者可能完全从 Meson 中删除。

用法

此模块专为以下用例设计:您有一个算法,其中包含一个或多个 SIMD 实现,您可以在运行时选择使用哪个实现。

该模块提供了一种方法,check,使用方法如下

rval = simd.check('mysimds',
  mmx : 'simd_mmx.c',
  sse : 'simd_sse.c',
  sse2 : 'simd_sse2.c',
  sse3 : 'simd_sse3.c',
  ssse3 : 'simd_ssse3.c',
  sse41 : 'simd_sse41.c',
  sse42 : 'simd_sse42.c',
  avx : 'simd_avx.c',
  avx2 : 'simd_avx2.c',
  neon : 'simd_neon.c',
  compiler : cc)

此处,各个文件包含所讨论函数的加速版本。 compiler 关键字参数接受您将用于编译它们的编译器。 该函数返回一个包含两个值的数组。 第一个值是一组包含已编译代码的库。 编译器无法编译的任何 SIMD 代码(例如,x86 机器上的 Neon 指令)都会被忽略。 您应该使用 link_with 将此值传递给所需的目标。 第二个值是 configuration_data 对象,其中包含所有支持的值的真值。 例如,如果编译器支持 sse2 指令,那么该对象将具有 HAVE_SSE2 设置为 1。

生成代码以在运行时检测正确的指令集很简单。 首先,您使用配置对象创建一个头文件,然后创建一个选择器函数,如下所示

void (*fptr)(type_of_function_here)  = NULL;

#if HAVE_NEON
if(fptr == NULL && neon_available()) {
    fptr = neon_accelerated_function;
}
#endif
#if HAVE_AVX2
if(fptr == NULL && avx2_available()) {
    fptr = avx_accelerated_function;
}
#endif

...

if(fptr == NULL) {
    fptr = default_function;
}

每个源文件提供两个函数,xxx_available 函数用于查询当前使用的 CPU 是否支持指令集,xxx_accelerated_function 函数是相应的加速实现。

在此函数的末尾,函数指针指向最快的可用实现,可以调用它来执行计算。

搜索结果为