]> git.proxmox.com Git - mirror_zfs.git/commit - config/kernel-fpu.m4
Support for vectorized algorithms on x86
authorGvozden Neskovic <neskovic@gmail.com>
Mon, 29 Feb 2016 18:42:27 +0000 (19:42 +0100)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 21 Mar 2016 16:24:34 +0000 (09:24 -0700)
commitfc0c72b1670156622af26562030e84bd56d4cdfb
tree879abed526062448a42ef0cbf513072b5f3a0e27
parente853ba351935135487621f79211e87d5f2e39205
Support for vectorized algorithms on x86

This is initial support for x86 vectorized implementations of ZFS parity
and checksum algorithms.

For the compilation phase, configure step checks if toolchain supports relevant
instruction sets. Each implementation must ensure that the code is not passed
to compiler if relevant instruction set is not supported. For this purpose,
following new defines are provided if instruction set is supported:
- HAVE_SSE,
- HAVE_SSE2,
- HAVE_SSE3,
- HAVE_SSSE3,
- HAVE_SSE4_1,
- HAVE_SSE4_2,
- HAVE_AVX,
- HAVE_AVX2.

For detecting if an instruction set can be used in runtime, following functions
are provided in (include/linux/simd_x86.h):
- zfs_sse_available()
- zfs_sse2_available()
- zfs_sse3_available()
- zfs_ssse3_available()
- zfs_sse4_1_available()
- zfs_sse4_2_available()
- zfs_avx_available()
- zfs_avx2_available()
- zfs_bmi1_available()
- zfs_bmi2_available()

These function should be called once, on module load, or initialization.
They are safe to use from user and kernel space.
If an implementation is using more than single instruction set, both compiler
and runtime support for all relevant instruction sets should be checked.

Kernel fpu methods:
- kfpu_begin()
- kfpu_end()

Use __get_cpuid_max and __cpuid_count from <cpuid.h>
Both gcc and clang have support for these. They also handle ebx register
in case it is used for PIC code.

Signed-off-by: Gvozden Neskovic <neskovic@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Chunwei Chen <tuxoko@gmail.com>
Closes #4381
config/kernel-fpu.m4 [new file with mode: 0644]
config/kernel.m4
config/toolchain-simd.m4 [new file with mode: 0644]
config/zfs-build.m4
include/linux/Makefile.am
include/linux/simd_x86.h [new file with mode: 0644]