TurboPFor-Integer-Compression

powturboGPL-2.0活跃维护

一套基于 SIMD 的整数与浮点数压缩库,提供 AVX2/SSE2 加速的编解码和倒排索引求交,适合时序数据库和搜索引擎提速。

Fastest Integer Compression

2023.06发布于 2023-06-07 11:51 UTC850star121fork同步于 2026-11-07 23:33 UTC

怎么上手

由 README 提炼,执行前请确认
./icapp -a1.5 -m0 -M255 -n100M ZIPF
硬件要求按 README 说明

支持 AMD/Intel、64 位 ARMv8 NEON(Linux 与 MacOS/M1)及 Power9 Altivec;README 未说明显存或 CPU 运行要求。

支持 Apple Silicon
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

纯 C 实现的最快整数压缩库,覆盖 PFor、位打包、变长编码与倒排索引

一套基于 SIMD 的整数与浮点数压缩库,提供 AVX2/SSE2 加速的编解码和倒排索引求交,适合时序数据库和搜索引擎提速。

核心能力

  • 提供 TurboPFor/PForDelta 直接访问与 SIMD/AVX2 加速
  • SIMD 位打包吞吐超 200 亿整数/秒,支持零解压随机访问
  • TurboByte/TurboBitByte 混合变长编码优于 streamvbyte
  • 内置 Delta/Zigzag/XOR 变换与浮点、时序压缩
  • 倒排索引支持跳区间交集,单核超 2000 QPS

容易踩的坑

README 未给出构建步骤,需自行查看仓库;riscv64 仅走通用标量路径,不启用 x86 SIMD/AVX2;EliasFano 只能直接用于递增序列。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

4 个版本2023.06
  1. 2023.06TurboPFor-Integer-Compression + icapp for Windows+Linux最新正式版2023-06-07 · 2023-06-07 11:51 UTC

    TurboPFor-Integer-Compression including :

    Benchmark : IcApp + External libraries (lz4,zstd,bitshuffle,streamvbyte,fastpfor,blosc,...)

    TurboPFor static library libic.a (iccodecs not included) for windows + linux compiled with gcc 12.2.0

    c/c++ header file "ic.h"

    icapp for linux & windows

  2. 2023.05TurboPFor-Integer-Compression + icapp2023-05-16 · 2023-05-16 10:17 UTC
    查看更新说明

    TurboPFor-Integer-Compression including :

    Benchmark : IcApp + External libraries (lz4,zstd,bitshuffle,streamvbyte,fastpfor,blosc,...)

    TurboPFor static library libic.a (iccodecs not included) for windows compiled with gcc 12.2.0

    c/c++ header file "ic.h"

    icapp for linux & windows

  3. 2023-04TurboPFor-Integer-Compression + icapp2023-04-09 · 2023-04-09 21:26 UTC
    查看更新说明

    TurboPFor-Integer-Compression including :

    Benchmark : IcApp + External libraries (lz4,zstd,bitshuffle,streamvbyte,fastpfor,blosc,...)

    TurboPFor static library libic.a (iccodecs not included) for windows compiled with gcc 12.2.0

    c/c++ header file "ic.h"

    icapp for linux

  4. 2023.03TurboPFor-Integer-Compression + icapp2023-03-13 · 2023-03-13 10:02 UTC
    查看更新说明

    TurboPFor-Integer-Compression including :

    • Benchmark : IcApp + External libraries (lz4,zstd,bitshuffle,...)

    • TurboPFor static library libic.a (iccodecs not included) for windows compiled with gcc 12.2.0

    • c/c++ header file "ic.h"

    • icapp for linux

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    TurboPFor: Fastest Integer Compression

    Build ubuntu

    • TurboPFor: The synonym for "integer compression"
      • ALL functions available for AMD/Intel, 64 bits ARMv8 NEON Linux+MacOS/M1 & Power9 Altivec
      • 100% C (C++ headers), as simple as memcpy. OS:Linux amd64, arm64, Power9, MacOs (Amd/intel + Apple M1),
      • Rust Bindings. Access TurboPFor incl. SSE/AVX2/Neon! from Rust
      • :+1: Java Critical Natives/JNI. Access TurboPFor incl. SSE/AVX2/Neon! from Java as fast as calling from C
      • :sparkles: FULL range 8/16/32/64 bits scalar + 16/32/64 bits SIMD functions
      • riscv64 currently uses the existing generic/scalar path and does not enable x86 SIMD or AVX2 code paths unless a dedicated RISC-V backend is added.
      • No other "Integer Compression" compress/decompress faster
      • :sparkles: Direct Access, integrated (SIMD/AVX2) FOR/delta/Delta of Delta/Zigzag for sorted/unsorted arrays
    • For/PFor/PForDelta
      • Novel TurboPFor (PFor/PForDelta) scheme w./ direct access + SIMD/AVX2. +RLE
      • Outstanding compression/speed. More efficient than ANY other fast "integer compression" scheme.
    • Bit Packing
      • Fastest and most efficient "SIMD Bit Packing" >20 Billions integers/sec (80Gb/s!)
      • Extremely fast scalar "Bit Packing"
      • Direct/Random Access : Access any single bit packed entry with zero decompression
    • Variable byte
      • Scalar "Variable Byte" faster and more efficient than ANY other implementation
      • SIMD TurboByte fastest group varint (16+32 bits) incl. integrated delta,zigzag,xor,...
      • TurboBitByte novel hybrid scheme combining the fastest SIMD codecs TurboByte+TurboPack. Compress considerably better and can be 3 times faster than streamvbyte
    • Simple family
      • Novel "Variable Simple" (incl. RLE) faster and more efficient than simple16, simple-8b
    • Elias fano
      • Fastest "Elias Fano" implementation w/ or w/o SIMD/AVX2
    • TurboVLC novel variable length encoding for large integers with exponent + variable bit mantissa
    • Binary interpolative coding : fastest implementation
    • Transform
      • Scalar & SIMD Transform: Delta, Zigzag, Zigzag of delta, XOR,
      • Transpose/Shuffle with integrated Xor and zigzag delta
      • 2D/3D/4D transpose
      • lossy floating point compression with TurboPFor or TurboTranspose+lz77/bwt
    • IC Codecs transpose/rle + general purpose compression with lz4,zstd,turborc (range coder),bwt...
    • Floating Point Compression
      • Delta/Zigzag + improved gorilla style + (Differential) Finite Context Method FCM/DFCM floating point compression
      • Using TurboPFor, unsurpassed compression and more than 8 GB/s throughput
      • Point wise relative error bound lossy floating point compression
      • TurboFloat novel efficient floating point compression using TurboPFor
      • TurboFloat LzXor novel floating point lempel-ziv compression
      • _Float16 16 bits floating point support
      • float 16/32/64 bits quantization with variable quantization bit size.
    • Time Series Compression
      • Fastest Gorilla 16/32/64 bits style compression (zigzag of delta + RLE).
      • can compress timestamps to only 0.01%. Speed > 10 GB/s compression and > 13 GB/s decompress.
    • Inverted Index ...do less, go fast!
      • Direct Access to compressed frequency and position data w/ zero decompression
      • Novel "Intersection w/ skip intervals", decompress the minimum necessary blocks (~10-15%)!.
      • Novel Implicit skips with zero extra overhead
      • Novel Efficient Bidirectional Inverted Index Architecture (forward/backwards traversal) incl. "integer compression".
      • more than 2000! queries per second on GOV2 dataset (25 millions documents) on a SINGLE core
      • :sparkles: Revolutionary Parallel Query Processing on Multicores > 7000!!! queries/sec on a simple quad core PC. ...forget Map Reduce, Hadoop, multi-node clusters, ...

    Promo video

    Integer Compression Benchmark (single thread):

    - Synthetic data:
    • Generate and test (zipfian) skewed distribution (100.000.000 integers, Block size=128/256) Note: Unlike general purpose compression, a small fixed size (ex. 128 integers) is in general used in "integer compression". Large blocks involved, while processing queries (inverted index, search engines, databases, graphs, in memory computing,...) need to be entirely decoded.

       ./icapp -a1.5 -m0 -M255 -n100M ZIPF
      
    C Sizeratio%Bits/IntegerC MB/sD MB/sName 2019.11
    62,939,88615.75.04236910950TurboPFor256
    63,392,75915.85.0713597803TurboPFor128
    63,392,80115.85.071328924TurboPForDA
    65,060,50416.35.20602748FP_SIMDOptPFor
    65,359,91616.35.23322436PC_OptPFD
    73,477,08818.45.884082484PC_Simple16
    73,481,09618.45.886248748FP_SimdFastPFor 64Ki *
    76,345,13619.16.1110722878VSimple
    91,947,53323.07.3628411737QMX 64k *
    93,285,86423.37.46156810232FP_GroupSimple 64Ki *
    95,915,09624.07.678483832Simple-8b
    99,910,93025.07.991729812408TurboByte+TurboPack
    99,910,93025.07.991735712363TurboPackV sse
    99,910,93025.07.991169410138TurboPack scalar
    99,910,93025.07.9984208876TurboFor
    100,332,92925.18.031707711170TurboPack256V avx2
    101,015,65025.38.081119110333TurboVByte
    102,074,66325.58.1766899524MaskedVByte
    102,074,66325.58.1722604208PC_Vbyte
    102,083,03625.58.1752004268FP_VByte
    112,500,00028.19.00152812140VarintG8IU
    125,000,00031.210.001303912366TurboByte
    125,000,00031.210.001119711984StreamVbyte 2019
    400,000,000100.0032.0089608948Copy
    N/AN/AEliasFano

    (*) codecs inefficient for small block sizes are tested with 64Ki integers/block.

    • MB/s: 1.000.000 bytes/second. 1000 MB/s = 1 GB/s
    • #BOLD = pareto frontier.
    • FP=FastPFor SC:simdcomp PC:Polycom
    • TurboPForDA,TurboForDA: Direct Access is normally used when accessing few individual values.
    • Eliasfano can be directly used only for increasing sequences

    - Data files:

    Speed/Ratio

    SizeRatio %Bits/IntegerC Time MB/sD Time MB/sFunction 2019.11
    3,321,663,89313.94.4413206088TurboPFor
    3,339,730,55714.04.47322144PC.OptPFD
    3,350,717,95914.04.4815367128TurboPFor256
    3,501,671,31414.64.68562840VSimple
    3,768,146,46715.85.0432283652EliasFanoV
    3,822,161,88516.05.115722444PC_Simple16
    4,411,714,93618.45.90930410444TurboByte+TurboPack
    4,521,326,51818.96.058363296Simple-8b
    4,649,671,42719.46.2230843848TurboVbyte
    4,955,740,04520.76.63706410268TurboPackV
    4,955,740,04520.76.6357248020TurboPack
    5,205,324,76021.86.9669529488SC_SIMDPack128
    5,393,769,50322.57.211446611902TurboPackV256
    6,221,886,39026.08.3266686952TurboFor
    6,221,886,39026.08.3266442260TurboForDA
    6,699,519,00028.08.9618881980FP_Vbyte
    6,700,989,56328.08.9627403384MaskedVByte
    7,622,896,87831.910.208364792VarintG8IU
    8,060,125,03533.711.5084569476Streamvbyte 2019
    8,594,342,21635.911.5052286376libfor
    23,918,861,764100.032.0058245924Copy

    Block size: 64Ki = 256k bytes. Ki=1024 Integers

    SizeRatio %Bits/IntegerC Time MB/sD Time MB/sFunction
    3,164,940,56213.24.2313446004TurboPFor 64Ki
    3,273,213,46413.74.3814967008TurboPFor256 64Ki
    3,965,982,95416.65.3015202452lz4+DT 64Ki
    4,234,154,42717.75.664365672qmx 64Ki
    6,074,995,11725.48.1319762916blosc_lz4 64Ki
    8,773,150,64436.711.7425485204blosc_lz 64Ki

    "lz4+DT 64Ki" = Delta+Transpose from TurboPFor + lz4 "blosc_lz4" internal lz4 compressor+vectorized shuffle

    - Time Series:
    FunctionC MB/ssizeratio%D MB/sText
    bvzenc321063245,9090.00812823ZigZag
    bvzzenc32891456,7130.01013499ZigZag Delta of delta
    vsenc3212294140,4000.02412877Variable Simple
    p4nzenc256v321932596,0180.1013326TurboPFor256 ZigZag
    p4ndenc256v321961596,0180.1013339TurboPFor256 Delta
    bitndpack256v3212564909,1890.1613505TurboPackV256 Delta
    p4nzenc3218101,159,6330.208502TurboPFor ZigZag
    p4nzenc128v3217951,159,6330.2013338TurboPFor ZigZag
    bitnzpack256v3296511,254,7570.2213503TurboPackV256 ZigZag
    bitnzpack128v32101551,472,8040.2613380TurboPackV ZigZag
    vbddenc32619818,057,2963.1310982TurboVByte Delta of delta
    memcpy13397577,141,992100.00
    - Transpose/Shuffle (no compression)
        ./icapp -e117,118,119 ZIPF
    
    SizeC Time MB/sD Time MB/sFunction
    100,000,00094009132TPbyte 4 TurboPFor Byte Transpose/shuffle AVX2
    100,000,00087848860TPbyte 4 TurboPFor Byte Transpose/shuffle SSE
    100,000,00076887656Blosc_Shuffle AVX2
    100,000,00052047460TPnibble 4 TurboPFor Nibble Transpose/shuffle SSE
    100,000,00066206284Blosc shuffle SSE
    100,000,00031563372Bitshuffle AVX2
    100,000,00021002176Bitshuffle SSE
    - (Lossy) Floating point compression:
        ./icapp -Fd file          " 64 bits floating point raw file
        ./icapp -Ff file          " 32 bits floating point raw file
        ./icapp -Fcf file         " text file with miltiple entries (ex.  8.657,56.8,4.5 ...)
        ./icapp -Ftf file         " text file (1 entry per line)
        ./icapp -Ftf file -v5     " + display the first entries read
        ./icapp -Ftf file.csv -K3 " but 3th column in a csv file (ex. number,Text,456.5 -> 456.5
        ./icapp -Ftf file -g.001  " lossy compression with allowed pointwise relative error 0.001
    
    - Compressed Inverted Index Intersections with GOV2

    GOV2: 426GB, 25 Millions documents, average doc. size=18k.

    • Aol query log: 18.000 queries ~1300 queries per second (single core) ~5000 queries per second (quad core) Ratio = 14.37% Decoded/Total Integers.

    • TREC Million Query Track (1MQT): ~1100 queries per second (Single core) ~4500 queries per second (Quad core CPU) Ratio = 11.59% Decoded/Total Integers.

    • Benchmarking intersections (Single core, AOL query log)
    max.docid/qTime sq/sms/q% docid found
    1.0007.882283.10.43881
    10.00010.541708.50.58584
    ALL13.961289.00.776100
    q/s: queries/second, ms/q:milliseconds/query
    • Benchmarking Parallel Query Processing (Quad core, AOL query log)
    max.docid/qTime sq/sms/q% docids found
    1.0002.666772.60.14881
    10.0003.395307.50.18884
    ALL3.575036.50.199100
    Notes:
    • Search engines are spending 90% of the time in intersections when processing queries.
    • Most search engines are using pruning strategies, caching popular queries,... to reduce the time for intersections and query processing.
    • "integer compression" GOV2 experiments On Inverted Index Compression for Search Engine Efficiency using 8-core Xeon PC are reporting 1.2 seconds per query (for 1.000 Top-k docids).

    Compile:

        Download or clone TurboPFor
    	git clone https://github.com/powturbo/TurboPFor-Integer-Compression.git
    	cd TurboPFor-Integer-Compression
    	make
    
        To benchmark TurboPFor + general purpose compression codecs (zstd,lz4, Turbo-Range-Coder, bwt, bitshuffle):
        git clone --recursive https://github.com/powturbo/TurboPFor-Integer-Compression.git
    	cd TurboPFor-Integer-Compression
        make ICCODEC=1
    
        To benchmark external libraries:
    	Download the external libraries from github into the current directory
    	Activate/deactivate the ext. libs in the makefile
        make CODEC1=1 CODEC2=1 ICCODEC=1
    
    Windows visual c++
    	nmake /f makefile.vs
    
    Windows visual studio c++
        project files under vs/vs2022
    

    Testing:

    - Synthetic data (use ZIPF parameter):
    • benchmark groups of "integer compression" functions

      ./icapp -a1.2 -m0 -M255 -n100M ZIPF
      ./icapp -a1.2 -m0 -M255 -n100M ZIPF -e20-50
      

    -zipfian distribution alpha = 1.2 (Ex. -a1.0=uniform -a1.5=skewed distribution) -number of integers = 100.000.000 -integer range from 0 to 255

    • Unsorted lists: individual function test

      ./icapp -a1.5 -m0 -M255 -e1,2,3 ZIPF
      
    • Unsorted lists: Zigzag encoding

       ./icapp -e10,11,12 ZIPF
      
    • Sorted lists: differential coding (increasing/strictly increasing)

      ./icapp -e4,5,6 ZIPF
      ./icapp -e7,8,9 ZIPF
      
    • Transpose/RLE/TurboVByte + General purpose compressor (lz,zstd,turborc,bwt...)

      ./icapp file -e80-95
      ./icapp file -e80-95 -Ezstd,15
      ./icapp file -e80-95 -Eturborc,1
      ./icapp file -e80-95 -Eturborc,20
      
    • 2D/3D/4D Transpose + General purpose compressor (lz,zstd,turborc,...)

      ./icapp file512x128.f32 R512x128 -Ff
      ./icapp file512x128.f32 -R512x128 -Ff -e100,101,102
      ./icapp file1024x512x128.f32 -R1024x512x128 -Ff -e100,101,102
      

      Automatic dimension determination from file name ( option -R0 )

      ./icapp file1024x512x128.f32 -R0 -Ff -e103,104,105
      ./icapp file1024x512x128.f64 -R0 -Fl -e103,104,105
      
    • Lossy floating point compression

      ./icapp file512x128.f32 -R512x128 -Ff -g.0001
      ./icapp file.f32 -Ff -g.001
      ./icapp file.f64 -Fd -g.001
      
    - Data files:
    • Raw 32 bits binary data file Test data

      ./icapp file
      ./icapp -Fs file         "16 bits raw binary file
      ./icapp -Fu file         "32 bits raw binary file
      ./icapp -Fl file         "64 bits raw binary file
      ./icapp -Ff file         "32 bits raw floating point binary file
      ./icapp -Fd file         "64 bits raw floating point binary file
      
    • Text file: 1 entry per line. Test data: ts.txt(sorted) and lat.txt(unsorted))

      ./icapp -Fts data.txt            "text file, one 16 bits integer per line
      ./icapp -Ftu ts.txt              "text file, one 32 bits integer per line
      ./icapp -Ftl ts.txt              "text file, one 64 bits integer per line
      ./icapp -Ftf file                "text file, one 32 bits floating point (ex. 8.32456) per line
      ./icapp -Ftd file                "text file, one 64 bits floating point (ex. 8.324567789) per line
      ./icapp -Ftd file -v5            "like prev., display the first 100 values read
      ./icapp -Ftd file -v5 -g.00001   "like prev., error bound lossy floating point compression
      ./icapp -Ftt file                "text file, timestamp in seconds iso-8601 -> 32 bits integer (ex. 2018-03-12T04:31:06)
      ./icapp -FtT file                "text file, timestamp in milliseconds iso-8601 -> 64 bits integer (ex. 2018-03-12T04:31:06.345)
      ./icapp -Ftl -D2 -H file         "skip 1th line, convert numbers with 2 decimal digits to 64 bits integers (ex. 456.23 -> 45623)
      ./icapp -Ftl -D2 -H -K3 file.csv  "like prev., use the 3th number in the line (ex. label=3245, text=99 usage=456.23 -> 456.23 )
      ./icapp -Ftl -D2 -H -K3 -k| file.csv "like prev., use '|' as separator
      
    • Text file: multiple numbers separated by non-digits (0..9,-,.) characters (ex. 134534,-45678,98788,4345, )

      ./icapp -Fc data.txt         "text file, 32 bits integers (ex. 56789,3245,23,678 )
      ./icapp -Fcd data.txt        "text file, 64 bits floting-point numbers (ex. 34.7689,5.20,45.789 )
      
    - Intersections:

    1 - Download Gov2 (or ClueWeb09) + query files (Ex. "1mq.txt") from DocId data set 8GB RAM required (16GB recommended for benchmarking "clueweb09" files).

    2 - Create index file

        ./idxcr gov2.sorted .
    

    create inverted index file "gov2.sorted.i" in the current directory

    3 - Test intersections

        ./idxqry gov2.sorted.i 1mq.txt
    

    run queries in file "1mq.txt" over the index of gov2 file

    - Parallel Query Processing:

    1 - Create partitions

        ./idxseg gov2.sorted . -26m -s8
    

    create 8 (CPU hardware threads) partitions for a total of ~26 millions document ids

    2 - Create index file for each partition

      ./idxcr gov2.sorted.s*
    

    create inverted index file for all partitions "gov2.sorted.s00 - gov2.sorted.s07" in the current directory

    3 - Intersections:

    delete "idxqry.o" file and then type "make para" to compile "idxqry" w. multithreading

      ./idxqry gov2.sorted.s*.i 1mq.txt
    

    run queries in file "1mq.txt" over the index of all gov2 partitions "gov2.sorted.s00.i - gov2.sorted.s07.i".

    Function usage:

    See benchmark "icapp" program for "integer compression" usage examples. In general encoding/decoding functions are of the form:

    char *endptr = encode( unsigned *in, unsigned n, char *out, [unsigned start], [int b]) endptr : set by encode to the next character in "out" after the encoded buffer in : input integer array n : number of elements out : pointer to output buffer b : number of bits. Only for bit packing functions start : previous value. Only for integrated delta encoding functions

    char *endptr = decode( char *in, unsigned n, unsigned *out, [unsigned start], [int b]) endptr : set by decode to the next character in "in" after the decoded buffer in : pointer to input buffer n : number of elements out : output integer array b : number of bits. Only for bit unpacking functions start : previous value. Only for integrated delta decoding functions

    Simple high level functions:

    size_t compressed_size = encode( unsigned *in, size_t n, char *out) compressed_size : number of bytes written into compressed output buffer out

    size_t compressed_size = decode( char *in, size_t n, unsigned *out) compressed_size : number of bytes read from compressed input buffer in

    Function syntax:

    • {vb | p4 | bit | vs | v8 | bic }[n][d | d1 | f | fm | z ]{enc/dec | pack/unpack}[| 128v | 256v][8 | 16 | 32 | 64]: vb: variable byte p4: turbopfor vs: variable simple v8: TurboByte SIMD + Hybrid TurboByte + TurboPack bit: bit packing fp: Floating Point + Turbo Razor: pointwise relative error rounding algorithm

      n : high level array functions for large arrays.

      '' : encoding for unsorted integer lists 'd' : delta encoding for increasing integer lists (sorted w/ duplicate) 'd1': delta encoding for strictly increasing integer lists (sorted unique) 'f' : FOR encoding for sorted integer lists 'z' : ZigZag encoding for unsorted integer lists

      'enc' or 'pack' : encode or bitpack 'dec' or 'unpack': decode or bitunpack 'NN' : integer size (8/16/32/64)

    public header file to use with documentation: include/ic.h

    Note: Some low level functions (like p4enc32) are limited to 128/256 (SSE/AVX2) integers per call.

    Environment:

    OS/Compiler (64 bits):
    • Windows: MinGW-w64 makefile
    • Windows: Visual c++ (>=VS2008) - makefile.vs (for nmake)
    • Windows: Visual Studio project file - vs/vs2022
    • Linux amd64: GNU GCC (>=4.6)
    • Linux amd64: Clang (>=3.2)
    • Linux arm64: 64 bits aarch64 ARMv8: gcc (>=6.3)
    • Linux arm64: 64 bits aarch64 ARMv8: clang
    • MaxOS: XCode (>=9)
    • MaxOS: Apple M1 (Clang)
    • PowerPC ppc64le (incl. SIMD): gcc (>=8.0)
    Multithreading:
    • All TurboPFor integer compression functions are thread safe
    Knowns issues
    • Actually (2023.04) there are no known issues or bugs
    • The TurboPFor functions can work with arbitrary inputs
    • TurboPFor does normally not read outside the input (encode/decode) buffers and does not write outside the output buffer at decoding.
    • TurboPFor does not write above a properly sized output buffers at encoding. Use the bound (ex. v8bound,p4bound) functions to allocate a max. memory output buffer.

    LICENSE

    • GPL 2.0
    • A commercial license is available. Contact us at powturbo [AT] gmail.com for more information.

    References:

    Last update: 12 APR 2026