不稳定的 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
函数是相应的加速实现。
在此函数的末尾,函数指针指向最快的可用实现,可以调用它来执行计算。
搜索结果为