mirror of
https://github.com/ggerganov/whisper.cpp.git
synced 2025-08-09 21:38:44 +02:00
ggml-cpu: enable IBM NNPA Vector Intrinsics (llama/14317)
* ggml-cpu: add nnpa compile flag Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> (cherry picked from commit 4a9f60c201573128f73a65999b3e5cc497fae5c1) * ggml-cpu: add fp16->fp32 nnpa first Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> (cherry picked from commit 8d4a7987f9c1887f716be96250f2caeee0253929) * ggml-cpu: add fp32->fp16 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> (cherry picked from commit 0ff0d6516247a41d2ade42b42cf0d676a4dd1627) * ggml-cpu: better variable names Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> (cherry picked from commit 2f58bbcbb89c183340e252362b2a40651f573f1f) * docs: update s390x docs Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> (cherry picked from commit 01b929491b50071a5d0572235dcf5a449da70aa7) * ggml-cpu: add debugging prints to see if dlf16 is correct Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix print vs printf Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix float placeholder Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: ensure fp16 and fp32 load and stores are called Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fp16 load ensured to hit Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: remove sigint from fp16 store for some reason, the function is not getting a hit when debugged with gdb. we will need to investigate further Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: activate nnpa for ggml_cpu_fp16_to_fp32 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: nnpa activate ggml_cpu_fp16_to_fp32 for 8 elements Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: nnpa switch to vec_xst test Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: switch to vec_xst for 4 element loops also Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: rework noop Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: remove noop, general code cleanup Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: clarify variable naming Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: activate nnpa for ggml_cpu_fp32_to_fp16 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add breakpoint for debugging Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: test fix for conversion failure Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: disable fp32->fp16 nnpa conversions for now there are some conversion failures in nnpa that requires the eyes of an ibm stsm. will create a separate pr to introduce the fp32->fp16 change. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: switch to elif macro Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: reattempt fp32->fp16 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix typo Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: reattempt fp32->fp16 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix compiler types Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: change to typedef vector types Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add 4 element loops for fp32->fp16 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: clarified vector naming Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: bring back fp32->fp16 store nnpa Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: activate nnpa fp32->fp16 or fp16->fp32 compute Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add nnpa macro check in ggml-impl Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add missing __func__ Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: diagnose why __NNPA__ macro is not being defined Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: import vecintrin.h to fix compiler errors Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: update macro tests Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: move s390x typedef to own header file Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml-cpu: move s390x typedef to own header file" This reverts commit 157f856c34589566151630e294563a420702db39. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: switch to importing ggml-cpu-impl instead Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix macro declaration Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: test more macros Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add debug prints Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: bruteforce macro definitions Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: move macro definitions Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add ggml-impl.h to cmakelists Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: switch to private macros Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: move s390x typedef to own header file Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> (cherry picked from commit 157f856c34589566151630e294563a420702db39) * ggml-cpu: move things around Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: bring back compile macros Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: switch to quotes for import Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add compiler error macro Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add s390x detection in ggml-src Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: bring back compile definitions Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: undo cmakelists work Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml-cpu: move s390x typedef to own header file" This reverts commit 18d79e1a30b39d9aaa0bd58400c5cf2c32135c9a. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: remove typedefs.h Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: remove typedef from cmakelists Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add ggml-impl.h future notes Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add todo comment for future reference Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: clarify naming of dlf16 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: remove unnecessary target compile definitions Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: move nnpa fp16->fp32 and fp32->fp16 to simd-mappings Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml: refactor fp32->fp16 and fp16->fp32 simd to ggml-cpu Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * docs: update broken huggingface link for s390x Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix duplicate func names during compile Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml-cpu: fix duplicate func names during compile" This reverts commit fbb733451f27677063b914d4f6c9a9841d45b38d. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml: refactor fp32->fp16 and fp16->fp32 simd to ggml-cpu" This reverts commit bd288e8fa52b5244f65cee21cb61062f1a9e0ca5. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml: refactor fp16<->fp32 simd to ggml-cpu Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix missing simd-mappings.h import in quants.c Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix missing simd-mappings.h within repack Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix amx mmq missing simd-mappings.h Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: attempt at fixing loongarch failing build Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: move nnpa together with other fp16<->fp32 simd Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix wrong refactor of ggml-base ref: https://github.com/ggml-org/llama.cpp/pull/14317#discussion_r2164176555 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml: remove dependency on ggml-cpu from ggml-base Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: rename all fp16<->fp32 macros to prefix with ggml_cpu ref: https://github.com/ggml-org/llama.cpp/pull/14317#discussion_r2164449406 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: remove mistaken fallback macro fallback logic was already implemented but i was too sleepy to realise Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml: move ggml_table_f32_f16 to ggml-cpu ref: https://github.com/ggml-org/llama.cpp/pull/14317#discussion_r2164775006 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: move ggml_table_f32_f16 back to ggml-base due to ci failures Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml-cpu: move ggml_table_f32_f16 back to ggml-base due to ci failures" This reverts commit 32a3533564bdb7902cefb9c89b1c9e956a81ce29. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml: move ggml_table_f32_f16 to ggml-cpu" This reverts commit 9e40d984ad27d7b60392fb2b7548885201864fe4. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml: move ggml_table_f32_f16 to ggml-cpu ref: https://github.com/ggml-org/llama.cpp/pull/14317#discussion_r2164775006 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> (cherry picked from commit 9e40d984ad27d7b60392fb2b7548885201864fe4) * ggml: move ggml_table_f32_f16 to ggml-cpu.c Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: extern c ggml_table_f32_f16 + chore docs Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: dedup ggml_table_f32_f16 from simd-mappings.h we rely on the variable declaration in ggml-cpu.c instead Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml-cpu: dedup ggml_table_f32_f16 from simd-mappings.h" This reverts commit f71b21d2f74f5e03ec0c2b4fefd3cbf395aecf16. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: bring back ggml_table_f32_f16 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml-cpu: bring back ggml_table_f32_f16" This reverts commit 2dce119178bed5ef5c8398c4230ddd14fef80e49. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * fix ggml time initialization * fix f32_f16 table init * remove extra line --------- Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> Co-authored-by: slaren <slarengh@gmail.com>
This commit is contained in:
committed by
Georgi Gerganov
parent
99764f5767
commit
16aa7d151d
@ -131,6 +131,7 @@ option(GGML_RVV "ggml: enable rvv" ON)
|
|||||||
option(GGML_RV_ZFH "ggml: enable riscv zfh" OFF)
|
option(GGML_RV_ZFH "ggml: enable riscv zfh" OFF)
|
||||||
option(GGML_XTHEADVECTOR "ggml: enable xtheadvector" OFF)
|
option(GGML_XTHEADVECTOR "ggml: enable xtheadvector" OFF)
|
||||||
option(GGML_VXE "ggml: enable vxe" ON)
|
option(GGML_VXE "ggml: enable vxe" ON)
|
||||||
|
option(GGML_NNPA "ggml: enable nnpa" ON)
|
||||||
|
|
||||||
option(GGML_CPU_ALL_VARIANTS "ggml: build all variants of the CPU backend (requires GGML_BACKEND_DL)" OFF)
|
option(GGML_CPU_ALL_VARIANTS "ggml: build all variants of the CPU backend (requires GGML_BACKEND_DL)" OFF)
|
||||||
set(GGML_CPU_ARM_ARCH "" CACHE STRING "ggml: CPU architecture for ARM")
|
set(GGML_CPU_ARM_ARCH "" CACHE STRING "ggml: CPU architecture for ARM")
|
||||||
|
@ -101,6 +101,7 @@ extern "C" {
|
|||||||
GGML_BACKEND_API int ggml_cpu_has_riscv_v (void);
|
GGML_BACKEND_API int ggml_cpu_has_riscv_v (void);
|
||||||
GGML_BACKEND_API int ggml_cpu_has_vsx (void);
|
GGML_BACKEND_API int ggml_cpu_has_vsx (void);
|
||||||
GGML_BACKEND_API int ggml_cpu_has_vxe (void);
|
GGML_BACKEND_API int ggml_cpu_has_vxe (void);
|
||||||
|
GGML_BACKEND_API int ggml_cpu_has_nnpa (void);
|
||||||
GGML_BACKEND_API int ggml_cpu_has_wasm_simd (void);
|
GGML_BACKEND_API int ggml_cpu_has_wasm_simd (void);
|
||||||
GGML_BACKEND_API int ggml_cpu_has_llamafile (void);
|
GGML_BACKEND_API int ggml_cpu_has_llamafile (void);
|
||||||
|
|
||||||
|
@ -448,6 +448,7 @@ function(ggml_add_cpu_backend_variant_impl tag_name)
|
|||||||
|
|
||||||
# TODO: Separation to determine activation of VX/VXE/VXE2
|
# TODO: Separation to determine activation of VX/VXE/VXE2
|
||||||
if (${S390X_M} MATCHES "8561|8562")
|
if (${S390X_M} MATCHES "8561|8562")
|
||||||
|
set(GGML_NNPA OFF)
|
||||||
message(STATUS "z15 target")
|
message(STATUS "z15 target")
|
||||||
list(APPEND ARCH_FLAGS -march=z15)
|
list(APPEND ARCH_FLAGS -march=z15)
|
||||||
elseif (${S390X_M} MATCHES "3931")
|
elseif (${S390X_M} MATCHES "3931")
|
||||||
@ -464,7 +465,14 @@ function(ggml_add_cpu_backend_variant_impl tag_name)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (GGML_VXE)
|
if (GGML_VXE)
|
||||||
|
message(STATUS "VX/VXE/VXE2 enabled")
|
||||||
list(APPEND ARCH_FLAGS -mvx -mzvector)
|
list(APPEND ARCH_FLAGS -mvx -mzvector)
|
||||||
|
list(APPEND ARCH_DEFINITIONS GGML_VXE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GGML_NNPA)
|
||||||
|
message(STATUS "NNPA enabled")
|
||||||
|
list(APPEND ARCH_DEFINITIONS GGML_NNPA)
|
||||||
endif()
|
endif()
|
||||||
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "wasm")
|
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "wasm")
|
||||||
message(STATUS "Wasm detected")
|
message(STATUS "Wasm detected")
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "mmq.h"
|
#include "mmq.h"
|
||||||
#include "ggml-impl.h"
|
#include "ggml-impl.h"
|
||||||
#include "ggml-cpu-impl.h"
|
#include "ggml-cpu-impl.h"
|
||||||
|
#include "simd-mappings.h"
|
||||||
#include "quants.h"
|
#include "quants.h"
|
||||||
#include "ggml-quants.h"
|
#include "ggml-quants.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -453,7 +454,7 @@ void quantize_row_q8_K_vnni(const float * RESTRICT x, void * RESTRICT vy, int64_
|
|||||||
|
|
||||||
// Quantize these floats
|
// Quantize these floats
|
||||||
const float iscale = 127.f / amax;
|
const float iscale = 127.f / amax;
|
||||||
y[i].d = GGML_FP32_TO_FP16(1 / iscale);
|
y[i].d = GGML_CPU_FP32_TO_FP16(1 / iscale);
|
||||||
const float id = ( amax != 0.0f ) ? iscale : 0.f;
|
const float id = ( amax != 0.0f ) ? iscale : 0.f;
|
||||||
const __m512 vscale = _mm512_set1_ps(id);
|
const __m512 vscale = _mm512_set1_ps(id);
|
||||||
|
|
||||||
@ -1090,7 +1091,7 @@ struct acc_C<block_q8_0, block_q4_0, is_acc> {
|
|||||||
const __m512 vd0 = _mm512_cvtph_ps(_mm256_loadu_si256((const __m256i *)((const char *)packed_B + offset)));
|
const __m512 vd0 = _mm512_cvtph_ps(_mm256_loadu_si256((const __m256i *)((const char *)packed_B + offset)));
|
||||||
|
|
||||||
for (int m = 0; m < nr; ++m) {
|
for (int m = 0; m < nr; ++m) {
|
||||||
const __m512 vd1 = _mm512_set1_ps(GGML_FP16_TO_FP32(A[m * lda].d));
|
const __m512 vd1 = _mm512_set1_ps(GGML_CPU_FP16_TO_FP32(A[m * lda].d));
|
||||||
const __m512 vtile = _mm512_cvtepi32_ps(_mm512_loadu_si512(tile + m * TILE_N));
|
const __m512 vtile = _mm512_cvtepi32_ps(_mm512_loadu_si512(tile + m * TILE_N));
|
||||||
|
|
||||||
__m512 vsum;
|
__m512 vsum;
|
||||||
@ -1113,8 +1114,8 @@ struct acc_C<block_q8_1, block_q4_1, is_acc> {
|
|||||||
const __m512 vm0 = _mm512_cvtph_ps(_mm256_loadu_si256((const __m256i *)((const char *)packed_B + offset + TILE_N * sizeof(ggml_half))));
|
const __m512 vm0 = _mm512_cvtph_ps(_mm256_loadu_si256((const __m256i *)((const char *)packed_B + offset + TILE_N * sizeof(ggml_half))));
|
||||||
|
|
||||||
for (int m = 0; m < nr; ++m) {
|
for (int m = 0; m < nr; ++m) {
|
||||||
const __m512 vd1 = _mm512_set1_ps(GGML_FP16_TO_FP32(A[m * lda].d));
|
const __m512 vd1 = _mm512_set1_ps(GGML_CPU_FP16_TO_FP32(A[m * lda].d));
|
||||||
const __m512 vs1 = _mm512_set1_ps(GGML_FP16_TO_FP32(A[m * lda].s));
|
const __m512 vs1 = _mm512_set1_ps(GGML_CPU_FP16_TO_FP32(A[m * lda].s));
|
||||||
const __m512 vtile = _mm512_cvtepi32_ps(_mm512_loadu_si512(tile + m * TILE_N));
|
const __m512 vtile = _mm512_cvtepi32_ps(_mm512_loadu_si512(tile + m * TILE_N));
|
||||||
|
|
||||||
__m512 vsum;
|
__m512 vsum;
|
||||||
@ -1137,7 +1138,7 @@ struct acc_C<block_q8_0, block_q8_0, is_acc> {
|
|||||||
const __m512 vd0 = _mm512_cvtph_ps(_mm256_loadu_si256((const __m256i *)((const char *)packed_B + offset)));
|
const __m512 vd0 = _mm512_cvtph_ps(_mm256_loadu_si256((const __m256i *)((const char *)packed_B + offset)));
|
||||||
|
|
||||||
for (int m = 0; m < nr; ++m) {
|
for (int m = 0; m < nr; ++m) {
|
||||||
const __m512 vd1 = _mm512_set1_ps(GGML_FP16_TO_FP32(A[m * lda].d));
|
const __m512 vd1 = _mm512_set1_ps(GGML_CPU_FP16_TO_FP32(A[m * lda].d));
|
||||||
const __m512 vtile = _mm512_cvtepi32_ps(_mm512_loadu_si512(tile + m * TILE_N));
|
const __m512 vtile = _mm512_cvtepi32_ps(_mm512_loadu_si512(tile + m * TILE_N));
|
||||||
|
|
||||||
__m512 vsum;
|
__m512 vsum;
|
||||||
@ -1437,7 +1438,7 @@ struct tinygemm_kernel_vnni<block_q8_0, block_q4_0, float, BLOCK_M, BLOCK_N, BLO
|
|||||||
va[k] = _mm512_set1_epi32(a_ptr[k]);
|
va[k] = _mm512_set1_epi32(a_ptr[k]);
|
||||||
vcomp = _mm512_dpbusd_epi32(vcomp, off, va[k]);
|
vcomp = _mm512_dpbusd_epi32(vcomp, off, va[k]);
|
||||||
}
|
}
|
||||||
vd1 = _mm512_set1_ps(GGML_FP16_TO_FP32(A[0 * KB + i].d));
|
vd1 = _mm512_set1_ps(GGML_CPU_FP16_TO_FP32(A[0 * KB + i].d));
|
||||||
}
|
}
|
||||||
|
|
||||||
// load b
|
// load b
|
||||||
@ -1498,8 +1499,8 @@ struct tinygemm_kernel_vnni<block_q8_1, block_q4_1, float, 1, BLOCK_N, BLOCK_K>
|
|||||||
for (int k = 0; k < 8; ++k) {
|
for (int k = 0; k < 8; ++k) {
|
||||||
va[k] = _mm512_set1_epi32(a_ptr[k]);
|
va[k] = _mm512_set1_epi32(a_ptr[k]);
|
||||||
}
|
}
|
||||||
vd1 = _mm512_set1_ps(GGML_FP16_TO_FP32(A[0 * KB + i].d));
|
vd1 = _mm512_set1_ps(GGML_CPU_FP16_TO_FP32(A[0 * KB + i].d));
|
||||||
vs1 = _mm512_set1_ps(GGML_FP16_TO_FP32(A[0 * KB + i].s));
|
vs1 = _mm512_set1_ps(GGML_CPU_FP16_TO_FP32(A[0 * KB + i].s));
|
||||||
}
|
}
|
||||||
|
|
||||||
// load b
|
// load b
|
||||||
@ -1571,7 +1572,7 @@ struct tinygemm_kernel_vnni<block_q8_0, block_q8_0, float, BLOCK_M, BLOCK_N, BLO
|
|||||||
va[k] = _mm512_set1_epi32(a_ptr[k]);
|
va[k] = _mm512_set1_epi32(a_ptr[k]);
|
||||||
va[k] = _mm512_add_epi8(va[k], off);
|
va[k] = _mm512_add_epi8(va[k], off);
|
||||||
}
|
}
|
||||||
vd1 = _mm512_set1_ps(GGML_FP16_TO_FP32(A[0 * KB + i].d));
|
vd1 = _mm512_set1_ps(GGML_CPU_FP16_TO_FP32(A[0 * KB + i].d));
|
||||||
}
|
}
|
||||||
|
|
||||||
// load b
|
// load b
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "ggml-quants.h"
|
#include "ggml-quants.h"
|
||||||
#include "ggml-impl.h"
|
#include "ggml-impl.h"
|
||||||
#include "ggml-cpu.h"
|
#include "ggml-cpu.h"
|
||||||
|
#include "simd-mappings.h"
|
||||||
|
|
||||||
#include "../../quants.h"
|
#include "../../quants.h"
|
||||||
#include "../../ggml-cpu-impl.h"
|
#include "../../ggml-cpu-impl.h"
|
||||||
@ -62,7 +63,7 @@ void quantize_row_q8_0(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
const float d = amax / ((1 << 7) - 1);
|
const float d = amax / ((1 << 7) - 1);
|
||||||
const float id = d ? 1.0f/d : 0.0f;
|
const float id = d ? 1.0f/d : 0.0f;
|
||||||
|
|
||||||
y[i].d = GGML_FP32_TO_FP16(d);
|
y[i].d = GGML_CPU_FP32_TO_FP16(d);
|
||||||
|
|
||||||
for (int j = 0; j < 8; j++) {
|
for (int j = 0; j < 8; j++) {
|
||||||
const float32x4_t v = vmulq_n_f32(srcv[j], id);
|
const float32x4_t v = vmulq_n_f32(srcv[j], id);
|
||||||
@ -104,7 +105,7 @@ void quantize_row_q8_1(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
const float d = amax / ((1 << 7) - 1);
|
const float d = amax / ((1 << 7) - 1);
|
||||||
const float id = d ? 1.0f/d : 0.0f;
|
const float id = d ? 1.0f/d : 0.0f;
|
||||||
|
|
||||||
y[i].d = GGML_FP32_TO_FP16(d);
|
y[i].d = GGML_CPU_FP32_TO_FP16(d);
|
||||||
|
|
||||||
int32x4_t accv = vdupq_n_s32(0);
|
int32x4_t accv = vdupq_n_s32(0);
|
||||||
|
|
||||||
@ -120,7 +121,7 @@ void quantize_row_q8_1(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
accv = vaddq_s32(accv, vi);
|
accv = vaddq_s32(accv, vi);
|
||||||
}
|
}
|
||||||
|
|
||||||
y[i].s = GGML_FP32_TO_FP16(d * vaddvq_s32(accv));
|
y[i].s = GGML_CPU_FP32_TO_FP16(d * vaddvq_s32(accv));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
GGML_UNUSED(nb);
|
GGML_UNUSED(nb);
|
||||||
@ -194,10 +195,10 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const int8x16_t y1_h = vld1q_s8(b_y1->qs + 16);
|
const int8x16_t y1_h = vld1q_s8(b_y1->qs + 16);
|
||||||
|
|
||||||
float32_t _scale[4] = {
|
float32_t _scale[4] = {
|
||||||
GGML_FP16_TO_FP32(b_x0->d)*GGML_FP16_TO_FP32(b_y0->d),
|
GGML_CPU_FP16_TO_FP32(b_x0->d)*GGML_CPU_FP16_TO_FP32(b_y0->d),
|
||||||
GGML_FP16_TO_FP32(b_x0->d)*GGML_FP16_TO_FP32(b_y1->d),
|
GGML_CPU_FP16_TO_FP32(b_x0->d)*GGML_CPU_FP16_TO_FP32(b_y1->d),
|
||||||
GGML_FP16_TO_FP32(b_x1->d)*GGML_FP16_TO_FP32(b_y0->d),
|
GGML_CPU_FP16_TO_FP32(b_x1->d)*GGML_CPU_FP16_TO_FP32(b_y0->d),
|
||||||
GGML_FP16_TO_FP32(b_x1->d)*GGML_FP16_TO_FP32(b_y1->d)
|
GGML_CPU_FP16_TO_FP32(b_x1->d)*GGML_CPU_FP16_TO_FP32(b_y1->d)
|
||||||
};
|
};
|
||||||
float32x4_t scale = vld1q_f32(_scale);
|
float32x4_t scale = vld1q_f32(_scale);
|
||||||
|
|
||||||
@ -274,10 +275,10 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
// dot product
|
// dot product
|
||||||
sumv0 = svmla_n_f32_x(ph4, sumv0, svcvt_f32_s32_x(ph4, svadd_x(ph4,
|
sumv0 = svmla_n_f32_x(ph4, sumv0, svcvt_f32_s32_x(ph4, svadd_x(ph4,
|
||||||
svdot_s32(svdup_n_s32(0), qx0ls, qy0l),
|
svdot_s32(svdup_n_s32(0), qx0ls, qy0l),
|
||||||
svdot_s32(svdup_n_s32(0), qx0hs, qy0h))), GGML_FP16_TO_FP32(x0->d)*GGML_FP16_TO_FP32(y0->d));
|
svdot_s32(svdup_n_s32(0), qx0hs, qy0h))), GGML_CPU_FP16_TO_FP32(x0->d)*GGML_CPU_FP16_TO_FP32(y0->d));
|
||||||
sumv1 = svmla_n_f32_x(ph4, sumv1, svcvt_f32_s32_x(ph4, svadd_x(ph4,
|
sumv1 = svmla_n_f32_x(ph4, sumv1, svcvt_f32_s32_x(ph4, svadd_x(ph4,
|
||||||
svdot_s32(svdup_n_s32(0), qx1ls, qy1l),
|
svdot_s32(svdup_n_s32(0), qx1ls, qy1l),
|
||||||
svdot_s32(svdup_n_s32(0), qx1hs, qy1h))), GGML_FP16_TO_FP32(x1->d)*GGML_FP16_TO_FP32(y1->d));
|
svdot_s32(svdup_n_s32(0), qx1hs, qy1h))), GGML_CPU_FP16_TO_FP32(x1->d)*GGML_CPU_FP16_TO_FP32(y1->d));
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf = svaddv_f32(svptrue_b32(), svadd_f32_x(svptrue_b32(), sumv0, sumv1));
|
sumf = svaddv_f32(svptrue_b32(), svadd_f32_x(svptrue_b32(), sumv0, sumv1));
|
||||||
@ -313,9 +314,9 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
// dot product
|
// dot product
|
||||||
sumv0 = svmla_n_f32_x(svptrue_b32(), sumv0, svcvt_f32_s32_x(svptrue_b32(),
|
sumv0 = svmla_n_f32_x(svptrue_b32(), sumv0, svcvt_f32_s32_x(svptrue_b32(),
|
||||||
svdot_s32(svdup_n_s32(0), qx0s, qy0)), GGML_FP16_TO_FP32(x0->d)*GGML_FP16_TO_FP32(y0->d));
|
svdot_s32(svdup_n_s32(0), qx0s, qy0)), GGML_CPU_FP16_TO_FP32(x0->d)*GGML_CPU_FP16_TO_FP32(y0->d));
|
||||||
sumv1 = svmla_n_f32_x(svptrue_b32(), sumv1, svcvt_f32_s32_x(svptrue_b32(),
|
sumv1 = svmla_n_f32_x(svptrue_b32(), sumv1, svcvt_f32_s32_x(svptrue_b32(),
|
||||||
svdot_s32(svdup_n_s32(0), qx1s, qy1)), GGML_FP16_TO_FP32(x1->d)*GGML_FP16_TO_FP32(y1->d));
|
svdot_s32(svdup_n_s32(0), qx1s, qy1)), GGML_CPU_FP16_TO_FP32(x1->d)*GGML_CPU_FP16_TO_FP32(y1->d));
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf = svaddv_f32(svptrue_b32(), svadd_f32_x(svptrue_b32(), sumv0, sumv1));
|
sumf = svaddv_f32(svptrue_b32(), svadd_f32_x(svptrue_b32(), sumv0, sumv1));
|
||||||
@ -354,9 +355,9 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
// dot product
|
// dot product
|
||||||
sumv0 = svmla_n_f32_x(ph32, sumv0, svcvt_f32_s32_x(ph32,
|
sumv0 = svmla_n_f32_x(ph32, sumv0, svcvt_f32_s32_x(ph32,
|
||||||
svdot_s32(svdup_n_s32(0), qx0s, qy0)), GGML_FP16_TO_FP32(x0->d)*GGML_FP16_TO_FP32(y0->d));
|
svdot_s32(svdup_n_s32(0), qx0s, qy0)), GGML_CPU_FP16_TO_FP32(x0->d)*GGML_CPU_FP16_TO_FP32(y0->d));
|
||||||
sumv1 = svmla_n_f32_x(ph32, sumv1, svcvt_f32_s32_x(ph32,
|
sumv1 = svmla_n_f32_x(ph32, sumv1, svcvt_f32_s32_x(ph32,
|
||||||
svdot_s32(svdup_n_s32(0), qx1s, qy1)), GGML_FP16_TO_FP32(x1->d)*GGML_FP16_TO_FP32(y1->d));
|
svdot_s32(svdup_n_s32(0), qx1s, qy1)), GGML_CPU_FP16_TO_FP32(x1->d)*GGML_CPU_FP16_TO_FP32(y1->d));
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf = svaddv_f32(ph32, svadd_f32_x(ph32, sumv0, sumv1));
|
sumf = svaddv_f32(ph32, svadd_f32_x(ph32, sumv0, sumv1));
|
||||||
@ -404,8 +405,8 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const int32x4_t p_0 = ggml_vdotq_s32(ggml_vdotq_s32(vdupq_n_s32(0), v0_0ls, v1_0l), v0_0hs, v1_0h);
|
const int32x4_t p_0 = ggml_vdotq_s32(ggml_vdotq_s32(vdupq_n_s32(0), v0_0ls, v1_0l), v0_0hs, v1_0h);
|
||||||
const int32x4_t p_1 = ggml_vdotq_s32(ggml_vdotq_s32(vdupq_n_s32(0), v0_1ls, v1_1l), v0_1hs, v1_1h);
|
const int32x4_t p_1 = ggml_vdotq_s32(ggml_vdotq_s32(vdupq_n_s32(0), v0_1ls, v1_1l), v0_1hs, v1_1h);
|
||||||
|
|
||||||
sumv0 = vmlaq_n_f32(sumv0, vcvtq_f32_s32(p_0), GGML_FP16_TO_FP32(x0->d)*GGML_FP16_TO_FP32(y0->d));
|
sumv0 = vmlaq_n_f32(sumv0, vcvtq_f32_s32(p_0), GGML_CPU_FP16_TO_FP32(x0->d)*GGML_CPU_FP16_TO_FP32(y0->d));
|
||||||
sumv1 = vmlaq_n_f32(sumv1, vcvtq_f32_s32(p_1), GGML_FP16_TO_FP32(x1->d)*GGML_FP16_TO_FP32(y1->d));
|
sumv1 = vmlaq_n_f32(sumv1, vcvtq_f32_s32(p_1), GGML_CPU_FP16_TO_FP32(x1->d)*GGML_CPU_FP16_TO_FP32(y1->d));
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf = vaddvq_f32(sumv0) + vaddvq_f32(sumv1);
|
sumf = vaddvq_f32(sumv0) + vaddvq_f32(sumv1);
|
||||||
@ -423,7 +424,7 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += sumi*GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d);
|
sumf += sumi*GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -464,10 +465,10 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const block_q8_1 * GGML_RESTRICT b_y1 = &vy1[i];
|
const block_q8_1 * GGML_RESTRICT b_y1 = &vy1[i];
|
||||||
|
|
||||||
float32_t summs_t[4] = {
|
float32_t summs_t[4] = {
|
||||||
GGML_FP16_TO_FP32(b_x0->m) * GGML_FP16_TO_FP32(b_y0->s),
|
GGML_CPU_FP16_TO_FP32(b_x0->m) * GGML_CPU_FP16_TO_FP32(b_y0->s),
|
||||||
GGML_FP16_TO_FP32(b_x1->m) * GGML_FP16_TO_FP32(b_y0->s),
|
GGML_CPU_FP16_TO_FP32(b_x1->m) * GGML_CPU_FP16_TO_FP32(b_y0->s),
|
||||||
GGML_FP16_TO_FP32(b_x0->m) * GGML_FP16_TO_FP32(b_y1->s),
|
GGML_CPU_FP16_TO_FP32(b_x0->m) * GGML_CPU_FP16_TO_FP32(b_y1->s),
|
||||||
GGML_FP16_TO_FP32(b_x1->m) * GGML_FP16_TO_FP32(b_y1->s)
|
GGML_CPU_FP16_TO_FP32(b_x1->m) * GGML_CPU_FP16_TO_FP32(b_y1->s)
|
||||||
};
|
};
|
||||||
summs0 = vaddq_f32(summs0, vld1q_f32(summs_t));
|
summs0 = vaddq_f32(summs0, vld1q_f32(summs_t));
|
||||||
|
|
||||||
@ -490,10 +491,10 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
// mmla into int32x4_t
|
// mmla into int32x4_t
|
||||||
float32_t _scale[4] = {
|
float32_t _scale[4] = {
|
||||||
GGML_FP16_TO_FP32(b_x0->d)*GGML_FP16_TO_FP32(b_y0->d),
|
GGML_CPU_FP16_TO_FP32(b_x0->d)*GGML_CPU_FP16_TO_FP32(b_y0->d),
|
||||||
GGML_FP16_TO_FP32(b_x0->d)*GGML_FP16_TO_FP32(b_y1->d),
|
GGML_CPU_FP16_TO_FP32(b_x0->d)*GGML_CPU_FP16_TO_FP32(b_y1->d),
|
||||||
GGML_FP16_TO_FP32(b_x1->d)*GGML_FP16_TO_FP32(b_y0->d),
|
GGML_CPU_FP16_TO_FP32(b_x1->d)*GGML_CPU_FP16_TO_FP32(b_y0->d),
|
||||||
GGML_FP16_TO_FP32(b_x1->d)*GGML_FP16_TO_FP32(b_y1->d)
|
GGML_CPU_FP16_TO_FP32(b_x1->d)*GGML_CPU_FP16_TO_FP32(b_y1->d)
|
||||||
};
|
};
|
||||||
float32x4_t scale = vld1q_f32(_scale);
|
float32x4_t scale = vld1q_f32(_scale);
|
||||||
|
|
||||||
@ -539,7 +540,7 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const block_q8_1 * GGML_RESTRICT y0 = &y[ib + 0];
|
const block_q8_1 * GGML_RESTRICT y0 = &y[ib + 0];
|
||||||
const block_q8_1 * GGML_RESTRICT y1 = &y[ib + 1];
|
const block_q8_1 * GGML_RESTRICT y1 = &y[ib + 1];
|
||||||
|
|
||||||
summs += GGML_FP16_TO_FP32(x0->m) * GGML_FP16_TO_FP32(y0->s) + GGML_FP16_TO_FP32(x1->m) * GGML_FP16_TO_FP32(y1->s);
|
summs += GGML_CPU_FP16_TO_FP32(x0->m) * GGML_CPU_FP16_TO_FP32(y0->s) + GGML_CPU_FP16_TO_FP32(x1->m) * GGML_CPU_FP16_TO_FP32(y1->s);
|
||||||
|
|
||||||
const uint8x16_t m4b = vdupq_n_u8(0x0F);
|
const uint8x16_t m4b = vdupq_n_u8(0x0F);
|
||||||
|
|
||||||
@ -562,8 +563,8 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const int32x4_t p_0 = ggml_vdotq_s32(ggml_vdotq_s32(vdupq_n_s32(0), v0_0l, v1_0l), v0_0h, v1_0h);
|
const int32x4_t p_0 = ggml_vdotq_s32(ggml_vdotq_s32(vdupq_n_s32(0), v0_0l, v1_0l), v0_0h, v1_0h);
|
||||||
const int32x4_t p_1 = ggml_vdotq_s32(ggml_vdotq_s32(vdupq_n_s32(0), v0_1l, v1_1l), v0_1h, v1_1h);
|
const int32x4_t p_1 = ggml_vdotq_s32(ggml_vdotq_s32(vdupq_n_s32(0), v0_1l, v1_1l), v0_1h, v1_1h);
|
||||||
|
|
||||||
sumv0 = vmlaq_n_f32(sumv0, vcvtq_f32_s32(p_0), GGML_FP16_TO_FP32(x0->d)*GGML_FP16_TO_FP32(y0->d));
|
sumv0 = vmlaq_n_f32(sumv0, vcvtq_f32_s32(p_0), GGML_CPU_FP16_TO_FP32(x0->d)*GGML_CPU_FP16_TO_FP32(y0->d));
|
||||||
sumv1 = vmlaq_n_f32(sumv1, vcvtq_f32_s32(p_1), GGML_FP16_TO_FP32(x1->d)*GGML_FP16_TO_FP32(y1->d));
|
sumv1 = vmlaq_n_f32(sumv1, vcvtq_f32_s32(p_1), GGML_CPU_FP16_TO_FP32(x1->d)*GGML_CPU_FP16_TO_FP32(y1->d));
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf = vaddvq_f32(sumv0) + vaddvq_f32(sumv1) + summs;
|
sumf = vaddvq_f32(sumv0) + vaddvq_f32(sumv1) + summs;
|
||||||
@ -582,7 +583,7 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -666,10 +667,10 @@ void ggml_vec_dot_q5_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
sumv0 = vmlaq_n_f32(sumv0, vcvtq_f32_s32(vaddq_s32(
|
sumv0 = vmlaq_n_f32(sumv0, vcvtq_f32_s32(vaddq_s32(
|
||||||
ggml_vdotq_s32(vdupq_n_s32(0), v0_0lf, v1_0l),
|
ggml_vdotq_s32(vdupq_n_s32(0), v0_0lf, v1_0l),
|
||||||
ggml_vdotq_s32(vdupq_n_s32(0), v0_0hf, v1_0h))), GGML_FP16_TO_FP32(x0->d)*GGML_FP16_TO_FP32(y0->d));
|
ggml_vdotq_s32(vdupq_n_s32(0), v0_0hf, v1_0h))), GGML_CPU_FP16_TO_FP32(x0->d)*GGML_CPU_FP16_TO_FP32(y0->d));
|
||||||
sumv1 = vmlaq_n_f32(sumv1, vcvtq_f32_s32(vaddq_s32(
|
sumv1 = vmlaq_n_f32(sumv1, vcvtq_f32_s32(vaddq_s32(
|
||||||
ggml_vdotq_s32(vdupq_n_s32(0), v0_1lf, v1_1l),
|
ggml_vdotq_s32(vdupq_n_s32(0), v0_1lf, v1_1l),
|
||||||
ggml_vdotq_s32(vdupq_n_s32(0), v0_1hf, v1_1h))), GGML_FP16_TO_FP32(x1->d)*GGML_FP16_TO_FP32(y1->d));
|
ggml_vdotq_s32(vdupq_n_s32(0), v0_1hf, v1_1h))), GGML_CPU_FP16_TO_FP32(x1->d)*GGML_CPU_FP16_TO_FP32(y1->d));
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf = vaddvq_f32(sumv0) + vaddvq_f32(sumv1);
|
sumf = vaddvq_f32(sumv0) + vaddvq_f32(sumv1);
|
||||||
@ -694,7 +695,7 @@ void ggml_vec_dot_q5_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d)) * sumi;
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d)) * sumi;
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -739,8 +740,8 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
const uint8x16_t m4b = vdupq_n_u8(0x0F);
|
const uint8x16_t m4b = vdupq_n_u8(0x0F);
|
||||||
|
|
||||||
summs0 += GGML_FP16_TO_FP32(x0->m) * GGML_FP16_TO_FP32(y0->s);
|
summs0 += GGML_CPU_FP16_TO_FP32(x0->m) * GGML_CPU_FP16_TO_FP32(y0->s);
|
||||||
summs1 += GGML_FP16_TO_FP32(x1->m) * GGML_FP16_TO_FP32(y1->s);
|
summs1 += GGML_CPU_FP16_TO_FP32(x1->m) * GGML_CPU_FP16_TO_FP32(y1->s);
|
||||||
|
|
||||||
// extract the 5th bit via lookup table ((b) << 4)
|
// extract the 5th bit via lookup table ((b) << 4)
|
||||||
memcpy(&qh0, x0->qh, sizeof(qh0));
|
memcpy(&qh0, x0->qh, sizeof(qh0));
|
||||||
@ -784,10 +785,10 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
sumv0 = vmlaq_n_f32(sumv0, vcvtq_f32_s32(vaddq_s32(
|
sumv0 = vmlaq_n_f32(sumv0, vcvtq_f32_s32(vaddq_s32(
|
||||||
ggml_vdotq_s32(vdupq_n_s32(0), v0_0lf, v1_0l),
|
ggml_vdotq_s32(vdupq_n_s32(0), v0_0lf, v1_0l),
|
||||||
ggml_vdotq_s32(vdupq_n_s32(0), v0_0hf, v1_0h))), GGML_FP16_TO_FP32(x0->d)*GGML_FP16_TO_FP32(y0->d));
|
ggml_vdotq_s32(vdupq_n_s32(0), v0_0hf, v1_0h))), GGML_CPU_FP16_TO_FP32(x0->d)*GGML_CPU_FP16_TO_FP32(y0->d));
|
||||||
sumv1 = vmlaq_n_f32(sumv1, vcvtq_f32_s32(vaddq_s32(
|
sumv1 = vmlaq_n_f32(sumv1, vcvtq_f32_s32(vaddq_s32(
|
||||||
ggml_vdotq_s32(vdupq_n_s32(0), v0_1lf, v1_1l),
|
ggml_vdotq_s32(vdupq_n_s32(0), v0_1lf, v1_1l),
|
||||||
ggml_vdotq_s32(vdupq_n_s32(0), v0_1hf, v1_1h))), GGML_FP16_TO_FP32(x1->d)*GGML_FP16_TO_FP32(y1->d));
|
ggml_vdotq_s32(vdupq_n_s32(0), v0_1hf, v1_1h))), GGML_CPU_FP16_TO_FP32(x1->d)*GGML_CPU_FP16_TO_FP32(y1->d));
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf = vaddvq_f32(sumv0) + vaddvq_f32(sumv1) + summs0 + summs1;
|
sumf = vaddvq_f32(sumv0) + vaddvq_f32(sumv1) + summs0 + summs1;
|
||||||
@ -812,7 +813,7 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -864,10 +865,10 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const int8x16_t y1_h = vld1q_s8(b_y1->qs + 16);
|
const int8x16_t y1_h = vld1q_s8(b_y1->qs + 16);
|
||||||
|
|
||||||
float32_t _scale[4] = {
|
float32_t _scale[4] = {
|
||||||
GGML_FP16_TO_FP32(b_x0->d)*GGML_FP16_TO_FP32(b_y0->d),
|
GGML_CPU_FP16_TO_FP32(b_x0->d)*GGML_CPU_FP16_TO_FP32(b_y0->d),
|
||||||
GGML_FP16_TO_FP32(b_x0->d)*GGML_FP16_TO_FP32(b_y1->d),
|
GGML_CPU_FP16_TO_FP32(b_x0->d)*GGML_CPU_FP16_TO_FP32(b_y1->d),
|
||||||
GGML_FP16_TO_FP32(b_x1->d)*GGML_FP16_TO_FP32(b_y0->d),
|
GGML_CPU_FP16_TO_FP32(b_x1->d)*GGML_CPU_FP16_TO_FP32(b_y0->d),
|
||||||
GGML_FP16_TO_FP32(b_x1->d)*GGML_FP16_TO_FP32(b_y1->d)
|
GGML_CPU_FP16_TO_FP32(b_x1->d)*GGML_CPU_FP16_TO_FP32(b_y1->d)
|
||||||
};
|
};
|
||||||
float32x4_t scale = vld1q_f32(_scale);
|
float32x4_t scale = vld1q_f32(_scale);
|
||||||
|
|
||||||
@ -934,10 +935,10 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
sumv0 = svmla_n_f32_x(pl16, sumv0, svcvt_f32_s32_x(pl16, svadd_x(pl16,
|
sumv0 = svmla_n_f32_x(pl16, sumv0, svcvt_f32_s32_x(pl16, svadd_x(pl16,
|
||||||
svdot_s32(svdup_n_s32(0), qx0_0, qy0_0),
|
svdot_s32(svdup_n_s32(0), qx0_0, qy0_0),
|
||||||
svdot_s32(svdup_n_s32(0), qx0_1, qy0_1))), GGML_FP16_TO_FP32(x0->d)*GGML_FP16_TO_FP32(y0->d));
|
svdot_s32(svdup_n_s32(0), qx0_1, qy0_1))), GGML_CPU_FP16_TO_FP32(x0->d)*GGML_CPU_FP16_TO_FP32(y0->d));
|
||||||
sumv1 = svmla_n_f32_x(pl16, sumv1, svcvt_f32_s32_x(pl16, svadd_x(pl16,
|
sumv1 = svmla_n_f32_x(pl16, sumv1, svcvt_f32_s32_x(pl16, svadd_x(pl16,
|
||||||
svdot_s32(svdup_n_s32(0), qx1_0, qy1_0),
|
svdot_s32(svdup_n_s32(0), qx1_0, qy1_0),
|
||||||
svdot_s32(svdup_n_s32(0), qx1_1, qy1_1))), GGML_FP16_TO_FP32(x1->d)*GGML_FP16_TO_FP32(y1->d));
|
svdot_s32(svdup_n_s32(0), qx1_1, qy1_1))), GGML_CPU_FP16_TO_FP32(x1->d)*GGML_CPU_FP16_TO_FP32(y1->d));
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf = svaddv_f32(pl16, svadd_f32_x(pl16, sumv0, sumv1));
|
sumf = svaddv_f32(pl16, svadd_f32_x(pl16, sumv0, sumv1));
|
||||||
@ -960,9 +961,9 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const svint8_t qy1 = svld1_s8(svptrue_b8(), y1->qs);
|
const svint8_t qy1 = svld1_s8(svptrue_b8(), y1->qs);
|
||||||
|
|
||||||
sumv0 = svmla_n_f32_x(svptrue_b32(), sumv0, svcvt_f32_s32_x(svptrue_b32(),
|
sumv0 = svmla_n_f32_x(svptrue_b32(), sumv0, svcvt_f32_s32_x(svptrue_b32(),
|
||||||
svdot_s32(svdup_n_s32(0), qx0, qy0)), GGML_FP16_TO_FP32(x0->d)*GGML_FP16_TO_FP32(y0->d));
|
svdot_s32(svdup_n_s32(0), qx0, qy0)), GGML_CPU_FP16_TO_FP32(x0->d)*GGML_CPU_FP16_TO_FP32(y0->d));
|
||||||
sumv1 = svmla_n_f32_x(svptrue_b32(), sumv1, svcvt_f32_s32_x(svptrue_b32(),
|
sumv1 = svmla_n_f32_x(svptrue_b32(), sumv1, svcvt_f32_s32_x(svptrue_b32(),
|
||||||
svdot_s32(svdup_n_s32(0), qx1, qy1)), GGML_FP16_TO_FP32(x1->d)*GGML_FP16_TO_FP32(y1->d));
|
svdot_s32(svdup_n_s32(0), qx1, qy1)), GGML_CPU_FP16_TO_FP32(x1->d)*GGML_CPU_FP16_TO_FP32(y1->d));
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf = svaddv_f32(svptrue_b32(), svadd_f32_x(svptrue_b32(), sumv0, sumv1));
|
sumf = svaddv_f32(svptrue_b32(), svadd_f32_x(svptrue_b32(), sumv0, sumv1));
|
||||||
@ -1002,8 +1003,8 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
qy_64 = svadd_s8_x(svptrue_b8(), qy_32, qy_64);
|
qy_64 = svadd_s8_x(svptrue_b8(), qy_32, qy_64);
|
||||||
|
|
||||||
// scale creation
|
// scale creation
|
||||||
const float32_t deq1 = GGML_FP16_TO_FP32(x0->d)*GGML_FP16_TO_FP32(y0->d);
|
const float32_t deq1 = GGML_CPU_FP16_TO_FP32(x0->d)*GGML_CPU_FP16_TO_FP32(y0->d);
|
||||||
const float32_t deq2 = GGML_FP16_TO_FP32(x1->d)*GGML_FP16_TO_FP32(y1->d);
|
const float32_t deq2 = GGML_CPU_FP16_TO_FP32(x1->d)*GGML_CPU_FP16_TO_FP32(y1->d);
|
||||||
|
|
||||||
// duplicate deq1 in first half of vector and deq2 in second half of vector
|
// duplicate deq1 in first half of vector and deq2 in second half of vector
|
||||||
const svfloat32_t temp = svdup_f32_m(svdup_f32_z(ph8, deq1), pl8, deq2);
|
const svfloat32_t temp = svdup_f32_m(svdup_f32_z(ph8, deq1), pl8, deq2);
|
||||||
@ -1043,11 +1044,11 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
sumv0 = vmlaq_n_f32(sumv0, vcvtq_f32_s32(vaddq_s32(
|
sumv0 = vmlaq_n_f32(sumv0, vcvtq_f32_s32(vaddq_s32(
|
||||||
ggml_vdotq_s32(vdupq_n_s32(0), x0_0, y0_0),
|
ggml_vdotq_s32(vdupq_n_s32(0), x0_0, y0_0),
|
||||||
ggml_vdotq_s32(vdupq_n_s32(0), x0_1, y0_1))), GGML_FP16_TO_FP32(x0->d)*GGML_FP16_TO_FP32(y0->d));
|
ggml_vdotq_s32(vdupq_n_s32(0), x0_1, y0_1))), GGML_CPU_FP16_TO_FP32(x0->d)*GGML_CPU_FP16_TO_FP32(y0->d));
|
||||||
|
|
||||||
sumv1 = vmlaq_n_f32(sumv1, vcvtq_f32_s32(vaddq_s32(
|
sumv1 = vmlaq_n_f32(sumv1, vcvtq_f32_s32(vaddq_s32(
|
||||||
ggml_vdotq_s32(vdupq_n_s32(0), x1_0, y1_0),
|
ggml_vdotq_s32(vdupq_n_s32(0), x1_0, y1_0),
|
||||||
ggml_vdotq_s32(vdupq_n_s32(0), x1_1, y1_1))), GGML_FP16_TO_FP32(x1->d)*GGML_FP16_TO_FP32(y1->d));
|
ggml_vdotq_s32(vdupq_n_s32(0), x1_1, y1_1))), GGML_CPU_FP16_TO_FP32(x1->d)*GGML_CPU_FP16_TO_FP32(y1->d));
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf = vaddvq_f32(sumv0) + vaddvq_f32(sumv1);
|
sumf = vaddvq_f32(sumv0) + vaddvq_f32(sumv1);
|
||||||
@ -1059,7 +1060,7 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
sumi += x[ib].qs[j]*y[ib].qs[j];
|
sumi += x[ib].qs[j]*y[ib].qs[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += sumi*(GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d));
|
sumf += sumi*(GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -1217,7 +1218,7 @@ void ggml_vec_dot_tq1_0_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
const int16x8_t ysum0 = vld1q_s16(y[i].bsums);
|
const int16x8_t ysum0 = vld1q_s16(y[i].bsums);
|
||||||
const int16x8_t ysum1 = vld1q_s16(y[i].bsums + 8);
|
const int16x8_t ysum1 = vld1q_s16(y[i].bsums + 8);
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
|
|
||||||
#if defined(__ARM_FEATURE_DOTPROD)
|
#if defined(__ARM_FEATURE_DOTPROD)
|
||||||
sumi0 = vaddq_s32(sumi0, sumi1);
|
sumi0 = vaddq_s32(sumi0, sumi1);
|
||||||
@ -1269,7 +1270,7 @@ void ggml_vec_dot_tq1_0_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += (float) sum * (GGML_FP16_TO_FP32(x[i].d) * y[i].d);
|
sumf += (float) sum * (GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -1362,7 +1363,7 @@ void ggml_vec_dot_tq2_0_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
const int16x8_t ysum0 = vld1q_s16(y[i].bsums);
|
const int16x8_t ysum0 = vld1q_s16(y[i].bsums);
|
||||||
const int16x8_t ysum1 = vld1q_s16(y[i].bsums + 8);
|
const int16x8_t ysum1 = vld1q_s16(y[i].bsums + 8);
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
|
|
||||||
#if defined(__ARM_FEATURE_DOTPROD)
|
#if defined(__ARM_FEATURE_DOTPROD)
|
||||||
sumi0 = vaddq_s32(sumi0, sumi1);
|
sumi0 = vaddq_s32(sumi0, sumi1);
|
||||||
@ -1393,7 +1394,7 @@ void ggml_vec_dot_tq2_0_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
|
|
||||||
sumf += (float) sumi * d;
|
sumf += (float) sumi * d;
|
||||||
}
|
}
|
||||||
@ -1425,9 +1426,9 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
switch (vector_length) {
|
switch (vector_length) {
|
||||||
case 128:
|
case 128:
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
svfloat32_t d_broad = svdup_n_f32((float32_t)d);
|
svfloat32_t d_broad = svdup_n_f32((float32_t)d);
|
||||||
const float dmin = -y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = -y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
svfloat32_t dmin_broad = svdup_n_f32((float32_t)dmin);
|
svfloat32_t dmin_broad = svdup_n_f32((float32_t)dmin);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
@ -1570,9 +1571,9 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
case 256:
|
case 256:
|
||||||
case 512:
|
case 512:
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
svfloat32_t d_broad = svdup_n_f32((float32_t)d);
|
svfloat32_t d_broad = svdup_n_f32((float32_t)d);
|
||||||
const float dmin = -y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = -y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
svfloat32_t dmin_broad = svdup_n_f32((float32_t)dmin);
|
svfloat32_t dmin_broad = svdup_n_f32((float32_t)dmin);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
@ -1671,8 +1672,8 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
float sum = 0;
|
float sum = 0;
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = -y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = -y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -1742,8 +1743,8 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
summs += y[i].bsums[j] * (sc[j] >> 4);
|
summs += y[i].bsums[j] * (sc[j] >> 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
const float dall = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float dall = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
int isum = 0;
|
int isum = 0;
|
||||||
int is = 0;
|
int is = 0;
|
||||||
@ -1805,7 +1806,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q3_sv = x[i].qs;
|
const uint8_t * GGML_RESTRICT q3_sv = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh_sv = x[i].hmask;
|
const uint8_t * GGML_RESTRICT qh_sv = x[i].hmask;
|
||||||
@ -1981,7 +1982,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].hmask;
|
const uint8_t * GGML_RESTRICT qh = x[i].hmask;
|
||||||
@ -2112,7 +2113,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -2258,18 +2259,18 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
bias[3] = vaddvq_s32(vaddq_s32(vmull_s16(vget_low_s16(y1_sums), vget_low_s16(x1_mins)),
|
bias[3] = vaddvq_s32(vaddq_s32(vmull_s16(vget_low_s16(y1_sums), vget_low_s16(x1_mins)),
|
||||||
vmull_s16(vget_high_s16(y1_sums), vget_high_s16(x1_mins))));
|
vmull_s16(vget_high_s16(y1_sums), vget_high_s16(x1_mins))));
|
||||||
const float32x4_t dmins = {
|
const float32x4_t dmins = {
|
||||||
GGML_FP16_TO_FP32(x0->dmin) * y0->d,
|
GGML_CPU_FP16_TO_FP32(x0->dmin) * y0->d,
|
||||||
GGML_FP16_TO_FP32(x0->dmin) * y1->d,
|
GGML_CPU_FP16_TO_FP32(x0->dmin) * y1->d,
|
||||||
GGML_FP16_TO_FP32(x1->dmin) * y0->d,
|
GGML_CPU_FP16_TO_FP32(x1->dmin) * y0->d,
|
||||||
GGML_FP16_TO_FP32(x1->dmin) * y1->d,
|
GGML_CPU_FP16_TO_FP32(x1->dmin) * y1->d,
|
||||||
};
|
};
|
||||||
vfsum = vmlsq_f32(vfsum, vcvtq_f32_s32(vld1q_s32(bias)), dmins);
|
vfsum = vmlsq_f32(vfsum, vcvtq_f32_s32(vld1q_s32(bias)), dmins);
|
||||||
|
|
||||||
const float32x4_t superblock_scale = {
|
const float32x4_t superblock_scale = {
|
||||||
GGML_FP16_TO_FP32(x0->d) * y0->d,
|
GGML_CPU_FP16_TO_FP32(x0->d) * y0->d,
|
||||||
GGML_FP16_TO_FP32(x0->d) * y1->d,
|
GGML_CPU_FP16_TO_FP32(x0->d) * y1->d,
|
||||||
GGML_FP16_TO_FP32(x1->d) * y0->d,
|
GGML_CPU_FP16_TO_FP32(x1->d) * y0->d,
|
||||||
GGML_FP16_TO_FP32(x1->d) * y1->d,
|
GGML_CPU_FP16_TO_FP32(x1->d) * y1->d,
|
||||||
};
|
};
|
||||||
vfsum = vmlaq_f32(vfsum, vcvtq_f32_s32(visum), superblock_scale);
|
vfsum = vmlaq_f32(vfsum, vcvtq_f32_s32(visum), superblock_scale);
|
||||||
}
|
}
|
||||||
@ -2289,8 +2290,8 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
const int16x8_t q8sums = vpaddq_s16(vld1q_s16(y[i].bsums), vld1q_s16(y[i].bsums + 8));
|
const int16x8_t q8sums = vpaddq_s16(vld1q_s16(y[i].bsums), vld1q_s16(y[i].bsums + 8));
|
||||||
|
|
||||||
@ -2377,8 +2378,8 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
const int16x8_t q8sums = vpaddq_s16(vld1q_s16(y[i].bsums), vld1q_s16(y[i].bsums + 8));
|
const int16x8_t q8sums = vpaddq_s16(vld1q_s16(y[i].bsums), vld1q_s16(y[i].bsums + 8));
|
||||||
|
|
||||||
@ -2478,9 +2479,9 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -2520,8 +2521,8 @@ void ggml_vec_dot_q5_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
const int16x8_t q8sums = vpaddq_s16(vld1q_s16(y[i].bsums), vld1q_s16(y[i].bsums + 8));
|
const int16x8_t q8sums = vpaddq_s16(vld1q_s16(y[i].bsums), vld1q_s16(y[i].bsums + 8));
|
||||||
|
|
||||||
@ -2630,9 +2631,9 @@ void ggml_vec_dot_q5_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -2827,10 +2828,10 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const int32x4_t vibias = vmulq_n_s32(vld1q_s32(bias), 32);
|
const int32x4_t vibias = vmulq_n_s32(vld1q_s32(bias), 32);
|
||||||
|
|
||||||
const float32x4_t superblock_scale = {
|
const float32x4_t superblock_scale = {
|
||||||
GGML_FP16_TO_FP32(x0->d) * y0->d,
|
GGML_CPU_FP16_TO_FP32(x0->d) * y0->d,
|
||||||
GGML_FP16_TO_FP32(x0->d) * y1->d,
|
GGML_CPU_FP16_TO_FP32(x0->d) * y1->d,
|
||||||
GGML_FP16_TO_FP32(x1->d) * y0->d,
|
GGML_CPU_FP16_TO_FP32(x1->d) * y0->d,
|
||||||
GGML_FP16_TO_FP32(x1->d) * y1->d,
|
GGML_CPU_FP16_TO_FP32(x1->d) * y1->d,
|
||||||
};
|
};
|
||||||
|
|
||||||
visum = vsubq_s32(visum, vibias);
|
visum = vsubq_s32(visum, vibias);
|
||||||
@ -2858,7 +2859,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
svuint8_t q6h_1, q6h_2, q6h_3, q6h_4;
|
svuint8_t q6h_1, q6h_2, q6h_3, q6h_4;
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d_all = GGML_FP16_TO_FP32(x[i].d);
|
const float d_all = GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q6 = x[i].ql;
|
const uint8_t * GGML_RESTRICT q6 = x[i].ql;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
@ -3011,7 +3012,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d_all = GGML_FP16_TO_FP32(x[i].d);
|
const float d_all = GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q6 = x[i].ql;
|
const uint8_t * GGML_RESTRICT q6 = x[i].ql;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
@ -3128,7 +3129,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -3199,7 +3200,7 @@ void ggml_vec_dot_iq2_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
float sumf1 = 0, sumf2 = 0;
|
float sumf1 = 0, sumf2 = 0;
|
||||||
@ -3234,7 +3235,7 @@ void ggml_vec_dot_iq2_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
int32_t bsum = 0;
|
int32_t bsum = 0;
|
||||||
@ -3284,7 +3285,7 @@ void ggml_vec_dot_iq2_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
|
|
||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
const uint8x8_t scales8 = vld1_u8(x[i].scales);
|
const uint8x8_t scales8 = vld1_u8(x[i].scales);
|
||||||
@ -3329,7 +3330,7 @@ void ggml_vec_dot_iq2_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT sc = x[i].scales;
|
const uint8_t * GGML_RESTRICT sc = x[i].scales;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -3398,7 +3399,7 @@ void ggml_vec_dot_iq2_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
@ -3458,7 +3459,7 @@ void ggml_vec_dot_iq2_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int i = 0; i < nb; i++) {
|
for (int i = 0; i < nb; i++) {
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const int8_t * q8 = y[i].qs;
|
const int8_t * q8 = y[i].qs;
|
||||||
const uint8_t * qs = x[i].qs;
|
const uint8_t * qs = x[i].qs;
|
||||||
const uint8_t * qh = x[i].qh;
|
const uint8_t * qh = x[i].qh;
|
||||||
@ -3521,7 +3522,7 @@ void ggml_vec_dot_iq3_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -3557,7 +3558,7 @@ void ggml_vec_dot_iq3_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -3630,7 +3631,7 @@ void ggml_vec_dot_iq3_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
const uint16_t * GGML_RESTRICT signs = (const uint16_t *)x[i].signs;
|
const uint16_t * GGML_RESTRICT signs = (const uint16_t *)x[i].signs;
|
||||||
@ -3691,7 +3692,7 @@ void ggml_vec_dot_iq3_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
const uint8_t * GGML_RESTRICT signs = x[i].signs;
|
const uint8_t * GGML_RESTRICT signs = x[i].signs;
|
||||||
@ -3786,7 +3787,7 @@ void ggml_vec_dot_iq1_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += y[i].d * GGML_FP16_TO_FP32(x[i].d) * (sumi1 + sumi2 + IQ1S_DELTA * sumi3);
|
sumf += y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d) * (sumi1 + sumi2 + IQ1S_DELTA * sumi3);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -3817,7 +3818,7 @@ void ggml_vec_dot_iq1_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
qs += 4;
|
qs += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += GGML_FP16_TO_FP32(x[i].d) * y[i].d * (sumi + IQ1S_DELTA * sumi1);
|
sumf += GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d * (sumi + IQ1S_DELTA * sumi1);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -3905,7 +3906,7 @@ void ggml_vec_dot_iq1_m_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += y[i].d * GGML_FP16_TO_FP32(scale.f16) * (vaddvq_s32(sumi1) + IQ1M_DELTA * vaddvq_s32(sumi2));
|
sumf += y[i].d * GGML_CPU_FP16_TO_FP32(scale.f16) * (vaddvq_s32(sumi1) + IQ1M_DELTA * vaddvq_s32(sumi2));
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -3952,7 +3953,7 @@ void ggml_vec_dot_iq1_m_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
qh += 2;
|
qh += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += GGML_FP16_TO_FP32(scale.f16) * y[i].d * (sumi1 + IQ1M_DELTA * sumi2);
|
sumf += GGML_CPU_FP16_TO_FP32(scale.f16) * y[i].d * (sumi1 + IQ1M_DELTA * sumi2);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -4003,13 +4004,13 @@ void ggml_vec_dot_iq4_nl_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
prod_2 = ggml_vdotq_s32(ggml_vdotq_s32(vdupq_n_s32(0), q4b.val[2], q8b.val[2]), q4b.val[3], q8b.val[3]);
|
prod_2 = ggml_vdotq_s32(ggml_vdotq_s32(vdupq_n_s32(0), q4b.val[2], q8b.val[2]), q4b.val[3], q8b.val[3]);
|
||||||
|
|
||||||
sumf +=
|
sumf +=
|
||||||
GGML_FP16_TO_FP32(x[ib+0].d) * GGML_FP16_TO_FP32(y[ib + 0].d) * vaddvq_s32(prod_1) +
|
GGML_CPU_FP16_TO_FP32(x[ib+0].d) * GGML_CPU_FP16_TO_FP32(y[ib + 0].d) * vaddvq_s32(prod_1) +
|
||||||
GGML_FP16_TO_FP32(x[ib+1].d) * GGML_FP16_TO_FP32(y[ib + 1].d) * vaddvq_s32(prod_2);
|
GGML_CPU_FP16_TO_FP32(x[ib+1].d) * GGML_CPU_FP16_TO_FP32(y[ib + 1].d) * vaddvq_s32(prod_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
const float d = GGML_FP16_TO_FP32(y[ib].d)*GGML_FP16_TO_FP32(x[ib].d);
|
const float d = GGML_CPU_FP16_TO_FP32(y[ib].d)*GGML_CPU_FP16_TO_FP32(x[ib].d);
|
||||||
int sumi1 = 0, sumi2 = 0;
|
int sumi1 = 0, sumi2 = 0;
|
||||||
for (int j = 0; j < QK4_NL/2; ++j) {
|
for (int j = 0; j < QK4_NL/2; ++j) {
|
||||||
sumi1 += y[ib].qs[j+ 0] * kvalues_iq4nl[x[ib].qs[j] & 0xf];
|
sumi1 += y[ib].qs[j+ 0] * kvalues_iq4nl[x[ib].qs[j] & 0xf];
|
||||||
@ -4071,7 +4072,7 @@ void ggml_vec_dot_iq4_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += GGML_FP16_TO_FP32(x[ibl].d) * y[ibl].d * (sumi1 + sumi2);
|
sumf += GGML_CPU_FP16_TO_FP32(x[ibl].d) * y[ibl].d * (sumi1 + sumi2);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -4079,7 +4080,7 @@ void ggml_vec_dot_iq4_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
#else
|
#else
|
||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int ibl = 0; ibl < nb; ++ibl) {
|
for (int ibl = 0; ibl < nb; ++ibl) {
|
||||||
const float d4d8 = GGML_FP16_TO_FP32(x[ibl].d) * y[ibl].d;
|
const float d4d8 = GGML_CPU_FP16_TO_FP32(x[ibl].d) * y[ibl].d;
|
||||||
uint16_t h = x[ibl].scales_h;
|
uint16_t h = x[ibl].scales_h;
|
||||||
const uint8_t * qs = x[ibl].qs;
|
const uint8_t * qs = x[ibl].qs;
|
||||||
const int8_t * q8 = y[ibl].qs;
|
const int8_t * q8 = y[ibl].qs;
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "ggml-impl.h"
|
#include "ggml-impl.h"
|
||||||
#include "ggml-cpu.h"
|
#include "ggml-cpu.h"
|
||||||
#include "ggml-cpu-impl.h"
|
#include "ggml-cpu-impl.h"
|
||||||
|
#include "simd-mappings.h"
|
||||||
#include "traits.h"
|
#include "traits.h"
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
@ -51,7 +52,7 @@ void ggml_quantize_mat_q8_0_4x4(const float * GGML_RESTRICT x, void * GGML_RESTR
|
|||||||
const float d = amax / ((1 << 7) - 1);
|
const float d = amax / ((1 << 7) - 1);
|
||||||
id[row_iter] = d ? 1.0f / d : 0.0f;
|
id[row_iter] = d ? 1.0f / d : 0.0f;
|
||||||
|
|
||||||
y[i].d[row_iter] = GGML_FP32_TO_FP16(d);
|
y[i].d[row_iter] = GGML_CPU_FP32_TO_FP16(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int j = 0; j < 8; j++) {
|
for (int j = 0; j < 8; j++) {
|
||||||
@ -102,7 +103,7 @@ void ggml_quantize_mat_q8_0_4x4(const float * GGML_RESTRICT x, void * GGML_RESTR
|
|||||||
const float d = amax / ((1 << 7) - 1);
|
const float d = amax / ((1 << 7) - 1);
|
||||||
id[row_iter] = d ? 1.0f / d : 0.0f;
|
id[row_iter] = d ? 1.0f / d : 0.0f;
|
||||||
|
|
||||||
y[i].d[row_iter] = GGML_FP32_TO_FP16(d);
|
y[i].d[row_iter] = GGML_CPU_FP32_TO_FP16(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int j = 0; j < QK8_0 * 4; j++) {
|
for (int j = 0; j < QK8_0 * 4; j++) {
|
||||||
@ -145,7 +146,7 @@ void ggml_quantize_mat_q8_0_4x8(const float * GGML_RESTRICT x, void * GGML_RESTR
|
|||||||
const float d = amax / ((1 << 7) - 1);
|
const float d = amax / ((1 << 7) - 1);
|
||||||
id[row_iter] = d ? 1.0f / d : 0.0f;
|
id[row_iter] = d ? 1.0f / d : 0.0f;
|
||||||
|
|
||||||
y[i].d[row_iter] = GGML_FP32_TO_FP16(d);
|
y[i].d[row_iter] = GGML_CPU_FP32_TO_FP16(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int j = 0; j < 4; j++) {
|
for (int j = 0; j < 4; j++) {
|
||||||
@ -221,7 +222,7 @@ void ggml_quantize_mat_q8_0_4x8(const float * GGML_RESTRICT x, void * GGML_RESTR
|
|||||||
const float d = amax / ((1 << 7) - 1);
|
const float d = amax / ((1 << 7) - 1);
|
||||||
id[row_iter] = d ? 1.0f / d : 0.0f;
|
id[row_iter] = d ? 1.0f / d : 0.0f;
|
||||||
|
|
||||||
y[i].d[row_iter] = GGML_FP32_TO_FP16(d);
|
y[i].d[row_iter] = GGML_CPU_FP32_TO_FP16(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int j = 0; j < QK8_0 * 4; j++) {
|
for (int j = 0; j < QK8_0 * 4; j++) {
|
||||||
@ -311,7 +312,7 @@ void ggml_gemv_q4_0_4x4_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
||||||
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d);
|
sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -399,7 +400,7 @@ void ggml_gemv_q4_0_4x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
||||||
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d);
|
sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -514,7 +515,7 @@ void ggml_gemv_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
||||||
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d);
|
sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -608,7 +609,7 @@ void ggml_gemv_iq4_nl_4x4_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
const int v1 = kvalues_iq4nl[b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] >> 4];
|
const int v1 = kvalues_iq4nl[b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] >> 4];
|
||||||
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2]));
|
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2]));
|
||||||
}
|
}
|
||||||
sumf[j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d);
|
sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1117,7 +1118,7 @@ void ggml_gemm_q4_0_4x4_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
||||||
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[m][j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d[m]);
|
sumf[m][j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d[m]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1570,7 +1571,7 @@ void ggml_gemm_q4_0_4x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
||||||
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[m][j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d[m]);
|
sumf[m][j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d[m]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2039,7 +2040,7 @@ void ggml_gemm_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
||||||
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[m][j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d[m]);
|
sumf[m][j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d[m]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2147,7 +2148,7 @@ void ggml_gemm_iq4_nl_4x4_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
||||||
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4]));
|
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4]));
|
||||||
}
|
}
|
||||||
sumf[m][j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d[m]);
|
sumf[m][j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d[m]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "ggml-quants.h"
|
#include "ggml-quants.h"
|
||||||
#include "ggml-impl.h"
|
#include "ggml-impl.h"
|
||||||
#include "ggml-cpu.h"
|
#include "ggml-cpu.h"
|
||||||
|
#include "simd-mappings.h"
|
||||||
|
|
||||||
#include "../../quants.h"
|
#include "../../quants.h"
|
||||||
#include "../../ggml-cpu-impl.h"
|
#include "../../ggml-cpu-impl.h"
|
||||||
@ -474,7 +475,7 @@ void quantize_row_q8_0(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
|
|
||||||
// Quantize these floats
|
// Quantize these floats
|
||||||
const float d = max_scalar / 127.f;
|
const float d = max_scalar / 127.f;
|
||||||
y[i].d = GGML_FP32_TO_FP16(d);
|
y[i].d = GGML_CPU_FP32_TO_FP16(d);
|
||||||
const float id = ( max_scalar != 0.0f ) ? 127.f / max_scalar : 0.0f;
|
const float id = ( max_scalar != 0.0f ) ? 127.f / max_scalar : 0.0f;
|
||||||
const __m256 mul = (__m256)__lasx_xvreplfr2vr_s( id );
|
const __m256 mul = (__m256)__lasx_xvreplfr2vr_s( id );
|
||||||
|
|
||||||
@ -548,7 +549,7 @@ void quantize_row_q8_1(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
|
|
||||||
// Quantize these floats
|
// Quantize these floats
|
||||||
const float d = max_scalar / 127.f;
|
const float d = max_scalar / 127.f;
|
||||||
y[i].d = GGML_FP32_TO_FP16(d);
|
y[i].d = GGML_CPU_FP32_TO_FP16(d);
|
||||||
const float id = ( max_scalar != 0.0f ) ? 127.f / max_scalar : 0.0f;
|
const float id = ( max_scalar != 0.0f ) ? 127.f / max_scalar : 0.0f;
|
||||||
const __m256 mul = __lasx_xvreplfr2vr_s( id );
|
const __m256 mul = __lasx_xvreplfr2vr_s( id );
|
||||||
|
|
||||||
@ -576,7 +577,7 @@ void quantize_row_q8_1(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
// Compute the sum of the quants and set y[i].s
|
// Compute the sum of the quants and set y[i].s
|
||||||
const __m128i s0 = __lsx_vadd_w(__lsx_vadd_w(ni0, ni1), __lsx_vadd_w(ni2, ni3));
|
const __m128i s0 = __lsx_vadd_w(__lsx_vadd_w(ni0, ni1), __lsx_vadd_w(ni2, ni3));
|
||||||
const __m128i s1 = __lsx_vadd_w(__lsx_vadd_w(ni4, ni5), __lsx_vadd_w(ni6, ni7));
|
const __m128i s1 = __lsx_vadd_w(__lsx_vadd_w(ni4, ni5), __lsx_vadd_w(ni6, ni7));
|
||||||
y[i].s = GGML_FP32_TO_FP16(d * hsum_i32_4(__lsx_vadd_w(s0, s1)));
|
y[i].s = GGML_CPU_FP32_TO_FP16(d * hsum_i32_4(__lsx_vadd_w(s0, s1)));
|
||||||
|
|
||||||
// Convert int32 to int16
|
// Convert int32 to int16
|
||||||
ni0 = lsx_packs_w( ni0, ni1 );
|
ni0 = lsx_packs_w( ni0, ni1 );
|
||||||
@ -667,7 +668,7 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
// Main loop
|
// Main loop
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
/* Compute combined scale for the block */
|
/* Compute combined scale for the block */
|
||||||
const __m256 d = __lasx_xvreplfr2vr_s( GGML_FP16_TO_FP32(x[ib].d) * GGML_FP16_TO_FP32(y[ib].d) );
|
const __m256 d = __lasx_xvreplfr2vr_s( GGML_CPU_FP16_TO_FP32(x[ib].d) * GGML_CPU_FP16_TO_FP32(y[ib].d) );
|
||||||
|
|
||||||
__m256i qx = bytes_from_nibbles_32(x[ib].qs);
|
__m256i qx = bytes_from_nibbles_32(x[ib].qs);
|
||||||
|
|
||||||
@ -699,7 +700,7 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (; ib + 1 < nb; ib += 2) {
|
for (; ib + 1 < nb; ib += 2) {
|
||||||
|
|
||||||
// Compute combined scale for the block 0 and 1
|
// Compute combined scale for the block 0 and 1
|
||||||
const __m128 d_0_1 = (__m128)__lsx_vreplgr2vr_w( GGML_FP16_TO_FP32(x[ib].d) * GGML_FP16_TO_FP32(y[ib].d) );
|
const __m128 d_0_1 = (__m128)__lsx_vreplgr2vr_w( GGML_CPU_FP16_TO_FP32(x[ib].d) * GGML_CPU_FP16_TO_FP32(y[ib].d) );
|
||||||
|
|
||||||
const __m128i tmp_0_1 = __lsx_vld((const __m128i *)x[ib].qs, 0);
|
const __m128i tmp_0_1 = __lsx_vld((const __m128i *)x[ib].qs, 0);
|
||||||
|
|
||||||
@ -717,7 +718,7 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
//_mm_prefetch(&y[ib] + 2 * sizeof(block_q8_0), _MM_HINT_T0);
|
//_mm_prefetch(&y[ib] + 2 * sizeof(block_q8_0), _MM_HINT_T0);
|
||||||
|
|
||||||
// Compute combined scale for the block 2 and 3
|
// Compute combined scale for the block 2 and 3
|
||||||
const __m128 d_2_3 = (__m128)__lsx_vreplgr2vr_w( GGML_FP16_TO_FP32(x[ib + 1].d) * GGML_FP16_TO_FP32(y[ib + 1].d) );
|
const __m128 d_2_3 = (__m128)__lsx_vreplgr2vr_w( GGML_CPU_FP16_TO_FP32(x[ib + 1].d) * GGML_CPU_FP16_TO_FP32(y[ib + 1].d) );
|
||||||
|
|
||||||
const __m128i tmp_2_3 = __lsx_vld((const __m128i *)x[ib + 1].qs, 0);
|
const __m128i tmp_2_3 = __lsx_vld((const __m128i *)x[ib + 1].qs, 0);
|
||||||
|
|
||||||
@ -766,7 +767,7 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += sumi*GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d);
|
sumf += sumi*GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -797,10 +798,10 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
// Main loop
|
// Main loop
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
const float d0 = GGML_FP16_TO_FP32(x[ib].d);
|
const float d0 = GGML_CPU_FP16_TO_FP32(x[ib].d);
|
||||||
const float d1 = GGML_FP16_TO_FP32(y[ib].d);
|
const float d1 = GGML_CPU_FP16_TO_FP32(y[ib].d);
|
||||||
|
|
||||||
summs += GGML_FP16_TO_FP32(x[ib].m) * GGML_FP16_TO_FP32(y[ib].s);
|
summs += GGML_CPU_FP16_TO_FP32(x[ib].m) * GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
|
|
||||||
const __m256 d0v = __lasx_xvreplfr2vr_s( d0 );
|
const __m256 d0v = __lasx_xvreplfr2vr_s( d0 );
|
||||||
const __m256 d1v = __lasx_xvreplfr2vr_s( d1 );
|
const __m256 d1v = __lasx_xvreplfr2vr_s( d1 );
|
||||||
@ -834,7 +835,7 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -865,7 +866,7 @@ void ggml_vec_dot_q5_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
// Main loop
|
// Main loop
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
/* Compute combined scale for the block */
|
/* Compute combined scale for the block */
|
||||||
const __m256 d = __lasx_xvreplfr2vr_s(GGML_FP16_TO_FP32(x[ib].d) * GGML_FP16_TO_FP32(y[ib].d)); //FIXME
|
const __m256 d = __lasx_xvreplfr2vr_s(GGML_CPU_FP16_TO_FP32(x[ib].d) * GGML_CPU_FP16_TO_FP32(y[ib].d)); //FIXME
|
||||||
|
|
||||||
__m256i qx = bytes_from_nibbles_32(x[ib].qs);
|
__m256i qx = bytes_from_nibbles_32(x[ib].qs);
|
||||||
__m256i bxhi = bytes_from_bits_32(x[ib].qh);
|
__m256i bxhi = bytes_from_bits_32(x[ib].qh);
|
||||||
@ -902,7 +903,7 @@ void ggml_vec_dot_q5_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d)) * sumi;
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d)) * sumi;
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -934,16 +935,16 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
// Main loop
|
// Main loop
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
const __m256 dx = __lasx_xvreplfr2vr_s(GGML_FP16_TO_FP32(x[ib].d));
|
const __m256 dx = __lasx_xvreplfr2vr_s(GGML_CPU_FP16_TO_FP32(x[ib].d));
|
||||||
|
|
||||||
summs += GGML_FP16_TO_FP32(x[ib].m) * GGML_FP16_TO_FP32(y[ib].s);
|
summs += GGML_CPU_FP16_TO_FP32(x[ib].m) * GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
|
|
||||||
__m256i qx = bytes_from_nibbles_32(x[ib].qs);
|
__m256i qx = bytes_from_nibbles_32(x[ib].qs);
|
||||||
__m256i bxhi = bytes_from_bits_32(x[ib].qh);
|
__m256i bxhi = bytes_from_bits_32(x[ib].qh);
|
||||||
bxhi = __lasx_xvand_v(bxhi, __lasx_xvreplgr2vr_b(0x10));
|
bxhi = __lasx_xvand_v(bxhi, __lasx_xvreplgr2vr_b(0x10));
|
||||||
qx = __lasx_xvor_v(qx, bxhi);
|
qx = __lasx_xvor_v(qx, bxhi);
|
||||||
|
|
||||||
const __m256 dy = __lasx_xvreplfr2vr_s(GGML_FP16_TO_FP32(y[ib].d));
|
const __m256 dy = __lasx_xvreplfr2vr_s(GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
const __m256i qy = __lasx_xvld((const __m256i *)y[ib].qs, 0);
|
const __m256i qy = __lasx_xvld((const __m256i *)y[ib].qs, 0);
|
||||||
|
|
||||||
const __m256 q = mul_sum_us8_pairs_float(qx, qy);
|
const __m256 q = mul_sum_us8_pairs_float(qx, qy);
|
||||||
@ -973,7 +974,7 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -1003,7 +1004,7 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
// Main loop
|
// Main loop
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
// Compute combined scale for the block
|
// Compute combined scale for the block
|
||||||
const __m256 d = __lasx_xvreplfr2vr_s(GGML_FP16_TO_FP32(x[ib].d) * GGML_FP16_TO_FP32(y[ib].d));
|
const __m256 d = __lasx_xvreplfr2vr_s(GGML_CPU_FP16_TO_FP32(x[ib].d) * GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
__m256i qx = __lasx_xvld((const __m256i *)x[ib].qs, 0);
|
__m256i qx = __lasx_xvld((const __m256i *)x[ib].qs, 0);
|
||||||
__m256i qy = __lasx_xvld((const __m256i *)y[ib].qs, 0);
|
__m256i qy = __lasx_xvld((const __m256i *)y[ib].qs, 0);
|
||||||
|
|
||||||
@ -1023,7 +1024,7 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
sumi += x[ib].qs[j]*y[ib].qs[j];
|
sumi += x[ib].qs[j]*y[ib].qs[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += sumi*(GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d));
|
sumf += sumi*(GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -1047,8 +1048,8 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = -y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = -y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -1116,8 +1117,8 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
summs += y[i].bsums[j] * (sc[j] >> 4);
|
summs += y[i].bsums[j] * (sc[j] >> 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
const float dall = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float dall = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
int isum = 0;
|
int isum = 0;
|
||||||
int is = 0;
|
int is = 0;
|
||||||
@ -1170,7 +1171,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
// Set up scales
|
// Set up scales
|
||||||
@ -1294,7 +1295,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -1330,8 +1331,8 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = -y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = -y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
memcpy(utmp, x[i].scales, 12);
|
memcpy(utmp, x[i].scales, 12);
|
||||||
utmp[3] = ((utmp[2] >> 4) & kmask2) | (((utmp[1] >> 6) & kmask3) << 4);
|
utmp[3] = ((utmp[2] >> 4) & kmask2) | (((utmp[1] >> 6) & kmask3) << 4);
|
||||||
@ -1438,9 +1439,9 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -1477,8 +1478,8 @@ void ggml_vec_dot_q5_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const uint8_t * GGML_RESTRICT q5 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q5 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = -y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = -y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
memcpy(utmp, x[i].scales, 12);
|
memcpy(utmp, x[i].scales, 12);
|
||||||
utmp[3] = ((utmp[2] >> 4) & kmask2) | (((utmp[1] >> 6) & kmask3) << 4);
|
utmp[3] = ((utmp[2] >> 4) & kmask2) | (((utmp[1] >> 6) & kmask3) << 4);
|
||||||
@ -1593,9 +1594,9 @@ void ggml_vec_dot_q5_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -1624,7 +1625,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q4 = x[i].ql;
|
const uint8_t * GGML_RESTRICT q4 = x[i].ql;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
@ -1713,7 +1714,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -1780,7 +1781,7 @@ void ggml_vec_dot_iq2_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
__m256 accumf = (__m256)__lasx_xvldi(0);
|
__m256 accumf = (__m256)__lasx_xvldi(0);
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
__m256i sumi1 = __lasx_xvldi(0);
|
__m256i sumi1 = __lasx_xvldi(0);
|
||||||
@ -1820,7 +1821,7 @@ void ggml_vec_dot_iq2_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
int32_t bsum = 0;
|
int32_t bsum = 0;
|
||||||
@ -1895,7 +1896,7 @@ void ggml_vec_dot_iq2_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
|
|
||||||
__m256 accumf = (__m256)__lasx_xvldi(0);
|
__m256 accumf = (__m256)__lasx_xvldi(0);
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
|
|
||||||
@ -1980,7 +1981,7 @@ void ggml_vec_dot_iq2_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT sc = x[i].scales;
|
const uint8_t * GGML_RESTRICT sc = x[i].scales;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -2049,7 +2050,7 @@ void ggml_vec_dot_iq2_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
__m256 accumf = (__m256)__lasx_xvldi(0);
|
__m256 accumf = (__m256)__lasx_xvldi(0);
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
const uint16_t * GGML_RESTRICT signs = (const uint16_t *)(x[i].qs + QK_K/8);
|
const uint16_t * GGML_RESTRICT signs = (const uint16_t *)(x[i].qs + QK_K/8);
|
||||||
@ -2108,7 +2109,7 @@ void ggml_vec_dot_iq2_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int i = 0; i < nb; i++) {
|
for (int i = 0; i < nb; i++) {
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const int8_t * q8 = y[i].qs;
|
const int8_t * q8 = y[i].qs;
|
||||||
const uint8_t * qs = x[i].qs;
|
const uint8_t * qs = x[i].qs;
|
||||||
const uint8_t * qh = x[i].qh;
|
const uint8_t * qh = x[i].qh;
|
||||||
@ -2168,7 +2169,7 @@ void ggml_vec_dot_iq3_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
__m256 accumf = (__m256)__lasx_xvldi(0);
|
__m256 accumf = (__m256)__lasx_xvldi(0);
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -2213,7 +2214,7 @@ void ggml_vec_dot_iq3_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -2279,7 +2280,7 @@ void ggml_vec_dot_iq3_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
__m256 accumf = (__m256)__lasx_xvldi(0);
|
__m256 accumf = (__m256)__lasx_xvldi(0);
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
const uint16_t * GGML_RESTRICT signs = (const uint16_t *)x[i].signs;
|
const uint16_t * GGML_RESTRICT signs = (const uint16_t *)x[i].signs;
|
||||||
@ -2340,7 +2341,7 @@ void ggml_vec_dot_iq3_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
const uint8_t * GGML_RESTRICT signs = x[i].signs;
|
const uint8_t * GGML_RESTRICT signs = x[i].signs;
|
||||||
@ -2451,7 +2452,7 @@ void ggml_vec_dot_iq1_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
+ (y[i].bsums[2*ib+2] + y[i].bsums[2*ib+3]) * (qh[ib+1] & 0x8000 ? -1 : 1) * ls2;
|
+ (y[i].bsums[2*ib+2] + y[i].bsums[2*ib+3]) * (qh[ib+1] & 0x8000 ? -1 : 1) * ls2;
|
||||||
}
|
}
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
accum = __lasx_xvfmadd_s(__lasx_xvreplfr2vr_s(d), __lasx_xvffint_s_w(sumi), accum);
|
accum = __lasx_xvfmadd_s(__lasx_xvreplfr2vr_s(d), __lasx_xvffint_s_w(sumi), accum);
|
||||||
accum1 += d * sumi1;
|
accum1 += d * sumi1;
|
||||||
}
|
}
|
||||||
@ -2484,7 +2485,7 @@ void ggml_vec_dot_iq1_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
qs += 4;
|
qs += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += GGML_FP16_TO_FP32(x[i].d) * y[i].d * (sumi + IQ1S_DELTA * sumi1);
|
sumf += GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d * (sumi + IQ1S_DELTA * sumi1);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -2530,9 +2531,9 @@ void ggml_vec_dot_iq4_nl_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
const __m256i p16_2 = mul_add_epi8(q4b_2, q8b_2);
|
const __m256i p16_2 = mul_add_epi8(q4b_2, q8b_2);
|
||||||
const __m256i p_1 = lasx_madd_h(p16_1, mone);
|
const __m256i p_1 = lasx_madd_h(p16_1, mone);
|
||||||
const __m256i p_2 = lasx_madd_h(p16_2, mone);
|
const __m256i p_2 = lasx_madd_h(p16_2, mone);
|
||||||
accum1 = __lasx_xvfmadd_s(__lasx_xvreplfr2vr_s(GGML_FP16_TO_FP32(y[ib + 0].d)*GGML_FP16_TO_FP32(x[ib + 0].d)),
|
accum1 = __lasx_xvfmadd_s(__lasx_xvreplfr2vr_s(GGML_CPU_FP16_TO_FP32(y[ib + 0].d)*GGML_CPU_FP16_TO_FP32(x[ib + 0].d)),
|
||||||
__lasx_xvffint_s_w(p_1), accum1);
|
__lasx_xvffint_s_w(p_1), accum1);
|
||||||
accum2 = __lasx_xvfmadd_s(__lasx_xvreplfr2vr_s(GGML_FP16_TO_FP32(y[ib + 1].d)*GGML_FP16_TO_FP32(x[ib + 1].d)),
|
accum2 = __lasx_xvfmadd_s(__lasx_xvreplfr2vr_s(GGML_CPU_FP16_TO_FP32(y[ib + 1].d)*GGML_CPU_FP16_TO_FP32(x[ib + 1].d)),
|
||||||
__lasx_xvffint_s_w(p_2), accum2);
|
__lasx_xvffint_s_w(p_2), accum2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2540,7 +2541,7 @@ void ggml_vec_dot_iq4_nl_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
const float d = GGML_FP16_TO_FP32(y[ib].d)*GGML_FP16_TO_FP32(x[ib].d);
|
const float d = GGML_CPU_FP16_TO_FP32(y[ib].d)*GGML_CPU_FP16_TO_FP32(x[ib].d);
|
||||||
int sumi1 = 0, sumi2 = 0;
|
int sumi1 = 0, sumi2 = 0;
|
||||||
for (int j = 0; j < QK4_NL/2; ++j) {
|
for (int j = 0; j < QK4_NL/2; ++j) {
|
||||||
sumi1 += y[ib].qs[j+ 0] * kvalues_iq4nl[x[ib].qs[j] & 0xf];
|
sumi1 += y[ib].qs[j+ 0] * kvalues_iq4nl[x[ib].qs[j] & 0xf];
|
||||||
@ -2595,7 +2596,7 @@ void ggml_vec_dot_iq4_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
sumi1 = __lasx_xvadd_w(p_1, sumi1);
|
sumi1 = __lasx_xvadd_w(p_1, sumi1);
|
||||||
sumi2 = __lasx_xvadd_w(p_2, sumi2);
|
sumi2 = __lasx_xvadd_w(p_2, sumi2);
|
||||||
}
|
}
|
||||||
accum = __lasx_xvfmadd_s(__lasx_xvreplfr2vr_s(GGML_FP16_TO_FP32(x[ibl].d)*y[ibl].d),
|
accum = __lasx_xvfmadd_s(__lasx_xvreplfr2vr_s(GGML_CPU_FP16_TO_FP32(x[ibl].d)*y[ibl].d),
|
||||||
__lasx_xvffint_s_w(__lasx_xvadd_w(sumi1, sumi2)), accum);
|
__lasx_xvffint_s_w(__lasx_xvadd_w(sumi1, sumi2)), accum);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2604,7 +2605,7 @@ void ggml_vec_dot_iq4_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
#else
|
#else
|
||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int ibl = 0; ibl < nb; ++ibl) {
|
for (int ibl = 0; ibl < nb; ++ibl) {
|
||||||
const float d4d8 = GGML_FP16_TO_FP32(x[ibl].d) * y[ibl].d;
|
const float d4d8 = GGML_CPU_FP16_TO_FP32(x[ibl].d) * y[ibl].d;
|
||||||
uint16_t h = x[ibl].scales_h;
|
uint16_t h = x[ibl].scales_h;
|
||||||
const uint8_t * qs = x[ibl].qs;
|
const uint8_t * qs = x[ibl].qs;
|
||||||
const int8_t * q8 = y[ibl].qs;
|
const int8_t * q8 = y[ibl].qs;
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "ggml-quants.h"
|
#include "ggml-quants.h"
|
||||||
#include "ggml-impl.h"
|
#include "ggml-impl.h"
|
||||||
#include "ggml-cpu.h"
|
#include "ggml-cpu.h"
|
||||||
|
#include "simd-mappings.h"
|
||||||
|
|
||||||
#include "../../quants.h"
|
#include "../../quants.h"
|
||||||
#include "../../ggml-cpu-impl.h"
|
#include "../../ggml-cpu-impl.h"
|
||||||
@ -67,7 +68,7 @@ void quantize_row_q8_0(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
const float id = d ? 1.0f/d : 0.0f;
|
const float id = d ? 1.0f/d : 0.0f;
|
||||||
const vector float vid = vec_splats(id);
|
const vector float vid = vec_splats(id);
|
||||||
|
|
||||||
y[i].d = GGML_FP32_TO_FP16(d);
|
y[i].d = GGML_CPU_FP32_TO_FP16(d);
|
||||||
|
|
||||||
for (int j = 0; j < 8; j++) {
|
for (int j = 0; j < 8; j++) {
|
||||||
const vector float v = vec_round(vec_mul(srcv[j], vid));
|
const vector float v = vec_round(vec_mul(srcv[j], vid));
|
||||||
@ -112,7 +113,7 @@ void quantize_row_q8_1(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
const float id = d ? 1.0f/d : 0.0f;
|
const float id = d ? 1.0f/d : 0.0f;
|
||||||
const vector float vid = vec_splats(id);
|
const vector float vid = vec_splats(id);
|
||||||
|
|
||||||
y[i].d = GGML_FP32_TO_FP16(d);
|
y[i].d = GGML_CPU_FP32_TO_FP16(d);
|
||||||
|
|
||||||
vector int accv = vec_splats(0);
|
vector int accv = vec_splats(0);
|
||||||
|
|
||||||
@ -127,7 +128,7 @@ void quantize_row_q8_1(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
|
|
||||||
accv = vec_add(accv, vec_sld(accv, accv, 4));
|
accv = vec_add(accv, vec_sld(accv, accv, 4));
|
||||||
accv = vec_add(accv, vec_sld(accv, accv, 8));
|
accv = vec_add(accv, vec_sld(accv, accv, 8));
|
||||||
y[i].s = GGML_FP32_TO_FP16(d * vec_extract(accv, 0));
|
y[i].s = GGML_CPU_FP32_TO_FP16(d * vec_extract(accv, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@ -170,8 +171,8 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
__builtin_prefetch(x[ib].qs, 0, 1);
|
__builtin_prefetch(x[ib].qs, 0, 1);
|
||||||
__builtin_prefetch(y[ib].qs, 0, 1);
|
__builtin_prefetch(y[ib].qs, 0, 1);
|
||||||
|
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[ib].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[ib].d));
|
||||||
vector float vyd = vec_splats(GGML_FP16_TO_FP32(y[ib].d));
|
vector float vyd = vec_splats(GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
vector signed char qxs = (vector signed char)vec_xl( 0, x[ib].qs);
|
vector signed char qxs = (vector signed char)vec_xl( 0, x[ib].qs);
|
||||||
@ -214,7 +215,7 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += sumi*GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d);
|
sumf += sumi*GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -249,12 +250,12 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
__builtin_prefetch(x[ib].qs, 0, 1);
|
__builtin_prefetch(x[ib].qs, 0, 1);
|
||||||
__builtin_prefetch(y[ib].qs, 0, 1);
|
__builtin_prefetch(y[ib].qs, 0, 1);
|
||||||
|
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[ib].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[ib].d));
|
||||||
vector float vyd = vec_splats(GGML_FP16_TO_FP32(y[ib].d));
|
vector float vyd = vec_splats(GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
vector float vxmin = vec_splats(GGML_FP16_TO_FP32(x[ib].m));
|
vector float vxmin = vec_splats(GGML_CPU_FP16_TO_FP32(x[ib].m));
|
||||||
vector float vys = {GGML_FP16_TO_FP32(y[ib].s), 0.0f, 0.0f, 0.0f};
|
vector float vys = {GGML_CPU_FP16_TO_FP32(y[ib].s), 0.0f, 0.0f, 0.0f};
|
||||||
vsumf0 = vec_madd(vxmin, vys, vsumf0);
|
vsumf0 = vec_madd(vxmin, vys, vsumf0);
|
||||||
|
|
||||||
vector signed char qxs = (vector signed char)vec_xl( 0, x[ib].qs);
|
vector signed char qxs = (vector signed char)vec_xl( 0, x[ib].qs);
|
||||||
@ -291,7 +292,7 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -326,8 +327,8 @@ void ggml_vec_dot_q5_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
__builtin_prefetch(x[ib].qs, 0, 1);
|
__builtin_prefetch(x[ib].qs, 0, 1);
|
||||||
__builtin_prefetch(y[ib].qs, 0, 1);
|
__builtin_prefetch(y[ib].qs, 0, 1);
|
||||||
|
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[ib].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[ib].d));
|
||||||
vector float vyd = vec_splats(GGML_FP16_TO_FP32(y[ib].d));
|
vector float vyd = vec_splats(GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
vector signed long long aux64x2_0 = {(uint64_t)(table_b2b_1[x[ib].qh[0]]), (uint64_t)(table_b2b_1[x[ib].qh[1]])};
|
vector signed long long aux64x2_0 = {(uint64_t)(table_b2b_1[x[ib].qh[0]]), (uint64_t)(table_b2b_1[x[ib].qh[1]])};
|
||||||
@ -379,7 +380,7 @@ void ggml_vec_dot_q5_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d)) * sumi;
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d)) * sumi;
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -415,12 +416,12 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
__builtin_prefetch(x[ib].qs, 0, 1);
|
__builtin_prefetch(x[ib].qs, 0, 1);
|
||||||
__builtin_prefetch(y[ib].qs, 0, 1);
|
__builtin_prefetch(y[ib].qs, 0, 1);
|
||||||
|
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[ib].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[ib].d));
|
||||||
vector float vyd = vec_splats(GGML_FP16_TO_FP32(y[ib].d));
|
vector float vyd = vec_splats(GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
vector float vxmin = vec_splats(GGML_FP16_TO_FP32(x[ib].m));
|
vector float vxmin = vec_splats(GGML_CPU_FP16_TO_FP32(x[ib].m));
|
||||||
vector float vys = {GGML_FP16_TO_FP32(y[ib].s), 0.f, 0.f, 0.f};
|
vector float vys = {GGML_CPU_FP16_TO_FP32(y[ib].s), 0.f, 0.f, 0.f};
|
||||||
vsumf0 = vec_madd(vxmin, vys, vsumf0);
|
vsumf0 = vec_madd(vxmin, vys, vsumf0);
|
||||||
|
|
||||||
vector unsigned long long aux64x2_0 = {(uint64_t)(table_b2b_0[x[ib].qh[0]]), (uint64_t)(table_b2b_0[x[ib].qh[1]])};
|
vector unsigned long long aux64x2_0 = {(uint64_t)(table_b2b_0[x[ib].qh[0]]), (uint64_t)(table_b2b_0[x[ib].qh[1]])};
|
||||||
@ -470,7 +471,7 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -502,8 +503,8 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
__builtin_prefetch(x[ib].qs, 0, 1);
|
__builtin_prefetch(x[ib].qs, 0, 1);
|
||||||
__builtin_prefetch(y[ib].qs, 0, 1);
|
__builtin_prefetch(y[ib].qs, 0, 1);
|
||||||
|
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[ib].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[ib].d));
|
||||||
vector float vyd = vec_splats(GGML_FP16_TO_FP32(y[ib].d));
|
vector float vyd = vec_splats(GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
vector signed char q8x0 = vec_xl( 0, x[ib].qs);
|
vector signed char q8x0 = vec_xl( 0, x[ib].qs);
|
||||||
@ -542,7 +543,7 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
sumi += x[ib].qs[j]*y[ib].qs[j];
|
sumi += x[ib].qs[j]*y[ib].qs[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += sumi*(GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d));
|
sumf += sumi*(GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -574,11 +575,11 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
vector float vsumf3 = vec_splats(0.0f);
|
vector float vsumf3 = vec_splats(0.0f);
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[i].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[i].d));
|
||||||
vector float vyd = vec_splats(y[i].d);
|
vector float vyd = vec_splats(y[i].d);
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
vector float vxmin = vec_splats(GGML_FP16_TO_FP32(x[i].dmin));
|
vector float vxmin = vec_splats(GGML_CPU_FP16_TO_FP32(x[i].dmin));
|
||||||
vector float vdmin = vec_mul(vxmin, vyd);
|
vector float vdmin = vec_mul(vxmin, vyd);
|
||||||
|
|
||||||
vector signed short q8ysums0 = vec_xl( 0, y[i].bsums);
|
vector signed short q8ysums0 = vec_xl( 0, y[i].bsums);
|
||||||
@ -708,8 +709,8 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
summs += y[i].bsums[j] * (sc[j] >> 4);
|
summs += y[i].bsums[j] * (sc[j] >> 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
const float dall = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float dall = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
int isum = 0;
|
int isum = 0;
|
||||||
int is = 0;
|
int is = 0;
|
||||||
@ -770,7 +771,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
vector float vsumf3 = vec_splats(0.0f);
|
vector float vsumf3 = vec_splats(0.0f);
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[i].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[i].d));
|
||||||
vector float vyd = vec_splats(y[i].d);
|
vector float vyd = vec_splats(y[i].d);
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
@ -962,7 +963,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -1005,11 +1006,11 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
vector float vsumf3 = vec_splats(0.0f);
|
vector float vsumf3 = vec_splats(0.0f);
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[i].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[i].d));
|
||||||
vector float vyd = vec_splats(y[i].d);
|
vector float vyd = vec_splats(y[i].d);
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
vector float vxmin = vec_splats(GGML_FP16_TO_FP32(x[i].dmin));
|
vector float vxmin = vec_splats(GGML_CPU_FP16_TO_FP32(x[i].dmin));
|
||||||
vector float vdmin = vec_mul(vxmin, vyd);
|
vector float vdmin = vec_mul(vxmin, vyd);
|
||||||
|
|
||||||
vector signed short q8ysums0 = vec_xl( 0, y[i].bsums);
|
vector signed short q8ysums0 = vec_xl( 0, y[i].bsums);
|
||||||
@ -1177,9 +1178,9 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -1222,11 +1223,11 @@ void ggml_vec_dot_q5_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
vector float vsumf3 = vec_splats(0.0f);
|
vector float vsumf3 = vec_splats(0.0f);
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[i].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[i].d));
|
||||||
vector float vyd = vec_splats(y[i].d);
|
vector float vyd = vec_splats(y[i].d);
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
vector float vxmin = vec_splats(GGML_FP16_TO_FP32(x[i].dmin));
|
vector float vxmin = vec_splats(GGML_CPU_FP16_TO_FP32(x[i].dmin));
|
||||||
vector float vdmin = vec_mul(vxmin, vyd);
|
vector float vdmin = vec_mul(vxmin, vyd);
|
||||||
|
|
||||||
UNUSED(kmask1);
|
UNUSED(kmask1);
|
||||||
@ -1394,9 +1395,9 @@ void ggml_vec_dot_q5_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -1432,7 +1433,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
vector float vsumf3 = vec_splats(0.0f);
|
vector float vsumf3 = vec_splats(0.0f);
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[i].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[i].d));
|
||||||
vector float vyd = vec_splats(y[i].d);
|
vector float vyd = vec_splats(y[i].d);
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
@ -1591,7 +1592,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -1659,7 +1660,7 @@ void ggml_vec_dot_iq2_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
const uint64_t * signs64 = (const uint64_t *)keven_signs_q2xs;
|
const uint64_t * signs64 = (const uint64_t *)keven_signs_q2xs;
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[i].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[i].d));
|
||||||
vector float vyd = vec_splats(y[i].d);
|
vector float vyd = vec_splats(y[i].d);
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
@ -1742,7 +1743,7 @@ void ggml_vec_dot_iq2_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
int32_t bsum = 0;
|
int32_t bsum = 0;
|
||||||
@ -1790,7 +1791,7 @@ void ggml_vec_dot_iq2_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
const uint64_t * signs64 = (const uint64_t *)keven_signs_q2xs;
|
const uint64_t * signs64 = (const uint64_t *)keven_signs_q2xs;
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[i].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[i].d));
|
||||||
vector float vyd = vec_splats(y[i].d);
|
vector float vyd = vec_splats(y[i].d);
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
@ -1871,7 +1872,7 @@ void ggml_vec_dot_iq2_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT sc = x[i].scales;
|
const uint8_t * GGML_RESTRICT sc = x[i].scales;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -1939,7 +1940,7 @@ void ggml_vec_dot_iq2_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
const vector signed char mask2 = (vector signed char)vec_xl( 0, k_mask2);
|
const vector signed char mask2 = (vector signed char)vec_xl( 0, k_mask2);
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[i].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[i].d));
|
||||||
vector float vyd = vec_splats(y[i].d);
|
vector float vyd = vec_splats(y[i].d);
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
@ -2033,7 +2034,7 @@ void ggml_vec_dot_iq2_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int i = 0; i < nb; i++) {
|
for (int i = 0; i < nb; i++) {
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const int8_t * q8 = y[i].qs;
|
const int8_t * q8 = y[i].qs;
|
||||||
const uint8_t * qs = x[i].qs;
|
const uint8_t * qs = x[i].qs;
|
||||||
const uint8_t * qh = x[i].qh;
|
const uint8_t * qh = x[i].qh;
|
||||||
@ -2096,7 +2097,7 @@ void ggml_vec_dot_iq3_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
vector float vsumf3 = vec_splats(0.0f);
|
vector float vsumf3 = vec_splats(0.0f);
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[i].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[i].d));
|
||||||
vector float vyd = vec_splats(y[i].d);
|
vector float vyd = vec_splats(y[i].d);
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
@ -2176,7 +2177,7 @@ void ggml_vec_dot_iq3_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -2236,7 +2237,7 @@ void ggml_vec_dot_iq3_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
const vector signed char mask2 = (vector signed char)vec_xl( 0, k_mask2);
|
const vector signed char mask2 = (vector signed char)vec_xl( 0, k_mask2);
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[i].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[i].d));
|
||||||
vector float vyd = vec_splats(y[i].d);
|
vector float vyd = vec_splats(y[i].d);
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
@ -2329,7 +2330,7 @@ void ggml_vec_dot_iq3_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
const uint8_t * GGML_RESTRICT signs = x[i].signs;
|
const uint8_t * GGML_RESTRICT signs = x[i].signs;
|
||||||
@ -2394,7 +2395,7 @@ void ggml_vec_dot_iq1_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
vector float vsumf3 = vec_splats(0.0f);
|
vector float vsumf3 = vec_splats(0.0f);
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[i].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[i].d));
|
||||||
vector float vyd = vec_splats(y[i].d);
|
vector float vyd = vec_splats(y[i].d);
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
@ -2505,7 +2506,7 @@ void ggml_vec_dot_iq1_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
qs += 4;
|
qs += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += GGML_FP16_TO_FP32(x[i].d) * y[i].d * (sumi + IQ1S_DELTA * sumi1);
|
sumf += GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d * (sumi + IQ1S_DELTA * sumi1);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -2546,8 +2547,8 @@ void ggml_vec_dot_iq4_nl_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
__builtin_prefetch(y[ib].qs, 0, 1);
|
__builtin_prefetch(y[ib].qs, 0, 1);
|
||||||
|
|
||||||
|
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[ib].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[ib].d));
|
||||||
vector float vyd = vec_splats(GGML_FP16_TO_FP32(y[ib].d));
|
vector float vyd = vec_splats(GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
vector signed char qxs = (vector signed char)vec_xl( 0, x[ib].qs);
|
vector signed char qxs = (vector signed char)vec_xl( 0, x[ib].qs);
|
||||||
@ -2582,7 +2583,7 @@ void ggml_vec_dot_iq4_nl_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
const float d = GGML_FP16_TO_FP32(y[ib].d)*GGML_FP16_TO_FP32(x[ib].d);
|
const float d = GGML_CPU_FP16_TO_FP32(y[ib].d)*GGML_CPU_FP16_TO_FP32(x[ib].d);
|
||||||
int sumi1 = 0, sumi2 = 0;
|
int sumi1 = 0, sumi2 = 0;
|
||||||
for (int j = 0; j < QK4_NL/2; ++j) {
|
for (int j = 0; j < QK4_NL/2; ++j) {
|
||||||
sumi1 += y[ib].qs[j+ 0] * kvalues_iq4nl[x[ib].qs[j] & 0xf];
|
sumi1 += y[ib].qs[j+ 0] * kvalues_iq4nl[x[ib].qs[j] & 0xf];
|
||||||
@ -2620,7 +2621,7 @@ void ggml_vec_dot_iq4_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
|
|
||||||
for (int ibl = 0; ibl < nb; ++ibl) {
|
for (int ibl = 0; ibl < nb; ++ibl) {
|
||||||
|
|
||||||
vector float vxd = vec_splats(GGML_FP16_TO_FP32(x[ibl].d));
|
vector float vxd = vec_splats(GGML_CPU_FP16_TO_FP32(x[ibl].d));
|
||||||
vector float vyd = vec_splats(y[ibl].d);
|
vector float vyd = vec_splats(y[ibl].d);
|
||||||
vector float vd = vec_mul(vxd, vyd);
|
vector float vd = vec_mul(vxd, vyd);
|
||||||
|
|
||||||
@ -2697,7 +2698,7 @@ void ggml_vec_dot_iq4_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
#else
|
#else
|
||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int ibl = 0; ibl < nb; ++ibl) {
|
for (int ibl = 0; ibl < nb; ++ibl) {
|
||||||
const float d4d8 = GGML_FP16_TO_FP32(x[ibl].d) * y[ibl].d;
|
const float d4d8 = GGML_CPU_FP16_TO_FP32(x[ibl].d) * y[ibl].d;
|
||||||
uint16_t h = x[ibl].scales_h;
|
uint16_t h = x[ibl].scales_h;
|
||||||
const uint8_t * qs = x[ibl].qs;
|
const uint8_t * qs = x[ibl].qs;
|
||||||
const int8_t * q8 = y[ibl].qs;
|
const int8_t * q8 = y[ibl].qs;
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "ggml-quants.h"
|
#include "ggml-quants.h"
|
||||||
#include "ggml-impl.h"
|
#include "ggml-impl.h"
|
||||||
#include "ggml-cpu.h"
|
#include "ggml-cpu.h"
|
||||||
|
#include "simd-mappings.h"
|
||||||
|
|
||||||
#include "../../quants.h"
|
#include "../../quants.h"
|
||||||
#include "../../ggml-cpu-impl.h"
|
#include "../../ggml-cpu-impl.h"
|
||||||
@ -45,7 +46,7 @@ void quantize_row_q8_0(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
const float d = amax / ((1 << 7) - 1);
|
const float d = amax / ((1 << 7) - 1);
|
||||||
const float id = d ? 1.0f/d : 0.0f;
|
const float id = d ? 1.0f/d : 0.0f;
|
||||||
|
|
||||||
y[i].d = GGML_FP32_TO_FP16(d);
|
y[i].d = GGML_CPU_FP32_TO_FP16(d);
|
||||||
|
|
||||||
vfloat32m8_t x0 = __riscv_vfmul_vf_f32m8(v_x, id, vl);
|
vfloat32m8_t x0 = __riscv_vfmul_vf_f32m8(v_x, id, vl);
|
||||||
|
|
||||||
@ -85,7 +86,7 @@ void quantize_row_q8_1(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
const float d = amax / ((1 << 7) - 1);
|
const float d = amax / ((1 << 7) - 1);
|
||||||
const float id = d ? 1.0f/d : 0.0f;
|
const float id = d ? 1.0f/d : 0.0f;
|
||||||
|
|
||||||
y[i].d = GGML_FP32_TO_FP16(d);
|
y[i].d = GGML_CPU_FP32_TO_FP16(d);
|
||||||
|
|
||||||
vfloat32m8_t x0 = __riscv_vfmul_vf_f32m8(v_x, id, vl);
|
vfloat32m8_t x0 = __riscv_vfmul_vf_f32m8(v_x, id, vl);
|
||||||
|
|
||||||
@ -102,7 +103,7 @@ void quantize_row_q8_1(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
|
|
||||||
// set y[i].s
|
// set y[i].s
|
||||||
int sum = __riscv_vmv_x_s_i16m1_i16(vwrs);
|
int sum = __riscv_vmv_x_s_i16m1_i16(vwrs);
|
||||||
y[i].s = GGML_FP32_TO_FP16(sum*d);
|
y[i].s = GGML_CPU_FP32_TO_FP16(sum*d);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@ -160,7 +161,7 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
int sumi = __riscv_vmv_x_s_i32m1_i32(vs2);
|
int sumi = __riscv_vmv_x_s_i32m1_i32(vs2);
|
||||||
|
|
||||||
sumf += sumi*GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d);
|
sumf += sumi*GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -177,7 +178,7 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += sumi*GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d);
|
sumf += sumi*GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -225,7 +226,7 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
int sumi = __riscv_vmv_x_s_i32m1_i32(vs2);
|
int sumi = __riscv_vmv_x_s_i32m1_i32(vs2);
|
||||||
|
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -242,7 +243,7 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -293,7 +294,7 @@ void ggml_vec_dot_q5_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
vint32m1_t sum = __riscv_vwredsum_vs_i16m4_i32m1(mul, zero, vl);
|
vint32m1_t sum = __riscv_vwredsum_vs_i16m4_i32m1(mul, zero, vl);
|
||||||
int32_t sumi = __riscv_vmv_x_s_i32m1_i32(sum);
|
int32_t sumi = __riscv_vmv_x_s_i32m1_i32(sum);
|
||||||
|
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d) * GGML_FP16_TO_FP32(y[ib].d)) * sumi;
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d) * GGML_CPU_FP16_TO_FP32(y[ib].d)) * sumi;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -316,7 +317,7 @@ void ggml_vec_dot_q5_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d)) * sumi;
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d)) * sumi;
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -366,7 +367,7 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
vint32m1_t sum = __riscv_vwredsum_vs_i16m4_i32m1(mul, zero, vl);
|
vint32m1_t sum = __riscv_vwredsum_vs_i16m4_i32m1(mul, zero, vl);
|
||||||
int32_t sumi = __riscv_vmv_x_s_i32m1_i32(sum);
|
int32_t sumi = __riscv_vmv_x_s_i32m1_i32(sum);
|
||||||
|
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -389,7 +390,7 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -427,7 +428,7 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
int sumi = __riscv_vmv_x_s_i32m1_i32(v_sum);
|
int sumi = __riscv_vmv_x_s_i32m1_i32(v_sum);
|
||||||
|
|
||||||
sumf += sumi*(GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d));
|
sumf += sumi*(GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -438,7 +439,7 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
sumi += x[ib].qs[j]*y[ib].qs[j];
|
sumi += x[ib].qs[j]*y[ib].qs[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += sumi*(GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d));
|
sumf += sumi*(GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -465,8 +466,8 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const uint8_t * q2 = x[i].qs;
|
const uint8_t * q2 = x[i].qs;
|
||||||
const int8_t * q8 = y[i].qs;
|
const int8_t * q8 = y[i].qs;
|
||||||
const uint8_t * sc = x[i].scales;
|
const uint8_t * sc = x[i].scales;
|
||||||
const float dall = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float dall = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = -y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = -y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
uint8_t *patmp = atmp;
|
uint8_t *patmp = atmp;
|
||||||
int vsums;
|
int vsums;
|
||||||
int tmp;
|
int tmp;
|
||||||
@ -569,8 +570,8 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const int8_t * q8 = y[i].qs;
|
const int8_t * q8 = y[i].qs;
|
||||||
const uint8_t * sc = x[i].scales;
|
const uint8_t * sc = x[i].scales;
|
||||||
|
|
||||||
const float dall = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float dall = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = -y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = -y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
size_t vl = 16;
|
size_t vl = 16;
|
||||||
|
|
||||||
@ -644,8 +645,8 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const uint8_t * q2 = x[i].qs;
|
const uint8_t * q2 = x[i].qs;
|
||||||
const int8_t * q8 = y[i].qs;
|
const int8_t * q8 = y[i].qs;
|
||||||
const uint8_t * sc = x[i].scales;
|
const uint8_t * sc = x[i].scales;
|
||||||
const float dall = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float dall = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = -y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = -y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
uint8_t *patmp = atmp;
|
uint8_t *patmp = atmp;
|
||||||
int vsums;
|
int vsums;
|
||||||
int tmp;
|
int tmp;
|
||||||
@ -750,8 +751,8 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
summs += y[i].bsums[j] * (sc[j] >> 4);
|
summs += y[i].bsums[j] * (sc[j] >> 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
const float dall = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float dall = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
int isum = 0;
|
int isum = 0;
|
||||||
int is = 0;
|
int is = 0;
|
||||||
@ -916,7 +917,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
q3 += 32; q8 += 128; scale += 8;
|
q3 += 32; q8 += 128; scale += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
sumf += d * isum;
|
sumf += d * isum;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1017,7 +1018,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
|
|
||||||
sumf += d*sum_t;
|
sumf += d*sum_t;
|
||||||
|
|
||||||
@ -1134,7 +1135,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
q3 += 32; q8 += 128; scale += 8;
|
q3 += 32; q8 += 128; scale += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
sumf += d * isum;
|
sumf += d * isum;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1202,7 +1203,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -1239,8 +1240,8 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
int tmp, tmp2, sumi;
|
int tmp, tmp2, sumi;
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
@ -1361,8 +1362,8 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
size_t vl = 8;
|
size_t vl = 8;
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
vint16mf2_t q8sums_0 = __riscv_vlse16_v_i16mf2(y[i].bsums, 4, vl);
|
vint16mf2_t q8sums_0 = __riscv_vlse16_v_i16mf2(y[i].bsums, 4, vl);
|
||||||
vint16mf2_t q8sums_1 = __riscv_vlse16_v_i16mf2(y[i].bsums+1, 4, vl);
|
vint16mf2_t q8sums_1 = __riscv_vlse16_v_i16mf2(y[i].bsums+1, 4, vl);
|
||||||
@ -1422,8 +1423,8 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
break;
|
break;
|
||||||
case 128:
|
case 128:
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
int tmp, tmp2, sumi;
|
int tmp, tmp2, sumi;
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
@ -1580,9 +1581,9 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -1627,8 +1628,8 @@ void ggml_vec_dot_q5_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const uint8_t * GGML_RESTRICT hm = x[i].qh;
|
const uint8_t * GGML_RESTRICT hm = x[i].qh;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
|
|
||||||
vint16m1_t q8sums_0 = __riscv_vlse16_v_i16m1(y[i].bsums, 4, vl);
|
vint16m1_t q8sums_0 = __riscv_vlse16_v_i16m1(y[i].bsums, 4, vl);
|
||||||
vint16m1_t q8sums_1 = __riscv_vlse16_v_i16m1(y[i].bsums+1, 4, vl);
|
vint16m1_t q8sums_1 = __riscv_vlse16_v_i16m1(y[i].bsums+1, 4, vl);
|
||||||
@ -1749,9 +1750,9 @@ void ggml_vec_dot_q5_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -1778,7 +1779,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
|
|
||||||
const uint8_t * restrict q6 = x[i].ql;
|
const uint8_t * restrict q6 = x[i].ql;
|
||||||
const uint8_t * restrict qh = x[i].qh;
|
const uint8_t * restrict qh = x[i].qh;
|
||||||
@ -1862,7 +1863,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
case 256:
|
case 256:
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q6 = x[i].ql;
|
const uint8_t * GGML_RESTRICT q6 = x[i].ql;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
@ -1943,7 +1944,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
case 128:
|
case 128:
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
|
|
||||||
const uint8_t * restrict q6 = x[i].ql;
|
const uint8_t * restrict q6 = x[i].ql;
|
||||||
const uint8_t * restrict qh = x[i].qh;
|
const uint8_t * restrict qh = x[i].qh;
|
||||||
@ -2058,7 +2059,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "ggml-impl.h"
|
#include "ggml-impl.h"
|
||||||
#include "ggml-cpu.h"
|
#include "ggml-cpu.h"
|
||||||
#include "ggml-cpu-impl.h"
|
#include "ggml-cpu-impl.h"
|
||||||
|
#include "simd-mappings.h"
|
||||||
#include "traits.h"
|
#include "traits.h"
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
@ -90,16 +91,16 @@ void ggml_gemv_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
const vfloat32m1_t facc = __riscv_vfcvt_f_x_v_f32m1(sumi_h8, vl / 4);
|
const vfloat32m1_t facc = __riscv_vfcvt_f_x_v_f32m1(sumi_h8, vl / 4);
|
||||||
|
|
||||||
// vector version needs Zvfhmin extension
|
// vector version needs Zvfhmin extension
|
||||||
const float a_scale = GGML_FP16_TO_FP32(a_ptr[l].d);
|
const float a_scale = GGML_CPU_FP16_TO_FP32(a_ptr[l].d);
|
||||||
const float b_scales[8] = {
|
const float b_scales[8] = {
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[0]),
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[0]),
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[1]),
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[1]),
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[2]),
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[2]),
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[3]),
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[3]),
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[4]),
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[4]),
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[5]),
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[5]),
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[6]),
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[6]),
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[7])
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[7])
|
||||||
};
|
};
|
||||||
const vfloat32m1_t b_scales_vec = __riscv_vle32_v_f32m1(b_scales, vl / 4);
|
const vfloat32m1_t b_scales_vec = __riscv_vle32_v_f32m1(b_scales, vl / 4);
|
||||||
const vfloat32m1_t tmp1 = __riscv_vfmul_vf_f32m1(facc, a_scale, vl / 4);
|
const vfloat32m1_t tmp1 = __riscv_vfmul_vf_f32m1(facc, a_scale, vl / 4);
|
||||||
@ -129,7 +130,7 @@ void ggml_gemv_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
||||||
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d);
|
sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -181,20 +182,20 @@ void ggml_gemm_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
// vector version needs Zvfhmin extension
|
// vector version needs Zvfhmin extension
|
||||||
const float a_scales[4] = {
|
const float a_scales[4] = {
|
||||||
GGML_FP16_TO_FP32(a_ptr[l].d[0]),
|
GGML_CPU_FP16_TO_FP32(a_ptr[l].d[0]),
|
||||||
GGML_FP16_TO_FP32(a_ptr[l].d[1]),
|
GGML_CPU_FP16_TO_FP32(a_ptr[l].d[1]),
|
||||||
GGML_FP16_TO_FP32(a_ptr[l].d[2]),
|
GGML_CPU_FP16_TO_FP32(a_ptr[l].d[2]),
|
||||||
GGML_FP16_TO_FP32(a_ptr[l].d[3])
|
GGML_CPU_FP16_TO_FP32(a_ptr[l].d[3])
|
||||||
};
|
};
|
||||||
const float b_scales[8] = {
|
const float b_scales[8] = {
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[0]),
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[0]),
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[1]),
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[1]),
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[2]),
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[2]),
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[3]),
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[3]),
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[4]),
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[4]),
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[5]),
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[5]),
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[6]),
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[6]),
|
||||||
GGML_FP16_TO_FP32(b_ptr[l].d[7])
|
GGML_CPU_FP16_TO_FP32(b_ptr[l].d[7])
|
||||||
};
|
};
|
||||||
const vfloat32m1_t b_scales_vec = __riscv_vle32_v_f32m1(b_scales, vl / 4);
|
const vfloat32m1_t b_scales_vec = __riscv_vle32_v_f32m1(b_scales, vl / 4);
|
||||||
|
|
||||||
@ -382,7 +383,7 @@ void ggml_gemm_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
||||||
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[m][j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d[m]);
|
sumf[m][j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d[m]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "ggml-quants.h"
|
#include "ggml-quants.h"
|
||||||
#include "ggml-impl.h"
|
#include "ggml-impl.h"
|
||||||
#include "ggml-cpu.h"
|
#include "ggml-cpu.h"
|
||||||
|
#include "simd-mappings.h"
|
||||||
|
|
||||||
#include "../../quants.h"
|
#include "../../quants.h"
|
||||||
#include "../../ggml-cpu-impl.h"
|
#include "../../ggml-cpu-impl.h"
|
||||||
@ -49,7 +50,7 @@ void quantize_row_q8_0(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
const float d = amax / ((1 << 7) - 1);
|
const float d = amax / ((1 << 7) - 1);
|
||||||
const float id = d ? 1.0f / d : 0.0f;
|
const float id = d ? 1.0f / d : 0.0f;
|
||||||
|
|
||||||
y[i].d = GGML_FP32_TO_FP16(d);
|
y[i].d = GGML_CPU_FP32_TO_FP16(d);
|
||||||
|
|
||||||
for (int j = 0; j < 8; j++) {
|
for (int j = 0; j < 8; j++) {
|
||||||
const __vector float v = vec_mul(srcv[j], vec_splats(id));
|
const __vector float v = vec_mul(srcv[j], vec_splats(id));
|
||||||
@ -94,7 +95,7 @@ void quantize_row_q8_1(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
const float d = amax / ((1 << 7) - 1);
|
const float d = amax / ((1 << 7) - 1);
|
||||||
const float id = d ? 1.0f / d : 0.0f;
|
const float id = d ? 1.0f / d : 0.0f;
|
||||||
|
|
||||||
y[i].d = GGML_FP32_TO_FP16(d);
|
y[i].d = GGML_CPU_FP32_TO_FP16(d);
|
||||||
|
|
||||||
__vector int32_t acc = vec_splats(0);
|
__vector int32_t acc = vec_splats(0);
|
||||||
|
|
||||||
@ -110,7 +111,7 @@ void quantize_row_q8_1(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
acc = vec_add(acc, vi);
|
acc = vec_add(acc, vi);
|
||||||
}
|
}
|
||||||
|
|
||||||
y[i].s = GGML_FP32_TO_FP16(d * (acc[0] + acc[1] + acc[2] + acc[3]));
|
y[i].s = GGML_CPU_FP32_TO_FP16(d * (acc[0] + acc[1] + acc[2] + acc[3]));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
GGML_UNUSED(nb);
|
GGML_UNUSED(nb);
|
||||||
@ -164,7 +165,7 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
__vector int16_t v_xy_ = v_xylso + v_xylse + v_xyhso + v_xyhse; v_xy_ += vec_reve(v_xy_);
|
__vector int16_t v_xy_ = v_xylso + v_xylse + v_xyhso + v_xyhse; v_xy_ += vec_reve(v_xy_);
|
||||||
|
|
||||||
const __vector float v_xy = vec_float(vec_unpackh(v_xy_));
|
const __vector float v_xy = vec_float(vec_unpackh(v_xy_));
|
||||||
const __vector float v_d = vec_splats(GGML_FP16_TO_FP32(x[ib].d) * GGML_FP16_TO_FP32(y[ib].d));
|
const __vector float v_d = vec_splats(GGML_CPU_FP16_TO_FP32(x[ib].d) * GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
|
|
||||||
acc = vec_madd(v_xy, v_d, acc);
|
acc = vec_madd(v_xy, v_d, acc);
|
||||||
}
|
}
|
||||||
@ -185,7 +186,7 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += sumi*GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d);
|
sumf += sumi*GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -219,7 +220,7 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
__builtin_prefetch(x[ib].qs, 0, 1);
|
__builtin_prefetch(x[ib].qs, 0, 1);
|
||||||
__builtin_prefetch(y[ib].qs, 0, 1);
|
__builtin_prefetch(y[ib].qs, 0, 1);
|
||||||
|
|
||||||
summs += GGML_FP16_TO_FP32(x[ib].m) * GGML_FP16_TO_FP32(y[ib].s);
|
summs += GGML_CPU_FP16_TO_FP32(x[ib].m) * GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
|
|
||||||
const uint8x16_t v_x = vec_xl(0, x[ib].qs);
|
const uint8x16_t v_x = vec_xl(0, x[ib].qs);
|
||||||
const int8x16_t v_xl = (const int8x16_t)(v_x & v_m);
|
const int8x16_t v_xl = (const int8x16_t)(v_x & v_m);
|
||||||
@ -231,7 +232,7 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const int32x4_t v_xy_ = ggml_vec_dot(ggml_vec_dot(vec_splats(0), v_xl, v_yl), v_xh, v_yh);
|
const int32x4_t v_xy_ = ggml_vec_dot(ggml_vec_dot(vec_splats(0), v_xl, v_yl), v_xh, v_yh);
|
||||||
const float32x4_t v_xy = vec_float(v_xy_);
|
const float32x4_t v_xy = vec_float(v_xy_);
|
||||||
|
|
||||||
const float32x4_t v_d = vec_splats(GGML_FP16_TO_FP32(x[ib].d) * GGML_FP16_TO_FP32(y[ib].d));
|
const float32x4_t v_d = vec_splats(GGML_CPU_FP16_TO_FP32(x[ib].d) * GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
|
|
||||||
acc = vec_madd(v_xy, v_d, acc);
|
acc = vec_madd(v_xy, v_d, acc);
|
||||||
}
|
}
|
||||||
@ -252,7 +253,7 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -290,7 +291,7 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
const int32x4_t v_xy_ = ggml_vec_dot(ggml_vec_dot(vec_splats(0), v_xl, v_yl), v_xh, v_yh);
|
const int32x4_t v_xy_ = ggml_vec_dot(ggml_vec_dot(vec_splats(0), v_xl, v_yl), v_xh, v_yh);
|
||||||
const float32x4_t v_xy = vec_float(v_xy_);
|
const float32x4_t v_xy = vec_float(v_xy_);
|
||||||
const float32x4_t v_d = vec_splats(GGML_FP16_TO_FP32(x[ib].d) * GGML_FP16_TO_FP32(y[ib].d));
|
const float32x4_t v_d = vec_splats(GGML_CPU_FP16_TO_FP32(x[ib].d) * GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
|
|
||||||
acc = vec_madd(v_xy, v_d, acc);
|
acc = vec_madd(v_xy, v_d, acc);
|
||||||
}
|
}
|
||||||
@ -305,7 +306,7 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
sumi += x[ib].qs[j]*y[ib].qs[j];
|
sumi += x[ib].qs[j]*y[ib].qs[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += sumi*(GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d));
|
sumf += sumi*(GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -348,7 +349,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
float sum = 0;
|
float sum = 0;
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
|
|
||||||
const uint8_t * restrict x0l = x[i].qs;
|
const uint8_t * restrict x0l = x[i].qs;
|
||||||
const uint8_t * restrict x0h = x[i].hmask;
|
const uint8_t * restrict x0h = x[i].hmask;
|
||||||
@ -497,7 +498,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -537,8 +538,8 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
const int16x8_t v_ysumsl = vec_xl(0 , y[i].bsums);
|
const int16x8_t v_ysumsl = vec_xl(0 , y[i].bsums);
|
||||||
const int16x8_t v_ysumsh = vec_xl(16, y[i].bsums);
|
const int16x8_t v_ysumsh = vec_xl(16, y[i].bsums);
|
||||||
@ -647,9 +648,9 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -698,8 +699,8 @@ void ggml_vec_dot_q5_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
const int16x8_t v_ysumsl = vec_xl(0 , y[i].bsums);
|
const int16x8_t v_ysumsl = vec_xl(0 , y[i].bsums);
|
||||||
const int16x8_t v_ysumsh = vec_xl(16, y[i].bsums);
|
const int16x8_t v_ysumsh = vec_xl(16, y[i].bsums);
|
||||||
@ -819,9 +820,9 @@ void ggml_vec_dot_q5_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -859,7 +860,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
int8x16_t v_y[4];
|
int8x16_t v_y[4];
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d_all = GGML_FP16_TO_FP32(x[i].d);
|
const float d_all = GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT x0l = x[i].ql;
|
const uint8_t * GGML_RESTRICT x0l = x[i].ql;
|
||||||
const uint8_t * GGML_RESTRICT x0h = x[i].qh;
|
const uint8_t * GGML_RESTRICT x0h = x[i].qh;
|
||||||
@ -1004,7 +1005,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -1071,7 +1072,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
// float sumf = 0;
|
// float sumf = 0;
|
||||||
|
|
||||||
// for (int i = 0; i < nb; ++i) {
|
// for (int i = 0; i < nb; ++i) {
|
||||||
// const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
// const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
// const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
// const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
// const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
// const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
|
|
||||||
@ -1121,7 +1122,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
// float sumf = 0.f;
|
// float sumf = 0.f;
|
||||||
// for (int i = 0; i < nb; ++i) {
|
// for (int i = 0; i < nb; ++i) {
|
||||||
// const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
// const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
// const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
// const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
// const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
// const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
// int32_t bsum = 0;
|
// int32_t bsum = 0;
|
||||||
@ -1182,12 +1183,12 @@ void ggml_vec_dot_iq4_nl_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
const int8x16_t v_yh = vec_xl(QK8_0/2, y0->qs);
|
const int8x16_t v_yh = vec_xl(QK8_0/2, y0->qs);
|
||||||
const int32x4_t v_xy = ggml_vec_dot(ggml_vec_dot(vec_splats(0), v_xl, v_yl), v_xh, v_yh);
|
const int32x4_t v_xy = ggml_vec_dot(ggml_vec_dot(vec_splats(0), v_xl, v_yl), v_xh, v_yh);
|
||||||
|
|
||||||
sumf += GGML_FP16_TO_FP32(x0->d) * GGML_FP16_TO_FP32(y0->d) * (v_xy[0] + v_xy[1] + v_xy[2] + v_xy[3]);
|
sumf += GGML_CPU_FP16_TO_FP32(x0->d) * GGML_CPU_FP16_TO_FP32(y0->d) * (v_xy[0] + v_xy[1] + v_xy[2] + v_xy[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
const float d = GGML_FP16_TO_FP32(y[ib].d)*GGML_FP16_TO_FP32(x[ib].d);
|
const float d = GGML_CPU_FP16_TO_FP32(y[ib].d)*GGML_CPU_FP16_TO_FP32(x[ib].d);
|
||||||
int sumi1 = 0, sumi2 = 0;
|
int sumi1 = 0, sumi2 = 0;
|
||||||
for (int j = 0; j < QK4_NL/2; ++j) {
|
for (int j = 0; j < QK4_NL/2; ++j) {
|
||||||
sumi1 += y[ib].qs[j+ 0] * kvalues_iq4nl[x[ib].qs[j] & 0xf];
|
sumi1 += y[ib].qs[j+ 0] * kvalues_iq4nl[x[ib].qs[j] & 0xf];
|
||||||
@ -1257,7 +1258,7 @@ void ggml_vec_dot_iq4_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
sumi2 += (vsumi1[0] + vsumi1[1] + vsumi1[2] + vsumi1[3]) * ls2;
|
sumi2 += (vsumi1[0] + vsumi1[1] + vsumi1[2] + vsumi1[3]) * ls2;
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += GGML_FP16_TO_FP32(x[ibl].d) * y[ibl].d * (sumi1 + sumi2);
|
sumf += GGML_CPU_FP16_TO_FP32(x[ibl].d) * y[ibl].d * (sumi1 + sumi2);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -1265,7 +1266,7 @@ void ggml_vec_dot_iq4_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
#else
|
#else
|
||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int ibl = 0; ibl < nb; ++ibl) {
|
for (int ibl = 0; ibl < nb; ++ibl) {
|
||||||
const float d4d8 = GGML_FP16_TO_FP32(x[ibl].d) * y[ibl].d;
|
const float d4d8 = GGML_CPU_FP16_TO_FP32(x[ibl].d) * y[ibl].d;
|
||||||
uint16_t h = x[ibl].scales_h;
|
uint16_t h = x[ibl].scales_h;
|
||||||
const uint8_t * qs = x[ibl].qs;
|
const uint8_t * qs = x[ibl].qs;
|
||||||
const int8_t * q8 = y[ibl].qs;
|
const int8_t * q8 = y[ibl].qs;
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "ggml-quants.h"
|
#include "ggml-quants.h"
|
||||||
#include "ggml-impl.h"
|
#include "ggml-impl.h"
|
||||||
#include "ggml-cpu.h"
|
#include "ggml-cpu.h"
|
||||||
|
#include "simd-mappings.h"
|
||||||
|
|
||||||
#include "../../quants.h"
|
#include "../../quants.h"
|
||||||
#include "../../ggml-cpu-impl.h"
|
#include "../../ggml-cpu-impl.h"
|
||||||
@ -65,7 +66,7 @@ void quantize_row_q8_0(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
const float d = amax / ((1 << 7) - 1);
|
const float d = amax / ((1 << 7) - 1);
|
||||||
const float id = d ? 1.0f/d : 0.0f;
|
const float id = d ? 1.0f/d : 0.0f;
|
||||||
|
|
||||||
y[i].d = GGML_FP32_TO_FP16(d);
|
y[i].d = GGML_CPU_FP32_TO_FP16(d);
|
||||||
|
|
||||||
for (int j = 0; j < 8; j++) {
|
for (int j = 0; j < 8; j++) {
|
||||||
const v128_t v = wasm_f32x4_mul(srcv[j], wasm_f32x4_splat(id));
|
const v128_t v = wasm_f32x4_mul(srcv[j], wasm_f32x4_splat(id));
|
||||||
@ -110,7 +111,7 @@ void quantize_row_q8_1(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
const float d = amax / ((1 << 7) - 1);
|
const float d = amax / ((1 << 7) - 1);
|
||||||
const float id = d ? 1.0f/d : 0.0f;
|
const float id = d ? 1.0f/d : 0.0f;
|
||||||
|
|
||||||
y[i].d = GGML_FP32_TO_FP16(d);
|
y[i].d = GGML_CPU_FP32_TO_FP16(d);
|
||||||
|
|
||||||
v128_t accv = wasm_i32x4_splat(0);
|
v128_t accv = wasm_i32x4_splat(0);
|
||||||
|
|
||||||
@ -126,7 +127,7 @@ void quantize_row_q8_1(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
accv = wasm_i32x4_add(accv, vi);
|
accv = wasm_i32x4_add(accv, vi);
|
||||||
}
|
}
|
||||||
|
|
||||||
y[i].s = GGML_FP32_TO_FP16(
|
y[i].s = GGML_CPU_FP32_TO_FP16(
|
||||||
d * (wasm_i32x4_extract_lane(accv, 0) +
|
d * (wasm_i32x4_extract_lane(accv, 0) +
|
||||||
wasm_i32x4_extract_lane(accv, 1) +
|
wasm_i32x4_extract_lane(accv, 1) +
|
||||||
wasm_i32x4_extract_lane(accv, 2) +
|
wasm_i32x4_extract_lane(accv, 2) +
|
||||||
@ -324,8 +325,8 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Accumulate results with scaling
|
// Accumulate results with scaling
|
||||||
float scale0 = GGML_FP16_TO_FP32(x0->d) * GGML_FP16_TO_FP32(y0->d);
|
float scale0 = GGML_CPU_FP16_TO_FP32(x0->d) * GGML_CPU_FP16_TO_FP32(y0->d);
|
||||||
float scale1 = GGML_FP16_TO_FP32(x1->d) * GGML_FP16_TO_FP32(y1->d);
|
float scale1 = GGML_CPU_FP16_TO_FP32(x1->d) * GGML_CPU_FP16_TO_FP32(y1->d);
|
||||||
|
|
||||||
sumv = wasm_f32x4_add(sumv, wasm_f32x4_mul(wasm_f32x4_convert_i32x4(dp0), wasm_f32x4_splat(scale0)));
|
sumv = wasm_f32x4_add(sumv, wasm_f32x4_mul(wasm_f32x4_convert_i32x4(dp0), wasm_f32x4_splat(scale0)));
|
||||||
sumv = wasm_f32x4_add(sumv, wasm_f32x4_mul(wasm_f32x4_convert_i32x4(dp1), wasm_f32x4_splat(scale1)));
|
sumv = wasm_f32x4_add(sumv, wasm_f32x4_mul(wasm_f32x4_convert_i32x4(dp1), wasm_f32x4_splat(scale1)));
|
||||||
@ -348,7 +349,7 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += sumi*GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d);
|
sumf += sumi*GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -428,7 +429,7 @@ void ggml_vec_dot_q5_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
wasm_i32x4_dot_i16x8(v0lfh, v1lh)),
|
wasm_i32x4_dot_i16x8(v0lfh, v1lh)),
|
||||||
wasm_i32x4_add(wasm_i32x4_dot_i16x8(v0hfl, v1hl),
|
wasm_i32x4_add(wasm_i32x4_dot_i16x8(v0hfl, v1hl),
|
||||||
wasm_i32x4_dot_i16x8(v0hfh, v1hh)))),
|
wasm_i32x4_dot_i16x8(v0hfh, v1hh)))),
|
||||||
wasm_f32x4_splat(GGML_FP16_TO_FP32(x0->d) * GGML_FP16_TO_FP32(y0->d))));
|
wasm_f32x4_splat(GGML_CPU_FP16_TO_FP32(x0->d) * GGML_CPU_FP16_TO_FP32(y0->d))));
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf = wasm_f32x4_extract_lane(sumv, 0) + wasm_f32x4_extract_lane(sumv, 1) +
|
sumf = wasm_f32x4_extract_lane(sumv, 0) + wasm_f32x4_extract_lane(sumv, 1) +
|
||||||
@ -454,7 +455,7 @@ void ggml_vec_dot_q5_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d)) * sumi;
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d)) * sumi;
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -491,7 +492,7 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const block_q5_1 * GGML_RESTRICT x0 = &x[ib];
|
const block_q5_1 * GGML_RESTRICT x0 = &x[ib];
|
||||||
const block_q8_1 * GGML_RESTRICT y0 = &y[ib];
|
const block_q8_1 * GGML_RESTRICT y0 = &y[ib];
|
||||||
|
|
||||||
summs += GGML_FP16_TO_FP32(x0->m) * GGML_FP16_TO_FP32(y0->s);
|
summs += GGML_CPU_FP16_TO_FP32(x0->m) * GGML_CPU_FP16_TO_FP32(y0->s);
|
||||||
|
|
||||||
const v128_t m4b = wasm_i8x16_splat(0x0F);
|
const v128_t m4b = wasm_i8x16_splat(0x0F);
|
||||||
|
|
||||||
@ -538,7 +539,7 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
wasm_i32x4_dot_i16x8(v0lfh, v1lh)),
|
wasm_i32x4_dot_i16x8(v0lfh, v1lh)),
|
||||||
wasm_i32x4_add(wasm_i32x4_dot_i16x8(v0hfl, v1hl),
|
wasm_i32x4_add(wasm_i32x4_dot_i16x8(v0hfl, v1hl),
|
||||||
wasm_i32x4_dot_i16x8(v0hfh, v1hh)))),
|
wasm_i32x4_dot_i16x8(v0hfh, v1hh)))),
|
||||||
wasm_f32x4_splat(GGML_FP16_TO_FP32(x0->d) * GGML_FP16_TO_FP32(y0->d))));
|
wasm_f32x4_splat(GGML_CPU_FP16_TO_FP32(x0->d) * GGML_CPU_FP16_TO_FP32(y0->d))));
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf = wasm_f32x4_extract_lane(sumv, 0) + wasm_f32x4_extract_lane(sumv, 1) +
|
sumf = wasm_f32x4_extract_lane(sumv, 0) + wasm_f32x4_extract_lane(sumv, 1) +
|
||||||
@ -564,7 +565,7 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -620,7 +621,7 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const v128_t sum_dots = wasm_i32x4_add(wasm_i32x4_add(dx0_0, dx0_1), wasm_i32x4_add(dx1_0, dx1_1));
|
const v128_t sum_dots = wasm_i32x4_add(wasm_i32x4_add(dx0_0, dx0_1), wasm_i32x4_add(dx1_0, dx1_1));
|
||||||
|
|
||||||
// Convert to float and accumulate
|
// Convert to float and accumulate
|
||||||
const float scale = GGML_FP16_TO_FP32(x0->d) * GGML_FP16_TO_FP32(y0->d);
|
const float scale = GGML_CPU_FP16_TO_FP32(x0->d) * GGML_CPU_FP16_TO_FP32(y0->d);
|
||||||
sumv = wasm_f32x4_add(sumv, wasm_f32x4_mul(wasm_f32x4_convert_i32x4(sum_dots), wasm_f32x4_splat(scale)));
|
sumv = wasm_f32x4_add(sumv, wasm_f32x4_mul(wasm_f32x4_convert_i32x4(sum_dots), wasm_f32x4_splat(scale)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -635,7 +636,7 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
sumi += x[ib].qs[j]*y[ib].qs[j];
|
sumi += x[ib].qs[j]*y[ib].qs[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += sumi*(GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d));
|
sumf += sumi*(GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -746,8 +747,8 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
isum += wasm_i32x4_extract_lane(isum_vec, 0);
|
isum += wasm_i32x4_extract_lane(isum_vec, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
const float dall = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float dall = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf += dall * isum - dmin * summs;
|
sumf += dall * isum - dmin * summs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -768,8 +769,8 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
summs += y[i].bsums[j] * (sc[j] >> 4);
|
summs += y[i].bsums[j] * (sc[j] >> 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
const float dall = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float dall = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
int isum = 0;
|
int isum = 0;
|
||||||
int is = 0;
|
int is = 0;
|
||||||
@ -880,7 +881,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Accumulate results
|
// Accumulate results
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const v128_t v_d = wasm_f32x4_splat(d);
|
const v128_t v_d = wasm_f32x4_splat(d);
|
||||||
v128_t v_sum = wasm_f32x4_add(
|
v128_t v_sum = wasm_f32x4_add(
|
||||||
wasm_f32x4_mul(wasm_f32x4_convert_i32x4(v_acc0), v_d),
|
wasm_f32x4_mul(wasm_f32x4_convert_i32x4(v_acc0), v_d),
|
||||||
@ -957,7 +958,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -991,8 +992,8 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin); // Corrected sign
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin); // Corrected sign
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q4 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q4 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -1136,9 +1137,9 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -1170,8 +1171,8 @@ void ggml_vec_dot_q5_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin); // Fixed sign
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin); // Fixed sign
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q5 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q5 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
@ -1331,9 +1332,9 @@ void ggml_vec_dot_q5_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -1420,7 +1421,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
wasm_v128_store(&aux32[0], acc0);
|
wasm_v128_store(&aux32[0], acc0);
|
||||||
wasm_v128_store(&aux32[4], acc1);
|
wasm_v128_store(&aux32[4], acc1);
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) {
|
for (int l = 0; l < 8; ++l) {
|
||||||
sums[l] += d * aux32[l];
|
sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
@ -1470,7 +1471,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "ggml-quants.h"
|
#include "ggml-quants.h"
|
||||||
#include "ggml-impl.h"
|
#include "ggml-impl.h"
|
||||||
#include "ggml-cpu.h"
|
#include "ggml-cpu.h"
|
||||||
|
#include "simd-mappings.h"
|
||||||
|
|
||||||
#include "../../quants.h"
|
#include "../../quants.h"
|
||||||
#include "../../ggml-cpu-impl.h"
|
#include "../../ggml-cpu-impl.h"
|
||||||
@ -256,9 +257,9 @@ static inline __m256 mul_sum_i8_quad_float(const __m128i x_1_0, const __m128i x_
|
|||||||
|
|
||||||
// quad fp16 delta calculation
|
// quad fp16 delta calculation
|
||||||
static inline __m256 quad_fp16_delta_float(const float x0, const float y0, const float x1, const float y1) {
|
static inline __m256 quad_fp16_delta_float(const float x0, const float y0, const float x1, const float y1) {
|
||||||
// GGML_FP16_TO_FP32 is faster than Intel F16C
|
// GGML_CPU_FP16_TO_FP32 is faster than Intel F16C
|
||||||
return _mm256_set_m128(_mm_set1_ps(GGML_FP16_TO_FP32(x1) * GGML_FP16_TO_FP32(y1)),
|
return _mm256_set_m128(_mm_set1_ps(GGML_CPU_FP16_TO_FP32(x1) * GGML_CPU_FP16_TO_FP32(y1)),
|
||||||
_mm_set1_ps(GGML_FP16_TO_FP32(x0) * GGML_FP16_TO_FP32(y0)));
|
_mm_set1_ps(GGML_CPU_FP16_TO_FP32(x0) * GGML_CPU_FP16_TO_FP32(y0)));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#elif defined(__SSSE3__)
|
#elif defined(__SSSE3__)
|
||||||
@ -305,7 +306,7 @@ void quantize_row_q8_0(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
|
|
||||||
// Quantize these floats
|
// Quantize these floats
|
||||||
const float d = maxScalar / 127.f;
|
const float d = maxScalar / 127.f;
|
||||||
y[i].d = GGML_FP32_TO_FP16(d);
|
y[i].d = GGML_CPU_FP32_TO_FP16(d);
|
||||||
const float id = ( maxScalar != 0.0f ) ? 127.f / maxScalar : 0.0f;
|
const float id = ( maxScalar != 0.0f ) ? 127.f / maxScalar : 0.0f;
|
||||||
const __m256 mul = _mm256_set1_ps( id );
|
const __m256 mul = _mm256_set1_ps( id );
|
||||||
|
|
||||||
@ -401,7 +402,7 @@ void quantize_row_q8_1(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
|
|
||||||
// Quantize these floats
|
// Quantize these floats
|
||||||
const float d = max_scalar / 127.f;
|
const float d = max_scalar / 127.f;
|
||||||
y[i].d = GGML_FP32_TO_FP16(d);
|
y[i].d = GGML_CPU_FP32_TO_FP16(d);
|
||||||
const float id = ( max_scalar != 0.0f ) ? 127.f / max_scalar : 0.0f;
|
const float id = ( max_scalar != 0.0f ) ? 127.f / max_scalar : 0.0f;
|
||||||
const __m256 mul = _mm256_set1_ps( id );
|
const __m256 mul = _mm256_set1_ps( id );
|
||||||
|
|
||||||
@ -425,7 +426,7 @@ void quantize_row_q8_1(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
|
|
||||||
#if defined(__AVX2__)
|
#if defined(__AVX2__)
|
||||||
// Compute the sum of the quants and set y[i].s
|
// Compute the sum of the quants and set y[i].s
|
||||||
y[i].s = GGML_FP32_TO_FP16(d * hsum_i32_8(_mm256_add_epi32(_mm256_add_epi32(i0, i1), _mm256_add_epi32(i2, i3))));
|
y[i].s = GGML_CPU_FP32_TO_FP16(d * hsum_i32_8(_mm256_add_epi32(_mm256_add_epi32(i0, i1), _mm256_add_epi32(i2, i3))));
|
||||||
|
|
||||||
// Convert int32 to int16
|
// Convert int32 to int16
|
||||||
i0 = _mm256_packs_epi32( i0, i1 ); // 0, 1, 2, 3, 8, 9, 10, 11, 4, 5, 6, 7, 12, 13, 14, 15
|
i0 = _mm256_packs_epi32( i0, i1 ); // 0, 1, 2, 3, 8, 9, 10, 11, 4, 5, 6, 7, 12, 13, 14, 15
|
||||||
@ -455,7 +456,7 @@ void quantize_row_q8_1(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, i
|
|||||||
// Compute the sum of the quants and set y[i].s
|
// Compute the sum of the quants and set y[i].s
|
||||||
const __m128i s0 = _mm_add_epi32(_mm_add_epi32(ni0, ni1), _mm_add_epi32(ni2, ni3));
|
const __m128i s0 = _mm_add_epi32(_mm_add_epi32(ni0, ni1), _mm_add_epi32(ni2, ni3));
|
||||||
const __m128i s1 = _mm_add_epi32(_mm_add_epi32(ni4, ni5), _mm_add_epi32(ni6, ni7));
|
const __m128i s1 = _mm_add_epi32(_mm_add_epi32(ni4, ni5), _mm_add_epi32(ni6, ni7));
|
||||||
y[i].s = GGML_FP32_TO_FP16(d * hsum_i32_4(_mm_add_epi32(s0, s1)));
|
y[i].s = GGML_CPU_FP32_TO_FP16(d * hsum_i32_4(_mm_add_epi32(s0, s1)));
|
||||||
|
|
||||||
// Convert int32 to int16
|
// Convert int32 to int16
|
||||||
ni0 = _mm_packs_epi32( ni0, ni1 );
|
ni0 = _mm_packs_epi32( ni0, ni1 );
|
||||||
@ -552,7 +553,7 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
// Main loop
|
// Main loop
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
/* Compute combined scale for the block */
|
/* Compute combined scale for the block */
|
||||||
const __m256 d = _mm256_set1_ps( GGML_FP16_TO_FP32(x[ib].d) * GGML_FP16_TO_FP32(y[ib].d) );
|
const __m256 d = _mm256_set1_ps( GGML_CPU_FP16_TO_FP32(x[ib].d) * GGML_CPU_FP16_TO_FP32(y[ib].d) );
|
||||||
|
|
||||||
__m256i qx = bytes_from_nibbles_32(x[ib].qs);
|
__m256i qx = bytes_from_nibbles_32(x[ib].qs);
|
||||||
|
|
||||||
@ -613,7 +614,7 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
_mm_prefetch(&y[ib] + sizeof(block_q8_0), _MM_HINT_T0);
|
_mm_prefetch(&y[ib] + sizeof(block_q8_0), _MM_HINT_T0);
|
||||||
|
|
||||||
// Compute combined scale for the block 0 and 1
|
// Compute combined scale for the block 0 and 1
|
||||||
const __m128 d_0_1 = _mm_set1_ps( GGML_FP16_TO_FP32(x[ib].d) * GGML_FP16_TO_FP32(y[ib].d) );
|
const __m128 d_0_1 = _mm_set1_ps( GGML_CPU_FP16_TO_FP32(x[ib].d) * GGML_CPU_FP16_TO_FP32(y[ib].d) );
|
||||||
|
|
||||||
const __m128i tmp_0_1 = _mm_loadu_si128((const __m128i *)x[ib].qs);
|
const __m128i tmp_0_1 = _mm_loadu_si128((const __m128i *)x[ib].qs);
|
||||||
|
|
||||||
@ -631,7 +632,7 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
_mm_prefetch(&y[ib] + 2 * sizeof(block_q8_0), _MM_HINT_T0);
|
_mm_prefetch(&y[ib] + 2 * sizeof(block_q8_0), _MM_HINT_T0);
|
||||||
|
|
||||||
// Compute combined scale for the block 2 and 3
|
// Compute combined scale for the block 2 and 3
|
||||||
const __m128 d_2_3 = _mm_set1_ps( GGML_FP16_TO_FP32(x[ib + 1].d) * GGML_FP16_TO_FP32(y[ib + 1].d) );
|
const __m128 d_2_3 = _mm_set1_ps( GGML_CPU_FP16_TO_FP32(x[ib + 1].d) * GGML_CPU_FP16_TO_FP32(y[ib + 1].d) );
|
||||||
|
|
||||||
const __m128i tmp_2_3 = _mm_loadu_si128((const __m128i *)x[ib + 1].qs);
|
const __m128i tmp_2_3 = _mm_loadu_si128((const __m128i *)x[ib + 1].qs);
|
||||||
|
|
||||||
@ -680,7 +681,7 @@ void ggml_vec_dot_q4_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += sumi*GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d);
|
sumf += sumi*GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -711,10 +712,10 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
// Main loop
|
// Main loop
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
const float d0 = GGML_FP16_TO_FP32(x[ib].d);
|
const float d0 = GGML_CPU_FP16_TO_FP32(x[ib].d);
|
||||||
const float d1 = GGML_FP16_TO_FP32(y[ib].d);
|
const float d1 = GGML_CPU_FP16_TO_FP32(y[ib].d);
|
||||||
|
|
||||||
summs += GGML_FP16_TO_FP32(x[ib].m) * GGML_FP16_TO_FP32(y[ib].s);
|
summs += GGML_CPU_FP16_TO_FP32(x[ib].m) * GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
|
|
||||||
const __m256 d0v = _mm256_set1_ps( d0 );
|
const __m256 d0v = _mm256_set1_ps( d0 );
|
||||||
const __m256 d1v = _mm256_set1_ps( d1 );
|
const __m256 d1v = _mm256_set1_ps( d1 );
|
||||||
@ -752,7 +753,7 @@ void ggml_vec_dot_q4_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -783,7 +784,7 @@ void ggml_vec_dot_q5_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
// Main loop
|
// Main loop
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
/* Compute combined scale for the block */
|
/* Compute combined scale for the block */
|
||||||
const __m256 d = _mm256_set1_ps(GGML_FP16_TO_FP32(x[ib].d) * GGML_FP16_TO_FP32(y[ib].d));
|
const __m256 d = _mm256_set1_ps(GGML_CPU_FP16_TO_FP32(x[ib].d) * GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
|
|
||||||
__m256i qx = bytes_from_nibbles_32(x[ib].qs);
|
__m256i qx = bytes_from_nibbles_32(x[ib].qs);
|
||||||
__m256i bxhi = bytes_from_bits_32(x[ib].qh);
|
__m256i bxhi = bytes_from_bits_32(x[ib].qh);
|
||||||
@ -807,7 +808,7 @@ void ggml_vec_dot_q5_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
// Main loop
|
// Main loop
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
/* Compute combined scale for the block */
|
/* Compute combined scale for the block */
|
||||||
const __m256 d = _mm256_set1_ps(GGML_FP16_TO_FP32(x[ib].d) * GGML_FP16_TO_FP32(y[ib].d));
|
const __m256 d = _mm256_set1_ps(GGML_CPU_FP16_TO_FP32(x[ib].d) * GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
|
|
||||||
__m256i bx_0 = bytes_from_nibbles_32(x[ib].qs);
|
__m256i bx_0 = bytes_from_nibbles_32(x[ib].qs);
|
||||||
const __m256i bxhi = bytes_from_bits_32(x[ib].qh);
|
const __m256i bxhi = bytes_from_bits_32(x[ib].qh);
|
||||||
@ -851,7 +852,7 @@ void ggml_vec_dot_q5_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d)) * sumi;
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d)) * sumi;
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -883,16 +884,16 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
// Main loop
|
// Main loop
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
const __m256 dx = _mm256_set1_ps(GGML_FP16_TO_FP32(x[ib].d));
|
const __m256 dx = _mm256_set1_ps(GGML_CPU_FP16_TO_FP32(x[ib].d));
|
||||||
|
|
||||||
summs += GGML_FP16_TO_FP32(x[ib].m) * GGML_FP16_TO_FP32(y[ib].s);
|
summs += GGML_CPU_FP16_TO_FP32(x[ib].m) * GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
|
|
||||||
__m256i qx = bytes_from_nibbles_32(x[ib].qs);
|
__m256i qx = bytes_from_nibbles_32(x[ib].qs);
|
||||||
__m256i bxhi = bytes_from_bits_32(x[ib].qh);
|
__m256i bxhi = bytes_from_bits_32(x[ib].qh);
|
||||||
bxhi = _mm256_and_si256(bxhi, _mm256_set1_epi8(0x10));
|
bxhi = _mm256_and_si256(bxhi, _mm256_set1_epi8(0x10));
|
||||||
qx = _mm256_or_si256(qx, bxhi);
|
qx = _mm256_or_si256(qx, bxhi);
|
||||||
|
|
||||||
const __m256 dy = _mm256_set1_ps(GGML_FP16_TO_FP32(y[ib].d));
|
const __m256 dy = _mm256_set1_ps(GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
const __m256i qy = _mm256_loadu_si256((const __m256i *)y[ib].qs);
|
const __m256i qy = _mm256_loadu_si256((const __m256i *)y[ib].qs);
|
||||||
|
|
||||||
const __m256 q = mul_sum_us8_pairs_float(qx, qy);
|
const __m256 q = mul_sum_us8_pairs_float(qx, qy);
|
||||||
@ -910,9 +911,9 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
// Main loop
|
// Main loop
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
const __m256 dx = _mm256_set1_ps(GGML_FP16_TO_FP32(x[ib].d));
|
const __m256 dx = _mm256_set1_ps(GGML_CPU_FP16_TO_FP32(x[ib].d));
|
||||||
|
|
||||||
summs += GGML_FP16_TO_FP32(x[ib].m) * GGML_FP16_TO_FP32(y[ib].s);
|
summs += GGML_CPU_FP16_TO_FP32(x[ib].m) * GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
|
|
||||||
__m256i bx_0 = bytes_from_nibbles_32(x[ib].qs);
|
__m256i bx_0 = bytes_from_nibbles_32(x[ib].qs);
|
||||||
const __m256i bxhi = bytes_from_bits_32(x[ib].qh);
|
const __m256i bxhi = bytes_from_bits_32(x[ib].qh);
|
||||||
@ -926,7 +927,7 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
bxh = _mm_or_si128(bxh, bxhih);
|
bxh = _mm_or_si128(bxh, bxhih);
|
||||||
bx_0 = MM256_SET_M128I(bxh, bxl);
|
bx_0 = MM256_SET_M128I(bxh, bxl);
|
||||||
|
|
||||||
const __m256 dy = _mm256_set1_ps(GGML_FP16_TO_FP32(y[ib].d));
|
const __m256 dy = _mm256_set1_ps(GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
const __m256i by_0 = _mm256_loadu_si256((const __m256i *)y[ib].qs);
|
const __m256i by_0 = _mm256_loadu_si256((const __m256i *)y[ib].qs);
|
||||||
|
|
||||||
const __m256 q = mul_sum_us8_pairs_float(bx_0, by_0);
|
const __m256 q = mul_sum_us8_pairs_float(bx_0, by_0);
|
||||||
@ -956,7 +957,7 @@ void ggml_vec_dot_q5_1_q8_1(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -986,7 +987,7 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
// Main loop
|
// Main loop
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
// Compute combined scale for the block
|
// Compute combined scale for the block
|
||||||
const __m256 d = _mm256_set1_ps(GGML_FP16_TO_FP32(x[ib].d) * GGML_FP16_TO_FP32(y[ib].d));
|
const __m256 d = _mm256_set1_ps(GGML_CPU_FP16_TO_FP32(x[ib].d) * GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
__m256i qx = _mm256_loadu_si256((const __m256i *)x[ib].qs);
|
__m256i qx = _mm256_loadu_si256((const __m256i *)x[ib].qs);
|
||||||
__m256i qy = _mm256_loadu_si256((const __m256i *)y[ib].qs);
|
__m256i qy = _mm256_loadu_si256((const __m256i *)y[ib].qs);
|
||||||
|
|
||||||
@ -1025,7 +1026,7 @@ void ggml_vec_dot_q8_0_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
sumi += x[ib].qs[j]*y[ib].qs[j];
|
sumi += x[ib].qs[j]*y[ib].qs[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += sumi*(GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d));
|
sumf += sumi*(GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -1144,7 +1145,7 @@ void ggml_vec_dot_tq1_0_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
}
|
}
|
||||||
|
|
||||||
const __m256i ysum = _mm256_loadu_si256((const __m256i *) y[i].bsums);
|
const __m256i ysum = _mm256_loadu_si256((const __m256i *) y[i].bsums);
|
||||||
const __m256 d = _mm256_set1_ps(y[i].d * GGML_FP16_TO_FP32(x[i].d));
|
const __m256 d = _mm256_set1_ps(y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d));
|
||||||
|
|
||||||
sumi0 = _mm256_sub_epi16(sumi0, ysum);
|
sumi0 = _mm256_sub_epi16(sumi0, ysum);
|
||||||
sumi0 = _mm256_add_epi16(sumi0, _mm256_add_epi16(sumi1, sumi2));
|
sumi0 = _mm256_add_epi16(sumi0, _mm256_add_epi16(sumi1, sumi2));
|
||||||
@ -1190,7 +1191,7 @@ void ggml_vec_dot_tq1_0_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += (float) sum * (GGML_FP16_TO_FP32(x[i].d) * y[i].d);
|
sumf += (float) sum * (GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -1244,7 +1245,7 @@ void ggml_vec_dot_tq2_0_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
}
|
}
|
||||||
|
|
||||||
const __m256i ysum = _mm256_loadu_si256((const __m256i *) y[i].bsums);
|
const __m256i ysum = _mm256_loadu_si256((const __m256i *) y[i].bsums);
|
||||||
const __m256 d = _mm256_set1_ps(y[i].d * GGML_FP16_TO_FP32(x[i].d));
|
const __m256 d = _mm256_set1_ps(y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d));
|
||||||
|
|
||||||
sumi0 = _mm256_add_epi16(sumi0, sumi1);
|
sumi0 = _mm256_add_epi16(sumi0, sumi1);
|
||||||
sumi0 = _mm256_sub_epi16(sumi0, ysum);
|
sumi0 = _mm256_sub_epi16(sumi0, ysum);
|
||||||
@ -1269,7 +1270,7 @@ void ggml_vec_dot_tq2_0_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
|
|
||||||
sumf += (float) sumi * d;
|
sumf += (float) sumi * d;
|
||||||
}
|
}
|
||||||
@ -1299,8 +1300,8 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = -y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = -y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -1366,8 +1367,8 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float dall = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float dall = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = -y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = -y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -1477,8 +1478,8 @@ void ggml_vec_dot_q2_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
summs += y[i].bsums[j] * (sc[j] >> 4);
|
summs += y[i].bsums[j] * (sc[j] >> 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
const float dall = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float dall = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
int isum = 0;
|
int isum = 0;
|
||||||
int is = 0;
|
int is = 0;
|
||||||
@ -1533,7 +1534,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -1638,7 +1639,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -1824,7 +1825,7 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -1862,8 +1863,8 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = -y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = -y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
memcpy(utmp, x[i].scales, 12);
|
memcpy(utmp, x[i].scales, 12);
|
||||||
utmp[3] = ((utmp[2] >> 4) & kmask2) | (((utmp[1] >> 6) & kmask3) << 4);
|
utmp[3] = ((utmp[2] >> 4) & kmask2) | (((utmp[1] >> 6) & kmask3) << 4);
|
||||||
@ -1928,8 +1929,8 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = -y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = -y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q4 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q4 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -2049,9 +2050,9 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -2092,8 +2093,8 @@ void ggml_vec_dot_q5_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
const uint8_t * GGML_RESTRICT q5 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q5 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = -y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = -y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
memcpy(utmp, x[i].scales, 12);
|
memcpy(utmp, x[i].scales, 12);
|
||||||
utmp[3] = ((utmp[2] >> 4) & kmask2) | (((utmp[1] >> 6) & kmask3) << 4);
|
utmp[3] = ((utmp[2] >> 4) & kmask2) | (((utmp[1] >> 6) & kmask3) << 4);
|
||||||
@ -2170,8 +2171,8 @@ void ggml_vec_dot_q5_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = -y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = -y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q5 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q5 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -2311,9 +2312,9 @@ void ggml_vec_dot_q5_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -2344,7 +2345,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q4 = x[i].ql;
|
const uint8_t * GGML_RESTRICT q4 = x[i].ql;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
@ -2422,7 +2423,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
|
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
|
|
||||||
const uint8_t * GGML_RESTRICT q4 = x[i].ql;
|
const uint8_t * GGML_RESTRICT q4 = x[i].ql;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
@ -2555,7 +2556,7 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -2622,7 +2623,7 @@ void ggml_vec_dot_iq2_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
__m256 accumf = _mm256_setzero_ps();
|
__m256 accumf = _mm256_setzero_ps();
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
__m256i sumi1 = _mm256_setzero_si256();
|
__m256i sumi1 = _mm256_setzero_si256();
|
||||||
@ -2663,7 +2664,7 @@ void ggml_vec_dot_iq2_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
__m256 accumf = _mm256_setzero_ps();
|
__m256 accumf = _mm256_setzero_ps();
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
__m128i sumi1_0 = _mm_setzero_si128();
|
__m128i sumi1_0 = _mm_setzero_si128();
|
||||||
@ -2717,7 +2718,7 @@ void ggml_vec_dot_iq2_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
int32_t bsum = 0;
|
int32_t bsum = 0;
|
||||||
@ -2792,7 +2793,7 @@ void ggml_vec_dot_iq2_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
|
|
||||||
__m256 accumf = _mm256_setzero_ps();
|
__m256 accumf = _mm256_setzero_ps();
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
|
|
||||||
@ -2913,7 +2914,7 @@ void ggml_vec_dot_iq2_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
|
|
||||||
__m256 accumf = _mm256_setzero_ps();
|
__m256 accumf = _mm256_setzero_ps();
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
|
|
||||||
@ -3035,7 +3036,7 @@ void ggml_vec_dot_iq2_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT sc = x[i].scales;
|
const uint8_t * GGML_RESTRICT sc = x[i].scales;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -3104,7 +3105,7 @@ void ggml_vec_dot_iq2_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
__m256 accumf = _mm256_setzero_ps();
|
__m256 accumf = _mm256_setzero_ps();
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
const uint16_t * GGML_RESTRICT signs = (const uint16_t *)(x[i].qs + QK_K/8);
|
const uint16_t * GGML_RESTRICT signs = (const uint16_t *)(x[i].qs + QK_K/8);
|
||||||
@ -3177,7 +3178,7 @@ void ggml_vec_dot_iq2_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
__m256 accumf = _mm256_setzero_ps();
|
__m256 accumf = _mm256_setzero_ps();
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
const uint16_t * GGML_RESTRICT signs = (const uint16_t *)(x[i].qs + QK_K/8);
|
const uint16_t * GGML_RESTRICT signs = (const uint16_t *)(x[i].qs + QK_K/8);
|
||||||
@ -3253,7 +3254,7 @@ void ggml_vec_dot_iq2_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int i = 0; i < nb; i++) {
|
for (int i = 0; i < nb; i++) {
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const int8_t * q8 = y[i].qs;
|
const int8_t * q8 = y[i].qs;
|
||||||
const uint8_t * qs = x[i].qs;
|
const uint8_t * qs = x[i].qs;
|
||||||
const uint8_t * qh = x[i].qh;
|
const uint8_t * qh = x[i].qh;
|
||||||
@ -3313,7 +3314,7 @@ void ggml_vec_dot_iq3_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
__m256 accumf = _mm256_setzero_ps();
|
__m256 accumf = _mm256_setzero_ps();
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -3358,7 +3359,7 @@ void ggml_vec_dot_iq3_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
__m256 accumf = _mm256_setzero_ps();
|
__m256 accumf = _mm256_setzero_ps();
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -3414,7 +3415,7 @@ void ggml_vec_dot_iq3_xxs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -3480,7 +3481,7 @@ void ggml_vec_dot_iq3_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
__m256 accumf = _mm256_setzero_ps();
|
__m256 accumf = _mm256_setzero_ps();
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
const uint16_t * GGML_RESTRICT signs = (const uint16_t *)x[i].signs;
|
const uint16_t * GGML_RESTRICT signs = (const uint16_t *)x[i].signs;
|
||||||
@ -3565,7 +3566,7 @@ void ggml_vec_dot_iq3_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
__m256 accumf = _mm256_setzero_ps();
|
__m256 accumf = _mm256_setzero_ps();
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
const uint16_t * GGML_RESTRICT signs = (const uint16_t *)x[i].signs;
|
const uint16_t * GGML_RESTRICT signs = (const uint16_t *)x[i].signs;
|
||||||
@ -3648,7 +3649,7 @@ void ggml_vec_dot_iq3_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
const uint8_t * GGML_RESTRICT signs = x[i].signs;
|
const uint8_t * GGML_RESTRICT signs = x[i].signs;
|
||||||
@ -3753,7 +3754,7 @@ void ggml_vec_dot_iq1_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
+ (y[i].bsums[2*ib+2] + y[i].bsums[2*ib+3]) * (qh[ib+1] & 0x8000 ? -1 : 1) * ls2;
|
+ (y[i].bsums[2*ib+2] + y[i].bsums[2*ib+3]) * (qh[ib+1] & 0x8000 ? -1 : 1) * ls2;
|
||||||
}
|
}
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
accum = _mm256_fmadd_ps(_mm256_set1_ps(d), _mm256_cvtepi32_ps(sumi), accum);
|
accum = _mm256_fmadd_ps(_mm256_set1_ps(d), _mm256_cvtepi32_ps(sumi), accum);
|
||||||
accum1 += d * sumi1;
|
accum1 += d * sumi1;
|
||||||
|
|
||||||
@ -3801,7 +3802,7 @@ void ggml_vec_dot_iq1_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
+ (y[i].bsums[2*ib+2] + y[i].bsums[2*ib+3]) * (qh[ib+1] & 0x8000 ? -1 : 1) * ls2;
|
+ (y[i].bsums[2*ib+2] + y[i].bsums[2*ib+3]) * (qh[ib+1] & 0x8000 ? -1 : 1) * ls2;
|
||||||
}
|
}
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
accum = _mm256_add_ps(_mm256_mul_ps(_mm256_set1_ps(d), _mm256_cvtepi32_ps(MM256_SET_M128I(sumi1_1, sumi1_0))), accum);
|
accum = _mm256_add_ps(_mm256_mul_ps(_mm256_set1_ps(d), _mm256_cvtepi32_ps(MM256_SET_M128I(sumi1_1, sumi1_0))), accum);
|
||||||
accum1 += d * sumi1;
|
accum1 += d * sumi1;
|
||||||
|
|
||||||
@ -3835,7 +3836,7 @@ void ggml_vec_dot_iq1_s_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
qs += 4;
|
qs += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += GGML_FP16_TO_FP32(x[i].d) * y[i].d * (sumi + IQ1S_DELTA * sumi1);
|
sumf += GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d * (sumi + IQ1S_DELTA * sumi1);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -3947,7 +3948,7 @@ void ggml_vec_dot_iq1_m_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
qs += 8; qh += 4;
|
qs += 8; qh += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
const __m256 d = _mm256_set1_ps(y[i].d * GGML_FP16_TO_FP32(scale.f16));
|
const __m256 d = _mm256_set1_ps(y[i].d * GGML_CPU_FP16_TO_FP32(scale.f16));
|
||||||
|
|
||||||
accum1 = _mm256_fmadd_ps(d, _mm256_cvtepi32_ps(sumi1), accum1);
|
accum1 = _mm256_fmadd_ps(d, _mm256_cvtepi32_ps(sumi1), accum1);
|
||||||
accum2 = _mm256_fmadd_ps(d, _mm256_cvtepi32_ps(sumi2), accum2);
|
accum2 = _mm256_fmadd_ps(d, _mm256_cvtepi32_ps(sumi2), accum2);
|
||||||
@ -4033,7 +4034,7 @@ void ggml_vec_dot_iq1_m_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
qs += 8; qh += 4;
|
qs += 8; qh += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
const __m256 d = _mm256_set1_ps(y[i].d * GGML_FP16_TO_FP32(scale.f16));
|
const __m256 d = _mm256_set1_ps(y[i].d * GGML_CPU_FP16_TO_FP32(scale.f16));
|
||||||
|
|
||||||
accum1 = _mm256_add_ps(_mm256_mul_ps(d, _mm256_cvtepi32_ps(MM256_SET_M128I(sumi1_1, sumi1_0))), accum1);
|
accum1 = _mm256_add_ps(_mm256_mul_ps(d, _mm256_cvtepi32_ps(MM256_SET_M128I(sumi1_1, sumi1_0))), accum1);
|
||||||
accum2 = _mm256_add_ps(_mm256_mul_ps(d, _mm256_cvtepi32_ps(MM256_SET_M128I(sumi2_1, sumi2_0))), accum2);
|
accum2 = _mm256_add_ps(_mm256_mul_ps(d, _mm256_cvtepi32_ps(MM256_SET_M128I(sumi2_1, sumi2_0))), accum2);
|
||||||
@ -4083,7 +4084,7 @@ void ggml_vec_dot_iq1_m_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
qh += 2;
|
qh += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += GGML_FP16_TO_FP32(scale.f16) * y[i].d * (sumi1 + IQ1M_DELTA * sumi2);
|
sumf += GGML_CPU_FP16_TO_FP32(scale.f16) * y[i].d * (sumi1 + IQ1M_DELTA * sumi2);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -4129,9 +4130,9 @@ void ggml_vec_dot_iq4_nl_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
const __m256i p16_2 = mul_add_epi8(q4b_2, q8b_2);
|
const __m256i p16_2 = mul_add_epi8(q4b_2, q8b_2);
|
||||||
const __m256i p_1 = _mm256_madd_epi16(p16_1, mone);
|
const __m256i p_1 = _mm256_madd_epi16(p16_1, mone);
|
||||||
const __m256i p_2 = _mm256_madd_epi16(p16_2, mone);
|
const __m256i p_2 = _mm256_madd_epi16(p16_2, mone);
|
||||||
accum1 = _mm256_fmadd_ps(_mm256_set1_ps(GGML_FP16_TO_FP32(y[ib + 0].d)*GGML_FP16_TO_FP32(x[ib + 0].d)),
|
accum1 = _mm256_fmadd_ps(_mm256_set1_ps(GGML_CPU_FP16_TO_FP32(y[ib + 0].d)*GGML_CPU_FP16_TO_FP32(x[ib + 0].d)),
|
||||||
_mm256_cvtepi32_ps(p_1), accum1);
|
_mm256_cvtepi32_ps(p_1), accum1);
|
||||||
accum2 = _mm256_fmadd_ps(_mm256_set1_ps(GGML_FP16_TO_FP32(y[ib + 1].d)*GGML_FP16_TO_FP32(x[ib + 1].d)),
|
accum2 = _mm256_fmadd_ps(_mm256_set1_ps(GGML_CPU_FP16_TO_FP32(y[ib + 1].d)*GGML_CPU_FP16_TO_FP32(x[ib + 1].d)),
|
||||||
_mm256_cvtepi32_ps(p_2), accum2);
|
_mm256_cvtepi32_ps(p_2), accum2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4164,7 +4165,7 @@ void ggml_vec_dot_iq4_nl_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
const float d = GGML_FP16_TO_FP32(y[ib].d)*GGML_FP16_TO_FP32(x[ib].d);
|
const float d = GGML_CPU_FP16_TO_FP32(y[ib].d)*GGML_CPU_FP16_TO_FP32(x[ib].d);
|
||||||
int sumi1 = 0, sumi2 = 0;
|
int sumi1 = 0, sumi2 = 0;
|
||||||
for (int j = 0; j < QK4_NL/2; ++j) {
|
for (int j = 0; j < QK4_NL/2; ++j) {
|
||||||
sumi1 += y[ib].qs[j+ 0] * kvalues_iq4nl[x[ib].qs[j] & 0xf];
|
sumi1 += y[ib].qs[j+ 0] * kvalues_iq4nl[x[ib].qs[j] & 0xf];
|
||||||
@ -4219,7 +4220,7 @@ void ggml_vec_dot_iq4_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
sumi1 = _mm256_add_epi32(p_1, sumi1);
|
sumi1 = _mm256_add_epi32(p_1, sumi1);
|
||||||
sumi2 = _mm256_add_epi32(p_2, sumi2);
|
sumi2 = _mm256_add_epi32(p_2, sumi2);
|
||||||
}
|
}
|
||||||
accum = _mm256_fmadd_ps(_mm256_set1_ps(GGML_FP16_TO_FP32(x[ibl].d)*y[ibl].d),
|
accum = _mm256_fmadd_ps(_mm256_set1_ps(GGML_CPU_FP16_TO_FP32(x[ibl].d)*y[ibl].d),
|
||||||
_mm256_cvtepi32_ps(_mm256_add_epi32(sumi1, sumi2)), accum);
|
_mm256_cvtepi32_ps(_mm256_add_epi32(sumi1, sumi2)), accum);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4267,7 +4268,7 @@ void ggml_vec_dot_iq4_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
}
|
}
|
||||||
__m128i sumi12_0 = _mm_add_epi32(sumi1_0, sumi2_0);
|
__m128i sumi12_0 = _mm_add_epi32(sumi1_0, sumi2_0);
|
||||||
__m128i sumi12_1 = _mm_add_epi32(sumi1_1, sumi2_1);
|
__m128i sumi12_1 = _mm_add_epi32(sumi1_1, sumi2_1);
|
||||||
accum = _mm256_add_ps(_mm256_mul_ps(_mm256_set1_ps(GGML_FP16_TO_FP32(x[ibl].d)*y[ibl].d),
|
accum = _mm256_add_ps(_mm256_mul_ps(_mm256_set1_ps(GGML_CPU_FP16_TO_FP32(x[ibl].d)*y[ibl].d),
|
||||||
_mm256_cvtepi32_ps(MM256_SET_M128I(sumi12_1, sumi12_0))), accum);
|
_mm256_cvtepi32_ps(MM256_SET_M128I(sumi12_1, sumi12_0))), accum);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4276,7 +4277,7 @@ void ggml_vec_dot_iq4_xs_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
|
|||||||
#else
|
#else
|
||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int ibl = 0; ibl < nb; ++ibl) {
|
for (int ibl = 0; ibl < nb; ++ibl) {
|
||||||
const float d4d8 = GGML_FP16_TO_FP32(x[ibl].d) * y[ibl].d;
|
const float d4d8 = GGML_CPU_FP16_TO_FP32(x[ibl].d) * y[ibl].d;
|
||||||
uint16_t h = x[ibl].scales_h;
|
uint16_t h = x[ibl].scales_h;
|
||||||
const uint8_t * qs = x[ibl].qs;
|
const uint8_t * qs = x[ibl].qs;
|
||||||
const int8_t * q8 = y[ibl].qs;
|
const int8_t * q8 = y[ibl].qs;
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "ggml-impl.h"
|
#include "ggml-impl.h"
|
||||||
#include "ggml-cpu.h"
|
#include "ggml-cpu.h"
|
||||||
#include "ggml-cpu-impl.h"
|
#include "ggml-cpu-impl.h"
|
||||||
|
#include "simd-mappings.h"
|
||||||
#include "traits.h"
|
#include "traits.h"
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
@ -39,11 +40,11 @@ static inline __m512 __avx512_f32cx8x2_load(ggml_fp16_t *x, ggml_fp16_t *y) {
|
|||||||
float tmp[16];
|
float tmp[16];
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
tmp[i] = GGML_FP16_TO_FP32(x[i]);
|
tmp[i] = GGML_CPU_FP16_TO_FP32(x[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
tmp[i + 8] = GGML_FP16_TO_FP32(y[i]);
|
tmp[i + 8] = GGML_CPU_FP16_TO_FP32(y[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return _mm512_loadu_ps(tmp);
|
return _mm512_loadu_ps(tmp);
|
||||||
@ -54,10 +55,10 @@ static inline __m512 __avx512_repeat_f32cx16_load(__m128i x) {
|
|||||||
_mm_storeu_si128((__m128i*)tmphalf, x);
|
_mm_storeu_si128((__m128i*)tmphalf, x);
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
tmp[i] = GGML_FP16_TO_FP32(tmphalf[i]);
|
tmp[i] = GGML_CPU_FP16_TO_FP32(tmphalf[i]);
|
||||||
tmp[i + 4] = GGML_FP16_TO_FP32(tmphalf[i]);
|
tmp[i + 4] = GGML_CPU_FP16_TO_FP32(tmphalf[i]);
|
||||||
tmp[i + 8] = GGML_FP16_TO_FP32(tmphalf[i]);
|
tmp[i + 8] = GGML_CPU_FP16_TO_FP32(tmphalf[i]);
|
||||||
tmp[i + 12] = GGML_FP16_TO_FP32(tmphalf[i]);
|
tmp[i + 12] = GGML_CPU_FP16_TO_FP32(tmphalf[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return _mm512_loadu_ps(tmp);
|
return _mm512_loadu_ps(tmp);
|
||||||
@ -67,7 +68,7 @@ static inline __m256 __avx_f32cx8_load(ggml_fp16_t *x) {
|
|||||||
float tmp[8];
|
float tmp[8];
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
tmp[i] = GGML_FP16_TO_FP32(x[i]);
|
tmp[i] = GGML_CPU_FP16_TO_FP32(x[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return _mm256_loadu_ps(tmp);
|
return _mm256_loadu_ps(tmp);
|
||||||
@ -76,8 +77,8 @@ static inline __m256 __avx_repeat_f32cx8_load(ggml_fp16_t *x) {
|
|||||||
float tmp[8];
|
float tmp[8];
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
tmp[i] = GGML_FP16_TO_FP32(x[i]);
|
tmp[i] = GGML_CPU_FP16_TO_FP32(x[i]);
|
||||||
tmp[i + 4] = GGML_FP16_TO_FP32(x[i]);
|
tmp[i + 4] = GGML_CPU_FP16_TO_FP32(x[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return _mm256_loadu_ps(tmp);
|
return _mm256_loadu_ps(tmp);
|
||||||
@ -88,7 +89,7 @@ static inline __m256 __avx_rearranged_f32cx8_load(ggml_fp16_t *x, __m128i arrang
|
|||||||
|
|
||||||
_mm_storeu_si128((__m128i*)tmphalf, _mm_shuffle_epi8(_mm_loadu_si128((const __m128i *) x), arrangeMask));
|
_mm_storeu_si128((__m128i*)tmphalf, _mm_shuffle_epi8(_mm_loadu_si128((const __m128i *) x), arrangeMask));
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
tmp[i] = GGML_FP16_TO_FP32(tmphalf[i]);
|
tmp[i] = GGML_CPU_FP16_TO_FP32(tmphalf[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return _mm256_loadu_ps(tmp);
|
return _mm256_loadu_ps(tmp);
|
||||||
@ -211,7 +212,7 @@ void ggml_quantize_mat_q8_0_4x8(const float * GGML_RESTRICT x, void * GGML_RESTR
|
|||||||
id[row_iter] = ( maxScalar != 0.0f ) ? 127.f / maxScalar : 0.0f; //d ? 1.0f / d : 0.0f;
|
id[row_iter] = ( maxScalar != 0.0f ) ? 127.f / maxScalar : 0.0f; //d ? 1.0f / d : 0.0f;
|
||||||
|
|
||||||
// Store the scale for the individual block
|
// Store the scale for the individual block
|
||||||
y[i].d[row_iter] = GGML_FP32_TO_FP16(d);
|
y[i].d[row_iter] = GGML_CPU_FP32_TO_FP16(d);
|
||||||
|
|
||||||
// Store the values in blocks of eight values - Aim is to use these later for block interleaving
|
// Store the values in blocks of eight values - Aim is to use these later for block interleaving
|
||||||
srcv[row_iter][0] = v0;
|
srcv[row_iter][0] = v0;
|
||||||
@ -297,7 +298,7 @@ void ggml_quantize_mat_q8_0_4x8(const float * GGML_RESTRICT x, void * GGML_RESTR
|
|||||||
const float d = amax / ((1 << 7) - 1);
|
const float d = amax / ((1 << 7) - 1);
|
||||||
id[row_iter] = d ? 1.0f / d : 0.0f;
|
id[row_iter] = d ? 1.0f / d : 0.0f;
|
||||||
|
|
||||||
y[i].d[row_iter] = GGML_FP32_TO_FP16(d);
|
y[i].d[row_iter] = GGML_CPU_FP32_TO_FP16(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int j = 0; j < QK8_0 * 4; j++) {
|
for (int j = 0; j < QK8_0 * 4; j++) {
|
||||||
@ -647,7 +648,7 @@ void ggml_gemv_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
const __m256 col_scale_f32 = GGML_F32Cx8_REARRANGE_LOAD(b_ptr[b].d, changemask);
|
const __m256 col_scale_f32 = GGML_F32Cx8_REARRANGE_LOAD(b_ptr[b].d, changemask);
|
||||||
|
|
||||||
// Load and convert to FP32 scale from block_q8_0
|
// Load and convert to FP32 scale from block_q8_0
|
||||||
const __m256 row_scale_f32 = _mm256_set1_ps(GGML_FP16_TO_FP32(a_ptr[b].d));
|
const __m256 row_scale_f32 = _mm256_set1_ps(GGML_CPU_FP16_TO_FP32(a_ptr[b].d));
|
||||||
|
|
||||||
// Load the block values in block_q8_0 in batches of 16 bytes and replicate the same across 256 bit vector
|
// Load the block values in block_q8_0 in batches of 16 bytes and replicate the same across 256 bit vector
|
||||||
__m256i lhs_vec_0 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)a_ptr[b].qs));
|
__m256i lhs_vec_0 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)a_ptr[b].qs));
|
||||||
@ -706,7 +707,7 @@ void ggml_gemv_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
||||||
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d);
|
sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -972,13 +973,13 @@ void ggml_gemv_q4_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
sumi2 = sumi2 * scales_1[j];
|
sumi2 = sumi2 * scales_1[j];
|
||||||
sumi += sumi1 + sumi2;
|
sumi += sumi1 + sumi2;
|
||||||
}
|
}
|
||||||
sumf[j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * a_ptr[l].d;
|
sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * a_ptr[l].d;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int sb = 0; sb < 8; sb++) {
|
for (int sb = 0; sb < 8; sb++) {
|
||||||
uint8_t *mins = (uint8_t*) utmp + 8 + sb * 16;
|
uint8_t *mins = (uint8_t*) utmp + 8 + sb * 16;
|
||||||
for (int j = 0; j < ncols_interleaved; j++) {
|
for (int j = 0; j < ncols_interleaved; j++) {
|
||||||
sum_minf[j] += mins[j] * (a_ptr[l].bsums[sb * 2] + a_ptr[l].bsums[sb * 2 + 1]) * GGML_FP16_TO_FP32(b_ptr[l].dmin[j]) * a_ptr[l].d;
|
sum_minf[j] += mins[j] * (a_ptr[l].bsums[sb * 2] + a_ptr[l].bsums[sb * 2 + 1]) * GGML_CPU_FP16_TO_FP32(b_ptr[l].dmin[j]) * a_ptr[l].d;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1755,7 +1756,7 @@ void ggml_gemm_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
||||||
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[m][j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d[m]);
|
sumf[m][j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d[m]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3259,7 +3260,7 @@ void ggml_gemm_q4_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
sumi2 = sumi2 * scales_1[j];
|
sumi2 = sumi2 * scales_1[j];
|
||||||
sumi += sumi1 + sumi2;
|
sumi += sumi1 + sumi2;
|
||||||
}
|
}
|
||||||
sumf[m][j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * a_ptr[l].d[m];
|
sumf[m][j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * a_ptr[l].d[m];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3268,7 +3269,7 @@ void ggml_gemm_q4_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
for(int m = 0; m < 4; m++) {
|
for(int m = 0; m < 4; m++) {
|
||||||
const int16_t *bsums = a_ptr[l].bsums + (sb * 8) + (m * 4) - ((sb % 2) * 6);
|
const int16_t *bsums = a_ptr[l].bsums + (sb * 8) + (m * 4) - ((sb % 2) * 6);
|
||||||
for(int j = 0; j < ncols_interleaved; j++) {
|
for(int j = 0; j < ncols_interleaved; j++) {
|
||||||
sum_minf[m][j] += mins[j] * (bsums[0] + bsums[1]) * GGML_FP16_TO_FP32(b_ptr[l].dmin[j]) * a_ptr[l].d[m];
|
sum_minf[m][j] += mins[j] * (bsums[0] + bsums[1]) * GGML_CPU_FP16_TO_FP32(b_ptr[l].dmin[j]) * a_ptr[l].d[m];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include "traits.h"
|
#include "traits.h"
|
||||||
#include "ggml-cpu-impl.h"
|
#include "ggml-cpu-impl.h"
|
||||||
#include "ggml-impl.h"
|
#include "ggml-impl.h"
|
||||||
|
#include "simd-mappings.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
||||||
@ -12,11 +13,11 @@
|
|||||||
// convenience functions/macros for use in template calls
|
// convenience functions/macros for use in template calls
|
||||||
// note: these won't be required after the 'traits' lookup table is used.
|
// note: these won't be required after the 'traits' lookup table is used.
|
||||||
static inline ggml_fp16_t f32_to_f16(float x) {
|
static inline ggml_fp16_t f32_to_f16(float x) {
|
||||||
return GGML_FP32_TO_FP16(x);
|
return GGML_CPU_FP32_TO_FP16(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline float f16_to_f32(ggml_fp16_t x) {
|
static inline float f16_to_f32(ggml_fp16_t x) {
|
||||||
return GGML_FP16_TO_FP32(x);
|
return GGML_CPU_FP16_TO_FP32(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline ggml_bf16_t f32_to_bf16(float x) {
|
static inline ggml_bf16_t f32_to_bf16(float x) {
|
||||||
|
@ -62,11 +62,17 @@ struct ggml_compute_params {
|
|||||||
#if defined(__s390x__) && defined(__VEC__)
|
#if defined(__s390x__) && defined(__VEC__)
|
||||||
#ifndef __VXE__
|
#ifndef __VXE__
|
||||||
#define __VXE__
|
#define __VXE__
|
||||||
#endif
|
#endif // __VXE__
|
||||||
#ifndef __VXE2__
|
#ifndef __VXE2__
|
||||||
#define __VXE2__
|
#define __VXE2__
|
||||||
#endif
|
#endif // __VXE2__
|
||||||
#endif
|
#endif // __s390x__ && __VEC__
|
||||||
|
|
||||||
|
#if defined(__s390x__) && defined(GGML_NNPA)
|
||||||
|
#ifndef __NNPA__
|
||||||
|
#define __NNPA__
|
||||||
|
#endif // __NNPA__
|
||||||
|
#endif // __s390x__ && GGML_NNPA
|
||||||
|
|
||||||
#if defined(__ARM_FEATURE_SVE)
|
#if defined(__ARM_FEATURE_SVE)
|
||||||
#include <sys/prctl.h>
|
#include <sys/prctl.h>
|
||||||
|
@ -72,6 +72,9 @@
|
|||||||
#define UNUSED GGML_UNUSED
|
#define UNUSED GGML_UNUSED
|
||||||
#define SWAP(x, y, T) do { T SWAP = x; (x) = y; (y) = SWAP; } while (0)
|
#define SWAP(x, y, T) do { T SWAP = x; (x) = y; (y) = SWAP; } while (0)
|
||||||
|
|
||||||
|
// precomputed f32 table for f16 (256 KB) (simd-mappings.h)
|
||||||
|
float ggml_table_f32_f16[1 << 16];
|
||||||
|
|
||||||
#if defined(__ARM_ARCH)
|
#if defined(__ARM_ARCH)
|
||||||
struct ggml_arm_arch_features_type {
|
struct ggml_arm_arch_features_type {
|
||||||
int sve_cnt;
|
int sve_cnt;
|
||||||
@ -736,7 +739,7 @@ struct ggml_tensor * ggml_set_i32 (struct ggml_tensor * tensor, int32_t value) {
|
|||||||
{
|
{
|
||||||
assert(tensor->nb[0] == sizeof(ggml_fp16_t));
|
assert(tensor->nb[0] == sizeof(ggml_fp16_t));
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
ggml_vec_set_f16(nc, (ggml_fp16_t *)(data + i*n1), GGML_FP32_TO_FP16(value));
|
ggml_vec_set_f16(nc, (ggml_fp16_t *)(data + i*n1), GGML_CPU_FP32_TO_FP16(value));
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case GGML_TYPE_BF16:
|
case GGML_TYPE_BF16:
|
||||||
@ -795,7 +798,7 @@ struct ggml_tensor * ggml_set_f32(struct ggml_tensor * tensor, float value) {
|
|||||||
{
|
{
|
||||||
assert(tensor->nb[0] == sizeof(ggml_fp16_t));
|
assert(tensor->nb[0] == sizeof(ggml_fp16_t));
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
ggml_vec_set_f16(nc, (ggml_fp16_t *)(data + i*n1), GGML_FP32_TO_FP16(value));
|
ggml_vec_set_f16(nc, (ggml_fp16_t *)(data + i*n1), GGML_CPU_FP32_TO_FP16(value));
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case GGML_TYPE_BF16:
|
case GGML_TYPE_BF16:
|
||||||
@ -846,7 +849,7 @@ int32_t ggml_get_i32_1d(const struct ggml_tensor * tensor, int i) {
|
|||||||
case GGML_TYPE_F16:
|
case GGML_TYPE_F16:
|
||||||
{
|
{
|
||||||
GGML_ASSERT(tensor->nb[0] == sizeof(ggml_fp16_t));
|
GGML_ASSERT(tensor->nb[0] == sizeof(ggml_fp16_t));
|
||||||
return GGML_FP16_TO_FP32(((ggml_fp16_t *)(tensor->data))[i]);
|
return GGML_CPU_FP16_TO_FP32(((ggml_fp16_t *)(tensor->data))[i]);
|
||||||
}
|
}
|
||||||
case GGML_TYPE_BF16:
|
case GGML_TYPE_BF16:
|
||||||
{
|
{
|
||||||
@ -891,7 +894,7 @@ void ggml_set_i32_1d(const struct ggml_tensor * tensor, int i, int32_t value) {
|
|||||||
case GGML_TYPE_F16:
|
case GGML_TYPE_F16:
|
||||||
{
|
{
|
||||||
GGML_ASSERT(tensor->nb[0] == sizeof(ggml_fp16_t));
|
GGML_ASSERT(tensor->nb[0] == sizeof(ggml_fp16_t));
|
||||||
((ggml_fp16_t *)(tensor->data))[i] = GGML_FP32_TO_FP16(value);
|
((ggml_fp16_t *)(tensor->data))[i] = GGML_CPU_FP32_TO_FP16(value);
|
||||||
} break;
|
} break;
|
||||||
case GGML_TYPE_BF16:
|
case GGML_TYPE_BF16:
|
||||||
{
|
{
|
||||||
@ -920,7 +923,7 @@ int32_t ggml_get_i32_nd(const struct ggml_tensor * tensor, int i0, int i1, int i
|
|||||||
case GGML_TYPE_I32:
|
case GGML_TYPE_I32:
|
||||||
return ((int32_t *) data)[0];
|
return ((int32_t *) data)[0];
|
||||||
case GGML_TYPE_F16:
|
case GGML_TYPE_F16:
|
||||||
return GGML_FP16_TO_FP32(((ggml_fp16_t *) data)[0]);
|
return GGML_CPU_FP16_TO_FP32(((ggml_fp16_t *) data)[0]);
|
||||||
case GGML_TYPE_BF16:
|
case GGML_TYPE_BF16:
|
||||||
return GGML_BF16_TO_FP32(((ggml_bf16_t *) data)[0]);
|
return GGML_BF16_TO_FP32(((ggml_bf16_t *) data)[0]);
|
||||||
case GGML_TYPE_F32:
|
case GGML_TYPE_F32:
|
||||||
@ -947,7 +950,7 @@ void ggml_set_i32_nd(const struct ggml_tensor * tensor, int i0, int i1, int i2,
|
|||||||
} break;
|
} break;
|
||||||
case GGML_TYPE_F16:
|
case GGML_TYPE_F16:
|
||||||
{
|
{
|
||||||
((ggml_fp16_t *)(data))[0] = GGML_FP32_TO_FP16(value);
|
((ggml_fp16_t *)(data))[0] = GGML_CPU_FP32_TO_FP16(value);
|
||||||
} break;
|
} break;
|
||||||
case GGML_TYPE_BF16:
|
case GGML_TYPE_BF16:
|
||||||
{
|
{
|
||||||
@ -985,7 +988,7 @@ float ggml_get_f32_1d(const struct ggml_tensor * tensor, int i) {
|
|||||||
}
|
}
|
||||||
case GGML_TYPE_F16:
|
case GGML_TYPE_F16:
|
||||||
{
|
{
|
||||||
return GGML_FP16_TO_FP32(((ggml_fp16_t *)(tensor->data))[i]);
|
return GGML_CPU_FP16_TO_FP32(((ggml_fp16_t *)(tensor->data))[i]);
|
||||||
}
|
}
|
||||||
case GGML_TYPE_BF16:
|
case GGML_TYPE_BF16:
|
||||||
{
|
{
|
||||||
@ -1024,7 +1027,7 @@ void ggml_set_f32_1d(const struct ggml_tensor * tensor, int i, float value) {
|
|||||||
} break;
|
} break;
|
||||||
case GGML_TYPE_F16:
|
case GGML_TYPE_F16:
|
||||||
{
|
{
|
||||||
((ggml_fp16_t *)(tensor->data))[i] = GGML_FP32_TO_FP16(value);
|
((ggml_fp16_t *)(tensor->data))[i] = GGML_CPU_FP32_TO_FP16(value);
|
||||||
} break;
|
} break;
|
||||||
case GGML_TYPE_BF16:
|
case GGML_TYPE_BF16:
|
||||||
{
|
{
|
||||||
@ -1051,7 +1054,7 @@ float ggml_get_f32_nd(const struct ggml_tensor * tensor, int i0, int i1, int i2,
|
|||||||
case GGML_TYPE_I32:
|
case GGML_TYPE_I32:
|
||||||
return ((int32_t *) data)[0];
|
return ((int32_t *) data)[0];
|
||||||
case GGML_TYPE_F16:
|
case GGML_TYPE_F16:
|
||||||
return GGML_FP16_TO_FP32(((ggml_fp16_t *) data)[0]);
|
return GGML_CPU_FP16_TO_FP32(((ggml_fp16_t *) data)[0]);
|
||||||
case GGML_TYPE_BF16:
|
case GGML_TYPE_BF16:
|
||||||
return GGML_BF16_TO_FP32(((ggml_bf16_t *) data)[0]);
|
return GGML_BF16_TO_FP32(((ggml_bf16_t *) data)[0]);
|
||||||
case GGML_TYPE_F32:
|
case GGML_TYPE_F32:
|
||||||
@ -1078,7 +1081,7 @@ void ggml_set_f32_nd(const struct ggml_tensor * tensor, int i0, int i1, int i2,
|
|||||||
} break;
|
} break;
|
||||||
case GGML_TYPE_F16:
|
case GGML_TYPE_F16:
|
||||||
{
|
{
|
||||||
((ggml_fp16_t *)(data))[0] = GGML_FP32_TO_FP16(value);
|
((ggml_fp16_t *)(data))[0] = GGML_CPU_FP32_TO_FP16(value);
|
||||||
} break;
|
} break;
|
||||||
case GGML_TYPE_BF16:
|
case GGML_TYPE_BF16:
|
||||||
{
|
{
|
||||||
@ -3141,9 +3144,24 @@ void ggml_cpu_fp32_to_fp16(const float * x, ggml_fp16_t * y, int64_t n) {
|
|||||||
__m128i y_vec = _mm_cvtps_ph(x_vec, _MM_FROUND_TO_NEAREST_INT);
|
__m128i y_vec = _mm_cvtps_ph(x_vec, _MM_FROUND_TO_NEAREST_INT);
|
||||||
_mm_storel_epi64((__m128i *)(y + i), y_vec);
|
_mm_storel_epi64((__m128i *)(y + i), y_vec);
|
||||||
}
|
}
|
||||||
|
#elif defined(__NNPA__)
|
||||||
|
for (; i + 7 < n; i += 8) {
|
||||||
|
float32x4_t v_xh = vec_xl(0, (const float *)(x + i + 0));
|
||||||
|
float32x4_t v_xl = vec_xl(0, (const float *)(x + i + 4));
|
||||||
|
uint16x8_t v_yd = vec_round_from_fp32(v_xh, v_xl, 0);
|
||||||
|
uint16x8_t v_y = vec_convert_to_fp16(v_yd, 0);
|
||||||
|
vec_xst(v_y, 0, (ggml_fp16_t *)(y + i));
|
||||||
|
}
|
||||||
|
for (; i + 3 < n; i += 4) {
|
||||||
|
float32x4_t v_x = vec_xl(0, (const float *)(x + i));
|
||||||
|
float32x4_t v_zero = vec_splats(0.0f);
|
||||||
|
uint16x8_t v_yd = vec_round_from_fp32(v_x, v_zero, 0);
|
||||||
|
uint16x8_t v_y = vec_convert_to_fp16(v_yd, 0);
|
||||||
|
vec_xst(v_y, 0, (ggml_fp16_t *)(y + i));
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
for (; i < n; ++i) {
|
for (; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(x[i]);
|
y[i] = GGML_CPU_FP32_TO_FP16(x[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3167,9 +3185,25 @@ void ggml_cpu_fp16_to_fp32(const ggml_fp16_t * x, float * y, int64_t n) {
|
|||||||
__m128 y_vec = _mm_cvtph_ps(x_vec);
|
__m128 y_vec = _mm_cvtph_ps(x_vec);
|
||||||
_mm_storeu_ps(y + i, y_vec);
|
_mm_storeu_ps(y + i, y_vec);
|
||||||
}
|
}
|
||||||
|
#elif defined(__NNPA__)
|
||||||
|
for (; i + 7 < n; i += 8) {
|
||||||
|
uint16x8_t v_x = vec_xl(0, (const ggml_fp16_t *)(x + i));
|
||||||
|
uint16x8_t v_yd = vec_convert_from_fp16(v_x, 0);
|
||||||
|
float32x4_t v_yh = vec_extend_to_fp32_hi(v_yd, 0);
|
||||||
|
float32x4_t v_yl = vec_extend_to_fp32_lo(v_yd, 0);
|
||||||
|
vec_xst(v_yh, 0, (float *)(y + i + 0));
|
||||||
|
vec_xst(v_yl, 0, (float *)(y + i + 4));
|
||||||
|
}
|
||||||
|
for (; i + 3 < n; i += 4) {
|
||||||
|
uint16x8_t v_x = vec_xl(0, (const ggml_fp16_t *)(x + i));
|
||||||
|
uint16x8_t v_yd = vec_convert_from_fp16(v_x, 0);
|
||||||
|
float32x4_t v_yh = vec_extend_to_fp32_hi(v_yd, 0);
|
||||||
|
vec_xst(v_yh, 0, (float *)(y + i));
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (; i < n; ++i) {
|
for (; i < n; ++i) {
|
||||||
y[i] = GGML_FP16_TO_FP32(x[i]);
|
y[i] = GGML_CPU_FP16_TO_FP32(x[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3369,6 +3403,14 @@ int ggml_cpu_has_vxe(void) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ggml_cpu_has_nnpa(void) {
|
||||||
|
#if defined(GGML_NNPA)
|
||||||
|
return 1;
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
int ggml_cpu_has_neon(void) {
|
int ggml_cpu_has_neon(void) {
|
||||||
#if defined(__ARM_ARCH) && defined(__ARM_NEON)
|
#if defined(__ARM_ARCH) && defined(__ARM_NEON)
|
||||||
return 1;
|
return 1;
|
||||||
@ -3418,7 +3460,7 @@ int ggml_cpu_has_sme(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ggml_cpu_init(void) {
|
void ggml_cpu_init(void) {
|
||||||
// needed to initialize f16 tables
|
// needed to initialize ggml_time
|
||||||
{
|
{
|
||||||
struct ggml_init_params params = { 0, NULL, false };
|
struct ggml_init_params params = { 0, NULL, false };
|
||||||
struct ggml_context * ctx = ggml_init(params);
|
struct ggml_context * ctx = ggml_init(params);
|
||||||
@ -3439,9 +3481,10 @@ void ggml_cpu_init(void) {
|
|||||||
uint16_t u16;
|
uint16_t u16;
|
||||||
ggml_fp16_t fp16;
|
ggml_fp16_t fp16;
|
||||||
} u = {i};
|
} u = {i};
|
||||||
float f = GGML_FP16_TO_FP32(u.fp16);
|
float f = GGML_COMPUTE_FP16_TO_FP32(u.fp16);
|
||||||
ggml_table_gelu_f16[i] = GGML_FP32_TO_FP16(ggml_gelu_f32(f));
|
ggml_table_f32_f16[i] = f;
|
||||||
ggml_table_gelu_quick_f16[i] = GGML_FP32_TO_FP16(ggml_gelu_quick_f32(f));
|
ggml_table_gelu_f16[i] = GGML_CPU_FP32_TO_FP16(ggml_gelu_f32(f));
|
||||||
|
ggml_table_gelu_quick_f16[i] = GGML_CPU_FP32_TO_FP16(ggml_gelu_quick_f32(f));
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint64_t t_end = ggml_time_us(); UNUSED(t_end);
|
const uint64_t t_end = ggml_time_us(); UNUSED(t_end);
|
||||||
|
@ -578,6 +578,9 @@ static ggml_backend_feature * ggml_backend_cpu_get_features(ggml_backend_reg_t r
|
|||||||
if (ggml_cpu_has_vxe()) {
|
if (ggml_cpu_has_vxe()) {
|
||||||
features.push_back({ "VXE", "1" });
|
features.push_back({ "VXE", "1" });
|
||||||
}
|
}
|
||||||
|
if (ggml_cpu_has_nnpa()) {
|
||||||
|
features.push_back({ "NNPA", "1" });
|
||||||
|
}
|
||||||
if (ggml_cpu_has_wasm_simd()) {
|
if (ggml_cpu_has_wasm_simd()) {
|
||||||
features.push_back({ "WASM_SIMD", "1" });
|
features.push_back({ "WASM_SIMD", "1" });
|
||||||
}
|
}
|
||||||
|
@ -52,6 +52,7 @@
|
|||||||
#include "ggml-impl.h"
|
#include "ggml-impl.h"
|
||||||
#include "ggml-cpu-impl.h"
|
#include "ggml-cpu-impl.h"
|
||||||
#include "ggml-quants.h"
|
#include "ggml-quants.h"
|
||||||
|
#include "simd-mappings.h"
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
@ -73,7 +74,7 @@
|
|||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
inline float unhalf(ggml_fp16_t d) {
|
inline float unhalf(ggml_fp16_t d) {
|
||||||
return GGML_FP16_TO_FP32(d);
|
return GGML_CPU_FP16_TO_FP32(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -252,7 +253,7 @@ template <> inline float32x4_t load(const ggml_fp16_t * p) {
|
|||||||
float tmp[4];
|
float tmp[4];
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
tmp[i] = GGML_FP16_TO_FP32(p[i]);
|
tmp[i] = GGML_CPU_FP16_TO_FP32(p[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return vec_xl(0, (const float *)(tmp));
|
return vec_xl(0, (const float *)(tmp));
|
||||||
|
@ -108,7 +108,7 @@ static void ggml_compute_forward_dup_f16(
|
|||||||
for (int i01 = ir0; i01 < ir1; i01++) {
|
for (int i01 = ir0; i01 < ir1; i01++) {
|
||||||
const ggml_fp16_t * src0_ptr = (ggml_fp16_t *) ((char *) src0->data + i01*nb01 + i02*nb02 + i03*nb03);
|
const ggml_fp16_t * src0_ptr = (ggml_fp16_t *) ((char *) src0->data + i01*nb01 + i02*nb02 + i03*nb03);
|
||||||
for (int i00 = 0; i00 < ne00; i00++) {
|
for (int i00 = 0; i00 < ne00; i00++) {
|
||||||
dst_ptr[id] = GGML_FP16_TO_FP32(src0_ptr[i00]);
|
dst_ptr[id] = GGML_CPU_FP16_TO_FP32(src0_ptr[i00]);
|
||||||
id++;
|
id++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -130,7 +130,7 @@ static void ggml_compute_forward_dup_f16(
|
|||||||
const ggml_fp16_t * src0_ptr = (ggml_fp16_t *) ((char *) src0->data + i01*nb01 + i02*nb02 + i03*nb03);
|
const ggml_fp16_t * src0_ptr = (ggml_fp16_t *) ((char *) src0->data + i01*nb01 + i02*nb02 + i03*nb03);
|
||||||
|
|
||||||
for (int i00 = 0; i00 < ne00; i00++) {
|
for (int i00 = 0; i00 < ne00; i00++) {
|
||||||
src0_f32[i00] = GGML_FP16_TO_FP32(src0_ptr[i00]);
|
src0_f32[i00] = GGML_CPU_FP16_TO_FP32(src0_ptr[i00]);
|
||||||
}
|
}
|
||||||
|
|
||||||
quantize_row_q(src0_f32, dst_ptr + id, ne00);
|
quantize_row_q(src0_f32, dst_ptr + id, ne00);
|
||||||
@ -156,7 +156,7 @@ static void ggml_compute_forward_dup_f16(
|
|||||||
for (int i00 = 0; i00 < ne00; i00++) {
|
for (int i00 = 0; i00 < ne00; i00++) {
|
||||||
const ggml_fp16_t * src0_ptr = (ggml_fp16_t *) ((char *) src0->data + i00*nb00 + i01*nb01 + i02*nb02 + i03*nb03);
|
const ggml_fp16_t * src0_ptr = (ggml_fp16_t *) ((char *) src0->data + i00*nb00 + i01*nb01 + i02*nb02 + i03*nb03);
|
||||||
|
|
||||||
dst_ptr[id] = GGML_FP16_TO_FP32(*src0_ptr);
|
dst_ptr[id] = GGML_CPU_FP16_TO_FP32(*src0_ptr);
|
||||||
id++;
|
id++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -267,7 +267,7 @@ static void ggml_compute_forward_dup_f16(
|
|||||||
const char * src0_ptr = ((char *) src0->data + i00*nb00 + i01*nb01 + i02*nb02 + i03*nb03);
|
const char * src0_ptr = ((char *) src0->data + i00*nb00 + i01*nb01 + i02*nb02 + i03*nb03);
|
||||||
char * dst_ptr = ((char *) dst->data + i10*nb0 + i11*nb1 + i12*nb2 + i13*nb3);
|
char * dst_ptr = ((char *) dst->data + i10*nb0 + i11*nb1 + i12*nb2 + i13*nb3);
|
||||||
|
|
||||||
*(float *) dst_ptr = GGML_FP16_TO_FP32(*(const ggml_fp16_t *) src0_ptr);
|
*(float *) dst_ptr = GGML_CPU_FP16_TO_FP32(*(const ggml_fp16_t *) src0_ptr);
|
||||||
|
|
||||||
if (++i10 == ne0) {
|
if (++i10 == ne0) {
|
||||||
i10 = 0;
|
i10 = 0;
|
||||||
@ -372,7 +372,7 @@ static void ggml_compute_forward_dup_bf16(
|
|||||||
for (int i01 = ir0; i01 < ir1; i01++) {
|
for (int i01 = ir0; i01 < ir1; i01++) {
|
||||||
const ggml_bf16_t * src0_ptr = (ggml_bf16_t *) ((char *) src0->data + i01*nb01 + i02*nb02 + i03*nb03);
|
const ggml_bf16_t * src0_ptr = (ggml_bf16_t *) ((char *) src0->data + i01*nb01 + i02*nb02 + i03*nb03);
|
||||||
for (int i00 = 0; i00 < ne00; i00++) {
|
for (int i00 = 0; i00 < ne00; i00++) {
|
||||||
dst_ptr[id] = GGML_FP32_TO_FP16(GGML_BF16_TO_FP32(src0_ptr[i00]));
|
dst_ptr[id] = GGML_CPU_FP32_TO_FP16(GGML_BF16_TO_FP32(src0_ptr[i00]));
|
||||||
id++;
|
id++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -473,7 +473,7 @@ static void ggml_compute_forward_dup_bf16(
|
|||||||
for (int i00 = 0; i00 < ne00; i00++) {
|
for (int i00 = 0; i00 < ne00; i00++) {
|
||||||
const ggml_bf16_t * src0_ptr = (ggml_bf16_t *) ((char *) src0->data + i00*nb00 + i01*nb01 + i02*nb02 + i03*nb03);
|
const ggml_bf16_t * src0_ptr = (ggml_bf16_t *) ((char *) src0->data + i00*nb00 + i01*nb01 + i02*nb02 + i03*nb03);
|
||||||
|
|
||||||
dst_ptr[id] = GGML_FP32_TO_FP16(GGML_BF16_TO_FP32(*src0_ptr));
|
dst_ptr[id] = GGML_CPU_FP32_TO_FP16(GGML_BF16_TO_FP32(*src0_ptr));
|
||||||
id++;
|
id++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -566,7 +566,7 @@ static void ggml_compute_forward_dup_bf16(
|
|||||||
const char * src0_ptr = ((char *) src0->data + i00*nb00 + i01*nb01 + i02*nb02 + i03*nb03);
|
const char * src0_ptr = ((char *) src0->data + i00*nb00 + i01*nb01 + i02*nb02 + i03*nb03);
|
||||||
char * dst_ptr = ((char *) dst->data + i10*nb0 + i11*nb1 + i12*nb2 + i13*nb3);
|
char * dst_ptr = ((char *) dst->data + i10*nb0 + i11*nb1 + i12*nb2 + i13*nb3);
|
||||||
|
|
||||||
*(ggml_fp16_t *) dst_ptr = GGML_FP32_TO_FP16(GGML_BF16_TO_FP32(*(const ggml_bf16_t *) src0_ptr));
|
*(ggml_fp16_t *) dst_ptr = GGML_CPU_FP32_TO_FP16(GGML_BF16_TO_FP32(*(const ggml_bf16_t *) src0_ptr));
|
||||||
|
|
||||||
if (++i10 == ne0) {
|
if (++i10 == ne0) {
|
||||||
i10 = 0;
|
i10 = 0;
|
||||||
@ -765,7 +765,7 @@ static void ggml_compute_forward_dup_f32(
|
|||||||
for (int i00 = 0; i00 < ne00; i00++) {
|
for (int i00 = 0; i00 < ne00; i00++) {
|
||||||
const float * src0_ptr = (float *) ((char *) src0->data + i00*nb00 + i01*nb01 + i02*nb02 + i03*nb03);
|
const float * src0_ptr = (float *) ((char *) src0->data + i00*nb00 + i01*nb01 + i02*nb02 + i03*nb03);
|
||||||
|
|
||||||
dst_ptr[id] = GGML_FP32_TO_FP16(*src0_ptr);
|
dst_ptr[id] = GGML_CPU_FP32_TO_FP16(*src0_ptr);
|
||||||
id++;
|
id++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -878,7 +878,7 @@ static void ggml_compute_forward_dup_f32(
|
|||||||
const char * src0_ptr = ((char *) src0->data + i00*nb00 + i01*nb01 + i02*nb02 + i03*nb03);
|
const char * src0_ptr = ((char *) src0->data + i00*nb00 + i01*nb01 + i02*nb02 + i03*nb03);
|
||||||
char * dst_ptr = ((char *) dst->data + i10*nb0 + i11*nb1 + i12*nb2 + i13*nb3);
|
char * dst_ptr = ((char *) dst->data + i10*nb0 + i11*nb1 + i12*nb2 + i13*nb3);
|
||||||
|
|
||||||
*(ggml_fp16_t *) dst_ptr = GGML_FP32_TO_FP16(*(const float *) src0_ptr);
|
*(ggml_fp16_t *) dst_ptr = GGML_CPU_FP32_TO_FP16(*(const float *) src0_ptr);
|
||||||
|
|
||||||
if (++i10 == ne0) {
|
if (++i10 == ne0) {
|
||||||
i10 = 0;
|
i10 = 0;
|
||||||
@ -1419,7 +1419,7 @@ static void ggml_compute_forward_add1_f16_f32(
|
|||||||
ggml_fp16_t * dst_ptr = (ggml_fp16_t *) ((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 );
|
ggml_fp16_t * dst_ptr = (ggml_fp16_t *) ((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 );
|
||||||
ggml_fp16_t * src0_ptr = (ggml_fp16_t *) ((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01);
|
ggml_fp16_t * src0_ptr = (ggml_fp16_t *) ((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01);
|
||||||
for (int i = 0; i < ne0; i++) {
|
for (int i = 0; i < ne0; i++) {
|
||||||
dst_ptr[i] = GGML_FP32_TO_FP16(GGML_FP16_TO_FP32(src0_ptr[i]) + v);
|
dst_ptr[i] = GGML_CPU_FP32_TO_FP16(GGML_CPU_FP16_TO_FP32(src0_ptr[i]) + v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1435,7 +1435,7 @@ static void ggml_compute_forward_add1_f16_f16(
|
|||||||
GGML_ASSERT(ggml_is_scalar(src1));
|
GGML_ASSERT(ggml_is_scalar(src1));
|
||||||
|
|
||||||
// scalar to add
|
// scalar to add
|
||||||
const float v = GGML_FP16_TO_FP32(*(ggml_fp16_t *) src1->data);
|
const float v = GGML_CPU_FP16_TO_FP32(*(ggml_fp16_t *) src1->data);
|
||||||
|
|
||||||
const int ith = params->ith;
|
const int ith = params->ith;
|
||||||
const int nth = params->nth;
|
const int nth = params->nth;
|
||||||
@ -1467,7 +1467,7 @@ static void ggml_compute_forward_add1_f16_f16(
|
|||||||
ggml_fp16_t * dst_ptr = (ggml_fp16_t *) ((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 );
|
ggml_fp16_t * dst_ptr = (ggml_fp16_t *) ((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 );
|
||||||
ggml_fp16_t * src0_ptr = (ggml_fp16_t *) ((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01);
|
ggml_fp16_t * src0_ptr = (ggml_fp16_t *) ((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01);
|
||||||
for (int i = 0; i < ne0; i++) {
|
for (int i = 0; i < ne0; i++) {
|
||||||
dst_ptr[i] = GGML_FP32_TO_FP16(GGML_FP16_TO_FP32(src0_ptr[i]) + v);
|
dst_ptr[i] = GGML_CPU_FP32_TO_FP16(GGML_CPU_FP16_TO_FP32(src0_ptr[i]) + v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1889,7 +1889,7 @@ static void ggml_compute_forward_sum_f16(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
((ggml_fp16_t *) dst->data)[0] = GGML_FP32_TO_FP16(sum);
|
((ggml_fp16_t *) dst->data)[0] = GGML_CPU_FP32_TO_FP16(sum);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ggml_compute_forward_sum_bf16(
|
static void ggml_compute_forward_sum_bf16(
|
||||||
@ -2660,7 +2660,7 @@ static void ggml_compute_forward_gelu_f16(
|
|||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
for (int k = 0; k < nc; k++) {
|
for (int k = 0; k < nc; k++) {
|
||||||
const ggml_fp16_t x = ((ggml_fp16_t *) ((char *) dst->data + i1*( dst->nb[1])))[k];
|
const ggml_fp16_t x = ((ggml_fp16_t *) ((char *) dst->data + i1*( dst->nb[1])))[k];
|
||||||
const float v = GGML_FP16_TO_FP32(x);
|
const float v = GGML_CPU_FP16_TO_FP32(x);
|
||||||
GGML_UNUSED(v);
|
GGML_UNUSED(v);
|
||||||
assert(!isnan(v));
|
assert(!isnan(v));
|
||||||
assert(!isinf(v));
|
assert(!isinf(v));
|
||||||
@ -2763,7 +2763,7 @@ static void ggml_compute_forward_gelu_erf_f16(
|
|||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
for (int k = 0; k < nc; k++) {
|
for (int k = 0; k < nc; k++) {
|
||||||
const ggml_fp16_t x = ((ggml_fp16_t *) ((char *) dst->data + i1*( dst->nb[1])))[k];
|
const ggml_fp16_t x = ((ggml_fp16_t *) ((char *) dst->data + i1*( dst->nb[1])))[k];
|
||||||
const float v = GGML_FP16_TO_FP32(x);
|
const float v = GGML_CPU_FP16_TO_FP32(x);
|
||||||
GGML_UNUSED(v);
|
GGML_UNUSED(v);
|
||||||
assert(!isnan(v));
|
assert(!isnan(v));
|
||||||
assert(!isinf(v));
|
assert(!isinf(v));
|
||||||
@ -2866,7 +2866,7 @@ static void ggml_compute_forward_gelu_quick_f16(
|
|||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
for (int k = 0; k < nc; k++) {
|
for (int k = 0; k < nc; k++) {
|
||||||
const ggml_fp16_t x = ((ggml_fp16_t *) ((char *) dst->data + i1*( dst->nb[1])))[k];
|
const ggml_fp16_t x = ((ggml_fp16_t *) ((char *) dst->data + i1*( dst->nb[1])))[k];
|
||||||
const float v = GGML_FP16_TO_FP32(x);
|
const float v = GGML_CPU_FP16_TO_FP32(x);
|
||||||
GGML_UNUSED(v);
|
GGML_UNUSED(v);
|
||||||
assert(!isnan(v));
|
assert(!isnan(v));
|
||||||
assert(!isinf(v));
|
assert(!isinf(v));
|
||||||
@ -2969,7 +2969,7 @@ static void ggml_compute_forward_silu_f16(
|
|||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
for (int k = 0; k < nc; k++) {
|
for (int k = 0; k < nc; k++) {
|
||||||
const ggml_fp16_t x = ((ggml_fp16_t *) ((char *) dst->data + i1*(dst->nb[1])))[k];
|
const ggml_fp16_t x = ((ggml_fp16_t *) ((char *) dst->data + i1*(dst->nb[1])))[k];
|
||||||
const float v = GGML_FP16_TO_FP32(x);
|
const float v = GGML_CPU_FP16_TO_FP32(x);
|
||||||
GGML_UNUSED(v);
|
GGML_UNUSED(v);
|
||||||
assert(!isnan(v));
|
assert(!isnan(v));
|
||||||
assert(!isinf(v));
|
assert(!isinf(v));
|
||||||
@ -3163,7 +3163,7 @@ static void ggml_compute_forward_silu_back_f16(
|
|||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
for (int k = 0; k < nc; k++) {
|
for (int k = 0; k < nc; k++) {
|
||||||
const float x = ((ggml_fp16_t *) ((char *) dst->data + i1*( dst->nb[1])))[k];
|
const float x = ((ggml_fp16_t *) ((char *) dst->data + i1*( dst->nb[1])))[k];
|
||||||
const float v = GGML_FP16_TO_FP32(x);
|
const float v = GGML_CPU_FP16_TO_FP32(x);
|
||||||
GGML_UNUSED(v);
|
GGML_UNUSED(v);
|
||||||
assert(!isnan(v));
|
assert(!isnan(v));
|
||||||
assert(!isinf(v));
|
assert(!isinf(v));
|
||||||
@ -4500,7 +4500,7 @@ static void ggml_compute_forward_get_rows_back_f32_f16(
|
|||||||
|
|
||||||
for (int j = 0; j < nc; ++j) {
|
for (int j = 0; j < nc; ++j) {
|
||||||
ggml_fp16_t v = ((ggml_fp16_t *) ((char *) src0->data + i*src0->nb[1]))[j];
|
ggml_fp16_t v = ((ggml_fp16_t *) ((char *) src0->data + i*src0->nb[1]))[j];
|
||||||
((float *) ((char *) dst->data + r*dst->nb[1]))[j] += GGML_FP16_TO_FP32(v);
|
((float *) ((char *) dst->data + r*dst->nb[1]))[j] += GGML_CPU_FP16_TO_FP32(v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4792,7 +4792,7 @@ static void ggml_compute_forward_soft_max_f32(
|
|||||||
if (mp_f32) {
|
if (mp_f32) {
|
||||||
if (use_f16) {
|
if (use_f16) {
|
||||||
for (int i = 0; i < nc; ++i) {
|
for (int i = 0; i < nc; ++i) {
|
||||||
wp[i] += slope*GGML_FP16_TO_FP32(mp_f16[i]);
|
wp[i] += slope*GGML_CPU_FP16_TO_FP32(mp_f16[i]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (int i = 0; i < nc; ++i) {
|
for (int i = 0; i < nc; ++i) {
|
||||||
@ -5018,8 +5018,8 @@ static void ggml_compute_forward_clamp_f16(
|
|||||||
ggml_fp16_t * src0_ptr = (ggml_fp16_t *) ((char *) src0->data + j*nb01);
|
ggml_fp16_t * src0_ptr = (ggml_fp16_t *) ((char *) src0->data + j*nb01);
|
||||||
|
|
||||||
for (int i = 0; i < nc; i++) {
|
for (int i = 0; i < nc; i++) {
|
||||||
float v = GGML_FP16_TO_FP32(src0_ptr[i]);
|
float v = GGML_CPU_FP16_TO_FP32(src0_ptr[i]);
|
||||||
dst_ptr[i] = GGML_FP32_TO_FP16(MAX(MIN(v, max), min));
|
dst_ptr[i] = GGML_CPU_FP32_TO_FP16(MAX(MIN(v, max), min));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5476,11 +5476,11 @@ static void ggml_compute_forward_rope_f16(
|
|||||||
const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00);
|
const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00);
|
||||||
ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0);
|
ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0);
|
||||||
|
|
||||||
const float x0 = GGML_FP16_TO_FP32(src[0]);
|
const float x0 = GGML_CPU_FP16_TO_FP32(src[0]);
|
||||||
const float x1 = GGML_FP16_TO_FP32(src[n_dims]);
|
const float x1 = GGML_CPU_FP16_TO_FP32(src[n_dims]);
|
||||||
|
|
||||||
dst_data[0] = GGML_FP32_TO_FP16(x0*cos_theta - x1*sin_theta);
|
dst_data[0] = GGML_CPU_FP32_TO_FP16(x0*cos_theta - x1*sin_theta);
|
||||||
dst_data[n_dims] = GGML_FP32_TO_FP16(x0*sin_theta + x1*cos_theta);
|
dst_data[n_dims] = GGML_CPU_FP32_TO_FP16(x0*sin_theta + x1*cos_theta);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (int64_t i0 = 0; i0 < n_dims; i0 += 2) {
|
for (int64_t i0 = 0; i0 < n_dims; i0 += 2) {
|
||||||
@ -5492,11 +5492,11 @@ static void ggml_compute_forward_rope_f16(
|
|||||||
const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00);
|
const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00);
|
||||||
ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0);
|
ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0);
|
||||||
|
|
||||||
const float x0 = GGML_FP16_TO_FP32(src[0]);
|
const float x0 = GGML_CPU_FP16_TO_FP32(src[0]);
|
||||||
const float x1 = GGML_FP16_TO_FP32(src[n_dims/2]);
|
const float x1 = GGML_CPU_FP16_TO_FP32(src[n_dims/2]);
|
||||||
|
|
||||||
dst_data[0] = GGML_FP32_TO_FP16(x0*cos_theta - x1*sin_theta);
|
dst_data[0] = GGML_CPU_FP32_TO_FP16(x0*cos_theta - x1*sin_theta);
|
||||||
dst_data[n_dims/2] = GGML_FP32_TO_FP16(x0*sin_theta + x1*cos_theta);
|
dst_data[n_dims/2] = GGML_CPU_FP32_TO_FP16(x0*sin_theta + x1*cos_theta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -5507,11 +5507,11 @@ static void ggml_compute_forward_rope_f16(
|
|||||||
const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00);
|
const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00);
|
||||||
ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0);
|
ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0);
|
||||||
|
|
||||||
const float x0 = GGML_FP16_TO_FP32(src[0]);
|
const float x0 = GGML_CPU_FP16_TO_FP32(src[0]);
|
||||||
const float x1 = GGML_FP16_TO_FP32(src[1]);
|
const float x1 = GGML_CPU_FP16_TO_FP32(src[1]);
|
||||||
|
|
||||||
dst_data[0] = GGML_FP32_TO_FP16(x0*cos_theta - x1*sin_theta);
|
dst_data[0] = GGML_CPU_FP32_TO_FP16(x0*cos_theta - x1*sin_theta);
|
||||||
dst_data[1] = GGML_FP32_TO_FP16(x0*sin_theta + x1*cos_theta);
|
dst_data[1] = GGML_CPU_FP32_TO_FP16(x0*sin_theta + x1*cos_theta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5525,11 +5525,11 @@ static void ggml_compute_forward_rope_f16(
|
|||||||
const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00);
|
const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00);
|
||||||
ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0);
|
ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0);
|
||||||
|
|
||||||
const float x0 = GGML_FP16_TO_FP32(src[0]);
|
const float x0 = GGML_CPU_FP16_TO_FP32(src[0]);
|
||||||
const float x1 = GGML_FP16_TO_FP32(src[n_dims]);
|
const float x1 = GGML_CPU_FP16_TO_FP32(src[n_dims]);
|
||||||
|
|
||||||
dst_data[0] = GGML_FP32_TO_FP16(x0*cos_theta - x1*sin_theta);
|
dst_data[0] = GGML_CPU_FP32_TO_FP16(x0*cos_theta - x1*sin_theta);
|
||||||
dst_data[n_dims] = GGML_FP32_TO_FP16(x0*sin_theta + x1*cos_theta);
|
dst_data[n_dims] = GGML_CPU_FP32_TO_FP16(x0*sin_theta + x1*cos_theta);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (int64_t i0 = n_dims; i0 < ne0; i0 += 2) {
|
for (int64_t i0 = n_dims; i0 < ne0; i0 += 2) {
|
||||||
@ -5640,7 +5640,7 @@ static void ggml_compute_forward_conv_transpose_1d_f16_f32(
|
|||||||
for (int64_t i11 = 0; i11 < ne11; i11++) {
|
for (int64_t i11 = 0; i11 < ne11; i11++) {
|
||||||
const float * const src = (float *)((char *) src1->data + i11*nb11);
|
const float * const src = (float *)((char *) src1->data + i11*nb11);
|
||||||
for (int64_t i10 = 0; i10 < ne10; i10++) {
|
for (int64_t i10 = 0; i10 < ne10; i10++) {
|
||||||
dst_data[i10*ne11 + i11] = GGML_FP32_TO_FP16(src[i10]);
|
dst_data[i10*ne11 + i11] = GGML_CPU_FP32_TO_FP16(src[i10]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5933,7 +5933,7 @@ static void ggml_compute_forward_im2col_f16(
|
|||||||
if (iih < 0 || iih >= IH || iiw < 0 || iiw >= IW) {
|
if (iih < 0 || iih >= IH || iiw < 0 || iiw >= IW) {
|
||||||
dst_data[iic*(KH*KW) + ikh*KW + ikw] = 0;
|
dst_data[iic*(KH*KW) + ikh*KW + ikw] = 0;
|
||||||
} else {
|
} else {
|
||||||
dst_data[iic*(KH*KW) + ikh*KW + ikw] = GGML_FP32_TO_FP16(src_data[iih*IW + iiw]);
|
dst_data[iic*(KH*KW) + ikh*KW + ikw] = GGML_CPU_FP32_TO_FP16(src_data[iih*IW + iiw]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6109,7 +6109,7 @@ void ggml_compute_forward_conv_transpose_2d(
|
|||||||
const float * const src = (float *)((char *) src1->data + i12*nb12 + i11*nb11);
|
const float * const src = (float *)((char *) src1->data + i12*nb12 + i11*nb11);
|
||||||
ggml_fp16_t * dst_data = wdata + i11*ne10*ne12;
|
ggml_fp16_t * dst_data = wdata + i11*ne10*ne12;
|
||||||
for (int i10 = 0; i10 < ne10; i10++) {
|
for (int i10 = 0; i10 < ne10; i10++) {
|
||||||
dst_data[i10*ne12 + i12] = GGML_FP32_TO_FP16(src[i10]);
|
dst_data[i10*ne12 + i12] = GGML_CPU_FP32_TO_FP16(src[i10]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6358,7 +6358,7 @@ static void ggml_compute_forward_pool_1d_sk_p0(
|
|||||||
case GGML_OP_POOL_COUNT: GGML_ABORT("fatal error");
|
case GGML_OP_POOL_COUNT: GGML_ABORT("fatal error");
|
||||||
}
|
}
|
||||||
for (int ki = 0; ki < k; ++ki) {
|
for (int ki = 0; ki < k; ++ki) {
|
||||||
const float srow_j = (src->type == GGML_TYPE_F32) ? ((const float*)srow)[j] : GGML_FP16_TO_FP32(((const ggml_fp16_t*)srow)[j]);
|
const float srow_j = (src->type == GGML_TYPE_F32) ? ((const float*)srow)[j] : GGML_CPU_FP16_TO_FP32(((const ggml_fp16_t*)srow)[j]);
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case GGML_OP_POOL_AVG: drow[i] += srow_j; break;
|
case GGML_OP_POOL_AVG: drow[i] += srow_j; break;
|
||||||
case GGML_OP_POOL_MAX: if (srow_j > drow[i]) drow[i] = srow_j; break;
|
case GGML_OP_POOL_MAX: if (srow_j > drow[i]) drow[i] = srow_j; break;
|
||||||
@ -6450,7 +6450,7 @@ void ggml_compute_forward_pool_2d(
|
|||||||
for (int kx = 0; kx < k0; ++kx) {
|
for (int kx = 0; kx < k0; ++kx) {
|
||||||
int j = ix + kx;
|
int j = ix + kx;
|
||||||
if (j < 0 || j >= src->ne[0]) continue;
|
if (j < 0 || j >= src->ne[0]) continue;
|
||||||
const float srow_j = (src->type == GGML_TYPE_F32) ? ((const float*)srow)[j] : GGML_FP16_TO_FP32(((const ggml_fp16_t*)srow)[j]);
|
const float srow_j = (src->type == GGML_TYPE_F32) ? ((const float*)srow)[j] : GGML_CPU_FP16_TO_FP32(((const ggml_fp16_t*)srow)[j]);
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case GGML_OP_POOL_AVG: *out += srow_j; break;
|
case GGML_OP_POOL_AVG: *out += srow_j; break;
|
||||||
case GGML_OP_POOL_MAX: if (srow_j > *out) *out = srow_j; break;
|
case GGML_OP_POOL_MAX: if (srow_j > *out) *out = srow_j; break;
|
||||||
@ -6538,7 +6538,7 @@ void ggml_compute_forward_pool_2d_back(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const float val = dst->type == GGML_TYPE_F32 ?
|
const float val = dst->type == GGML_TYPE_F32 ?
|
||||||
((const float *) drowf)[j] : GGML_FP16_TO_FP32(((const ggml_fp16_t *) drowf)[j]);
|
((const float *) drowf)[j] : GGML_CPU_FP16_TO_FP32(((const ggml_fp16_t *) drowf)[j]);
|
||||||
if (val <= maxval) {
|
if (val <= maxval) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -6558,7 +6558,7 @@ void ggml_compute_forward_pool_2d_back(
|
|||||||
if (dst->type == GGML_TYPE_F32) {
|
if (dst->type == GGML_TYPE_F32) {
|
||||||
((float *) drow)[j] += grad0;
|
((float *) drow)[j] += grad0;
|
||||||
} else {
|
} else {
|
||||||
((ggml_fp16_t *) drow)[j] = GGML_FP32_TO_FP16(grad0 + GGML_FP16_TO_FP32(((const ggml_fp16_t *) drow)[j]));
|
((ggml_fp16_t *) drow)[j] = GGML_CPU_FP32_TO_FP16(grad0 + GGML_CPU_FP16_TO_FP32(((const ggml_fp16_t *) drow)[j]));
|
||||||
}
|
}
|
||||||
} else if (op == GGML_OP_POOL_AVG) {
|
} else if (op == GGML_OP_POOL_AVG) {
|
||||||
const float grad = grad0 / ka;
|
const float grad = grad0 / ka;
|
||||||
@ -6577,7 +6577,7 @@ void ggml_compute_forward_pool_2d_back(
|
|||||||
if (dst->type == GGML_TYPE_F32) {
|
if (dst->type == GGML_TYPE_F32) {
|
||||||
((float *) drow)[j] += grad;
|
((float *) drow)[j] += grad;
|
||||||
} else {
|
} else {
|
||||||
((ggml_fp16_t *) drow)[j] += GGML_FP32_TO_FP16(grad);
|
((ggml_fp16_t *) drow)[j] += GGML_CPU_FP32_TO_FP16(grad);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -7147,7 +7147,7 @@ static void ggml_compute_forward_flash_attn_ext_f16(
|
|||||||
// loop over n_kv and n_head_kv
|
// loop over n_kv and n_head_kv
|
||||||
// ref: https://arxiv.org/pdf/2112.05682.pdf
|
// ref: https://arxiv.org/pdf/2112.05682.pdf
|
||||||
for (int64_t ic = 0; ic < nek1; ++ic) {
|
for (int64_t ic = 0; ic < nek1; ++ic) {
|
||||||
const float mv = mp ? slope*GGML_FP16_TO_FP32(mp[ic]) : 0.0f;
|
const float mv = mp ? slope*GGML_CPU_FP16_TO_FP32(mp[ic]) : 0.0f;
|
||||||
if (mv == -INFINITY) {
|
if (mv == -INFINITY) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -7215,7 +7215,7 @@ static void ggml_compute_forward_flash_attn_ext_f16(
|
|||||||
|
|
||||||
if (v->type == GGML_TYPE_F16) {
|
if (v->type == GGML_TYPE_F16) {
|
||||||
for (int64_t d = 0; d < DV; ++d) {
|
for (int64_t d = 0; d < DV; ++d) {
|
||||||
VKQ32[d] = GGML_FP16_TO_FP32(VKQ16[d]);
|
VKQ32[d] = GGML_CPU_FP16_TO_FP32(VKQ16[d]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include "ggml-common.h"
|
#include "ggml-common.h"
|
||||||
|
|
||||||
#include "ggml-cpu-impl.h"
|
#include "ggml-cpu-impl.h"
|
||||||
|
#include "simd-mappings.h"
|
||||||
#include "ggml-quants.h"
|
#include "ggml-quants.h"
|
||||||
#include "quants.h"
|
#include "quants.h"
|
||||||
|
|
||||||
@ -137,7 +138,7 @@ void ggml_vec_dot_q4_0_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs, c
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += sumi*GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d);
|
sumf += sumi*GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -174,7 +175,7 @@ void ggml_vec_dot_q4_1_q8_1_generic(int n, float * GGML_RESTRICT s, size_t bs, c
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -217,7 +218,7 @@ void ggml_vec_dot_q5_0_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs, c
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d)) * sumi;
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d)) * sumi;
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -260,7 +261,7 @@ void ggml_vec_dot_q5_1_q8_1_generic(int n, float * GGML_RESTRICT s, size_t bs, c
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sumi = sumi0 + sumi1;
|
int sumi = sumi0 + sumi1;
|
||||||
sumf += (GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d))*sumi + GGML_FP16_TO_FP32(x[ib].m)*GGML_FP16_TO_FP32(y[ib].s);
|
sumf += (GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d))*sumi + GGML_CPU_FP16_TO_FP32(x[ib].m)*GGML_CPU_FP16_TO_FP32(y[ib].s);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -290,7 +291,7 @@ void ggml_vec_dot_q8_0_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs, c
|
|||||||
sumi += x[ib].qs[j]*y[ib].qs[j];
|
sumi += x[ib].qs[j]*y[ib].qs[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += sumi*(GGML_FP16_TO_FP32(x[ib].d)*GGML_FP16_TO_FP32(y[ib].d));
|
sumf += sumi*(GGML_CPU_FP16_TO_FP32(x[ib].d)*GGML_CPU_FP16_TO_FP32(y[ib].d));
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -342,7 +343,7 @@ void ggml_vec_dot_tq1_0_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += (float) sum * (GGML_FP16_TO_FP32(x[i].d) * y[i].d);
|
sumf += (float) sum * (GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -372,7 +373,7 @@ void ggml_vec_dot_tq2_0_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const float d = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float d = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
|
|
||||||
sumf += (float) sumi * d;
|
sumf += (float) sumi * d;
|
||||||
}
|
}
|
||||||
@ -405,8 +406,8 @@ void ggml_vec_dot_q2_K_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs, c
|
|||||||
summs += y[i].bsums[j] * (sc[j] >> 4);
|
summs += y[i].bsums[j] * (sc[j] >> 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
const float dall = y[i].d * GGML_FP16_TO_FP32(x[i].d);
|
const float dall = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].d);
|
||||||
const float dmin = y[i].d * GGML_FP16_TO_FP32(x[i].dmin);
|
const float dmin = y[i].d * GGML_CPU_FP16_TO_FP32(x[i].dmin);
|
||||||
|
|
||||||
int isum = 0;
|
int isum = 0;
|
||||||
int is = 0;
|
int is = 0;
|
||||||
@ -504,7 +505,7 @@ void ggml_vec_dot_q3_K_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs, c
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += (scales[j] - 32) * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -577,9 +578,9 @@ void ggml_vec_dot_q4_K_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs, c
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -657,9 +658,9 @@ void ggml_vec_dot_q5_K_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs, c
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
const float dmin = GGML_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
const float dmin = GGML_CPU_FP16_TO_FP32(x[i].dmin) * y[i].d;
|
||||||
sumf -= dmin * sumi;
|
sumf -= dmin * sumi;
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -714,7 +715,7 @@ void ggml_vec_dot_q6_K_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs, c
|
|||||||
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
for (int l = 0; l < 8; ++l) aux32[l] += scale * aux16[l];
|
||||||
q8 += 8; a += 8;
|
q8 += 8; a += 8;
|
||||||
}
|
}
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
for (int l = 0; l < 8; ++l) sums[l] += d * aux32[l];
|
||||||
}
|
}
|
||||||
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
for (int l = 0; l < 8; ++l) sumf += sums[l];
|
||||||
@ -739,7 +740,7 @@ void ggml_vec_dot_iq2_xxs_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
int32_t bsum = 0;
|
int32_t bsum = 0;
|
||||||
@ -778,7 +779,7 @@ void ggml_vec_dot_iq2_xs_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
const uint16_t * GGML_RESTRICT q2 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT sc = x[i].scales;
|
const uint8_t * GGML_RESTRICT sc = x[i].scales;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -829,7 +830,7 @@ void ggml_vec_dot_iq2_s_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int i = 0; i < nb; i++) {
|
for (int i = 0; i < nb; i++) {
|
||||||
|
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const int8_t * q8 = y[i].qs;
|
const int8_t * q8 = y[i].qs;
|
||||||
const uint8_t * qs = x[i].qs;
|
const uint8_t * qs = x[i].qs;
|
||||||
const uint8_t * qh = x[i].qh;
|
const uint8_t * qh = x[i].qh;
|
||||||
@ -882,7 +883,7 @@ void ggml_vec_dot_iq3_xxs_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
const uint8_t * GGML_RESTRICT q3 = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
const uint8_t * GGML_RESTRICT gas = x[i].qs + QK_K/4;
|
||||||
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
const int8_t * GGML_RESTRICT q8 = y[i].qs;
|
||||||
@ -924,7 +925,7 @@ void ggml_vec_dot_iq3_s_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
|
|
||||||
float sumf = 0.f;
|
float sumf = 0.f;
|
||||||
for (int i = 0; i < nb; ++i) {
|
for (int i = 0; i < nb; ++i) {
|
||||||
const float d = GGML_FP16_TO_FP32(x[i].d) * y[i].d;
|
const float d = GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d;
|
||||||
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
const uint8_t * GGML_RESTRICT qs = x[i].qs;
|
||||||
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
const uint8_t * GGML_RESTRICT qh = x[i].qh;
|
||||||
const uint8_t * GGML_RESTRICT signs = x[i].signs;
|
const uint8_t * GGML_RESTRICT signs = x[i].signs;
|
||||||
@ -1002,7 +1003,7 @@ void ggml_vec_dot_iq1_s_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
qs += 4;
|
qs += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += GGML_FP16_TO_FP32(x[i].d) * y[i].d * (sumi + IQ1S_DELTA * sumi1);
|
sumf += GGML_CPU_FP16_TO_FP32(x[i].d) * y[i].d * (sumi + IQ1S_DELTA * sumi1);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -1063,7 +1064,7 @@ void ggml_vec_dot_iq1_m_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
qh += 2;
|
qh += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
sumf += GGML_FP16_TO_FP32(scale.f16) * y[i].d * (sumi1 + IQ1M_DELTA * sumi2);
|
sumf += GGML_CPU_FP16_TO_FP32(scale.f16) * y[i].d * (sumi1 + IQ1M_DELTA * sumi2);
|
||||||
}
|
}
|
||||||
|
|
||||||
*s = sumf;
|
*s = sumf;
|
||||||
@ -1087,7 +1088,7 @@ void ggml_vec_dot_iq4_nl_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
|
|
||||||
for (; ib < nb; ++ib) {
|
for (; ib < nb; ++ib) {
|
||||||
const float d = GGML_FP16_TO_FP32(y[ib].d)*GGML_FP16_TO_FP32(x[ib].d);
|
const float d = GGML_CPU_FP16_TO_FP32(y[ib].d)*GGML_CPU_FP16_TO_FP32(x[ib].d);
|
||||||
int sumi1 = 0, sumi2 = 0;
|
int sumi1 = 0, sumi2 = 0;
|
||||||
for (int j = 0; j < QK4_NL/2; ++j) {
|
for (int j = 0; j < QK4_NL/2; ++j) {
|
||||||
sumi1 += y[ib].qs[j+ 0] * kvalues_iq4nl[x[ib].qs[j] & 0xf];
|
sumi1 += y[ib].qs[j+ 0] * kvalues_iq4nl[x[ib].qs[j] & 0xf];
|
||||||
@ -1113,7 +1114,7 @@ void ggml_vec_dot_iq4_xs_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
|
|
||||||
float sumf = 0;
|
float sumf = 0;
|
||||||
for (int ibl = 0; ibl < nb; ++ibl) {
|
for (int ibl = 0; ibl < nb; ++ibl) {
|
||||||
const float d4d8 = GGML_FP16_TO_FP32(x[ibl].d) * y[ibl].d;
|
const float d4d8 = GGML_CPU_FP16_TO_FP32(x[ibl].d) * y[ibl].d;
|
||||||
uint16_t h = x[ibl].scales_h;
|
uint16_t h = x[ibl].scales_h;
|
||||||
const uint8_t * qs = x[ibl].qs;
|
const uint8_t * qs = x[ibl].qs;
|
||||||
const int8_t * q8 = y[ibl].qs;
|
const int8_t * q8 = y[ibl].qs;
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "ggml-impl.h"
|
#include "ggml-impl.h"
|
||||||
#include "ggml-cpu.h"
|
#include "ggml-cpu.h"
|
||||||
#include "ggml-cpu-impl.h"
|
#include "ggml-cpu-impl.h"
|
||||||
|
#include "simd-mappings.h"
|
||||||
#include "traits.h"
|
#include "traits.h"
|
||||||
|
|
||||||
#include "arch-fallback.h"
|
#include "arch-fallback.h"
|
||||||
@ -72,7 +73,7 @@ void ggml_quantize_mat_q8_0_4x4_generic(const float * GGML_RESTRICT x, void * GG
|
|||||||
const float d = amax / ((1 << 7) - 1);
|
const float d = amax / ((1 << 7) - 1);
|
||||||
id[row_iter] = d ? 1.0f / d : 0.0f;
|
id[row_iter] = d ? 1.0f / d : 0.0f;
|
||||||
|
|
||||||
y[i].d[row_iter] = GGML_FP32_TO_FP16(d);
|
y[i].d[row_iter] = GGML_CPU_FP32_TO_FP16(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int j = 0; j < QK8_0 * 4; j++) {
|
for (int j = 0; j < QK8_0 * 4; j++) {
|
||||||
@ -110,7 +111,7 @@ void ggml_quantize_mat_q8_0_4x8_generic(const float * GGML_RESTRICT x, void * GG
|
|||||||
const float d = amax / ((1 << 7) - 1);
|
const float d = amax / ((1 << 7) - 1);
|
||||||
id[row_iter] = d ? 1.0f / d : 0.0f;
|
id[row_iter] = d ? 1.0f / d : 0.0f;
|
||||||
|
|
||||||
y[i].d[row_iter] = GGML_FP32_TO_FP16(d);
|
y[i].d[row_iter] = GGML_CPU_FP32_TO_FP16(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int j = 0; j < QK8_0 * 4; j++) {
|
for (int j = 0; j < QK8_0 * 4; j++) {
|
||||||
@ -236,7 +237,7 @@ void ggml_gemv_q4_0_4x4_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
||||||
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d);
|
sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -280,7 +281,7 @@ void ggml_gemv_q4_0_4x8_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
||||||
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d);
|
sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -325,7 +326,7 @@ void ggml_gemv_q4_0_8x8_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
const int v1 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0xF0);
|
||||||
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d);
|
sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -396,13 +397,13 @@ void ggml_gemv_q4_K_8x8_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
sumi2 = sumi2 * scales_1[j];
|
sumi2 = sumi2 * scales_1[j];
|
||||||
sumi += sumi1 + sumi2;
|
sumi += sumi1 + sumi2;
|
||||||
}
|
}
|
||||||
sumf[j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * a_ptr[l].d;
|
sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * a_ptr[l].d;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int sb = 0; sb < 8; sb++) {
|
for (int sb = 0; sb < 8; sb++) {
|
||||||
uint8_t *mins = (uint8_t*) utmp + 8 + sb * 16;
|
uint8_t *mins = (uint8_t*) utmp + 8 + sb * 16;
|
||||||
for (int j = 0; j < ncols_interleaved; j++) {
|
for (int j = 0; j < ncols_interleaved; j++) {
|
||||||
sum_minf[j] += mins[j] * (a_ptr[l].bsums[sb * 2] + a_ptr[l].bsums[sb * 2 + 1]) * GGML_FP16_TO_FP32(b_ptr[l].dmin[j]) * a_ptr[l].d;
|
sum_minf[j] += mins[j] * (a_ptr[l].bsums[sb * 2] + a_ptr[l].bsums[sb * 2 + 1]) * GGML_CPU_FP16_TO_FP32(b_ptr[l].dmin[j]) * a_ptr[l].d;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -449,7 +450,7 @@ void ggml_gemv_iq4_nl_4x4_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs
|
|||||||
const int v1 = kvalues_iq4nl[b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] >> 4];
|
const int v1 = kvalues_iq4nl[b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] >> 4];
|
||||||
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2]));
|
sumi += ((v0 * a_ptr[l].qs[k * blocklen + i]) + (v1 * a_ptr[l].qs[k * blocklen + i + qk / 2]));
|
||||||
}
|
}
|
||||||
sumf[j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d);
|
sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -500,7 +501,7 @@ void ggml_gemm_q4_0_4x4_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
||||||
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[m][j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d[m]);
|
sumf[m][j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d[m]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -555,7 +556,7 @@ void ggml_gemm_q4_0_4x8_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
||||||
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[m][j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d[m]);
|
sumf[m][j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d[m]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -609,7 +610,7 @@ void ggml_gemm_q4_0_8x8_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
||||||
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4])) >> 4;
|
||||||
}
|
}
|
||||||
sumf[m][j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d[m]);
|
sumf[m][j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d[m]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -688,7 +689,7 @@ void ggml_gemm_q4_K_8x8_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
sumi2 = sumi2 * scales_1[j];
|
sumi2 = sumi2 * scales_1[j];
|
||||||
sumi += sumi1 + sumi2;
|
sumi += sumi1 + sumi2;
|
||||||
}
|
}
|
||||||
sumf[m][j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * a_ptr[l].d[m];
|
sumf[m][j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * a_ptr[l].d[m];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -697,7 +698,7 @@ void ggml_gemm_q4_K_8x8_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs,
|
|||||||
for(int m = 0; m < 4; m++) {
|
for(int m = 0; m < 4; m++) {
|
||||||
const int16_t *bsums = a_ptr[l].bsums + (sb * 8) + (m * 4) - ((sb % 2) * 6);
|
const int16_t *bsums = a_ptr[l].bsums + (sb * 8) + (m * 4) - ((sb % 2) * 6);
|
||||||
for(int j = 0; j < ncols_interleaved; j++) {
|
for(int j = 0; j < ncols_interleaved; j++) {
|
||||||
sum_minf[m][j] += mins[j] * (bsums[0] + bsums[1]) * GGML_FP16_TO_FP32(b_ptr[l].dmin[j]) * a_ptr[l].d[m];
|
sum_minf[m][j] += mins[j] * (bsums[0] + bsums[1]) * GGML_CPU_FP16_TO_FP32(b_ptr[l].dmin[j]) * a_ptr[l].d[m];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -753,7 +754,7 @@ void ggml_gemm_iq4_nl_4x4_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs
|
|||||||
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
sumi += ((v0 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i]) +
|
||||||
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4]));
|
(v1 * a_ptr[l].qs[k * 4 * blocklen + m * blocklen + i + qk / 2 * 4]));
|
||||||
}
|
}
|
||||||
sumf[m][j] += sumi * GGML_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_FP16_TO_FP32(a_ptr[l].d[m]);
|
sumf[m][j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d[m]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,10 +2,167 @@
|
|||||||
|
|
||||||
#include "ggml-cpu-impl.h"
|
#include "ggml-cpu-impl.h"
|
||||||
|
|
||||||
|
#ifdef __ARM_FEATURE_SVE
|
||||||
|
#include <arm_sve.h>
|
||||||
|
#endif // __ARM_FEATURE_SVE
|
||||||
|
|
||||||
|
#if defined(__ARM_NEON) && !defined(__CUDACC__) && !defined(__MUSACC__)
|
||||||
|
// if YCM cannot find <arm_neon.h>, make a symbolic link to it, for example:
|
||||||
|
//
|
||||||
|
// $ ln -sfn /Library/Developer/CommandLineTools/usr/lib/clang/13.1.6/include/arm_neon.h ./src/
|
||||||
|
//
|
||||||
|
#include <arm_neon.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__F16C__)
|
||||||
|
#include <immintrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// simd mappings
|
// simd mappings
|
||||||
//
|
//
|
||||||
|
|
||||||
|
// FP16 to FP32 conversion
|
||||||
|
|
||||||
|
// 16-bit float
|
||||||
|
// on Arm, we use __fp16
|
||||||
|
// on x86, we use uint16_t
|
||||||
|
//
|
||||||
|
// for old CUDA compilers (<= 11), we use uint16_t: ref https://github.com/ggml-org/llama.cpp/pull/10616
|
||||||
|
// for MUSA compilers , we use uint16_t: ref https://github.com/ggml-org/llama.cpp/pull/11843
|
||||||
|
//
|
||||||
|
#if defined(__ARM_NEON) && !(defined(__CUDACC__) && __CUDACC_VER_MAJOR__ <= 11) && !defined(__MUSACC__)
|
||||||
|
#define GGML_CPU_COMPUTE_FP16_TO_FP32(x) neon_compute_fp16_to_fp32(x)
|
||||||
|
#define GGML_CPU_COMPUTE_FP32_TO_FP16(x) neon_compute_fp32_to_fp16(x)
|
||||||
|
|
||||||
|
#define GGML_CPU_FP16_TO_FP32(x) GGML_CPU_COMPUTE_FP16_TO_FP32(x)
|
||||||
|
|
||||||
|
static inline float neon_compute_fp16_to_fp32(ggml_fp16_t h) {
|
||||||
|
__fp16 tmp;
|
||||||
|
memcpy(&tmp, &h, sizeof(ggml_fp16_t));
|
||||||
|
return (float)tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline ggml_fp16_t neon_compute_fp32_to_fp16(float f) {
|
||||||
|
ggml_fp16_t res;
|
||||||
|
__fp16 tmp = f;
|
||||||
|
memcpy(&res, &tmp, sizeof(ggml_fp16_t));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#elif defined(__F16C__)
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define GGML_CPU_COMPUTE_FP16_TO_FP32(x) _mm_cvtss_f32(_mm_cvtph_ps(_mm_cvtsi32_si128(x)))
|
||||||
|
#define GGML_CPU_COMPUTE_FP32_TO_FP16(x) _mm_extract_epi16(_mm_cvtps_ph(_mm_set_ss(x), 0), 0)
|
||||||
|
#else
|
||||||
|
#define GGML_CPU_COMPUTE_FP16_TO_FP32(x) _cvtsh_ss(x)
|
||||||
|
#define GGML_CPU_COMPUTE_FP32_TO_FP16(x) _cvtss_sh(x, 0)
|
||||||
|
#endif
|
||||||
|
#elif defined(__POWER9_VECTOR__)
|
||||||
|
#define GGML_CPU_COMPUTE_FP16_TO_FP32(x) power_compute_fp16_to_fp32(x)
|
||||||
|
#define GGML_CPU_COMPUTE_FP32_TO_FP16(x) power_compute_fp32_to_fp16(x)
|
||||||
|
/* the inline asm below is about 12% faster than the lookup method */
|
||||||
|
#define GGML_CPU_FP16_TO_FP32(x) GGML_CPU_COMPUTE_FP16_TO_FP32(x)
|
||||||
|
#define GGML_CPU_FP32_TO_FP16(x) GGML_CPU_COMPUTE_FP32_TO_FP16(x)
|
||||||
|
|
||||||
|
static inline float power_compute_fp16_to_fp32(ggml_fp16_t h) {
|
||||||
|
float f;
|
||||||
|
double d;
|
||||||
|
__asm__(
|
||||||
|
"mtfprd %0,%2\n"
|
||||||
|
"xscvhpdp %0,%0\n"
|
||||||
|
"frsp %1,%0\n" :
|
||||||
|
/* temp */ "=d"(d),
|
||||||
|
/* out */ "=f"(f):
|
||||||
|
/* in */ "r"(h));
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline ggml_fp16_t power_compute_fp32_to_fp16(float f) {
|
||||||
|
double d;
|
||||||
|
ggml_fp16_t r;
|
||||||
|
__asm__( /* xscvdphp can work on double or single precision */
|
||||||
|
"xscvdphp %0,%2\n"
|
||||||
|
"mffprd %1,%0\n" :
|
||||||
|
/* temp */ "=d"(d),
|
||||||
|
/* out */ "=r"(r):
|
||||||
|
/* in */ "f"(f));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
#elif defined(__riscv) && defined(__riscv_zfhmin)
|
||||||
|
static inline float riscv_compute_fp16_to_fp32(ggml_fp16_t h) {
|
||||||
|
float f;
|
||||||
|
__asm__(
|
||||||
|
"fmv.h.x %[f], %[h]\n\t"
|
||||||
|
"fcvt.s.h %[f], %[f]"
|
||||||
|
: [f] "=&f" (f)
|
||||||
|
: [h] "r" (h)
|
||||||
|
);
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline ggml_fp16_t riscv_compute_fp32_to_fp16(float f) {
|
||||||
|
ggml_fp16_t res;
|
||||||
|
__asm__(
|
||||||
|
"fcvt.h.s %[f], %[f]\n\t"
|
||||||
|
"fmv.x.h %[h], %[f]"
|
||||||
|
: [h] "=&r" (res)
|
||||||
|
: [f] "f" (f)
|
||||||
|
);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GGML_CPU_COMPUTE_FP16_TO_FP32(x) riscv_compute_fp16_to_fp32(x)
|
||||||
|
#define GGML_CPU_COMPUTE_FP32_TO_FP16(x) riscv_compute_fp32_to_fp16(x)
|
||||||
|
#define GGML_CPU_FP16_TO_FP32(x) GGML_CPU_COMPUTE_FP16_TO_FP32(x)
|
||||||
|
#define GGML_CPU_FP32_TO_FP16(x) GGML_CPU_COMPUTE_FP32_TO_FP16(x)
|
||||||
|
#elif defined(__NNPA__)
|
||||||
|
#define GGML_CPU_COMPUTE_FP16_TO_FP32(x) nnpa_compute_fp16_to_fp32(x)
|
||||||
|
#define GGML_CPU_COMPUTE_FP32_TO_FP16(x) nnpa_compute_fp32_to_fp16(x)
|
||||||
|
|
||||||
|
#define GGML_CPU_FP16_TO_FP32(x) GGML_CPU_COMPUTE_FP16_TO_FP32(x)
|
||||||
|
#define GGML_CPU_FP32_TO_FP16(x) GGML_CPU_COMPUTE_FP32_TO_FP16(x)
|
||||||
|
|
||||||
|
static inline float nnpa_compute_fp16_to_fp32(ggml_fp16_t h) {
|
||||||
|
uint16x8_t v_h = vec_splats(h);
|
||||||
|
uint16x8_t v_hd = vec_convert_from_fp16(v_h, 0);
|
||||||
|
return vec_extend_to_fp32_hi(v_hd, 0)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline ggml_fp16_t nnpa_compute_fp32_to_fp16(float f) {
|
||||||
|
float32x4_t v_f = vec_splats(f);
|
||||||
|
float32x4_t v_zero = vec_splats(0.0f);
|
||||||
|
uint16x8_t v_hd = vec_round_from_fp32(v_f, v_zero, 0);
|
||||||
|
uint16x8_t v_h = vec_convert_to_fp16(v_hd, 0);
|
||||||
|
return vec_extract(v_h, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// precomputed f32 table for f16 (256 KB)
|
||||||
|
// defined in ggml-cpu.c, initialized in ggml_cpu_init()
|
||||||
|
extern float ggml_table_f32_f16[1 << 16];
|
||||||
|
|
||||||
|
// On ARM NEON, it's quicker to directly convert x -> x instead of calling into ggml_lookup_fp16_to_fp32,
|
||||||
|
// so we define GGML_CPU_FP16_TO_FP32 and GGML_CPU_FP32_TO_FP16 elsewhere for NEON.
|
||||||
|
// This is also true for POWER9.
|
||||||
|
#if !defined(GGML_CPU_FP16_TO_FP32)
|
||||||
|
inline static float ggml_lookup_fp16_to_fp32(ggml_fp16_t f) {
|
||||||
|
uint16_t s;
|
||||||
|
memcpy(&s, &f, sizeof(uint16_t));
|
||||||
|
return ggml_table_f32_f16[s];
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GGML_CPU_FP16_TO_FP32(x) ggml_lookup_fp16_to_fp32(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(GGML_CPU_FP32_TO_FP16)
|
||||||
|
#define GGML_CPU_FP32_TO_FP16(x) GGML_COMPUTE_FP32_TO_FP16(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// we define a common set of C macros which map to specific intrinsics based on the current architecture
|
// we define a common set of C macros which map to specific intrinsics based on the current architecture
|
||||||
// we then implement the fundamental computation operations below using only these macros
|
// we then implement the fundamental computation operations below using only these macros
|
||||||
// adding support for new architectures requires to define the corresponding SIMD macros
|
// adding support for new architectures requires to define the corresponding SIMD macros
|
||||||
@ -415,7 +572,7 @@ static inline __m256 __avx_f32cx8_load(const ggml_fp16_t * x) {
|
|||||||
float tmp[8];
|
float tmp[8];
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
tmp[i] = GGML_FP16_TO_FP32(x[i]);
|
tmp[i] = GGML_CPU_FP16_TO_FP32(x[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return _mm256_loadu_ps(tmp);
|
return _mm256_loadu_ps(tmp);
|
||||||
@ -426,7 +583,7 @@ static inline void __avx_f32cx8_store(ggml_fp16_t *x, __m256 y) {
|
|||||||
_mm256_storeu_ps(arr, y);
|
_mm256_storeu_ps(arr, y);
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
x[i] = GGML_FP32_TO_FP16(arr[i]);
|
x[i] = GGML_CPU_FP32_TO_FP16(arr[i]);
|
||||||
}
|
}
|
||||||
#define GGML_F32Cx8_LOAD(x) __avx_f32cx8_load(x)
|
#define GGML_F32Cx8_LOAD(x) __avx_f32cx8_load(x)
|
||||||
#define GGML_F32Cx8_STORE(x, y) __avx_f32cx8_store(x, y)
|
#define GGML_F32Cx8_STORE(x, y) __avx_f32cx8_store(x, y)
|
||||||
@ -574,10 +731,10 @@ static inline unsigned char ggml_endian_byte(int i) {
|
|||||||
inline static v128_t __wasm_f16x4_load(const ggml_fp16_t * p) {
|
inline static v128_t __wasm_f16x4_load(const ggml_fp16_t * p) {
|
||||||
float tmp[4];
|
float tmp[4];
|
||||||
|
|
||||||
tmp[0] = GGML_FP16_TO_FP32(p[0]);
|
tmp[0] = GGML_CPU_FP16_TO_FP32(p[0]);
|
||||||
tmp[1] = GGML_FP16_TO_FP32(p[1]);
|
tmp[1] = GGML_CPU_FP16_TO_FP32(p[1]);
|
||||||
tmp[2] = GGML_FP16_TO_FP32(p[2]);
|
tmp[2] = GGML_CPU_FP16_TO_FP32(p[2]);
|
||||||
tmp[3] = GGML_FP16_TO_FP32(p[3]);
|
tmp[3] = GGML_CPU_FP16_TO_FP32(p[3]);
|
||||||
|
|
||||||
return wasm_v128_load(tmp);
|
return wasm_v128_load(tmp);
|
||||||
}
|
}
|
||||||
@ -587,10 +744,10 @@ inline static void __wasm_f16x4_store(ggml_fp16_t * p, v128_t x) {
|
|||||||
|
|
||||||
wasm_v128_store(tmp, x);
|
wasm_v128_store(tmp, x);
|
||||||
|
|
||||||
p[0] = GGML_FP32_TO_FP16(tmp[0]);
|
p[0] = GGML_CPU_FP32_TO_FP16(tmp[0]);
|
||||||
p[1] = GGML_FP32_TO_FP16(tmp[1]);
|
p[1] = GGML_CPU_FP32_TO_FP16(tmp[1]);
|
||||||
p[2] = GGML_FP32_TO_FP16(tmp[2]);
|
p[2] = GGML_CPU_FP32_TO_FP16(tmp[2]);
|
||||||
p[3] = GGML_FP32_TO_FP16(tmp[3]);
|
p[3] = GGML_CPU_FP32_TO_FP16(tmp[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GGML_F16x4 v128_t
|
#define GGML_F16x4 v128_t
|
||||||
@ -690,10 +847,10 @@ inline static void __wasm_f16x4_store(ggml_fp16_t * p, v128_t x) {
|
|||||||
static inline __m128 __sse_f16x4_load(const ggml_fp16_t * x) {
|
static inline __m128 __sse_f16x4_load(const ggml_fp16_t * x) {
|
||||||
float tmp[4];
|
float tmp[4];
|
||||||
|
|
||||||
tmp[0] = GGML_FP16_TO_FP32(x[0]);
|
tmp[0] = GGML_CPU_FP16_TO_FP32(x[0]);
|
||||||
tmp[1] = GGML_FP16_TO_FP32(x[1]);
|
tmp[1] = GGML_CPU_FP16_TO_FP32(x[1]);
|
||||||
tmp[2] = GGML_FP16_TO_FP32(x[2]);
|
tmp[2] = GGML_CPU_FP16_TO_FP32(x[2]);
|
||||||
tmp[3] = GGML_FP16_TO_FP32(x[3]);
|
tmp[3] = GGML_CPU_FP16_TO_FP32(x[3]);
|
||||||
|
|
||||||
return _mm_loadu_ps(tmp);
|
return _mm_loadu_ps(tmp);
|
||||||
}
|
}
|
||||||
@ -703,10 +860,10 @@ static inline void __sse_f16x4_store(ggml_fp16_t * x, __m128 y) {
|
|||||||
|
|
||||||
_mm_storeu_ps(arr, y);
|
_mm_storeu_ps(arr, y);
|
||||||
|
|
||||||
x[0] = GGML_FP32_TO_FP16(arr[0]);
|
x[0] = GGML_CPU_FP32_TO_FP16(arr[0]);
|
||||||
x[1] = GGML_FP32_TO_FP16(arr[1]);
|
x[1] = GGML_CPU_FP32_TO_FP16(arr[1]);
|
||||||
x[2] = GGML_FP32_TO_FP16(arr[2]);
|
x[2] = GGML_CPU_FP32_TO_FP16(arr[2]);
|
||||||
x[3] = GGML_FP32_TO_FP16(arr[3]);
|
x[3] = GGML_CPU_FP32_TO_FP16(arr[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GGML_F32Cx4 __m128
|
#define GGML_F32Cx4 __m128
|
||||||
@ -828,7 +985,7 @@ static inline void __lasx_f32cx8_store(ggml_fp16_t * x, __m256 y) {
|
|||||||
#define GGML_F32x4_ZERO __lsx_vldi(0)
|
#define GGML_F32x4_ZERO __lsx_vldi(0)
|
||||||
#define GGML_F32x4_SET1(x) __lsx_vinsgr2vr_w(__lsx_vldi(0),(x), 0)
|
#define GGML_F32x4_SET1(x) __lsx_vinsgr2vr_w(__lsx_vldi(0),(x), 0)
|
||||||
#define GGML_F32x4_LOAD(x) __lsx_vld((x), 0)
|
#define GGML_F32x4_LOAD(x) __lsx_vld((x), 0)
|
||||||
#define GGML_F32x4_STORE((x),(y)) __lsx_vst((y), (x), 0)
|
#define GGML_F32x4_STORE(x, y) __lsx_vst(y, x, 0)
|
||||||
#define GGML_F32x4_FMA(a, b, c) __lsx_vfmadd_s(b, c, a)
|
#define GGML_F32x4_FMA(a, b, c) __lsx_vfmadd_s(b, c, a)
|
||||||
#define GGML_F32x4_ADD __lsx_vfadd_s
|
#define GGML_F32x4_ADD __lsx_vfadd_s
|
||||||
#define GGML_F32x4_MUL __lsx_vfmul_s
|
#define GGML_F32x4_MUL __lsx_vfmul_s
|
||||||
@ -874,10 +1031,10 @@ static inline void __lasx_f32cx8_store(ggml_fp16_t * x, __m256 y) {
|
|||||||
static inline __m128 __lsx_f16x4_load(const ggml_fp16_t * x) {
|
static inline __m128 __lsx_f16x4_load(const ggml_fp16_t * x) {
|
||||||
float tmp[4];
|
float tmp[4];
|
||||||
|
|
||||||
tmp[0] = GGML_FP16_TO_FP32(x[0]);
|
tmp[0] = GGML_CPU_FP16_TO_FP32(x[0]);
|
||||||
tmp[1] = GGML_FP16_TO_FP32(x[1]);
|
tmp[1] = GGML_CPU_FP16_TO_FP32(x[1]);
|
||||||
tmp[2] = GGML_FP16_TO_FP32(x[2]);
|
tmp[2] = GGML_CPU_FP16_TO_FP32(x[2]);
|
||||||
tmp[3] = GGML_FP16_TO_FP32(x[3]);
|
tmp[3] = GGML_CPU_FP16_TO_FP32(x[3]);
|
||||||
|
|
||||||
return __lsx_vld(tmp, 0);
|
return __lsx_vld(tmp, 0);
|
||||||
}
|
}
|
||||||
@ -887,10 +1044,10 @@ static inline void __lsx_f16x4_store(ggml_fp16_t * x, __m128 y) {
|
|||||||
|
|
||||||
__lsx_vst(y, arr, 0);
|
__lsx_vst(y, arr, 0);
|
||||||
|
|
||||||
x[0] = GGML_FP32_TO_FP16(arr[0]);
|
x[0] = GGML_CPU_FP32_TO_FP16(arr[0]);
|
||||||
x[1] = GGML_FP32_TO_FP16(arr[1]);
|
x[1] = GGML_CPU_FP32_TO_FP16(arr[1]);
|
||||||
x[2] = GGML_FP32_TO_FP16(arr[2]);
|
x[2] = GGML_CPU_FP32_TO_FP16(arr[2]);
|
||||||
x[3] = GGML_FP32_TO_FP16(arr[3]);
|
x[3] = GGML_CPU_FP32_TO_FP16(arr[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GGML_F32Cx4 __m128
|
#define GGML_F32Cx4 __m128
|
||||||
@ -922,7 +1079,7 @@ static inline void __lsx_f16x4_store(ggml_fp16_t * x, __m128 y) {
|
|||||||
#define GGML_F32_STEP 32
|
#define GGML_F32_STEP 32
|
||||||
#define GGML_F32_EPR 4
|
#define GGML_F32_EPR 4
|
||||||
|
|
||||||
#define GGML_F32x4 __vector float
|
#define GGML_F32x4 float32x4_t
|
||||||
#define GGML_F32x4_ZERO vec_splats(0.0f)
|
#define GGML_F32x4_ZERO vec_splats(0.0f)
|
||||||
#define GGML_F32x4_SET1 vec_splats
|
#define GGML_F32x4_SET1 vec_splats
|
||||||
#define GGML_F32x4_LOAD(p) vec_xl(0, p)
|
#define GGML_F32x4_LOAD(p) vec_xl(0, p)
|
||||||
@ -962,28 +1119,45 @@ static inline void __lsx_f16x4_store(ggml_fp16_t * x, __m128 y) {
|
|||||||
#define GGML_F16_STEP GGML_F32_STEP
|
#define GGML_F16_STEP GGML_F32_STEP
|
||||||
#define GGML_F16_EPR GGML_F32_EPR
|
#define GGML_F16_EPR GGML_F32_EPR
|
||||||
|
|
||||||
static inline __vector float __lzs_f16cx4_load(const ggml_fp16_t * x) {
|
static inline float32x4_t __lzs_f16cx4_load(const ggml_fp16_t * x) {
|
||||||
|
#if defined(__NNPA__)
|
||||||
|
uint16x8_t v_x = vec_xl(0, (const ggml_fp16_t *)x);
|
||||||
|
uint16x8_t v_xd = vec_convert_from_fp16(v_x, 0);
|
||||||
|
return vec_extend_to_fp32_hi(v_xd, 0);
|
||||||
|
#else
|
||||||
float tmp[4];
|
float tmp[4];
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
tmp[i] = GGML_FP16_TO_FP32(x[i]);
|
tmp[i] = GGML_CPU_FP16_TO_FP32(x[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// note: keep type-cast here to prevent compiler bugs
|
// note: keep type-cast here to prevent compiler bugs
|
||||||
// see: https://github.com/ggml-org/llama.cpp/issues/12846
|
// see: https://github.com/ggml-org/llama.cpp/issues/12846
|
||||||
return vec_xl(0, (const float *)(tmp));
|
return vec_xl(0, (const float *)(tmp));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __lzs_f16cx4_store(ggml_fp16_t * x, __vector float y) {
|
static inline void __lzs_f16cx4_store(ggml_fp16_t * x, float32x4_t v_y) {
|
||||||
|
#if defined(__NNPA__)
|
||||||
|
float32x4_t v_zero = vec_splats(0.0f);
|
||||||
|
uint16x8_t v_xd = vec_round_from_fp32(v_y, v_zero, 0);
|
||||||
|
uint16x8_t v_x = vec_convert_to_fp16(v_xd, 0);
|
||||||
|
|
||||||
|
x[0] = vec_extract(v_x, 0);
|
||||||
|
x[1] = vec_extract(v_x, 1);
|
||||||
|
x[2] = vec_extract(v_x, 2);
|
||||||
|
x[3] = vec_extract(v_x, 3);
|
||||||
|
#else
|
||||||
float arr[4];
|
float arr[4];
|
||||||
|
|
||||||
// note: keep type-cast here to prevent compiler bugs
|
// note: keep type-cast here to prevent compiler bugs
|
||||||
// see: https://github.com/ggml-org/llama.cpp/issues/12846
|
// see: https://github.com/ggml-org/llama.cpp/issues/12846
|
||||||
vec_xst(y, 0, (float *)(arr));
|
vec_xst(v_y, 0, (float *)(arr));
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
x[i] = GGML_FP32_TO_FP16(arr[i]);
|
x[i] = GGML_CPU_FP32_TO_FP16(arr[i]);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GGML_F16_VEC GGML_F32x4
|
#define GGML_F16_VEC GGML_F32x4
|
||||||
@ -1004,3 +1178,7 @@ static inline void __lzs_f16cx4_store(ggml_fp16_t * x, __vector float y) {
|
|||||||
#define GGML_F32_ARR (GGML_F32_STEP/GGML_F32_EPR)
|
#define GGML_F32_ARR (GGML_F32_STEP/GGML_F32_EPR)
|
||||||
#define GGML_F16_ARR (GGML_F16_STEP/GGML_F16_EPR)
|
#define GGML_F16_ARR (GGML_F16_STEP/GGML_F16_EPR)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@ -219,11 +219,11 @@ void ggml_vec_dot_f16(int n, float * GGML_RESTRICT s, size_t bs, ggml_fp16_t * G
|
|||||||
|
|
||||||
// leftovers
|
// leftovers
|
||||||
for (int i = np; i < n; ++i) {
|
for (int i = np; i < n; ++i) {
|
||||||
sumf += (ggml_float)(GGML_FP16_TO_FP32(x[i])*GGML_FP16_TO_FP32(y[i]));
|
sumf += (ggml_float)(GGML_CPU_FP16_TO_FP32(x[i])*GGML_CPU_FP16_TO_FP32(y[i]));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
sumf += (ggml_float)(GGML_FP16_TO_FP32(x[i])*GGML_FP16_TO_FP32(y[i]));
|
sumf += (ggml_float)(GGML_CPU_FP16_TO_FP32(x[i])*GGML_CPU_FP16_TO_FP32(y[i]));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ inline static void ggml_vec_set_bf16(const int n, ggml_bf16_t * x, const ggml_bf
|
|||||||
inline static void ggml_vec_add_f32 (const int n, float * z, const float * x, const float * y) { for (int i = 0; i < n; ++i) z[i] = x[i] + y[i]; }
|
inline static void ggml_vec_add_f32 (const int n, float * z, const float * x, const float * y) { for (int i = 0; i < n; ++i) z[i] = x[i] + y[i]; }
|
||||||
inline static void ggml_vec_add_f16 (const int n, ggml_fp16_t * z, const ggml_fp16_t * x, const ggml_fp16_t * y) {
|
inline static void ggml_vec_add_f16 (const int n, ggml_fp16_t * z, const ggml_fp16_t * x, const ggml_fp16_t * y) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
z[i] = GGML_FP32_TO_FP16(GGML_FP16_TO_FP32(x[i]) + GGML_FP16_TO_FP32(y[i]));
|
z[i] = GGML_CPU_FP32_TO_FP16(GGML_CPU_FP16_TO_FP32(x[i]) + GGML_CPU_FP16_TO_FP32(y[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_add1_f32(const int n, float * z, const float * x, const float v) { for (int i = 0; i < n; ++i) z[i] = x[i] + v; }
|
inline static void ggml_vec_add1_f32(const int n, float * z, const float * x, const float v) { for (int i = 0; i < n; ++i) z[i] = x[i] + v; }
|
||||||
@ -67,7 +67,7 @@ inline static void ggml_vec_acc1_f32(const int n, float * y, const float v)
|
|||||||
inline static void ggml_vec_sub_f32 (const int n, float * z, const float * x, const float * y) { for (int i = 0; i < n; ++i) z[i] = x[i] - y[i]; }
|
inline static void ggml_vec_sub_f32 (const int n, float * z, const float * x, const float * y) { for (int i = 0; i < n; ++i) z[i] = x[i] - y[i]; }
|
||||||
inline static void ggml_vec_sub_f16 (const int n, ggml_fp16_t * z, const ggml_fp16_t * x, const ggml_fp16_t * y) {
|
inline static void ggml_vec_sub_f16 (const int n, ggml_fp16_t * z, const ggml_fp16_t * x, const ggml_fp16_t * y) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
z[i] = GGML_FP32_TO_FP16(GGML_FP16_TO_FP32(x[i]) - GGML_FP16_TO_FP32(y[i]));
|
z[i] = GGML_CPU_FP32_TO_FP16(GGML_CPU_FP16_TO_FP32(x[i]) - GGML_CPU_FP16_TO_FP32(y[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_set_f32 (const int n, float * x, const float v) { for (int i = 0; i < n; ++i) x[i] = v; }
|
inline static void ggml_vec_set_f32 (const int n, float * x, const float v) { for (int i = 0; i < n; ++i) x[i] = v; }
|
||||||
@ -75,20 +75,20 @@ inline static void ggml_vec_cpy_f32 (const int n, float * y, const float * x)
|
|||||||
inline static void ggml_vec_neg_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = -x[i]; }
|
inline static void ggml_vec_neg_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = -x[i]; }
|
||||||
inline static void ggml_vec_neg_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_neg_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(-GGML_FP16_TO_FP32(x[i]));
|
y[i] = GGML_CPU_FP32_TO_FP16(-GGML_CPU_FP16_TO_FP32(x[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline static void ggml_vec_mul_f32 (const int n, float * z, const float * x, const float * y) { for (int i = 0; i < n; ++i) z[i] = x[i]*y[i]; }
|
inline static void ggml_vec_mul_f32 (const int n, float * z, const float * x, const float * y) { for (int i = 0; i < n; ++i) z[i] = x[i]*y[i]; }
|
||||||
inline static void ggml_vec_mul_f16 (const int n, ggml_fp16_t * z, const ggml_fp16_t * x, const ggml_fp16_t * y) {
|
inline static void ggml_vec_mul_f16 (const int n, ggml_fp16_t * z, const ggml_fp16_t * x, const ggml_fp16_t * y) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
z[i] = GGML_FP32_TO_FP16(GGML_FP16_TO_FP32(x[i]) * GGML_FP16_TO_FP32(y[i]));
|
z[i] = GGML_CPU_FP32_TO_FP16(GGML_CPU_FP16_TO_FP32(x[i]) * GGML_CPU_FP16_TO_FP32(y[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_div_f32 (const int n, float * z, const float * x, const float * y) { for (int i = 0; i < n; ++i) z[i] = x[i]/y[i]; }
|
inline static void ggml_vec_div_f32 (const int n, float * z, const float * x, const float * y) { for (int i = 0; i < n; ++i) z[i] = x[i]/y[i]; }
|
||||||
inline static void ggml_vec_div_f16 (const int n, ggml_fp16_t * z, const ggml_fp16_t * x, const ggml_fp16_t * y) {
|
inline static void ggml_vec_div_f16 (const int n, ggml_fp16_t * z, const ggml_fp16_t * x, const ggml_fp16_t * y) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
z[i] = GGML_FP32_TO_FP16(GGML_FP16_TO_FP32(x[i]) / GGML_FP16_TO_FP32(y[i]));
|
z[i] = GGML_CPU_FP32_TO_FP16(GGML_CPU_FP16_TO_FP32(x[i]) / GGML_CPU_FP16_TO_FP32(y[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,13 +131,13 @@ inline static void ggml_vec_dot_f16_unroll(const int n, const int xs, float * GG
|
|||||||
// leftovers
|
// leftovers
|
||||||
for (int i = np; i < n; ++i) {
|
for (int i = np; i < n; ++i) {
|
||||||
for (int j = 0; j < GGML_VEC_DOT_UNROLL; ++j) {
|
for (int j = 0; j < GGML_VEC_DOT_UNROLL; ++j) {
|
||||||
sumf[j] += (ggml_float)(GGML_FP16_TO_FP32(x[j][i])*GGML_FP16_TO_FP32(y[i]));
|
sumf[j] += (ggml_float)(GGML_CPU_FP16_TO_FP32(x[j][i])*GGML_CPU_FP16_TO_FP32(y[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
for (int j = 0; j < GGML_VEC_DOT_UNROLL; ++j) {
|
for (int j = 0; j < GGML_VEC_DOT_UNROLL; ++j) {
|
||||||
sumf[j] += (ggml_float)(GGML_FP16_TO_FP32(x[j][i])*GGML_FP16_TO_FP32(y[i]));
|
sumf[j] += (ggml_float)(GGML_CPU_FP16_TO_FP32(x[j][i])*GGML_CPU_FP16_TO_FP32(y[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -280,12 +280,12 @@ inline static void ggml_vec_mad_f16(const int n, ggml_fp16_t * GGML_RESTRICT y,
|
|||||||
|
|
||||||
// leftovers
|
// leftovers
|
||||||
for (int i = np; i < n; ++i) {
|
for (int i = np; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(GGML_FP16_TO_FP32(y[i]) + GGML_FP16_TO_FP32(x[i])*v);
|
y[i] = GGML_CPU_FP32_TO_FP16(GGML_CPU_FP16_TO_FP32(y[i]) + GGML_CPU_FP16_TO_FP32(x[i])*v);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
// scalar
|
// scalar
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(GGML_FP16_TO_FP32(y[i]) + GGML_FP16_TO_FP32(x[i])*v);
|
y[i] = GGML_CPU_FP32_TO_FP16(GGML_CPU_FP16_TO_FP32(y[i]) + GGML_CPU_FP16_TO_FP32(x[i])*v);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -430,12 +430,12 @@ inline static void ggml_vec_scale_f16(const int n, ggml_fp16_t * y, const float
|
|||||||
|
|
||||||
// leftovers
|
// leftovers
|
||||||
for (int i = np; i < n; ++i) {
|
for (int i = np; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(GGML_FP16_TO_FP32(y[i])*v);
|
y[i] = GGML_CPU_FP32_TO_FP16(GGML_CPU_FP16_TO_FP32(y[i])*v);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
// scalar
|
// scalar
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(GGML_FP16_TO_FP32(y[i])*v);
|
y[i] = GGML_CPU_FP32_TO_FP16(GGML_CPU_FP16_TO_FP32(y[i])*v);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -444,103 +444,103 @@ inline static void ggml_vec_norm_f32 (const int n, float * s, const float * x) {
|
|||||||
inline static void ggml_vec_sqr_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = x[i]*x[i]; }
|
inline static void ggml_vec_sqr_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = x[i]*x[i]; }
|
||||||
inline static void ggml_vec_sqr_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_sqr_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
float v = GGML_FP16_TO_FP32(x[i]);
|
float v = GGML_CPU_FP16_TO_FP32(x[i]);
|
||||||
y[i] = GGML_FP32_TO_FP16(v*v);
|
y[i] = GGML_CPU_FP32_TO_FP16(v*v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_sqrt_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = sqrtf(x[i]); }
|
inline static void ggml_vec_sqrt_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = sqrtf(x[i]); }
|
||||||
inline static void ggml_vec_sqrt_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_sqrt_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(sqrtf(GGML_FP16_TO_FP32(x[i])));
|
y[i] = GGML_CPU_FP32_TO_FP16(sqrtf(GGML_CPU_FP16_TO_FP32(x[i])));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_log_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = logf(x[i]); }
|
inline static void ggml_vec_log_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = logf(x[i]); }
|
||||||
inline static void ggml_vec_log_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_log_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(logf(GGML_FP16_TO_FP32(x[i])));
|
y[i] = GGML_CPU_FP32_TO_FP16(logf(GGML_CPU_FP16_TO_FP32(x[i])));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_sin_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = sinf(x[i]); }
|
inline static void ggml_vec_sin_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = sinf(x[i]); }
|
||||||
inline static void ggml_vec_sin_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_sin_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(sinf(GGML_FP16_TO_FP32(x[i])));
|
y[i] = GGML_CPU_FP32_TO_FP16(sinf(GGML_CPU_FP16_TO_FP32(x[i])));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_cos_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = cosf(x[i]); }
|
inline static void ggml_vec_cos_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = cosf(x[i]); }
|
||||||
inline static void ggml_vec_cos_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_cos_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(cosf(GGML_FP16_TO_FP32(x[i])));
|
y[i] = GGML_CPU_FP32_TO_FP16(cosf(GGML_CPU_FP16_TO_FP32(x[i])));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_abs_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = fabsf(x[i]); }
|
inline static void ggml_vec_abs_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = fabsf(x[i]); }
|
||||||
inline static void ggml_vec_abs_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_abs_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(fabsf(GGML_FP16_TO_FP32(x[i])));
|
y[i] = GGML_CPU_FP32_TO_FP16(fabsf(GGML_CPU_FP16_TO_FP32(x[i])));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_sgn_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = (x[i] > 0.f) ? 1.f : ((x[i] < 0.f) ? -1.f : 0.f); }
|
inline static void ggml_vec_sgn_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = (x[i] > 0.f) ? 1.f : ((x[i] < 0.f) ? -1.f : 0.f); }
|
||||||
inline static void ggml_vec_sgn_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_sgn_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
float v = GGML_FP16_TO_FP32(x[i]);
|
float v = GGML_CPU_FP16_TO_FP32(x[i]);
|
||||||
y[i] = GGML_FP32_TO_FP16((v > 0.f) ? 1.f : ((v < 0.f) ? -1.f : 0.f));
|
y[i] = GGML_CPU_FP32_TO_FP16((v > 0.f) ? 1.f : ((v < 0.f) ? -1.f : 0.f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_step_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = (x[i] > 0.f) ? 1.f : 0.f; }
|
inline static void ggml_vec_step_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = (x[i] > 0.f) ? 1.f : 0.f; }
|
||||||
inline static void ggml_vec_step_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_step_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16((GGML_FP16_TO_FP32(x[i]) > 0.f) ? 1.f : 0.f);
|
y[i] = GGML_CPU_FP32_TO_FP16((GGML_CPU_FP16_TO_FP32(x[i]) > 0.f) ? 1.f : 0.f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_tanh_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = tanhf(x[i]); }
|
inline static void ggml_vec_tanh_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = tanhf(x[i]); }
|
||||||
inline static void ggml_vec_tanh_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_tanh_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(tanhf(GGML_FP16_TO_FP32(x[i])));
|
y[i] = GGML_CPU_FP32_TO_FP16(tanhf(GGML_CPU_FP16_TO_FP32(x[i])));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_elu_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = (x[i] > 0.f) ? x[i] : expm1f(x[i]); }
|
inline static void ggml_vec_elu_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = (x[i] > 0.f) ? x[i] : expm1f(x[i]); }
|
||||||
inline static void ggml_vec_elu_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_elu_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(expm1f(GGML_FP16_TO_FP32(x[i])));
|
y[i] = GGML_CPU_FP32_TO_FP16(expm1f(GGML_CPU_FP16_TO_FP32(x[i])));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_relu_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = (x[i] > 0.f) ? x[i] : 0.f; }
|
inline static void ggml_vec_relu_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = (x[i] > 0.f) ? x[i] : 0.f; }
|
||||||
inline static void ggml_vec_relu_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_relu_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
float v = GGML_FP16_TO_FP32(x[i]);
|
float v = GGML_CPU_FP16_TO_FP32(x[i]);
|
||||||
y[i] = GGML_FP32_TO_FP16((v > 0.f) ? v : 0.f);
|
y[i] = GGML_CPU_FP32_TO_FP16((v > 0.f) ? v : 0.f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_leaky_relu_f32 (const int n, float * y, const float * x, const float ns) { for (int i = 0; i < n; ++i) y[i] = ((x[i] > 0.f) ? x[i] : 0.f) + ns * ((x[i] < 0.0f) ? x[i] : 0.f); }
|
inline static void ggml_vec_leaky_relu_f32 (const int n, float * y, const float * x, const float ns) { for (int i = 0; i < n; ++i) y[i] = ((x[i] > 0.f) ? x[i] : 0.f) + ns * ((x[i] < 0.0f) ? x[i] : 0.f); }
|
||||||
inline static void ggml_vec_leaky_relu_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x, const float ns) {
|
inline static void ggml_vec_leaky_relu_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x, const float ns) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
float v = GGML_FP16_TO_FP32(x[i]);
|
float v = GGML_CPU_FP16_TO_FP32(x[i]);
|
||||||
y[i] = GGML_FP32_TO_FP16(((v > 0.f) ? v : 0.f) + ns * ((v < 0.0f) ? v : 0.f));
|
y[i] = GGML_CPU_FP32_TO_FP16(((v > 0.f) ? v : 0.f) + ns * ((v < 0.0f) ? v : 0.f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_sigmoid_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = 1.f / (1.f + expf(-x[i])); }
|
inline static void ggml_vec_sigmoid_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = 1.f / (1.f + expf(-x[i])); }
|
||||||
inline static void ggml_vec_sigmoid_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_sigmoid_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(1.f / (1.f + expf(-GGML_FP16_TO_FP32(x[i]))));
|
y[i] = GGML_CPU_FP32_TO_FP16(1.f / (1.f + expf(-GGML_CPU_FP16_TO_FP32(x[i]))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// TODO: optimize performance
|
// TODO: optimize performance
|
||||||
inline static void ggml_vec_hardswish_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = x[i] * fminf(1.0f, fmaxf(0.0f, (x[i] + 3.0f) / 6.0f)); }
|
inline static void ggml_vec_hardswish_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = x[i] * fminf(1.0f, fmaxf(0.0f, (x[i] + 3.0f) / 6.0f)); }
|
||||||
inline static void ggml_vec_hardswish_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_hardswish_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
float v = GGML_FP16_TO_FP32(x[i]);
|
float v = GGML_CPU_FP16_TO_FP32(x[i]);
|
||||||
y[i] = GGML_FP32_TO_FP16(v * fminf(1.0f, fmaxf(0.0f, (v + 3.0f) / 6.0f)));
|
y[i] = GGML_CPU_FP32_TO_FP16(v * fminf(1.0f, fmaxf(0.0f, (v + 3.0f) / 6.0f)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_hardsigmoid_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = fminf(1.0f, fmaxf(0.0f, (x[i] + 3.0f) / 6.0f)); }
|
inline static void ggml_vec_hardsigmoid_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = fminf(1.0f, fmaxf(0.0f, (x[i] + 3.0f) / 6.0f)); }
|
||||||
inline static void ggml_vec_hardsigmoid_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_hardsigmoid_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(fminf(1.0f, fmaxf(0.0f, (GGML_FP16_TO_FP32(x[i]) + 3.0f) / 6.0f)));
|
y[i] = GGML_CPU_FP32_TO_FP16(fminf(1.0f, fmaxf(0.0f, (GGML_CPU_FP16_TO_FP32(x[i]) + 3.0f) / 6.0f)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline static void ggml_vec_exp_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = expf(x[i]); }
|
inline static void ggml_vec_exp_f32 (const int n, float * y, const float * x) { for (int i = 0; i < n; ++i) y[i] = expf(x[i]); }
|
||||||
inline static void ggml_vec_exp_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_exp_f16 (const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
y[i] = GGML_FP32_TO_FP16(expf(GGML_FP16_TO_FP32(x[i])));
|
y[i] = GGML_CPU_FP32_TO_FP16(expf(GGML_CPU_FP16_TO_FP32(x[i])));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -562,9 +562,9 @@ inline static void ggml_vec_gelu_f16(const int n, ggml_fp16_t * y, const ggml_fp
|
|||||||
|
|
||||||
inline static void ggml_vec_gelu_erf_f16(const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_gelu_erf_f16(const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
float xi = GGML_FP16_TO_FP32(x[i]);
|
float xi = GGML_CPU_FP16_TO_FP32(x[i]);
|
||||||
float res = 0.5f*xi*(1.0f + erff(xi*SQRT_2_INV));
|
float res = 0.5f*xi*(1.0f + erff(xi*SQRT_2_INV));
|
||||||
y[i] = GGML_FP32_TO_FP16(res);
|
y[i] = GGML_CPU_FP32_TO_FP16(res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -577,9 +577,9 @@ inline static void ggml_vec_gelu_f32(const int n, float * y, const float * x) {
|
|||||||
} else if (x[i] >= 10.0f) {
|
} else if (x[i] >= 10.0f) {
|
||||||
y[i] = x[i];
|
y[i] = x[i];
|
||||||
} else {
|
} else {
|
||||||
ggml_fp16_t fp16 = GGML_FP32_TO_FP16(x[i]);
|
ggml_fp16_t fp16 = GGML_CPU_FP32_TO_FP16(x[i]);
|
||||||
memcpy(&t, &fp16, sizeof(uint16_t));
|
memcpy(&t, &fp16, sizeof(uint16_t));
|
||||||
y[i] = GGML_FP16_TO_FP32(ggml_table_gelu_f16[t]);
|
y[i] = GGML_CPU_FP16_TO_FP32(ggml_table_gelu_f16[t]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -613,9 +613,9 @@ inline static float ggml_gelu_quick_f32(float x) {
|
|||||||
inline static void ggml_vec_gelu_quick_f32(const int n, float * y, const float * x) {
|
inline static void ggml_vec_gelu_quick_f32(const int n, float * y, const float * x) {
|
||||||
uint16_t t;
|
uint16_t t;
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
ggml_fp16_t fp16 = GGML_FP32_TO_FP16(x[i]);
|
ggml_fp16_t fp16 = GGML_CPU_FP32_TO_FP16(x[i]);
|
||||||
memcpy(&t, &fp16, sizeof(uint16_t));
|
memcpy(&t, &fp16, sizeof(uint16_t));
|
||||||
y[i] = GGML_FP16_TO_FP32(ggml_table_gelu_quick_f16[t]);
|
y[i] = GGML_CPU_FP16_TO_FP32(ggml_table_gelu_quick_f16[t]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@ -628,8 +628,8 @@ inline static void ggml_vec_gelu_quick_f32(const int n, float * y, const float *
|
|||||||
|
|
||||||
inline static void ggml_vec_gelu_quick_f16(const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
inline static void ggml_vec_gelu_quick_f16(const int n, ggml_fp16_t * y, const ggml_fp16_t * x) {
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
float v = GGML_FP16_TO_FP32(x[i]);
|
float v = GGML_CPU_FP16_TO_FP32(x[i]);
|
||||||
y[i] = GGML_FP32_TO_FP16(v*(1.0f/(1.0f+expf(GELU_QUICK_COEF*v))));
|
y[i] = GGML_CPU_FP32_TO_FP16(v*(1.0f/(1.0f+expf(GELU_QUICK_COEF*v))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -638,8 +638,8 @@ inline static float ggml_silu_f32(float x) {
|
|||||||
return x/(1.0f + expf(-x));
|
return x/(1.0f + expf(-x));
|
||||||
}
|
}
|
||||||
inline static ggml_fp16_t ggml_silu_f16(ggml_fp16_t x) {
|
inline static ggml_fp16_t ggml_silu_f16(ggml_fp16_t x) {
|
||||||
float v = GGML_FP16_TO_FP32(x);
|
float v = GGML_CPU_FP16_TO_FP32(x);
|
||||||
return GGML_FP32_TO_FP16(v/(1.0f + expf(-v)));
|
return GGML_CPU_FP32_TO_FP16(v/(1.0f + expf(-v)));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __FINITE_MATH_ONLY__
|
#if __FINITE_MATH_ONLY__
|
||||||
@ -888,9 +888,9 @@ inline static float ggml_silu_backward_f32(float x, float dy) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline static ggml_fp16_t ggml_silu_backward_f16(ggml_fp16_t x, ggml_fp16_t dy) {
|
inline static ggml_fp16_t ggml_silu_backward_f16(ggml_fp16_t x, ggml_fp16_t dy) {
|
||||||
const float v = GGML_FP16_TO_FP32(x);
|
const float v = GGML_CPU_FP16_TO_FP32(x);
|
||||||
const float s = 1.0f/(1.0f + expf(-v));
|
const float s = 1.0f/(1.0f + expf(-v));
|
||||||
return GGML_FP32_TO_FP16(GGML_FP16_TO_FP32(dy)*s*(1.0f + v*(1.0f - s)));
|
return GGML_CPU_FP32_TO_FP16(GGML_CPU_FP16_TO_FP32(dy)*s*(1.0f + v*(1.0f - s)));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline static void ggml_vec_silu_backward_f32(const int n, float * dx, const float * x, const float * dy) {
|
inline static void ggml_vec_silu_backward_f32(const int n, float * dx, const float * x, const float * dy) {
|
||||||
@ -928,7 +928,7 @@ inline static void ggml_vec_sum_f32_ggf(const int n, ggml_float * s, const float
|
|||||||
inline static void ggml_vec_sum_f16_ggf(const int n, float * s, const ggml_fp16_t * x) {
|
inline static void ggml_vec_sum_f16_ggf(const int n, float * s, const ggml_fp16_t * x) {
|
||||||
float sum = 0.0f;
|
float sum = 0.0f;
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
sum += GGML_FP16_TO_FP32(x[i]);
|
sum += GGML_CPU_FP16_TO_FP32(x[i]);
|
||||||
}
|
}
|
||||||
*s = sum;
|
*s = sum;
|
||||||
}
|
}
|
||||||
|
@ -317,203 +317,81 @@ struct ggml_cgraph ggml_graph_view(struct ggml_cgraph * cgraph, int i0, int i1);
|
|||||||
GGML_API void * ggml_aligned_malloc(size_t size);
|
GGML_API void * ggml_aligned_malloc(size_t size);
|
||||||
GGML_API void ggml_aligned_free(void * ptr, size_t size);
|
GGML_API void ggml_aligned_free(void * ptr, size_t size);
|
||||||
|
|
||||||
// FP16 to FP32 conversion
|
// FP16 <-> FP32
|
||||||
|
// ref: https://github.com/Maratyszcza/FP16
|
||||||
|
|
||||||
// 16-bit float
|
static inline float fp32_from_bits(uint32_t w) {
|
||||||
// on Arm, we use __fp16
|
union {
|
||||||
// on x86, we use uint16_t
|
uint32_t as_bits;
|
||||||
//
|
float as_value;
|
||||||
// for old CUDA compilers (<= 11), we use uint16_t: ref https://github.com/ggml-org/llama.cpp/pull/10616
|
} fp32;
|
||||||
// for MUSA compilers , we use uint16_t: ref https://github.com/ggml-org/llama.cpp/pull/11843
|
fp32.as_bits = w;
|
||||||
//
|
return fp32.as_value;
|
||||||
#if defined(__ARM_NEON) && !(defined(__CUDACC__) && __CUDACC_VER_MAJOR__ <= 11) && !defined(__MUSACC__)
|
|
||||||
#define GGML_COMPUTE_FP16_TO_FP32(x) ggml_compute_fp16_to_fp32(x)
|
|
||||||
#define GGML_COMPUTE_FP32_TO_FP16(x) ggml_compute_fp32_to_fp16(x)
|
|
||||||
|
|
||||||
#define GGML_FP16_TO_FP32(x) ggml_compute_fp16_to_fp32(x)
|
|
||||||
|
|
||||||
static inline float ggml_compute_fp16_to_fp32(ggml_fp16_t h) {
|
|
||||||
__fp16 tmp;
|
|
||||||
memcpy(&tmp, &h, sizeof(ggml_fp16_t));
|
|
||||||
return (float)tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline ggml_fp16_t ggml_compute_fp32_to_fp16(float f) {
|
|
||||||
ggml_fp16_t res;
|
|
||||||
__fp16 tmp = f;
|
|
||||||
memcpy(&res, &tmp, sizeof(ggml_fp16_t));
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(__F16C__)
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#define GGML_COMPUTE_FP16_TO_FP32(x) _mm_cvtss_f32(_mm_cvtph_ps(_mm_cvtsi32_si128(x)))
|
|
||||||
#define GGML_COMPUTE_FP32_TO_FP16(x) _mm_extract_epi16(_mm_cvtps_ph(_mm_set_ss(x), 0), 0)
|
|
||||||
#else
|
|
||||||
#define GGML_COMPUTE_FP16_TO_FP32(x) _cvtsh_ss(x)
|
|
||||||
#define GGML_COMPUTE_FP32_TO_FP16(x) _cvtss_sh(x, 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined(__POWER9_VECTOR__)
|
|
||||||
|
|
||||||
#define GGML_COMPUTE_FP16_TO_FP32(x) ggml_compute_fp16_to_fp32(x)
|
|
||||||
#define GGML_COMPUTE_FP32_TO_FP16(x) ggml_compute_fp32_to_fp16(x)
|
|
||||||
/* the inline asm below is about 12% faster than the lookup method */
|
|
||||||
#define GGML_FP16_TO_FP32(x) GGML_COMPUTE_FP16_TO_FP32(x)
|
|
||||||
#define GGML_FP32_TO_FP16(x) GGML_COMPUTE_FP32_TO_FP16(x)
|
|
||||||
|
|
||||||
static inline float ggml_compute_fp16_to_fp32(ggml_fp16_t h) {
|
|
||||||
float f;
|
|
||||||
double d;
|
|
||||||
__asm__(
|
|
||||||
"mtfprd %0,%2\n"
|
|
||||||
"xscvhpdp %0,%0\n"
|
|
||||||
"frsp %1,%0\n" :
|
|
||||||
/* temp */ "=d"(d),
|
|
||||||
/* out */ "=f"(f):
|
|
||||||
/* in */ "r"(h));
|
|
||||||
return f;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline ggml_fp16_t ggml_compute_fp32_to_fp16(float f) {
|
|
||||||
double d;
|
|
||||||
ggml_fp16_t r;
|
|
||||||
__asm__( /* xscvdphp can work on double or single precision */
|
|
||||||
"xscvdphp %0,%2\n"
|
|
||||||
"mffprd %1,%0\n" :
|
|
||||||
/* temp */ "=d"(d),
|
|
||||||
/* out */ "=r"(r):
|
|
||||||
/* in */ "f"(f));
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(__riscv) && defined(__riscv_zfhmin)
|
|
||||||
|
|
||||||
static inline float ggml_compute_fp16_to_fp32(ggml_fp16_t h) {
|
|
||||||
float f;
|
|
||||||
__asm__(
|
|
||||||
"fmv.h.x %[f], %[h]\n\t"
|
|
||||||
"fcvt.s.h %[f], %[f]"
|
|
||||||
: [f] "=&f" (f)
|
|
||||||
: [h] "r" (h)
|
|
||||||
);
|
|
||||||
return f;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline ggml_fp16_t ggml_compute_fp32_to_fp16(float f) {
|
|
||||||
ggml_fp16_t res;
|
|
||||||
__asm__(
|
|
||||||
"fcvt.h.s %[f], %[f]\n\t"
|
|
||||||
"fmv.x.h %[h], %[f]"
|
|
||||||
: [h] "=&r" (res)
|
|
||||||
: [f] "f" (f)
|
|
||||||
);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define GGML_COMPUTE_FP16_TO_FP32(x) ggml_compute_fp16_to_fp32(x)
|
|
||||||
#define GGML_COMPUTE_FP32_TO_FP16(x) ggml_compute_fp32_to_fp16(x)
|
|
||||||
#define GGML_FP16_TO_FP32(x) GGML_COMPUTE_FP16_TO_FP32(x)
|
|
||||||
#define GGML_FP32_TO_FP16(x) GGML_COMPUTE_FP32_TO_FP16(x)
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
// FP16 <-> FP32
|
|
||||||
// ref: https://github.com/Maratyszcza/FP16
|
|
||||||
|
|
||||||
static inline float fp32_from_bits(uint32_t w) {
|
|
||||||
union {
|
|
||||||
uint32_t as_bits;
|
|
||||||
float as_value;
|
|
||||||
} fp32;
|
|
||||||
fp32.as_bits = w;
|
|
||||||
return fp32.as_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint32_t fp32_to_bits(float f) {
|
|
||||||
union {
|
|
||||||
float as_value;
|
|
||||||
uint32_t as_bits;
|
|
||||||
} fp32;
|
|
||||||
fp32.as_value = f;
|
|
||||||
return fp32.as_bits;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline float ggml_compute_fp16_to_fp32(ggml_fp16_t h) {
|
|
||||||
const uint32_t w = (uint32_t) h << 16;
|
|
||||||
const uint32_t sign = w & UINT32_C(0x80000000);
|
|
||||||
const uint32_t two_w = w + w;
|
|
||||||
|
|
||||||
const uint32_t exp_offset = UINT32_C(0xE0) << 23;
|
|
||||||
#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) || defined(__GNUC__) && !defined(__STRICT_ANSI__)) && (!defined(__cplusplus) || __cplusplus >= 201703L)
|
|
||||||
const float exp_scale = 0x1.0p-112f;
|
|
||||||
#else
|
|
||||||
const float exp_scale = fp32_from_bits(UINT32_C(0x7800000));
|
|
||||||
#endif
|
|
||||||
const float normalized_value = fp32_from_bits((two_w >> 4) + exp_offset) * exp_scale;
|
|
||||||
|
|
||||||
const uint32_t magic_mask = UINT32_C(126) << 23;
|
|
||||||
const float magic_bias = 0.5f;
|
|
||||||
const float denormalized_value = fp32_from_bits((two_w >> 17) | magic_mask) - magic_bias;
|
|
||||||
|
|
||||||
const uint32_t denormalized_cutoff = UINT32_C(1) << 27;
|
|
||||||
const uint32_t result = sign |
|
|
||||||
(two_w < denormalized_cutoff ? fp32_to_bits(denormalized_value) : fp32_to_bits(normalized_value));
|
|
||||||
return fp32_from_bits(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline ggml_fp16_t ggml_compute_fp32_to_fp16(float f) {
|
|
||||||
#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) || defined(__GNUC__) && !defined(__STRICT_ANSI__)) && (!defined(__cplusplus) || __cplusplus >= 201703L)
|
|
||||||
const float scale_to_inf = 0x1.0p+112f;
|
|
||||||
const float scale_to_zero = 0x1.0p-110f;
|
|
||||||
#else
|
|
||||||
const float scale_to_inf = fp32_from_bits(UINT32_C(0x77800000));
|
|
||||||
const float scale_to_zero = fp32_from_bits(UINT32_C(0x08800000));
|
|
||||||
#endif
|
|
||||||
float base = (fabsf(f) * scale_to_inf) * scale_to_zero;
|
|
||||||
|
|
||||||
const uint32_t w = fp32_to_bits(f);
|
|
||||||
const uint32_t shl1_w = w + w;
|
|
||||||
const uint32_t sign = w & UINT32_C(0x80000000);
|
|
||||||
uint32_t bias = shl1_w & UINT32_C(0xFF000000);
|
|
||||||
if (bias < UINT32_C(0x71000000)) {
|
|
||||||
bias = UINT32_C(0x71000000);
|
|
||||||
}
|
|
||||||
|
|
||||||
base = fp32_from_bits((bias >> 1) + UINT32_C(0x07800000)) + base;
|
|
||||||
const uint32_t bits = fp32_to_bits(base);
|
|
||||||
const uint32_t exp_bits = (bits >> 13) & UINT32_C(0x00007C00);
|
|
||||||
const uint32_t mantissa_bits = bits & UINT32_C(0x00000FFF);
|
|
||||||
const uint32_t nonsign = exp_bits + mantissa_bits;
|
|
||||||
return (sign >> 16) | (shl1_w > UINT32_C(0xFF000000) ? UINT16_C(0x7E00) : nonsign);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define GGML_COMPUTE_FP16_TO_FP32(x) ggml_compute_fp16_to_fp32(x)
|
|
||||||
#define GGML_COMPUTE_FP32_TO_FP16(x) ggml_compute_fp32_to_fp16(x)
|
|
||||||
|
|
||||||
#endif // defined(__ARM_NEON) && !(defined(__CUDACC__) && __CUDACC_VER_MAJOR__ <= 11) && !defined(__MUSACC__)
|
|
||||||
|
|
||||||
// precomputed f32 table for f16 (256 KB)
|
|
||||||
// defined in ggml.c, initialized in ggml_init()
|
|
||||||
GGML_API float ggml_table_f32_f16[1 << 16];
|
|
||||||
|
|
||||||
// On ARM NEON, it's quicker to directly convert x -> x instead of calling into ggml_lookup_fp16_to_fp32,
|
|
||||||
// so we define GGML_FP16_TO_FP32 and GGML_FP32_TO_FP16 elsewhere for NEON.
|
|
||||||
// This is also true for POWER9.
|
|
||||||
#if !defined(GGML_FP16_TO_FP32)
|
|
||||||
inline static float ggml_lookup_fp16_to_fp32(ggml_fp16_t f) {
|
|
||||||
uint16_t s;
|
|
||||||
memcpy(&s, &f, sizeof(uint16_t));
|
|
||||||
return ggml_table_f32_f16[s];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GGML_FP16_TO_FP32(x) ggml_lookup_fp16_to_fp32(x)
|
static inline uint32_t fp32_to_bits(float f) {
|
||||||
#endif
|
union {
|
||||||
|
float as_value;
|
||||||
|
uint32_t as_bits;
|
||||||
|
} fp32;
|
||||||
|
fp32.as_value = f;
|
||||||
|
return fp32.as_bits;
|
||||||
|
}
|
||||||
|
|
||||||
#if !defined(GGML_FP32_TO_FP16)
|
static inline float ggml_compute_fp16_to_fp32(ggml_fp16_t h) {
|
||||||
#define GGML_FP32_TO_FP16(x) GGML_COMPUTE_FP32_TO_FP16(x)
|
const uint32_t w = (uint32_t) h << 16;
|
||||||
|
const uint32_t sign = w & UINT32_C(0x80000000);
|
||||||
|
const uint32_t two_w = w + w;
|
||||||
|
|
||||||
|
const uint32_t exp_offset = UINT32_C(0xE0) << 23;
|
||||||
|
#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) || defined(__GNUC__) && !defined(__STRICT_ANSI__)) && (!defined(__cplusplus) || __cplusplus >= 201703L)
|
||||||
|
const float exp_scale = 0x1.0p-112f;
|
||||||
|
#else
|
||||||
|
const float exp_scale = fp32_from_bits(UINT32_C(0x7800000));
|
||||||
#endif
|
#endif
|
||||||
|
const float normalized_value = fp32_from_bits((two_w >> 4) + exp_offset) * exp_scale;
|
||||||
|
|
||||||
|
const uint32_t magic_mask = UINT32_C(126) << 23;
|
||||||
|
const float magic_bias = 0.5f;
|
||||||
|
const float denormalized_value = fp32_from_bits((two_w >> 17) | magic_mask) - magic_bias;
|
||||||
|
|
||||||
|
const uint32_t denormalized_cutoff = UINT32_C(1) << 27;
|
||||||
|
const uint32_t result = sign |
|
||||||
|
(two_w < denormalized_cutoff ? fp32_to_bits(denormalized_value) : fp32_to_bits(normalized_value));
|
||||||
|
return fp32_from_bits(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline ggml_fp16_t ggml_compute_fp32_to_fp16(float f) {
|
||||||
|
#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) || defined(__GNUC__) && !defined(__STRICT_ANSI__)) && (!defined(__cplusplus) || __cplusplus >= 201703L)
|
||||||
|
const float scale_to_inf = 0x1.0p+112f;
|
||||||
|
const float scale_to_zero = 0x1.0p-110f;
|
||||||
|
#else
|
||||||
|
const float scale_to_inf = fp32_from_bits(UINT32_C(0x77800000));
|
||||||
|
const float scale_to_zero = fp32_from_bits(UINT32_C(0x08800000));
|
||||||
|
#endif
|
||||||
|
float base = (fabsf(f) * scale_to_inf) * scale_to_zero;
|
||||||
|
|
||||||
|
const uint32_t w = fp32_to_bits(f);
|
||||||
|
const uint32_t shl1_w = w + w;
|
||||||
|
const uint32_t sign = w & UINT32_C(0x80000000);
|
||||||
|
uint32_t bias = shl1_w & UINT32_C(0xFF000000);
|
||||||
|
if (bias < UINT32_C(0x71000000)) {
|
||||||
|
bias = UINT32_C(0x71000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
base = fp32_from_bits((bias >> 1) + UINT32_C(0x07800000)) + base;
|
||||||
|
const uint32_t bits = fp32_to_bits(base);
|
||||||
|
const uint32_t exp_bits = (bits >> 13) & UINT32_C(0x00007C00);
|
||||||
|
const uint32_t mantissa_bits = bits & UINT32_C(0x00000FFF);
|
||||||
|
const uint32_t nonsign = exp_bits + mantissa_bits;
|
||||||
|
return (sign >> 16) | (shl1_w > UINT32_C(0xFF000000) ? UINT16_C(0x7E00) : nonsign);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GGML_COMPUTE_FP16_TO_FP32(x) ggml_compute_fp16_to_fp32(x)
|
||||||
|
#define GGML_COMPUTE_FP32_TO_FP16(x) ggml_compute_fp32_to_fp16(x)
|
||||||
|
|
||||||
|
#define GGML_FP16_TO_FP32(x) GGML_COMPUTE_FP16_TO_FP32(x)
|
||||||
|
#define GGML_FP32_TO_FP16(x) GGML_COMPUTE_FP32_TO_FP16(x)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts brain16 to float32.
|
* Converts brain16 to float32.
|
||||||
|
@ -61,9 +61,6 @@
|
|||||||
#define m512i(p) (__m512i)(p)
|
#define m512i(p) (__m512i)(p)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// precomputed f32 table for f16 (256 KB) (ggml-impl.h)
|
|
||||||
float ggml_table_f32_f16[1 << 16];
|
|
||||||
|
|
||||||
#if defined(__linux__) || \
|
#if defined(__linux__) || \
|
||||||
defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \
|
defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \
|
||||||
(defined(__APPLE__) && !TARGET_OS_TV && !TARGET_OS_WATCH)
|
(defined(__APPLE__) && !TARGET_OS_TV && !TARGET_OS_WATCH)
|
||||||
@ -1422,14 +1419,6 @@ struct ggml_context * ggml_init(struct ggml_init_params params) {
|
|||||||
// initialize time system (required on Windows)
|
// initialize time system (required on Windows)
|
||||||
ggml_time_init();
|
ggml_time_init();
|
||||||
|
|
||||||
for (int i = 0; i < (1 << 16); ++i) {
|
|
||||||
union {
|
|
||||||
uint16_t u16;
|
|
||||||
ggml_fp16_t fp16;
|
|
||||||
} u = {i};
|
|
||||||
ggml_table_f32_f16[i] = GGML_COMPUTE_FP16_TO_FP32(u.fp16);
|
|
||||||
}
|
|
||||||
|
|
||||||
is_first_call = false;
|
is_first_call = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user