whispercpp 1.3.6 → 1.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.document +3 -0
- data/.rdoc_options +2 -0
- data/README.md +43 -9
- data/Rakefile +18 -3
- data/ext/dependencies.rb +10 -4
- data/ext/dependencies_for_windows.rb +17 -0
- data/ext/extconf.rb +20 -8
- data/ext/options.rb +54 -14
- data/ext/options_for_windows.rb +51 -0
- data/ext/ruby_whisper.c +35 -42
- data/ext/ruby_whisper.h +141 -0
- data/ext/ruby_whisper_context.c +157 -29
- data/ext/ruby_whisper_log_queue.c +180 -0
- data/ext/ruby_whisper_log_settable.h +46 -0
- data/ext/ruby_whisper_parakeet.c +49 -0
- data/ext/ruby_whisper_parakeet_context.c +304 -0
- data/ext/ruby_whisper_parakeet_context_params.c +117 -0
- data/ext/ruby_whisper_parakeet_model.c +84 -0
- data/ext/ruby_whisper_parakeet_params.c +548 -0
- data/ext/ruby_whisper_parakeet_segment.c +157 -0
- data/ext/ruby_whisper_parakeet_token.c +188 -0
- data/ext/ruby_whisper_parakeet_transcribe.cpp +58 -0
- data/ext/ruby_whisper_params.c +265 -73
- data/ext/ruby_whisper_segment.c +6 -6
- data/ext/ruby_whisper_transcribe.cpp +23 -15
- data/ext/ruby_whisper_vad_context.c +30 -10
- data/ext/ruby_whisper_vad_context_detect.cpp +8 -9
- data/ext/ruby_whisper_vad_params.c +4 -4
- data/ext/ruby_whisper_vad_segment.c +2 -2
- data/ext/sources/CMakeLists.txt +42 -3
- data/ext/sources/CMakePresets.json +95 -0
- data/ext/sources/cmake/parakeet-config.cmake.in +30 -0
- data/ext/sources/cmake/parakeet.pc.in +10 -0
- data/ext/sources/cmake/whisper.pc.in +2 -2
- data/ext/sources/examples/CMakeLists.txt +4 -2
- data/ext/sources/examples/bench/bench.cpp +1 -1
- data/ext/sources/examples/cli/cli.cpp +52 -10
- data/ext/sources/examples/common-ggml.cpp +4 -0
- data/ext/sources/examples/common-whisper.cpp +139 -67
- data/ext/sources/examples/common-whisper.h +11 -0
- data/ext/sources/examples/ffmpeg-transcode.cpp +211 -341
- data/ext/sources/examples/parakeet-cli/CMakeLists.txt +8 -0
- data/ext/sources/examples/parakeet-cli/parakeet-cli.cpp +243 -0
- data/ext/sources/examples/parakeet-quantize/CMakeLists.txt +7 -0
- data/ext/sources/examples/parakeet-quantize/parakeet-quantize.cpp +230 -0
- data/ext/sources/examples/server/server.cpp +199 -163
- data/ext/sources/examples/vad-speech-segments/speech.cpp +3 -2
- data/ext/sources/ggml/CMakeLists.txt +21 -14
- data/ext/sources/ggml/cmake/FindNCCL.cmake +36 -0
- data/ext/sources/ggml/cmake/ggml-config.cmake.in +12 -2
- data/ext/sources/ggml/include/ggml-alloc.h +1 -0
- data/ext/sources/ggml/include/ggml-backend.h +72 -10
- data/ext/sources/ggml/include/ggml-cuda.h +2 -2
- data/ext/sources/ggml/include/ggml-rpc.h +3 -3
- data/ext/sources/ggml/include/ggml-sycl.h +8 -0
- data/ext/sources/ggml/include/ggml.h +103 -9
- data/ext/sources/ggml/include/gguf.h +10 -2
- data/ext/sources/ggml/src/CMakeLists.txt +30 -6
- data/ext/sources/ggml/src/ggml-alloc.c +5 -1
- data/ext/sources/ggml/src/ggml-backend-impl.h +22 -2
- data/ext/sources/ggml/src/ggml-backend-meta.cpp +2266 -0
- data/ext/sources/ggml/src/ggml-backend-reg.cpp +12 -0
- data/ext/sources/ggml/src/ggml-backend.cpp +110 -9
- data/ext/sources/ggml/src/ggml-blas/ggml-blas.cpp +4 -0
- data/ext/sources/ggml/src/ggml-cann/aclnn_ops.cpp +672 -257
- data/ext/sources/ggml/src/ggml-cann/aclnn_ops.h +71 -0
- data/ext/sources/ggml/src/ggml-cann/common.h +20 -10
- data/ext/sources/ggml/src/ggml-cann/ggml-cann.cpp +211 -30
- data/ext/sources/ggml/src/ggml-common.h +24 -2
- data/ext/sources/ggml/src/ggml-cpu/CMakeLists.txt +59 -30
- data/ext/sources/ggml/src/ggml-cpu/amx/amx.cpp +2 -0
- data/ext/sources/ggml/src/ggml-cpu/amx/mmq.cpp +21 -22
- data/ext/sources/ggml/src/ggml-cpu/arch/arm/quants.c +194 -11
- data/ext/sources/ggml/src/ggml-cpu/arch/arm/repack.cpp +65 -0
- data/ext/sources/ggml/src/ggml-cpu/arch/loongarch/quants.c +151 -1
- data/ext/sources/ggml/src/ggml-cpu/arch/powerpc/quants.c +0 -1
- data/ext/sources/ggml/src/ggml-cpu/arch/riscv/quants.c +4279 -1292
- data/ext/sources/ggml/src/ggml-cpu/arch/riscv/repack.cpp +5 -35
- data/ext/sources/ggml/src/ggml-cpu/arch/s390/quants.c +0 -1
- data/ext/sources/ggml/src/ggml-cpu/arch/wasm/quants.c +72 -1
- data/ext/sources/ggml/src/ggml-cpu/arch/x86/quants.c +319 -31
- data/ext/sources/ggml/src/ggml-cpu/arch/x86/repack.cpp +1 -1
- data/ext/sources/ggml/src/ggml-cpu/arch-fallback.h +12 -2
- data/ext/sources/ggml/src/ggml-cpu/cmake/FindSMTIME.cmake +32 -0
- data/ext/sources/ggml/src/ggml-cpu/ggml-cpu-impl.h +10 -0
- data/ext/sources/ggml/src/ggml-cpu/ggml-cpu.c +109 -5
- data/ext/sources/ggml/src/ggml-cpu/ggml-cpu.cpp +2 -0
- data/ext/sources/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp +146 -134
- data/ext/sources/ggml/src/ggml-cpu/llamafile/sgemm.cpp +107 -82
- data/ext/sources/ggml/src/ggml-cpu/ops.cpp +501 -119
- data/ext/sources/ggml/src/ggml-cpu/ops.h +3 -0
- data/ext/sources/ggml/src/ggml-cpu/quants.c +106 -0
- data/ext/sources/ggml/src/ggml-cpu/quants.h +6 -0
- data/ext/sources/ggml/src/ggml-cpu/repack.cpp +3 -0
- data/ext/sources/ggml/src/ggml-cpu/simd-gemm.h +91 -1
- data/ext/sources/ggml/src/ggml-cpu/simd-mappings.h +14 -16
- data/ext/sources/ggml/src/ggml-cpu/spacemit/ime.cpp +1402 -687
- data/ext/sources/ggml/src/ggml-cpu/spacemit/ime.h +8 -0
- data/ext/sources/ggml/src/ggml-cpu/spacemit/ime1_kernels.cpp +597 -2766
- data/ext/sources/ggml/src/ggml-cpu/spacemit/ime2_kernels.cpp +5768 -0
- data/ext/sources/ggml/src/ggml-cpu/spacemit/ime_env.cpp +320 -0
- data/ext/sources/ggml/src/ggml-cpu/spacemit/ime_env.h +55 -0
- data/ext/sources/ggml/src/ggml-cpu/spacemit/ime_kernels.h +182 -19
- data/ext/sources/ggml/src/ggml-cpu/spacemit/repack.cpp +1795 -0
- data/ext/sources/ggml/src/ggml-cpu/spacemit/repack.h +14 -0
- data/ext/sources/ggml/src/ggml-cpu/spacemit/rvv_kernels.cpp +3178 -0
- data/ext/sources/ggml/src/ggml-cpu/spacemit/rvv_kernels.h +95 -0
- data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_barrier.h +34 -0
- data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_mem_pool.cpp +760 -0
- data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_mem_pool.h +32 -0
- data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_tcm.h +409 -0
- data/ext/sources/ggml/src/ggml-cpu/vec.cpp +39 -55
- data/ext/sources/ggml/src/ggml-cpu/vec.h +225 -240
- data/ext/sources/ggml/src/ggml-cuda/CMakeLists.txt +17 -7
- data/ext/sources/ggml/src/ggml-cuda/allreduce.cu +971 -0
- data/ext/sources/ggml/src/ggml-cuda/allreduce.cuh +29 -0
- data/ext/sources/ggml/src/ggml-cuda/argsort.cu +62 -26
- data/ext/sources/ggml/src/ggml-cuda/binbcast.cu +134 -64
- data/ext/sources/ggml/src/ggml-cuda/binbcast.cuh +1 -0
- data/ext/sources/ggml/src/ggml-cuda/col2im-1d.cu +81 -0
- data/ext/sources/ggml/src/ggml-cuda/col2im-1d.cuh +3 -0
- data/ext/sources/ggml/src/ggml-cuda/common.cuh +246 -28
- data/ext/sources/ggml/src/ggml-cuda/concat.cu +134 -116
- data/ext/sources/ggml/src/ggml-cuda/conv-transpose-1d.cu +14 -12
- data/ext/sources/ggml/src/ggml-cuda/conv2d-transpose.cu +45 -21
- data/ext/sources/ggml/src/ggml-cuda/conv2d-transpose.cuh +1 -0
- data/ext/sources/ggml/src/ggml-cuda/convert.cu +139 -34
- data/ext/sources/ggml/src/ggml-cuda/convert.cuh +10 -0
- data/ext/sources/ggml/src/ggml-cuda/cpy.cu +88 -29
- data/ext/sources/ggml/src/ggml-cuda/dequantize.cuh +22 -0
- data/ext/sources/ggml/src/ggml-cuda/fattn-common.cuh +287 -49
- data/ext/sources/ggml/src/ggml-cuda/fattn-mma-f16.cuh +335 -130
- data/ext/sources/ggml/src/ggml-cuda/fattn-tile.cu +12 -0
- data/ext/sources/ggml/src/ggml-cuda/fattn-tile.cuh +127 -24
- data/ext/sources/ggml/src/ggml-cuda/fattn-vec.cuh +40 -15
- data/ext/sources/ggml/src/ggml-cuda/fattn-wmma-f16.cu +18 -9
- data/ext/sources/ggml/src/ggml-cuda/fattn.cu +169 -60
- data/ext/sources/ggml/src/ggml-cuda/fattn.cuh +2 -0
- data/ext/sources/ggml/src/ggml-cuda/fwht.cu +101 -0
- data/ext/sources/ggml/src/ggml-cuda/fwht.cuh +4 -0
- data/ext/sources/ggml/src/ggml-cuda/gated_delta_net.cu +109 -45
- data/ext/sources/ggml/src/ggml-cuda/gated_delta_net.cuh +10 -0
- data/ext/sources/ggml/src/ggml-cuda/getrows.cu +48 -23
- data/ext/sources/ggml/src/ggml-cuda/ggml-cuda.cu +2034 -2104
- data/ext/sources/ggml/src/ggml-cuda/im2col.cu +32 -29
- data/ext/sources/ggml/src/ggml-cuda/mean.cu +4 -2
- data/ext/sources/ggml/src/ggml-cuda/mma.cuh +242 -195
- data/ext/sources/ggml/src/ggml-cuda/mmf.cuh +3 -3
- data/ext/sources/ggml/src/ggml-cuda/mmq.cu +25 -12
- data/ext/sources/ggml/src/ggml-cuda/mmq.cuh +502 -423
- data/ext/sources/ggml/src/ggml-cuda/mmvf.cu +19 -12
- data/ext/sources/ggml/src/ggml-cuda/mmvq.cu +562 -97
- data/ext/sources/ggml/src/ggml-cuda/mmvq.cuh +6 -1
- data/ext/sources/ggml/src/ggml-cuda/norm.cu +36 -10
- data/ext/sources/ggml/src/ggml-cuda/out-prod.cu +66 -7
- data/ext/sources/ggml/src/ggml-cuda/quantize.cu +133 -26
- data/ext/sources/ggml/src/ggml-cuda/quantize.cuh +1 -1
- data/ext/sources/ggml/src/ggml-cuda/reduce_rows.cuh +5 -1
- data/ext/sources/ggml/src/ggml-cuda/rope.cu +11 -4
- data/ext/sources/ggml/src/ggml-cuda/scale.cu +4 -1
- data/ext/sources/ggml/src/ggml-cuda/set-rows.cu +78 -10
- data/ext/sources/ggml/src/ggml-cuda/snake.cu +72 -0
- data/ext/sources/ggml/src/ggml-cuda/snake.cuh +8 -0
- data/ext/sources/ggml/src/ggml-cuda/softcap.cu +4 -1
- data/ext/sources/ggml/src/ggml-cuda/ssm-conv.cu +45 -13
- data/ext/sources/ggml/src/ggml-cuda/ssm-conv.cuh +1 -1
- data/ext/sources/ggml/src/ggml-cuda/ssm-scan.cu +40 -18
- data/ext/sources/ggml/src/ggml-cuda/sumrows.cu +8 -4
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_16.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_32.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_8.cu +2 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_2.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_4.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_16.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_32.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_4.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_8.cu +2 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_32-ncols2_2.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_16.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_2.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_4.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_8.cu +2 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_2.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_4.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_8.cu +2 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq192-dv128.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq320-dv256.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq512-dv512.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-bf16.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-f16.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q4_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q4_1.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q5_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q5_1.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q8_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-bf16.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-bf16.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-bf16.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-bf16.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-bf16.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-bf16.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmq-instance-nvfp4.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmq-instance-q1_0.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/top-k.cu +5 -4
- data/ext/sources/ggml/src/ggml-cuda/topk-moe.cu +33 -24
- data/ext/sources/ggml/src/ggml-cuda/unary.cu +31 -2
- data/ext/sources/ggml/src/ggml-cuda/unary.cuh +2 -0
- data/ext/sources/ggml/src/ggml-cuda/vecdotq.cuh +80 -0
- data/ext/sources/ggml/src/ggml-cuda/vendors/cuda.h +7 -2
- data/ext/sources/ggml/src/ggml-cuda/vendors/hip.h +23 -4
- data/ext/sources/ggml/src/ggml-cuda/vendors/musa.h +4 -0
- data/ext/sources/ggml/src/ggml-hexagon/CMakeLists.txt +1 -5
- data/ext/sources/ggml/src/ggml-hexagon/ggml-hexagon.cpp +2788 -1762
- data/ext/sources/ggml/src/ggml-hexagon/htp/CMakeLists.txt +13 -4
- data/ext/sources/ggml/src/ggml-hexagon/htp/act-ops.c +53 -84
- data/ext/sources/ggml/src/ggml-hexagon/htp/argsort-ops.c +25 -12
- data/ext/sources/ggml/src/ggml-hexagon/htp/binary-ops.c +165 -184
- data/ext/sources/ggml/src/ggml-hexagon/htp/cmake-toolchain.cmake +17 -19
- data/ext/sources/ggml/src/ggml-hexagon/htp/concat-ops.c +277 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/cpy-ops.c +170 -127
- data/ext/sources/ggml/src/ggml-hexagon/htp/cumsum-ops.c +270 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/diag-ops.c +216 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/fill-ops.c +123 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/flash-attn-ops.c +1774 -396
- data/ext/sources/ggml/src/ggml-hexagon/htp/flash-attn-ops.h +303 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/gated-delta-net-ops.c +1148 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/get-rows-ops.c +148 -42
- data/ext/sources/ggml/src/ggml-hexagon/htp/hex-common.h +80 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hex-dma.c +2 -2
- data/ext/sources/ggml/src/ggml-hexagon/htp/hex-dma.h +255 -62
- data/ext/sources/ggml/src/ggml-hexagon/htp/hex-dump.h +9 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hex-profile.h +64 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hex-utils.h +25 -21
- data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-fa-kernels.h +555 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-mm-kernels-tiled.h +1303 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-queue.c +167 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-queue.h +157 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-utils.h +222 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/htp-ctx.h +104 -13
- data/ext/sources/ggml/src/ggml-hexagon/htp/htp-ops.h +222 -57
- data/ext/sources/ggml/src/ggml-hexagon/htp/htp-vtcm.h +19 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/htp_iface.idl +10 -3
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-base.h +78 -26
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-copy.h +27 -10
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-div.h +63 -23
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-exp.h +48 -8
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-fa-kernels.h +232 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-flash-attn.h +47 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-log.h +65 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-mm-kernels-flat.h +1511 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-mm-kernels-tiled.h +1200 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-pow.h +42 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-repl.h +74 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-sigmoid.h +40 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-sin-cos.h +90 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-utils.h +5 -8
- data/ext/sources/ggml/src/ggml-hexagon/htp/main.c +625 -816
- data/ext/sources/ggml/src/ggml-hexagon/htp/matmul-ops.c +3052 -2166
- data/ext/sources/ggml/src/ggml-hexagon/htp/matmul-ops.h +650 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/pad-ops.c +547 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/repeat-ops.c +148 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/rope-ops.c +337 -106
- data/ext/sources/ggml/src/ggml-hexagon/htp/set-rows-ops.c +59 -37
- data/ext/sources/ggml/src/ggml-hexagon/htp/softmax-ops.c +121 -133
- data/ext/sources/ggml/src/ggml-hexagon/htp/solve-tri-ops.c +267 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/ssm-conv.c +245 -151
- data/ext/sources/ggml/src/ggml-hexagon/htp/sum-rows-ops.c +6 -6
- data/ext/sources/ggml/src/ggml-hexagon/htp/unary-ops.c +719 -45
- data/ext/sources/ggml/src/ggml-hexagon/htp/worker-pool.c +15 -3
- data/ext/sources/ggml/src/ggml-hexagon/htp/worker-pool.h +8 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp-opnode.h +390 -0
- data/ext/sources/ggml/src/ggml-hexagon/libggml-htp.inf +3 -5
- data/ext/sources/ggml/src/ggml-hip/CMakeLists.txt +27 -9
- data/ext/sources/ggml/src/ggml-impl.h +6 -1
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.cpp +207 -18
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.h +36 -2
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.m +186 -29
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-impl.h +118 -0
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.cpp +322 -21
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.h +4 -0
- data/ext/sources/ggml/src/ggml-metal/ggml-metal.cpp +39 -26
- data/ext/sources/ggml/src/ggml-metal/ggml-metal.metal +1226 -467
- data/ext/sources/ggml/src/ggml-musa/CMakeLists.txt +5 -6
- data/ext/sources/ggml/src/ggml-opencl/CMakeLists.txt +67 -5
- data/ext/sources/ggml/src/ggml-opencl/fa_tune.h +92 -0
- data/ext/sources/ggml/src/ggml-opencl/ggml-opencl.cpp +16290 -6246
- data/ext/sources/ggml/src/ggml-opencl/kernels/concat.cl +67 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/cpy.cl +59 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/cvt.cl +1997 -92
- data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f16.cl +81 -41
- data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32.cl +88 -39
- data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_f16.cl +1995 -96
- data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_q4_0.cl +1615 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_q8_0.cl +1486 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_pre_f16.cl +156 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gated_delta_net.cl +249 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_mxfp4_f32_ns.cl +374 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_0_f32_ns.cl +324 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_1_f32_ns.cl +326 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_k_f32_ns.cl +348 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_0_f32_ns.cl +328 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_1_f32_ns.cl +330 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_k_f32_ns.cl +356 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q6_k_f32_ns.cl +335 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_iq4_nl_f32.cl +150 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q1_0_f32.cl +94 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/{mul_mat_Ab_Bi_8x4.cl → gemm_noshuffle_q4_0_f32.cl} +1 -1
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q4_k_f32.cl +172 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q5_0_f32.cl +131 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q5_1_f32.cl +134 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q5_k_f32.cl +176 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q6_k_f32.cl +140 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/{mul_mm_q8_0_f32_8x4.cl → gemm_noshuffle_q8_0_f32.cl} +1 -1
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_xmem_f16_f32_os8.cl +233 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_mxfp4_f32_ns.cl +165 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q4_0_f32_ns.cl +120 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q4_1_f32_ns.cl +123 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q4_k_f32_ns.cl +155 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q5_0_f32_ns.cl +123 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q5_1_f32_ns.cl +125 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q5_k_f32_ns.cl +160 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q6_k_f32_ns.cl +141 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_iq4_nl_f32.cl +302 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q1_0_f32.cl +121 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/{gemv_noshuffle_general.cl → gemv_noshuffle_q4_0_f32.cl} +5 -5
- data/ext/sources/ggml/src/ggml-opencl/kernels/{gemv_noshuffle.cl → gemv_noshuffle_q4_0_f32_spec.cl} +5 -5
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q4_k_f32.cl +318 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q5_0_f32.cl +291 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q5_1_f32.cl +294 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q5_k_f32.cl +326 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q6_k_f32.cl +293 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/{gemv_noshuffle_general_q8_0_f32.cl → gemv_noshuffle_q8_0_f32.cl} +1 -1
- data/ext/sources/ggml/src/ggml-opencl/kernels/get_rows.cl +15 -9
- data/ext/sources/ggml/src/ggml-opencl/kernels/moe_reorder_b.cl +30 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/moe_sort_by_expert.cl +82 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_iq4_nl_f32_l4_lm.cl +171 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q1_0_f32_l4_lm.cl +156 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q4_k_f32_l4_lm.cl +179 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q5_0_f32_l4_lm.cl +173 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q5_1_f32_l4_lm.cl +175 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q5_k_f32_l4_lm.cl +192 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_f16_f32_l4.cl +1149 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_iq4_nl_f32.cl +164 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_iq4_nl_f32_flat.cl +202 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q1_0_f32.cl +141 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q1_0_f32_flat.cl +190 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q4_k_f32_flat.cl +196 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_0_f32.cl +241 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_0_f32_flat.cl +243 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_1_f32.cl +243 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_1_f32_flat.cl +247 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_k_f32.cl +187 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_k_f32_flat.cl +203 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q6_k_f32_flat.cl +48 -64
- data/ext/sources/ggml/src/ggml-opencl/kernels/norm.cl +5 -2
- data/ext/sources/ggml/src/ggml-opencl/kernels/set_rows.cl +500 -0
- data/ext/sources/ggml/src/ggml-opencl/libdl.h +79 -0
- data/ext/sources/ggml/src/ggml-openvino/.clang-format +0 -5
- data/ext/sources/ggml/src/ggml-openvino/CMakeLists.txt +2 -4
- data/ext/sources/ggml/src/ggml-openvino/ggml-decoder.cpp +740 -127
- data/ext/sources/ggml/src/ggml-openvino/ggml-decoder.h +76 -23
- data/ext/sources/ggml/src/ggml-openvino/ggml-openvino-extra.cpp +75 -14
- data/ext/sources/ggml/src/ggml-openvino/ggml-openvino-extra.h +29 -8
- data/ext/sources/ggml/src/ggml-openvino/ggml-openvino.cpp +339 -69
- data/ext/sources/ggml/src/ggml-openvino/ggml-quants.cpp +330 -192
- data/ext/sources/ggml/src/ggml-openvino/ggml-quants.h +10 -4
- data/ext/sources/ggml/src/ggml-openvino/openvino/decoder.h +56 -16
- data/ext/sources/ggml/src/ggml-openvino/openvino/frontend.h +1 -1
- data/ext/sources/ggml/src/ggml-openvino/openvino/input_model.h +4 -4
- data/ext/sources/ggml/src/ggml-openvino/openvino/node_context.h +94 -37
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/add_id.cpp +76 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/argsort.cpp +47 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/clamp.cpp +33 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/concat.cpp +48 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/cont.cpp +8 -16
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/cpy.cpp +14 -1
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/div.cpp +146 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/flash_attn_ext.cpp +108 -21
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/gated_delta_net.cpp +282 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/gated_delta_net.hpp +65 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/get_rows.cpp +2 -9
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/glu_geglu.cpp +21 -7
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/glu_swiglu.cpp +41 -8
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/im2col.cpp +120 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/l2_norm.cpp +44 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/mul_mat_id.cpp +226 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/mulmat.cpp +19 -9
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/norm.cpp +58 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/pad.cpp +95 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/permute.cpp +58 -13
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/repeat.cpp +74 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/reshape.cpp +13 -6
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/rms_norm.cpp +1 -1
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/rope.cpp +161 -39
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/set_rows.cpp +3 -3
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/softmax.cpp +126 -49
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/ssm_conv.cpp +59 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/sum_rows.cpp +27 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/transpose.cpp +32 -1
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_silu.cpp +1 -1
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_softplus.cpp +38 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/view.cpp +90 -25
- data/ext/sources/ggml/src/ggml-openvino/openvino/op_table.cpp +41 -22
- data/ext/sources/ggml/src/ggml-openvino/openvino/op_table.h +18 -4
- data/ext/sources/ggml/src/ggml-openvino/openvino/pass/mark_decompression_convert_constant_folding.h +1 -1
- data/ext/sources/ggml/src/ggml-openvino/openvino/rt_info/weightless_caching_attributes.hpp +41 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/translate_session.cpp +70 -43
- data/ext/sources/ggml/src/ggml-openvino/openvino/translate_session.h +5 -4
- data/ext/sources/ggml/src/ggml-openvino/openvino/utils.cpp +612 -36
- data/ext/sources/ggml/src/ggml-openvino/openvino/utils.h +29 -26
- data/ext/sources/ggml/src/ggml-openvino/utils.cpp +460 -114
- data/ext/sources/ggml/src/ggml-openvino/utils.h +32 -9
- data/ext/sources/ggml/src/ggml-opt.cpp +1 -0
- data/ext/sources/ggml/src/ggml-quants.c +365 -114
- data/ext/sources/ggml/src/ggml-quants.h +6 -0
- data/ext/sources/ggml/src/ggml-rpc/CMakeLists.txt +24 -0
- data/ext/sources/ggml/src/ggml-rpc/ggml-rpc.cpp +167 -311
- data/ext/sources/ggml/src/ggml-rpc/transport.cpp +683 -0
- data/ext/sources/ggml/src/ggml-rpc/transport.h +34 -0
- data/ext/sources/ggml/src/ggml-sycl/CMakeLists.txt +50 -4
- data/ext/sources/ggml/src/ggml-sycl/add-id.cpp +1 -1
- data/ext/sources/ggml/src/ggml-sycl/backend.hpp +5 -1
- data/ext/sources/ggml/src/ggml-sycl/binbcast.cpp +12 -0
- data/ext/sources/ggml/src/ggml-sycl/col2im-1d.cpp +102 -0
- data/ext/sources/ggml/src/ggml-sycl/col2im-1d.hpp +8 -0
- data/ext/sources/ggml/src/ggml-sycl/common.cpp +72 -2
- data/ext/sources/ggml/src/ggml-sycl/common.hpp +59 -2
- data/ext/sources/ggml/src/ggml-sycl/concat.cpp +21 -1
- data/ext/sources/ggml/src/ggml-sycl/conv2d-dw.cpp +158 -0
- data/ext/sources/ggml/src/ggml-sycl/conv2d-dw.hpp +10 -0
- data/ext/sources/ggml/src/ggml-sycl/conv2d-transpose.cpp +125 -0
- data/ext/sources/ggml/src/ggml-sycl/conv2d-transpose.hpp +10 -0
- data/ext/sources/ggml/src/ggml-sycl/conv2d.cpp +150 -0
- data/ext/sources/ggml/src/ggml-sycl/conv2d.hpp +10 -0
- data/ext/sources/ggml/src/ggml-sycl/conv3d.cpp +224 -0
- data/ext/sources/ggml/src/ggml-sycl/conv3d.hpp +8 -0
- data/ext/sources/ggml/src/ggml-sycl/convert.cpp +121 -13
- data/ext/sources/ggml/src/ggml-sycl/convert.hpp +9 -0
- data/ext/sources/ggml/src/ggml-sycl/cpy.cpp +706 -0
- data/ext/sources/ggml/src/ggml-sycl/cpy.hpp +281 -0
- data/ext/sources/ggml/src/ggml-sycl/cross_entropy_loss.cpp +255 -0
- data/ext/sources/ggml/src/ggml-sycl/cross_entropy_loss.hpp +7 -0
- data/ext/sources/ggml/src/ggml-sycl/cumsum.cpp +148 -0
- data/ext/sources/ggml/src/ggml-sycl/cumsum.hpp +5 -0
- data/ext/sources/ggml/src/ggml-sycl/dequantize.hpp +678 -0
- data/ext/sources/ggml/src/ggml-sycl/diag.cpp +67 -0
- data/ext/sources/ggml/src/ggml-sycl/diag.hpp +5 -0
- data/ext/sources/ggml/src/ggml-sycl/dmmv.cpp +997 -244
- data/ext/sources/ggml/src/ggml-sycl/dpct/helper.hpp +15 -7
- data/ext/sources/ggml/src/ggml-sycl/element_wise.cpp +215 -204
- data/ext/sources/ggml/src/ggml-sycl/element_wise.hpp +2 -2
- data/ext/sources/ggml/src/ggml-sycl/fattn-buffers.cpp +56 -0
- data/ext/sources/ggml/src/ggml-sycl/fattn-buffers.hpp +63 -0
- data/ext/sources/ggml/src/ggml-sycl/fattn-common.hpp +7 -5
- data/ext/sources/ggml/src/ggml-sycl/fattn-tile.cpp +4 -0
- data/ext/sources/ggml/src/ggml-sycl/fattn-tile.hpp +76 -168
- data/ext/sources/ggml/src/ggml-sycl/fattn-vec.hpp +7 -0
- data/ext/sources/ggml/src/ggml-sycl/fattn.cpp +3 -1
- data/ext/sources/ggml/src/ggml-sycl/fill.cpp +55 -0
- data/ext/sources/ggml/src/ggml-sycl/fill.hpp +5 -0
- data/ext/sources/ggml/src/ggml-sycl/gated_delta_net.cpp +69 -31
- data/ext/sources/ggml/src/ggml-sycl/gated_delta_net.hpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/gemm.hpp +3 -0
- data/ext/sources/ggml/src/ggml-sycl/getrows.cpp +79 -3
- data/ext/sources/ggml/src/ggml-sycl/ggml-sycl.cpp +1758 -455
- data/ext/sources/ggml/src/ggml-sycl/im2col.cpp +353 -89
- data/ext/sources/ggml/src/ggml-sycl/im2col.hpp +5 -3
- data/ext/sources/ggml/src/ggml-sycl/mmvq.cpp +1542 -39
- data/ext/sources/ggml/src/ggml-sycl/mmvq.hpp +33 -0
- data/ext/sources/ggml/src/ggml-sycl/norm.cpp +103 -49
- data/ext/sources/ggml/src/ggml-sycl/outprod.cpp +45 -9
- data/ext/sources/ggml/src/ggml-sycl/pad.cpp +27 -27
- data/ext/sources/ggml/src/ggml-sycl/pool.cpp +185 -0
- data/ext/sources/ggml/src/ggml-sycl/pool.hpp +22 -0
- data/ext/sources/ggml/src/ggml-sycl/presets.hpp +3 -1
- data/ext/sources/ggml/src/ggml-sycl/quants.hpp +71 -0
- data/ext/sources/ggml/src/ggml-sycl/set_rows.cpp +17 -3
- data/ext/sources/ggml/src/ggml-sycl/softmax.cpp +9 -10
- data/ext/sources/ggml/src/ggml-sycl/solve_tri.cpp +172 -0
- data/ext/sources/ggml/src/ggml-sycl/solve_tri.hpp +8 -0
- data/ext/sources/ggml/src/ggml-sycl/ssm_conv.cpp +6 -1
- data/ext/sources/ggml/src/ggml-sycl/ssm_scan.cpp +156 -0
- data/ext/sources/ggml/src/ggml-sycl/ssm_scan.hpp +5 -0
- data/ext/sources/ggml/src/ggml-sycl/sycl_hw.cpp +62 -10
- data/ext/sources/ggml/src/ggml-sycl/sycl_hw.hpp +18 -6
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-tile-instance-dkq512-dv512.cpp +6 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-f16.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q4_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q4_1.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q5_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q5_1.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q8_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-f16.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q4_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q4_1.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q5_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q5_1.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q8_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-f16.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q4_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q4_1.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q5_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q5_1.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q8_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-f16.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q4_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q4_1.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q5_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q5_1.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q8_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-f16.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q4_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q4_1.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q5_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q5_1.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q8_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-f16.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q4_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q4_1.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q5_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q5_1.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q8_0.cpp +1 -0
- data/ext/sources/ggml/src/ggml-sycl/type.hpp +112 -0
- data/ext/sources/ggml/src/ggml-sycl/upscale.cpp +410 -0
- data/ext/sources/ggml/src/ggml-sycl/upscale.hpp +9 -0
- data/ext/sources/ggml/src/ggml-sycl/vecdotq.hpp +242 -45
- data/ext/sources/ggml/src/ggml-virtgpu/ggml-backend-buffer.cpp +4 -0
- data/ext/sources/ggml/src/ggml-virtgpu/ggml-backend-device.cpp +2 -0
- data/ext/sources/ggml/src/ggml-virtgpu/ggml-backend.cpp +2 -0
- data/ext/sources/ggml/src/ggml-virtgpu/virtgpu-shm.cpp +1 -0
- data/ext/sources/ggml/src/ggml-virtgpu/virtgpu.cpp +1 -0
- data/ext/sources/ggml/src/ggml-virtgpu/virtgpu.h +0 -2
- data/ext/sources/ggml/src/ggml-vulkan/CMakeLists.txt +16 -0
- data/ext/sources/ggml/src/ggml-vulkan/ggml-vulkan.cpp +2843 -700
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/CMakeLists.txt +4 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/col2im_1d.comp +61 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/contig_copy.comp +6 -2
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/conv2d_mm.comp +146 -13
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/conv3d_mm.comp +431 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/copy.comp +3 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/copy_from_quant.comp +1 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/copy_to_quant.comp +25 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.glsl +88 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs_cm2.glsl +643 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_nvfp4.comp +32 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q1_0.comp +29 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/diag.comp +3 -4
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dot_product_funcs.glsl +27 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/feature-tests/coopmat2_decode_vector.comp +7 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn.comp +198 -48
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_base.glsl +60 -59
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_cm1.comp +116 -113
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_cm2.comp +122 -31
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_dequant.glsl +131 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_mmq_funcs.glsl +203 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/fwht.comp +115 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gated_delta_net.comp +125 -64
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/generic_binary_head.glsl +0 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/generic_unary_head.glsl +21 -19
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/get_rows_back.comp +25 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/glu_head.glsl +29 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/glu_main.glsl +17 -11
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/im2col.comp +76 -54
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/im2col_3d.comp +0 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/l2_norm.comp +4 -7
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/log.comp +0 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec.comp +122 -27
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iface.glsl +6 -6
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q2_k.comp +1 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q4_k.comp +1 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q5_k.comp +1 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq.comp +22 -24
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq_funcs.glsl +88 -55
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp +42 -40
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_cm2.comp +49 -15
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.glsl +222 -171
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_funcs.glsl +8 -8
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_shmem_types.glsl +24 -9
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/multi_add.comp +0 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/norm.comp +10 -10
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/repeat_back.comp +3 -3
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/roll.comp +3 -3
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_funcs.glsl +5 -2
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_head.glsl +0 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_params.glsl +3 -2
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/snake.comp +49 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/ssm_conv.comp +11 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/tri.comp +3 -4
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/types.glsl +79 -2
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/unary.comp +168 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp +282 -211
- data/ext/sources/ggml/src/ggml-webgpu/CMakeLists.txt +5 -2
- data/ext/sources/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp +2209 -283
- data/ext/sources/ggml/src/ggml-webgpu/ggml-webgpu.cpp +2618 -1416
- data/ext/sources/ggml/src/ggml-webgpu/pre_wgsl.hpp +37 -7
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/add_id.wgsl +64 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl +8 -7
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl +90 -95
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/concat.wgsl +19 -1
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/conv2d.wgsl +165 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/{cpy.tmpl.wgsl → cpy.wgsl} +25 -50
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn.wgsl +107 -184
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_quant_staging.tmpl +124 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_tile.wgsl +397 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_vec_blk.wgsl +101 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_vec_reduce.wgsl +84 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_vec_split.wgsl +619 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/gated_delta_net.wgsl +149 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.wgsl +204 -78
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/glu.wgsl +155 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/im2col.wgsl +101 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_decls.tmpl +805 -526
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_id.wgsl +195 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_id_gather.wgsl +52 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_id_vec.wgsl +154 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_reg_tile.wgsl +8 -6
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_subgroup_matrix.wgsl +5 -1
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec.wgsl +90 -413
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl +1553 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q_acc.tmpl +297 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/quant_inner_loops.tmpl +21 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/quantize_q8.wgsl +178 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/rms_norm_mul.wgsl +152 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/{rope.tmpl.wgsl → rope.wgsl} +71 -142
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/row_norm.wgsl +153 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl +6 -4
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/set.wgsl +109 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/set_rows.wgsl +2 -3
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/set_rows_quant.wgsl +224 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/{soft_max.tmpl.wgsl → soft_max.wgsl} +106 -206
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/solve_tri.wgsl +121 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/ssm_conv.wgsl +65 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/ssm_scan.wgsl +193 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl +68 -48
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/upscale.wgsl +240 -0
- data/ext/sources/ggml/src/ggml-zdnn/ggml-zdnn.cpp +18 -14
- data/ext/sources/ggml/src/ggml-zendnn/CMakeLists.txt +1 -1
- data/ext/sources/ggml/src/ggml-zendnn/ggml-zendnn.cpp +244 -10
- data/ext/sources/ggml/src/ggml.c +146 -42
- data/ext/sources/ggml/src/gguf.cpp +173 -28
- data/ext/sources/include/parakeet.h +342 -0
- data/ext/sources/include/whisper.h +31 -0
- data/ext/sources/media/matmul.png +0 -0
- data/ext/sources/src/CMakeLists.txt +23 -0
- data/ext/sources/src/parakeet-arch.h +188 -0
- data/ext/sources/src/parakeet.cpp +3838 -0
- data/ext/sources/src/whisper.cpp +220 -26
- data/extsources.rb +26 -10
- data/lib/whisper/log_settable.rb +33 -0
- data/lib/whisper/model/uri.rb +13 -8
- data/lib/whisper/output.rb +74 -0
- data/sig/whisper.rbs +417 -62
- data/test/helper.rb +2 -0
- data/test/jfk_reader/jfk_reader.c +50 -7
- data/test/test_callback.rb +1 -0
- data/test/test_package.rb +6 -5
- data/test/test_parakeet.rb +28 -0
- data/test/test_parakeet_callback.rb +107 -0
- data/test/test_parakeet_context.rb +116 -0
- data/test/test_parakeet_context_params.rb +24 -0
- data/test/test_parakeet_model.rb +21 -0
- data/test/test_parakeet_params.rb +78 -0
- data/test/test_parakeet_segment.rb +42 -0
- data/test/test_parakeet_token.rb +73 -0
- data/test/test_params.rb +2 -0
- data/test/test_vad.rb +9 -0
- data/test/test_vad_context.rb +2 -2
- data/test/test_vad_segment.rb +1 -1
- data/test/test_whisper.rb +24 -6
- data/whispercpp.gemspec +2 -2
- metadata +263 -304
- data/ext/sources/bindings/javascript/CMakeLists.txt +0 -41
- data/ext/sources/bindings/javascript/emscripten.cpp +0 -93
- data/ext/sources/bindings/javascript/libwhisper.worker.js +0 -1
- data/ext/sources/bindings/javascript/package.json +0 -26
- data/ext/sources/bindings/javascript/whisper.js +0 -19
- data/ext/sources/examples/addon.node/CMakeLists.txt +0 -31
- data/ext/sources/examples/addon.node/__test__/whisper.spec.js +0 -133
- data/ext/sources/examples/addon.node/addon.cpp +0 -557
- data/ext/sources/examples/addon.node/index.js +0 -59
- data/ext/sources/examples/addon.node/package.json +0 -16
- data/ext/sources/examples/addon.node/vad-example.js +0 -132
- data/ext/sources/examples/bench.wasm/CMakeLists.txt +0 -49
- data/ext/sources/examples/bench.wasm/emscripten.cpp +0 -87
- data/ext/sources/examples/bench.wasm/index-tmpl.html +0 -285
- data/ext/sources/examples/coi-serviceworker.js +0 -146
- data/ext/sources/examples/command/CMakeLists.txt +0 -10
- data/ext/sources/examples/command/command.cpp +0 -802
- data/ext/sources/examples/command/commands.txt +0 -9
- data/ext/sources/examples/command.wasm/CMakeLists.txt +0 -50
- data/ext/sources/examples/command.wasm/emscripten.cpp +0 -327
- data/ext/sources/examples/command.wasm/index-tmpl.html +0 -415
- data/ext/sources/examples/generate-karaoke.sh +0 -57
- data/ext/sources/examples/helpers.js +0 -191
- data/ext/sources/examples/livestream.sh +0 -112
- data/ext/sources/examples/lsp/CMakeLists.txt +0 -10
- data/ext/sources/examples/lsp/lsp.cpp +0 -471
- data/ext/sources/examples/lsp/whisper.vim +0 -362
- data/ext/sources/examples/python/test_whisper_processor.py +0 -7
- data/ext/sources/examples/python/whisper_processor.py +0 -54
- data/ext/sources/examples/server/bench.js +0 -29
- data/ext/sources/examples/server.py +0 -120
- data/ext/sources/examples/stream/CMakeLists.txt +0 -10
- data/ext/sources/examples/stream/stream.cpp +0 -437
- data/ext/sources/examples/stream.wasm/CMakeLists.txt +0 -49
- data/ext/sources/examples/stream.wasm/emscripten.cpp +0 -216
- data/ext/sources/examples/stream.wasm/index-tmpl.html +0 -491
- data/ext/sources/examples/sycl/CMakeLists.txt +0 -9
- data/ext/sources/examples/sycl/build.sh +0 -22
- data/ext/sources/examples/sycl/ls-sycl-device.cpp +0 -11
- data/ext/sources/examples/sycl/run-whisper.sh +0 -17
- data/ext/sources/examples/talk-llama/CMakeLists.txt +0 -48
- data/ext/sources/examples/talk-llama/eleven-labs.py +0 -80
- data/ext/sources/examples/talk-llama/llama-adapter.cpp +0 -488
- data/ext/sources/examples/talk-llama/llama-adapter.h +0 -89
- data/ext/sources/examples/talk-llama/llama-arch.cpp +0 -2877
- data/ext/sources/examples/talk-llama/llama-arch.h +0 -628
- data/ext/sources/examples/talk-llama/llama-batch.cpp +0 -919
- data/ext/sources/examples/talk-llama/llama-batch.h +0 -173
- data/ext/sources/examples/talk-llama/llama-chat.cpp +0 -896
- data/ext/sources/examples/talk-llama/llama-chat.h +0 -71
- data/ext/sources/examples/talk-llama/llama-context.cpp +0 -3633
- data/ext/sources/examples/talk-llama/llama-context.h +0 -359
- data/ext/sources/examples/talk-llama/llama-cparams.cpp +0 -5
- data/ext/sources/examples/talk-llama/llama-cparams.h +0 -47
- data/ext/sources/examples/talk-llama/llama-ext.h +0 -12
- data/ext/sources/examples/talk-llama/llama-grammar.cpp +0 -1464
- data/ext/sources/examples/talk-llama/llama-grammar.h +0 -194
- data/ext/sources/examples/talk-llama/llama-graph.cpp +0 -2735
- data/ext/sources/examples/talk-llama/llama-graph.h +0 -1031
- data/ext/sources/examples/talk-llama/llama-hparams.cpp +0 -258
- data/ext/sources/examples/talk-llama/llama-hparams.h +0 -353
- data/ext/sources/examples/talk-llama/llama-impl.cpp +0 -171
- data/ext/sources/examples/talk-llama/llama-impl.h +0 -75
- data/ext/sources/examples/talk-llama/llama-io.cpp +0 -15
- data/ext/sources/examples/talk-llama/llama-io.h +0 -35
- data/ext/sources/examples/talk-llama/llama-kv-cache-iswa.cpp +0 -330
- data/ext/sources/examples/talk-llama/llama-kv-cache-iswa.h +0 -137
- data/ext/sources/examples/talk-llama/llama-kv-cache.cpp +0 -2285
- data/ext/sources/examples/talk-llama/llama-kv-cache.h +0 -389
- data/ext/sources/examples/talk-llama/llama-kv-cells.h +0 -533
- data/ext/sources/examples/talk-llama/llama-memory-hybrid-iswa.cpp +0 -275
- data/ext/sources/examples/talk-llama/llama-memory-hybrid-iswa.h +0 -140
- data/ext/sources/examples/talk-llama/llama-memory-hybrid.cpp +0 -268
- data/ext/sources/examples/talk-llama/llama-memory-hybrid.h +0 -139
- data/ext/sources/examples/talk-llama/llama-memory-recurrent.cpp +0 -1165
- data/ext/sources/examples/talk-llama/llama-memory-recurrent.h +0 -182
- data/ext/sources/examples/talk-llama/llama-memory.cpp +0 -59
- data/ext/sources/examples/talk-llama/llama-memory.h +0 -122
- data/ext/sources/examples/talk-llama/llama-mmap.cpp +0 -752
- data/ext/sources/examples/talk-llama/llama-mmap.h +0 -73
- data/ext/sources/examples/talk-llama/llama-model-loader.cpp +0 -1655
- data/ext/sources/examples/talk-llama/llama-model-loader.h +0 -206
- data/ext/sources/examples/talk-llama/llama-model-saver.cpp +0 -299
- data/ext/sources/examples/talk-llama/llama-model-saver.h +0 -40
- data/ext/sources/examples/talk-llama/llama-model.cpp +0 -9056
- data/ext/sources/examples/talk-llama/llama-model.h +0 -597
- data/ext/sources/examples/talk-llama/llama-quant.cpp +0 -1304
- data/ext/sources/examples/talk-llama/llama-quant.h +0 -1
- data/ext/sources/examples/talk-llama/llama-sampler.cpp +0 -3885
- data/ext/sources/examples/talk-llama/llama-sampler.h +0 -42
- data/ext/sources/examples/talk-llama/llama-vocab.cpp +0 -3970
- data/ext/sources/examples/talk-llama/llama-vocab.h +0 -187
- data/ext/sources/examples/talk-llama/llama.cpp +0 -1194
- data/ext/sources/examples/talk-llama/llama.h +0 -1573
- data/ext/sources/examples/talk-llama/models/afmoe.cpp +0 -190
- data/ext/sources/examples/talk-llama/models/apertus.cpp +0 -125
- data/ext/sources/examples/talk-llama/models/arcee.cpp +0 -135
- data/ext/sources/examples/talk-llama/models/arctic.cpp +0 -137
- data/ext/sources/examples/talk-llama/models/arwkv7.cpp +0 -86
- data/ext/sources/examples/talk-llama/models/baichuan.cpp +0 -123
- data/ext/sources/examples/talk-llama/models/bailingmoe.cpp +0 -143
- data/ext/sources/examples/talk-llama/models/bailingmoe2.cpp +0 -133
- data/ext/sources/examples/talk-llama/models/bert.cpp +0 -184
- data/ext/sources/examples/talk-llama/models/bitnet.cpp +0 -145
- data/ext/sources/examples/talk-llama/models/bloom.cpp +0 -101
- data/ext/sources/examples/talk-llama/models/chameleon.cpp +0 -178
- data/ext/sources/examples/talk-llama/models/chatglm.cpp +0 -132
- data/ext/sources/examples/talk-llama/models/codeshell.cpp +0 -111
- data/ext/sources/examples/talk-llama/models/cogvlm.cpp +0 -102
- data/ext/sources/examples/talk-llama/models/cohere2-iswa.cpp +0 -134
- data/ext/sources/examples/talk-llama/models/command-r.cpp +0 -122
- data/ext/sources/examples/talk-llama/models/dbrx.cpp +0 -122
- data/ext/sources/examples/talk-llama/models/deci.cpp +0 -135
- data/ext/sources/examples/talk-llama/models/deepseek.cpp +0 -142
- data/ext/sources/examples/talk-llama/models/deepseek2.cpp +0 -262
- data/ext/sources/examples/talk-llama/models/delta-net-base.cpp +0 -445
- data/ext/sources/examples/talk-llama/models/dots1.cpp +0 -132
- data/ext/sources/examples/talk-llama/models/dream.cpp +0 -105
- data/ext/sources/examples/talk-llama/models/ernie4-5-moe.cpp +0 -148
- data/ext/sources/examples/talk-llama/models/ernie4-5.cpp +0 -110
- data/ext/sources/examples/talk-llama/models/eurobert.cpp +0 -97
- data/ext/sources/examples/talk-llama/models/exaone-moe.cpp +0 -145
- data/ext/sources/examples/talk-llama/models/exaone.cpp +0 -114
- data/ext/sources/examples/talk-llama/models/exaone4.cpp +0 -123
- data/ext/sources/examples/talk-llama/models/falcon-h1.cpp +0 -111
- data/ext/sources/examples/talk-llama/models/falcon.cpp +0 -120
- data/ext/sources/examples/talk-llama/models/gemma-embedding.cpp +0 -116
- data/ext/sources/examples/talk-llama/models/gemma.cpp +0 -112
- data/ext/sources/examples/talk-llama/models/gemma2-iswa.cpp +0 -128
- data/ext/sources/examples/talk-llama/models/gemma3.cpp +0 -155
- data/ext/sources/examples/talk-llama/models/gemma3n-iswa.cpp +0 -384
- data/ext/sources/examples/talk-llama/models/glm4-moe.cpp +0 -170
- data/ext/sources/examples/talk-llama/models/glm4.cpp +0 -157
- data/ext/sources/examples/talk-llama/models/gpt2.cpp +0 -105
- data/ext/sources/examples/talk-llama/models/gptneox.cpp +0 -144
- data/ext/sources/examples/talk-llama/models/granite-hybrid.cpp +0 -195
- data/ext/sources/examples/talk-llama/models/granite.cpp +0 -210
- data/ext/sources/examples/talk-llama/models/grok.cpp +0 -159
- data/ext/sources/examples/talk-llama/models/grovemoe.cpp +0 -139
- data/ext/sources/examples/talk-llama/models/hunyuan-dense.cpp +0 -132
- data/ext/sources/examples/talk-llama/models/hunyuan-moe.cpp +0 -153
- data/ext/sources/examples/talk-llama/models/internlm2.cpp +0 -120
- data/ext/sources/examples/talk-llama/models/jais.cpp +0 -86
- data/ext/sources/examples/talk-llama/models/jais2.cpp +0 -123
- data/ext/sources/examples/talk-llama/models/jamba.cpp +0 -106
- data/ext/sources/examples/talk-llama/models/kimi-linear.cpp +0 -381
- data/ext/sources/examples/talk-llama/models/lfm2.cpp +0 -196
- data/ext/sources/examples/talk-llama/models/llada-moe.cpp +0 -122
- data/ext/sources/examples/talk-llama/models/llada.cpp +0 -99
- data/ext/sources/examples/talk-llama/models/llama-iswa.cpp +0 -178
- data/ext/sources/examples/talk-llama/models/llama.cpp +0 -175
- data/ext/sources/examples/talk-llama/models/maincoder.cpp +0 -117
- data/ext/sources/examples/talk-llama/models/mamba-base.cpp +0 -289
- data/ext/sources/examples/talk-llama/models/mamba.cpp +0 -54
- data/ext/sources/examples/talk-llama/models/mimo2-iswa.cpp +0 -129
- data/ext/sources/examples/talk-llama/models/minicpm3.cpp +0 -200
- data/ext/sources/examples/talk-llama/models/minimax-m2.cpp +0 -123
- data/ext/sources/examples/talk-llama/models/mistral3.cpp +0 -160
- data/ext/sources/examples/talk-llama/models/models.h +0 -704
- data/ext/sources/examples/talk-llama/models/modern-bert.cpp +0 -109
- data/ext/sources/examples/talk-llama/models/mpt.cpp +0 -126
- data/ext/sources/examples/talk-llama/models/nemotron-h.cpp +0 -162
- data/ext/sources/examples/talk-llama/models/nemotron.cpp +0 -122
- data/ext/sources/examples/talk-llama/models/neo-bert.cpp +0 -104
- data/ext/sources/examples/talk-llama/models/olmo.cpp +0 -121
- data/ext/sources/examples/talk-llama/models/olmo2.cpp +0 -150
- data/ext/sources/examples/talk-llama/models/olmoe.cpp +0 -124
- data/ext/sources/examples/talk-llama/models/openai-moe-iswa.cpp +0 -127
- data/ext/sources/examples/talk-llama/models/openelm.cpp +0 -124
- data/ext/sources/examples/talk-llama/models/orion.cpp +0 -123
- data/ext/sources/examples/talk-llama/models/paddleocr.cpp +0 -122
- data/ext/sources/examples/talk-llama/models/pangu-embedded.cpp +0 -121
- data/ext/sources/examples/talk-llama/models/phi2.cpp +0 -121
- data/ext/sources/examples/talk-llama/models/phi3.cpp +0 -152
- data/ext/sources/examples/talk-llama/models/plamo.cpp +0 -110
- data/ext/sources/examples/talk-llama/models/plamo2.cpp +0 -320
- data/ext/sources/examples/talk-llama/models/plamo3.cpp +0 -128
- data/ext/sources/examples/talk-llama/models/plm.cpp +0 -169
- data/ext/sources/examples/talk-llama/models/qwen.cpp +0 -108
- data/ext/sources/examples/talk-llama/models/qwen2.cpp +0 -126
- data/ext/sources/examples/talk-llama/models/qwen2moe.cpp +0 -151
- data/ext/sources/examples/talk-llama/models/qwen2vl.cpp +0 -117
- data/ext/sources/examples/talk-llama/models/qwen3.cpp +0 -120
- data/ext/sources/examples/talk-llama/models/qwen35.cpp +0 -381
- data/ext/sources/examples/talk-llama/models/qwen35moe.cpp +0 -422
- data/ext/sources/examples/talk-llama/models/qwen3moe.cpp +0 -131
- data/ext/sources/examples/talk-llama/models/qwen3next.cpp +0 -525
- data/ext/sources/examples/talk-llama/models/qwen3vl-moe.cpp +0 -140
- data/ext/sources/examples/talk-llama/models/qwen3vl.cpp +0 -132
- data/ext/sources/examples/talk-llama/models/refact.cpp +0 -94
- data/ext/sources/examples/talk-llama/models/rnd1.cpp +0 -126
- data/ext/sources/examples/talk-llama/models/rwkv6-base.cpp +0 -164
- data/ext/sources/examples/talk-llama/models/rwkv6.cpp +0 -94
- data/ext/sources/examples/talk-llama/models/rwkv6qwen2.cpp +0 -86
- data/ext/sources/examples/talk-llama/models/rwkv7-base.cpp +0 -137
- data/ext/sources/examples/talk-llama/models/rwkv7.cpp +0 -90
- data/ext/sources/examples/talk-llama/models/seed-oss.cpp +0 -124
- data/ext/sources/examples/talk-llama/models/smallthinker.cpp +0 -126
- data/ext/sources/examples/talk-llama/models/smollm3.cpp +0 -128
- data/ext/sources/examples/talk-llama/models/stablelm.cpp +0 -146
- data/ext/sources/examples/talk-llama/models/starcoder.cpp +0 -100
- data/ext/sources/examples/talk-llama/models/starcoder2.cpp +0 -121
- data/ext/sources/examples/talk-llama/models/step35-iswa.cpp +0 -165
- data/ext/sources/examples/talk-llama/models/t5-dec.cpp +0 -166
- data/ext/sources/examples/talk-llama/models/t5-enc.cpp +0 -96
- data/ext/sources/examples/talk-llama/models/wavtokenizer-dec.cpp +0 -149
- data/ext/sources/examples/talk-llama/models/xverse.cpp +0 -108
- data/ext/sources/examples/talk-llama/prompts/talk-alpaca.txt +0 -23
- data/ext/sources/examples/talk-llama/speak +0 -40
- data/ext/sources/examples/talk-llama/speak.bat +0 -1
- data/ext/sources/examples/talk-llama/speak.ps1 +0 -14
- data/ext/sources/examples/talk-llama/talk-llama.cpp +0 -813
- data/ext/sources/examples/talk-llama/unicode-data.cpp +0 -7034
- data/ext/sources/examples/talk-llama/unicode-data.h +0 -20
- data/ext/sources/examples/talk-llama/unicode.cpp +0 -1103
- data/ext/sources/examples/talk-llama/unicode.h +0 -111
- data/ext/sources/examples/wchess/CMakeLists.txt +0 -10
- data/ext/sources/examples/wchess/libwchess/CMakeLists.txt +0 -19
- data/ext/sources/examples/wchess/libwchess/Chessboard.cpp +0 -803
- data/ext/sources/examples/wchess/libwchess/Chessboard.h +0 -33
- data/ext/sources/examples/wchess/libwchess/WChess.cpp +0 -193
- data/ext/sources/examples/wchess/libwchess/WChess.h +0 -63
- data/ext/sources/examples/wchess/libwchess/test-chessboard.cpp +0 -117
- data/ext/sources/examples/wchess/wchess.cmd/CMakeLists.txt +0 -8
- data/ext/sources/examples/wchess/wchess.cmd/wchess.cmd.cpp +0 -253
- data/ext/sources/examples/whisper.wasm/CMakeLists.txt +0 -50
- data/ext/sources/examples/whisper.wasm/emscripten.cpp +0 -118
- data/ext/sources/examples/whisper.wasm/index-tmpl.html +0 -659
- data/ext/sources/ggml/src/ggml-cuda/template-instances/generate_cu_files.py +0 -99
- data/ext/sources/ggml/src/ggml-hexagon/htp/htp-msg.h +0 -155
- data/ext/sources/ggml/src/ggml-hexagon/op-desc.h +0 -153
- data/ext/sources/ggml/src/ggml-opencl/kernels/embed_kernel.py +0 -26
- data/ext/sources/ggml/src/ggml-openvino/openvino/pass/eliminate_zp.cpp +0 -123
- data/ext/sources/ggml/src/ggml-openvino/openvino/pass/eliminate_zp.h +0 -17
- data/ext/sources/ggml/src/ggml-virtgpu/regenerate_remoting.py +0 -333
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/abs.comp +0 -21
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/ceil.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/clamp.comp +0 -17
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/cos.comp +0 -17
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/elu.comp +0 -27
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/exp.comp +0 -21
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/floor.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu.comp +0 -25
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu_erf.comp +0 -39
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu_quick.comp +0 -23
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/hardsigmoid.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/hardswish.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/leaky_relu.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/neg.comp +0 -20
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/relu.comp +0 -21
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/round.comp +0 -29
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rte.glsl +0 -5
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sgn.comp +0 -21
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sigmoid.comp +0 -20
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/silu.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sin.comp +0 -17
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/softplus.comp +0 -23
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sqrt.comp +0 -17
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/square.comp +0 -17
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/step.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/tanh.comp +0 -20
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/trunc.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/xielu.comp +0 -35
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/embed_wgsl.py +0 -182
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/glu.tmpl.wgsl +0 -323
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat.wgsl +0 -718
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/rms_norm.wgsl +0 -123
- data/ext/sources/tests/CMakeLists.txt +0 -112
- data/ext/sources/tests/earnings21/eval.mk +0 -58
- data/ext/sources/tests/earnings21/eval.py +0 -68
- data/ext/sources/tests/earnings21/normalizers/__init__.py +0 -2
- data/ext/sources/tests/earnings21/normalizers/basic.py +0 -80
- data/ext/sources/tests/earnings21/normalizers/english.json +0 -1741
- data/ext/sources/tests/earnings21/normalizers/english.py +0 -550
- data/ext/sources/tests/earnings21/requirements.txt +0 -6
- data/ext/sources/tests/en-0-ref.txt +0 -1
- data/ext/sources/tests/en-1-ref.txt +0 -1
- data/ext/sources/tests/en-2-ref.txt +0 -1
- data/ext/sources/tests/es-0-ref.txt +0 -1
- data/ext/sources/tests/librispeech/eval.mk +0 -39
- data/ext/sources/tests/librispeech/eval.py +0 -47
- data/ext/sources/tests/librispeech/normalizers/__init__.py +0 -2
- data/ext/sources/tests/librispeech/normalizers/basic.py +0 -80
- data/ext/sources/tests/librispeech/normalizers/english.json +0 -1741
- data/ext/sources/tests/librispeech/normalizers/english.py +0 -550
- data/ext/sources/tests/librispeech/requirements.txt +0 -6
- data/ext/sources/tests/run-tests.sh +0 -130
- data/ext/sources/tests/test-c.c +0 -3
- data/ext/sources/tests/test-vad-full.cpp +0 -56
- data/ext/sources/tests/test-vad.cpp +0 -83
- data/ext/sources/tests/test-whisper.js +0 -58
- data/lib/whisper/context.rb +0 -15
- data/lib/whisper/segment.rb +0 -58
|
@@ -27,7 +27,10 @@
|
|
|
27
27
|
#define QR5_1 2
|
|
28
28
|
#define QK8_0 32
|
|
29
29
|
#define QR8_0 1
|
|
30
|
+
#define QK1_0 128
|
|
31
|
+
#define QR1_0 1
|
|
30
32
|
#define QK_K 256
|
|
33
|
+
#define K_SCALE_SIZE (3 * QK_K / 64)
|
|
31
34
|
#define K_QUANTS_PER_ITERATION 2
|
|
32
35
|
|
|
33
36
|
typedef char int8_t;
|
|
@@ -37,6 +40,14 @@ typedef ushort uint16_t;
|
|
|
37
40
|
typedef int int32_t;
|
|
38
41
|
typedef uint uint32_t;
|
|
39
42
|
|
|
43
|
+
//------------------------------------------------------------------------------
|
|
44
|
+
// block_q1_0
|
|
45
|
+
//------------------------------------------------------------------------------
|
|
46
|
+
typedef struct {
|
|
47
|
+
half d; // delta
|
|
48
|
+
uchar qs[QK1_0/8]; // 1-bit signs (16 bytes)
|
|
49
|
+
} block_q1_0;
|
|
50
|
+
|
|
40
51
|
//------------------------------------------------------------------------------
|
|
41
52
|
// block_q4_0
|
|
42
53
|
//------------------------------------------------------------------------------
|
|
@@ -55,6 +66,46 @@ struct block_q4_1 {
|
|
|
55
66
|
uchar qs[QK4_1 / 2]; // nibbles / quants
|
|
56
67
|
};
|
|
57
68
|
|
|
69
|
+
//------------------------------------------------------------------------------
|
|
70
|
+
// block_q5_0
|
|
71
|
+
//------------------------------------------------------------------------------
|
|
72
|
+
struct block_q5_0 {
|
|
73
|
+
half d; // delta
|
|
74
|
+
uchar qh[4]; // 5-th bit of quants
|
|
75
|
+
uchar qs[QK5_0 / 2]; // nibbles / quants
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
//------------------------------------------------------------------------------
|
|
79
|
+
// block_q5_1
|
|
80
|
+
//------------------------------------------------------------------------------
|
|
81
|
+
struct block_q5_1 {
|
|
82
|
+
half d; // delta
|
|
83
|
+
half m; // min
|
|
84
|
+
uchar qh[4]; // 5-th bit of quants
|
|
85
|
+
uchar qs[QK5_1 / 2]; // nibbles / quants
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
//------------------------------------------------------------------------------
|
|
89
|
+
// block_q4_k
|
|
90
|
+
//------------------------------------------------------------------------------
|
|
91
|
+
struct block_q4_K {
|
|
92
|
+
half d; // delta
|
|
93
|
+
half dm; // min
|
|
94
|
+
uchar s[K_SCALE_SIZE];
|
|
95
|
+
uchar q[QK_K / 2]; // nibbles / quants
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
//------------------------------------------------------------------------------
|
|
99
|
+
// block_q5_k
|
|
100
|
+
//------------------------------------------------------------------------------
|
|
101
|
+
struct block_q5_K {
|
|
102
|
+
half d; // delta
|
|
103
|
+
half dm; // min
|
|
104
|
+
uchar s[K_SCALE_SIZE];
|
|
105
|
+
uchar qh[QK_K / 8];
|
|
106
|
+
uchar qs[QK_K / 2]; // nibbles / quants
|
|
107
|
+
};
|
|
108
|
+
|
|
58
109
|
//------------------------------------------------------------------------------
|
|
59
110
|
// block_q6_K
|
|
60
111
|
//------------------------------------------------------------------------------
|
|
@@ -65,6 +116,95 @@ struct block_q6_K {
|
|
|
65
116
|
half d; // super-block scale
|
|
66
117
|
};
|
|
67
118
|
|
|
119
|
+
//------------------------------------------------------------------------------
|
|
120
|
+
// block_iq4_nl
|
|
121
|
+
//------------------------------------------------------------------------------
|
|
122
|
+
#define QK4_NL 32
|
|
123
|
+
|
|
124
|
+
struct block_iq4_nl
|
|
125
|
+
{
|
|
126
|
+
half d;
|
|
127
|
+
uint8_t qs[QK4_NL / 2];
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
//------------------------------------------------------------------------------
|
|
131
|
+
// bf16 to f16
|
|
132
|
+
//------------------------------------------------------------------------------
|
|
133
|
+
kernel void kernel_convert_bf16_to_f16(
|
|
134
|
+
global const ushort * src,
|
|
135
|
+
global half * dst,
|
|
136
|
+
ulong off_dst,
|
|
137
|
+
ulong n
|
|
138
|
+
) {
|
|
139
|
+
uint i = get_global_id(0);
|
|
140
|
+
if (i >= n) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
dst[i + off_dst] = (half) as_float((uint) src[i] << 16);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
//------------------------------------------------------------------------------
|
|
148
|
+
// f16 to bf16
|
|
149
|
+
//------------------------------------------------------------------------------
|
|
150
|
+
kernel void kernel_convert_f16_to_bf16(
|
|
151
|
+
global const half * src,
|
|
152
|
+
ulong off_src,
|
|
153
|
+
global ushort * dst,
|
|
154
|
+
ulong n
|
|
155
|
+
) {
|
|
156
|
+
uint i = get_global_id(0);
|
|
157
|
+
if (i >= n) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
float f = (float) src[i + off_src];
|
|
162
|
+
uint bits = as_uint(f);
|
|
163
|
+
if ((bits & 0x7fffffffu) > 0x7f800000u) {
|
|
164
|
+
// nan to quiet nan
|
|
165
|
+
dst[i] = (ushort)((bits >> 16) | 0x40u);
|
|
166
|
+
} else {
|
|
167
|
+
uint rounded = bits + 0x7fffu + ((bits >> 16) & 1u);
|
|
168
|
+
dst[i] = (ushort)(rounded >> 16);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
//------------------------------------------------------------------------------
|
|
173
|
+
// kernel_convert_block_q1_0
|
|
174
|
+
// Convert block_q1_0 (AOS) to 2 separate arrays (SOA): quant bytes + scales.
|
|
175
|
+
// q1_0 bits are stored in natural order (bit j of byte i -> weight 8*i + j)
|
|
176
|
+
//------------------------------------------------------------------------------
|
|
177
|
+
kernel void kernel_convert_block_q1_0(
|
|
178
|
+
global block_q1_0 * src0,
|
|
179
|
+
global uchar * dst_q,
|
|
180
|
+
global half * dst_d
|
|
181
|
+
) {
|
|
182
|
+
global block_q1_0 * b = (global block_q1_0 *) src0 + get_global_id(0);
|
|
183
|
+
global uchar * q = (global uchar *) dst_q + (QK1_0/8)*get_global_id(0);
|
|
184
|
+
global half * d = (global half *) dst_d + get_global_id(0);
|
|
185
|
+
|
|
186
|
+
*d = b->d;
|
|
187
|
+
|
|
188
|
+
for (int i = 0; i < QK1_0/8; ++i) {
|
|
189
|
+
q[i] = b->qs[i];
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
kernel void kernel_restore_block_q1_0(
|
|
194
|
+
global uchar * src_q,
|
|
195
|
+
global half * src_d,
|
|
196
|
+
global block_q1_0 * dst
|
|
197
|
+
) {
|
|
198
|
+
global block_q1_0 * b = (global block_q1_0 *) dst + get_global_id(0);
|
|
199
|
+
global uchar * q = (global uchar *) src_q + (QK1_0/8)*get_global_id(0);
|
|
200
|
+
global half * d = (global half *) src_d + get_global_id(0);
|
|
201
|
+
|
|
202
|
+
b->d = *d;
|
|
203
|
+
for (int i = 0; i < QK1_0/8; ++i) {
|
|
204
|
+
b->qs[i] = q[i];
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
68
208
|
//------------------------------------------------------------------------------
|
|
69
209
|
// kernel_convert_block_q4_0
|
|
70
210
|
// Convert the block_q4_0 format to 2 separate arrays (AOS -> SOA).
|
|
@@ -157,6 +297,100 @@ kernel void kernel_restore_block_q4_0_noshuffle(
|
|
|
157
297
|
}
|
|
158
298
|
}
|
|
159
299
|
|
|
300
|
+
kernel void kernel_convert_block_q4_0_trans4_ns(
|
|
301
|
+
global struct block_q4_0 * src0,
|
|
302
|
+
__global uint * dst_q,
|
|
303
|
+
__global half * dst_d,
|
|
304
|
+
uint ne00,
|
|
305
|
+
uint ne01
|
|
306
|
+
) {
|
|
307
|
+
uint i00 = get_global_id(1);
|
|
308
|
+
uint i01 = get_global_id(0);
|
|
309
|
+
uint i02 = get_global_id(2);
|
|
310
|
+
|
|
311
|
+
if (i01 >= ne01) {
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
uint ne00_blk = ne00 / QK4_0;
|
|
316
|
+
uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
317
|
+
uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
318
|
+
|
|
319
|
+
global struct block_q4_0 * b = src0 + src_blk_offset;
|
|
320
|
+
dst_d[dst_blk_offset] = b->d;
|
|
321
|
+
|
|
322
|
+
// extract quantization and unshuffle
|
|
323
|
+
ushort8 pre_block = ((global ushort8 *)(&(b->qs[0])))[0];
|
|
324
|
+
|
|
325
|
+
ushort8 post_block = (ushort8)(0);
|
|
326
|
+
|
|
327
|
+
uchar * pre_block_ptr = (uchar *)(&pre_block);
|
|
328
|
+
uchar * post_block_ptr = (uchar *)(&post_block);
|
|
329
|
+
|
|
330
|
+
for (int i = 0; i < QK4_0 / 4; ++i) {
|
|
331
|
+
uchar x0 = pre_block_ptr[2*i + 0];
|
|
332
|
+
uchar x1 = pre_block_ptr[2*i + 1];
|
|
333
|
+
|
|
334
|
+
post_block_ptr[i + 0 ] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
|
|
335
|
+
post_block_ptr[i + QK4_0 / 4] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
uint4 q_block = as_uint4(post_block);
|
|
339
|
+
|
|
340
|
+
uint offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
|
|
341
|
+
dst_q[offset] = q_block.x;
|
|
342
|
+
dst_q[offset + ne01] = q_block.y;
|
|
343
|
+
dst_q[offset + ne01 * 2] = q_block.z;
|
|
344
|
+
dst_q[offset + ne01 * 3] = q_block.w;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
kernel void kernel_restore_block_q4_0_trans4_ns(
|
|
348
|
+
__global uint * src_q,
|
|
349
|
+
__global half * src_d,
|
|
350
|
+
__global struct block_q4_0 * dst0,
|
|
351
|
+
uint ne00,
|
|
352
|
+
uint ne01
|
|
353
|
+
) {
|
|
354
|
+
uint i00 = get_global_id(1);
|
|
355
|
+
uint i01 = get_global_id(0);
|
|
356
|
+
uint i02 = get_global_id(2);
|
|
357
|
+
|
|
358
|
+
if (i01 >= ne01) {
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
uint ne00_blk = ne00 / QK4_0;
|
|
363
|
+
uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
364
|
+
uint src_d_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
365
|
+
|
|
366
|
+
__global struct block_q4_0 * b = dst0 + dst_blk_offset;
|
|
367
|
+
b->d = src_d[src_d_offset];
|
|
368
|
+
|
|
369
|
+
// collect transposed quantization parts for a block
|
|
370
|
+
uint src_q_offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
|
|
371
|
+
uint4 q_block;
|
|
372
|
+
q_block.x = src_q[src_q_offset];
|
|
373
|
+
q_block.y = src_q[src_q_offset + ne01];
|
|
374
|
+
q_block.z = src_q[src_q_offset + ne01 * 2];
|
|
375
|
+
q_block.w = src_q[src_q_offset + ne01 * 3];
|
|
376
|
+
|
|
377
|
+
ushort8 post_block = as_ushort8(q_block);
|
|
378
|
+
ushort8 pre_block = (ushort8)(0);
|
|
379
|
+
|
|
380
|
+
uchar * pre_block_ptr = (uchar *)(&pre_block);
|
|
381
|
+
uchar * post_block_ptr = (uchar *)(&post_block);
|
|
382
|
+
|
|
383
|
+
for (int i = 0; i < QK4_0 / 4; ++i) {
|
|
384
|
+
uchar x0 = post_block_ptr[i + 0];
|
|
385
|
+
uchar x1 = post_block_ptr[i + QK4_0 / 4];
|
|
386
|
+
|
|
387
|
+
pre_block_ptr[2 * i + 0] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
|
|
388
|
+
pre_block_ptr[2 * i + 1] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
((__global ushort8 *)(&(b->qs[0])))[0] = pre_block;
|
|
392
|
+
}
|
|
393
|
+
|
|
160
394
|
//------------------------------------------------------------------------------
|
|
161
395
|
// kernel_convert_block_q4_1
|
|
162
396
|
// Convert the block_q4_1 format to 2 separate arrays (AOS -> SOA).
|
|
@@ -251,76 +485,60 @@ kernel void kernel_restore_block_q4_1_noshuffle(
|
|
|
251
485
|
}
|
|
252
486
|
}
|
|
253
487
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
uchar e; // E8M0
|
|
260
|
-
uchar qs[QK_MXFP4 / 2];
|
|
261
|
-
};
|
|
262
|
-
|
|
263
|
-
//------------------------------------------------------------------------------
|
|
264
|
-
// kernel_convert_block_mxfp4
|
|
265
|
-
// Convert the block_mxfp4 format to 2 separate arrays (AOS -> SOA).
|
|
266
|
-
// This kernel does not deshuffle the bits.
|
|
267
|
-
//------------------------------------------------------------------------------
|
|
268
|
-
kernel void kernel_convert_block_mxfp4(
|
|
269
|
-
global struct block_mxfp4 * src0,
|
|
270
|
-
global uchar * dst_q,
|
|
271
|
-
global uchar * dst_e
|
|
272
|
-
) {
|
|
273
|
-
global struct block_mxfp4 * b = (global struct block_mxfp4 *) src0 + get_global_id(0);
|
|
274
|
-
global uchar * q = (global uchar *) dst_q + QK_MXFP4 / 2 * get_global_id(0);
|
|
275
|
-
global uchar * e = (global uchar *) dst_e + get_global_id(0);
|
|
276
|
-
|
|
277
|
-
*e = b->e;
|
|
278
|
-
|
|
279
|
-
for (int i = 0; i < QK_MXFP4 / 2; ++i) {
|
|
280
|
-
q[i] = b->qs[i];
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
kernel void kernel_convert_block_mxfp4_trans(
|
|
285
|
-
global struct block_mxfp4 * src0,
|
|
286
|
-
__global uint4 * dst_q,
|
|
287
|
-
__global uchar * dst_e,
|
|
488
|
+
kernel void kernel_convert_block_q4_1_trans4_ns(
|
|
489
|
+
__global struct block_q4_1 * src0,
|
|
490
|
+
__global uint * dst_q,
|
|
491
|
+
__global half * dst_d,
|
|
492
|
+
__global half * dst_m,
|
|
288
493
|
uint ne00,
|
|
289
494
|
uint ne01
|
|
290
495
|
) {
|
|
291
|
-
|
|
496
|
+
uint i00 = get_global_id(1);
|
|
292
497
|
uint i01 = get_global_id(0);
|
|
293
498
|
uint i02 = get_global_id(2);
|
|
294
499
|
|
|
295
|
-
|
|
500
|
+
if (i01 >= ne01) {
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
uint ne00_blk = ne00 / QK4_1;
|
|
296
505
|
uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
297
506
|
uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
298
507
|
|
|
299
|
-
global struct
|
|
508
|
+
global struct block_q4_1 * b = src0 + src_blk_offset;
|
|
509
|
+
dst_d[dst_blk_offset] = b->d;
|
|
510
|
+
dst_m[dst_blk_offset] = b->m;
|
|
300
511
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
}
|
|
512
|
+
// extract quantization and unshuffle
|
|
513
|
+
ushort8 pre_block = ((global ushort8 *)(&(b->qs[0])))[0];
|
|
304
514
|
|
|
305
|
-
|
|
306
|
-
global uchar * src_q,
|
|
307
|
-
global half * src_e,
|
|
308
|
-
global struct block_mxfp4 * dst
|
|
309
|
-
) {
|
|
310
|
-
global struct block_mxfp4 * b = (global struct block_mxfp4 *) dst + get_global_id(0);
|
|
311
|
-
global uchar * q = (global uchar *) src_q + QK_MXFP4 / 2 * get_global_id(0);
|
|
312
|
-
global uchar * e = (global uchar *) src_e + get_global_id(0);
|
|
515
|
+
ushort8 post_block = (ushort8)(0);
|
|
313
516
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
517
|
+
uchar * pre_block_ptr = (uchar *)(&pre_block);
|
|
518
|
+
uchar * post_block_ptr = (uchar *)(&post_block);
|
|
519
|
+
|
|
520
|
+
for (int i = 0; i < QK4_1 / 4; ++i) {
|
|
521
|
+
uchar x0 = pre_block_ptr[2*i + 0];
|
|
522
|
+
uchar x1 = pre_block_ptr[2*i + 1];
|
|
523
|
+
|
|
524
|
+
post_block_ptr[i + 0 ] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
|
|
525
|
+
post_block_ptr[i + QK4_1 / 4] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
|
|
317
526
|
}
|
|
527
|
+
|
|
528
|
+
uint4 q_block = as_uint4(post_block);
|
|
529
|
+
|
|
530
|
+
uint offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
|
|
531
|
+
dst_q[offset] = q_block.x;
|
|
532
|
+
dst_q[offset + ne01] = q_block.y;
|
|
533
|
+
dst_q[offset + ne01 * 2] = q_block.z;
|
|
534
|
+
dst_q[offset + ne01 * 3] = q_block.w;
|
|
318
535
|
}
|
|
319
536
|
|
|
320
|
-
kernel void
|
|
321
|
-
__global
|
|
322
|
-
__global
|
|
323
|
-
|
|
537
|
+
kernel void kernel_restore_block_q4_1_trans4_ns(
|
|
538
|
+
__global uint * src_q,
|
|
539
|
+
__global half * src_d,
|
|
540
|
+
__global half * src_m,
|
|
541
|
+
__global struct block_q4_1 * dst0,
|
|
324
542
|
uint ne00,
|
|
325
543
|
uint ne01
|
|
326
544
|
) {
|
|
@@ -328,70 +546,1255 @@ kernel void kernel_restore_block_mxfp4_trans(
|
|
|
328
546
|
uint i01 = get_global_id(0);
|
|
329
547
|
uint i02 = get_global_id(2);
|
|
330
548
|
|
|
331
|
-
|
|
332
|
-
|
|
549
|
+
if (i01 >= ne01) {
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
uint ne00_blk = ne00 / QK4_1;
|
|
333
554
|
uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
555
|
+
uint src_dm_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
334
556
|
|
|
335
|
-
|
|
557
|
+
__global struct block_q4_1 * b = dst0 + dst_blk_offset;
|
|
558
|
+
b->d = src_d[src_dm_offset];
|
|
559
|
+
b->m = src_m[src_dm_offset];
|
|
336
560
|
|
|
337
|
-
|
|
338
|
-
|
|
561
|
+
// collect transposed quantization parts for a block
|
|
562
|
+
uint src_q_offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
|
|
563
|
+
uint4 q_block;
|
|
564
|
+
q_block.x = src_q[src_q_offset];
|
|
565
|
+
q_block.y = src_q[src_q_offset + ne01];
|
|
566
|
+
q_block.z = src_q[src_q_offset + ne01 * 2];
|
|
567
|
+
q_block.w = src_q[src_q_offset + ne01 * 3];
|
|
568
|
+
|
|
569
|
+
ushort8 post_block = as_ushort8(q_block);
|
|
570
|
+
ushort8 pre_block = (ushort8)(0);
|
|
571
|
+
|
|
572
|
+
uchar * pre_block_ptr = (uchar *)(&pre_block);
|
|
573
|
+
uchar * post_block_ptr = (uchar *)(&post_block);
|
|
574
|
+
|
|
575
|
+
for (int i = 0; i < QK4_0 / 4; ++i) {
|
|
576
|
+
uchar x0 = post_block_ptr[i + 0];
|
|
577
|
+
uchar x1 = post_block_ptr[i + QK4_0 / 4];
|
|
578
|
+
|
|
579
|
+
pre_block_ptr[2 * i + 0] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
|
|
580
|
+
pre_block_ptr[2 * i + 1] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
((__global ushort8 *)(&(b->qs[0])))[0] = pre_block;
|
|
339
584
|
}
|
|
340
585
|
|
|
341
586
|
//------------------------------------------------------------------------------
|
|
342
|
-
//
|
|
587
|
+
// kernel_convert_block_q5_0
|
|
588
|
+
// Convert the block_q5_0 format to 3 separate arrays (AOS -> SOA).
|
|
589
|
+
// This kernel does not deshuffle the bits.
|
|
343
590
|
//------------------------------------------------------------------------------
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
591
|
+
kernel void kernel_convert_block_q5_0(
|
|
592
|
+
global struct block_q5_0 * src0,
|
|
593
|
+
global uchar * dst_qs,
|
|
594
|
+
global uint * dst_qh,
|
|
595
|
+
global half * dst_d,
|
|
596
|
+
ulong n_blk
|
|
597
|
+
) {
|
|
598
|
+
if (get_global_id(0) >= n_blk) {
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
348
601
|
|
|
349
|
-
|
|
350
|
-
global
|
|
602
|
+
global struct block_q5_0 * b = (global struct block_q5_0 *) src0 + get_global_id(0);
|
|
603
|
+
global uchar * qs = (global uchar *) dst_qs + (QK5_0/2)*get_global_id(0);
|
|
604
|
+
global uint * qh = (global uint *) dst_qh + get_global_id(0);
|
|
605
|
+
global half * d = (global half *) dst_d + get_global_id(0);
|
|
606
|
+
|
|
607
|
+
*d = b->d;
|
|
608
|
+
*qh = *((global uint *)(b->qh));
|
|
609
|
+
|
|
610
|
+
for (int i = 0; i < QK5_0/2; ++i) {
|
|
611
|
+
qs[i] = b->qs[i];
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
kernel void kernel_restore_block_q5_0(
|
|
616
|
+
global uchar * src_qs,
|
|
617
|
+
global uint * src_qh,
|
|
618
|
+
global half * src_d,
|
|
619
|
+
global struct block_q5_0 * dst
|
|
620
|
+
) {
|
|
621
|
+
global struct block_q5_0 * b = (global struct block_q5_0 *) dst + get_global_id(0);
|
|
622
|
+
global uchar * qs = (global uchar *) src_qs + (QK5_0/2)*get_global_id(0);
|
|
623
|
+
global uint * qh = (global uint *) src_qh + get_global_id(0);
|
|
624
|
+
global half * d = (global half *) src_d + get_global_id(0);
|
|
625
|
+
|
|
626
|
+
b->d = *d;
|
|
627
|
+
*((global uint *)(b->qh)) = *qh;
|
|
628
|
+
for (int i = 0; i < QK5_0/2; ++i) {
|
|
629
|
+
b->qs[i] = qs[i];
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
kernel void kernel_convert_block_q5_0_noshuffle(
|
|
634
|
+
global struct block_q5_0 * src0,
|
|
351
635
|
global uchar * dst_q,
|
|
636
|
+
global uint * dst_qh,
|
|
352
637
|
global half * dst_d
|
|
353
638
|
) {
|
|
354
|
-
global
|
|
355
|
-
global uchar
|
|
356
|
-
global
|
|
639
|
+
global struct block_q5_0 * b = (global struct block_q5_0 *) src0 + get_global_id(0);
|
|
640
|
+
global uchar * q = (global uchar *) dst_q + QK5_0/2*get_global_id(0);
|
|
641
|
+
global uint * qh = (global uint *) dst_qh + get_global_id(0);
|
|
642
|
+
global half * d = (global half *) dst_d + get_global_id(0);
|
|
357
643
|
|
|
358
644
|
*d = b->d;
|
|
645
|
+
*qh = *((global uint *)(b->qh));
|
|
359
646
|
|
|
360
|
-
for (int i = 0; i <
|
|
361
|
-
|
|
647
|
+
for (int i = 0; i < QK5_0/4; ++i) {
|
|
648
|
+
uchar x0 = b->qs[2*i + 0];
|
|
649
|
+
uchar x1 = b->qs[2*i + 1];
|
|
650
|
+
|
|
651
|
+
q[i + 0 ] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
|
|
652
|
+
q[i + QK5_0/4] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
|
|
653
|
+
|
|
654
|
+
#ifdef ADRENO_GPU
|
|
655
|
+
if (get_global_id(0) == 65536*4096) {
|
|
656
|
+
printf("%04x - %02x\n", *(global ushort*)d, ((x0 & 0xF0) >> 4) | (x1 & 0xF0));
|
|
657
|
+
}
|
|
658
|
+
#endif
|
|
362
659
|
}
|
|
363
660
|
}
|
|
364
661
|
|
|
365
|
-
kernel void
|
|
662
|
+
kernel void kernel_restore_block_q5_0_noshuffle(
|
|
366
663
|
global uchar * src_q,
|
|
664
|
+
global uint * src_qh,
|
|
367
665
|
global half * src_d,
|
|
368
|
-
global
|
|
666
|
+
global struct block_q5_0 * dst,
|
|
667
|
+
uchar mask_0F,
|
|
668
|
+
uchar mask_F0
|
|
369
669
|
) {
|
|
370
|
-
global
|
|
371
|
-
global uchar
|
|
372
|
-
global
|
|
670
|
+
global struct block_q5_0 * b = (global struct block_q5_0 *) dst + get_global_id(0);
|
|
671
|
+
global uchar * q = (global uchar *) src_q + QK5_0/2*get_global_id(0);
|
|
672
|
+
global uint * qh = (global uint *) src_qh + get_global_id(0);
|
|
673
|
+
global half * d = (global half *) src_d + get_global_id(0);
|
|
373
674
|
|
|
374
675
|
b->d = *d;
|
|
375
|
-
|
|
376
|
-
|
|
676
|
+
*((global uint *)(b->qh)) = *qh;
|
|
677
|
+
|
|
678
|
+
for (int i = 0; i < QK5_0/4; ++i) {
|
|
679
|
+
uchar x0 = q[i + 0 ];
|
|
680
|
+
uchar x1 = q[i + QK5_0/4];
|
|
681
|
+
|
|
682
|
+
b->qs[2*i + 0] = convert_uchar((x0 & mask_0F) | ((x1 & mask_0F) << 4));
|
|
683
|
+
b->qs[2*i + 1] = convert_uchar(((x0 & mask_F0) >> 4) | (x1 & mask_F0));
|
|
377
684
|
}
|
|
378
685
|
}
|
|
379
686
|
|
|
380
|
-
kernel void
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
687
|
+
kernel void kernel_convert_block_q5_0_trans4_ns(
|
|
688
|
+
__global struct block_q5_0 * src0,
|
|
689
|
+
__global uint * dst_qs,
|
|
690
|
+
__global uint * dst_qh,
|
|
691
|
+
__global half * dst_d,
|
|
384
692
|
uint ne00,
|
|
385
693
|
uint ne01
|
|
386
|
-
){
|
|
387
|
-
uint
|
|
694
|
+
) {
|
|
695
|
+
uint i00 = get_global_id(1);
|
|
696
|
+
uint i01 = get_global_id(0);
|
|
697
|
+
uint i02 = get_global_id(2);
|
|
388
698
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
699
|
+
if (i01 >= ne01) {
|
|
700
|
+
return;
|
|
701
|
+
}
|
|
392
702
|
|
|
393
|
-
|
|
394
|
-
|
|
703
|
+
uint ne00_blk = ne00 / QK5_0;
|
|
704
|
+
uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
705
|
+
uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
706
|
+
|
|
707
|
+
global struct block_q5_0 * b = src0 + src_blk_offset;
|
|
708
|
+
dst_d[dst_blk_offset] = b->d;
|
|
709
|
+
|
|
710
|
+
dst_qh[dst_blk_offset] = ((global uint *)(&(b->qh[0])))[0];
|
|
711
|
+
|
|
712
|
+
// extract quantization and unshuffle
|
|
713
|
+
ushort8 pre_block = ((global ushort8 *)(&(b->qs[0])))[0];
|
|
714
|
+
ushort8 post_block = (ushort8)(0);
|
|
715
|
+
|
|
716
|
+
uchar * pre_block_ptr = (uchar *)(&pre_block);
|
|
717
|
+
uchar * post_block_ptr = (uchar *)(&post_block);
|
|
718
|
+
|
|
719
|
+
for (int i = 0; i < QK5_0 / 4; ++i) {
|
|
720
|
+
uchar x0 = pre_block_ptr[2*i + 0];
|
|
721
|
+
uchar x1 = pre_block_ptr[2*i + 1];
|
|
722
|
+
|
|
723
|
+
post_block_ptr[i + 0 ] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
|
|
724
|
+
post_block_ptr[i + QK5_0 / 4] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
uint4 q_block = as_uint4(post_block);
|
|
728
|
+
|
|
729
|
+
uint offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
|
|
730
|
+
dst_qs[offset] = q_block.x;
|
|
731
|
+
dst_qs[offset + ne01] = q_block.y;
|
|
732
|
+
dst_qs[offset + ne01 * 2] = q_block.z;
|
|
733
|
+
dst_qs[offset + ne01 * 3] = q_block.w;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
kernel void kernel_restore_block_q5_0_trans4_ns(
|
|
737
|
+
__global uint * src_qs,
|
|
738
|
+
__global uint * src_qh,
|
|
739
|
+
__global half * src_d,
|
|
740
|
+
__global struct block_q5_0 * dst0,
|
|
741
|
+
uint ne00,
|
|
742
|
+
uint ne01
|
|
743
|
+
) {
|
|
744
|
+
int i00 = get_global_id(1);
|
|
745
|
+
uint i01 = get_global_id(0);
|
|
746
|
+
uint i02 = get_global_id(2);
|
|
747
|
+
|
|
748
|
+
if (i01 >= ne01) {
|
|
749
|
+
return;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
uint ne00_blk = ne00 / QK5_0;
|
|
753
|
+
uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
754
|
+
uint src_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
755
|
+
|
|
756
|
+
__global struct block_q5_0 * b = dst0 + dst_blk_offset;
|
|
757
|
+
b->d = src_d[src_blk_offset];
|
|
758
|
+
|
|
759
|
+
((__global uint *)(&(b->qh[0])))[0] = src_qh[src_blk_offset];
|
|
760
|
+
|
|
761
|
+
// collect transposed quantization parts for a block
|
|
762
|
+
uint src_q_offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
|
|
763
|
+
uint4 q_block;
|
|
764
|
+
q_block.x = src_qs[src_q_offset];
|
|
765
|
+
q_block.y = src_qs[src_q_offset + ne01];
|
|
766
|
+
q_block.z = src_qs[src_q_offset + ne01 * 2];
|
|
767
|
+
q_block.w = src_qs[src_q_offset + ne01 * 3];
|
|
768
|
+
|
|
769
|
+
ushort8 post_block = as_ushort8(q_block);
|
|
770
|
+
ushort8 pre_block = (ushort8)(0);
|
|
771
|
+
|
|
772
|
+
uchar * pre_block_ptr = (uchar *)(&pre_block);
|
|
773
|
+
uchar * post_block_ptr = (uchar *)(&post_block);
|
|
774
|
+
|
|
775
|
+
for (int i = 0; i < QK5_0 / 4; ++i) {
|
|
776
|
+
uchar x0 = post_block_ptr[i + 0];
|
|
777
|
+
uchar x1 = post_block_ptr[i + QK5_0 / 4];
|
|
778
|
+
|
|
779
|
+
pre_block_ptr[2 * i + 0] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
|
|
780
|
+
pre_block_ptr[2 * i + 1] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
((__global ushort8 *)(&(b->qs[0])))[0] = pre_block;
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
//------------------------------------------------------------------------------
|
|
787
|
+
// kernel_convert_block_q5_1
|
|
788
|
+
// Convert the block_q5_1 format to 4 separate arrays (AOS -> SOA).
|
|
789
|
+
// This kernel does not deshuffle the bits.
|
|
790
|
+
//------------------------------------------------------------------------------
|
|
791
|
+
kernel void kernel_convert_block_q5_1(
|
|
792
|
+
global struct block_q5_1 * src0,
|
|
793
|
+
global uchar * dst_qs,
|
|
794
|
+
global uint * dst_qh,
|
|
795
|
+
global half * dst_d,
|
|
796
|
+
global half * dst_m,
|
|
797
|
+
ulong n_blk
|
|
798
|
+
) {
|
|
799
|
+
if (get_global_id(0) >= n_blk) {
|
|
800
|
+
return;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
global struct block_q5_1 * b = (global struct block_q5_1 *) src0 + get_global_id(0);
|
|
804
|
+
global uchar * qs = (global uchar *) dst_qs + (QK5_1/2)*get_global_id(0);
|
|
805
|
+
global uint * qh = (global uint *) dst_qh + get_global_id(0);
|
|
806
|
+
global half * d = (global half *) dst_d + get_global_id(0);
|
|
807
|
+
global half * m = (global half *) dst_m + get_global_id(0);
|
|
808
|
+
|
|
809
|
+
*d = b->d;
|
|
810
|
+
*m = b->m;
|
|
811
|
+
*qh = *((global uint *)(b->qh));
|
|
812
|
+
|
|
813
|
+
for (int i = 0; i < QK5_1/2; ++i) {
|
|
814
|
+
qs[i] = b->qs[i];
|
|
815
|
+
}
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
kernel void kernel_restore_block_q5_1(
|
|
819
|
+
global uchar * src_qs,
|
|
820
|
+
global uint * src_qh,
|
|
821
|
+
global half * src_d,
|
|
822
|
+
global half * src_m,
|
|
823
|
+
global struct block_q5_1 * dst
|
|
824
|
+
) {
|
|
825
|
+
global struct block_q5_1 * b = (global struct block_q5_1 *) dst + get_global_id(0);
|
|
826
|
+
global uchar * qs = (global uchar *) src_qs + (QK5_1/2)*get_global_id(0);
|
|
827
|
+
global uint * qh = (global uint *) src_qh + get_global_id(0);
|
|
828
|
+
global half * d = (global half *) src_d + get_global_id(0);
|
|
829
|
+
global half * m = (global half *) src_m + get_global_id(0);
|
|
830
|
+
|
|
831
|
+
b->d = *d;
|
|
832
|
+
b->m = *m;
|
|
833
|
+
*((global uint *)(b->qh)) = *qh;
|
|
834
|
+
for (int i = 0; i < QK5_1/2; ++i) {
|
|
835
|
+
b->qs[i] = qs[i];
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
kernel void kernel_convert_block_q5_1_noshuffle(
|
|
840
|
+
global struct block_q5_1 * src0,
|
|
841
|
+
global uchar * dst_q,
|
|
842
|
+
global uint * dst_qh,
|
|
843
|
+
global half * dst_d,
|
|
844
|
+
global half * dst_m
|
|
845
|
+
) {
|
|
846
|
+
global struct block_q5_1 * b = (global struct block_q5_1 *) src0 + get_global_id(0);
|
|
847
|
+
global uchar * q = (global uchar *) dst_q + QK5_1/2*get_global_id(0);
|
|
848
|
+
global uint * qh = (global uint *) dst_qh + get_global_id(0);
|
|
849
|
+
global half * d = (global half *) dst_d + get_global_id(0);
|
|
850
|
+
global half * m = (global half *) dst_m + get_global_id(0);
|
|
851
|
+
|
|
852
|
+
*d = b->d;
|
|
853
|
+
*m = b->m;
|
|
854
|
+
*qh = *((global uint *)(b->qh));
|
|
855
|
+
|
|
856
|
+
for (int i = 0; i < QK5_1/4; ++i) {
|
|
857
|
+
uchar x0 = b->qs[2*i + 0];
|
|
858
|
+
uchar x1 = b->qs[2*i + 1];
|
|
859
|
+
|
|
860
|
+
q[i + 0 ] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
|
|
861
|
+
q[i + QK5_1/4] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
|
|
862
|
+
|
|
863
|
+
#ifdef ADRENO_GPU
|
|
864
|
+
if (get_global_id(0) == 65536*4096) {
|
|
865
|
+
printf("%04x - %02x\n", *(global ushort*)d, ((x0 & 0xF0) >> 4) | (x1 & 0xF0));
|
|
866
|
+
}
|
|
867
|
+
#endif
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
kernel void kernel_restore_block_q5_1_noshuffle(
|
|
872
|
+
global uchar * src_q,
|
|
873
|
+
global uint * src_qh,
|
|
874
|
+
global half * src_d,
|
|
875
|
+
global half * src_m,
|
|
876
|
+
global struct block_q5_1 * dst,
|
|
877
|
+
uchar mask_0F,
|
|
878
|
+
uchar mask_F0
|
|
879
|
+
) {
|
|
880
|
+
global struct block_q5_1 * b = (global struct block_q5_1 *) dst + get_global_id(0);
|
|
881
|
+
global uchar * q = (global uchar *) src_q + QK5_1/2*get_global_id(0);
|
|
882
|
+
global uint * qh = (global uint *) src_qh + get_global_id(0);
|
|
883
|
+
global half * d = (global half *) src_d + get_global_id(0);
|
|
884
|
+
global half * m = (global half *) src_m + get_global_id(0);
|
|
885
|
+
|
|
886
|
+
b->d = *d;
|
|
887
|
+
b->m = *m;
|
|
888
|
+
*((global uint *)(b->qh)) = *qh;
|
|
889
|
+
|
|
890
|
+
for (int i = 0; i < QK5_1/4; ++i) {
|
|
891
|
+
uchar x0 = q[i + 0 ];
|
|
892
|
+
uchar x1 = q[i + QK5_1/4];
|
|
893
|
+
|
|
894
|
+
b->qs[2*i + 0] = convert_uchar((x0 & mask_0F) | ((x1 & mask_0F) << 4));
|
|
895
|
+
b->qs[2*i + 1] = convert_uchar(((x0 & mask_F0) >> 4) | (x1 & mask_F0));
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
kernel void kernel_convert_block_q5_1_trans4_ns(
|
|
900
|
+
__global struct block_q5_1 * src0,
|
|
901
|
+
__global uint * dst_qs,
|
|
902
|
+
__global uint * dst_qh,
|
|
903
|
+
__global half * dst_d,
|
|
904
|
+
__global half * dst_m,
|
|
905
|
+
uint ne00,
|
|
906
|
+
uint ne01
|
|
907
|
+
) {
|
|
908
|
+
uint i00 = get_global_id(1);
|
|
909
|
+
uint i01 = get_global_id(0);
|
|
910
|
+
uint i02 = get_global_id(2);
|
|
911
|
+
|
|
912
|
+
if (i01 >= ne01) {
|
|
913
|
+
return;
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
uint ne00_blk = ne00 / QK5_1;
|
|
917
|
+
uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
918
|
+
uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
919
|
+
|
|
920
|
+
global struct block_q5_1 * b = src0 + src_blk_offset;
|
|
921
|
+
dst_d[dst_blk_offset] = b->d;
|
|
922
|
+
dst_m[dst_blk_offset] = b->m;
|
|
923
|
+
|
|
924
|
+
dst_qh[dst_blk_offset] = ((global uint *)(&(b->qh[0])))[0];
|
|
925
|
+
|
|
926
|
+
// extract quantization and unshuffle
|
|
927
|
+
ushort8 pre_block = ((global ushort8 *)(&(b->qs[0])))[0];
|
|
928
|
+
ushort8 post_block = (ushort8)(0);
|
|
929
|
+
|
|
930
|
+
uchar * pre_block_ptr = (uchar *)(&pre_block);
|
|
931
|
+
uchar * post_block_ptr = (uchar *)(&post_block);
|
|
932
|
+
|
|
933
|
+
for (int i = 0; i < QK5_1 / 4; ++i) {
|
|
934
|
+
uchar x0 = pre_block_ptr[2*i + 0];
|
|
935
|
+
uchar x1 = pre_block_ptr[2*i + 1];
|
|
936
|
+
|
|
937
|
+
post_block_ptr[i + 0 ] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
|
|
938
|
+
post_block_ptr[i + QK5_1 / 4] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
uint4 q_block = as_uint4(post_block);
|
|
942
|
+
|
|
943
|
+
uint offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
|
|
944
|
+
dst_qs[offset] = q_block.x;
|
|
945
|
+
dst_qs[offset + ne01] = q_block.y;
|
|
946
|
+
dst_qs[offset + ne01 * 2] = q_block.z;
|
|
947
|
+
dst_qs[offset + ne01 * 3] = q_block.w;
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
kernel void kernel_restore_block_q5_1_trans4_ns(
|
|
951
|
+
__global uint * src_qs,
|
|
952
|
+
__global uint * src_qh,
|
|
953
|
+
__global half * src_d,
|
|
954
|
+
__global half * src_m,
|
|
955
|
+
__global struct block_q5_1 * dst0,
|
|
956
|
+
uint ne00,
|
|
957
|
+
uint ne01
|
|
958
|
+
) {
|
|
959
|
+
int i00 = get_global_id(1);
|
|
960
|
+
uint i01 = get_global_id(0);
|
|
961
|
+
uint i02 = get_global_id(2);
|
|
962
|
+
|
|
963
|
+
if (i01 >= ne01) {
|
|
964
|
+
return;
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
uint ne00_blk = ne00 / QK5_1;
|
|
968
|
+
uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
969
|
+
uint src_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
970
|
+
|
|
971
|
+
__global struct block_q5_1 * b = dst0 + dst_blk_offset;
|
|
972
|
+
b->d = src_d[src_blk_offset];
|
|
973
|
+
b->m = src_m[src_blk_offset];
|
|
974
|
+
|
|
975
|
+
((__global uint *)(&(b->qh[0])))[0] = src_qh[src_blk_offset];
|
|
976
|
+
|
|
977
|
+
// collect transposed quantization parts for a block
|
|
978
|
+
uint src_q_offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
|
|
979
|
+
uint4 q_block;
|
|
980
|
+
q_block.x = src_qs[src_q_offset];
|
|
981
|
+
q_block.y = src_qs[src_q_offset + ne01];
|
|
982
|
+
q_block.z = src_qs[src_q_offset + ne01 * 2];
|
|
983
|
+
q_block.w = src_qs[src_q_offset + ne01 * 3];
|
|
984
|
+
|
|
985
|
+
ushort8 post_block = as_ushort8(q_block);
|
|
986
|
+
ushort8 pre_block = (ushort8)(0);
|
|
987
|
+
|
|
988
|
+
uchar * pre_block_ptr = (uchar *)(&pre_block);
|
|
989
|
+
uchar * post_block_ptr = (uchar *)(&post_block);
|
|
990
|
+
|
|
991
|
+
for (int i = 0; i < QK5_1 / 4; ++i) {
|
|
992
|
+
uchar x0 = post_block_ptr[i + 0];
|
|
993
|
+
uchar x1 = post_block_ptr[i + QK5_1 / 4];
|
|
994
|
+
|
|
995
|
+
pre_block_ptr[2 * i + 0] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
|
|
996
|
+
pre_block_ptr[2 * i + 1] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
|
|
997
|
+
}
|
|
998
|
+
((__global ushort8 *)(&(b->qs[0])))[0] = pre_block;
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
kernel void kernel_convert_block_q4_k_trans4_ns(
|
|
1002
|
+
__global struct block_q4_K * src0,
|
|
1003
|
+
__global uint * dst_q,
|
|
1004
|
+
__global half * dst_d,
|
|
1005
|
+
__global half * dst_dm,
|
|
1006
|
+
__global uchar * dst_s,
|
|
1007
|
+
uint ne00,
|
|
1008
|
+
uint ne01,
|
|
1009
|
+
uchar mask_0F,
|
|
1010
|
+
uchar mask_F0
|
|
1011
|
+
) {
|
|
1012
|
+
uint i00 = get_global_id(1);
|
|
1013
|
+
uint i01 = get_global_id(0);
|
|
1014
|
+
uint i02 = get_global_id(2);
|
|
1015
|
+
|
|
1016
|
+
if (i01 >= ne01) {
|
|
1017
|
+
return;
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
uint ne00_blk = ne00 / QK_K;
|
|
1021
|
+
uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
1022
|
+
uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
1023
|
+
|
|
1024
|
+
__global struct block_q4_K * b = src0 + src_blk_offset;
|
|
1025
|
+
|
|
1026
|
+
dst_d [dst_blk_offset] = b->d;
|
|
1027
|
+
dst_dm[dst_blk_offset] = b->dm;
|
|
1028
|
+
|
|
1029
|
+
uint4 qv[8];
|
|
1030
|
+
uchar * qv_bytes = (uchar *)qv;
|
|
1031
|
+
for (int i = 0; i < QK_K / 64; ++i) {
|
|
1032
|
+
for (int j = 0; j < 16; ++j) {
|
|
1033
|
+
uchar x0 = b->q[i*32 + 2*j];
|
|
1034
|
+
uchar x1 = b->q[i*32 + 2*j + 1];
|
|
1035
|
+
|
|
1036
|
+
qv_bytes[i*32 + j ] = convert_uchar(x0 & mask_0F) | convert_uchar((x1 & mask_0F) << 4);
|
|
1037
|
+
qv_bytes[i*32 + j + 16] = convert_uchar((x0 & mask_F0) >> 4) | convert_uchar(x1 & mask_F0);
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
uint base = i02 * ne00_blk * ne01 * 32 + i00 * ne01 * 32 + i01;
|
|
1042
|
+
#pragma unroll
|
|
1043
|
+
for (int p = 0; p < 8; ++p) {
|
|
1044
|
+
uint4 v = qv[p];
|
|
1045
|
+
dst_q[base + (p * 4 + 0) * ne01] = v.x;
|
|
1046
|
+
dst_q[base + (p * 4 + 1) * ne01] = v.y;
|
|
1047
|
+
dst_q[base + (p * 4 + 2) * ne01] = v.z;
|
|
1048
|
+
dst_q[base + (p * 4 + 3) * ne01] = v.w;
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
__global uchar * s_dst = dst_s + (i02 * ne01 + i01) * ne00_blk * K_SCALE_SIZE + i00 * K_SCALE_SIZE;
|
|
1052
|
+
#pragma unroll
|
|
1053
|
+
for (int i = 0; i < K_SCALE_SIZE; ++i) {
|
|
1054
|
+
s_dst[i] = b->s[i];
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
kernel void kernel_restore_block_q4_k_trans4_ns(
|
|
1059
|
+
__global uint * src_q,
|
|
1060
|
+
__global half * src_d,
|
|
1061
|
+
__global half * src_dm,
|
|
1062
|
+
__global uchar * src_s,
|
|
1063
|
+
__global struct block_q4_K * dst0,
|
|
1064
|
+
uint ne00,
|
|
1065
|
+
uint ne01,
|
|
1066
|
+
uchar mask_0F,
|
|
1067
|
+
uchar mask_F0
|
|
1068
|
+
) {
|
|
1069
|
+
uint i00 = get_global_id(1); // block index along K
|
|
1070
|
+
uint i01 = get_global_id(0); // row index
|
|
1071
|
+
uint i02 = get_global_id(2); // batch index
|
|
1072
|
+
|
|
1073
|
+
if (i01 >= ne01) {
|
|
1074
|
+
return;
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
uint ne00_blk = ne00 / QK_K;
|
|
1078
|
+
|
|
1079
|
+
uint src_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
1080
|
+
uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
1081
|
+
|
|
1082
|
+
__global struct block_q4_K * b = dst0 + dst_blk_offset;
|
|
1083
|
+
|
|
1084
|
+
b->d = src_d[src_blk_offset];
|
|
1085
|
+
b->dm = src_dm[src_blk_offset];
|
|
1086
|
+
|
|
1087
|
+
__global uchar * s_src = src_s + (i02 * ne01 + i01) * ne00_blk * K_SCALE_SIZE + i00 * K_SCALE_SIZE;
|
|
1088
|
+
for (int i = 0; i < K_SCALE_SIZE; ++i) {
|
|
1089
|
+
b->s[i] = s_src[i];
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
uint base = i02 * ne00_blk * ne01 * 32 + i00 * ne01 * 32 + i01;
|
|
1093
|
+
|
|
1094
|
+
uint4 qv[8];
|
|
1095
|
+
for (int p = 0; p < 8; ++p) {
|
|
1096
|
+
qv[p].x = src_q[base + (p * 4 + 0) * ne01];
|
|
1097
|
+
qv[p].y = src_q[base + (p * 4 + 1) * ne01];
|
|
1098
|
+
qv[p].z = src_q[base + (p * 4 + 2) * ne01];
|
|
1099
|
+
qv[p].w = src_q[base + (p * 4 + 3) * ne01];
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
uchar * qv_bytes = (uchar *)qv;
|
|
1103
|
+
for (int i = 0; i < QK_K / 64; ++i) {
|
|
1104
|
+
for (int j = 0; j < 16; ++j) {
|
|
1105
|
+
uchar lo = qv_bytes[i*32 + j];
|
|
1106
|
+
uchar hi = qv_bytes[i*32 + j + 16];
|
|
1107
|
+
b->q[i*32 + 2*j] = convert_uchar((lo & mask_0F) | ((hi & mask_0F) << 4));
|
|
1108
|
+
b->q[i*32 + 2*j + 1] = convert_uchar(((lo & mask_F0) >> 4) | (hi & mask_F0));
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
kernel void kernel_convert_block_q5_k_trans4_ns(
|
|
1114
|
+
__global struct block_q5_K * src0,
|
|
1115
|
+
__global uint * dst_qs,
|
|
1116
|
+
__global uint * dst_qh,
|
|
1117
|
+
__global half * dst_d,
|
|
1118
|
+
__global half * dst_dm,
|
|
1119
|
+
__global uchar * dst_s,
|
|
1120
|
+
uint ne00,
|
|
1121
|
+
uint ne01,
|
|
1122
|
+
uchar mask_0F,
|
|
1123
|
+
uchar mask_F0
|
|
1124
|
+
) {
|
|
1125
|
+
uint i00 = get_global_id(1);
|
|
1126
|
+
uint i01 = get_global_id(0);
|
|
1127
|
+
uint i02 = get_global_id(2);
|
|
1128
|
+
|
|
1129
|
+
if (i01 >= ne01) {
|
|
1130
|
+
return;
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
uint ne00_blk = ne00 / QK_K;
|
|
1134
|
+
uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
1135
|
+
uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
1136
|
+
|
|
1137
|
+
__global struct block_q5_K * b = src0 + src_blk_offset;
|
|
1138
|
+
|
|
1139
|
+
dst_d [dst_blk_offset] = b->d;
|
|
1140
|
+
dst_dm[dst_blk_offset] = b->dm;
|
|
1141
|
+
|
|
1142
|
+
for (int k = 0; k < 8; k++) {
|
|
1143
|
+
uchar b0 = 0, b1 = 0, b2 = 0, b3 = 0;
|
|
1144
|
+
for (int bit = 0; bit < 8; bit++) {
|
|
1145
|
+
b0 |= (uchar)(((b->qh[bit] >> k) & 1) << bit);
|
|
1146
|
+
b1 |= (uchar)(((b->qh[8 + bit] >> k) & 1) << bit);
|
|
1147
|
+
b2 |= (uchar)(((b->qh[16 + bit] >> k) & 1) << bit);
|
|
1148
|
+
b3 |= (uchar)(((b->qh[24 + bit] >> k) & 1) << bit);
|
|
1149
|
+
}
|
|
1150
|
+
uint packed = (uint)b0 | ((uint)b1 << 8) | ((uint)b2 << 16) | ((uint)b3 << 24);
|
|
1151
|
+
dst_qh[i01 + (i00 * 8 + k) * ne01 + i02 * ne00_blk * 8 * ne01] = packed;
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1154
|
+
uint4 qv[8];
|
|
1155
|
+
uchar * qv_bytes = (uchar *)qv;
|
|
1156
|
+
for (int i = 0; i < QK_K / 64; ++i) {
|
|
1157
|
+
for (int j = 0; j < 16; ++j) {
|
|
1158
|
+
uchar x0 = b->qs[i*32 + 2*j];
|
|
1159
|
+
uchar x1 = b->qs[i*32 + 2*j + 1];
|
|
1160
|
+
|
|
1161
|
+
qv_bytes[i*32 + j ] = convert_uchar(x0 & mask_0F) | convert_uchar((x1 & mask_0F) << 4);
|
|
1162
|
+
qv_bytes[i*32 + j + 16] = convert_uchar((x0 & mask_F0) >> 4) | convert_uchar(x1 & mask_F0);
|
|
1163
|
+
}
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
uint base = i02 * ne00_blk * ne01 * 32 + i00 * ne01 * 32 + i01;
|
|
1167
|
+
#pragma unroll
|
|
1168
|
+
for (int p = 0; p < 8; ++p) {
|
|
1169
|
+
uint4 v = qv[p];
|
|
1170
|
+
dst_qs[base + (p * 4 + 0) * ne01] = v.x;
|
|
1171
|
+
dst_qs[base + (p * 4 + 1) * ne01] = v.y;
|
|
1172
|
+
dst_qs[base + (p * 4 + 2) * ne01] = v.z;
|
|
1173
|
+
dst_qs[base + (p * 4 + 3) * ne01] = v.w;
|
|
1174
|
+
}
|
|
1175
|
+
|
|
1176
|
+
__global uchar * s_dst = dst_s + (i02 * ne01 + i01) * ne00_blk * K_SCALE_SIZE + i00 * K_SCALE_SIZE;
|
|
1177
|
+
#pragma unroll
|
|
1178
|
+
for (int i = 0; i < K_SCALE_SIZE; ++i) {
|
|
1179
|
+
s_dst[i] = b->s[i];
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
kernel void kernel_restore_block_q5_k_trans4_ns(
|
|
1184
|
+
__global uint * src_qs,
|
|
1185
|
+
__global uint * src_qh,
|
|
1186
|
+
__global half * src_d,
|
|
1187
|
+
__global half * src_dm,
|
|
1188
|
+
__global uchar * src_s,
|
|
1189
|
+
__global struct block_q5_K * dst0,
|
|
1190
|
+
uint ne00,
|
|
1191
|
+
uint ne01,
|
|
1192
|
+
uchar mask_0F,
|
|
1193
|
+
uchar mask_F0
|
|
1194
|
+
) {
|
|
1195
|
+
uint i00 = get_global_id(1); // block index along K
|
|
1196
|
+
uint i01 = get_global_id(0); // row index
|
|
1197
|
+
uint i02 = get_global_id(2); // batch index
|
|
1198
|
+
|
|
1199
|
+
if (i01 >= ne01) {
|
|
1200
|
+
return;
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1203
|
+
uint ne00_blk = ne00 / QK_K;
|
|
1204
|
+
|
|
1205
|
+
uint src_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
1206
|
+
uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
1207
|
+
|
|
1208
|
+
__global struct block_q5_K * b = dst0 + dst_blk_offset;
|
|
1209
|
+
|
|
1210
|
+
b->d = src_d[src_blk_offset];
|
|
1211
|
+
b->dm = src_dm[src_blk_offset];
|
|
1212
|
+
|
|
1213
|
+
for (int j = 0; j < 32; j++) b->qh[j] = 0;
|
|
1214
|
+
for (int k = 0; k < 8; k++) {
|
|
1215
|
+
uint packed = src_qh[i01 + (i00 * 8 + k) * ne01 + i02 * ne00_blk * 8 * ne01];
|
|
1216
|
+
uchar b0 = (uchar)(packed & 0xFF);
|
|
1217
|
+
uchar b1 = (uchar)((packed >> 8) & 0xFF);
|
|
1218
|
+
uchar b2 = (uchar)((packed >> 16) & 0xFF);
|
|
1219
|
+
uchar b3 = (uchar)((packed >> 24) & 0xFF);
|
|
1220
|
+
for (int bit = 0; bit < 8; bit++) {
|
|
1221
|
+
b->qh[bit] |= (uchar)(((b0 >> bit) & 1) << k);
|
|
1222
|
+
b->qh[8 + bit] |= (uchar)(((b1 >> bit) & 1) << k);
|
|
1223
|
+
b->qh[16 + bit] |= (uchar)(((b2 >> bit) & 1) << k);
|
|
1224
|
+
b->qh[24 + bit] |= (uchar)(((b3 >> bit) & 1) << k);
|
|
1225
|
+
}
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
__global uchar * s_src = src_s + (i02 * ne01 + i01) * ne00_blk * K_SCALE_SIZE + i00 * K_SCALE_SIZE;
|
|
1229
|
+
for (int i = 0; i < K_SCALE_SIZE; ++i) {
|
|
1230
|
+
b->s[i] = s_src[i];
|
|
1231
|
+
}
|
|
1232
|
+
|
|
1233
|
+
uint base = i02 * ne00_blk * ne01 * 32 + i00 * ne01 * 32 + i01;
|
|
1234
|
+
|
|
1235
|
+
uint4 qv[8];
|
|
1236
|
+
for (int p = 0; p < 8; ++p) {
|
|
1237
|
+
qv[p].x = src_qs[base + (p * 4 + 0) * ne01];
|
|
1238
|
+
qv[p].y = src_qs[base + (p * 4 + 1) * ne01];
|
|
1239
|
+
qv[p].z = src_qs[base + (p * 4 + 2) * ne01];
|
|
1240
|
+
qv[p].w = src_qs[base + (p * 4 + 3) * ne01];
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
uchar * qv_bytes = (uchar *)qv;
|
|
1244
|
+
for (int i = 0; i < QK_K / 64; ++i) {
|
|
1245
|
+
for (int j = 0; j < 16; ++j) {
|
|
1246
|
+
uchar lo = qv_bytes[i*32 + j];
|
|
1247
|
+
uchar hi = qv_bytes[i*32 + j + 16];
|
|
1248
|
+
b->qs[i*32 + 2*j] = convert_uchar((lo & mask_0F) | ((hi & mask_0F) << 4));
|
|
1249
|
+
b->qs[i*32 + 2*j + 1] = convert_uchar(((lo & mask_F0) >> 4) | (hi & mask_F0));
|
|
1250
|
+
}
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
1253
|
+
|
|
1254
|
+
kernel void kernel_convert_block_q6_k_trans4_ns(
|
|
1255
|
+
__global struct block_q6_K * src0,
|
|
1256
|
+
__global uint * dst_ql,
|
|
1257
|
+
__global uint * dst_qh,
|
|
1258
|
+
__global half * dst_d,
|
|
1259
|
+
__global char * dst_s,
|
|
1260
|
+
uint ne00,
|
|
1261
|
+
uint ne01,
|
|
1262
|
+
uchar mask_0F,
|
|
1263
|
+
uchar mask_F0
|
|
1264
|
+
) {
|
|
1265
|
+
uint i00 = get_global_id(1);
|
|
1266
|
+
uint i01 = get_global_id(0);
|
|
1267
|
+
uint i02 = get_global_id(2);
|
|
1268
|
+
|
|
1269
|
+
if (i01 >= ne01) {
|
|
1270
|
+
return;
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
uint ne00_blk = ne00 / QK_K;
|
|
1274
|
+
|
|
1275
|
+
uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
1276
|
+
uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
1277
|
+
|
|
1278
|
+
__global struct block_q6_K * b = src0 + src_blk_offset;
|
|
1279
|
+
|
|
1280
|
+
dst_d[dst_blk_offset] = b->d;
|
|
1281
|
+
|
|
1282
|
+
uint4 qlv[8];
|
|
1283
|
+
uchar * qlv_bytes = (uchar *)qlv;
|
|
1284
|
+
for (int i = 0; i < 2; ++i) {
|
|
1285
|
+
for (int j = 0; j < 16; ++j) {
|
|
1286
|
+
uchar x0 = b->ql[i*64 + 2*j];
|
|
1287
|
+
uchar x1 = b->ql[i*64 + 2*j + 1];
|
|
1288
|
+
uchar x2 = b->ql[i*64 + 32 + 2*j];
|
|
1289
|
+
uchar x3 = b->ql[i*64 + 32 + 2*j + 1];
|
|
1290
|
+
qlv_bytes[i*64 + j ] = convert_uchar(x0 & mask_0F) | convert_uchar((x1 & mask_0F) << 4);
|
|
1291
|
+
qlv_bytes[i*64 + j + 16] = convert_uchar(x2 & mask_0F) | convert_uchar((x3 & mask_0F) << 4);
|
|
1292
|
+
qlv_bytes[i*64 + j + 32] = convert_uchar((x0 & mask_F0) >> 4) | convert_uchar(x1 & mask_F0);
|
|
1293
|
+
qlv_bytes[i*64 + j + 48] = convert_uchar((x2 & mask_F0) >> 4) | convert_uchar(x3 & mask_F0);
|
|
1294
|
+
}
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
uint ql_base = i02 * ne00_blk * ne01 * 32 + i00 * ne01 * 32 + i01;
|
|
1298
|
+
|
|
1299
|
+
#pragma unroll
|
|
1300
|
+
for (int p = 0; p < 8; ++p) {
|
|
1301
|
+
uint4 v = qlv[p];
|
|
1302
|
+
dst_ql[ql_base + (p * 4 + 0) * ne01] = v.x;
|
|
1303
|
+
dst_ql[ql_base + (p * 4 + 1) * ne01] = v.y;
|
|
1304
|
+
dst_ql[ql_base + (p * 4 + 2) * ne01] = v.z;
|
|
1305
|
+
dst_ql[ql_base + (p * 4 + 3) * ne01] = v.w;
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
uint qhv[16] = {0};
|
|
1309
|
+
|
|
1310
|
+
for (int n = 0; n < 2; ++n) {
|
|
1311
|
+
for (int l = 0; l < 32; ++l) {
|
|
1312
|
+
uchar h = b->qh[n*32 + l];
|
|
1313
|
+
int u = l / 16;
|
|
1314
|
+
int bit_pos = (l % 16) * 2;
|
|
1315
|
+
qhv[(n*4 + 0)*2 + u] |= ((uint)((h >> 0) & 0x03)) << bit_pos;
|
|
1316
|
+
qhv[(n*4 + 1)*2 + u] |= ((uint)((h >> 2) & 0x03)) << bit_pos;
|
|
1317
|
+
qhv[(n*4 + 2)*2 + u] |= ((uint)((h >> 4) & 0x03)) << bit_pos;
|
|
1318
|
+
qhv[(n*4 + 3)*2 + u] |= ((uint)((h >> 6) & 0x03)) << bit_pos;
|
|
1319
|
+
}
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
uint qh_base = i02 * ne00_blk * ne01 * 16 + i00 * ne01 * 16 + i01;
|
|
1323
|
+
|
|
1324
|
+
for (int p = 0; p < 16; ++p) {
|
|
1325
|
+
dst_qh[qh_base + p * ne01] = qhv[p];
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1328
|
+
__global char * s_dst = dst_s + (i02 * ne01 + i01) * ne00_blk * 16 + i00 * 16;
|
|
1329
|
+
#pragma unroll
|
|
1330
|
+
for (int i = 0; i < 16; ++i) {
|
|
1331
|
+
s_dst[i] = b->scales[i];
|
|
1332
|
+
}
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1335
|
+
kernel void kernel_restore_block_q6_k_trans4_ns(
|
|
1336
|
+
__global uint * src_ql,
|
|
1337
|
+
__global uint * src_qh,
|
|
1338
|
+
__global half * src_d,
|
|
1339
|
+
__global char * src_s,
|
|
1340
|
+
__global struct block_q6_K * dst0,
|
|
1341
|
+
uint ne00,
|
|
1342
|
+
uint ne01,
|
|
1343
|
+
uchar mask_0F,
|
|
1344
|
+
uchar mask_F0
|
|
1345
|
+
) {
|
|
1346
|
+
uint i00 = get_global_id(1); // block index along K
|
|
1347
|
+
uint i01 = get_global_id(0); // row index
|
|
1348
|
+
uint i02 = get_global_id(2); // batch index
|
|
1349
|
+
|
|
1350
|
+
if (i01 >= ne01) {
|
|
1351
|
+
return;
|
|
1352
|
+
}
|
|
1353
|
+
|
|
1354
|
+
uint ne00_blk = ne00 / QK_K;
|
|
1355
|
+
|
|
1356
|
+
uint src_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
1357
|
+
uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
1358
|
+
|
|
1359
|
+
__global struct block_q6_K * b = dst0 + dst_blk_offset;
|
|
1360
|
+
|
|
1361
|
+
b->d = src_d[src_blk_offset];
|
|
1362
|
+
|
|
1363
|
+
uint ql_base = i02 * ne00_blk * ne01 * 32 + i00 * ne01 * 32 + i01;
|
|
1364
|
+
uint4 qlv[8];
|
|
1365
|
+
for (int p = 0; p < 8; ++p) {
|
|
1366
|
+
qlv[p].x = src_ql[ql_base + (p * 4 + 0) * ne01];
|
|
1367
|
+
qlv[p].y = src_ql[ql_base + (p * 4 + 1) * ne01];
|
|
1368
|
+
qlv[p].z = src_ql[ql_base + (p * 4 + 2) * ne01];
|
|
1369
|
+
qlv[p].w = src_ql[ql_base + (p * 4 + 3) * ne01];
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
uchar * qlv_bytes = (uchar *)qlv;
|
|
1373
|
+
for (int i = 0; i < 2; ++i) {
|
|
1374
|
+
for (int j = 0; j < 16; ++j) {
|
|
1375
|
+
uchar lo_02 = qlv_bytes[i*64 + j];
|
|
1376
|
+
uchar lo_13 = qlv_bytes[i*64 + j + 16];
|
|
1377
|
+
uchar hi_02 = qlv_bytes[i*64 + j + 32];
|
|
1378
|
+
uchar hi_13 = qlv_bytes[i*64 + j + 48];
|
|
1379
|
+
b->ql[i*64 + 2*j] = convert_uchar((lo_02 & mask_0F) | ((hi_02 & mask_0F) << 4));
|
|
1380
|
+
b->ql[i*64 + 2*j + 1] = convert_uchar(((lo_02 & mask_F0) >> 4) | (hi_02 & mask_F0));
|
|
1381
|
+
b->ql[i*64 + 32 + 2*j] = convert_uchar((lo_13 & mask_0F) | ((hi_13 & mask_0F) << 4));
|
|
1382
|
+
b->ql[i*64 + 32 + 2*j + 1] = convert_uchar(((lo_13 & mask_F0) >> 4) | (hi_13 & mask_F0));
|
|
1383
|
+
}
|
|
1384
|
+
}
|
|
1385
|
+
|
|
1386
|
+
uint qh_base = i02 * ne00_blk * ne01 * 16 + i00 * ne01 * 16 + i01;
|
|
1387
|
+
uint qhv[16];
|
|
1388
|
+
for (int p = 0; p < 16; ++p) {
|
|
1389
|
+
qhv[p] = src_qh[qh_base + p * ne01];
|
|
1390
|
+
}
|
|
1391
|
+
|
|
1392
|
+
for (int n = 0; n < 2; ++n) {
|
|
1393
|
+
for (int l = 0; l < 32; ++l) {
|
|
1394
|
+
int u = l / 16;
|
|
1395
|
+
int bit_pos = (l % 16) * 2;
|
|
1396
|
+
uchar v0 = (uchar)((qhv[(n*4 + 0)*2 + u] >> bit_pos) & 0x03);
|
|
1397
|
+
uchar v1 = (uchar)((qhv[(n*4 + 1)*2 + u] >> bit_pos) & 0x03);
|
|
1398
|
+
uchar v2 = (uchar)((qhv[(n*4 + 2)*2 + u] >> bit_pos) & 0x03);
|
|
1399
|
+
uchar v3 = (uchar)((qhv[(n*4 + 3)*2 + u] >> bit_pos) & 0x03);
|
|
1400
|
+
b->qh[n*32 + l] = v0 | (v1 << 2) | (v2 << 4) | (v3 << 6);
|
|
1401
|
+
}
|
|
1402
|
+
}
|
|
1403
|
+
|
|
1404
|
+
__global char * s_src = src_s + (i02 * ne01 + i01) * ne00_blk * 16 + i00 * 16;
|
|
1405
|
+
for (int i = 0; i < 16; ++i) {
|
|
1406
|
+
b->scales[i] = s_src[i];
|
|
1407
|
+
}
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
//------------------------------------------------------------------------------
|
|
1411
|
+
// block_mxfp4
|
|
1412
|
+
//------------------------------------------------------------------------------
|
|
1413
|
+
#define QK_MXFP4 32
|
|
1414
|
+
struct block_mxfp4 {
|
|
1415
|
+
uchar e; // E8M0
|
|
1416
|
+
uchar qs[QK_MXFP4 / 2];
|
|
1417
|
+
};
|
|
1418
|
+
|
|
1419
|
+
//------------------------------------------------------------------------------
|
|
1420
|
+
// kernel_convert_block_mxfp4
|
|
1421
|
+
// Convert the block_mxfp4 format to 2 separate arrays (AOS -> SOA).
|
|
1422
|
+
// This kernel does not deshuffle the bits.
|
|
1423
|
+
//------------------------------------------------------------------------------
|
|
1424
|
+
kernel void kernel_convert_block_mxfp4(
|
|
1425
|
+
global struct block_mxfp4 * src0,
|
|
1426
|
+
global uchar * dst_q,
|
|
1427
|
+
global uchar * dst_e
|
|
1428
|
+
) {
|
|
1429
|
+
global struct block_mxfp4 * b = (global struct block_mxfp4 *) src0 + get_global_id(0);
|
|
1430
|
+
global uchar * q = (global uchar *) dst_q + QK_MXFP4 / 2 * get_global_id(0);
|
|
1431
|
+
global uchar * e = (global uchar *) dst_e + get_global_id(0);
|
|
1432
|
+
|
|
1433
|
+
*e = b->e;
|
|
1434
|
+
|
|
1435
|
+
for (int i = 0; i < QK_MXFP4 / 2; ++i) {
|
|
1436
|
+
q[i] = b->qs[i];
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
kernel void kernel_convert_block_mxfp4_trans(
|
|
1441
|
+
global struct block_mxfp4 * src0,
|
|
1442
|
+
__global uint4 * dst_q,
|
|
1443
|
+
__global uchar * dst_e,
|
|
1444
|
+
uint ne00,
|
|
1445
|
+
uint ne01
|
|
1446
|
+
) {
|
|
1447
|
+
int i00 = get_global_id(1);
|
|
1448
|
+
uint i01 = get_global_id(0);
|
|
1449
|
+
uint i02 = get_global_id(2);
|
|
1450
|
+
|
|
1451
|
+
uint ne00_blk = ne00 / QK_MXFP4;
|
|
1452
|
+
uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
1453
|
+
uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
1454
|
+
|
|
1455
|
+
global struct block_mxfp4 * b = src0 + src_blk_offset;
|
|
1456
|
+
|
|
1457
|
+
dst_q[dst_blk_offset] = ((global uint4 *)(&(b->qs[0])))[0];
|
|
1458
|
+
dst_e[dst_blk_offset] = b->e;
|
|
1459
|
+
}
|
|
1460
|
+
|
|
1461
|
+
kernel void kernel_restore_block_mxfp4(
|
|
1462
|
+
global uchar * src_q,
|
|
1463
|
+
global half * src_e,
|
|
1464
|
+
global struct block_mxfp4 * dst
|
|
1465
|
+
) {
|
|
1466
|
+
global struct block_mxfp4 * b = (global struct block_mxfp4 *) dst + get_global_id(0);
|
|
1467
|
+
global uchar * q = (global uchar *) src_q + QK_MXFP4 / 2 * get_global_id(0);
|
|
1468
|
+
global uchar * e = (global uchar *) src_e + get_global_id(0);
|
|
1469
|
+
|
|
1470
|
+
b->e = *e;
|
|
1471
|
+
for (int i = 0; i < QK_MXFP4 / 2; ++i) {
|
|
1472
|
+
b->qs[i] = q[i];
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1476
|
+
kernel void kernel_restore_block_mxfp4_trans(
|
|
1477
|
+
__global uint4 * src_q,
|
|
1478
|
+
__global uchar * src_e,
|
|
1479
|
+
global struct block_mxfp4 * dst,
|
|
1480
|
+
uint ne00,
|
|
1481
|
+
uint ne01
|
|
1482
|
+
) {
|
|
1483
|
+
int i00 = get_global_id(1);
|
|
1484
|
+
uint i01 = get_global_id(0);
|
|
1485
|
+
uint i02 = get_global_id(2);
|
|
1486
|
+
|
|
1487
|
+
uint ne00_blk = ne00 / QK_MXFP4;
|
|
1488
|
+
uint src_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
1489
|
+
uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
1490
|
+
|
|
1491
|
+
global struct block_mxfp4 * b = dst + dst_blk_offset;
|
|
1492
|
+
|
|
1493
|
+
((global uint4 *)(&(b->qs[0])))[0] = src_q[src_blk_offset];
|
|
1494
|
+
b->e = src_e[src_blk_offset];
|
|
1495
|
+
}
|
|
1496
|
+
|
|
1497
|
+
kernel void kernel_convert_block_mxfp4_trans4_ns(
|
|
1498
|
+
global struct block_mxfp4 * src0,
|
|
1499
|
+
__global uint * dst_q,
|
|
1500
|
+
__global uchar * dst_e,
|
|
1501
|
+
uint ne00,
|
|
1502
|
+
uint ne01
|
|
1503
|
+
) {
|
|
1504
|
+
uint i00 = get_global_id(1);
|
|
1505
|
+
uint i01 = get_global_id(0);
|
|
1506
|
+
uint i02 = get_global_id(2);
|
|
1507
|
+
|
|
1508
|
+
if (i01 >= ne01) {
|
|
1509
|
+
return;
|
|
1510
|
+
}
|
|
1511
|
+
|
|
1512
|
+
uint ne00_blk = ne00 / QK_MXFP4;
|
|
1513
|
+
uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
1514
|
+
uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
1515
|
+
|
|
1516
|
+
global struct block_mxfp4 * b = src0 + src_blk_offset;
|
|
1517
|
+
dst_e[dst_blk_offset] = b->e;
|
|
1518
|
+
|
|
1519
|
+
// extract quantization and unshuffle
|
|
1520
|
+
ushort8 pre_block = ((global ushort8 *)(&(b->qs[0])))[0];
|
|
1521
|
+
|
|
1522
|
+
ushort8 post_block = (ushort8)(0);
|
|
1523
|
+
|
|
1524
|
+
uchar * pre_block_ptr = (uchar *)(&pre_block);
|
|
1525
|
+
uchar * post_block_ptr = (uchar *)(&post_block);
|
|
1526
|
+
|
|
1527
|
+
for (int i = 0; i < QK_MXFP4 / 4; ++i) {
|
|
1528
|
+
uchar x0 = pre_block_ptr[2*i + 0];
|
|
1529
|
+
uchar x1 = pre_block_ptr[2*i + 1];
|
|
1530
|
+
|
|
1531
|
+
post_block_ptr[i + 0 ] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
|
|
1532
|
+
post_block_ptr[i + QK_MXFP4 / 4] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
|
|
1533
|
+
}
|
|
1534
|
+
|
|
1535
|
+
uint4 q_block = as_uint4(post_block);
|
|
1536
|
+
|
|
1537
|
+
uint offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
|
|
1538
|
+
dst_q[offset] = q_block.x;
|
|
1539
|
+
dst_q[offset + ne01] = q_block.y;
|
|
1540
|
+
dst_q[offset + ne01 * 2] = q_block.z;
|
|
1541
|
+
dst_q[offset + ne01 * 3] = q_block.w;
|
|
1542
|
+
}
|
|
1543
|
+
|
|
1544
|
+
kernel void kernel_restore_block_mxfp4_trans4_ns(
|
|
1545
|
+
__global uint * src_q,
|
|
1546
|
+
__global uchar * src_e,
|
|
1547
|
+
__global struct block_mxfp4 * dst0,
|
|
1548
|
+
uint ne00,
|
|
1549
|
+
uint ne01
|
|
1550
|
+
) {
|
|
1551
|
+
uint i00 = get_global_id(1);
|
|
1552
|
+
uint i01 = get_global_id(0);
|
|
1553
|
+
uint i02 = get_global_id(2);
|
|
1554
|
+
|
|
1555
|
+
if (i01 >= ne01) {
|
|
1556
|
+
return;
|
|
1557
|
+
}
|
|
1558
|
+
|
|
1559
|
+
uint ne00_blk = ne00 / QK_MXFP4;
|
|
1560
|
+
uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
|
|
1561
|
+
uint src_d_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
|
|
1562
|
+
|
|
1563
|
+
__global struct block_mxfp4 * b = dst0 + dst_blk_offset;
|
|
1564
|
+
b->e = src_e[src_d_offset];
|
|
1565
|
+
|
|
1566
|
+
// collect transposed quantization parts for a block
|
|
1567
|
+
uint src_q_offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
|
|
1568
|
+
uint4 q_block;
|
|
1569
|
+
q_block.x = src_q[src_q_offset];
|
|
1570
|
+
q_block.y = src_q[src_q_offset + ne01];
|
|
1571
|
+
q_block.z = src_q[src_q_offset + ne01 * 2];
|
|
1572
|
+
q_block.w = src_q[src_q_offset + ne01 * 3];
|
|
1573
|
+
|
|
1574
|
+
ushort8 post_block = as_ushort8(q_block);
|
|
1575
|
+
ushort8 pre_block = (ushort8)(0);
|
|
1576
|
+
|
|
1577
|
+
uchar * pre_block_ptr = (uchar *)(&pre_block);
|
|
1578
|
+
uchar * post_block_ptr = (uchar *)(&post_block);
|
|
1579
|
+
|
|
1580
|
+
for (int i = 0; i < QK_MXFP4 / 4; ++i) {
|
|
1581
|
+
uchar x0 = post_block_ptr[i + 0];
|
|
1582
|
+
uchar x1 = post_block_ptr[i + QK_MXFP4 / 4];
|
|
1583
|
+
|
|
1584
|
+
pre_block_ptr[2 * i + 0] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
|
|
1585
|
+
pre_block_ptr[2 * i + 1] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
((__global ushort8 *)(&(b->qs[0])))[0] = pre_block;
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1591
|
+
|
|
1592
|
+
//------------------------------------------------------------------------------
|
|
1593
|
+
// block_q8_0
|
|
1594
|
+
//------------------------------------------------------------------------------
|
|
1595
|
+
typedef struct {
|
|
1596
|
+
half d; // delta
|
|
1597
|
+
char qs[QK8_0]; // quants
|
|
1598
|
+
} block_q8_0;
|
|
1599
|
+
|
|
1600
|
+
kernel void kernel_convert_block_q8_0(
|
|
1601
|
+
global block_q8_0 * src0,
|
|
1602
|
+
global uchar * dst_q,
|
|
1603
|
+
global half * dst_d
|
|
1604
|
+
) {
|
|
1605
|
+
global block_q8_0 * b = (global block_q8_0 *) src0 + get_global_id(0);
|
|
1606
|
+
global uchar * q = (global uchar *) dst_q + QK8_0*get_global_id(0);
|
|
1607
|
+
global half * d = (global half *) dst_d + get_global_id(0);
|
|
1608
|
+
|
|
1609
|
+
*d = b->d;
|
|
1610
|
+
|
|
1611
|
+
for (int i = 0; i < QK8_0; ++i) {
|
|
1612
|
+
q[i] = b->qs[i];
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1616
|
+
kernel void kernel_restore_block_q8_0(
|
|
1617
|
+
global uchar * src_q,
|
|
1618
|
+
global half * src_d,
|
|
1619
|
+
global block_q8_0 * dst
|
|
1620
|
+
) {
|
|
1621
|
+
global block_q8_0 * b = (global block_q8_0 *) dst + get_global_id(0);
|
|
1622
|
+
global uchar * q = (global uchar *) src_q + QK8_0*get_global_id(0);
|
|
1623
|
+
global half * d = (global half *) src_d + get_global_id(0);
|
|
1624
|
+
|
|
1625
|
+
b->d = *d;
|
|
1626
|
+
for (int i = 0; i < QK8_0; ++i) {
|
|
1627
|
+
b->qs[i] = q[i];
|
|
1628
|
+
}
|
|
1629
|
+
}
|
|
1630
|
+
|
|
1631
|
+
// View-aware AoS q8_0 -> f32 dequant (f32/f32 FA path).
|
|
1632
|
+
kernel void kernel_dequant_q8_0_f32_view_aos(
|
|
1633
|
+
global char * src,
|
|
1634
|
+
ulong src_offset,
|
|
1635
|
+
ulong src_nb1,
|
|
1636
|
+
ulong src_nb2,
|
|
1637
|
+
ulong src_nb3,
|
|
1638
|
+
int nblk0,
|
|
1639
|
+
int ne1,
|
|
1640
|
+
int ne2,
|
|
1641
|
+
int ne3,
|
|
1642
|
+
global float * dst
|
|
1643
|
+
) {
|
|
1644
|
+
int blk_i0 = get_global_id(0);
|
|
1645
|
+
int i1 = get_global_id(1);
|
|
1646
|
+
int batch = get_global_id(2);
|
|
1647
|
+
|
|
1648
|
+
if (blk_i0 >= nblk0) return;
|
|
1649
|
+
if (i1 >= ne1) return;
|
|
1650
|
+
|
|
1651
|
+
int i2 = batch % ne2;
|
|
1652
|
+
int i3 = batch / ne2;
|
|
1653
|
+
if (i3 >= ne3) return;
|
|
1654
|
+
|
|
1655
|
+
global char * block = src + src_offset + (ulong)i3*src_nb3 + (ulong)i2*src_nb2 + (ulong)i1*src_nb1 + (ulong)blk_i0 * (2 + QK8_0);
|
|
1656
|
+
float d = vload_half(0, (global half *)block);
|
|
1657
|
+
global char * qs = block + 2;
|
|
1658
|
+
|
|
1659
|
+
ulong dst_row_base = ((ulong)i3 * ne2 * ne1 + (ulong)i2 * ne1 + (ulong)i1) * nblk0;
|
|
1660
|
+
global float * out = dst + (dst_row_base + blk_i0) * QK8_0;
|
|
1661
|
+
|
|
1662
|
+
for (int i = 0; i < QK8_0; ++i) {
|
|
1663
|
+
out[i] = d * (float)qs[i];
|
|
1664
|
+
}
|
|
1665
|
+
}
|
|
1666
|
+
|
|
1667
|
+
// View-aware AoS q8_0 -> f16 dequant. Rows tight, batch strides may be gapped.
|
|
1668
|
+
kernel void kernel_dequant_q8_0_f16_view_aos(
|
|
1669
|
+
global char * src,
|
|
1670
|
+
ulong src_offset,
|
|
1671
|
+
ulong src_nb1,
|
|
1672
|
+
ulong src_nb2,
|
|
1673
|
+
ulong src_nb3,
|
|
1674
|
+
int nblk0,
|
|
1675
|
+
int ne1,
|
|
1676
|
+
int ne2,
|
|
1677
|
+
int ne3,
|
|
1678
|
+
global half * dst
|
|
1679
|
+
) {
|
|
1680
|
+
int blk_i0 = get_global_id(0);
|
|
1681
|
+
int i1 = get_global_id(1);
|
|
1682
|
+
int batch = get_global_id(2);
|
|
1683
|
+
|
|
1684
|
+
if (blk_i0 >= nblk0) return;
|
|
1685
|
+
if (i1 >= ne1) return;
|
|
1686
|
+
|
|
1687
|
+
int i2 = batch % ne2;
|
|
1688
|
+
int i3 = batch / ne2;
|
|
1689
|
+
if (i3 >= ne3) return;
|
|
1690
|
+
|
|
1691
|
+
global char * block = src + src_offset + (ulong)i3*src_nb3 + (ulong)i2*src_nb2 + (ulong)i1*src_nb1 + (ulong)blk_i0 * (2 + QK8_0);
|
|
1692
|
+
float d = vload_half(0, (global half *)block);
|
|
1693
|
+
global char * qs = block + 2;
|
|
1694
|
+
|
|
1695
|
+
ulong dst_row_base = ((ulong)i3 * ne2 * ne1 + (ulong)i2 * ne1 + (ulong)i1) * nblk0;
|
|
1696
|
+
global half * out = dst + (dst_row_base + blk_i0) * QK8_0;
|
|
1697
|
+
|
|
1698
|
+
for (int i = 0; i < QK8_0; ++i) {
|
|
1699
|
+
out[i] = (half)(d * (float)qs[i]);
|
|
1700
|
+
}
|
|
1701
|
+
}
|
|
1702
|
+
|
|
1703
|
+
// View-aware AoS q4_0 -> f32 dequant (mirrors the q8_0 view variant).
|
|
1704
|
+
kernel void kernel_dequant_q4_0_f32_view_aos(
|
|
1705
|
+
global char * src,
|
|
1706
|
+
ulong src_offset,
|
|
1707
|
+
ulong src_nb1,
|
|
1708
|
+
ulong src_nb2,
|
|
1709
|
+
ulong src_nb3,
|
|
1710
|
+
int nblk0,
|
|
1711
|
+
int ne1,
|
|
1712
|
+
int ne2,
|
|
1713
|
+
int ne3,
|
|
1714
|
+
global float * dst
|
|
1715
|
+
) {
|
|
1716
|
+
int blk_i0 = get_global_id(0);
|
|
1717
|
+
int i1 = get_global_id(1);
|
|
1718
|
+
int batch = get_global_id(2);
|
|
1719
|
+
|
|
1720
|
+
if (blk_i0 >= nblk0) return;
|
|
1721
|
+
if (i1 >= ne1) return;
|
|
1722
|
+
|
|
1723
|
+
int i2 = batch % ne2;
|
|
1724
|
+
int i3 = batch / ne2;
|
|
1725
|
+
if (i3 >= ne3) return;
|
|
1726
|
+
|
|
1727
|
+
global char * block = src + src_offset + (ulong)i3*src_nb3 + (ulong)i2*src_nb2 + (ulong)i1*src_nb1 + (ulong)blk_i0 * (2 + QK4_0/2);
|
|
1728
|
+
float d = vload_half(0, (global half *)block);
|
|
1729
|
+
global uchar * qs = (global uchar *)(block + 2);
|
|
1730
|
+
|
|
1731
|
+
ulong dst_row_base = ((ulong)i3 * ne2 * ne1 + (ulong)i2 * ne1 + (ulong)i1) * nblk0;
|
|
1732
|
+
global float * out = dst + (dst_row_base + blk_i0) * QK4_0;
|
|
1733
|
+
|
|
1734
|
+
for (int i = 0; i < QK4_0/2; ++i) {
|
|
1735
|
+
uchar byte = qs[i];
|
|
1736
|
+
int q0 = (int)(byte & 0x0F) - 8;
|
|
1737
|
+
int q1 = (int)(byte >> 4) - 8;
|
|
1738
|
+
out[i] = d * (float)q0;
|
|
1739
|
+
out[i + QK4_0/2] = d * (float)q1;
|
|
1740
|
+
}
|
|
1741
|
+
}
|
|
1742
|
+
|
|
1743
|
+
// View-aware AoS q4_0 -> f16 dequant (mirrors the q8_0 view variant).
|
|
1744
|
+
kernel void kernel_dequant_q4_0_f16_view_aos(
|
|
1745
|
+
global char * src,
|
|
1746
|
+
ulong src_offset,
|
|
1747
|
+
ulong src_nb1,
|
|
1748
|
+
ulong src_nb2,
|
|
1749
|
+
ulong src_nb3,
|
|
1750
|
+
int nblk0,
|
|
1751
|
+
int ne1,
|
|
1752
|
+
int ne2,
|
|
1753
|
+
int ne3,
|
|
1754
|
+
global half * dst
|
|
1755
|
+
) {
|
|
1756
|
+
int blk_i0 = get_global_id(0);
|
|
1757
|
+
int i1 = get_global_id(1);
|
|
1758
|
+
int batch = get_global_id(2);
|
|
1759
|
+
|
|
1760
|
+
if (blk_i0 >= nblk0) return;
|
|
1761
|
+
if (i1 >= ne1) return;
|
|
1762
|
+
|
|
1763
|
+
int i2 = batch % ne2;
|
|
1764
|
+
int i3 = batch / ne2;
|
|
1765
|
+
if (i3 >= ne3) return;
|
|
1766
|
+
|
|
1767
|
+
global char * block = src + src_offset + (ulong)i3*src_nb3 + (ulong)i2*src_nb2 + (ulong)i1*src_nb1 + (ulong)blk_i0 * (2 + QK4_0/2);
|
|
1768
|
+
float d = vload_half(0, (global half *)block);
|
|
1769
|
+
global uchar * qs = (global uchar *)(block + 2);
|
|
1770
|
+
|
|
1771
|
+
ulong dst_row_base = ((ulong)i3 * ne2 * ne1 + (ulong)i2 * ne1 + (ulong)i1) * nblk0;
|
|
1772
|
+
global half * out = dst + (dst_row_base + blk_i0) * QK4_0;
|
|
1773
|
+
|
|
1774
|
+
for (int i = 0; i < QK4_0/2; ++i) {
|
|
1775
|
+
uchar byte = qs[i];
|
|
1776
|
+
int q0 = (int)(byte & 0x0F) - 8;
|
|
1777
|
+
int q1 = (int)(byte >> 4) - 8;
|
|
1778
|
+
out[i] = (half)(d * (float)q0);
|
|
1779
|
+
out[i + QK4_0/2] = (half)(d * (float)q1);
|
|
1780
|
+
}
|
|
1781
|
+
}
|
|
1782
|
+
|
|
1783
|
+
kernel void kernel_restore_block_q8_0_trans(
|
|
1784
|
+
global uchar * src_q,
|
|
1785
|
+
global half * src_d,
|
|
1786
|
+
global block_q8_0 * dst,
|
|
1787
|
+
uint ne00,
|
|
1788
|
+
uint ne01
|
|
1789
|
+
){
|
|
1790
|
+
uint num_blk_per_row = ne00 / QK8_0;
|
|
1791
|
+
|
|
1792
|
+
global block_q8_0 * b = (global block_q8_0 *) dst + get_global_id(0) * num_blk_per_row;
|
|
1793
|
+
global uchar * q = (global uchar *) src_q + get_global_id(0) * 4; // 4 8-bit packed
|
|
1794
|
+
global half * d = (global half *) src_d + get_global_id(0);
|
|
1795
|
+
|
|
1796
|
+
for (uint blk = 0; blk < num_blk_per_row; blk++) {
|
|
1797
|
+
b->d = *d;
|
|
395
1798
|
|
|
396
1799
|
for (uint i = 0; i < QK8_0; i+=4) {
|
|
397
1800
|
b->qs[i] = q[0];
|
|
@@ -408,6 +1811,288 @@ kernel void kernel_restore_block_q8_0_trans(
|
|
|
408
1811
|
}
|
|
409
1812
|
}
|
|
410
1813
|
|
|
1814
|
+
//------------------------------------------------------------------------------
|
|
1815
|
+
// kernel_convert_block_q4_K
|
|
1816
|
+
// Convert the block_q4_K format to 4 separate arrays (AOS -> SOA).
|
|
1817
|
+
// This kernel does not deshuffle the bits.
|
|
1818
|
+
// Each thread processes a super block.
|
|
1819
|
+
// Mask args are just to keep the signature consistent with the no-shuffle
|
|
1820
|
+
// version and they are not used in this kernel.
|
|
1821
|
+
//------------------------------------------------------------------------------
|
|
1822
|
+
kernel void kernel_convert_block_q4_K(
|
|
1823
|
+
global struct block_q4_K * src0,
|
|
1824
|
+
global uchar * dst_q,
|
|
1825
|
+
global uchar * dst_s,
|
|
1826
|
+
global half * dst_d,
|
|
1827
|
+
global half * dst_dm,
|
|
1828
|
+
uchar mask_0F,
|
|
1829
|
+
uchar mask_F0
|
|
1830
|
+
) {
|
|
1831
|
+
global struct block_q4_K * b = (global struct block_q4_K *) src0 + get_global_id(0);
|
|
1832
|
+
global uchar * q = (global uchar *) dst_q + QK_K/2*get_global_id(0);
|
|
1833
|
+
global uchar * s = (global uchar *) dst_s + K_SCALE_SIZE*get_global_id(0);
|
|
1834
|
+
global half * d = (global half *) dst_d + get_global_id(0);
|
|
1835
|
+
global half * dm = (global half *) dst_dm + get_global_id(0);
|
|
1836
|
+
|
|
1837
|
+
*d = b->d;
|
|
1838
|
+
*dm = b->dm;
|
|
1839
|
+
|
|
1840
|
+
for (int i = 0; i < QK_K/2; ++i) {
|
|
1841
|
+
q[i] = b->q[i];
|
|
1842
|
+
}
|
|
1843
|
+
for (int i = 0; i < K_SCALE_SIZE; ++i) {
|
|
1844
|
+
s[i] = b->s[i];
|
|
1845
|
+
}
|
|
1846
|
+
}
|
|
1847
|
+
|
|
1848
|
+
// Restore block_q4_K from flattened arrays.
|
|
1849
|
+
// Each thread processes a super block.
|
|
1850
|
+
// Mask args are just to keep the signature consistent with the no-shuffle ones.
|
|
1851
|
+
kernel void kernel_restore_block_q4_K(
|
|
1852
|
+
global uchar * src_q,
|
|
1853
|
+
global uchar * src_s,
|
|
1854
|
+
global half * src_d,
|
|
1855
|
+
global half * src_dm,
|
|
1856
|
+
global struct block_q4_K * dst,
|
|
1857
|
+
uchar mask_0F,
|
|
1858
|
+
uchar mask_F0
|
|
1859
|
+
) {
|
|
1860
|
+
global struct block_q4_K * b = (global struct block_q4_K *) dst + get_global_id(0);
|
|
1861
|
+
global uchar * q = (global uchar *) src_q + QK_K/2*get_global_id(0);
|
|
1862
|
+
global uchar * s = (global uchar *) src_s + K_SCALE_SIZE*get_global_id(0);
|
|
1863
|
+
global half * d = (global half *) src_d + get_global_id(0);
|
|
1864
|
+
global half * dm = (global half *) src_dm + get_global_id(0);
|
|
1865
|
+
|
|
1866
|
+
b->d = *d;
|
|
1867
|
+
b->dm = *dm;
|
|
1868
|
+
|
|
1869
|
+
for (int i = 0; i < QK_K/2; ++i) {
|
|
1870
|
+
b->q[i] = q[i];
|
|
1871
|
+
}
|
|
1872
|
+
for (int i = 0; i < K_SCALE_SIZE; ++i) {
|
|
1873
|
+
b->s[i] = s[i];
|
|
1874
|
+
}
|
|
1875
|
+
}
|
|
1876
|
+
|
|
1877
|
+
kernel void kernel_convert_block_q4_K_noshuffle(
|
|
1878
|
+
global struct block_q4_K * src0,
|
|
1879
|
+
global uchar * dst_q,
|
|
1880
|
+
global uchar * dst_s,
|
|
1881
|
+
global half * dst_d,
|
|
1882
|
+
global half * dst_dm,
|
|
1883
|
+
uchar mask_0F,
|
|
1884
|
+
uchar mask_F0
|
|
1885
|
+
) {
|
|
1886
|
+
global struct block_q4_K * b = (global struct block_q4_K *) src0 + get_global_id(0);
|
|
1887
|
+
global uchar * q = (global uchar *) dst_q + QK_K/2 * get_global_id(0);
|
|
1888
|
+
global uchar * s = (global uchar *) dst_s + K_SCALE_SIZE * get_global_id(0);
|
|
1889
|
+
global half * d = (global half *) dst_d + get_global_id(0);
|
|
1890
|
+
global half * dm = (global half *) dst_dm + get_global_id(0);
|
|
1891
|
+
|
|
1892
|
+
*d = b->d;
|
|
1893
|
+
*dm = b->dm;
|
|
1894
|
+
|
|
1895
|
+
for (int i = 0; i < QK_K / 64; ++i) {
|
|
1896
|
+
for (int j = 0; j < 16; ++j) {
|
|
1897
|
+
uchar x0 = b->q[i*32 + 2*j];
|
|
1898
|
+
uchar x1 = b->q[i*32 + 2*j + 1];
|
|
1899
|
+
q[i*32 + j] = convert_uchar(x0 & mask_0F) | convert_uchar((x1 & mask_0F) << 4);
|
|
1900
|
+
q[i*32 + j + 16] = convert_uchar((x0 & mask_F0) >> 4) | convert_uchar(x1 & mask_F0);
|
|
1901
|
+
}
|
|
1902
|
+
}
|
|
1903
|
+
|
|
1904
|
+
for (int i = 0; i < K_SCALE_SIZE; ++i) {
|
|
1905
|
+
s[i] = b->s[i];
|
|
1906
|
+
}
|
|
1907
|
+
}
|
|
1908
|
+
|
|
1909
|
+
kernel void kernel_restore_block_q4_K_noshuffle(
|
|
1910
|
+
global uchar * src_q,
|
|
1911
|
+
global uchar * src_s,
|
|
1912
|
+
global half * src_d,
|
|
1913
|
+
global half * src_dm,
|
|
1914
|
+
global struct block_q4_K * dst,
|
|
1915
|
+
uchar mask_0F,
|
|
1916
|
+
uchar mask_F0
|
|
1917
|
+
) {
|
|
1918
|
+
global struct block_q4_K * b = (global struct block_q4_K *) dst + get_global_id(0);
|
|
1919
|
+
global uchar * q = (global uchar *) src_q + QK_K/2 * get_global_id(0);
|
|
1920
|
+
global uchar * s = (global uchar *) src_s + K_SCALE_SIZE * get_global_id(0);
|
|
1921
|
+
global half * d = (global half *) src_d + get_global_id(0);
|
|
1922
|
+
global half * dm = (global half *) src_dm + get_global_id(0);
|
|
1923
|
+
|
|
1924
|
+
b->d = *d;
|
|
1925
|
+
b->dm = *dm;
|
|
1926
|
+
|
|
1927
|
+
for (int i = 0; i < QK_K / 64; ++i) {
|
|
1928
|
+
for (int j = 0; j < 16; ++j) {
|
|
1929
|
+
uchar lo = q[i*32 + j];
|
|
1930
|
+
uchar hi = q[i*32 + j + 16];
|
|
1931
|
+
b->q[i*32 + 2*j] = convert_uchar((lo & mask_0F) | ((hi & mask_0F) << 4));
|
|
1932
|
+
b->q[i*32 + 2*j + 1] = convert_uchar(((lo & mask_F0) >> 4) | (hi & mask_F0));
|
|
1933
|
+
}
|
|
1934
|
+
}
|
|
1935
|
+
|
|
1936
|
+
for (int i = 0; i < K_SCALE_SIZE; ++i) {
|
|
1937
|
+
b->s[i] = s[i];
|
|
1938
|
+
}
|
|
1939
|
+
}
|
|
1940
|
+
|
|
1941
|
+
//------------------------------------------------------------------------------
|
|
1942
|
+
// kernel_convert_block_q5_K
|
|
1943
|
+
// Convert the block_q5_K format to 5 separate arrays (AOS -> SOA).
|
|
1944
|
+
// Each thread processes a super block.
|
|
1945
|
+
//------------------------------------------------------------------------------
|
|
1946
|
+
kernel void kernel_convert_block_q5_K(
|
|
1947
|
+
global struct block_q5_K * src0,
|
|
1948
|
+
global uchar * dst_q,
|
|
1949
|
+
global uchar * dst_qh,
|
|
1950
|
+
global uchar * dst_s,
|
|
1951
|
+
global half * dst_d,
|
|
1952
|
+
global half * dst_dm,
|
|
1953
|
+
uchar mask_0F,
|
|
1954
|
+
uchar mask_F0
|
|
1955
|
+
) {
|
|
1956
|
+
global struct block_q5_K * b = (global struct block_q5_K *) src0 + get_global_id(0);
|
|
1957
|
+
global uchar * q = (global uchar *) dst_q + QK_K/2*get_global_id(0);
|
|
1958
|
+
global uchar * qh = (global uchar *) dst_qh + QK_K/8*get_global_id(0);
|
|
1959
|
+
global uchar * s = (global uchar *) dst_s + K_SCALE_SIZE*get_global_id(0);
|
|
1960
|
+
global half * d = (global half *) dst_d + get_global_id(0);
|
|
1961
|
+
global half * dm = (global half *) dst_dm + get_global_id(0);
|
|
1962
|
+
|
|
1963
|
+
*d = b->d;
|
|
1964
|
+
*dm = b->dm;
|
|
1965
|
+
|
|
1966
|
+
for (int i = 0; i < QK_K/2; ++i) {
|
|
1967
|
+
q[i] = b->qs[i];
|
|
1968
|
+
}
|
|
1969
|
+
for (int i = 0; i < QK_K/8; ++i) {
|
|
1970
|
+
qh[i] = b->qh[i];
|
|
1971
|
+
}
|
|
1972
|
+
for (int i = 0; i < K_SCALE_SIZE; ++i) {
|
|
1973
|
+
s[i] = b->s[i];
|
|
1974
|
+
}
|
|
1975
|
+
}
|
|
1976
|
+
|
|
1977
|
+
// Restore block_q5_K from flattened arrays.
|
|
1978
|
+
// Each thread processes a super block.
|
|
1979
|
+
kernel void kernel_restore_block_q5_K(
|
|
1980
|
+
global uchar * src_q,
|
|
1981
|
+
global uchar * src_qh,
|
|
1982
|
+
global uchar * src_s,
|
|
1983
|
+
global half * src_d,
|
|
1984
|
+
global half * src_dm,
|
|
1985
|
+
global struct block_q5_K * dst,
|
|
1986
|
+
uchar mask_0F,
|
|
1987
|
+
uchar mask_F0
|
|
1988
|
+
) {
|
|
1989
|
+
global struct block_q5_K * b = (global struct block_q5_K *) dst + get_global_id(0);
|
|
1990
|
+
global uchar * q = (global uchar *) src_q + QK_K/2*get_global_id(0);
|
|
1991
|
+
global uchar * qh = (global uchar *) src_qh + QK_K/8*get_global_id(0);
|
|
1992
|
+
global uchar * s = (global uchar *) src_s + K_SCALE_SIZE*get_global_id(0);
|
|
1993
|
+
global half * d = (global half *) src_d + get_global_id(0);
|
|
1994
|
+
global half * dm = (global half *) src_dm + get_global_id(0);
|
|
1995
|
+
|
|
1996
|
+
b->d = *d;
|
|
1997
|
+
b->dm = *dm;
|
|
1998
|
+
|
|
1999
|
+
for (int i = 0; i < QK_K/2; ++i) {
|
|
2000
|
+
b->qs[i] = q[i];
|
|
2001
|
+
}
|
|
2002
|
+
for (int i = 0; i < QK_K/8; ++i) {
|
|
2003
|
+
b->qh[i] = qh[i];
|
|
2004
|
+
}
|
|
2005
|
+
for (int i = 0; i < K_SCALE_SIZE; ++i) {
|
|
2006
|
+
b->s[i] = s[i];
|
|
2007
|
+
}
|
|
2008
|
+
}
|
|
2009
|
+
|
|
2010
|
+
kernel void kernel_convert_block_q5_K_noshuffle(
|
|
2011
|
+
global struct block_q5_K * src0,
|
|
2012
|
+
global uchar * dst_q,
|
|
2013
|
+
global uchar * dst_qh,
|
|
2014
|
+
global uchar * dst_s,
|
|
2015
|
+
global half * dst_d,
|
|
2016
|
+
global half * dst_dm,
|
|
2017
|
+
uchar mask_0F,
|
|
2018
|
+
uchar mask_F0
|
|
2019
|
+
) {
|
|
2020
|
+
global struct block_q5_K * b = (global struct block_q5_K *) src0 + get_global_id(0);
|
|
2021
|
+
global uchar * q = (global uchar *) dst_q + QK_K/2 * get_global_id(0);
|
|
2022
|
+
global uchar * qh = (global uchar *) dst_qh + QK_K/8 * get_global_id(0);
|
|
2023
|
+
global uchar * s = (global uchar *) dst_s + K_SCALE_SIZE * get_global_id(0);
|
|
2024
|
+
global half * d = (global half *) dst_d + get_global_id(0);
|
|
2025
|
+
global half * dm = (global half *) dst_dm + get_global_id(0);
|
|
2026
|
+
|
|
2027
|
+
*d = b->d;
|
|
2028
|
+
*dm = b->dm;
|
|
2029
|
+
|
|
2030
|
+
for (int i = 0; i < QK_K / 64; ++i) {
|
|
2031
|
+
for (int j = 0; j < 16; ++j) {
|
|
2032
|
+
uchar x0 = b->qs[i*32 + 2*j];
|
|
2033
|
+
uchar x1 = b->qs[i*32 + 2*j + 1];
|
|
2034
|
+
q[i*32 + j] = convert_uchar(x0 & mask_0F) | convert_uchar((x1 & mask_0F) << 4);
|
|
2035
|
+
q[i*32 + j + 16] = convert_uchar((x0 & mask_F0) >> 4) | convert_uchar(x1 & mask_F0);
|
|
2036
|
+
}
|
|
2037
|
+
}
|
|
2038
|
+
|
|
2039
|
+
for (int l = 0; l < QK_K/8; ++l) {
|
|
2040
|
+
uchar x0 = 0;
|
|
2041
|
+
for (int i = 0; i < 8; ++i) {
|
|
2042
|
+
x0 |= ((b->qh[(l%4)*8+i] >> (l/4)) & 0x01) << i;
|
|
2043
|
+
}
|
|
2044
|
+
qh[l] = x0;
|
|
2045
|
+
}
|
|
2046
|
+
|
|
2047
|
+
for (int i = 0; i < K_SCALE_SIZE; ++i) {
|
|
2048
|
+
s[i] = b->s[i];
|
|
2049
|
+
}
|
|
2050
|
+
}
|
|
2051
|
+
|
|
2052
|
+
kernel void kernel_restore_block_q5_K_noshuffle(
|
|
2053
|
+
global uchar * src_q,
|
|
2054
|
+
global uchar * src_qh,
|
|
2055
|
+
global uchar * src_s,
|
|
2056
|
+
global half * src_d,
|
|
2057
|
+
global half * src_dm,
|
|
2058
|
+
global struct block_q5_K * dst,
|
|
2059
|
+
uchar mask_0F,
|
|
2060
|
+
uchar mask_F0
|
|
2061
|
+
) {
|
|
2062
|
+
global struct block_q5_K * b = (global struct block_q5_K *) dst + get_global_id(0);
|
|
2063
|
+
global uchar * q = (global uchar *) src_q + QK_K/2 * get_global_id(0);
|
|
2064
|
+
global uchar * qh = (global uchar *) src_qh + QK_K/8 * get_global_id(0);
|
|
2065
|
+
global uchar * s = (global uchar *) src_s + K_SCALE_SIZE * get_global_id(0);
|
|
2066
|
+
global half * d = (global half *) src_d + get_global_id(0);
|
|
2067
|
+
global half * dm = (global half *) src_dm + get_global_id(0);
|
|
2068
|
+
|
|
2069
|
+
b->d = *d;
|
|
2070
|
+
b->dm = *dm;
|
|
2071
|
+
|
|
2072
|
+
for (int i = 0; i < QK_K / 64; ++i) {
|
|
2073
|
+
for (int j = 0; j < 16; ++j) {
|
|
2074
|
+
uchar lo = q[i*32 + j];
|
|
2075
|
+
uchar hi = q[i*32 + j + 16];
|
|
2076
|
+
b->qs[i*32 + 2*j] = convert_uchar((lo & mask_0F) | ((hi & mask_0F) << 4));
|
|
2077
|
+
b->qs[i*32 + 2*j + 1] = convert_uchar(((lo & mask_F0) >> 4) | (hi & mask_F0));
|
|
2078
|
+
}
|
|
2079
|
+
}
|
|
2080
|
+
|
|
2081
|
+
for (int g = 0; g < 4; ++g) {
|
|
2082
|
+
for (int i = 0; i < 8; ++i) {
|
|
2083
|
+
uchar x0 = 0;
|
|
2084
|
+
for (int k = 0; k < 8; ++k) {
|
|
2085
|
+
x0 |= ((qh[4*k+g] >> i) & 0x01) << k;
|
|
2086
|
+
}
|
|
2087
|
+
b->qh[g*8+i] = x0;
|
|
2088
|
+
}
|
|
2089
|
+
}
|
|
2090
|
+
|
|
2091
|
+
for (int i = 0; i < K_SCALE_SIZE; ++i) {
|
|
2092
|
+
b->s[i] = s[i];
|
|
2093
|
+
}
|
|
2094
|
+
}
|
|
2095
|
+
|
|
411
2096
|
//------------------------------------------------------------------------------
|
|
412
2097
|
// kernel_convert_block_q6_K
|
|
413
2098
|
// Convert the block_q6_K format to 3 separate arrays (AOS -> SOA).
|
|
@@ -419,8 +2104,13 @@ kernel void kernel_convert_block_q6_K(
|
|
|
419
2104
|
global uchar * dst_ql,
|
|
420
2105
|
global uchar * dst_qh,
|
|
421
2106
|
global char * dst_s,
|
|
422
|
-
global half * dst_d
|
|
2107
|
+
global half * dst_d,
|
|
2108
|
+
uchar mask_lsb_8,
|
|
2109
|
+
ulong n_blk
|
|
423
2110
|
) {
|
|
2111
|
+
if (get_global_id(0) >= n_blk) {
|
|
2112
|
+
return;
|
|
2113
|
+
}
|
|
424
2114
|
global struct block_q6_K * b = (global struct block_q6_K *) src0 + get_global_id(0);
|
|
425
2115
|
global uchar * ql = (global uchar *) dst_ql + QK_K/2*get_global_id(0);
|
|
426
2116
|
global uchar * qh = (global uchar *) dst_qh + QK_K/4*get_global_id(0);
|
|
@@ -447,8 +2137,13 @@ kernel void kernel_restore_block_q6_K(
|
|
|
447
2137
|
global uchar * dst_qh,
|
|
448
2138
|
global char * dst_s,
|
|
449
2139
|
global half * dst_d,
|
|
450
|
-
global struct block_q6_K * dst
|
|
2140
|
+
global struct block_q6_K * dst,
|
|
2141
|
+
uchar mask_lsb_8,
|
|
2142
|
+
ulong n_blk
|
|
451
2143
|
) {
|
|
2144
|
+
if (get_global_id(0) >= n_blk) {
|
|
2145
|
+
return;
|
|
2146
|
+
}
|
|
452
2147
|
global struct block_q6_K * b = (global struct block_q6_K *) dst + get_global_id(0);
|
|
453
2148
|
global uchar * ql = (global uchar *) dst_ql + QK_K/2*get_global_id(0);
|
|
454
2149
|
global uchar * qh = (global uchar *) dst_qh + QK_K/4*get_global_id(0);
|
|
@@ -467,3 +2162,213 @@ kernel void kernel_restore_block_q6_K(
|
|
|
467
2162
|
b->scales[i] = s[i];
|
|
468
2163
|
}
|
|
469
2164
|
}
|
|
2165
|
+
|
|
2166
|
+
kernel void kernel_convert_block_q6_K_noshuffle(
|
|
2167
|
+
global struct block_q6_K * src0,
|
|
2168
|
+
global uchar * dst_ql,
|
|
2169
|
+
global uchar * dst_qh,
|
|
2170
|
+
global char * dst_s,
|
|
2171
|
+
global half * dst_d,
|
|
2172
|
+
uchar mask_lsb_8,
|
|
2173
|
+
ulong n_blk
|
|
2174
|
+
) {
|
|
2175
|
+
if (get_global_id(0) >= n_blk) {
|
|
2176
|
+
return;
|
|
2177
|
+
}
|
|
2178
|
+
global struct block_q6_K * b = (global struct block_q6_K *) src0 + get_global_id(0);
|
|
2179
|
+
global uchar * ql = (global uchar *) dst_ql + QK_K/2*get_global_id(0);
|
|
2180
|
+
global uchar * qh = (global uchar *) dst_qh + QK_K/4*get_global_id(0);
|
|
2181
|
+
global char * s = (global char *) dst_s + QK_K/16*get_global_id(0);
|
|
2182
|
+
global half * d = (global half *) dst_d + get_global_id(0);
|
|
2183
|
+
|
|
2184
|
+
*d = b->d;
|
|
2185
|
+
|
|
2186
|
+
for (int i = 0; i < QK_K/2/4; ++i) {
|
|
2187
|
+
uchar x0 = b->ql[i*2 + 0] & mask_lsb_8;
|
|
2188
|
+
uchar x1 = b->ql[i*2 + 1] & mask_lsb_8;
|
|
2189
|
+
ql[i + 0] = (x0 & 0x0F) | ((x1 & 0x0F) << 4);
|
|
2190
|
+
ql[i + 32] = ((x0 & 0xF0) >> 4) | (x1 & 0xF0);
|
|
2191
|
+
|
|
2192
|
+
uchar x2 = b->ql[i*2 + 0 + 64] & mask_lsb_8;
|
|
2193
|
+
uchar x3 = b->ql[i*2 + 1 + 64] & mask_lsb_8;
|
|
2194
|
+
ql[i + 64] = (x2 & 0x0F) | ((x3 & 0x0F) << 4);
|
|
2195
|
+
ql[i + 96] = ((x2 & 0xF0) >> 4) | (x3 & 0xF0);
|
|
2196
|
+
}
|
|
2197
|
+
|
|
2198
|
+
for (int i = 0; i < QK_K/4/8; ++i) {
|
|
2199
|
+
uchar x0 = b->qh[i*4 + 0] & mask_lsb_8;
|
|
2200
|
+
uchar x1 = b->qh[i*4 + 1] & mask_lsb_8;
|
|
2201
|
+
uchar x2 = b->qh[i*4 + 2] & mask_lsb_8;
|
|
2202
|
+
uchar x3 = b->qh[i*4 + 3] & mask_lsb_8;
|
|
2203
|
+
qh[i + 0] = (x0 & 0x03) | ((x1 & 0x03) << 2) | ((x2 & 0x03) << 4) | ((x3 & 0x03) << 6);
|
|
2204
|
+
qh[i + 8] = ((x0 & 0x0C) >> 2) | (x1 & 0x0C) | ((x2 & 0x0C) << 2) | ((x3 & 0x0C) << 4);
|
|
2205
|
+
qh[i + 16] = ((x0 & 0x30) >> 4) | ((x1 & 0x30) >> 2) | (x2 & 0x30) | ((x3 & 0x30) << 2);
|
|
2206
|
+
qh[i + 24] = ((x0 & 0xC0) >> 6) | ((x1 & 0xC0) >> 4) | ((x2 & 0xC0) >> 2) | (x3 & 0xC0);
|
|
2207
|
+
|
|
2208
|
+
uchar x4 = b->qh[i*4 + 0 + 32] & mask_lsb_8;
|
|
2209
|
+
uchar x5 = b->qh[i*4 + 1 + 32] & mask_lsb_8;
|
|
2210
|
+
uchar x6 = b->qh[i*4 + 2 + 32] & mask_lsb_8;
|
|
2211
|
+
uchar x7 = b->qh[i*4 + 3 + 32] & mask_lsb_8;
|
|
2212
|
+
qh[i + 32] = (x4 & 0x03) | ((x5 & 0x03) << 2) | ((x6 & 0x03) << 4) | ((x7 & 0x03) << 6);
|
|
2213
|
+
qh[i + 40] = ((x4 & 0x0C) >> 2) | (x5 & 0x0C) | ((x6 & 0x0C) << 2) | ((x7 & 0x0C) << 4);
|
|
2214
|
+
qh[i + 48] = ((x4 & 0x30) >> 4) | ((x5 & 0x30) >> 2) | (x6 & 0x30) | ((x7 & 0x30) << 2);
|
|
2215
|
+
qh[i + 56] = ((x4 & 0xC0) >> 6) | ((x5 & 0xC0) >> 4) | ((x6 & 0xC0) >> 2) | (x7 & 0xC0);
|
|
2216
|
+
}
|
|
2217
|
+
|
|
2218
|
+
for (int i = 0; i < QK_K/16; ++i) {
|
|
2219
|
+
s[i] = b->scales[i];
|
|
2220
|
+
}
|
|
2221
|
+
}
|
|
2222
|
+
|
|
2223
|
+
kernel void kernel_restore_block_q6_K_noshuffle(
|
|
2224
|
+
global uchar * src_ql,
|
|
2225
|
+
global uchar * src_qh,
|
|
2226
|
+
global char * src_s,
|
|
2227
|
+
global half * src_d,
|
|
2228
|
+
global struct block_q6_K * dst,
|
|
2229
|
+
uchar mask_lsb_8,
|
|
2230
|
+
ulong n_blk
|
|
2231
|
+
) {
|
|
2232
|
+
if (get_global_id(0) >= n_blk) {
|
|
2233
|
+
return;
|
|
2234
|
+
}
|
|
2235
|
+
global struct block_q6_K * b = (global struct block_q6_K *) dst + get_global_id(0);
|
|
2236
|
+
global uchar * ql = (global uchar *) src_ql + QK_K/2*get_global_id(0);
|
|
2237
|
+
global uchar * qh = (global uchar *) src_qh + QK_K/4*get_global_id(0);
|
|
2238
|
+
global char * s = (global char *) src_s + QK_K/16*get_global_id(0);
|
|
2239
|
+
global half * d = (global half *) src_d + get_global_id(0);
|
|
2240
|
+
|
|
2241
|
+
b->d = *d;
|
|
2242
|
+
|
|
2243
|
+
for (int i = 0; i < QK_K/2/4; ++i) {
|
|
2244
|
+
uchar x0 = ql[i + 0] & mask_lsb_8;
|
|
2245
|
+
uchar x1 = ql[i + 32] & mask_lsb_8;
|
|
2246
|
+
b->ql[i*2 + 0] = (x0 & 0x0F) | ((x1 & 0x0F) << 4);
|
|
2247
|
+
b->ql[i*2 + 1] = ((x0 & 0xF0) >> 4) | (x1 & 0xF0);
|
|
2248
|
+
|
|
2249
|
+
uchar x2 = ql[i + 64] & mask_lsb_8;
|
|
2250
|
+
uchar x3 = ql[i + 96] & mask_lsb_8;
|
|
2251
|
+
b->ql[i*2 + 0 + 64] = (x2 & 0x0F) | ((x3 & 0x0F) << 4);
|
|
2252
|
+
b->ql[i*2 + 1 + 64] = ((x2 & 0xF0) >> 4) | (x3 & 0xF0);
|
|
2253
|
+
}
|
|
2254
|
+
|
|
2255
|
+
for (int i = 0; i < QK_K/4/8; ++i) {
|
|
2256
|
+
uchar x0 = qh[i + 0] & mask_lsb_8;
|
|
2257
|
+
uchar x1 = qh[i + 8] & mask_lsb_8;
|
|
2258
|
+
uchar x2 = qh[i + 16] & mask_lsb_8;
|
|
2259
|
+
uchar x3 = qh[i + 24] & mask_lsb_8;
|
|
2260
|
+
b->qh[i*4 + 0] = (x0 & 0x03) | ((x1 & 0x03) << 2) | ((x2 & 0x03) << 4) | ((x3 & 0x03) << 6);
|
|
2261
|
+
b->qh[i*4 + 1] = ((x0 & 0x0C) >> 2) | (x1 & 0x0C) | ((x2 & 0x0C) << 2) | ((x3 & 0x0C) << 4);
|
|
2262
|
+
b->qh[i*4 + 2] = ((x0 & 0x30) >> 4) | ((x1 & 0x30) >> 2) | (x2 & 0x30) | ((x3 & 0x30) << 2);
|
|
2263
|
+
b->qh[i*4 + 3] = ((x0 & 0xC0) >> 6) | ((x1 & 0xC0) >> 4) | ((x2 & 0xC0) >> 2) | (x3 & 0xC0);
|
|
2264
|
+
|
|
2265
|
+
uchar x4 = qh[i + 0 + 32] & mask_lsb_8;
|
|
2266
|
+
uchar x5 = qh[i + 8 + 32] & mask_lsb_8;
|
|
2267
|
+
uchar x6 = qh[i + 16 + 32] & mask_lsb_8;
|
|
2268
|
+
uchar x7 = qh[i + 24 + 32] & mask_lsb_8;
|
|
2269
|
+
b->qh[i*4 + 0 + 32] = (x4 & 0x03) | ((x5 & 0x03) << 2) | ((x6 & 0x03) << 4) | ((x7 & 0x03) << 6);
|
|
2270
|
+
b->qh[i*4 + 1 + 32] = ((x4 & 0x0C) >> 2) | (x5 & 0x0C) | ((x6 & 0x0C) << 2) | ((x7 & 0x0C) << 4);
|
|
2271
|
+
b->qh[i*4 + 2 + 32] = ((x4 & 0x30) >> 4) | ((x5 & 0x30) >> 2) | (x6 & 0x30) | ((x7 & 0x30) << 2);
|
|
2272
|
+
b->qh[i*4 + 3 + 32] = ((x4 & 0xC0) >> 6) | ((x5 & 0xC0) >> 4) | ((x6 & 0xC0) >> 2) | (x7 & 0xC0);
|
|
2273
|
+
}
|
|
2274
|
+
|
|
2275
|
+
for (int i = 0; i < QK_K/16; ++i) {
|
|
2276
|
+
b->scales[i] = s[i];
|
|
2277
|
+
}
|
|
2278
|
+
}
|
|
2279
|
+
|
|
2280
|
+
//------------------------------------------------------------------------------
|
|
2281
|
+
// kernel_convert_block_iq4_nl
|
|
2282
|
+
// Convert the block_iq4_nl format to 2 separate arrays (AOS -> SOA).
|
|
2283
|
+
//------------------------------------------------------------------------------
|
|
2284
|
+
kernel void kernel_convert_block_iq4_nl(
|
|
2285
|
+
global struct block_iq4_nl * src0,
|
|
2286
|
+
global uchar * dst_q,
|
|
2287
|
+
global half * dst_d,
|
|
2288
|
+
uchar mask_0F,
|
|
2289
|
+
uchar mask_F0,
|
|
2290
|
+
ulong n_blk
|
|
2291
|
+
) {
|
|
2292
|
+
if (get_global_id(0) >= n_blk) {
|
|
2293
|
+
return;
|
|
2294
|
+
}
|
|
2295
|
+
global struct block_iq4_nl * b = (global struct block_iq4_nl *) src0 + get_global_id(0);
|
|
2296
|
+
global uchar * q = (global uchar *) dst_q + QK4_NL/2*get_global_id(0);
|
|
2297
|
+
global half * d = (global half *) dst_d + get_global_id(0);
|
|
2298
|
+
|
|
2299
|
+
*d = b->d;
|
|
2300
|
+
|
|
2301
|
+
for (int i = 0; i < QK4_NL/2; ++i) {
|
|
2302
|
+
q[i] = b->qs[i];
|
|
2303
|
+
}
|
|
2304
|
+
}
|
|
2305
|
+
|
|
2306
|
+
kernel void kernel_restore_block_iq4_nl(
|
|
2307
|
+
global uchar * src_q,
|
|
2308
|
+
global half * src_d,
|
|
2309
|
+
global struct block_iq4_nl * dst,
|
|
2310
|
+
ulong n_blk
|
|
2311
|
+
) {
|
|
2312
|
+
if (get_global_id(0) >= n_blk) {
|
|
2313
|
+
return;
|
|
2314
|
+
}
|
|
2315
|
+
global struct block_iq4_nl * b = (global struct block_iq4_nl *) dst + get_global_id(0);
|
|
2316
|
+
global uchar * q = (global uchar *) src_q + QK4_NL/2*get_global_id(0);
|
|
2317
|
+
global half * d = (global half *) src_d + get_global_id(0);
|
|
2318
|
+
|
|
2319
|
+
b->d = *d;
|
|
2320
|
+
|
|
2321
|
+
for (int i = 0; i < QK4_NL/2; ++i) {
|
|
2322
|
+
b->qs[i] = q[i];
|
|
2323
|
+
}
|
|
2324
|
+
}
|
|
2325
|
+
|
|
2326
|
+
kernel void kernel_convert_block_iq4_nl_noshuffle(
|
|
2327
|
+
global struct block_iq4_nl * src0,
|
|
2328
|
+
global uchar * dst_q,
|
|
2329
|
+
global half * dst_d,
|
|
2330
|
+
uchar mask_0F,
|
|
2331
|
+
uchar mask_F0,
|
|
2332
|
+
ulong n_blk
|
|
2333
|
+
) {
|
|
2334
|
+
if (get_global_id(0) >= n_blk) {
|
|
2335
|
+
return;
|
|
2336
|
+
}
|
|
2337
|
+
global struct block_iq4_nl * b = (global struct block_iq4_nl *) src0 + get_global_id(0);
|
|
2338
|
+
global uchar * q = (global uchar *) dst_q + QK4_NL/2*get_global_id(0);
|
|
2339
|
+
global half * d = (global half *) dst_d + get_global_id(0);
|
|
2340
|
+
|
|
2341
|
+
*d = b->d;
|
|
2342
|
+
for (int i = 0; i < QK4_NL/4; ++i) {
|
|
2343
|
+
uchar x0 = b->qs[2*i + 0];
|
|
2344
|
+
uchar x1 = b->qs[2*i + 1];
|
|
2345
|
+
|
|
2346
|
+
q[i + 0 ] = convert_uchar(x0 & mask_0F) | convert_uchar((x1 & mask_0F) << 4);
|
|
2347
|
+
q[i + QK4_NL/4] = convert_uchar((x0 & mask_F0) >> 4) | convert_uchar(x1 & mask_F0);
|
|
2348
|
+
}
|
|
2349
|
+
}
|
|
2350
|
+
|
|
2351
|
+
kernel void kernel_restore_block_iq4_nl_noshuffle(
|
|
2352
|
+
global uchar * src_q,
|
|
2353
|
+
global half * src_d,
|
|
2354
|
+
global struct block_iq4_nl * dst,
|
|
2355
|
+
uchar mask_0F,
|
|
2356
|
+
uchar mask_F0,
|
|
2357
|
+
ulong n_blk
|
|
2358
|
+
) {
|
|
2359
|
+
if (get_global_id(0) >= n_blk) {
|
|
2360
|
+
return;
|
|
2361
|
+
}
|
|
2362
|
+
global struct block_iq4_nl * b = (global struct block_iq4_nl *) dst + get_global_id(0);
|
|
2363
|
+
global uchar * q = (global uchar *) src_q + QK4_NL/2*get_global_id(0);
|
|
2364
|
+
global half * d = (global half *) src_d + get_global_id(0);
|
|
2365
|
+
|
|
2366
|
+
b->d = *d;
|
|
2367
|
+
for (int i = 0; i < QK4_NL/4; ++i) {
|
|
2368
|
+
uchar x0 = q[i + 0 ];
|
|
2369
|
+
uchar x1 = q[i + QK4_NL/4];
|
|
2370
|
+
|
|
2371
|
+
b->qs[2*i + 0] = convert_uchar((x0 & mask_0F) | ((x1 & mask_0F) << 4));
|
|
2372
|
+
b->qs[2*i + 1] = convert_uchar(((x0 & mask_F0) >> 4) | (x1 & mask_F0));
|
|
2373
|
+
}
|
|
2374
|
+
}
|