From e71d48e3265027351e44a8e198f933c98f242c2e Mon Sep 17 00:00:00 2001 From: Tak-RS Date: Wed, 13 Aug 2025 14:54:30 +0900 Subject: [PATCH 01/13] ggml-rpc: chunk send()/recv() to avoid EINVAL for very large tensors over RPC (macOS & others) (#15188) * ggml-rpc: chunk send()/recv() to avoid EINVAL for very large tensors over RPC (macOS & others). Fixes #15055 * ggml-rpc: rename RPC_IO_CHUNK->MAX_CHUNK_SIZE, use std::min() for cap, switch to GGML_LOG_ERROR, handle 0-length send/recv * rpc: drop n==0 special case in send_data(); retry in loop per review * rpc: remove trailing whitespace in send_data() --------- Co-authored-by: Shinnosuke Takagi --- ggml/src/ggml-rpc/ggml-rpc.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/ggml/src/ggml-rpc/ggml-rpc.cpp b/ggml/src/ggml-rpc/ggml-rpc.cpp index df6ba54076d..e84ff93efc3 100644 --- a/ggml/src/ggml-rpc/ggml-rpc.cpp +++ b/ggml/src/ggml-rpc/ggml-rpc.cpp @@ -29,9 +29,12 @@ #include #include #include +#include namespace fs = std::filesystem; +static constexpr size_t MAX_CHUNK_SIZE = 1024ull * 1024ull * 1024ull; // 1 GiB + #ifdef _WIN32 typedef SOCKET sockfd_t; using ssize_t = __int64; @@ -323,11 +326,14 @@ static std::shared_ptr create_server_socket(const char * host, int por static bool send_data(sockfd_t sockfd, const void * data, size_t size) { size_t bytes_sent = 0; while (bytes_sent < size) { - ssize_t n = send(sockfd, (const char *)data + bytes_sent, size - bytes_sent, 0); + size_t size_to_send = std::min(size - bytes_sent, MAX_CHUNK_SIZE); + ssize_t n = send(sockfd, (const char *)data + bytes_sent, size_to_send, 0); if (n < 0) { + GGML_LOG_ERROR("send failed (bytes_sent=%zu, size_to_send=%zu)\n", + bytes_sent, size_to_send); return false; } - bytes_sent += n; + bytes_sent += (size_t)n; } return true; } @@ -335,11 +341,18 @@ static bool send_data(sockfd_t sockfd, const void * data, size_t size) { static bool recv_data(sockfd_t sockfd, void * data, size_t size) { size_t bytes_recv = 0; while (bytes_recv < size) { - ssize_t n = recv(sockfd, (char *)data + bytes_recv, size - bytes_recv, 0); - if (n <= 0) { + size_t size_to_recv = std::min(size - bytes_recv, MAX_CHUNK_SIZE); + ssize_t n = recv(sockfd, (char *)data + bytes_recv, size_to_recv, 0); + if (n < 0) { + GGML_LOG_ERROR("recv failed (bytes_recv=%zu, size_to_recv=%zu)\n", + bytes_recv, size_to_recv); + return false; + } + if (n == 0) { + GGML_LOG_ERROR("recv returned 0 (peer closed?)\n"); return false; } - bytes_recv += n; + bytes_recv += (size_t)n; } return true; } From bc5182272c373267352bc689e5fca276934bea2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigbj=C3=B8rn=20Skj=C3=A6ret?= Date: Wed, 13 Aug 2025 09:07:13 +0200 Subject: [PATCH 02/13] ci : add copilot-setup-steps.yml (#15214) --- .github/workflows/copilot-setup-steps.yml | 52 +++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .github/workflows/copilot-setup-steps.yml diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml new file mode 100644 index 00000000000..14f7c5e3f7b --- /dev/null +++ b/.github/workflows/copilot-setup-steps.yml @@ -0,0 +1,52 @@ +name: "Copilot Setup Steps" + +# Automatically run the setup steps when they are changed to allow for easy validation, and +# allow manual testing through the repository's "Actions" tab +on: + workflow_dispatch: + push: + paths: + - .github/workflows/copilot-setup-steps.yml + pull_request: + paths: + - .github/workflows/copilot-setup-steps.yml + +jobs: + # The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot. + copilot-setup-steps: + runs-on: ubuntu-latest + + # Set the permissions to the lowest permissions possible needed for your steps. + # Copilot will be given its own token for its operations. + permissions: + # If you want to clone the repository as part of your setup steps, for example to install dependencies, you'll need the `contents: read` permission. If you don't clone the repository in your setup steps, Copilot will do this for you automatically after the steps complete. + contents: read + + # You can define any steps you want, and they will run before the agent starts. + # If you do not check out your code, Copilot will do this for you. + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: ccache + uses: hendrikmuhs/ccache-action@v1.2.16 + with: + key: copilot-setup-steps + evict-old-files: 1d + + - name: Dependencies + id: depends + run: | + sudo apt-get update + sudo apt-get install build-essential libcurl4-openssl-dev + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install Python dependencies + run: | + python3 -m venv .venv + .venv/bin/activate + pip install -r requirements/requirements-all.txt From 6028bf74351d35a06bd98498624f8c2f029f7d1a Mon Sep 17 00:00:00 2001 From: Oliver Simons Date: Wed, 13 Aug 2025 10:04:46 +0200 Subject: [PATCH 03/13] CUDA: Optimize `reduce_rows_f32` kernel, leading up to 25x perf improvement on kernel-level and 10% perf increase for Gemma3n (#15132) * Factor out `reduce_rows_f32` from common.cuh This increases iteration cycle speed by not having to recompile every kernel all the time * Hide memory-latency by loop unrolling in reduce_rows_f32 * Further optimizations to `reduce_rows_f32` 1. Increase threadblock size to better hide latency of memory requests. As a consequence of bigger threadblocks, do 2-step summation, using shared memory to communicate results between invocations 2. Use sum_temp array to reduce waits on sum 3. Adjust num_unroll to reflext bigger threadblock 4. Improve default block_dims, increase support for more block_dims * Add perf tests for `reduce_rows_f32` kernel * Add heuristic to toggle 128/512 threads based on sm count Break even point was the minimum of the following multiples. | GPU Model | Nrow SM Count Multiple | | ----------- | ----------- | | RTX 4000 SFF ADA | 2.0x | | RTX 6000 ADA | 2.5x | | RTX PRO 6000 Blackwell Max-Q | 3.04x | | RTX PRO 4500 Blackwell | 3.15x | * Ensure perf gains also for small ncols and large nrows Alternative to this, one could have also made the number of unrollings template-able, but that would require compiling the kernel multiple times, increasing binary size unnecessarily * Modify perf and unit-tests * Apply auto-formatting by clang * Fix CI build failure See https://github.com/ggml-org/llama.cpp/actions/runs/16798370266/job/47573716079?pr=15132#step:7:486 Building with VS generator worked though. * Remove sm_count property from `ggml_backend_cuda_context` Requested by @JohannesGaessler, and should fix remaining CI issues as a side-effect * Add CUB-based implementation for GGML_OP_MEAN Currently this branch is only executed for nrows==1 * Add heuristics to execute CUB branch only when it brings perf Heuristics were determined on the following HW: * RTX 4000 SFF ADA * RTX 6000 ADA * RTX PRO 6000 Blackwell Max-Q * RTX PRO 4500 Blackwell * Add unit-test for CUB-based mean Tests should run with CUDA Graphs enabled per default on NVGPUs * Rename `USE_CUB` to `GGML_CUDA_USE_CUB` Suggested by @JohannesGaessler * Unindent Preprocessor directives See https://github.com/ggml-org/llama.cpp/pull/15132#discussion_r2269213506 --- ggml/src/ggml-cuda/common.cuh | 24 +++----------- ggml/src/ggml-cuda/mean.cu | 52 +++++++++++++++++++++++++++-- ggml/src/ggml-cuda/reduce_rows.cuh | 53 ++++++++++++++++++++++++++++++ ggml/src/ggml-cuda/sum.cu | 16 ++++----- ggml/src/ggml-cuda/sumrows.cu | 25 +++++++++++--- tests/test-backend-ops.cpp | 21 ++++++++++++ 6 files changed, 155 insertions(+), 36 deletions(-) create mode 100644 ggml/src/ggml-cuda/reduce_rows.cuh diff --git a/ggml/src/ggml-cuda/common.cuh b/ggml/src/ggml-cuda/common.cuh index a23da57e3a1..5a2a3478d26 100644 --- a/ggml/src/ggml-cuda/common.cuh +++ b/ggml/src/ggml-cuda/common.cuh @@ -87,6 +87,10 @@ #define GGML_CUDA_CC_IS_QY2(cc) (cc >= GGML_CUDA_CC_QY2 && cc < GGML_CUDA_CC_NG) #define GGML_CUDA_CC_IS_NG(cc) (cc >= GGML_CUDA_CC_NG) +#if !defined(GGML_USE_HIP) && !defined(GGML_USE_MUSA) && CUDART_VERSION >= 11070 +# define GGML_CUDA_USE_CUB +#endif // !defined(GGML_USE_HIP) && !defined(GGML_USE_MUSA) && CUDART_VERSION >= 11070 + #ifdef __CUDA_ARCH_LIST__ constexpr bool ggml_cuda_has_arch_impl(int) { return false; @@ -420,26 +424,6 @@ static __device__ __forceinline__ half2 warp_reduce_sum(half2 a) { #endif // FP16_AVAILABLE } -// Row reduction kernel template - compute sum (norm=false) or mean (norm=true) -template -static __global__ void reduce_rows_f32(const float * x, float * dst, const int ncols) { - const int row = blockIdx.x; - const int col = threadIdx.x; - - float sum = 0.0f; - for (int i = col; i < ncols; i += blockDim.x) { - sum += x[row * ncols + i]; - } - - sum = warp_reduce_sum(sum); - - if (col != 0) { - return; - } - - dst[row] = norm ? sum / ncols : sum; -} - template static __device__ __forceinline__ int warp_reduce_all(int x) { #ifdef GGML_USE_HIP diff --git a/ggml/src/ggml-cuda/mean.cu b/ggml/src/ggml-cuda/mean.cu index 4b238a3998b..2ad493239b1 100644 --- a/ggml/src/ggml-cuda/mean.cu +++ b/ggml/src/ggml-cuda/mean.cu @@ -1,4 +1,14 @@ #include "mean.cuh" +#include "reduce_rows.cuh" + +#ifdef GGML_CUDA_USE_CUB +#include +using namespace cub; +#endif // GGML_CUDA_USE_CUB + +template __global__ void divide_by_count(T * result, size_t count) { + *result /= static_cast(count); +} void ggml_cuda_op_mean(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { const ggml_tensor * src0 = dst->src[0]; @@ -13,7 +23,45 @@ void ggml_cuda_op_mean(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { const int64_t ncols = src0->ne[0]; const int64_t nrows = ggml_nrows(src0); - const dim3 block_dims(WARP_SIZE, 1, 1); +// Special case for reducing vectors +#ifdef GGML_CUDA_USE_CUB + cudaStreamCaptureStatus iscapturing; + CUDA_CHECK(cudaStreamIsCapturing(stream, &iscapturing)); + if ((nrows == 1) && + // CUDA_GRAPHS_DISABLED + ((ncols > 65536) && + ((ctx.cuda_graph->instance == nullptr) && (iscapturing == cudaStreamCaptureStatusNone) || + ctx.cuda_graph->disable_due_to_gpu_arch || ctx.cuda_graph->disable_due_to_too_many_updates || + ctx.cuda_graph->disable_due_to_failed_graph_capture)) || + // CUDA_GRAPHS ENABLED + ((ncols > 32768) && + !((ctx.cuda_graph->instance == nullptr) && (iscapturing == cudaStreamCaptureStatusNone) || + ctx.cuda_graph->disable_due_to_gpu_arch || ctx.cuda_graph->disable_due_to_too_many_updates || + ctx.cuda_graph->disable_due_to_failed_graph_capture))) { + // Single row - use device-wide reduction + size_t tmp_size = 0; + ggml_cuda_pool & pool = ctx.pool(); + + DeviceReduce::Sum(nullptr, tmp_size, src0_d, dst_d, ncols, stream); + + ggml_cuda_pool_alloc tmp_alloc(pool, tmp_size); + DeviceReduce::Sum(tmp_alloc.ptr, tmp_size, src0_d, dst_d, ncols, stream); + + // Divide by ncols + divide_by_count<<<1, 1, 0, stream>>>(dst_d, ncols); + return; + } +#endif + const dim3 block_nums(nrows, 1, 1); - reduce_rows_f32<<>>(src0_d, dst_d, ncols); + + const int id = ggml_cuda_get_device(); + const int nsm = ggml_cuda_info().devices[id].nsm; + if ((nrows / nsm) < 2) { + const dim3 block_dims(512, 1, 1); + reduce_rows_f32<<>>(src0_d, dst_d, ncols); + } else { + const dim3 block_dims(ncols < 1024 ? 32 : 128, 1, 1); + reduce_rows_f32<<>>(src0_d, dst_d, ncols); + } } diff --git a/ggml/src/ggml-cuda/reduce_rows.cuh b/ggml/src/ggml-cuda/reduce_rows.cuh new file mode 100644 index 00000000000..6bee204136b --- /dev/null +++ b/ggml/src/ggml-cuda/reduce_rows.cuh @@ -0,0 +1,53 @@ +#include "common.cuh" + +// Row reduction kernel template - compute sum (norm=false) or mean (norm=true) +template +static __global__ void reduce_rows_f32(const float * __restrict__ x, float * __restrict__ dst, const int ncols) { + const int row = blockIdx.x; + const int col = threadIdx.x; + + float sum = 0.0f; + const int num_unroll = 8; + float temp[num_unroll]; + float sum_temp[num_unroll] = { 0.0f }; + for (int i = col; i < ncols;) { + for (int j = 0; j < num_unroll; ++j) { + if (i < ncols) { + temp[j] = x[row * ncols + i]; + } else { + temp[j] = 0; + } + i += blockDim.x; + } + for (int j = 0; j < num_unroll; ++j) { + sum_temp[j] += temp[j]; + } + } + for (int j = 0; j < num_unroll; ++j) { + sum += sum_temp[j]; + } + + // sum up partial sums + sum = warp_reduce_sum(sum); + if (blockDim.x > WARP_SIZE) { + assert((blockDim.x <= 1024) && (blockDim.x % WARP_SIZE) == 0); + __shared__ float s_sum[32]; + const int warp_id = threadIdx.x / WARP_SIZE; + const int lane_id = threadIdx.x % WARP_SIZE; + if (lane_id == 0) { + s_sum[warp_id] = sum; + } + __syncthreads(); + sum = 0.0f; + if (lane_id < (blockDim.x / WARP_SIZE)) { + sum = s_sum[lane_id]; + } + sum = warp_reduce_sum(sum); + } + + if (col != 0) { + return; + } + + dst[row] = norm ? sum / ncols : sum; +} diff --git a/ggml/src/ggml-cuda/sum.cu b/ggml/src/ggml-cuda/sum.cu index eb3d7cdba98..c56257b4406 100644 --- a/ggml/src/ggml-cuda/sum.cu +++ b/ggml/src/ggml-cuda/sum.cu @@ -1,19 +1,15 @@ -#if !defined(GGML_USE_HIP) && !defined(GGML_USE_MUSA) && CUDART_VERSION >= 11070 -#define USE_CUB -#endif // !defined(GGML_USE_HIP) && !defined(GGML_USE_MUSA) && CUDART_VERSION >= 11070 +#include "sum.cuh" +#include "sumrows.cuh" -#ifdef USE_CUB +#ifdef GGML_CUDA_USE_CUB #include using namespace cub; -#endif // USE_CUB - -#include "sumrows.cuh" -#include "sum.cuh" +#endif // GGML_CUDA_USE_CUB #include void sum_f32_cuda(ggml_cuda_pool & pool, const float * x, float * dst, const int64_t ne, cudaStream_t stream) { -#ifdef USE_CUB +#ifdef GGML_CUDA_USE_CUB size_t tmp_size = 0; DeviceReduce::Sum(nullptr, tmp_size, x, dst, ne, stream); ggml_cuda_pool_alloc tmp_alloc(pool, tmp_size); @@ -23,7 +19,7 @@ void sum_f32_cuda(ggml_cuda_pool & pool, const float * x, float * dst, const int // For AMD there is rocPRIM which could be used as a drop-in replacement via hipcub but this would require C++11 -> C++14. sum_rows_f32_cuda(x, dst, ne, 1, stream); GGML_UNUSED(pool); -#endif // USE_CUB +#endif // GGML_CUDA_USE_CUB } void ggml_cuda_op_sum(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { diff --git a/ggml/src/ggml-cuda/sumrows.cu b/ggml/src/ggml-cuda/sumrows.cu index 2eee08fa073..4025771aadb 100644 --- a/ggml/src/ggml-cuda/sumrows.cu +++ b/ggml/src/ggml-cuda/sumrows.cu @@ -1,9 +1,17 @@ +#include "reduce_rows.cuh" #include "sumrows.cuh" void sum_rows_f32_cuda(const float * x, float * dst, const int ncols, const int nrows, cudaStream_t stream) { - const dim3 block_dims(WARP_SIZE, 1, 1); + const int id = ggml_cuda_get_device(); + const int nsm = ggml_cuda_info().devices[id].nsm; const dim3 block_nums(nrows, 1, 1); - reduce_rows_f32<<>>(x, dst, ncols); + if ((nrows / nsm) < 2) { + const dim3 block_dims(512, 1, 1); + reduce_rows_f32<<>>(x, dst, ncols); + } else { + const dim3 block_dims(ncols < 1024 ? 32 : 128, 1, 1); + reduce_rows_f32<<>>(x, dst, ncols); + } } void ggml_cuda_op_sum_rows(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { @@ -19,8 +27,17 @@ void ggml_cuda_op_sum_rows(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { const int64_t ncols = src0->ne[0]; const int64_t nrows = ggml_nrows(src0); - const dim3 block_dims(WARP_SIZE, 1, 1); const dim3 block_nums(nrows, 1, 1); - reduce_rows_f32<<>>(src0_d, dst_d, ncols); + const int id = ggml_cuda_get_device(); + const int nsm = ggml_cuda_info().devices[id].nsm; + if ((nrows / nsm) < 2) { + // Increase num threads to 512 for small nrows to better hide the latency + const dim3 block_dims(512, 1, 1); + reduce_rows_f32<<>>(src0_d, dst_d, ncols); + } else { + // Enough active SMs to hide latency, use smaller blocks to allow better scheduling + const dim3 block_dims(ncols < 1024 ? 32 : 128, 1, 1); + reduce_rows_f32<<>>(src0_d, dst_d, ncols); + } } diff --git a/tests/test-backend-ops.cpp b/tests/test-backend-ops.cpp index d29779cd12b..63e03978e42 100644 --- a/tests/test-backend-ops.cpp +++ b/tests/test-backend-ops.cpp @@ -5998,6 +5998,15 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_sum()); test_cases.emplace_back(new test_sum_rows()); test_cases.emplace_back(new test_mean()); + test_cases.emplace_back(new test_sum(GGML_TYPE_F32, { 33, 1, 1, 1 })); + test_cases.emplace_back(new test_sum_rows(GGML_TYPE_F32, { 33, 1, 1, 1 })); + test_cases.emplace_back(new test_mean(GGML_TYPE_F32, { 33, 1, 1, 1 })); + test_cases.emplace_back(new test_sum(GGML_TYPE_F32, { 33, 1024, 1, 1 })); + test_cases.emplace_back(new test_sum_rows(GGML_TYPE_F32, { 33, 1024, 1, 1 })); + test_cases.emplace_back(new test_sum(GGML_TYPE_F32, { 33, 256, 1, 1 })); + test_cases.emplace_back(new test_sum_rows(GGML_TYPE_F32, { 33, 256, 1, 1 })); + test_cases.emplace_back(new test_mean(GGML_TYPE_F32, { 33, 256, 1, 1 })); + test_cases.emplace_back(new test_mean(GGML_TYPE_F32, { 32769, 1, 1, 1 })); test_cases.emplace_back(new test_group_norm(GGML_TYPE_F32, {64, 64, 320, 1})); test_cases.emplace_back(new test_group_norm(GGML_TYPE_F32, {9, 9, 1280, 1})); test_cases.emplace_back(new test_acc()); @@ -6179,6 +6188,18 @@ static std::vector> make_test_cases_perf() { test_cases.emplace_back(new test_add_id(GGML_TYPE_F32, GGML_TYPE_F32, 2880, 32, 4, n_token)); } + std::vector> reduce_rows_cases = { + { 8192, 1, 1, 1 }, + { 8192, 8192, 1, 1 }, + { 128, 8192, 1, 1 }, + }; + + for (auto it: reduce_rows_cases){ + test_cases.emplace_back(new test_mean(GGML_TYPE_F32, it)); + test_cases.emplace_back(new test_sum_rows(GGML_TYPE_F32, it)); + test_cases.emplace_back(new test_sum(GGML_TYPE_F32, it)); + } + return test_cases; } From 00f35d509e5367bf19ccaf4b4adddc38db4811c6 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Wed, 13 Aug 2025 11:09:39 +0300 Subject: [PATCH 04/13] ggml : repack block_iq4_nlx8 (#14904) ggml-ci --- ggml/src/ggml-cpu/arch-fallback.h | 14 + ggml/src/ggml-cpu/arch/x86/repack.cpp | 2213 +++++++++++++------------ ggml/src/ggml-cpu/repack.cpp | 251 ++- ggml/src/ggml-cpu/repack.h | 11 + 4 files changed, 1361 insertions(+), 1128 deletions(-) diff --git a/ggml/src/ggml-cpu/arch-fallback.h b/ggml/src/ggml-cpu/arch-fallback.h index b62e3158ee7..f476127995b 100644 --- a/ggml/src/ggml-cpu/arch-fallback.h +++ b/ggml/src/ggml-cpu/arch-fallback.h @@ -40,18 +40,22 @@ #define ggml_gemv_q4_K_8x8_q8_K_generic ggml_gemv_q4_K_8x8_q8_K #define ggml_gemv_q2_K_8x8_q8_K_generic ggml_gemv_q2_K_8x8_q8_K #define ggml_gemv_iq4_nl_4x4_q8_0_generic ggml_gemv_iq4_nl_4x4_q8_0 +#define ggml_gemv_iq4_nl_8x8_q8_0_generic ggml_gemv_iq4_nl_8x8_q8_0 #define ggml_gemm_q4_0_4x4_q8_0_generic ggml_gemm_q4_0_4x4_q8_0 #define ggml_gemm_q4_0_4x8_q8_0_generic ggml_gemm_q4_0_4x8_q8_0 #define ggml_gemm_q4_0_8x8_q8_0_generic ggml_gemm_q4_0_8x8_q8_0 #define ggml_gemm_q4_K_8x8_q8_K_generic ggml_gemm_q4_K_8x8_q8_K #define ggml_gemm_q2_K_8x8_q8_K_generic ggml_gemm_q2_K_8x8_q8_K #define ggml_gemm_iq4_nl_4x4_q8_0_generic ggml_gemm_iq4_nl_4x4_q8_0 +#define ggml_gemm_iq4_nl_8x8_q8_0_generic ggml_gemm_iq4_nl_8x8_q8_0 #elif defined(__aarch64__) || defined(__arm__) || defined(_M_ARM) || defined(_M_ARM64) // repack.cpp #define ggml_quantize_mat_q8_K_4x8_generic ggml_quantize_mat_q8_K_4x8 #define ggml_gemv_q4_K_8x8_q8_K_generic ggml_gemv_q4_K_8x8_q8_K +#define ggml_gemv_iq4_nl_8x8_q8_0_generic ggml_gemv_iq4_nl_8x8_q8_0 #define ggml_gemv_q2_K_8x8_q8_K_generic ggml_gemv_q2_K_8x8_q8_K #define ggml_gemm_q4_K_8x8_q8_K_generic ggml_gemm_q4_K_8x8_q8_K +#define ggml_gemm_iq4_nl_8x8_q8_0_generic ggml_gemm_iq4_nl_8x8_q8_0 #define ggml_gemm_q2_K_8x8_q8_K_generic ggml_gemm_q2_K_8x8_q8_K #elif defined(__x86_64__) || defined(__i386__) || defined(_M_IX86) || defined(_M_X64) // repack.cpp @@ -80,12 +84,14 @@ #define ggml_gemv_q4_K_8x8_q8_K_generic ggml_gemv_q4_K_8x8_q8_K #define ggml_gemv_q2_K_8x8_q8_K_generic ggml_gemv_q2_K_8x8_q8_K #define ggml_gemv_iq4_nl_4x4_q8_0_generic ggml_gemv_iq4_nl_4x4_q8_0 +#define ggml_gemv_iq4_nl_8x8_q8_0_generic ggml_gemv_iq4_nl_8x8_q8_0 #define ggml_gemm_q4_0_4x4_q8_0_generic ggml_gemm_q4_0_4x4_q8_0 #define ggml_gemm_q4_0_4x8_q8_0_generic ggml_gemm_q4_0_4x8_q8_0 #define ggml_gemm_q4_0_8x8_q8_0_generic ggml_gemm_q4_0_8x8_q8_0 #define ggml_gemm_q4_K_8x8_q8_K_generic ggml_gemm_q4_K_8x8_q8_K #define ggml_gemm_q2_K_8x8_q8_K_generic ggml_gemm_q2_K_8x8_q8_K #define ggml_gemm_iq4_nl_4x4_q8_0_generic ggml_gemm_iq4_nl_4x4_q8_0 +#define ggml_gemm_iq4_nl_8x8_q8_0_generic ggml_gemm_iq4_nl_8x8_q8_0 #elif defined(__loongarch64) // quants.c #define quantize_row_q8_K_generic quantize_row_q8_K @@ -103,12 +109,14 @@ #define ggml_gemv_q4_K_8x8_q8_K_generic ggml_gemv_q4_K_8x8_q8_K #define ggml_gemv_q2_K_8x8_q8_K_generic ggml_gemv_q2_K_8x8_q8_K #define ggml_gemv_iq4_nl_4x4_q8_0_generic ggml_gemv_iq4_nl_4x4_q8_0 +#define ggml_gemv_iq4_nl_8x8_q8_0_generic ggml_gemv_iq4_nl_8x8_q8_0 #define ggml_gemm_q4_0_4x4_q8_0_generic ggml_gemm_q4_0_4x4_q8_0 #define ggml_gemm_q4_0_4x8_q8_0_generic ggml_gemm_q4_0_4x8_q8_0 #define ggml_gemm_q4_0_8x8_q8_0_generic ggml_gemm_q4_0_8x8_q8_0 #define ggml_gemm_q4_K_8x8_q8_K_generic ggml_gemm_q4_K_8x8_q8_K #define ggml_gemm_q2_K_8x8_q8_K_generic ggml_gemm_q2_K_8x8_q8_K #define ggml_gemm_iq4_nl_4x4_q8_0_generic ggml_gemm_iq4_nl_4x4_q8_0 +#define ggml_gemm_iq4_nl_8x8_q8_0_generic ggml_gemm_iq4_nl_8x8_q8_0 #elif defined(__riscv) // quants.c #define quantize_row_q8_K_generic quantize_row_q8_K @@ -133,11 +141,13 @@ #define ggml_gemv_q4_K_8x8_q8_K_generic ggml_gemv_q4_K_8x8_q8_K #define ggml_gemv_q2_K_8x8_q8_K_generic ggml_gemv_q2_K_8x8_q8_K #define ggml_gemv_iq4_nl_4x4_q8_0_generic ggml_gemv_iq4_nl_4x4_q8_0 +#define ggml_gemv_iq4_nl_8x8_q8_0_generic ggml_gemv_iq4_nl_8x8_q8_0 #define ggml_gemm_q4_0_4x4_q8_0_generic ggml_gemm_q4_0_4x4_q8_0 #define ggml_gemm_q4_0_4x8_q8_0_generic ggml_gemm_q4_0_4x8_q8_0 #define ggml_gemm_q4_K_8x8_q8_K_generic ggml_gemm_q4_K_8x8_q8_K #define ggml_gemm_q2_K_8x8_q8_K_generic ggml_gemm_q2_K_8x8_q8_K #define ggml_gemm_iq4_nl_4x4_q8_0_generic ggml_gemm_iq4_nl_4x4_q8_0 +#define ggml_gemm_iq4_nl_8x8_q8_0_generic ggml_gemm_iq4_nl_8x8_q8_0 #elif defined(__s390x__) // quants.c #define quantize_row_q8_K_generic quantize_row_q8_K @@ -164,12 +174,14 @@ #define ggml_gemv_q4_K_8x8_q8_K_generic ggml_gemv_q4_K_8x8_q8_K #define ggml_gemv_q2_K_8x8_q8_K_generic ggml_gemv_q2_K_8x8_q8_K #define ggml_gemv_iq4_nl_4x4_q8_0_generic ggml_gemv_iq4_nl_4x4_q8_0 +#define ggml_gemv_iq4_nl_8x8_q8_0_generic ggml_gemv_iq4_nl_8x8_q8_0 #define ggml_gemm_q4_0_4x4_q8_0_generic ggml_gemm_q4_0_4x4_q8_0 #define ggml_gemm_q4_0_4x8_q8_0_generic ggml_gemm_q4_0_4x8_q8_0 #define ggml_gemm_q4_0_8x8_q8_0_generic ggml_gemm_q4_0_8x8_q8_0 #define ggml_gemm_q4_K_8x8_q8_K_generic ggml_gemm_q4_K_8x8_q8_K #define ggml_gemm_q2_K_8x8_q8_K_generic ggml_gemm_q2_K_8x8_q8_K #define ggml_gemm_iq4_nl_4x4_q8_0_generic ggml_gemm_iq4_nl_4x4_q8_0 +#define ggml_gemm_iq4_nl_8x8_q8_0_generic ggml_gemm_iq4_nl_8x8_q8_0 #elif defined(__wasm__) // quants.c #define ggml_vec_dot_q4_1_q8_1_generic ggml_vec_dot_q4_1_q8_1 @@ -195,10 +207,12 @@ #define ggml_gemv_q4_K_8x8_q8_K_generic ggml_gemv_q4_K_8x8_q8_K #define ggml_gemv_q2_K_8x8_q8_K_generic ggml_gemv_q2_K_8x8_q8_K #define ggml_gemv_iq4_nl_4x4_q8_0_generic ggml_gemv_iq4_nl_4x4_q8_0 +#define ggml_gemv_iq4_nl_8x8_q8_0_generic ggml_gemv_iq4_nl_8x8_q8_0 #define ggml_gemm_q4_0_4x4_q8_0_generic ggml_gemm_q4_0_4x4_q8_0 #define ggml_gemm_q4_0_4x8_q8_0_generic ggml_gemm_q4_0_4x8_q8_0 #define ggml_gemm_q4_0_8x8_q8_0_generic ggml_gemm_q4_0_8x8_q8_0 #define ggml_gemm_q4_K_8x8_q8_K_generic ggml_gemm_q4_K_8x8_q8_K #define ggml_gemm_q2_K_8x8_q8_K_generic ggml_gemm_q2_K_8x8_q8_K #define ggml_gemm_iq4_nl_4x4_q8_0_generic ggml_gemm_iq4_nl_4x4_q8_0 +#define ggml_gemm_iq4_nl_8x8_q8_0_generic ggml_gemm_iq4_nl_8x8_q8_0 #endif diff --git a/ggml/src/ggml-cpu/arch/x86/repack.cpp b/ggml/src/ggml-cpu/arch/x86/repack.cpp index 37933a4b23f..d95bb6d8aaf 100644 --- a/ggml/src/ggml-cpu/arch/x86/repack.cpp +++ b/ggml/src/ggml-cpu/arch/x86/repack.cpp @@ -511,38 +511,34 @@ void ggml_quantize_mat_q8_K_4x8(const float * GGML_RESTRICT x, void * GGML_RESTR #endif } -void ggml_gemv_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc) { +// +// GEMV/GEMM templates +// + +#if defined(__AVX2__) || defined(__AVX512F__) + +// GEMV for 8x blocks of 32 4-bit quants with a single scale factor per block +template +static void gemv_q4_b32_8x8_q8_0_lut_avx(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc, __m256i signextendlut) { + static_assert( + std::is_same_v || + std::is_same_v, + "Unsupported block type"); + const int qk = QK8_0; const int nb = n / qk; - const int ncols_interleaved = 8; - const int blocklen = 8; - - assert (n % qk == 0); - assert (nc % ncols_interleaved == 0); - UNUSED(s); UNUSED(bs); - UNUSED(vx); - UNUSED(vy); - UNUSED(nr); - UNUSED(nc); - UNUSED(nb); - UNUSED(ncols_interleaved); - UNUSED(blocklen); -#if defined(__AVX2__) - // Lookup table to convert signed nibbles to signed bytes - __m256i signextendlut = _mm256_castsi128_si256(_mm_set_epi8(-1, -2, -3, -4, -5, -6, -7, -8, 7, 6, 5, 4, 3, 2, 1, 0)); - signextendlut = _mm256_permute2f128_si256(signextendlut, signextendlut, 0); __m128i changemask = _mm_set_epi8(15, 14, 7, 6, 13, 12, 5, 4, 11, 10, 3, 2, 9, 8, 1, 0); __m256i finalpermutemask = _mm256_set_epi32(7, 5, 3, 1, 6, 4, 2, 0); // Permute mask used for easier vector processing at later stages const __m256i m4b = _mm256_set1_epi8(0x0F); - int64_t b_nb = n / QK4_0; + int64_t b_nb = n / 32; - const block_q4_0x8 * b_ptr_start = (const block_q4_0x8 *)vx; + const block_tx8 * b_ptr_start = (const block_tx8 *)vx; const block_q8_0 * a_ptr_start = (const block_q8_0 *)vy; // Process Q8_0 blocks one by one @@ -551,17 +547,17 @@ void ggml_gemv_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo // Pointers to LHS blocks of block_q8_0 format const block_q8_0 * a_ptr = a_ptr_start + (y * nb); - // Take group of eight block_q4_0x8 structures at each pass of the loop and perform dot product operation + // Take group of eight blocks at each pass of the loop and perform dot product operation for (int64_t x = 0; x < nc / 8; x++) { // Pointers to RHS blocks - const block_q4_0x8 * b_ptr = b_ptr_start + (x * b_nb); + const block_tx8 * b_ptr = b_ptr_start + (x * b_nb); // Master FP accumulator __m256 acc_row = _mm256_setzero_ps(); for (int64_t b = 0; b < nb; b++) { - // Load 8 blocks of Q4_0 interleaved as 8 bytes (B0 - B7) + // Load 8 blocks of 32 interleaved as 8 bytes (B0 - B7) const __m256i rhs_raw_vec_0123_0 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs)); const __m256i rhs_raw_vec_4567_0 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs) + 1); const __m256i rhs_raw_vec_0123_1 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs) + 2); @@ -578,8 +574,13 @@ void ggml_gemv_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo const __m256i rhs_vec_0123_3 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_1, 4), m4b)); // B0(24-31) B1(24-31) B2(24-31) B3(24-31) const __m256i rhs_vec_4567_3 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_1, 4), m4b)); // B4(24-31) B5(24-31) B6(24-31) B7(24-31) - // Load the scale values for the 8 blocks interleaved in block_q4_0x8 - const __m256 col_scale_f32 = GGML_F32Cx8_REARRANGE_LOAD(b_ptr[b].d, changemask); + // Load the scale values for the 8 blocks interleaved in block_tx8 + __m256 col_scale_f32; + if constexpr ( + std::is_same_v || + std::is_same_v) { + col_scale_f32 = GGML_F32Cx8_REARRANGE_LOAD(b_ptr[b].d, changemask); + } // Load and convert to FP32 scale from block_q8_0 const __m256 row_scale_f32 = _mm256_set1_ps(GGML_CPU_FP16_TO_FP32(a_ptr[b].d)); @@ -620,240 +621,782 @@ void ggml_gemv_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo _mm256_storeu_ps(s + (y * nr + x * 8), acc_row); } } - return; - -#endif - ggml_gemv_q4_0_8x8_q8_0_generic(n, s, bs, vx, vy, nr, nc); } -void ggml_gemv_q4_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc) { - const int qk = QK_K; - const int nb = n / qk; - const int ncols_interleaved = 8; - const int blocklen = 8; - static const uint32_t kmask1 = 0x3f3f3f3f; - static const uint32_t kmask2 = 0x0f0f0f0f; - static const uint32_t kmask3 = 0x03030303; - - assert (n % qk == 0); - assert (nc % ncols_interleaved == 0); +// GEMM for 8x blocks of 32 4-bit quants with a single scale factor per block +template +static void gemm_q4_b32_8x8_q8_0_lut_avx(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc, __m256i signextendlut) { + static_assert( + std::is_same_v || + std::is_same_v, + "Unsupported block type"); - UNUSED(s); - UNUSED(bs); - UNUSED(vx); - UNUSED(vy); - UNUSED(nr); - UNUSED(nc); - UNUSED(nb); - UNUSED(ncols_interleaved); - UNUSED(blocklen); + const int qk = QK8_0; + const int nb = n / qk; -#if defined(__AVX2__) - // Lookup table to convert signed nibbles to signed bytes - __m256i signextendlut = _mm256_castsi128_si256(_mm_set_epi8(-1, -2, -3, -4, -5, -6, -7, -8, 7, 6, 5, 4, 3, 2, 1, 0)); - signextendlut = _mm256_permute2f128_si256(signextendlut, signextendlut, 0); - // Shuffle masks to rearrange delta and scale values to multiply with appropriate scales - __m128i deltamask = _mm_set_epi8(15, 14, 7, 6, 13, 12, 5, 4, 11, 10, 3, 2, 9, 8, 1, 0); - __m128i scalemask = _mm_set_epi8(7, 7, 3, 3, 6, 6, 2, 2, 5, 5, 1, 1, 4, 4, 0, 0); - // Permute mask used for easier vector processing at later stages - __m256i finalpermutemask = _mm256_set_epi32(7, 5, 3, 1, 6, 4, 2, 0); + const block_tx8 * b_ptr_start = (const block_tx8 *)vx; + const block_q8_0x4 * a_ptr_start = (const block_q8_0x4 *)vy; - // Mask to extract nibbles from bytes + int64_t b_nb = n / 32; + int64_t y = 0; + // Mask to mask out nibbles from packed bytes const __m256i m4b = _mm256_set1_epi8(0x0F); + const __m128i loadMask = _mm_blend_epi32(_mm_setzero_si128(), _mm_set1_epi32(0xFFFFFFFF), 3); + // Permute mask used for easier vector processing at later stages + __m256i requiredOrder = _mm256_set_epi32(3, 2, 1, 0, 7, 6, 5, 4); + int64_t xstart = 0; + int anr = nr - nr%16; // Used to align nr with boundary of 16 +#ifdef __AVX512F__ + int anc = nc - nc%16; // Used to align nc with boundary of 16 + // Mask to mask out nibbles from packed bytes expanded to 512 bit length + const __m512i m4bexpanded = _mm512_set1_epi8(0x0F); + // Lookup table to convert signed nibbles to signed bytes expanded to 512 bit length + __m512i signextendlutexpanded = _mm512_inserti32x8(_mm512_castsi256_si512(signextendlut), signextendlut, 1); - int64_t b_nb = n / QK_K; - - const block_q4_Kx8 * b_ptr_start = (const block_q4_Kx8 *)vx; - const block_q8_K * a_ptr_start = (const block_q8_K *)vy; + // Take group of four block_q8_0x4 structures at each pass of the loop and perform dot product operation + for (; y < anr / 4; y += 4) { - // Process Q8_K blocks one by one - for (int64_t y = 0; y < nr; y++) { + const block_q8_0x4 * a_ptrs[4]; - // Pointers to LHS blocks of block_q8_K format - const block_q8_K * a_ptr = a_ptr_start + (y * nb); + a_ptrs[0] = a_ptr_start + (y * nb); + for (int i = 0; i < 3; ++i) { + a_ptrs[i + 1] = a_ptrs[i] + nb; + } - // Take group of eight interleaved block_q4_K structures at each pass of the loop and perform dot product operation - for (int64_t x = 0; x < nc / 8; x++) { + // Take group of two block_tx8 structures at each pass of the loop and perform dot product operation + for (int64_t x = 0; x < anc / 8; x += 2) { - // Pointers to RHS blocks - const block_q4_Kx8 * b_ptr = b_ptr_start + (x * b_nb); + const block_tx8 * b_ptr_0 = b_ptr_start + ((x) * b_nb); + const block_tx8 * b_ptr_1 = b_ptr_start + ((x + 1) * b_nb); // Master FP accumulators - __m256 acc_row = _mm256_setzero_ps(); - __m256 acc_min_rows = _mm256_setzero_ps(); + __m512 acc_rows[16]; + for (int i = 0; i < 16; i++) { + acc_rows[i] = _mm512_setzero_ps(); + } for (int64_t b = 0; b < nb; b++) { + // Load the sixteen blocks of quantized values interleaved with each other in chunks of eight - B0,B1 ....BE,BF + const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs)); + const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs + 32)); + const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs + 64)); + const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs + 96)); + + const __m256i rhs_raw_mat_89AB_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs)); + const __m256i rhs_raw_mat_CDEF_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs + 32)); + const __m256i rhs_raw_mat_89AB_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs + 64)); + const __m256i rhs_raw_mat_CDEF_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs + 96)); + + // Save the values in the following vectors in the formats B0B1B4B5B8B9BCBD, B2B3B6B7BABBBEBF for further processing and storing of values + const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32(rhs_raw_mat_0123_0, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_0, requiredOrder), 240); + const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_0, requiredOrder), rhs_raw_mat_4567_0, 240); + const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32(rhs_raw_mat_0123_1, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_1, requiredOrder), 240); + const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_1, requiredOrder), rhs_raw_mat_4567_1, 240); + + const __m256i rhs_raw_mat_89CD_0 = _mm256_blend_epi32(rhs_raw_mat_89AB_0, _mm256_permutevar8x32_epi32(rhs_raw_mat_CDEF_0, requiredOrder), 240); + const __m256i rhs_raw_mat_ABEF_0 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_89AB_0, requiredOrder), rhs_raw_mat_CDEF_0, 240); + const __m256i rhs_raw_mat_89CD_1 = _mm256_blend_epi32(rhs_raw_mat_89AB_1, _mm256_permutevar8x32_epi32(rhs_raw_mat_CDEF_1, requiredOrder), 240); + const __m256i rhs_raw_mat_ABEF_1 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_89AB_1, requiredOrder), rhs_raw_mat_CDEF_1, 240); + + const __m512i rhs_raw_mat_014589CD_0 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_0145_0), rhs_raw_mat_89CD_0, 1); + const __m512i rhs_raw_mat_2367ABEF_0 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_2367_0), rhs_raw_mat_ABEF_0, 1); + const __m512i rhs_raw_mat_014589CD_1 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_0145_1), rhs_raw_mat_89CD_1, 1); + const __m512i rhs_raw_mat_2367ABEF_1 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_2367_1), rhs_raw_mat_ABEF_1, 1); - // Load and convert to FP32 scale from block_q8_K - const __m256 row_scale_f32 = _mm256_set1_ps((a_ptr[b].d)); - - // Load the scale values for the 8 blocks interleaved in block_q4_Kx8 - // col_scale_f32 rearranged so as to multiply with appropriate quants - const __m256 col_scale_f32 = GGML_F32Cx8_REARRANGE_LOAD(b_ptr[b].d, deltamask); - const __m256 col_dmin_f32 = GGML_F32Cx8_LOAD(b_ptr[b].dmin); + // 4-bit -> 8-bit - Sign is maintained + const __m512i rhs_mat_014589CD_0 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_014589CD_0, m4bexpanded)); //B0(0-7) B1(0-7) B4(0-7) B5(0-7) B8(0-7) B9(0-7) BC(0-7) BD(0-7) + const __m512i rhs_mat_2367ABEF_0 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_2367ABEF_0, m4bexpanded)); //B2(0-7) B3(0-7) B6(0-7) B7(0-7) BA(0-7) BB(0-7) BE(0-7) BF(0-7) - __m256i iacc_b = _mm256_setzero_si256(); - __m256i iacc_min_b = _mm256_setzero_si256(); + const __m512i rhs_mat_014589CD_1 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_014589CD_1, m4bexpanded)); //B0(8-15) B1(8-15) B4(8-15) B5(8-15) B8(8-15) B9(8-15) BC(8-15) BD(8-15) + const __m512i rhs_mat_2367ABEF_1 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_2367ABEF_1, m4bexpanded)); //B2(8-15) B3(8-15) B6(8-15) B7(8-15) BA(8-15) BB(8-15) BE(8-15) BF(8-15) - const __m256i q8sums = _mm256_loadu_si256((const __m256i * )(a_ptr[b].bsums)); - __m256i q8s = _mm256_castsi128_si256(_mm_hadd_epi16(_mm256_castsi256_si128(q8sums), _mm256_extracti128_si256(q8sums, 1))); - q8s = _mm256_permute2f128_si256(q8s, q8s, 0); + const __m512i rhs_mat_014589CD_2 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_014589CD_0, 4), m4bexpanded)); //B0(16-23) B1(16-23) B4(16-23) B5(16-23) B8(16-23) B9(16-23) BC(16-23) BD(16-23) + const __m512i rhs_mat_2367ABEF_2 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_2367ABEF_0, 4), m4bexpanded)); //B2(16-23) B3(16-23) B6(16-23) B7(16-23) BA(16-23) BB(16-23) BE(16-23) BF(16-23) - // Processes two sub blocks from each Q4_K in each iteration - for (int sb = 0; sb < QK_K / 64; sb++) { + const __m512i rhs_mat_014589CD_3 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_014589CD_1, 4), m4bexpanded)); //B0(24-31) B1(24-31) B4(24-31) B5(24-31) B8(24-31) B9(24-31) BC(24-31) BD(24-31) + const __m512i rhs_mat_2367ABEF_3 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_2367ABEF_1, 4), m4bexpanded)); //B2(24-31) B3(24-31) B6(24-31) B7(24-31) BA(24-31) BB(24-31) BE(24-31) BF(24-31) - // Load the eight block_q4_K for two sub blocks quantized values interleaved with each other in chunks of eight - B0,B1 ....B6,B7 - const __m256i rhs_raw_vec_0123_0 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + sb * 256)); - const __m256i rhs_raw_vec_4567_0 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 32 + sb * 256)); - const __m256i rhs_raw_vec_0123_1 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 64 + sb * 256)); - const __m256i rhs_raw_vec_4567_1 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 96 + sb * 256)); - const __m256i rhs_raw_vec_0123_2 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 128 + sb * 256)); - const __m256i rhs_raw_vec_4567_2 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 160 + sb * 256)); - const __m256i rhs_raw_vec_0123_3 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 192 + sb * 256)); - const __m256i rhs_raw_vec_4567_3 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 224 + sb * 256)); + // Shuffle pattern one - right side input + const __m512i rhs_mat_014589CD_0_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_0, (_MM_PERM_ENUM)136); //B0(0-3) B1(0-3) B0(0-3) B1(0-3) B4(0-3) B5(0-3) B4(0-3) B5(0-3) B8(0-3) B9(0-3) B8(0-3) B9(0-3) BC(0-3) BD(0-3) BC(0-3) BD(0-3) + const __m512i rhs_mat_2367ABEF_0_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_0, (_MM_PERM_ENUM)136); //B2(0-3) B3(0-3) B2(0-3) B3(0-3) B6(0-3) B7(0-3) B6(0-3) B7(0-3) BA(0-3) BB(0-3) BA(0-3) BB(0-3) BE(0-3) BF(0-3) BE(0-3) BF(0-3) - // 4-bit -> 8-bit - // Values of the first sub block of eight block_q4_K structures for the sb loop - const __m256i rhs_vec_0123_00 = _mm256_and_si256(rhs_raw_vec_0123_0, m4b); - const __m256i rhs_vec_4567_00 = _mm256_and_si256(rhs_raw_vec_4567_0, m4b); - const __m256i rhs_vec_0123_01 = _mm256_and_si256(rhs_raw_vec_0123_1, m4b); - const __m256i rhs_vec_4567_01 = _mm256_and_si256(rhs_raw_vec_4567_1, m4b); - const __m256i rhs_vec_0123_02 = _mm256_and_si256(rhs_raw_vec_0123_2, m4b); - const __m256i rhs_vec_4567_02 = _mm256_and_si256(rhs_raw_vec_4567_2, m4b); - const __m256i rhs_vec_0123_03 = _mm256_and_si256(rhs_raw_vec_0123_3, m4b); - const __m256i rhs_vec_4567_03 = _mm256_and_si256(rhs_raw_vec_4567_3, m4b); + const __m512i rhs_mat_014589CD_1_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_1, (_MM_PERM_ENUM)136); //B0(8-11) B1(8-11) B0(8-11) B1(8-11) B4(8-11) B5(8-11) B4(8-11) B5(8-11) B8(8-11) B9(8-11) B8(8-11) B9(8-11) BC(8-11) BD(8-11) BC(8-11) BD(8-11) + const __m512i rhs_mat_2367ABEF_1_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_1, (_MM_PERM_ENUM)136); //B2(8-11) B3(8-11) B2(8-11) B3(8-11) B6(8-11) B7(8-11) B6(8-11) B7(8-11) BA(8-11) BB(8-11) BA(8-11) BB(8-11) BE(8-11) BF(8-11) BE(8-11) BF(8-11) - // Values of the second sub block of eight block_q4_K structures when sb = 1 - const __m256i rhs_vec_0123_10 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_0, 4), m4b); - const __m256i rhs_vec_4567_10 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_0, 4), m4b); - const __m256i rhs_vec_0123_11 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_1, 4), m4b); - const __m256i rhs_vec_4567_11 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_1, 4), m4b); - const __m256i rhs_vec_0123_12 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_2, 4), m4b); - const __m256i rhs_vec_4567_12 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_2, 4), m4b); - const __m256i rhs_vec_0123_13 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_3, 4), m4b); - const __m256i rhs_vec_4567_13 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_3, 4), m4b); + const __m512i rhs_mat_014589CD_2_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_2, (_MM_PERM_ENUM)136); //B0(16-19) B1(16-19) B0(16-19) B1(16-19) B4(16-19) B5(16-19) B4(16-19) B5(16-19) B8(16-19) B9(16-19) B8(16-19) B9(16-19) BC(16-19) BD(16-19) BC(16-19) BD(16-19) + const __m512i rhs_mat_2367ABEF_2_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_2, (_MM_PERM_ENUM)136); //B2(16-19) B3(16-19) B2(16-19) B3(16-19) B6(16-19) B7(16-19) B6(16-19) B7(16-19) BA(16-19) BB(16-19) BA(16-19) BB(16-19) BE(16-19) BF(16-19) BE(16-19) BF(16-19) - uint32_t utmp_0[4], utmp_1[4]; + const __m512i rhs_mat_014589CD_3_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_3, (_MM_PERM_ENUM)136); //B0(24-27) B1(24-27) B0(24-27) B1(24-27) B4(24-27) B5(24-27) B4(24-27) B5(24-27) B8(24-27) B9(24-27) B8(24-27) B9(24-27) BC(24-27) BD(24-27) BC(24-27) BD(24-27) + const __m512i rhs_mat_2367ABEF_3_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_3, (_MM_PERM_ENUM)136); //B2(24-27) B3(24-27) B2(24-27) B3(24-27) B6(24-27) B7(24-27) B6(24-27) B7(24-27) BA(24-27) BB(24-27) BA(24-27) BB(24-27) BE(24-27) BF(24-27) BE(24-27) BF(24-27) - // Scales and Mins of corresponding sub blocks from different Q8_K structures are stored together - // The below block is for eg to extract first sub block's scales and mins from different Q4_K structures for the sb loop - memcpy(utmp_0, b_ptr[b].scales + 24 * sb, 12); - utmp_0[3] = ((utmp_0[2] >> 4) & kmask2) | (((utmp_0[1] >> 6) & kmask3) << 4); - const uint32_t uaux_0 = utmp_0[1] & kmask1; - utmp_0[1] = (utmp_0[2] & kmask2) | (((utmp_0[0] >> 6) & kmask3) << 4); - utmp_0[2] = uaux_0; - utmp_0[0] &= kmask1; + // Shuffle pattern two - right side input - // The below block is for eg to extract second sub block's scales and mins from different Q4_K structures for the sb loop - memcpy(utmp_1, b_ptr[b].scales + 12 + sb * 24, 12); - utmp_1[3] = ((utmp_1[2] >> 4) & kmask2) | (((utmp_1[1] >> 6) & kmask3) << 4); - const uint32_t uaux_1 = utmp_1[1] & kmask1; - utmp_1[1] = (utmp_1[2] & kmask2) | (((utmp_1[0] >> 6) & kmask3) << 4); - utmp_1[2] = uaux_1; - utmp_1[0] &= kmask1; + const __m512i rhs_mat_014589CD_0_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_0, (_MM_PERM_ENUM)221); //B0(4-7) B1(4-7) B0(4-7) B1(4-7) B4(4-7) B5(4-7) B4(4-7) B5(4-7) B8(4-7) B9(4-7) B8(4-7) B9(4-7) BC(4-7) BD(4-7) BC(4-7) BD(4-7) + const __m512i rhs_mat_2367ABEF_0_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_0, (_MM_PERM_ENUM)221); //B2(4-7) B3(4-7) B2(4-7) B3(4-7) B6(4-7) B7(4-7) B6(4-7) B7(4-7) BA(4-7) BB(4-7) BA(4-7) BB(4-7) BE(4-7) BF(4-7) BE(4-7) BF(4-7) - // Scales of first sub block in the sb loop - const __m128i mins_and_scales_0 = _mm_set_epi32(utmp_0[3], utmp_0[2], utmp_0[1], utmp_0[0]); - __m128i scales_rearrange_0 = _mm_shuffle_epi8(mins_and_scales_0, scalemask); - __m256i scales_0 = _mm256_cvtepu8_epi16(scales_rearrange_0); + const __m512i rhs_mat_014589CD_1_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_1, (_MM_PERM_ENUM)221); //B0(12-15) B1(12-15) B0(12-15) B1(12-15) B4(12-15) B5(12-15) B4(12-15) B5(12-15) B8(12-15) B9(12-15) B8(12-15) B9(12-15) BC(12-15) BD(12-15) BC(12-15) BD(12-15) + const __m512i rhs_mat_2367ABEF_1_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_1, (_MM_PERM_ENUM)221); //B2(12-15) B3(12-15) B2(12-15) B3(12-15) B6(12-15) B7(12-15) B6(12-15) B7(12-15) BA(12-15) BB(12-15) BA(12-15) BB(12-15) BE(12-15) BF(12-15) BE(12-15) BF(12-15) - // Scales of second sub block in the sb loop - __m128i mins_and_scales_1 = _mm_set_epi32(utmp_1[3], utmp_1[2], utmp_1[1], utmp_1[0]); - __m128i scales_rearrange_1 = _mm_shuffle_epi8(mins_and_scales_1, scalemask); - __m256i scales_1 = _mm256_cvtepu8_epi16(scales_rearrange_1); + const __m512i rhs_mat_014589CD_2_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_2, (_MM_PERM_ENUM)221); //B0(20-23) B1(20-23) B0(20-23) B1(20-23) B4(20-23) B5(20-23) B4(20-23) B5(20-23) B8(20-23) B9(20-23) B8(20-23) B9(20-23) BC(20-23) BD(20-23) BC(20-23) BD(20-23) + const __m512i rhs_mat_2367ABEF_2_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_2, (_MM_PERM_ENUM)221); //B2(20-23) B3(20-23) B2(20-23) B3(20-23) B6(20-23) B7(20-23) B6(20-23) B7(20-23) BA(20-23) BB(20-23) BA(20-23) BB(20-23) BE(20-23) BF(20-23) BE(20-23) BF(20-23) - // Mins of first and second sub block of Q4_K block are arranged side by side - __m256i mins_01 = _mm256_cvtepu8_epi16(_mm_unpacklo_epi8(_mm_shuffle_epi32(mins_and_scales_0, 78), _mm_shuffle_epi32(mins_and_scales_1, 78))); + const __m512i rhs_mat_014589CD_3_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_3, (_MM_PERM_ENUM)221); //B0(28-31) B1(28-31) B0(28-31) B1(28-31) B4(28-31) B5(28-31) B4(28-31) B5(28-31) B8(28-31) B9(28-31) B8(28-31) B9(28-31) BC(28-31) BD(28-31) BC(28-31) BD(28-31) + const __m512i rhs_mat_2367ABEF_3_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_3, (_MM_PERM_ENUM)221); //B2(28-31) B3(28-31) B2(28-31) B3(28-31) B6(28-31) B7(28-31) B6(28-31) B7(28-31) BA(28-31) BB(28-31) BA(28-31) BB(28-31) BE(28-31) BF(28-31) BE(28-31) BF(28-31) - // Load the two sub block values corresponding to sb in block_q8_K in batches of 16 bytes and replicate the same across 256 bit vector - __m256i lhs_vec_00 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + sb * 64))); - __m256i lhs_vec_01 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 16 + sb * 64))); - __m256i lhs_vec_10 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 32 + sb * 64))); - __m256i lhs_vec_11 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 48 + sb * 64))); + // Scale values - Load the weight scale values of two block_tx8 + __m512 col_scale_f32; + if constexpr ( + std::is_same_v || + std::is_same_v) { + col_scale_f32 = GGML_F32Cx8x2_LOAD(b_ptr_0[b].d, b_ptr_1[b].d); + } - lhs_vec_00 = _mm256_permute2f128_si256(lhs_vec_00, lhs_vec_00, 0); - lhs_vec_01 = _mm256_permute2f128_si256(lhs_vec_01, lhs_vec_01, 0); - lhs_vec_10 = _mm256_permute2f128_si256(lhs_vec_10, lhs_vec_10, 0); - lhs_vec_11 = _mm256_permute2f128_si256(lhs_vec_11, lhs_vec_11, 0); + // Process LHS in pairs of rows + for (int rp = 0; rp < 4; rp++) { - // Dot product done within 32 bit lanes and accumulated in the same vector - // First done for first sub block and thenn for second sub block in each sb - // B0(0-3) B4(0-3) B1(0-3) B5(0-3) B2(0-3) B6(0-3) B3(0-3) B7(0-3) with A0(0-3) - // B0(4-7) B4(4-7) B1(4-7) B5(4-7) B2(4-7) B6(4-7) B3(4-7) B7(4-7) with A0(4-7) - // ........................................................................... - // B0(28-31) B4(28-31) B1(28-31) B5(28-31) B2(28-31) B6(28-31) B3(28-31) B7(28-31) with A0(28-31) + // Load the four blocks of quantized values interleaved with each other in chunks of eight - A0,A1,A2,A3 + // Loaded as set of 128 bit vectors and repeated and stored into a 256 bit vector before again repeating into 512 bit vector + __m256i lhs_mat_ymm_0123_0 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs))); + __m256i lhs_mat_ymm_01_0 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_0, lhs_mat_ymm_0123_0, 0); + __m256i lhs_mat_ymm_23_0 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_0, lhs_mat_ymm_0123_0, 17); + __m256i lhs_mat_ymm_0123_1 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs + 32))); + __m256i lhs_mat_ymm_01_1 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_1, lhs_mat_ymm_0123_1, 0); + __m256i lhs_mat_ymm_23_1 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_1, lhs_mat_ymm_0123_1, 17); + __m256i lhs_mat_ymm_0123_2 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs + 64))); + __m256i lhs_mat_ymm_01_2 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_2, lhs_mat_ymm_0123_2, 0); + __m256i lhs_mat_ymm_23_2 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_2, lhs_mat_ymm_0123_2, 17); + __m256i lhs_mat_ymm_0123_3 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs + 96))); + __m256i lhs_mat_ymm_01_3 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_3, lhs_mat_ymm_0123_3, 0); + __m256i lhs_mat_ymm_23_3 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_3, lhs_mat_ymm_0123_3, 17); + __m512i lhs_mat_01_0 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_0), lhs_mat_ymm_01_0, 1); + __m512i lhs_mat_23_0 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_0), lhs_mat_ymm_23_0, 1); + __m512i lhs_mat_01_1 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_1), lhs_mat_ymm_01_1, 1); + __m512i lhs_mat_23_1 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_1), lhs_mat_ymm_23_1, 1); + __m512i lhs_mat_01_2 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_2), lhs_mat_ymm_01_2, 1); + __m512i lhs_mat_23_2 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_2), lhs_mat_ymm_23_2, 1); + __m512i lhs_mat_01_3 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_3), lhs_mat_ymm_01_3, 1); + __m512i lhs_mat_23_3 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_3), lhs_mat_ymm_23_3, 1); - __m256i iacc_0 = _mm256_setzero_si256(); - __m256i iacc_1 = _mm256_setzero_si256(); + // Shuffle pattern one - left side input - iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_00 ,_mm256_shuffle_epi32(rhs_vec_4567_00, 177), 170), _mm256_shuffle_epi32(lhs_vec_00, 0))); - iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_00, 177) ,rhs_vec_4567_00, 170), _mm256_shuffle_epi32(lhs_vec_00, 85))); + const __m512i lhs_mat_01_0_sp1 = _mm512_shuffle_epi32(lhs_mat_01_0, (_MM_PERM_ENUM)160); //A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) + const __m512i lhs_mat_23_0_sp1 = _mm512_shuffle_epi32(lhs_mat_23_0, (_MM_PERM_ENUM)160); //A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) - iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_01 ,_mm256_shuffle_epi32(rhs_vec_4567_01, 177), 170), _mm256_shuffle_epi32(lhs_vec_00, 170))); - iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_01, 177) ,rhs_vec_4567_01, 170), _mm256_shuffle_epi32(lhs_vec_00, 255))); + const __m512i lhs_mat_01_1_sp1 = _mm512_shuffle_epi32(lhs_mat_01_1, (_MM_PERM_ENUM)160); //A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) + const __m512i lhs_mat_23_1_sp1 = _mm512_shuffle_epi32(lhs_mat_23_1, (_MM_PERM_ENUM)160); //A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) - iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_02 ,_mm256_shuffle_epi32(rhs_vec_4567_02, 177), 170), _mm256_shuffle_epi32(lhs_vec_01, 0))); - iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_02, 177) ,rhs_vec_4567_02, 170), _mm256_shuffle_epi32(lhs_vec_01, 85))); + const __m512i lhs_mat_01_2_sp1 = _mm512_shuffle_epi32(lhs_mat_01_2, (_MM_PERM_ENUM)160); //A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) + const __m512i lhs_mat_23_2_sp1 = _mm512_shuffle_epi32(lhs_mat_23_2, (_MM_PERM_ENUM)160); //A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) - iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_03 ,_mm256_shuffle_epi32(rhs_vec_4567_03, 177), 170), _mm256_shuffle_epi32(lhs_vec_01, 170))); - iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_03, 177) ,rhs_vec_4567_03, 170), _mm256_shuffle_epi32(lhs_vec_01, 255))); + const __m512i lhs_mat_01_3_sp1 = _mm512_shuffle_epi32(lhs_mat_01_3, (_MM_PERM_ENUM)160); //A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) + const __m512i lhs_mat_23_3_sp1 = _mm512_shuffle_epi32(lhs_mat_23_3, (_MM_PERM_ENUM)160); //A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) - iacc_0 = _mm256_madd_epi16(iacc_0, scales_0); + // Shuffle pattern two - left side input - iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_10 ,_mm256_shuffle_epi32(rhs_vec_4567_10, 177), 170), _mm256_shuffle_epi32(lhs_vec_10, 0))); - iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_10, 177) ,rhs_vec_4567_10, 170), _mm256_shuffle_epi32(lhs_vec_10, 85))); + const __m512i lhs_mat_01_0_sp2 = _mm512_shuffle_epi32(lhs_mat_01_0, (_MM_PERM_ENUM)245); //A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) + const __m512i lhs_mat_23_0_sp2 = _mm512_shuffle_epi32(lhs_mat_23_0, (_MM_PERM_ENUM)245); //A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) - iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_11 ,_mm256_shuffle_epi32(rhs_vec_4567_11, 177), 170), _mm256_shuffle_epi32(lhs_vec_10, 170))); - iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_11, 177) ,rhs_vec_4567_11, 170), _mm256_shuffle_epi32(lhs_vec_10, 255))); + const __m512i lhs_mat_01_1_sp2 = _mm512_shuffle_epi32(lhs_mat_01_1, (_MM_PERM_ENUM)245); //A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) + const __m512i lhs_mat_23_1_sp2 = _mm512_shuffle_epi32(lhs_mat_23_1, (_MM_PERM_ENUM)245); //A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) - iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_12 ,_mm256_shuffle_epi32(rhs_vec_4567_12, 177), 170), _mm256_shuffle_epi32(lhs_vec_11, 0))); - iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_12, 177) ,rhs_vec_4567_12, 170), _mm256_shuffle_epi32(lhs_vec_11, 85))); + const __m512i lhs_mat_01_2_sp2 = _mm512_shuffle_epi32(lhs_mat_01_2, (_MM_PERM_ENUM)245); //A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) + const __m512i lhs_mat_23_2_sp2 = _mm512_shuffle_epi32(lhs_mat_23_2, (_MM_PERM_ENUM)245); //A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) - iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_13 ,_mm256_shuffle_epi32(rhs_vec_4567_13, 177), 170), _mm256_shuffle_epi32(lhs_vec_11, 170))); - iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_13, 177) ,rhs_vec_4567_13, 170), _mm256_shuffle_epi32(lhs_vec_11, 255))); + const __m512i lhs_mat_01_3_sp2 = _mm512_shuffle_epi32(lhs_mat_01_3, (_MM_PERM_ENUM)245); //A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) + const __m512i lhs_mat_23_3_sp2 = _mm512_shuffle_epi32(lhs_mat_23_3, (_MM_PERM_ENUM)245); //A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) - iacc_1 = _mm256_madd_epi16(iacc_1, scales_1); + // The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane + // Resembles MMLAs into 2x2 matrices in ARM Version + const __m512i zero = _mm512_setzero_epi32(); + __m512i iacc_mat_00_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp1, rhs_mat_014589CD_3_sp1), lhs_mat_01_2_sp1, rhs_mat_014589CD_2_sp1), lhs_mat_01_1_sp1, rhs_mat_014589CD_1_sp1), lhs_mat_01_0_sp1, rhs_mat_014589CD_0_sp1); + __m512i iacc_mat_01_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp1, rhs_mat_2367ABEF_3_sp1), lhs_mat_01_2_sp1, rhs_mat_2367ABEF_2_sp1), lhs_mat_01_1_sp1, rhs_mat_2367ABEF_1_sp1), lhs_mat_01_0_sp1, rhs_mat_2367ABEF_0_sp1); + __m512i iacc_mat_10_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp1, rhs_mat_014589CD_3_sp1), lhs_mat_23_2_sp1, rhs_mat_014589CD_2_sp1), lhs_mat_23_1_sp1, rhs_mat_014589CD_1_sp1), lhs_mat_23_0_sp1, rhs_mat_014589CD_0_sp1); + __m512i iacc_mat_11_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp1, rhs_mat_2367ABEF_3_sp1), lhs_mat_23_2_sp1, rhs_mat_2367ABEF_2_sp1), lhs_mat_23_1_sp1, rhs_mat_2367ABEF_1_sp1), lhs_mat_23_0_sp1, rhs_mat_2367ABEF_0_sp1); + __m512i iacc_mat_00_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp2, rhs_mat_014589CD_3_sp2), lhs_mat_01_2_sp2, rhs_mat_014589CD_2_sp2), lhs_mat_01_1_sp2, rhs_mat_014589CD_1_sp2), lhs_mat_01_0_sp2, rhs_mat_014589CD_0_sp2); + __m512i iacc_mat_01_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp2, rhs_mat_2367ABEF_3_sp2), lhs_mat_01_2_sp2, rhs_mat_2367ABEF_2_sp2), lhs_mat_01_1_sp2, rhs_mat_2367ABEF_1_sp2), lhs_mat_01_0_sp2, rhs_mat_2367ABEF_0_sp2); + __m512i iacc_mat_10_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp2, rhs_mat_014589CD_3_sp2), lhs_mat_23_2_sp2, rhs_mat_014589CD_2_sp2), lhs_mat_23_1_sp2, rhs_mat_014589CD_1_sp2), lhs_mat_23_0_sp2, rhs_mat_014589CD_0_sp2); + __m512i iacc_mat_11_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp2, rhs_mat_2367ABEF_3_sp2), lhs_mat_23_2_sp2, rhs_mat_2367ABEF_2_sp2), lhs_mat_23_1_sp2, rhs_mat_2367ABEF_1_sp2), lhs_mat_23_0_sp2, rhs_mat_2367ABEF_0_sp2); - // Accumulate the iacc value for one sb - __m256i iacc_sb = _mm256_add_epi32(iacc_0, iacc_1); + // Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block + __m512i iacc_mat_00 = _mm512_add_epi32(iacc_mat_00_sp1, iacc_mat_00_sp2); + __m512i iacc_mat_01 = _mm512_add_epi32(iacc_mat_01_sp1, iacc_mat_01_sp2); + __m512i iacc_mat_10 = _mm512_add_epi32(iacc_mat_10_sp1, iacc_mat_10_sp2); + __m512i iacc_mat_11 = _mm512_add_epi32(iacc_mat_11_sp1, iacc_mat_11_sp2); - // Broadcast the bsums of the two sub blocks of the iteration of Q8_K across the vector - // Multiply-Add with corresponding mins of Q4_Kx8 with bsums - __m256i q8s_sb = _mm256_shuffle_epi32(q8s, 0); - __m256i iacc_min_sb = _mm256_madd_epi16(q8s_sb, mins_01); - q8s = _mm256_bsrli_epi128(q8s, 4); - // Accumulate for the complete block - iacc_b = _mm256_add_epi32(iacc_b, iacc_sb); - iacc_min_b = _mm256_add_epi32(iacc_min_b, iacc_min_sb); + // Straighten out to make 4 row vectors + __m512i iacc_row_0 = _mm512_mask_blend_epi32(0xCCCC, iacc_mat_00, _mm512_shuffle_epi32(iacc_mat_01, (_MM_PERM_ENUM)78)); + __m512i iacc_row_1 = _mm512_mask_blend_epi32(0xCCCC, _mm512_shuffle_epi32(iacc_mat_00, (_MM_PERM_ENUM)78), iacc_mat_01); + __m512i iacc_row_2 = _mm512_mask_blend_epi32(0xCCCC, iacc_mat_10, _mm512_shuffle_epi32(iacc_mat_11, (_MM_PERM_ENUM)78)); + __m512i iacc_row_3 = _mm512_mask_blend_epi32(0xCCCC, _mm512_shuffle_epi32(iacc_mat_10, (_MM_PERM_ENUM)78), iacc_mat_11); + + // Load the scale(d) values for all the 4 Q8_0 blocks and repeat it across lanes + const __m128i row_scale_f16 = _mm_shuffle_epi32(_mm_maskload_epi32((int const*)(a_ptrs[rp][b].d), loadMask), 68); + const __m512 row_scale_f32 = GGML_F32Cx16_REPEAT_LOAD(row_scale_f16); + + // Multiply with appropiate scales and accumulate + acc_rows[rp * 4] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_0), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 0)), acc_rows[rp * 4]); + acc_rows[rp * 4 + 1] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_1), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 85)), acc_rows[rp * 4 + 1]); + acc_rows[rp * 4 + 2] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_2), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 170)), acc_rows[rp * 4 + 2]); + acc_rows[rp * 4 + 3] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_3), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 255)), acc_rows[rp * 4 + 3]); } + } - // Multiply-Add with scale values for the complete super block - acc_row = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_b), _mm256_mul_ps(col_scale_f32, row_scale_f32), acc_row); - acc_min_rows = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_min_b), _mm256_mul_ps(col_dmin_f32, row_scale_f32), acc_min_rows); + // Store the accumulated values + for (int i = 0; i < 16; i++) { + _mm512_storeu_ps((float *)(s + ((y * 4 + i) * bs + x * 8)), acc_rows[i]); + } + } + } + + // Take a block_q8_0x4 structures at each pass of the loop and perform dot product operation + for (; y < nr / 4; y ++) { + const block_q8_0x4 * a_ptr = a_ptr_start + (y * nb); + + // Take group of two block_tx8 structures at each pass of the loop and perform dot product operation + for (int64_t x = 0; x < anc / 8; x += 2) { + + const block_tx8 * b_ptr_0 = b_ptr_start + ((x) * b_nb); + const block_tx8 * b_ptr_1 = b_ptr_start + ((x + 1) * b_nb); + // Master FP accumulators + __m512 acc_rows[4]; + for (int i = 0; i < 4; i++) { + acc_rows[i] = _mm512_setzero_ps(); } - // Accumulated output values permuted so as to be stored in appropriate order post accumulation - acc_row = _mm256_permutevar8x32_ps(acc_row, finalpermutemask); - _mm256_storeu_ps(s + (y * nr + x * 8), _mm256_sub_ps(acc_row, acc_min_rows)); + for (int64_t b = 0; b < nb; b++) { + // Load the sixteen blocks of quantized values interleaved with each other in chunks of eight - B0,B1 ....BE,BF + const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs)); + const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs + 32)); + const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs + 64)); + const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs + 96)); + + const __m256i rhs_raw_mat_89AB_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs)); + const __m256i rhs_raw_mat_CDEF_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs + 32)); + const __m256i rhs_raw_mat_89AB_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs + 64)); + const __m256i rhs_raw_mat_CDEF_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs + 96)); + + // Save the values in the following vectors in the formats B0B1B4B5, B2B3B6B7 for further processing and storing of valuess + const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32(rhs_raw_mat_0123_0, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_0, requiredOrder), 240); + const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_0, requiredOrder), rhs_raw_mat_4567_0, 240); + const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32(rhs_raw_mat_0123_1, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_1, requiredOrder), 240); + const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_1, requiredOrder), rhs_raw_mat_4567_1, 240); + + const __m256i rhs_raw_mat_89CD_0 = _mm256_blend_epi32(rhs_raw_mat_89AB_0, _mm256_permutevar8x32_epi32(rhs_raw_mat_CDEF_0, requiredOrder), 240); + const __m256i rhs_raw_mat_ABEF_0 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_89AB_0, requiredOrder), rhs_raw_mat_CDEF_0, 240); + const __m256i rhs_raw_mat_89CD_1 = _mm256_blend_epi32(rhs_raw_mat_89AB_1, _mm256_permutevar8x32_epi32(rhs_raw_mat_CDEF_1, requiredOrder), 240); + const __m256i rhs_raw_mat_ABEF_1 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_89AB_1, requiredOrder), rhs_raw_mat_CDEF_1, 240); + + const __m512i rhs_raw_mat_014589CD_0 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_0145_0), rhs_raw_mat_89CD_0, 1); + const __m512i rhs_raw_mat_2367ABEF_0 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_2367_0), rhs_raw_mat_ABEF_0, 1); + const __m512i rhs_raw_mat_014589CD_1 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_0145_1), rhs_raw_mat_89CD_1, 1); + const __m512i rhs_raw_mat_2367ABEF_1 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_2367_1), rhs_raw_mat_ABEF_1, 1); + + // 4-bit -> 8-bit - Sign is maintained + const __m512i rhs_mat_014589CD_0 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_014589CD_0, m4bexpanded)); //B0(0-7) B1(0-7) B4(0-7) B5(0-7) B8(0-7) B9(0-7) BC(0-7) BD(0-7) + const __m512i rhs_mat_2367ABEF_0 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_2367ABEF_0, m4bexpanded)); //B2(0-7) B3(0-7) B6(0-7) B7(0-7) BA(0-7) BB(0-7) BE(0-7) BF(0-7) + + const __m512i rhs_mat_014589CD_1 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_014589CD_1, m4bexpanded)); //B0(8-15) B1(8-15) B4(8-15) B5(8-15) B8(8-15) B9(8-15) BC(8-15) BD(8-15) + const __m512i rhs_mat_2367ABEF_1 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_2367ABEF_1, m4bexpanded)); //B2(8-15) B3(8-15) B6(8-15) B7(8-15) BA(8-15) BB(8-15) BE(8-15) BF(8-15) + + const __m512i rhs_mat_014589CD_2 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_014589CD_0, 4), m4bexpanded)); //B0(16-23) B1(16-23) B4(16-23) B5(16-23) B8(16-23) B9(16-23) BC(16-23) BD(16-23) + const __m512i rhs_mat_2367ABEF_2 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_2367ABEF_0, 4), m4bexpanded)); //B2(16-23) B3(16-23) B6(16-23) B7(16-23) BA(16-23) BB(16-23) BE(16-23) BF(16-23) + + const __m512i rhs_mat_014589CD_3 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_014589CD_1, 4), m4bexpanded)); //B0(24-31) B1(24-31) B4(24-31) B5(24-31) B8(24-31) B9(24-31) BC(24-31) BD(24-31) + const __m512i rhs_mat_2367ABEF_3 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_2367ABEF_1, 4), m4bexpanded)); //B2(24-31) B3(24-31) B6(24-31) B7(24-31) BA(24-31) BB(24-31) BE(24-31) BF(24-31) + + // Shuffle pattern one - right side input + const __m512i rhs_mat_014589CD_0_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_0, (_MM_PERM_ENUM)136); //B0(0-3) B1(0-3) B0(0-3) B1(0-3) B4(0-3) B5(0-3) B4(0-3) B5(0-3) B8(0-3) B9(0-3) B8(0-3) B9(0-3) BC(0-3) BD(0-3) BC(0-3) BD(0-3) + const __m512i rhs_mat_2367ABEF_0_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_0, (_MM_PERM_ENUM)136); //B2(0-3) B3(0-3) B2(0-3) B3(0-3) B6(0-3) B7(0-3) B6(0-3) B7(0-3) BA(0-3) BB(0-3) BA(0-3) BB(0-3) BE(0-3) BF(0-3) BE(0-3) BF(0-3) + + const __m512i rhs_mat_014589CD_1_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_1, (_MM_PERM_ENUM)136); //B0(8-11) B1(8-11) B0(8-11) B1(8-11) B4(8-11) B5(8-11) B4(8-11) B5(8-11) B8(8-11) B9(8-11) B8(8-11) B9(8-11) BC(8-11) BD(8-11) BC(8-11) BD(8-11) + const __m512i rhs_mat_2367ABEF_1_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_1, (_MM_PERM_ENUM)136); //B2(8-11) B3(8-11) B2(8-11) B3(8-11) B6(8-11) B7(8-11) B6(8-11) B7(8-11) BA(8-11) BB(8-11) BA(8-11) BB(8-11) BE(8-11) BF(8-11) BE(8-11) BF(8-11) + + const __m512i rhs_mat_014589CD_2_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_2, (_MM_PERM_ENUM)136); //B0(16-19) B1(16-19) B0(16-19) B1(16-19) B4(16-19) B5(16-19) B4(16-19) B5(16-19) B8(16-19) B9(16-19) B8(16-19) B9(16-19) BC(16-19) BD(16-19) BC(16-19) BD(16-19) + const __m512i rhs_mat_2367ABEF_2_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_2, (_MM_PERM_ENUM)136); //B2(16-19) B3(16-19) B2(16-19) B3(16-19) B6(16-19) B7(16-19) B6(16-19) B7(16-19) BA(16-19) BB(16-19) BA(16-19) BB(16-19) BE(16-19) BF(16-19) BE(16-19) BF(16-19) + + const __m512i rhs_mat_014589CD_3_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_3, (_MM_PERM_ENUM)136); //B0(24-27) B1(24-27) B0(24-27) B1(24-27) B4(24-27) B5(24-27) B4(24-27) B5(24-27) B8(24-27) B9(24-27) B8(24-27) B9(24-27) BC(24-27) BD(24-27) BC(24-27) BD(24-27) + const __m512i rhs_mat_2367ABEF_3_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_3, (_MM_PERM_ENUM)136); //B2(24-27) B3(24-27) B2(24-27) B3(24-27) B6(24-27) B7(24-27) B6(24-27) B7(24-27) BA(24-27) BB(24-27) BA(24-27) BB(24-27) BE(24-27) BF(24-27) BE(24-27) BF(24-27) + + // Shuffle pattern two - right side input + + const __m512i rhs_mat_014589CD_0_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_0, (_MM_PERM_ENUM)221); //B0(4-7) B1(4-7) B0(4-7) B1(4-7) B4(4-7) B5(4-7) B4(4-7) B5(4-7) B8(4-7) B9(4-7) B8(4-7) B9(4-7) BC(4-7) BD(4-7) BC(4-7) BD(4-7) + const __m512i rhs_mat_2367ABEF_0_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_0, (_MM_PERM_ENUM)221); //B2(4-7) B3(4-7) B2(4-7) B3(4-7) B6(4-7) B7(4-7) B6(4-7) B7(4-7) BA(4-7) BB(4-7) BA(4-7) BB(4-7) BE(4-7) BF(4-7) BE(4-7) BF(4-7) + + const __m512i rhs_mat_014589CD_1_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_1, (_MM_PERM_ENUM)221); //B0(12-15) B1(12-15) B0(12-15) B1(12-15) B4(12-15) B5(12-15) B4(12-15) B5(12-15) B8(12-15) B9(12-15) B8(12-15) B9(12-15) BC(12-15) BD(12-15) BC(12-15) BD(12-15) + const __m512i rhs_mat_2367ABEF_1_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_1, (_MM_PERM_ENUM)221); //B2(12-15) B3(12-15) B2(12-15) B3(12-15) B6(12-15) B7(12-15) B6(12-15) B7(12-15) BA(12-15) BB(12-15) BA(12-15) BB(12-15) BE(12-15) BF(12-15) BE(12-15) BF(12-15) + + const __m512i rhs_mat_014589CD_2_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_2, (_MM_PERM_ENUM)221); //B0(20-23) B1(20-23) B0(20-23) B1(20-23) B4(20-23) B5(20-23) B4(20-23) B5(20-23) B8(20-23) B9(20-23) B8(20-23) B9(20-23) BC(20-23) BD(20-23) BC(20-23) BD(20-23) + const __m512i rhs_mat_2367ABEF_2_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_2, (_MM_PERM_ENUM)221); //B2(20-23) B3(20-23) B2(20-23) B3(20-23) B6(20-23) B7(20-23) B6(20-23) B7(20-23) BA(20-23) BB(20-23) BA(20-23) BB(20-23) BE(20-23) BF(20-23) BE(20-23) BF(20-23) + + const __m512i rhs_mat_014589CD_3_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_3, (_MM_PERM_ENUM)221); //B0(28-31) B1(28-31) B0(28-31) B1(28-31) B4(28-31) B5(28-31) B4(28-31) B5(28-31) B8(28-31) B9(28-31) B8(28-31) B9(28-31) BC(28-31) BD(28-31) BC(28-31) BD(28-31) + const __m512i rhs_mat_2367ABEF_3_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_3, (_MM_PERM_ENUM)221); //B2(28-31) B3(28-31) B2(28-31) B3(28-31) B6(28-31) B7(28-31) B6(28-31) B7(28-31) BA(28-31) BB(28-31) BA(28-31) BB(28-31) BE(28-31) BF(28-31) BE(28-31) BF(28-31) + + + // Scale values - Load the weight scale values of two block_tx8 + __m512 col_scale_f32; + if constexpr ( + std::is_same_v || + std::is_same_v) { + col_scale_f32 = GGML_F32Cx8x2_LOAD(b_ptr_0[b].d, b_ptr_1[b].d); + } + + // Load the four blocks of quantized values interleaved with each other in chunks of eight - A0,A1,A2,A3 + // Loaded as set of 128 bit vectors and repeated and stored into a 256 bit vector before again repeating into 512 bit vector + __m256i lhs_mat_ymm_0123_0 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs))); + __m256i lhs_mat_ymm_01_0 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_0, lhs_mat_ymm_0123_0, 0); + __m256i lhs_mat_ymm_23_0 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_0, lhs_mat_ymm_0123_0, 17); + __m256i lhs_mat_ymm_0123_1 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs + 32))); + __m256i lhs_mat_ymm_01_1 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_1, lhs_mat_ymm_0123_1, 0); + __m256i lhs_mat_ymm_23_1 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_1, lhs_mat_ymm_0123_1, 17); + __m256i lhs_mat_ymm_0123_2 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs + 64))); + __m256i lhs_mat_ymm_01_2 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_2, lhs_mat_ymm_0123_2, 0); + __m256i lhs_mat_ymm_23_2 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_2, lhs_mat_ymm_0123_2, 17); + __m256i lhs_mat_ymm_0123_3 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs + 96))); + __m256i lhs_mat_ymm_01_3 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_3, lhs_mat_ymm_0123_3, 0); + __m256i lhs_mat_ymm_23_3 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_3, lhs_mat_ymm_0123_3, 17); + + __m512i lhs_mat_01_0 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_0), lhs_mat_ymm_01_0, 1); + __m512i lhs_mat_23_0 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_0), lhs_mat_ymm_23_0, 1); + __m512i lhs_mat_01_1 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_1), lhs_mat_ymm_01_1, 1); + __m512i lhs_mat_23_1 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_1), lhs_mat_ymm_23_1, 1); + __m512i lhs_mat_01_2 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_2), lhs_mat_ymm_01_2, 1); + __m512i lhs_mat_23_2 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_2), lhs_mat_ymm_23_2, 1); + __m512i lhs_mat_01_3 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_3), lhs_mat_ymm_01_3, 1); + __m512i lhs_mat_23_3 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_3), lhs_mat_ymm_23_3, 1); + + // Shuffle pattern one - left side input + + const __m512i lhs_mat_01_0_sp1 = _mm512_shuffle_epi32(lhs_mat_01_0, (_MM_PERM_ENUM)160); //A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) + const __m512i lhs_mat_23_0_sp1 = _mm512_shuffle_epi32(lhs_mat_23_0, (_MM_PERM_ENUM)160); //A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) + + const __m512i lhs_mat_01_1_sp1 = _mm512_shuffle_epi32(lhs_mat_01_1, (_MM_PERM_ENUM)160); //A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) + const __m512i lhs_mat_23_1_sp1 = _mm512_shuffle_epi32(lhs_mat_23_1, (_MM_PERM_ENUM)160); //A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) + + const __m512i lhs_mat_01_2_sp1 = _mm512_shuffle_epi32(lhs_mat_01_2, (_MM_PERM_ENUM)160); //A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) + const __m512i lhs_mat_23_2_sp1 = _mm512_shuffle_epi32(lhs_mat_23_2, (_MM_PERM_ENUM)160); //A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) + + const __m512i lhs_mat_01_3_sp1 = _mm512_shuffle_epi32(lhs_mat_01_3, (_MM_PERM_ENUM)160); //A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) + const __m512i lhs_mat_23_3_sp1 = _mm512_shuffle_epi32(lhs_mat_23_3, (_MM_PERM_ENUM)160); //A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) + + // Shuffle pattern two - left side input + + const __m512i lhs_mat_01_0_sp2 = _mm512_shuffle_epi32(lhs_mat_01_0, (_MM_PERM_ENUM)245); //A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) + const __m512i lhs_mat_23_0_sp2 = _mm512_shuffle_epi32(lhs_mat_23_0, (_MM_PERM_ENUM)245); //A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) + + const __m512i lhs_mat_01_1_sp2 = _mm512_shuffle_epi32(lhs_mat_01_1, (_MM_PERM_ENUM)245); //A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) + const __m512i lhs_mat_23_1_sp2 = _mm512_shuffle_epi32(lhs_mat_23_1, (_MM_PERM_ENUM)245); //A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) + + const __m512i lhs_mat_01_2_sp2 = _mm512_shuffle_epi32(lhs_mat_01_2, (_MM_PERM_ENUM)245); //A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) + const __m512i lhs_mat_23_2_sp2 = _mm512_shuffle_epi32(lhs_mat_23_2, (_MM_PERM_ENUM)245); //A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) + + const __m512i lhs_mat_01_3_sp2 = _mm512_shuffle_epi32(lhs_mat_01_3, (_MM_PERM_ENUM)245); //A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) + const __m512i lhs_mat_23_3_sp2 = _mm512_shuffle_epi32(lhs_mat_23_3, (_MM_PERM_ENUM)245); //A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) + + // The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane + // Resembles MMLAs into 2x2 matrices in ARM Version + const __m512i zero = _mm512_setzero_epi32(); + __m512i iacc_mat_00_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp1, rhs_mat_014589CD_3_sp1), lhs_mat_01_2_sp1, rhs_mat_014589CD_2_sp1), lhs_mat_01_1_sp1, rhs_mat_014589CD_1_sp1), lhs_mat_01_0_sp1, rhs_mat_014589CD_0_sp1); + __m512i iacc_mat_01_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp1, rhs_mat_2367ABEF_3_sp1), lhs_mat_01_2_sp1, rhs_mat_2367ABEF_2_sp1), lhs_mat_01_1_sp1, rhs_mat_2367ABEF_1_sp1), lhs_mat_01_0_sp1, rhs_mat_2367ABEF_0_sp1); + __m512i iacc_mat_10_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp1, rhs_mat_014589CD_3_sp1), lhs_mat_23_2_sp1, rhs_mat_014589CD_2_sp1), lhs_mat_23_1_sp1, rhs_mat_014589CD_1_sp1), lhs_mat_23_0_sp1, rhs_mat_014589CD_0_sp1); + __m512i iacc_mat_11_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp1, rhs_mat_2367ABEF_3_sp1), lhs_mat_23_2_sp1, rhs_mat_2367ABEF_2_sp1), lhs_mat_23_1_sp1, rhs_mat_2367ABEF_1_sp1), lhs_mat_23_0_sp1, rhs_mat_2367ABEF_0_sp1); + __m512i iacc_mat_00_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp2, rhs_mat_014589CD_3_sp2), lhs_mat_01_2_sp2, rhs_mat_014589CD_2_sp2), lhs_mat_01_1_sp2, rhs_mat_014589CD_1_sp2), lhs_mat_01_0_sp2, rhs_mat_014589CD_0_sp2); + __m512i iacc_mat_01_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp2, rhs_mat_2367ABEF_3_sp2), lhs_mat_01_2_sp2, rhs_mat_2367ABEF_2_sp2), lhs_mat_01_1_sp2, rhs_mat_2367ABEF_1_sp2), lhs_mat_01_0_sp2, rhs_mat_2367ABEF_0_sp2); + __m512i iacc_mat_10_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp2, rhs_mat_014589CD_3_sp2), lhs_mat_23_2_sp2, rhs_mat_014589CD_2_sp2), lhs_mat_23_1_sp2, rhs_mat_014589CD_1_sp2), lhs_mat_23_0_sp2, rhs_mat_014589CD_0_sp2); + __m512i iacc_mat_11_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp2, rhs_mat_2367ABEF_3_sp2), lhs_mat_23_2_sp2, rhs_mat_2367ABEF_2_sp2), lhs_mat_23_1_sp2, rhs_mat_2367ABEF_1_sp2), lhs_mat_23_0_sp2, rhs_mat_2367ABEF_0_sp2); + + // Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block + __m512i iacc_mat_00 = _mm512_add_epi32(iacc_mat_00_sp1, iacc_mat_00_sp2); + __m512i iacc_mat_01 = _mm512_add_epi32(iacc_mat_01_sp1, iacc_mat_01_sp2); + __m512i iacc_mat_10 = _mm512_add_epi32(iacc_mat_10_sp1, iacc_mat_10_sp2); + __m512i iacc_mat_11 = _mm512_add_epi32(iacc_mat_11_sp1, iacc_mat_11_sp2); + + + // Straighten out to make 4 row vectors + __m512i iacc_row_0 = _mm512_mask_blend_epi32(0xCCCC, iacc_mat_00, _mm512_shuffle_epi32(iacc_mat_01, (_MM_PERM_ENUM)78)); + __m512i iacc_row_1 = _mm512_mask_blend_epi32(0xCCCC, _mm512_shuffle_epi32(iacc_mat_00, (_MM_PERM_ENUM)78), iacc_mat_01); + __m512i iacc_row_2 = _mm512_mask_blend_epi32(0xCCCC, iacc_mat_10, _mm512_shuffle_epi32(iacc_mat_11, (_MM_PERM_ENUM)78)); + __m512i iacc_row_3 = _mm512_mask_blend_epi32(0xCCCC, _mm512_shuffle_epi32(iacc_mat_10, (_MM_PERM_ENUM)78), iacc_mat_11); + + // Load the scale(d) values for all the 4 Q8_0 blocks and repeat it across lanes + const __m128i row_scale_f16 = _mm_shuffle_epi32(_mm_maskload_epi32((int const*)(a_ptr[b].d), loadMask), 68); + const __m512 row_scale_f32 = GGML_F32Cx16_REPEAT_LOAD(row_scale_f16); + + // Multiply with appropiate scales and accumulate + acc_rows[0] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_0), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 0)), acc_rows[0]); + acc_rows[1] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_1), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 85)), acc_rows[1]); + acc_rows[2] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_2), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 170)), acc_rows[2]); + acc_rows[3] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_3), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 255)), acc_rows[3]); + } + + // Store the accumulated values + for (int i = 0; i < 4; i++) { + _mm512_storeu_ps((float *)(s + ((y * 4 + i) * bs + x * 8)), acc_rows[i]); + } } } + if (anc != nc) { + xstart = anc/8; + y = 0; + } +#endif // __AVX512F__ -#else - UNUSED(kmask1); - UNUSED(kmask2); - UNUSED(kmask3); - ggml_gemv_q4_K_8x8_q8_K_generic(n, s, bs, vx, vy, nr, nc); + // Take group of four block_q8_0x4 structures at each pass of the loop and perform dot product operation + + for (; y < anr / 4; y += 4) { + const block_q8_0x4 * a_ptrs[4]; + + a_ptrs[0] = a_ptr_start + (y * nb); + for (int i = 0; i < 3; ++i) { + a_ptrs[i + 1] = a_ptrs[i] + nb; + } + + // Take group of eight block_tx8 structures at each pass of the loop and perform dot product operation + for (int64_t x = xstart; x < nc / 8; x++) { + + const block_tx8 * b_ptr = b_ptr_start + (x * b_nb); + + // Master FP accumulators + __m256 acc_rows[16]; + for (int i = 0; i < 16; i++) { + acc_rows[i] = _mm256_setzero_ps(); + } + + for (int64_t b = 0; b < nb; b++) { + // Load the eight blocks of quantized values interleaved with each other in chunks of eight - B0,B1 ....B6,B7 + const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs)); + const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs + 32)); + const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs + 64)); + const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs + 96)); + + // Save the values in the following vectors in the formats B0B1B4B5, B2B3B6B7 for further processing and storing of values + const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32(rhs_raw_mat_0123_0, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_0, requiredOrder), 240); + const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_0, requiredOrder), rhs_raw_mat_4567_0, 240); + const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32(rhs_raw_mat_0123_1, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_1, requiredOrder), 240); + const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_1, requiredOrder), rhs_raw_mat_4567_1, 240); + + // 4-bit -> 8-bit - Sign is maintained + const __m256i rhs_mat_0145_0 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_0145_0, m4b)); //B0(0-7) B1(0-7) B4(0-7) B5(0-7) + const __m256i rhs_mat_2367_0 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_2367_0, m4b)); //B2(0-7) B3(0-7) B6(0-7) B7(0-7) + + const __m256i rhs_mat_0145_1 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_0145_1, m4b)); //B0(8-15) B1(8-15) B4(8-15) B5(8-15) + const __m256i rhs_mat_2367_1 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_2367_1, m4b)); //B2(8-15) B3(8-15) B6(8-15) B7(8-15) + + const __m256i rhs_mat_0145_2 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_0145_0, 4), m4b)); //B0(16-23) B1(16-23) B4(16-23) B5(16-23) + const __m256i rhs_mat_2367_2 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_2367_0, 4), m4b)); //B2(16-23) B3(16-23) B6(16-23) B7(16-23) + + const __m256i rhs_mat_0145_3 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_0145_1, 4), m4b)); //B0(24-31) B1(24-31) B4(24-31) B5(24-31) + const __m256i rhs_mat_2367_3 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_2367_1, 4), m4b)); //B2(24-31) B3(24-31) B6(24-31) B7(24-31) + + // Shuffle pattern one - right side input + const __m256i rhs_mat_0145_0_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_0, 136); //B0(0-3) B1(0-3) B0(0-3) B1(0-3) B4(0-3) B5(0-3) B4(0-3) B5(0-3) + const __m256i rhs_mat_2367_0_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_0, 136); //B2(0-3) B3(0-3) B2(0-3) B3(0-3) B6(0-3) B7(0-3) B6(0-3) B7(0-3) + + const __m256i rhs_mat_0145_1_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_1, 136); //B0(8-11) B1(8-11) B0(8-11) B1(8-11) B4(8-11) B5(8-11) B4(8-11) B5(8-11) + const __m256i rhs_mat_2367_1_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_1, 136); //B2(8-11) B3(8-11) B2(8-11) B3(8-11) B6(8-11) B7(8-11) B6(8-11) B7(8-11) + + const __m256i rhs_mat_0145_2_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_2, 136); //B0(16-19) B1(16-19) B0(16-19) B1(16-19) B4(16-19) B5(16-19) B4(16-19) B5(16-19) + const __m256i rhs_mat_2367_2_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_2, 136); //B2(16-19) B3(16-19) B2(16-19) B3(16-19) B6(16-19) B7(16-19) B6(16-19) B7(16-19) + + const __m256i rhs_mat_0145_3_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_3, 136); //B0(24-27) B1(24-27) B0(24-27) B1(24-27) B4(24-27) B5(24-27) B4(24-27) B5(24-27) + const __m256i rhs_mat_2367_3_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_3, 136); //B2(24-27) B3(24-27) B2(24-27) B3(24-27) B6(24-27) B7(24-27) B6(24-27) B7(24-27) + + // Shuffle pattern two - right side input + + const __m256i rhs_mat_0145_0_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_0, 221); //B0(4-7) B1(4-7) B0(4-7) B1(4-7) B4(4-7) B5(4-7) B4(4-7) B5(4-7) + const __m256i rhs_mat_2367_0_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_0, 221); //B2(4-7) B3(4-7) B2(4-7) B3(4-7) B6(4-7) B7(4-7) B6(4-7) B7(4-7) + + const __m256i rhs_mat_0145_1_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_1, 221); //B0(12-15) B1(12-15) B0(12-15) B1(12-15) B4(12-15) B5(12-15) B4(12-15) B5(12-15) + const __m256i rhs_mat_2367_1_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_1, 221); //B2(12-15) B3(12-15) B2(12-15) B3(12-15) B6(12-15) B7(12-15) B6(12-15) B7(12-15) + + const __m256i rhs_mat_0145_2_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_2, 221); //B0(20-23) B1(20-23) B0(20-23) B1(20-23) B4(20-23) B5(20-23) B4(20-23) B5(20-23) + const __m256i rhs_mat_2367_2_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_2, 221); //B2(20-23) B3(20-23) B2(20-23) B3(20-23) B6(20-23) B7(20-23) B6(20-23) B7(20-23) + + const __m256i rhs_mat_0145_3_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_3, 221); //B0(28-31) B1(28-31) B0(28-31) B1(28-31) B4(28-31) B5(28-31) B4(28-31) B5(28-31) + const __m256i rhs_mat_2367_3_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_3, 221); //B2(28-31) B3(28-31) B2(28-31) B3(28-31) B6(28-31) B7(28-31) B6(28-31) B7(28-31) + + // Scale values - Load the wight scale values of block_tx8 + __m256 col_scale_f32; + if constexpr ( + std::is_same_v || + std::is_same_v) { + col_scale_f32 = GGML_F32Cx8_LOAD(b_ptr[b].d); + } + + // Process LHS in groups of four + for (int rp = 0; rp < 4; rp++) { + // Load the four blocks of quantized values interleaved with each other in chunks of eight - A0,A1,A2,A3 + // Loaded as set of 128 bit vectors and repeated into a 256 bit vector + __m256i lhs_mat_0123_0 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs))); + __m256i lhs_mat_01_0 = _mm256_permute2f128_si256(lhs_mat_0123_0, lhs_mat_0123_0, 0); + __m256i lhs_mat_23_0 = _mm256_permute2f128_si256(lhs_mat_0123_0, lhs_mat_0123_0, 17); + __m256i lhs_mat_0123_1 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs + 32))); + __m256i lhs_mat_01_1 = _mm256_permute2f128_si256(lhs_mat_0123_1, lhs_mat_0123_1, 0); + __m256i lhs_mat_23_1 = _mm256_permute2f128_si256(lhs_mat_0123_1, lhs_mat_0123_1, 17); + __m256i lhs_mat_0123_2 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs + 64))); + __m256i lhs_mat_01_2 = _mm256_permute2f128_si256(lhs_mat_0123_2, lhs_mat_0123_2, 0); + __m256i lhs_mat_23_2 = _mm256_permute2f128_si256(lhs_mat_0123_2, lhs_mat_0123_2, 17); + __m256i lhs_mat_0123_3 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs + 96))); + __m256i lhs_mat_01_3 = _mm256_permute2f128_si256(lhs_mat_0123_3, lhs_mat_0123_3, 0); + __m256i lhs_mat_23_3 = _mm256_permute2f128_si256(lhs_mat_0123_3, lhs_mat_0123_3, 17); + + // Shuffle pattern one - left side input + const __m256i lhs_mat_01_0_sp1 = _mm256_shuffle_epi32(lhs_mat_01_0, 160); //A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) + const __m256i lhs_mat_23_0_sp1 = _mm256_shuffle_epi32(lhs_mat_23_0, 160); //A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) + + const __m256i lhs_mat_01_1_sp1 = _mm256_shuffle_epi32(lhs_mat_01_1, 160); //A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) + const __m256i lhs_mat_23_1_sp1 = _mm256_shuffle_epi32(lhs_mat_23_1, 160); //A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) + + const __m256i lhs_mat_01_2_sp1 = _mm256_shuffle_epi32(lhs_mat_01_2, 160); //A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) + const __m256i lhs_mat_23_2_sp1 = _mm256_shuffle_epi32(lhs_mat_23_2, 160); //A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) + + const __m256i lhs_mat_01_3_sp1 = _mm256_shuffle_epi32(lhs_mat_01_3, 160); //A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) + const __m256i lhs_mat_23_3_sp1 = _mm256_shuffle_epi32(lhs_mat_23_3, 160); //A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) + + // Shuffle pattern two - left side input + const __m256i lhs_mat_01_0_sp2 = _mm256_shuffle_epi32(lhs_mat_01_0, 245); //A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) + const __m256i lhs_mat_23_0_sp2 = _mm256_shuffle_epi32(lhs_mat_23_0, 245); //A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) + + const __m256i lhs_mat_01_1_sp2 = _mm256_shuffle_epi32(lhs_mat_01_1, 245); //A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) + const __m256i lhs_mat_23_1_sp2 = _mm256_shuffle_epi32(lhs_mat_23_1, 245); //A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) + + const __m256i lhs_mat_01_2_sp2 = _mm256_shuffle_epi32(lhs_mat_01_2, 245); //A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) + const __m256i lhs_mat_23_2_sp2 = _mm256_shuffle_epi32(lhs_mat_23_2, 245); //A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) + + const __m256i lhs_mat_01_3_sp2 = _mm256_shuffle_epi32(lhs_mat_01_3, 245); //A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) + const __m256i lhs_mat_23_3_sp2 = _mm256_shuffle_epi32(lhs_mat_23_3, 245); //A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) + + // The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane + // Resembles MMLAs into 2x2 matrices in ARM Version + const __m256i zero = _mm256_setzero_si256(); + __m256i iacc_mat_00_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp1, rhs_mat_0145_3_sp1), lhs_mat_01_2_sp1, rhs_mat_0145_2_sp1), lhs_mat_01_1_sp1, rhs_mat_0145_1_sp1), lhs_mat_01_0_sp1, rhs_mat_0145_0_sp1); + __m256i iacc_mat_01_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp1, rhs_mat_2367_3_sp1), lhs_mat_01_2_sp1, rhs_mat_2367_2_sp1), lhs_mat_01_1_sp1, rhs_mat_2367_1_sp1), lhs_mat_01_0_sp1, rhs_mat_2367_0_sp1); + __m256i iacc_mat_10_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp1, rhs_mat_0145_3_sp1), lhs_mat_23_2_sp1, rhs_mat_0145_2_sp1), lhs_mat_23_1_sp1, rhs_mat_0145_1_sp1), lhs_mat_23_0_sp1, rhs_mat_0145_0_sp1); + __m256i iacc_mat_11_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp1, rhs_mat_2367_3_sp1), lhs_mat_23_2_sp1, rhs_mat_2367_2_sp1), lhs_mat_23_1_sp1, rhs_mat_2367_1_sp1), lhs_mat_23_0_sp1, rhs_mat_2367_0_sp1); + __m256i iacc_mat_00_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp2, rhs_mat_0145_3_sp2), lhs_mat_01_2_sp2, rhs_mat_0145_2_sp2), lhs_mat_01_1_sp2, rhs_mat_0145_1_sp2), lhs_mat_01_0_sp2, rhs_mat_0145_0_sp2); + __m256i iacc_mat_01_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp2, rhs_mat_2367_3_sp2), lhs_mat_01_2_sp2, rhs_mat_2367_2_sp2), lhs_mat_01_1_sp2, rhs_mat_2367_1_sp2), lhs_mat_01_0_sp2, rhs_mat_2367_0_sp2); + __m256i iacc_mat_10_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp2, rhs_mat_0145_3_sp2), lhs_mat_23_2_sp2, rhs_mat_0145_2_sp2), lhs_mat_23_1_sp2, rhs_mat_0145_1_sp2), lhs_mat_23_0_sp2, rhs_mat_0145_0_sp2); + __m256i iacc_mat_11_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp2, rhs_mat_2367_3_sp2), lhs_mat_23_2_sp2, rhs_mat_2367_2_sp2), lhs_mat_23_1_sp2, rhs_mat_2367_1_sp2), lhs_mat_23_0_sp2, rhs_mat_2367_0_sp2); + + // Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block + __m256i iacc_mat_00 = _mm256_add_epi32(iacc_mat_00_sp1, iacc_mat_00_sp2); + __m256i iacc_mat_01 = _mm256_add_epi32(iacc_mat_01_sp1, iacc_mat_01_sp2); + __m256i iacc_mat_10 = _mm256_add_epi32(iacc_mat_10_sp1, iacc_mat_10_sp2); + __m256i iacc_mat_11 = _mm256_add_epi32(iacc_mat_11_sp1, iacc_mat_11_sp2); + + // Straighten out to make 4 row vectors + __m256i iacc_row_0 = _mm256_blend_epi32(iacc_mat_00, _mm256_shuffle_epi32(iacc_mat_01, 78), 204); + __m256i iacc_row_1 = _mm256_blend_epi32(_mm256_shuffle_epi32(iacc_mat_00, 78), iacc_mat_01, 204); + __m256i iacc_row_2 = _mm256_blend_epi32(iacc_mat_10, _mm256_shuffle_epi32(iacc_mat_11, 78), 204); + __m256i iacc_row_3 = _mm256_blend_epi32(_mm256_shuffle_epi32(iacc_mat_10, 78), iacc_mat_11, 204); + + // Load the scale(d) values for all the 4 Q8_0 blocks and repeat it across lanes + const __m256 row_scale_f32 = GGML_F32Cx8_REPEAT_LOAD(a_ptrs[rp][b].d, loadMask); + + // Multiply with appropiate scales and accumulate + acc_rows[rp * 4] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_0), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 0)), acc_rows[rp * 4]); + acc_rows[rp * 4 + 1] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_1), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 85)), acc_rows[rp * 4 + 1]); + acc_rows[rp * 4 + 2] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_2), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 170)), acc_rows[rp * 4 + 2]); + acc_rows[rp * 4 + 3] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_3), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 255)), acc_rows[rp * 4 + 3]); + } + } + + // Store the accumulated values + for (int i = 0; i < 16; i++) { + _mm256_storeu_ps((float *)(s + ((y * 4 + i) * bs + x * 8)), acc_rows[i]); + } + } + } + + // Take a block_q8_0x4 structures at each pass of the loop and perform dot product operation + for (; y < nr / 4; y ++) { + const block_q8_0x4 * a_ptr = a_ptr_start + (y * nb); + + // Load the eight blocks of quantized values interleaved with each other in chunks of eight - B0,B1 ....B6,B7 + for (int64_t x = xstart; x < nc / 8; x++) { + const block_tx8 * b_ptr = b_ptr_start + (x * b_nb); + + // Master FP accumulators + __m256 acc_rows[4]; + for (int i = 0; i < 4; i++) { + acc_rows[i] = _mm256_setzero_ps(); + } + + for (int64_t b = 0; b < nb; b++) { + // Load the eight block_q8_0 quantized values interleaved with each other in chunks of eight - B0,B1 ....B6,B7 + const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs)); + const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs + 32)); + const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs + 64)); + const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs + 96)); + + // Save the values in the following vectors in the formats B0B1B4B5, B2B3B6B7 for further processing and storing of valuess + const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32(rhs_raw_mat_0123_0, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_0, requiredOrder), 240); + const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_0, requiredOrder), rhs_raw_mat_4567_0, 240); + const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32(rhs_raw_mat_0123_1, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_1, requiredOrder), 240); + const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_1, requiredOrder), rhs_raw_mat_4567_1, 240); + + // 4-bit -> 8-bit - Sign is maintained + const __m256i rhs_mat_0145_0 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_0145_0, m4b)); //B0(0-7) B1(0-7) B4(0-7) B5(0-7) + const __m256i rhs_mat_2367_0 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_2367_0, m4b)); //B2(0-7) B3(0-7) B6(0-7) B7(0-7) + + const __m256i rhs_mat_0145_1 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_0145_1, m4b)); //B0(8-15) B1(8-15) B4(8-15) B5(8-15) + const __m256i rhs_mat_2367_1 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_2367_1, m4b)); //B2(8-15) B3(8-15) B6(8-15) B7(8-15) + + const __m256i rhs_mat_0145_2 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_0145_0, 4), m4b)); //B0(16-23) B1(16-23) B4(16-23) B5(16-23) + const __m256i rhs_mat_2367_2 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_2367_0, 4), m4b)); //B2(16-23) B3(16-23) B6(16-23) B7(16-23) + + const __m256i rhs_mat_0145_3 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_0145_1, 4), m4b)); //B0(24-31) B1(24-31) B4(24-31) B5(24-31) + const __m256i rhs_mat_2367_3 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_2367_1, 4), m4b)); //B2(24-31) B3(24-31) B6(24-31) B7(24-31) + + // Shuffle pattern one - right side input + const __m256i rhs_mat_0145_0_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_0, 136); //B0(0-3) B1(0-3) B0(0-3) B1(0-3) B4(0-3) B5(0-3) B4(0-3) B5(0-3) + const __m256i rhs_mat_2367_0_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_0, 136); //B2(0-3) B3(0-3) B2(0-3) B3(0-3) B6(0-3) B7(0-3) B6(0-3) B7(0-3) + + const __m256i rhs_mat_0145_1_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_1, 136); //B0(8-11) B1(8-11) B0(8-11) B1(8-11) B4(8-11) B5(8-11) B4(8-11) B5(8-11) + const __m256i rhs_mat_2367_1_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_1, 136); //B2(8-11) B3(8-11) B2(8-11) B3(8-11) B6(8-11) B7(8-11) B6(8-11) B7(8-11) + + const __m256i rhs_mat_0145_2_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_2, 136); //B0(16-19) B1(16-19) B0(16-19) B1(16-19) B4(16-19) B5(16-19) B4(16-19) B5(16-19) + const __m256i rhs_mat_2367_2_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_2, 136); //B2(16-19) B3(16-19) B2(16-19) B3(16-19) B6(16-19) B7(16-19) B6(16-19) B7(16-19) + + const __m256i rhs_mat_0145_3_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_3, 136); //B0(24-27) B1(24-27) B0(24-27) B1(24-27) B4(24-27) B5(24-27) B4(24-27) B5(24-27) + const __m256i rhs_mat_2367_3_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_3, 136); //B2(24-27) B3(24-27) B2(24-27) B3(24-27) B6(24-27) B7(24-27) B6(24-27) B7(24-27) + + // Shuffle pattern two - right side input + + const __m256i rhs_mat_0145_0_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_0, 221); //B0(4-7) B1(4-7) B0(4-7) B1(4-7) B4(4-7) B5(4-7) B4(4-7) B5(4-7) + const __m256i rhs_mat_2367_0_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_0, 221); //B2(4-7) B3(4-7) B2(4-7) B3(4-7) B6(4-7) B7(4-7) B6(4-7) B7(4-7) + + const __m256i rhs_mat_0145_1_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_1, 221); //B0(12-15) B1(12-15) B0(12-15) B1(12-15) B4(12-15) B5(12-15) B4(12-15) B5(12-15) + const __m256i rhs_mat_2367_1_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_1, 221); //B2(12-15) B3(12-15) B2(12-15) B3(12-15) B6(12-15) B7(12-15) B6(12-15) B7(12-15) + + const __m256i rhs_mat_0145_2_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_2, 221); //B0(20-23) B1(20-23) B0(20-23) B1(20-23) B4(20-23) B5(20-23) B4(20-23) B5(20-23) + const __m256i rhs_mat_2367_2_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_2, 221); //B2(20-23) B3(20-23) B2(20-23) B3(20-23) B6(20-23) B7(20-23) B6(20-23) B7(20-23) + + const __m256i rhs_mat_0145_3_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_3, 221); //B0(28-31) B1(28-31) B0(28-31) B1(28-31) B4(28-31) B5(28-31) B4(28-31) B5(28-31) + const __m256i rhs_mat_2367_3_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_3, 221); //B2(28-31) B3(28-31) B2(28-31) B3(28-31) B6(28-31) B7(28-31) B6(28-31) B7(28-31) + + // Scale values - Load the wight scale values of block_tx8 + __m256 col_scale_f32; + if constexpr ( + std::is_same_v || + std::is_same_v) { + col_scale_f32 = GGML_F32Cx8_LOAD(b_ptr[b].d); + } + + // Load the four blocks of quantized values interleaved with each other in chunks of eight - A0,A1,A2,A3 + // Loaded as set of 128 bit vectors and repeated into a 256 bit vector + __m256i lhs_mat_0123_0 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs))); + __m256i lhs_mat_01_0 = _mm256_permute2f128_si256(lhs_mat_0123_0, lhs_mat_0123_0, 0); + __m256i lhs_mat_23_0 = _mm256_permute2f128_si256(lhs_mat_0123_0, lhs_mat_0123_0, 17); + __m256i lhs_mat_0123_1 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs + 32))); + __m256i lhs_mat_01_1 = _mm256_permute2f128_si256(lhs_mat_0123_1, lhs_mat_0123_1, 0); + __m256i lhs_mat_23_1 = _mm256_permute2f128_si256(lhs_mat_0123_1, lhs_mat_0123_1, 17); + __m256i lhs_mat_0123_2 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs + 64))); + __m256i lhs_mat_01_2 = _mm256_permute2f128_si256(lhs_mat_0123_2, lhs_mat_0123_2, 0); + __m256i lhs_mat_23_2 = _mm256_permute2f128_si256(lhs_mat_0123_2, lhs_mat_0123_2, 17); + __m256i lhs_mat_0123_3 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs + 96))); + __m256i lhs_mat_01_3 = _mm256_permute2f128_si256(lhs_mat_0123_3, lhs_mat_0123_3, 0); + __m256i lhs_mat_23_3 = _mm256_permute2f128_si256(lhs_mat_0123_3, lhs_mat_0123_3, 17); + + // Shuffle pattern one - left side input + + const __m256i lhs_mat_01_0_sp1 = _mm256_shuffle_epi32(lhs_mat_01_0, 160); //A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) + const __m256i lhs_mat_23_0_sp1 = _mm256_shuffle_epi32(lhs_mat_23_0, 160); //A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) + + const __m256i lhs_mat_01_1_sp1 = _mm256_shuffle_epi32(lhs_mat_01_1, 160); //A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) + const __m256i lhs_mat_23_1_sp1 = _mm256_shuffle_epi32(lhs_mat_23_1, 160); //A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) + + const __m256i lhs_mat_01_2_sp1 = _mm256_shuffle_epi32(lhs_mat_01_2, 160); //A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) + const __m256i lhs_mat_23_2_sp1 = _mm256_shuffle_epi32(lhs_mat_23_2, 160); //A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) + + const __m256i lhs_mat_01_3_sp1 = _mm256_shuffle_epi32(lhs_mat_01_3, 160); //A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) + const __m256i lhs_mat_23_3_sp1 = _mm256_shuffle_epi32(lhs_mat_23_3, 160); //A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) + + // Shuffle pattern two - left side input + + const __m256i lhs_mat_01_0_sp2 = _mm256_shuffle_epi32(lhs_mat_01_0, 245); //A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) + const __m256i lhs_mat_23_0_sp2 = _mm256_shuffle_epi32(lhs_mat_23_0, 245); //A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) + + const __m256i lhs_mat_01_1_sp2 = _mm256_shuffle_epi32(lhs_mat_01_1, 245); //A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) + const __m256i lhs_mat_23_1_sp2 = _mm256_shuffle_epi32(lhs_mat_23_1, 245); //A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) + + const __m256i lhs_mat_01_2_sp2 = _mm256_shuffle_epi32(lhs_mat_01_2, 245); //A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) + const __m256i lhs_mat_23_2_sp2 = _mm256_shuffle_epi32(lhs_mat_23_2, 245); //A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) + + const __m256i lhs_mat_01_3_sp2 = _mm256_shuffle_epi32(lhs_mat_01_3, 245); //A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) + const __m256i lhs_mat_23_3_sp2 = _mm256_shuffle_epi32(lhs_mat_23_3, 245); //A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) + + // The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane + // Resembles MMLAs into 2x2 matrices in ARM Version + const __m256i zero = _mm256_setzero_si256(); + __m256i iacc_mat_00_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp1, rhs_mat_0145_3_sp1), lhs_mat_01_2_sp1, rhs_mat_0145_2_sp1), lhs_mat_01_1_sp1, rhs_mat_0145_1_sp1), lhs_mat_01_0_sp1, rhs_mat_0145_0_sp1); + __m256i iacc_mat_01_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp1, rhs_mat_2367_3_sp1), lhs_mat_01_2_sp1, rhs_mat_2367_2_sp1), lhs_mat_01_1_sp1, rhs_mat_2367_1_sp1), lhs_mat_01_0_sp1, rhs_mat_2367_0_sp1); + __m256i iacc_mat_10_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp1, rhs_mat_0145_3_sp1), lhs_mat_23_2_sp1, rhs_mat_0145_2_sp1), lhs_mat_23_1_sp1, rhs_mat_0145_1_sp1), lhs_mat_23_0_sp1, rhs_mat_0145_0_sp1); + __m256i iacc_mat_11_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp1, rhs_mat_2367_3_sp1), lhs_mat_23_2_sp1, rhs_mat_2367_2_sp1), lhs_mat_23_1_sp1, rhs_mat_2367_1_sp1), lhs_mat_23_0_sp1, rhs_mat_2367_0_sp1); + __m256i iacc_mat_00_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp2, rhs_mat_0145_3_sp2), lhs_mat_01_2_sp2, rhs_mat_0145_2_sp2), lhs_mat_01_1_sp2, rhs_mat_0145_1_sp2), lhs_mat_01_0_sp2, rhs_mat_0145_0_sp2); + __m256i iacc_mat_01_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp2, rhs_mat_2367_3_sp2), lhs_mat_01_2_sp2, rhs_mat_2367_2_sp2), lhs_mat_01_1_sp2, rhs_mat_2367_1_sp2), lhs_mat_01_0_sp2, rhs_mat_2367_0_sp2); + __m256i iacc_mat_10_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp2, rhs_mat_0145_3_sp2), lhs_mat_23_2_sp2, rhs_mat_0145_2_sp2), lhs_mat_23_1_sp2, rhs_mat_0145_1_sp2), lhs_mat_23_0_sp2, rhs_mat_0145_0_sp2); + __m256i iacc_mat_11_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp2, rhs_mat_2367_3_sp2), lhs_mat_23_2_sp2, rhs_mat_2367_2_sp2), lhs_mat_23_1_sp2, rhs_mat_2367_1_sp2), lhs_mat_23_0_sp2, rhs_mat_2367_0_sp2); + + // Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block + __m256i iacc_mat_00 = _mm256_add_epi32(iacc_mat_00_sp1, iacc_mat_00_sp2); + __m256i iacc_mat_01 = _mm256_add_epi32(iacc_mat_01_sp1, iacc_mat_01_sp2); + __m256i iacc_mat_10 = _mm256_add_epi32(iacc_mat_10_sp1, iacc_mat_10_sp2); + __m256i iacc_mat_11 = _mm256_add_epi32(iacc_mat_11_sp1, iacc_mat_11_sp2); + + + // Straighten out to make 4 row vectors + __m256i iacc_row_0 = _mm256_blend_epi32(iacc_mat_00, _mm256_shuffle_epi32(iacc_mat_01, 78), 204); + __m256i iacc_row_1 = _mm256_blend_epi32(_mm256_shuffle_epi32(iacc_mat_00, 78), iacc_mat_01, 204); + __m256i iacc_row_2 = _mm256_blend_epi32(iacc_mat_10, _mm256_shuffle_epi32(iacc_mat_11, 78), 204); + __m256i iacc_row_3 = _mm256_blend_epi32(_mm256_shuffle_epi32(iacc_mat_10, 78), iacc_mat_11, 204); + + // Load the scale(d) values for all the 4 Q8_0 blocks and repeat it across lanes + const __m256 row_scale_f32 = GGML_F32Cx8_REPEAT_LOAD(a_ptr[b].d, loadMask); + + // Multiply with appropiate scales and accumulate + acc_rows[0] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_0), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 0)), acc_rows[0]); + acc_rows[1] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_1), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 85)), acc_rows[1]); + acc_rows[2] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_2), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 170)), acc_rows[2]); + acc_rows[3] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_3), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 255)), acc_rows[3]); + } + + // Store the accumulated values + for (int i = 0; i < 4; i++) { + _mm256_storeu_ps((float *)(s + ((y * 4 + i) * bs + x * 8)), acc_rows[i]); + } + } + } +} + +#endif // defined(__AVX2__) || defined(__AVX512F__) + +void ggml_gemv_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc) { +#if defined(__AVX2__) || defined(__AVX512F__) + { + // Lookup table to convert signed nibbles to signed bytes + __m256i signextendlut = _mm256_castsi128_si256(_mm_set_epi8(-1, -2, -3, -4, -5, -6, -7, -8, 7, 6, 5, 4, 3, 2, 1, 0)); + signextendlut = _mm256_permute2f128_si256(signextendlut, signextendlut, 0); + + gemv_q4_b32_8x8_q8_0_lut_avx(n, s, bs, vx, vy, nr, nc, signextendlut); + + return; + } #endif + + ggml_gemv_q4_0_8x8_q8_0_generic(n, s, bs, vx, vy, nr, nc); } -void ggml_gemv_q2_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc) { +void ggml_gemv_q4_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc) { const int qk = QK_K; const int nb = n / qk; const int ncols_interleaved = 8; const int blocklen = 8; + static const uint32_t kmask1 = 0x3f3f3f3f; + static const uint32_t kmask2 = 0x0f0f0f0f; + static const uint32_t kmask3 = 0x03030303; assert (n % qk == 0); assert (nc % ncols_interleaved == 0); @@ -872,21 +1415,18 @@ void ggml_gemv_q2_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo // Lookup table to convert signed nibbles to signed bytes __m256i signextendlut = _mm256_castsi128_si256(_mm_set_epi8(-1, -2, -3, -4, -5, -6, -7, -8, 7, 6, 5, 4, 3, 2, 1, 0)); signextendlut = _mm256_permute2f128_si256(signextendlut, signextendlut, 0); - // Shuffle masks to rearrange delta values to multiply with appropriate scales + // Shuffle masks to rearrange delta and scale values to multiply with appropriate scales __m128i deltamask = _mm_set_epi8(15, 14, 7, 6, 13, 12, 5, 4, 11, 10, 3, 2, 9, 8, 1, 0); + __m128i scalemask = _mm_set_epi8(7, 7, 3, 3, 6, 6, 2, 2, 5, 5, 1, 1, 4, 4, 0, 0); // Permute mask used for easier vector processing at later stages __m256i finalpermutemask = _mm256_set_epi32(7, 5, 3, 1, 6, 4, 2, 0); - const __m256i m3b = _mm256_set1_epi8(3); - const __m128i m4b_sse = _mm_set1_epi8(0xF); - - //Mask to get appropriate scales - __m128i scalemask1 = _mm_set_epi8(14,14,6,6,12,12,4,4,10,10,2,2,8,8,0,0); - __m128i scalemask2 = _mm_set_epi8(15,15,7,7,13,13,5,5,11,11,3,3,9,9,1,1); + // Mask to extract nibbles from bytes + const __m256i m4b = _mm256_set1_epi8(0x0F); int64_t b_nb = n / QK_K; - const block_q2_Kx8 * b_ptr_start = (const block_q2_Kx8 *)vx; + const block_q4_Kx8 * b_ptr_start = (const block_q4_Kx8 *)vx; const block_q8_K * a_ptr_start = (const block_q8_K *)vy; // Process Q8_K blocks one by one @@ -895,11 +1435,11 @@ void ggml_gemv_q2_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo // Pointers to LHS blocks of block_q8_K format const block_q8_K * a_ptr = a_ptr_start + (y * nb); - // Take group of eight interleaved block_q2_K structures at each pass of the loop and perform dot product operation - for(int64_t x = 0; x < nc / 8; x++) { + // Take group of eight interleaved block_q4_K structures at each pass of the loop and perform dot product operation + for (int64_t x = 0; x < nc / 8; x++) { // Pointers to RHS blocks - const block_q2_Kx8 * b_ptr = b_ptr_start + (x * b_nb); + const block_q4_Kx8 * b_ptr = b_ptr_start + (x * b_nb); // Master FP accumulators __m256 acc_row = _mm256_setzero_ps(); @@ -907,10 +1447,10 @@ void ggml_gemv_q2_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo for (int64_t b = 0; b < nb; b++) { - // Load and convert to FP32 delta from block_q8_K + // Load and convert to FP32 scale from block_q8_K const __m256 row_scale_f32 = _mm256_set1_ps((a_ptr[b].d)); - // Load the delta values for the 8 blocks interleaved in block_q2_Kx8 + // Load the scale values for the 8 blocks interleaved in block_q4_Kx8 // col_scale_f32 rearranged so as to multiply with appropriate quants const __m256 col_scale_f32 = GGML_F32Cx8_REARRANGE_LOAD(b_ptr[b].d, deltamask); const __m256 col_dmin_f32 = GGML_F32Cx8_LOAD(b_ptr[b].dmin); @@ -918,11 +1458,15 @@ void ggml_gemv_q2_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo __m256i iacc_b = _mm256_setzero_si256(); __m256i iacc_min_b = _mm256_setzero_si256(); - // Processes eight sub blocks from each Q2_K in each iteration - for(int sb = 0; sb < QK_K / 128; sb++) { + const __m256i q8sums = _mm256_loadu_si256((const __m256i * )(a_ptr[b].bsums)); + __m256i q8s = _mm256_castsi128_si256(_mm_hadd_epi16(_mm256_castsi256_si128(q8sums), _mm256_extracti128_si256(q8sums, 1))); + q8s = _mm256_permute2f128_si256(q8s, q8s, 0); - // Load the eight block_q2_K for eight sub blocks quantized values interleaved with each other in chunks of eight - B0,B1 ....B6,B7 - const __m256i rhs_raw_vec_0123_0 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + sb * 256)); + // Processes two sub blocks from each Q4_K in each iteration + for (int sb = 0; sb < QK_K / 64; sb++) { + + // Load the eight block_q4_K for two sub blocks quantized values interleaved with each other in chunks of eight - B0,B1 ....B6,B7 + const __m256i rhs_raw_vec_0123_0 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + sb * 256)); const __m256i rhs_raw_vec_4567_0 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 32 + sb * 256)); const __m256i rhs_raw_vec_0123_1 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 64 + sb * 256)); const __m256i rhs_raw_vec_4567_1 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 96 + sb * 256)); @@ -931,982 +1475,482 @@ void ggml_gemv_q2_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo const __m256i rhs_raw_vec_0123_3 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 192 + sb * 256)); const __m256i rhs_raw_vec_4567_3 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 224 + sb * 256)); - // 2-bit -> 8-bit - // Values of the 0th,2nd,4th,6th sub blocks of eight block_q2_K structures for the sb loop - const __m256i rhs_vec_0123_00 = _mm256_and_si256(rhs_raw_vec_0123_0, m3b); //B00(0-7) B01(0-7) B02(0-7) B03(0-7) - const __m256i rhs_vec_0123_20 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_0, 2), m3b); //B20(0-7) B21(0-7) B22(0-7) B23(0-7) - const __m256i rhs_vec_0123_40 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_0, 4), m3b); //B40(0-7) B41(0-7) B42(0-7) B43(0-7) - const __m256i rhs_vec_0123_60 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_0, 6), m3b); //B60(0-7) B61(0-7) B62(0-7) B63(0-7) - - const __m256i rhs_vec_4567_00 = _mm256_and_si256(rhs_raw_vec_4567_0, m3b); //B04(0-7) B05(0-7) B06(0-7) B07(0-7) - const __m256i rhs_vec_4567_20 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_0, 2), m3b); //B24(0-7) B25(0-7) B26(0-7) B27(0-7) - const __m256i rhs_vec_4567_40 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_0, 4), m3b); //B44(0-7) B45(0-7) B46(0-7) B47(0-7) - const __m256i rhs_vec_4567_60 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_0, 6), m3b); //B64(0-7) B65(0-7) B66(0-7) B67(0-7) - - const __m256i rhs_vec_0123_01 = _mm256_and_si256(rhs_raw_vec_0123_1, m3b); //B00(8-15) B01(8-15) B02(8-15) B03(8-15) - const __m256i rhs_vec_0123_21 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_1, 2), m3b); //B20(8-15) B21(8-15) B22(8-15) B23(8-15) - const __m256i rhs_vec_0123_41 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_1, 4), m3b); //B40(8-15) B41(8-15) B42(8-15) B43(8-15) - const __m256i rhs_vec_0123_61 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_1, 6), m3b); //B60(8-15) B61(8-15) B62(8-15) B63(8-15) - - const __m256i rhs_vec_4567_01 = _mm256_and_si256(rhs_raw_vec_4567_1, m3b); //B04(8-15) B05(8-15) B06(8-15) B07(8-15) - const __m256i rhs_vec_4567_21 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_1, 2), m3b); //B24(8-15) B25(8-15) B26(8-15) B27(8-15) - const __m256i rhs_vec_4567_41 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_1, 4), m3b); //B44(8-15) B45(8-15) B46(8-15) B47(8-15) - const __m256i rhs_vec_4567_61 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_1, 6), m3b); //B64(8-15) B65(8-15) B66(8-15) B67(8-15) - - // Values of the 1st,3rd,5th,7th sub blocks of eight block_q2_K structures for the sb loop - const __m256i rhs_vec_0123_10 = _mm256_and_si256(rhs_raw_vec_0123_2, m3b); //B10(0-7) B11(0-7) B12(0-7) B13(0-7) - const __m256i rhs_vec_0123_30 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_2, 2), m3b); //B30(0-7) B31(0-7) B32(0-7) B33(0-7) - const __m256i rhs_vec_0123_50 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_2, 4), m3b); //B50(0-7) B51(0-7) B52(0-7) B53(0-7) - const __m256i rhs_vec_0123_70 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_2, 6), m3b); //B70(0-7) B71(0-7) B72(0-7) B73(0-7) - - const __m256i rhs_vec_4567_10 = _mm256_and_si256(rhs_raw_vec_4567_2, m3b); //B14(0-7) B15(0-7) B16(0-7) B17(0-7) - const __m256i rhs_vec_4567_30 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_2, 2), m3b); //B34(0-7) B35(0-7) B36(0-7) B37(0-7) - const __m256i rhs_vec_4567_50 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_2, 4), m3b); //B54(0-7) B55(0-7) B56(0-7) B57(0-7) - const __m256i rhs_vec_4567_70 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_2, 6), m3b); //B74(0-7) B75(0-7) B76(0-7) B77(0-7) - - const __m256i rhs_vec_0123_11 = _mm256_and_si256(rhs_raw_vec_0123_3, m3b); //B10(8-15) B11(8-15) B12(8-15) B13(8-15) - const __m256i rhs_vec_0123_31 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_3, 2), m3b); //B30(8-15) B31(8-15) B32(8-15) B33(8-15) - const __m256i rhs_vec_0123_51 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_3, 4), m3b); //B50(8-15) B51(8-15) B52(8-15) B53(8-15) - const __m256i rhs_vec_0123_71 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_3, 6), m3b); //B70(8-15) B71(8-15) B72(8-15) B73(8-15) - - const __m256i rhs_vec_4567_11 = _mm256_and_si256(rhs_raw_vec_4567_3, m3b); //B14(8-15) B15(8-15) B16(8-15) B17(8-15) - const __m256i rhs_vec_4567_31 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_3, 2), m3b); //B34(8-15) B35(8-15) B36(8-15) B37(8-15) - const __m256i rhs_vec_4567_51 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_3, 4), m3b); //B54(8-15) B55(8-15) B56(8-15) B57(8-15) - const __m256i rhs_vec_4567_71 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_3, 6), m3b); //B74(8-15) B75(8-15) B76(8-15) B77(8-15) - - //Scales and Mins of corresponding sub blocks from different Q2_K structures are stored together - //s00 m00 s01 m01 s10 m10 s11 m11 s20 m20 s21 m21 s30 m30 s31 m31 s40 m40 s41 m41 s50 m50 s51 m51 s60 m60 s61 m61 s70 m70 s71 m71 - - const __m128i mins_and_scales_01 = _mm_loadu_si128((const __m128i *)(b_ptr[b].scales + sb * 64)); - const __m128i mins_and_scales_23 = _mm_loadu_si128((const __m128i *)(b_ptr[b].scales + 16 + sb * 64)); - const __m128i mins_and_scales_45 = _mm_loadu_si128((const __m128i *)(b_ptr[b].scales + 32 + sb * 64)); - const __m128i mins_and_scales_67 = _mm_loadu_si128((const __m128i *)(b_ptr[b].scales + 48 + sb * 64)); - - // Extract scales which is lower half from mins_and_scales - const __m128i scales_01 = _mm_and_si128(mins_and_scales_01, m4b_sse); - const __m128i scales_23 = _mm_and_si128(mins_and_scales_23, m4b_sse); - const __m128i scales_45 = _mm_and_si128(mins_and_scales_45, m4b_sse); - const __m128i scales_67 = _mm_and_si128(mins_and_scales_67, m4b_sse); - - // Extract mins which is upper half from mins_and_scales - const __m256i mins_01 = _mm256_cvtepu8_epi16(_mm_and_si128(_mm_srli_epi16(mins_and_scales_01, 4), m4b_sse)); - const __m256i mins_23 = _mm256_cvtepu8_epi16(_mm_and_si128(_mm_srli_epi16(mins_and_scales_23, 4), m4b_sse)); - const __m256i mins_45 = _mm256_cvtepu8_epi16(_mm_and_si128(_mm_srli_epi16(mins_and_scales_45, 4), m4b_sse)); - const __m256i mins_67 = _mm256_cvtepu8_epi16(_mm_and_si128(_mm_srli_epi16(mins_and_scales_67, 4), m4b_sse)); - - // Scales of sub blocks in the sb loop - // Scales of the 0th sub block from each super block - __m128i scales_rearrange_0 = _mm_shuffle_epi8(scales_01, scalemask1); - __m256i scales_0 = _mm256_cvtepu8_epi16(scales_rearrange_0); - - // Scales of the 1st sub block from each super block - __m128i scales_rearrange_1 = _mm_shuffle_epi8(scales_01, scalemask2); - __m256i scales_1 = _mm256_cvtepu8_epi16(scales_rearrange_1); - - // Scales of the 2nd sub block from each super block - __m128i scales_rearrange_2 = _mm_shuffle_epi8(scales_23, scalemask1); - __m256i scales_2 = _mm256_cvtepu8_epi16(scales_rearrange_2); - - // Scales of the 3rd sub block from each super block - __m128i scales_rearrange_3 = _mm_shuffle_epi8(scales_23, scalemask2); - __m256i scales_3 = _mm256_cvtepu8_epi16(scales_rearrange_3); - - // Scales of the 4th sub block from each super block - __m128i scales_rearrange_4 = _mm_shuffle_epi8(scales_45, scalemask1); - __m256i scales_4 = _mm256_cvtepu8_epi16(scales_rearrange_4); - - // Scales of the 5th sub block from each super block - __m128i scales_rearrange_5 = _mm_shuffle_epi8(scales_45, scalemask2); - __m256i scales_5 = _mm256_cvtepu8_epi16(scales_rearrange_5); - - // Scales of the 6th sub block from each super block - __m128i scales_rearrange_6 = _mm_shuffle_epi8(scales_67, scalemask1); - __m256i scales_6 = _mm256_cvtepu8_epi16(scales_rearrange_6); - - // Scales of the 7th sub block from each super block - __m128i scales_rearrange_7 = _mm_shuffle_epi8(scales_67, scalemask2); - __m256i scales_7 = _mm256_cvtepu8_epi16(scales_rearrange_7); - - // Load the sub block values corresponding to sb in block_q8_K 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 + sb * 128))); - __m256i lhs_vec_1 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 16 + sb * 128))); - __m256i lhs_vec_2 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 32 + sb * 128))); - __m256i lhs_vec_3 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 48 + sb * 128))); - __m256i lhs_vec_4 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 64 + sb * 128))); - __m256i lhs_vec_5 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 80 + sb * 128))); - __m256i lhs_vec_6 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 96 + sb * 128))); - __m256i lhs_vec_7 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 112 + sb * 128))); - - lhs_vec_0 = _mm256_permute2f128_si256(lhs_vec_0, lhs_vec_0, 0); - lhs_vec_1 = _mm256_permute2f128_si256(lhs_vec_1, lhs_vec_1, 0); - lhs_vec_2 = _mm256_permute2f128_si256(lhs_vec_2, lhs_vec_2, 0); - lhs_vec_3 = _mm256_permute2f128_si256(lhs_vec_3, lhs_vec_3, 0); - lhs_vec_4 = _mm256_permute2f128_si256(lhs_vec_4, lhs_vec_4, 0); - lhs_vec_5 = _mm256_permute2f128_si256(lhs_vec_5, lhs_vec_5, 0); - lhs_vec_6 = _mm256_permute2f128_si256(lhs_vec_6, lhs_vec_6, 0); - lhs_vec_7 = _mm256_permute2f128_si256(lhs_vec_7, lhs_vec_7, 0); - - __m256i iacc_0 = _mm256_setzero_si256(); - __m256i iacc_1 = _mm256_setzero_si256(); - __m256i iacc_2 = _mm256_setzero_si256(); - __m256i iacc_3 = _mm256_setzero_si256(); - __m256i iacc_4 = _mm256_setzero_si256(); - __m256i iacc_5 = _mm256_setzero_si256(); - __m256i iacc_6 = _mm256_setzero_si256(); - __m256i iacc_7 = _mm256_setzero_si256(); - - // Dot product done within 32 bit lanes and accumulated in the same vector - // First done for 0th sub block and then for seven (1st - 7th) other sub blocks processed for each sb (sb < QK_K/128 loop) // B0(0-3) B4(0-3) B1(0-3) B5(0-3) B2(0-3) B6(0-3) B3(0-3) B7(0-3) with A0(0-3) - // B0(4-7) B4(4-7) B1(4-7) B5(4-7) B2(4-7) B6(4-7) B3(4-7) B7(4-7) with A0(4-7) - // B0(8-11) B4(8-11) B1(8-11) B5(8-11) B2(8-11) B6(8-11) B3(8-11) B7(8-11) with A0(8-11) - // B0(12-15) B4(12-15) B1(12-15) B5(12-15) B2(12-15) B6(12-15) B3(12-15) B7(12-15) with A0(12-15) - - iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_00 ,_mm256_shuffle_epi32(rhs_vec_4567_00, 177), 170), _mm256_shuffle_epi32(lhs_vec_0, 0))); - iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_00, 177) ,rhs_vec_4567_00, 170), _mm256_shuffle_epi32(lhs_vec_0, 85))); - - iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_01 ,_mm256_shuffle_epi32(rhs_vec_4567_01, 177), 170), _mm256_shuffle_epi32(lhs_vec_0, 170))); - iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_01, 177) ,rhs_vec_4567_01, 170), _mm256_shuffle_epi32(lhs_vec_0, 255))); - - iacc_0 = _mm256_madd_epi16(iacc_0, scales_0); - - iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_10 ,_mm256_shuffle_epi32(rhs_vec_4567_10, 177), 170), _mm256_shuffle_epi32(lhs_vec_1, 0))); - iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_10, 177) ,rhs_vec_4567_10, 170), _mm256_shuffle_epi32(lhs_vec_1, 85))); - - iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_11 ,_mm256_shuffle_epi32(rhs_vec_4567_11, 177), 170), _mm256_shuffle_epi32(lhs_vec_1, 170))); - iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_11, 177) ,rhs_vec_4567_11, 170), _mm256_shuffle_epi32(lhs_vec_1, 255))); - - iacc_1 = _mm256_madd_epi16(iacc_1, scales_1); - - iacc_2 = _mm256_add_epi16(iacc_2, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_20 ,_mm256_shuffle_epi32(rhs_vec_4567_20, 177), 170), _mm256_shuffle_epi32(lhs_vec_2, 0))); - iacc_2 = _mm256_add_epi16(iacc_2, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_20, 177) ,rhs_vec_4567_20, 170), _mm256_shuffle_epi32(lhs_vec_2, 85))); - - iacc_2 = _mm256_add_epi16(iacc_2, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_21 ,_mm256_shuffle_epi32(rhs_vec_4567_21, 177), 170), _mm256_shuffle_epi32(lhs_vec_2, 170))); - iacc_2 = _mm256_add_epi16(iacc_2, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_21, 177) ,rhs_vec_4567_21, 170), _mm256_shuffle_epi32(lhs_vec_2, 255))); - - iacc_2 = _mm256_madd_epi16(iacc_2, scales_2); - - iacc_3 = _mm256_add_epi16(iacc_3, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_30 ,_mm256_shuffle_epi32(rhs_vec_4567_30, 177), 170), _mm256_shuffle_epi32(lhs_vec_3, 0))); - iacc_3 = _mm256_add_epi16(iacc_3, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_30, 177) ,rhs_vec_4567_30, 170), _mm256_shuffle_epi32(lhs_vec_3, 85))); - - iacc_3 = _mm256_add_epi16(iacc_3, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_31 ,_mm256_shuffle_epi32(rhs_vec_4567_31, 177), 170), _mm256_shuffle_epi32(lhs_vec_3, 170))); - iacc_3 = _mm256_add_epi16(iacc_3, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_31, 177) ,rhs_vec_4567_31, 170), _mm256_shuffle_epi32(lhs_vec_3, 255))); - - iacc_3 = _mm256_madd_epi16(iacc_3, scales_3); - - iacc_4 = _mm256_add_epi16(iacc_4, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_40 ,_mm256_shuffle_epi32(rhs_vec_4567_40, 177), 170), _mm256_shuffle_epi32(lhs_vec_4, 0))); - iacc_4 = _mm256_add_epi16(iacc_4, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_40, 177) ,rhs_vec_4567_40, 170), _mm256_shuffle_epi32(lhs_vec_4, 85))); - - iacc_4 = _mm256_add_epi16(iacc_4, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_41 ,_mm256_shuffle_epi32(rhs_vec_4567_41, 177), 170), _mm256_shuffle_epi32(lhs_vec_4, 170))); - iacc_4 = _mm256_add_epi16(iacc_4, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_41, 177) ,rhs_vec_4567_41, 170), _mm256_shuffle_epi32(lhs_vec_4, 255))); - - iacc_4 = _mm256_madd_epi16(iacc_4, scales_4); - - iacc_5 = _mm256_add_epi16(iacc_5, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_50 ,_mm256_shuffle_epi32(rhs_vec_4567_50, 177), 170), _mm256_shuffle_epi32(lhs_vec_5, 0))); - iacc_5 = _mm256_add_epi16(iacc_5, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_50, 177) ,rhs_vec_4567_50, 170), _mm256_shuffle_epi32(lhs_vec_5, 85))); - - iacc_5 = _mm256_add_epi16(iacc_5, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_51 ,_mm256_shuffle_epi32(rhs_vec_4567_51, 177), 170), _mm256_shuffle_epi32(lhs_vec_5, 170))); - iacc_5 = _mm256_add_epi16(iacc_5, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_51, 177) ,rhs_vec_4567_51, 170), _mm256_shuffle_epi32(lhs_vec_5, 255))); - - iacc_5 = _mm256_madd_epi16(iacc_5, scales_5); - - iacc_6 = _mm256_add_epi16(iacc_6, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_60 ,_mm256_shuffle_epi32(rhs_vec_4567_60, 177), 170), _mm256_shuffle_epi32(lhs_vec_6, 0))); - iacc_6 = _mm256_add_epi16(iacc_6, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_60, 177) ,rhs_vec_4567_60, 170), _mm256_shuffle_epi32(lhs_vec_6, 85))); - - iacc_6 = _mm256_add_epi16(iacc_6, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_61 ,_mm256_shuffle_epi32(rhs_vec_4567_61, 177), 170), _mm256_shuffle_epi32(lhs_vec_6, 170))); - iacc_6 = _mm256_add_epi16(iacc_6, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_61, 177) ,rhs_vec_4567_61, 170), _mm256_shuffle_epi32(lhs_vec_6, 255))); - - iacc_6 = _mm256_madd_epi16(iacc_6, scales_6); - - iacc_7 = _mm256_add_epi16(iacc_7, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_70 ,_mm256_shuffle_epi32(rhs_vec_4567_70, 177), 170), _mm256_shuffle_epi32(lhs_vec_7, 0))); - iacc_7 = _mm256_add_epi16(iacc_7, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_70, 177) ,rhs_vec_4567_70, 170), _mm256_shuffle_epi32(lhs_vec_7, 85))); - - iacc_7 = _mm256_add_epi16(iacc_7, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_71 ,_mm256_shuffle_epi32(rhs_vec_4567_71, 177), 170), _mm256_shuffle_epi32(lhs_vec_7, 170))); - iacc_7 = _mm256_add_epi16(iacc_7, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_71, 177) ,rhs_vec_4567_71, 170), _mm256_shuffle_epi32(lhs_vec_7, 255))); - - iacc_7 = _mm256_madd_epi16(iacc_7, scales_7); - - // Accumulate the iacc value for one sb - __m256i iacc_sb = _mm256_add_epi32(_mm256_add_epi32(_mm256_add_epi32(iacc_0, iacc_1), _mm256_add_epi32(iacc_2, iacc_3)), _mm256_add_epi32(_mm256_add_epi32(iacc_4, iacc_5), _mm256_add_epi32(iacc_6, iacc_7))); - - __m128i q8sums = _mm_loadu_si128((const __m128i *)(a_ptr[b].bsums + sb * 8)); - __m256i q8s = _mm256_castsi128_si256(q8sums); - q8s= _mm256_permute2f128_si256(q8s, q8s, 0); - - // Broadcast the bsums of the two corresponding subblocks of q8_k - // Multiply-Add with corresponding mins of Q2_Kx8 with bsums - __m256i iacc_min_sb_01 = _mm256_madd_epi16(_mm256_shuffle_epi32(q8s, 0), mins_01); - __m256i iacc_min_sb_23 = _mm256_madd_epi16(_mm256_shuffle_epi32(q8s, 85), mins_23); - __m256i iacc_min_sb_45 = _mm256_madd_epi16(_mm256_shuffle_epi32(q8s, 170), mins_45); - __m256i iacc_min_sb_67 = _mm256_madd_epi16(_mm256_shuffle_epi32(q8s, 255), mins_67); - - __m256i iacc_min_sb = _mm256_add_epi32(_mm256_add_epi32(iacc_min_sb_01, iacc_min_sb_23), _mm256_add_epi32(iacc_min_sb_45,iacc_min_sb_67)); - - // Accumulate for the complete block - iacc_b = _mm256_add_epi32(iacc_b, iacc_sb); - iacc_min_b = _mm256_add_epi32(iacc_min_b, iacc_min_sb); - } - - //Multiply-Add with scale values for complete super block - acc_row = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_b), _mm256_mul_ps(col_scale_f32, row_scale_f32), acc_row); - acc_min_rows = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_min_b), _mm256_mul_ps(col_dmin_f32, row_scale_f32), acc_min_rows); - } - // Accumulated output values permuted so as to be stored in appropriate order post accumulation - acc_row = _mm256_permutevar8x32_ps(acc_row, finalpermutemask); - _mm256_storeu_ps(s + (y * nr + x * 8), _mm256_sub_ps(acc_row, acc_min_rows)); - } - } -#else - - ggml_gemv_q2_K_8x8_q8_K_generic(n, s, bs, vx, vy, nr, nc); - -#endif -} - -void ggml_gemm_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc) { - const int qk = QK8_0; - const int nb = n / qk; - const int ncols_interleaved = 8; - const int blocklen = 8; - - assert (n % qk == 0); - assert (nr % 4 == 0); - assert (nc % ncols_interleaved == 0); - - UNUSED(s); - UNUSED(bs); - UNUSED(vx); - UNUSED(vy); - UNUSED(nr); - UNUSED(nc); - UNUSED(nb); - UNUSED(ncols_interleaved); - UNUSED(blocklen); - -#if defined(__AVX2__) || defined(__AVX512F__) - { - const block_q4_0x8 * b_ptr_start = (const block_q4_0x8 *)vx; - const block_q8_0x4 * a_ptr_start = (const block_q8_0x4 *)vy; - int64_t b_nb = n / QK4_0; - int64_t y = 0; - // Mask to mask out nibbles from packed bytes - const __m256i m4b = _mm256_set1_epi8(0x0F); - const __m128i loadMask = _mm_blend_epi32(_mm_setzero_si128(), _mm_set1_epi32(0xFFFFFFFF), 3); - // Lookup table to convert signed nibbles to signed bytes - __m256i signextendlut = _mm256_castsi128_si256(_mm_set_epi8(-1, -2, -3, -4, -5, -6, -7, -8, 7, 6, 5, 4, 3, 2, 1, 0)); - signextendlut = _mm256_permute2f128_si256(signextendlut, signextendlut, 0); - // Permute mask used for easier vector processing at later stages - __m256i requiredOrder = _mm256_set_epi32(3, 2, 1, 0, 7, 6, 5, 4); - int64_t xstart = 0; - int anr = nr - nr%16; // Used to align nr with boundary of 16 - #ifdef __AVX512F__ - int anc = nc - nc%16; // Used to align nc with boundary of 16 - // Mask to mask out nibbles from packed bytes expanded to 512 bit length - const __m512i m4bexpanded = _mm512_set1_epi8(0x0F); - // Lookup table to convert signed nibbles to signed bytes expanded to 512 bit length - __m512i signextendlutexpanded = _mm512_inserti32x8(_mm512_castsi256_si512(signextendlut), signextendlut, 1); - - // Take group of four block_q8_0x4 structures at each pass of the loop and perform dot product operation - for (; y < anr / 4; y += 4) { - - const block_q8_0x4 * a_ptrs[4]; - - a_ptrs[0] = a_ptr_start + (y * nb); - for (int i = 0; i < 3; ++i) { - a_ptrs[i + 1] = a_ptrs[i] + nb; - } - - // Take group of two block_q4_0x8 structures at each pass of the loop and perform dot product operation - for (int64_t x = 0; x < anc / 8; x += 2) { - - const block_q4_0x8 * b_ptr_0 = b_ptr_start + ((x) * b_nb); - const block_q4_0x8 * b_ptr_1 = b_ptr_start + ((x + 1) * b_nb); - - // Master FP accumulators - __m512 acc_rows[16]; - for (int i = 0; i < 16; i++) { - acc_rows[i] = _mm512_setzero_ps(); - } - - for (int64_t b = 0; b < nb; b++) { - // Load the sixteen block_q4_0 quantized values interleaved with each other in chunks of eight - B0,B1 ....BE,BF - const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs)); - const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs + 32)); - const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs + 64)); - const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs + 96)); - - const __m256i rhs_raw_mat_89AB_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs)); - const __m256i rhs_raw_mat_CDEF_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs + 32)); - const __m256i rhs_raw_mat_89AB_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs + 64)); - const __m256i rhs_raw_mat_CDEF_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs + 96)); - - // Save the values in the following vectors in the formats B0B1B4B5B8B9BCBD, B2B3B6B7BABBBEBF for further processing and storing of values - const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32(rhs_raw_mat_0123_0, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_0, requiredOrder), 240); - const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_0, requiredOrder), rhs_raw_mat_4567_0, 240); - const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32(rhs_raw_mat_0123_1, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_1, requiredOrder), 240); - const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_1, requiredOrder), rhs_raw_mat_4567_1, 240); - - const __m256i rhs_raw_mat_89CD_0 = _mm256_blend_epi32(rhs_raw_mat_89AB_0, _mm256_permutevar8x32_epi32(rhs_raw_mat_CDEF_0, requiredOrder), 240); - const __m256i rhs_raw_mat_ABEF_0 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_89AB_0, requiredOrder), rhs_raw_mat_CDEF_0, 240); - const __m256i rhs_raw_mat_89CD_1 = _mm256_blend_epi32(rhs_raw_mat_89AB_1, _mm256_permutevar8x32_epi32(rhs_raw_mat_CDEF_1, requiredOrder), 240); - const __m256i rhs_raw_mat_ABEF_1 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_89AB_1, requiredOrder), rhs_raw_mat_CDEF_1, 240); - - const __m512i rhs_raw_mat_014589CD_0 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_0145_0), rhs_raw_mat_89CD_0, 1); - const __m512i rhs_raw_mat_2367ABEF_0 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_2367_0), rhs_raw_mat_ABEF_0, 1); - const __m512i rhs_raw_mat_014589CD_1 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_0145_1), rhs_raw_mat_89CD_1, 1); - const __m512i rhs_raw_mat_2367ABEF_1 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_2367_1), rhs_raw_mat_ABEF_1, 1); - - // 4-bit -> 8-bit - Sign is maintained - const __m512i rhs_mat_014589CD_0 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_014589CD_0, m4bexpanded)); //B0(0-7) B1(0-7) B4(0-7) B5(0-7) B8(0-7) B9(0-7) BC(0-7) BD(0-7) - const __m512i rhs_mat_2367ABEF_0 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_2367ABEF_0, m4bexpanded)); //B2(0-7) B3(0-7) B6(0-7) B7(0-7) BA(0-7) BB(0-7) BE(0-7) BF(0-7) - - const __m512i rhs_mat_014589CD_1 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_014589CD_1, m4bexpanded)); //B0(8-15) B1(8-15) B4(8-15) B5(8-15) B8(8-15) B9(8-15) BC(8-15) BD(8-15) - const __m512i rhs_mat_2367ABEF_1 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_2367ABEF_1, m4bexpanded)); //B2(8-15) B3(8-15) B6(8-15) B7(8-15) BA(8-15) BB(8-15) BE(8-15) BF(8-15) - - const __m512i rhs_mat_014589CD_2 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_014589CD_0, 4), m4bexpanded)); //B0(16-23) B1(16-23) B4(16-23) B5(16-23) B8(16-23) B9(16-23) BC(16-23) BD(16-23) - const __m512i rhs_mat_2367ABEF_2 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_2367ABEF_0, 4), m4bexpanded)); //B2(16-23) B3(16-23) B6(16-23) B7(16-23) BA(16-23) BB(16-23) BE(16-23) BF(16-23) - - const __m512i rhs_mat_014589CD_3 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_014589CD_1, 4), m4bexpanded)); //B0(24-31) B1(24-31) B4(24-31) B5(24-31) B8(24-31) B9(24-31) BC(24-31) BD(24-31) - const __m512i rhs_mat_2367ABEF_3 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_2367ABEF_1, 4), m4bexpanded)); //B2(24-31) B3(24-31) B6(24-31) B7(24-31) BA(24-31) BB(24-31) BE(24-31) BF(24-31) - - // Shuffle pattern one - right side input - const __m512i rhs_mat_014589CD_0_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_0, (_MM_PERM_ENUM)136); //B0(0-3) B1(0-3) B0(0-3) B1(0-3) B4(0-3) B5(0-3) B4(0-3) B5(0-3) B8(0-3) B9(0-3) B8(0-3) B9(0-3) BC(0-3) BD(0-3) BC(0-3) BD(0-3) - const __m512i rhs_mat_2367ABEF_0_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_0, (_MM_PERM_ENUM)136); //B2(0-3) B3(0-3) B2(0-3) B3(0-3) B6(0-3) B7(0-3) B6(0-3) B7(0-3) BA(0-3) BB(0-3) BA(0-3) BB(0-3) BE(0-3) BF(0-3) BE(0-3) BF(0-3) - - const __m512i rhs_mat_014589CD_1_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_1, (_MM_PERM_ENUM)136); //B0(8-11) B1(8-11) B0(8-11) B1(8-11) B4(8-11) B5(8-11) B4(8-11) B5(8-11) B8(8-11) B9(8-11) B8(8-11) B9(8-11) BC(8-11) BD(8-11) BC(8-11) BD(8-11) - const __m512i rhs_mat_2367ABEF_1_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_1, (_MM_PERM_ENUM)136); //B2(8-11) B3(8-11) B2(8-11) B3(8-11) B6(8-11) B7(8-11) B6(8-11) B7(8-11) BA(8-11) BB(8-11) BA(8-11) BB(8-11) BE(8-11) BF(8-11) BE(8-11) BF(8-11) - - const __m512i rhs_mat_014589CD_2_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_2, (_MM_PERM_ENUM)136); //B0(16-19) B1(16-19) B0(16-19) B1(16-19) B4(16-19) B5(16-19) B4(16-19) B5(16-19) B8(16-19) B9(16-19) B8(16-19) B9(16-19) BC(16-19) BD(16-19) BC(16-19) BD(16-19) - const __m512i rhs_mat_2367ABEF_2_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_2, (_MM_PERM_ENUM)136); //B2(16-19) B3(16-19) B2(16-19) B3(16-19) B6(16-19) B7(16-19) B6(16-19) B7(16-19) BA(16-19) BB(16-19) BA(16-19) BB(16-19) BE(16-19) BF(16-19) BE(16-19) BF(16-19) - - const __m512i rhs_mat_014589CD_3_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_3, (_MM_PERM_ENUM)136); //B0(24-27) B1(24-27) B0(24-27) B1(24-27) B4(24-27) B5(24-27) B4(24-27) B5(24-27) B8(24-27) B9(24-27) B8(24-27) B9(24-27) BC(24-27) BD(24-27) BC(24-27) BD(24-27) - const __m512i rhs_mat_2367ABEF_3_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_3, (_MM_PERM_ENUM)136); //B2(24-27) B3(24-27) B2(24-27) B3(24-27) B6(24-27) B7(24-27) B6(24-27) B7(24-27) BA(24-27) BB(24-27) BA(24-27) BB(24-27) BE(24-27) BF(24-27) BE(24-27) BF(24-27) - - // Shuffle pattern two - right side input - - const __m512i rhs_mat_014589CD_0_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_0, (_MM_PERM_ENUM)221); //B0(4-7) B1(4-7) B0(4-7) B1(4-7) B4(4-7) B5(4-7) B4(4-7) B5(4-7) B8(4-7) B9(4-7) B8(4-7) B9(4-7) BC(4-7) BD(4-7) BC(4-7) BD(4-7) - const __m512i rhs_mat_2367ABEF_0_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_0, (_MM_PERM_ENUM)221); //B2(4-7) B3(4-7) B2(4-7) B3(4-7) B6(4-7) B7(4-7) B6(4-7) B7(4-7) BA(4-7) BB(4-7) BA(4-7) BB(4-7) BE(4-7) BF(4-7) BE(4-7) BF(4-7) - - const __m512i rhs_mat_014589CD_1_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_1, (_MM_PERM_ENUM)221); //B0(12-15) B1(12-15) B0(12-15) B1(12-15) B4(12-15) B5(12-15) B4(12-15) B5(12-15) B8(12-15) B9(12-15) B8(12-15) B9(12-15) BC(12-15) BD(12-15) BC(12-15) BD(12-15) - const __m512i rhs_mat_2367ABEF_1_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_1, (_MM_PERM_ENUM)221); //B2(12-15) B3(12-15) B2(12-15) B3(12-15) B6(12-15) B7(12-15) B6(12-15) B7(12-15) BA(12-15) BB(12-15) BA(12-15) BB(12-15) BE(12-15) BF(12-15) BE(12-15) BF(12-15) - - const __m512i rhs_mat_014589CD_2_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_2, (_MM_PERM_ENUM)221); //B0(20-23) B1(20-23) B0(20-23) B1(20-23) B4(20-23) B5(20-23) B4(20-23) B5(20-23) B8(20-23) B9(20-23) B8(20-23) B9(20-23) BC(20-23) BD(20-23) BC(20-23) BD(20-23) - const __m512i rhs_mat_2367ABEF_2_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_2, (_MM_PERM_ENUM)221); //B2(20-23) B3(20-23) B2(20-23) B3(20-23) B6(20-23) B7(20-23) B6(20-23) B7(20-23) BA(20-23) BB(20-23) BA(20-23) BB(20-23) BE(20-23) BF(20-23) BE(20-23) BF(20-23) - - const __m512i rhs_mat_014589CD_3_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_3, (_MM_PERM_ENUM)221); //B0(28-31) B1(28-31) B0(28-31) B1(28-31) B4(28-31) B5(28-31) B4(28-31) B5(28-31) B8(28-31) B9(28-31) B8(28-31) B9(28-31) BC(28-31) BD(28-31) BC(28-31) BD(28-31) - const __m512i rhs_mat_2367ABEF_3_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_3, (_MM_PERM_ENUM)221); //B2(28-31) B3(28-31) B2(28-31) B3(28-31) B6(28-31) B7(28-31) B6(28-31) B7(28-31) BA(28-31) BB(28-31) BA(28-31) BB(28-31) BE(28-31) BF(28-31) BE(28-31) BF(28-31) - - // Scale values - Load the weight scale values of two block_q4_0x8 - const __m512 col_scale_f32 = GGML_F32Cx8x2_LOAD(b_ptr_0[b].d, b_ptr_1[b].d); - - // Process LHS in pairs of rows - for (int rp = 0; rp < 4; rp++) { - - // Load the four block_q4_0 quantized values interleaved with each other in chunks of eight - A0,A1,A2,A3 - // Loaded as set of 128 bit vectors and repeated and stored into a 256 bit vector before again repeating into 512 bit vector - __m256i lhs_mat_ymm_0123_0 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs))); - __m256i lhs_mat_ymm_01_0 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_0, lhs_mat_ymm_0123_0, 0); - __m256i lhs_mat_ymm_23_0 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_0, lhs_mat_ymm_0123_0, 17); - __m256i lhs_mat_ymm_0123_1 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs + 32))); - __m256i lhs_mat_ymm_01_1 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_1, lhs_mat_ymm_0123_1, 0); - __m256i lhs_mat_ymm_23_1 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_1, lhs_mat_ymm_0123_1, 17); - __m256i lhs_mat_ymm_0123_2 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs + 64))); - __m256i lhs_mat_ymm_01_2 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_2, lhs_mat_ymm_0123_2, 0); - __m256i lhs_mat_ymm_23_2 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_2, lhs_mat_ymm_0123_2, 17); - __m256i lhs_mat_ymm_0123_3 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs + 96))); - __m256i lhs_mat_ymm_01_3 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_3, lhs_mat_ymm_0123_3, 0); - __m256i lhs_mat_ymm_23_3 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_3, lhs_mat_ymm_0123_3, 17); - - __m512i lhs_mat_01_0 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_0), lhs_mat_ymm_01_0, 1); - __m512i lhs_mat_23_0 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_0), lhs_mat_ymm_23_0, 1); - __m512i lhs_mat_01_1 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_1), lhs_mat_ymm_01_1, 1); - __m512i lhs_mat_23_1 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_1), lhs_mat_ymm_23_1, 1); - __m512i lhs_mat_01_2 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_2), lhs_mat_ymm_01_2, 1); - __m512i lhs_mat_23_2 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_2), lhs_mat_ymm_23_2, 1); - __m512i lhs_mat_01_3 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_3), lhs_mat_ymm_01_3, 1); - __m512i lhs_mat_23_3 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_3), lhs_mat_ymm_23_3, 1); - - // Shuffle pattern one - left side input - - const __m512i lhs_mat_01_0_sp1 = _mm512_shuffle_epi32(lhs_mat_01_0, (_MM_PERM_ENUM)160); //A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) - const __m512i lhs_mat_23_0_sp1 = _mm512_shuffle_epi32(lhs_mat_23_0, (_MM_PERM_ENUM)160); //A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) - - const __m512i lhs_mat_01_1_sp1 = _mm512_shuffle_epi32(lhs_mat_01_1, (_MM_PERM_ENUM)160); //A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) - const __m512i lhs_mat_23_1_sp1 = _mm512_shuffle_epi32(lhs_mat_23_1, (_MM_PERM_ENUM)160); //A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) - - const __m512i lhs_mat_01_2_sp1 = _mm512_shuffle_epi32(lhs_mat_01_2, (_MM_PERM_ENUM)160); //A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) - const __m512i lhs_mat_23_2_sp1 = _mm512_shuffle_epi32(lhs_mat_23_2, (_MM_PERM_ENUM)160); //A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) - - const __m512i lhs_mat_01_3_sp1 = _mm512_shuffle_epi32(lhs_mat_01_3, (_MM_PERM_ENUM)160); //A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) - const __m512i lhs_mat_23_3_sp1 = _mm512_shuffle_epi32(lhs_mat_23_3, (_MM_PERM_ENUM)160); //A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) - - // Shuffle pattern two - left side input - - const __m512i lhs_mat_01_0_sp2 = _mm512_shuffle_epi32(lhs_mat_01_0, (_MM_PERM_ENUM)245); //A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) - const __m512i lhs_mat_23_0_sp2 = _mm512_shuffle_epi32(lhs_mat_23_0, (_MM_PERM_ENUM)245); //A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) - - const __m512i lhs_mat_01_1_sp2 = _mm512_shuffle_epi32(lhs_mat_01_1, (_MM_PERM_ENUM)245); //A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) - const __m512i lhs_mat_23_1_sp2 = _mm512_shuffle_epi32(lhs_mat_23_1, (_MM_PERM_ENUM)245); //A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) - - const __m512i lhs_mat_01_2_sp2 = _mm512_shuffle_epi32(lhs_mat_01_2, (_MM_PERM_ENUM)245); //A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) - const __m512i lhs_mat_23_2_sp2 = _mm512_shuffle_epi32(lhs_mat_23_2, (_MM_PERM_ENUM)245); //A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) - - const __m512i lhs_mat_01_3_sp2 = _mm512_shuffle_epi32(lhs_mat_01_3, (_MM_PERM_ENUM)245); //A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) - const __m512i lhs_mat_23_3_sp2 = _mm512_shuffle_epi32(lhs_mat_23_3, (_MM_PERM_ENUM)245); //A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) - - // The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane - // Resembles MMLAs into 2x2 matrices in ARM Version - const __m512i zero = _mm512_setzero_epi32(); - __m512i iacc_mat_00_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp1, rhs_mat_014589CD_3_sp1), lhs_mat_01_2_sp1, rhs_mat_014589CD_2_sp1), lhs_mat_01_1_sp1, rhs_mat_014589CD_1_sp1), lhs_mat_01_0_sp1, rhs_mat_014589CD_0_sp1); - __m512i iacc_mat_01_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp1, rhs_mat_2367ABEF_3_sp1), lhs_mat_01_2_sp1, rhs_mat_2367ABEF_2_sp1), lhs_mat_01_1_sp1, rhs_mat_2367ABEF_1_sp1), lhs_mat_01_0_sp1, rhs_mat_2367ABEF_0_sp1); - __m512i iacc_mat_10_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp1, rhs_mat_014589CD_3_sp1), lhs_mat_23_2_sp1, rhs_mat_014589CD_2_sp1), lhs_mat_23_1_sp1, rhs_mat_014589CD_1_sp1), lhs_mat_23_0_sp1, rhs_mat_014589CD_0_sp1); - __m512i iacc_mat_11_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp1, rhs_mat_2367ABEF_3_sp1), lhs_mat_23_2_sp1, rhs_mat_2367ABEF_2_sp1), lhs_mat_23_1_sp1, rhs_mat_2367ABEF_1_sp1), lhs_mat_23_0_sp1, rhs_mat_2367ABEF_0_sp1); - __m512i iacc_mat_00_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp2, rhs_mat_014589CD_3_sp2), lhs_mat_01_2_sp2, rhs_mat_014589CD_2_sp2), lhs_mat_01_1_sp2, rhs_mat_014589CD_1_sp2), lhs_mat_01_0_sp2, rhs_mat_014589CD_0_sp2); - __m512i iacc_mat_01_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp2, rhs_mat_2367ABEF_3_sp2), lhs_mat_01_2_sp2, rhs_mat_2367ABEF_2_sp2), lhs_mat_01_1_sp2, rhs_mat_2367ABEF_1_sp2), lhs_mat_01_0_sp2, rhs_mat_2367ABEF_0_sp2); - __m512i iacc_mat_10_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp2, rhs_mat_014589CD_3_sp2), lhs_mat_23_2_sp2, rhs_mat_014589CD_2_sp2), lhs_mat_23_1_sp2, rhs_mat_014589CD_1_sp2), lhs_mat_23_0_sp2, rhs_mat_014589CD_0_sp2); - __m512i iacc_mat_11_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp2, rhs_mat_2367ABEF_3_sp2), lhs_mat_23_2_sp2, rhs_mat_2367ABEF_2_sp2), lhs_mat_23_1_sp2, rhs_mat_2367ABEF_1_sp2), lhs_mat_23_0_sp2, rhs_mat_2367ABEF_0_sp2); - - // Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block - __m512i iacc_mat_00 = _mm512_add_epi32(iacc_mat_00_sp1, iacc_mat_00_sp2); - __m512i iacc_mat_01 = _mm512_add_epi32(iacc_mat_01_sp1, iacc_mat_01_sp2); - __m512i iacc_mat_10 = _mm512_add_epi32(iacc_mat_10_sp1, iacc_mat_10_sp2); - __m512i iacc_mat_11 = _mm512_add_epi32(iacc_mat_11_sp1, iacc_mat_11_sp2); - - - // Straighten out to make 4 row vectors - __m512i iacc_row_0 = _mm512_mask_blend_epi32(0xCCCC, iacc_mat_00, _mm512_shuffle_epi32(iacc_mat_01, (_MM_PERM_ENUM)78)); - __m512i iacc_row_1 = _mm512_mask_blend_epi32(0xCCCC, _mm512_shuffle_epi32(iacc_mat_00, (_MM_PERM_ENUM)78), iacc_mat_01); - __m512i iacc_row_2 = _mm512_mask_blend_epi32(0xCCCC, iacc_mat_10, _mm512_shuffle_epi32(iacc_mat_11, (_MM_PERM_ENUM)78)); - __m512i iacc_row_3 = _mm512_mask_blend_epi32(0xCCCC, _mm512_shuffle_epi32(iacc_mat_10, (_MM_PERM_ENUM)78), iacc_mat_11); - - // Load the scale(d) values for all the 4 Q8_0 blocks and repeat it across lanes - const __m128i row_scale_f16 = _mm_shuffle_epi32(_mm_maskload_epi32((int const*)(a_ptrs[rp][b].d), loadMask), 68); - const __m512 row_scale_f32 = GGML_F32Cx16_REPEAT_LOAD(row_scale_f16); - - // Multiply with appropiate scales and accumulate - acc_rows[rp * 4] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_0), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 0)), acc_rows[rp * 4]); - acc_rows[rp * 4 + 1] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_1), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 85)), acc_rows[rp * 4 + 1]); - acc_rows[rp * 4 + 2] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_2), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 170)), acc_rows[rp * 4 + 2]); - acc_rows[rp * 4 + 3] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_3), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 255)), acc_rows[rp * 4 + 3]); - } - } - - // Store the accumulated values - for (int i = 0; i < 16; i++) { - _mm512_storeu_ps((float *)(s + ((y * 4 + i) * bs + x * 8)), acc_rows[i]); - } - } - } - // Take a block_q8_0x4 structures at each pass of the loop and perform dot product operation - for (; y < nr / 4; y ++) { - - const block_q8_0x4 * a_ptr = a_ptr_start + (y * nb); - - // Take group of two block_q4_0x8 structures at each pass of the loop and perform dot product operation - for (int64_t x = 0; x < anc / 8; x += 2) { - - const block_q4_0x8 * b_ptr_0 = b_ptr_start + ((x) * b_nb); - const block_q4_0x8 * b_ptr_1 = b_ptr_start + ((x + 1) * b_nb); - - // Master FP accumulators - __m512 acc_rows[4]; - for (int i = 0; i < 4; i++) { - acc_rows[i] = _mm512_setzero_ps(); - } - - for (int64_t b = 0; b < nb; b++) { - // Load the sixteen block_q4_0 quantized values interleaved with each other in chunks of eight - B0,B1 ....BE,BF - const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs)); - const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs + 32)); - const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs + 64)); - const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_0[b].qs + 96)); - - const __m256i rhs_raw_mat_89AB_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs)); - const __m256i rhs_raw_mat_CDEF_0 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs + 32)); - const __m256i rhs_raw_mat_89AB_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs + 64)); - const __m256i rhs_raw_mat_CDEF_1 = _mm256_loadu_si256((const __m256i *)(b_ptr_1[b].qs + 96)); - - // Save the values in the following vectors in the formats B0B1B4B5, B2B3B6B7 for further processing and storing of valuess - const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32(rhs_raw_mat_0123_0, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_0, requiredOrder), 240); - const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_0, requiredOrder), rhs_raw_mat_4567_0, 240); - const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32(rhs_raw_mat_0123_1, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_1, requiredOrder), 240); - const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_1, requiredOrder), rhs_raw_mat_4567_1, 240); - - const __m256i rhs_raw_mat_89CD_0 = _mm256_blend_epi32(rhs_raw_mat_89AB_0, _mm256_permutevar8x32_epi32(rhs_raw_mat_CDEF_0, requiredOrder), 240); - const __m256i rhs_raw_mat_ABEF_0 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_89AB_0, requiredOrder), rhs_raw_mat_CDEF_0, 240); - const __m256i rhs_raw_mat_89CD_1 = _mm256_blend_epi32(rhs_raw_mat_89AB_1, _mm256_permutevar8x32_epi32(rhs_raw_mat_CDEF_1, requiredOrder), 240); - const __m256i rhs_raw_mat_ABEF_1 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_89AB_1, requiredOrder), rhs_raw_mat_CDEF_1, 240); + // 4-bit -> 8-bit + // Values of the first sub block of eight block_q4_K structures for the sb loop + const __m256i rhs_vec_0123_00 = _mm256_and_si256(rhs_raw_vec_0123_0, m4b); + const __m256i rhs_vec_4567_00 = _mm256_and_si256(rhs_raw_vec_4567_0, m4b); + const __m256i rhs_vec_0123_01 = _mm256_and_si256(rhs_raw_vec_0123_1, m4b); + const __m256i rhs_vec_4567_01 = _mm256_and_si256(rhs_raw_vec_4567_1, m4b); + const __m256i rhs_vec_0123_02 = _mm256_and_si256(rhs_raw_vec_0123_2, m4b); + const __m256i rhs_vec_4567_02 = _mm256_and_si256(rhs_raw_vec_4567_2, m4b); + const __m256i rhs_vec_0123_03 = _mm256_and_si256(rhs_raw_vec_0123_3, m4b); + const __m256i rhs_vec_4567_03 = _mm256_and_si256(rhs_raw_vec_4567_3, m4b); - const __m512i rhs_raw_mat_014589CD_0 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_0145_0), rhs_raw_mat_89CD_0, 1); - const __m512i rhs_raw_mat_2367ABEF_0 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_2367_0), rhs_raw_mat_ABEF_0, 1); - const __m512i rhs_raw_mat_014589CD_1 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_0145_1), rhs_raw_mat_89CD_1, 1); - const __m512i rhs_raw_mat_2367ABEF_1 = _mm512_inserti32x8(_mm512_castsi256_si512(rhs_raw_mat_2367_1), rhs_raw_mat_ABEF_1, 1); + // Values of the second sub block of eight block_q4_K structures when sb = 1 + const __m256i rhs_vec_0123_10 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_0, 4), m4b); + const __m256i rhs_vec_4567_10 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_0, 4), m4b); + const __m256i rhs_vec_0123_11 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_1, 4), m4b); + const __m256i rhs_vec_4567_11 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_1, 4), m4b); + const __m256i rhs_vec_0123_12 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_2, 4), m4b); + const __m256i rhs_vec_4567_12 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_2, 4), m4b); + const __m256i rhs_vec_0123_13 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_3, 4), m4b); + const __m256i rhs_vec_4567_13 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_3, 4), m4b); - // 4-bit -> 8-bit - Sign is maintained - const __m512i rhs_mat_014589CD_0 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_014589CD_0, m4bexpanded)); //B0(0-7) B1(0-7) B4(0-7) B5(0-7) B8(0-7) B9(0-7) BC(0-7) BD(0-7) - const __m512i rhs_mat_2367ABEF_0 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_2367ABEF_0, m4bexpanded)); //B2(0-7) B3(0-7) B6(0-7) B7(0-7) BA(0-7) BB(0-7) BE(0-7) BF(0-7) + uint32_t utmp_0[4], utmp_1[4]; - const __m512i rhs_mat_014589CD_1 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_014589CD_1, m4bexpanded)); //B0(8-15) B1(8-15) B4(8-15) B5(8-15) B8(8-15) B9(8-15) BC(8-15) BD(8-15) - const __m512i rhs_mat_2367ABEF_1 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(rhs_raw_mat_2367ABEF_1, m4bexpanded)); //B2(8-15) B3(8-15) B6(8-15) B7(8-15) BA(8-15) BB(8-15) BE(8-15) BF(8-15) + // Scales and Mins of corresponding sub blocks from different Q8_K structures are stored together + // The below block is for eg to extract first sub block's scales and mins from different Q4_K structures for the sb loop + memcpy(utmp_0, b_ptr[b].scales + 24 * sb, 12); + utmp_0[3] = ((utmp_0[2] >> 4) & kmask2) | (((utmp_0[1] >> 6) & kmask3) << 4); + const uint32_t uaux_0 = utmp_0[1] & kmask1; + utmp_0[1] = (utmp_0[2] & kmask2) | (((utmp_0[0] >> 6) & kmask3) << 4); + utmp_0[2] = uaux_0; + utmp_0[0] &= kmask1; - const __m512i rhs_mat_014589CD_2 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_014589CD_0, 4), m4bexpanded)); //B0(16-23) B1(16-23) B4(16-23) B5(16-23) B8(16-23) B9(16-23) BC(16-23) BD(16-23) - const __m512i rhs_mat_2367ABEF_2 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_2367ABEF_0, 4), m4bexpanded)); //B2(16-23) B3(16-23) B6(16-23) B7(16-23) BA(16-23) BB(16-23) BE(16-23) BF(16-23) + // The below block is for eg to extract second sub block's scales and mins from different Q4_K structures for the sb loop + memcpy(utmp_1, b_ptr[b].scales + 12 + sb * 24, 12); + utmp_1[3] = ((utmp_1[2] >> 4) & kmask2) | (((utmp_1[1] >> 6) & kmask3) << 4); + const uint32_t uaux_1 = utmp_1[1] & kmask1; + utmp_1[1] = (utmp_1[2] & kmask2) | (((utmp_1[0] >> 6) & kmask3) << 4); + utmp_1[2] = uaux_1; + utmp_1[0] &= kmask1; - const __m512i rhs_mat_014589CD_3 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_014589CD_1, 4), m4bexpanded)); //B0(24-31) B1(24-31) B4(24-31) B5(24-31) B8(24-31) B9(24-31) BC(24-31) BD(24-31) - const __m512i rhs_mat_2367ABEF_3 = _mm512_shuffle_epi8(signextendlutexpanded, _mm512_and_si512(_mm512_srli_epi16(rhs_raw_mat_2367ABEF_1, 4), m4bexpanded)); //B2(24-31) B3(24-31) B6(24-31) B7(24-31) BA(24-31) BB(24-31) BE(24-31) BF(24-31) + // Scales of first sub block in the sb loop + const __m128i mins_and_scales_0 = _mm_set_epi32(utmp_0[3], utmp_0[2], utmp_0[1], utmp_0[0]); + __m128i scales_rearrange_0 = _mm_shuffle_epi8(mins_and_scales_0, scalemask); + __m256i scales_0 = _mm256_cvtepu8_epi16(scales_rearrange_0); - // Shuffle pattern one - right side input - const __m512i rhs_mat_014589CD_0_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_0, (_MM_PERM_ENUM)136); //B0(0-3) B1(0-3) B0(0-3) B1(0-3) B4(0-3) B5(0-3) B4(0-3) B5(0-3) B8(0-3) B9(0-3) B8(0-3) B9(0-3) BC(0-3) BD(0-3) BC(0-3) BD(0-3) - const __m512i rhs_mat_2367ABEF_0_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_0, (_MM_PERM_ENUM)136); //B2(0-3) B3(0-3) B2(0-3) B3(0-3) B6(0-3) B7(0-3) B6(0-3) B7(0-3) BA(0-3) BB(0-3) BA(0-3) BB(0-3) BE(0-3) BF(0-3) BE(0-3) BF(0-3) + // Scales of second sub block in the sb loop + __m128i mins_and_scales_1 = _mm_set_epi32(utmp_1[3], utmp_1[2], utmp_1[1], utmp_1[0]); + __m128i scales_rearrange_1 = _mm_shuffle_epi8(mins_and_scales_1, scalemask); + __m256i scales_1 = _mm256_cvtepu8_epi16(scales_rearrange_1); - const __m512i rhs_mat_014589CD_1_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_1, (_MM_PERM_ENUM)136); //B0(8-11) B1(8-11) B0(8-11) B1(8-11) B4(8-11) B5(8-11) B4(8-11) B5(8-11) B8(8-11) B9(8-11) B8(8-11) B9(8-11) BC(8-11) BD(8-11) BC(8-11) BD(8-11) - const __m512i rhs_mat_2367ABEF_1_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_1, (_MM_PERM_ENUM)136); //B2(8-11) B3(8-11) B2(8-11) B3(8-11) B6(8-11) B7(8-11) B6(8-11) B7(8-11) BA(8-11) BB(8-11) BA(8-11) BB(8-11) BE(8-11) BF(8-11) BE(8-11) BF(8-11) + // Mins of first and second sub block of Q4_K block are arranged side by side + __m256i mins_01 = _mm256_cvtepu8_epi16(_mm_unpacklo_epi8(_mm_shuffle_epi32(mins_and_scales_0, 78), _mm_shuffle_epi32(mins_and_scales_1, 78))); - const __m512i rhs_mat_014589CD_2_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_2, (_MM_PERM_ENUM)136); //B0(16-19) B1(16-19) B0(16-19) B1(16-19) B4(16-19) B5(16-19) B4(16-19) B5(16-19) B8(16-19) B9(16-19) B8(16-19) B9(16-19) BC(16-19) BD(16-19) BC(16-19) BD(16-19) - const __m512i rhs_mat_2367ABEF_2_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_2, (_MM_PERM_ENUM)136); //B2(16-19) B3(16-19) B2(16-19) B3(16-19) B6(16-19) B7(16-19) B6(16-19) B7(16-19) BA(16-19) BB(16-19) BA(16-19) BB(16-19) BE(16-19) BF(16-19) BE(16-19) BF(16-19) + // Load the two sub block values corresponding to sb in block_q8_K in batches of 16 bytes and replicate the same across 256 bit vector + __m256i lhs_vec_00 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + sb * 64))); + __m256i lhs_vec_01 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 16 + sb * 64))); + __m256i lhs_vec_10 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 32 + sb * 64))); + __m256i lhs_vec_11 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 48 + sb * 64))); - const __m512i rhs_mat_014589CD_3_sp1 = _mm512_shuffle_epi32(rhs_mat_014589CD_3, (_MM_PERM_ENUM)136); //B0(24-27) B1(24-27) B0(24-27) B1(24-27) B4(24-27) B5(24-27) B4(24-27) B5(24-27) B8(24-27) B9(24-27) B8(24-27) B9(24-27) BC(24-27) BD(24-27) BC(24-27) BD(24-27) - const __m512i rhs_mat_2367ABEF_3_sp1 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_3, (_MM_PERM_ENUM)136); //B2(24-27) B3(24-27) B2(24-27) B3(24-27) B6(24-27) B7(24-27) B6(24-27) B7(24-27) BA(24-27) BB(24-27) BA(24-27) BB(24-27) BE(24-27) BF(24-27) BE(24-27) BF(24-27) + lhs_vec_00 = _mm256_permute2f128_si256(lhs_vec_00, lhs_vec_00, 0); + lhs_vec_01 = _mm256_permute2f128_si256(lhs_vec_01, lhs_vec_01, 0); + lhs_vec_10 = _mm256_permute2f128_si256(lhs_vec_10, lhs_vec_10, 0); + lhs_vec_11 = _mm256_permute2f128_si256(lhs_vec_11, lhs_vec_11, 0); - // Shuffle pattern two - right side input + // Dot product done within 32 bit lanes and accumulated in the same vector + // First done for first sub block and thenn for second sub block in each sb + // B0(0-3) B4(0-3) B1(0-3) B5(0-3) B2(0-3) B6(0-3) B3(0-3) B7(0-3) with A0(0-3) + // B0(4-7) B4(4-7) B1(4-7) B5(4-7) B2(4-7) B6(4-7) B3(4-7) B7(4-7) with A0(4-7) + // ........................................................................... + // B0(28-31) B4(28-31) B1(28-31) B5(28-31) B2(28-31) B6(28-31) B3(28-31) B7(28-31) with A0(28-31) - const __m512i rhs_mat_014589CD_0_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_0, (_MM_PERM_ENUM)221); //B0(4-7) B1(4-7) B0(4-7) B1(4-7) B4(4-7) B5(4-7) B4(4-7) B5(4-7) B8(4-7) B9(4-7) B8(4-7) B9(4-7) BC(4-7) BD(4-7) BC(4-7) BD(4-7) - const __m512i rhs_mat_2367ABEF_0_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_0, (_MM_PERM_ENUM)221); //B2(4-7) B3(4-7) B2(4-7) B3(4-7) B6(4-7) B7(4-7) B6(4-7) B7(4-7) BA(4-7) BB(4-7) BA(4-7) BB(4-7) BE(4-7) BF(4-7) BE(4-7) BF(4-7) - const __m512i rhs_mat_014589CD_1_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_1, (_MM_PERM_ENUM)221); //B0(12-15) B1(12-15) B0(12-15) B1(12-15) B4(12-15) B5(12-15) B4(12-15) B5(12-15) B8(12-15) B9(12-15) B8(12-15) B9(12-15) BC(12-15) BD(12-15) BC(12-15) BD(12-15) - const __m512i rhs_mat_2367ABEF_1_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_1, (_MM_PERM_ENUM)221); //B2(12-15) B3(12-15) B2(12-15) B3(12-15) B6(12-15) B7(12-15) B6(12-15) B7(12-15) BA(12-15) BB(12-15) BA(12-15) BB(12-15) BE(12-15) BF(12-15) BE(12-15) BF(12-15) + __m256i iacc_0 = _mm256_setzero_si256(); + __m256i iacc_1 = _mm256_setzero_si256(); - const __m512i rhs_mat_014589CD_2_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_2, (_MM_PERM_ENUM)221); //B0(20-23) B1(20-23) B0(20-23) B1(20-23) B4(20-23) B5(20-23) B4(20-23) B5(20-23) B8(20-23) B9(20-23) B8(20-23) B9(20-23) BC(20-23) BD(20-23) BC(20-23) BD(20-23) - const __m512i rhs_mat_2367ABEF_2_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_2, (_MM_PERM_ENUM)221); //B2(20-23) B3(20-23) B2(20-23) B3(20-23) B6(20-23) B7(20-23) B6(20-23) B7(20-23) BA(20-23) BB(20-23) BA(20-23) BB(20-23) BE(20-23) BF(20-23) BE(20-23) BF(20-23) + iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_00 ,_mm256_shuffle_epi32(rhs_vec_4567_00, 177), 170), _mm256_shuffle_epi32(lhs_vec_00, 0))); + iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_00, 177) ,rhs_vec_4567_00, 170), _mm256_shuffle_epi32(lhs_vec_00, 85))); - const __m512i rhs_mat_014589CD_3_sp2 = _mm512_shuffle_epi32(rhs_mat_014589CD_3, (_MM_PERM_ENUM)221); //B0(28-31) B1(28-31) B0(28-31) B1(28-31) B4(28-31) B5(28-31) B4(28-31) B5(28-31) B8(28-31) B9(28-31) B8(28-31) B9(28-31) BC(28-31) BD(28-31) BC(28-31) BD(28-31) - const __m512i rhs_mat_2367ABEF_3_sp2 = _mm512_shuffle_epi32(rhs_mat_2367ABEF_3, (_MM_PERM_ENUM)221); //B2(28-31) B3(28-31) B2(28-31) B3(28-31) B6(28-31) B7(28-31) B6(28-31) B7(28-31) BA(28-31) BB(28-31) BA(28-31) BB(28-31) BE(28-31) BF(28-31) BE(28-31) BF(28-31) + iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_01 ,_mm256_shuffle_epi32(rhs_vec_4567_01, 177), 170), _mm256_shuffle_epi32(lhs_vec_00, 170))); + iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_01, 177) ,rhs_vec_4567_01, 170), _mm256_shuffle_epi32(lhs_vec_00, 255))); + iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_02 ,_mm256_shuffle_epi32(rhs_vec_4567_02, 177), 170), _mm256_shuffle_epi32(lhs_vec_01, 0))); + iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_02, 177) ,rhs_vec_4567_02, 170), _mm256_shuffle_epi32(lhs_vec_01, 85))); - // Scale values - Load the weight scale values of two block_q4_0x8 - const __m512 col_scale_f32 = GGML_F32Cx8x2_LOAD(b_ptr_0[b].d, b_ptr_1[b].d); + iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_03 ,_mm256_shuffle_epi32(rhs_vec_4567_03, 177), 170), _mm256_shuffle_epi32(lhs_vec_01, 170))); + iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_03, 177) ,rhs_vec_4567_03, 170), _mm256_shuffle_epi32(lhs_vec_01, 255))); - // Load the four block_q4_0 quantized values interleaved with each other in chunks of eight - A0,A1,A2,A3 - // Loaded as set of 128 bit vectors and repeated and stored into a 256 bit vector before again repeating into 512 bit vector - __m256i lhs_mat_ymm_0123_0 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs))); - __m256i lhs_mat_ymm_01_0 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_0, lhs_mat_ymm_0123_0, 0); - __m256i lhs_mat_ymm_23_0 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_0, lhs_mat_ymm_0123_0, 17); - __m256i lhs_mat_ymm_0123_1 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs + 32))); - __m256i lhs_mat_ymm_01_1 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_1, lhs_mat_ymm_0123_1, 0); - __m256i lhs_mat_ymm_23_1 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_1, lhs_mat_ymm_0123_1, 17); - __m256i lhs_mat_ymm_0123_2 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs + 64))); - __m256i lhs_mat_ymm_01_2 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_2, lhs_mat_ymm_0123_2, 0); - __m256i lhs_mat_ymm_23_2 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_2, lhs_mat_ymm_0123_2, 17); - __m256i lhs_mat_ymm_0123_3 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs + 96))); - __m256i lhs_mat_ymm_01_3 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_3, lhs_mat_ymm_0123_3, 0); - __m256i lhs_mat_ymm_23_3 = _mm256_permute2f128_si256(lhs_mat_ymm_0123_3, lhs_mat_ymm_0123_3, 17); + iacc_0 = _mm256_madd_epi16(iacc_0, scales_0); - __m512i lhs_mat_01_0 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_0), lhs_mat_ymm_01_0, 1); - __m512i lhs_mat_23_0 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_0), lhs_mat_ymm_23_0, 1); - __m512i lhs_mat_01_1 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_1), lhs_mat_ymm_01_1, 1); - __m512i lhs_mat_23_1 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_1), lhs_mat_ymm_23_1, 1); - __m512i lhs_mat_01_2 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_2), lhs_mat_ymm_01_2, 1); - __m512i lhs_mat_23_2 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_2), lhs_mat_ymm_23_2, 1); - __m512i lhs_mat_01_3 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_01_3), lhs_mat_ymm_01_3, 1); - __m512i lhs_mat_23_3 = _mm512_inserti32x8(_mm512_castsi256_si512(lhs_mat_ymm_23_3), lhs_mat_ymm_23_3, 1); + iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_10 ,_mm256_shuffle_epi32(rhs_vec_4567_10, 177), 170), _mm256_shuffle_epi32(lhs_vec_10, 0))); + iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_10, 177) ,rhs_vec_4567_10, 170), _mm256_shuffle_epi32(lhs_vec_10, 85))); - // Shuffle pattern one - left side input + iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_11 ,_mm256_shuffle_epi32(rhs_vec_4567_11, 177), 170), _mm256_shuffle_epi32(lhs_vec_10, 170))); + iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_11, 177) ,rhs_vec_4567_11, 170), _mm256_shuffle_epi32(lhs_vec_10, 255))); - const __m512i lhs_mat_01_0_sp1 = _mm512_shuffle_epi32(lhs_mat_01_0, (_MM_PERM_ENUM)160); //A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) - const __m512i lhs_mat_23_0_sp1 = _mm512_shuffle_epi32(lhs_mat_23_0, (_MM_PERM_ENUM)160); //A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) + iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_12 ,_mm256_shuffle_epi32(rhs_vec_4567_12, 177), 170), _mm256_shuffle_epi32(lhs_vec_11, 0))); + iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_12, 177) ,rhs_vec_4567_12, 170), _mm256_shuffle_epi32(lhs_vec_11, 85))); - const __m512i lhs_mat_01_1_sp1 = _mm512_shuffle_epi32(lhs_mat_01_1, (_MM_PERM_ENUM)160); //A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) - const __m512i lhs_mat_23_1_sp1 = _mm512_shuffle_epi32(lhs_mat_23_1, (_MM_PERM_ENUM)160); //A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) + iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_13 ,_mm256_shuffle_epi32(rhs_vec_4567_13, 177), 170), _mm256_shuffle_epi32(lhs_vec_11, 170))); + iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_13, 177) ,rhs_vec_4567_13, 170), _mm256_shuffle_epi32(lhs_vec_11, 255))); - const __m512i lhs_mat_01_2_sp1 = _mm512_shuffle_epi32(lhs_mat_01_2, (_MM_PERM_ENUM)160); //A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) - const __m512i lhs_mat_23_2_sp1 = _mm512_shuffle_epi32(lhs_mat_23_2, (_MM_PERM_ENUM)160); //A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) + iacc_1 = _mm256_madd_epi16(iacc_1, scales_1); - const __m512i lhs_mat_01_3_sp1 = _mm512_shuffle_epi32(lhs_mat_01_3, (_MM_PERM_ENUM)160); //A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) - const __m512i lhs_mat_23_3_sp1 = _mm512_shuffle_epi32(lhs_mat_23_3, (_MM_PERM_ENUM)160); //A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) + // Accumulate the iacc value for one sb + __m256i iacc_sb = _mm256_add_epi32(iacc_0, iacc_1); - // Shuffle pattern two - left side input + // Broadcast the bsums of the two sub blocks of the iteration of Q8_K across the vector + // Multiply-Add with corresponding mins of Q4_Kx8 with bsums + __m256i q8s_sb = _mm256_shuffle_epi32(q8s, 0); + __m256i iacc_min_sb = _mm256_madd_epi16(q8s_sb, mins_01); + q8s = _mm256_bsrli_epi128(q8s, 4); - const __m512i lhs_mat_01_0_sp2 = _mm512_shuffle_epi32(lhs_mat_01_0, (_MM_PERM_ENUM)245); //A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) - const __m512i lhs_mat_23_0_sp2 = _mm512_shuffle_epi32(lhs_mat_23_0, (_MM_PERM_ENUM)245); //A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) + // Accumulate for the complete block + iacc_b = _mm256_add_epi32(iacc_b, iacc_sb); + iacc_min_b = _mm256_add_epi32(iacc_min_b, iacc_min_sb); + } - const __m512i lhs_mat_01_1_sp2 = _mm512_shuffle_epi32(lhs_mat_01_1, (_MM_PERM_ENUM)245); //A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) - const __m512i lhs_mat_23_1_sp2 = _mm512_shuffle_epi32(lhs_mat_23_1, (_MM_PERM_ENUM)245); //A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) + // Multiply-Add with scale values for the complete super block + acc_row = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_b), _mm256_mul_ps(col_scale_f32, row_scale_f32), acc_row); + acc_min_rows = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_min_b), _mm256_mul_ps(col_dmin_f32, row_scale_f32), acc_min_rows); - const __m512i lhs_mat_01_2_sp2 = _mm512_shuffle_epi32(lhs_mat_01_2, (_MM_PERM_ENUM)245); //A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) - const __m512i lhs_mat_23_2_sp2 = _mm512_shuffle_epi32(lhs_mat_23_2, (_MM_PERM_ENUM)245); //A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) + } - const __m512i lhs_mat_01_3_sp2 = _mm512_shuffle_epi32(lhs_mat_01_3, (_MM_PERM_ENUM)245); //A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) - const __m512i lhs_mat_23_3_sp2 = _mm512_shuffle_epi32(lhs_mat_23_3, (_MM_PERM_ENUM)245); //A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) + // Accumulated output values permuted so as to be stored in appropriate order post accumulation + acc_row = _mm256_permutevar8x32_ps(acc_row, finalpermutemask); + _mm256_storeu_ps(s + (y * nr + x * 8), _mm256_sub_ps(acc_row, acc_min_rows)); + } + } - // The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane - // Resembles MMLAs into 2x2 matrices in ARM Version - const __m512i zero = _mm512_setzero_epi32(); - __m512i iacc_mat_00_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp1, rhs_mat_014589CD_3_sp1), lhs_mat_01_2_sp1, rhs_mat_014589CD_2_sp1), lhs_mat_01_1_sp1, rhs_mat_014589CD_1_sp1), lhs_mat_01_0_sp1, rhs_mat_014589CD_0_sp1); - __m512i iacc_mat_01_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp1, rhs_mat_2367ABEF_3_sp1), lhs_mat_01_2_sp1, rhs_mat_2367ABEF_2_sp1), lhs_mat_01_1_sp1, rhs_mat_2367ABEF_1_sp1), lhs_mat_01_0_sp1, rhs_mat_2367ABEF_0_sp1); - __m512i iacc_mat_10_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp1, rhs_mat_014589CD_3_sp1), lhs_mat_23_2_sp1, rhs_mat_014589CD_2_sp1), lhs_mat_23_1_sp1, rhs_mat_014589CD_1_sp1), lhs_mat_23_0_sp1, rhs_mat_014589CD_0_sp1); - __m512i iacc_mat_11_sp1 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp1, rhs_mat_2367ABEF_3_sp1), lhs_mat_23_2_sp1, rhs_mat_2367ABEF_2_sp1), lhs_mat_23_1_sp1, rhs_mat_2367ABEF_1_sp1), lhs_mat_23_0_sp1, rhs_mat_2367ABEF_0_sp1); - __m512i iacc_mat_00_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp2, rhs_mat_014589CD_3_sp2), lhs_mat_01_2_sp2, rhs_mat_014589CD_2_sp2), lhs_mat_01_1_sp2, rhs_mat_014589CD_1_sp2), lhs_mat_01_0_sp2, rhs_mat_014589CD_0_sp2); - __m512i iacc_mat_01_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_01_3_sp2, rhs_mat_2367ABEF_3_sp2), lhs_mat_01_2_sp2, rhs_mat_2367ABEF_2_sp2), lhs_mat_01_1_sp2, rhs_mat_2367ABEF_1_sp2), lhs_mat_01_0_sp2, rhs_mat_2367ABEF_0_sp2); - __m512i iacc_mat_10_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp2, rhs_mat_014589CD_3_sp2), lhs_mat_23_2_sp2, rhs_mat_014589CD_2_sp2), lhs_mat_23_1_sp2, rhs_mat_014589CD_1_sp2), lhs_mat_23_0_sp2, rhs_mat_014589CD_0_sp2); - __m512i iacc_mat_11_sp2 = mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(mul_sum_i8_pairs_acc_int32x16(zero, lhs_mat_23_3_sp2, rhs_mat_2367ABEF_3_sp2), lhs_mat_23_2_sp2, rhs_mat_2367ABEF_2_sp2), lhs_mat_23_1_sp2, rhs_mat_2367ABEF_1_sp2), lhs_mat_23_0_sp2, rhs_mat_2367ABEF_0_sp2); +#else + UNUSED(kmask1); + UNUSED(kmask2); + UNUSED(kmask3); + ggml_gemv_q4_K_8x8_q8_K_generic(n, s, bs, vx, vy, nr, nc); +#endif +} - // Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block - __m512i iacc_mat_00 = _mm512_add_epi32(iacc_mat_00_sp1, iacc_mat_00_sp2); - __m512i iacc_mat_01 = _mm512_add_epi32(iacc_mat_01_sp1, iacc_mat_01_sp2); - __m512i iacc_mat_10 = _mm512_add_epi32(iacc_mat_10_sp1, iacc_mat_10_sp2); - __m512i iacc_mat_11 = _mm512_add_epi32(iacc_mat_11_sp1, iacc_mat_11_sp2); +void ggml_gemv_iq4_nl_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc) { +#if defined(__AVX2__) + __m256i signextendlut = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i*)kvalues_iq4nl)); + signextendlut = _mm256_permute2f128_si256(signextendlut, signextendlut, 0); + gemv_q4_b32_8x8_q8_0_lut_avx(n, s, bs, vx, vy, nr, nc, signextendlut); - // Straighten out to make 4 row vectors - __m512i iacc_row_0 = _mm512_mask_blend_epi32(0xCCCC, iacc_mat_00, _mm512_shuffle_epi32(iacc_mat_01, (_MM_PERM_ENUM)78)); - __m512i iacc_row_1 = _mm512_mask_blend_epi32(0xCCCC, _mm512_shuffle_epi32(iacc_mat_00, (_MM_PERM_ENUM)78), iacc_mat_01); - __m512i iacc_row_2 = _mm512_mask_blend_epi32(0xCCCC, iacc_mat_10, _mm512_shuffle_epi32(iacc_mat_11, (_MM_PERM_ENUM)78)); - __m512i iacc_row_3 = _mm512_mask_blend_epi32(0xCCCC, _mm512_shuffle_epi32(iacc_mat_10, (_MM_PERM_ENUM)78), iacc_mat_11); + return; +#endif - // Load the scale(d) values for all the 4 Q8_0 blocks and repeat it across lanes - const __m128i row_scale_f16 = _mm_shuffle_epi32(_mm_maskload_epi32((int const*)(a_ptr[b].d), loadMask), 68); - const __m512 row_scale_f32 = GGML_F32Cx16_REPEAT_LOAD(row_scale_f16); + ggml_gemv_iq4_nl_8x8_q8_0_generic(n, s, bs, vx, vy, nr, nc); +} - // Multiply with appropiate scales and accumulate - acc_rows[0] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_0), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 0)), acc_rows[0]); - acc_rows[1] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_1), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 85)), acc_rows[1]); - acc_rows[2] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_2), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 170)), acc_rows[2]); - acc_rows[3] = _mm512_fmadd_ps(_mm512_cvtepi32_ps(iacc_row_3), _mm512_mul_ps(col_scale_f32, _mm512_shuffle_ps(row_scale_f32, row_scale_f32, 255)), acc_rows[3]); - } +void ggml_gemv_q2_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc) { + const int qk = QK_K; + const int nb = n / qk; + const int ncols_interleaved = 8; + const int blocklen = 8; - // Store the accumulated values - for (int i = 0; i < 4; i++) { - _mm512_storeu_ps((float *)(s + ((y * 4 + i) * bs + x * 8)), acc_rows[i]); - } - } - } - if (anc != nc) { - xstart = anc/8; - y = 0; - } - #endif // __AVX512F__ + assert (n % qk == 0); + assert (nc % ncols_interleaved == 0); - // Take group of four block_q8_0x4 structures at each pass of the loop and perform dot product operation + UNUSED(s); + UNUSED(bs); + UNUSED(vx); + UNUSED(vy); + UNUSED(nr); + UNUSED(nc); + UNUSED(nb); + UNUSED(ncols_interleaved); + UNUSED(blocklen); - for (; y < anr / 4; y += 4) { - const block_q8_0x4 * a_ptrs[4]; +#if defined(__AVX2__) + // Lookup table to convert signed nibbles to signed bytes + __m256i signextendlut = _mm256_castsi128_si256(_mm_set_epi8(-1, -2, -3, -4, -5, -6, -7, -8, 7, 6, 5, 4, 3, 2, 1, 0)); + signextendlut = _mm256_permute2f128_si256(signextendlut, signextendlut, 0); + // Shuffle masks to rearrange delta values to multiply with appropriate scales + __m128i deltamask = _mm_set_epi8(15, 14, 7, 6, 13, 12, 5, 4, 11, 10, 3, 2, 9, 8, 1, 0); + // Permute mask used for easier vector processing at later stages + __m256i finalpermutemask = _mm256_set_epi32(7, 5, 3, 1, 6, 4, 2, 0); - a_ptrs[0] = a_ptr_start + (y * nb); - for (int i = 0; i < 3; ++i) { - a_ptrs[i + 1] = a_ptrs[i] + nb; - } + const __m256i m3b = _mm256_set1_epi8(3); + const __m128i m4b_sse = _mm_set1_epi8(0xF); - // Take group of eight block_q4_0x8 structures at each pass of the loop and perform dot product operation - for (int64_t x = xstart; x < nc / 8; x++) { + //Mask to get appropriate scales + __m128i scalemask1 = _mm_set_epi8(14,14,6,6,12,12,4,4,10,10,2,2,8,8,0,0); + __m128i scalemask2 = _mm_set_epi8(15,15,7,7,13,13,5,5,11,11,3,3,9,9,1,1); - const block_q4_0x8 * b_ptr = b_ptr_start + (x * b_nb); + int64_t b_nb = n / QK_K; - // Master FP accumulators - __m256 acc_rows[16]; - for (int i = 0; i < 16; i++) { - acc_rows[i] = _mm256_setzero_ps(); - } + const block_q2_Kx8 * b_ptr_start = (const block_q2_Kx8 *)vx; + const block_q8_K * a_ptr_start = (const block_q8_K *)vy; - for (int64_t b = 0; b < nb; b++) { - // Load the eight block_q4_0 quantized values interleaved with each other in chunks of eight - B0,B1 ....B6,B7 - const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs)); - const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs + 32)); - const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs + 64)); - const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs + 96)); + // Process Q8_K blocks one by one + for (int64_t y = 0; y < nr; y++) { - // Save the values in the following vectors in the formats B0B1B4B5, B2B3B6B7 for further processing and storing of values - const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32(rhs_raw_mat_0123_0, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_0, requiredOrder), 240); - const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_0, requiredOrder), rhs_raw_mat_4567_0, 240); - const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32(rhs_raw_mat_0123_1, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_1, requiredOrder), 240); - const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_1, requiredOrder), rhs_raw_mat_4567_1, 240); + // Pointers to LHS blocks of block_q8_K format + const block_q8_K * a_ptr = a_ptr_start + (y * nb); - // 4-bit -> 8-bit - Sign is maintained - const __m256i rhs_mat_0145_0 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_0145_0, m4b)); //B0(0-7) B1(0-7) B4(0-7) B5(0-7) - const __m256i rhs_mat_2367_0 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_2367_0, m4b)); //B2(0-7) B3(0-7) B6(0-7) B7(0-7) + // Take group of eight interleaved block_q2_K structures at each pass of the loop and perform dot product operation + for(int64_t x = 0; x < nc / 8; x++) { - const __m256i rhs_mat_0145_1 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_0145_1, m4b)); //B0(8-15) B1(8-15) B4(8-15) B5(8-15) - const __m256i rhs_mat_2367_1 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_2367_1, m4b)); //B2(8-15) B3(8-15) B6(8-15) B7(8-15) + // Pointers to RHS blocks + const block_q2_Kx8 * b_ptr = b_ptr_start + (x * b_nb); - const __m256i rhs_mat_0145_2 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_0145_0, 4), m4b)); //B0(16-23) B1(16-23) B4(16-23) B5(16-23) - const __m256i rhs_mat_2367_2 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_2367_0, 4), m4b)); //B2(16-23) B3(16-23) B6(16-23) B7(16-23) + // Master FP accumulators + __m256 acc_row = _mm256_setzero_ps(); + __m256 acc_min_rows = _mm256_setzero_ps(); - const __m256i rhs_mat_0145_3 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_0145_1, 4), m4b)); //B0(24-31) B1(24-31) B4(24-31) B5(24-31) - const __m256i rhs_mat_2367_3 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_2367_1, 4), m4b)); //B2(24-31) B3(24-31) B6(24-31) B7(24-31) + for (int64_t b = 0; b < nb; b++) { - // Shuffle pattern one - right side input - const __m256i rhs_mat_0145_0_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_0, 136); //B0(0-3) B1(0-3) B0(0-3) B1(0-3) B4(0-3) B5(0-3) B4(0-3) B5(0-3) - const __m256i rhs_mat_2367_0_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_0, 136); //B2(0-3) B3(0-3) B2(0-3) B3(0-3) B6(0-3) B7(0-3) B6(0-3) B7(0-3) + // Load and convert to FP32 delta from block_q8_K + const __m256 row_scale_f32 = _mm256_set1_ps((a_ptr[b].d)); - const __m256i rhs_mat_0145_1_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_1, 136); //B0(8-11) B1(8-11) B0(8-11) B1(8-11) B4(8-11) B5(8-11) B4(8-11) B5(8-11) - const __m256i rhs_mat_2367_1_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_1, 136); //B2(8-11) B3(8-11) B2(8-11) B3(8-11) B6(8-11) B7(8-11) B6(8-11) B7(8-11) + // Load the delta values for the 8 blocks interleaved in block_q2_Kx8 + // col_scale_f32 rearranged so as to multiply with appropriate quants + const __m256 col_scale_f32 = GGML_F32Cx8_REARRANGE_LOAD(b_ptr[b].d, deltamask); + const __m256 col_dmin_f32 = GGML_F32Cx8_LOAD(b_ptr[b].dmin); - const __m256i rhs_mat_0145_2_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_2, 136); //B0(16-19) B1(16-19) B0(16-19) B1(16-19) B4(16-19) B5(16-19) B4(16-19) B5(16-19) - const __m256i rhs_mat_2367_2_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_2, 136); //B2(16-19) B3(16-19) B2(16-19) B3(16-19) B6(16-19) B7(16-19) B6(16-19) B7(16-19) + __m256i iacc_b = _mm256_setzero_si256(); + __m256i iacc_min_b = _mm256_setzero_si256(); - const __m256i rhs_mat_0145_3_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_3, 136); //B0(24-27) B1(24-27) B0(24-27) B1(24-27) B4(24-27) B5(24-27) B4(24-27) B5(24-27) - const __m256i rhs_mat_2367_3_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_3, 136); //B2(24-27) B3(24-27) B2(24-27) B3(24-27) B6(24-27) B7(24-27) B6(24-27) B7(24-27) + // Processes eight sub blocks from each Q2_K in each iteration + for(int sb = 0; sb < QK_K / 128; sb++) { - // Shuffle pattern two - right side input + // Load the eight block_q2_K for eight sub blocks quantized values interleaved with each other in chunks of eight - B0,B1 ....B6,B7 + const __m256i rhs_raw_vec_0123_0 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + sb * 256)); + const __m256i rhs_raw_vec_4567_0 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 32 + sb * 256)); + const __m256i rhs_raw_vec_0123_1 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 64 + sb * 256)); + const __m256i rhs_raw_vec_4567_1 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 96 + sb * 256)); + const __m256i rhs_raw_vec_0123_2 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 128 + sb * 256)); + const __m256i rhs_raw_vec_4567_2 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 160 + sb * 256)); + const __m256i rhs_raw_vec_0123_3 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 192 + sb * 256)); + const __m256i rhs_raw_vec_4567_3 = _mm256_loadu_si256((const __m256i * )(b_ptr[b].qs + 224 + sb * 256)); - const __m256i rhs_mat_0145_0_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_0, 221); //B0(4-7) B1(4-7) B0(4-7) B1(4-7) B4(4-7) B5(4-7) B4(4-7) B5(4-7) - const __m256i rhs_mat_2367_0_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_0, 221); //B2(4-7) B3(4-7) B2(4-7) B3(4-7) B6(4-7) B7(4-7) B6(4-7) B7(4-7) + // 2-bit -> 8-bit + // Values of the 0th,2nd,4th,6th sub blocks of eight block_q2_K structures for the sb loop + const __m256i rhs_vec_0123_00 = _mm256_and_si256(rhs_raw_vec_0123_0, m3b); //B00(0-7) B01(0-7) B02(0-7) B03(0-7) + const __m256i rhs_vec_0123_20 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_0, 2), m3b); //B20(0-7) B21(0-7) B22(0-7) B23(0-7) + const __m256i rhs_vec_0123_40 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_0, 4), m3b); //B40(0-7) B41(0-7) B42(0-7) B43(0-7) + const __m256i rhs_vec_0123_60 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_0, 6), m3b); //B60(0-7) B61(0-7) B62(0-7) B63(0-7) - const __m256i rhs_mat_0145_1_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_1, 221); //B0(12-15) B1(12-15) B0(12-15) B1(12-15) B4(12-15) B5(12-15) B4(12-15) B5(12-15) - const __m256i rhs_mat_2367_1_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_1, 221); //B2(12-15) B3(12-15) B2(12-15) B3(12-15) B6(12-15) B7(12-15) B6(12-15) B7(12-15) + const __m256i rhs_vec_4567_00 = _mm256_and_si256(rhs_raw_vec_4567_0, m3b); //B04(0-7) B05(0-7) B06(0-7) B07(0-7) + const __m256i rhs_vec_4567_20 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_0, 2), m3b); //B24(0-7) B25(0-7) B26(0-7) B27(0-7) + const __m256i rhs_vec_4567_40 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_0, 4), m3b); //B44(0-7) B45(0-7) B46(0-7) B47(0-7) + const __m256i rhs_vec_4567_60 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_0, 6), m3b); //B64(0-7) B65(0-7) B66(0-7) B67(0-7) - const __m256i rhs_mat_0145_2_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_2, 221); //B0(20-23) B1(20-23) B0(20-23) B1(20-23) B4(20-23) B5(20-23) B4(20-23) B5(20-23) - const __m256i rhs_mat_2367_2_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_2, 221); //B2(20-23) B3(20-23) B2(20-23) B3(20-23) B6(20-23) B7(20-23) B6(20-23) B7(20-23) + const __m256i rhs_vec_0123_01 = _mm256_and_si256(rhs_raw_vec_0123_1, m3b); //B00(8-15) B01(8-15) B02(8-15) B03(8-15) + const __m256i rhs_vec_0123_21 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_1, 2), m3b); //B20(8-15) B21(8-15) B22(8-15) B23(8-15) + const __m256i rhs_vec_0123_41 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_1, 4), m3b); //B40(8-15) B41(8-15) B42(8-15) B43(8-15) + const __m256i rhs_vec_0123_61 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_1, 6), m3b); //B60(8-15) B61(8-15) B62(8-15) B63(8-15) - const __m256i rhs_mat_0145_3_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_3, 221); //B0(28-31) B1(28-31) B0(28-31) B1(28-31) B4(28-31) B5(28-31) B4(28-31) B5(28-31) - const __m256i rhs_mat_2367_3_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_3, 221); //B2(28-31) B3(28-31) B2(28-31) B3(28-31) B6(28-31) B7(28-31) B6(28-31) B7(28-31) + const __m256i rhs_vec_4567_01 = _mm256_and_si256(rhs_raw_vec_4567_1, m3b); //B04(8-15) B05(8-15) B06(8-15) B07(8-15) + const __m256i rhs_vec_4567_21 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_1, 2), m3b); //B24(8-15) B25(8-15) B26(8-15) B27(8-15) + const __m256i rhs_vec_4567_41 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_1, 4), m3b); //B44(8-15) B45(8-15) B46(8-15) B47(8-15) + const __m256i rhs_vec_4567_61 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_1, 6), m3b); //B64(8-15) B65(8-15) B66(8-15) B67(8-15) - // Scale values - Load the wight scale values of block_q4_0x8 - const __m256 col_scale_f32 = GGML_F32Cx8_LOAD(b_ptr[b].d); + // Values of the 1st,3rd,5th,7th sub blocks of eight block_q2_K structures for the sb loop + const __m256i rhs_vec_0123_10 = _mm256_and_si256(rhs_raw_vec_0123_2, m3b); //B10(0-7) B11(0-7) B12(0-7) B13(0-7) + const __m256i rhs_vec_0123_30 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_2, 2), m3b); //B30(0-7) B31(0-7) B32(0-7) B33(0-7) + const __m256i rhs_vec_0123_50 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_2, 4), m3b); //B50(0-7) B51(0-7) B52(0-7) B53(0-7) + const __m256i rhs_vec_0123_70 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_2, 6), m3b); //B70(0-7) B71(0-7) B72(0-7) B73(0-7) - // Process LHS in groups of four - for (int rp = 0; rp < 4; rp++) { - // Load the four block_q4_0 quantized values interleaved with each other in chunks of eight - A0,A1,A2,A3 - // Loaded as set of 128 bit vectors and repeated into a 256 bit vector - __m256i lhs_mat_0123_0 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs))); - __m256i lhs_mat_01_0 = _mm256_permute2f128_si256(lhs_mat_0123_0, lhs_mat_0123_0, 0); - __m256i lhs_mat_23_0 = _mm256_permute2f128_si256(lhs_mat_0123_0, lhs_mat_0123_0, 17); - __m256i lhs_mat_0123_1 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs + 32))); - __m256i lhs_mat_01_1 = _mm256_permute2f128_si256(lhs_mat_0123_1, lhs_mat_0123_1, 0); - __m256i lhs_mat_23_1 = _mm256_permute2f128_si256(lhs_mat_0123_1, lhs_mat_0123_1, 17); - __m256i lhs_mat_0123_2 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs + 64))); - __m256i lhs_mat_01_2 = _mm256_permute2f128_si256(lhs_mat_0123_2, lhs_mat_0123_2, 0); - __m256i lhs_mat_23_2 = _mm256_permute2f128_si256(lhs_mat_0123_2, lhs_mat_0123_2, 17); - __m256i lhs_mat_0123_3 = _mm256_loadu_si256((const __m256i *)((a_ptrs[rp][b].qs + 96))); - __m256i lhs_mat_01_3 = _mm256_permute2f128_si256(lhs_mat_0123_3, lhs_mat_0123_3, 0); - __m256i lhs_mat_23_3 = _mm256_permute2f128_si256(lhs_mat_0123_3, lhs_mat_0123_3, 17); + const __m256i rhs_vec_4567_10 = _mm256_and_si256(rhs_raw_vec_4567_2, m3b); //B14(0-7) B15(0-7) B16(0-7) B17(0-7) + const __m256i rhs_vec_4567_30 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_2, 2), m3b); //B34(0-7) B35(0-7) B36(0-7) B37(0-7) + const __m256i rhs_vec_4567_50 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_2, 4), m3b); //B54(0-7) B55(0-7) B56(0-7) B57(0-7) + const __m256i rhs_vec_4567_70 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_2, 6), m3b); //B74(0-7) B75(0-7) B76(0-7) B77(0-7) - // Shuffle pattern one - left side input - const __m256i lhs_mat_01_0_sp1 = _mm256_shuffle_epi32(lhs_mat_01_0, 160); //A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) - const __m256i lhs_mat_23_0_sp1 = _mm256_shuffle_epi32(lhs_mat_23_0, 160); //A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) + const __m256i rhs_vec_0123_11 = _mm256_and_si256(rhs_raw_vec_0123_3, m3b); //B10(8-15) B11(8-15) B12(8-15) B13(8-15) + const __m256i rhs_vec_0123_31 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_3, 2), m3b); //B30(8-15) B31(8-15) B32(8-15) B33(8-15) + const __m256i rhs_vec_0123_51 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_3, 4), m3b); //B50(8-15) B51(8-15) B52(8-15) B53(8-15) + const __m256i rhs_vec_0123_71 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_0123_3, 6), m3b); //B70(8-15) B71(8-15) B72(8-15) B73(8-15) - const __m256i lhs_mat_01_1_sp1 = _mm256_shuffle_epi32(lhs_mat_01_1, 160); //A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) - const __m256i lhs_mat_23_1_sp1 = _mm256_shuffle_epi32(lhs_mat_23_1, 160); //A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) + const __m256i rhs_vec_4567_11 = _mm256_and_si256(rhs_raw_vec_4567_3, m3b); //B14(8-15) B15(8-15) B16(8-15) B17(8-15) + const __m256i rhs_vec_4567_31 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_3, 2), m3b); //B34(8-15) B35(8-15) B36(8-15) B37(8-15) + const __m256i rhs_vec_4567_51 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_3, 4), m3b); //B54(8-15) B55(8-15) B56(8-15) B57(8-15) + const __m256i rhs_vec_4567_71 = _mm256_and_si256(_mm256_srli_epi16(rhs_raw_vec_4567_3, 6), m3b); //B74(8-15) B75(8-15) B76(8-15) B77(8-15) - const __m256i lhs_mat_01_2_sp1 = _mm256_shuffle_epi32(lhs_mat_01_2, 160); //A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) - const __m256i lhs_mat_23_2_sp1 = _mm256_shuffle_epi32(lhs_mat_23_2, 160); //A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) + //Scales and Mins of corresponding sub blocks from different Q2_K structures are stored together + //s00 m00 s01 m01 s10 m10 s11 m11 s20 m20 s21 m21 s30 m30 s31 m31 s40 m40 s41 m41 s50 m50 s51 m51 s60 m60 s61 m61 s70 m70 s71 m71 - const __m256i lhs_mat_01_3_sp1 = _mm256_shuffle_epi32(lhs_mat_01_3, 160); //A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) - const __m256i lhs_mat_23_3_sp1 = _mm256_shuffle_epi32(lhs_mat_23_3, 160); //A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) + const __m128i mins_and_scales_01 = _mm_loadu_si128((const __m128i *)(b_ptr[b].scales + sb * 64)); + const __m128i mins_and_scales_23 = _mm_loadu_si128((const __m128i *)(b_ptr[b].scales + 16 + sb * 64)); + const __m128i mins_and_scales_45 = _mm_loadu_si128((const __m128i *)(b_ptr[b].scales + 32 + sb * 64)); + const __m128i mins_and_scales_67 = _mm_loadu_si128((const __m128i *)(b_ptr[b].scales + 48 + sb * 64)); - // Shuffle pattern two - left side input - const __m256i lhs_mat_01_0_sp2 = _mm256_shuffle_epi32(lhs_mat_01_0, 245); //A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) - const __m256i lhs_mat_23_0_sp2 = _mm256_shuffle_epi32(lhs_mat_23_0, 245); //A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) + // Extract scales which is lower half from mins_and_scales + const __m128i scales_01 = _mm_and_si128(mins_and_scales_01, m4b_sse); + const __m128i scales_23 = _mm_and_si128(mins_and_scales_23, m4b_sse); + const __m128i scales_45 = _mm_and_si128(mins_and_scales_45, m4b_sse); + const __m128i scales_67 = _mm_and_si128(mins_and_scales_67, m4b_sse); - const __m256i lhs_mat_01_1_sp2 = _mm256_shuffle_epi32(lhs_mat_01_1, 245); //A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) - const __m256i lhs_mat_23_1_sp2 = _mm256_shuffle_epi32(lhs_mat_23_1, 245); //A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) + // Extract mins which is upper half from mins_and_scales + const __m256i mins_01 = _mm256_cvtepu8_epi16(_mm_and_si128(_mm_srli_epi16(mins_and_scales_01, 4), m4b_sse)); + const __m256i mins_23 = _mm256_cvtepu8_epi16(_mm_and_si128(_mm_srli_epi16(mins_and_scales_23, 4), m4b_sse)); + const __m256i mins_45 = _mm256_cvtepu8_epi16(_mm_and_si128(_mm_srli_epi16(mins_and_scales_45, 4), m4b_sse)); + const __m256i mins_67 = _mm256_cvtepu8_epi16(_mm_and_si128(_mm_srli_epi16(mins_and_scales_67, 4), m4b_sse)); - const __m256i lhs_mat_01_2_sp2 = _mm256_shuffle_epi32(lhs_mat_01_2, 245); //A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) - const __m256i lhs_mat_23_2_sp2 = _mm256_shuffle_epi32(lhs_mat_23_2, 245); //A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) + // Scales of sub blocks in the sb loop + // Scales of the 0th sub block from each super block + __m128i scales_rearrange_0 = _mm_shuffle_epi8(scales_01, scalemask1); + __m256i scales_0 = _mm256_cvtepu8_epi16(scales_rearrange_0); - const __m256i lhs_mat_01_3_sp2 = _mm256_shuffle_epi32(lhs_mat_01_3, 245); //A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) - const __m256i lhs_mat_23_3_sp2 = _mm256_shuffle_epi32(lhs_mat_23_3, 245); //A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) + // Scales of the 1st sub block from each super block + __m128i scales_rearrange_1 = _mm_shuffle_epi8(scales_01, scalemask2); + __m256i scales_1 = _mm256_cvtepu8_epi16(scales_rearrange_1); - // The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane - // Resembles MMLAs into 2x2 matrices in ARM Version - const __m256i zero = _mm256_setzero_si256(); - __m256i iacc_mat_00_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp1, rhs_mat_0145_3_sp1), lhs_mat_01_2_sp1, rhs_mat_0145_2_sp1), lhs_mat_01_1_sp1, rhs_mat_0145_1_sp1), lhs_mat_01_0_sp1, rhs_mat_0145_0_sp1); - __m256i iacc_mat_01_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp1, rhs_mat_2367_3_sp1), lhs_mat_01_2_sp1, rhs_mat_2367_2_sp1), lhs_mat_01_1_sp1, rhs_mat_2367_1_sp1), lhs_mat_01_0_sp1, rhs_mat_2367_0_sp1); - __m256i iacc_mat_10_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp1, rhs_mat_0145_3_sp1), lhs_mat_23_2_sp1, rhs_mat_0145_2_sp1), lhs_mat_23_1_sp1, rhs_mat_0145_1_sp1), lhs_mat_23_0_sp1, rhs_mat_0145_0_sp1); - __m256i iacc_mat_11_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp1, rhs_mat_2367_3_sp1), lhs_mat_23_2_sp1, rhs_mat_2367_2_sp1), lhs_mat_23_1_sp1, rhs_mat_2367_1_sp1), lhs_mat_23_0_sp1, rhs_mat_2367_0_sp1); - __m256i iacc_mat_00_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp2, rhs_mat_0145_3_sp2), lhs_mat_01_2_sp2, rhs_mat_0145_2_sp2), lhs_mat_01_1_sp2, rhs_mat_0145_1_sp2), lhs_mat_01_0_sp2, rhs_mat_0145_0_sp2); - __m256i iacc_mat_01_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp2, rhs_mat_2367_3_sp2), lhs_mat_01_2_sp2, rhs_mat_2367_2_sp2), lhs_mat_01_1_sp2, rhs_mat_2367_1_sp2), lhs_mat_01_0_sp2, rhs_mat_2367_0_sp2); - __m256i iacc_mat_10_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp2, rhs_mat_0145_3_sp2), lhs_mat_23_2_sp2, rhs_mat_0145_2_sp2), lhs_mat_23_1_sp2, rhs_mat_0145_1_sp2), lhs_mat_23_0_sp2, rhs_mat_0145_0_sp2); - __m256i iacc_mat_11_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp2, rhs_mat_2367_3_sp2), lhs_mat_23_2_sp2, rhs_mat_2367_2_sp2), lhs_mat_23_1_sp2, rhs_mat_2367_1_sp2), lhs_mat_23_0_sp2, rhs_mat_2367_0_sp2); + // Scales of the 2nd sub block from each super block + __m128i scales_rearrange_2 = _mm_shuffle_epi8(scales_23, scalemask1); + __m256i scales_2 = _mm256_cvtepu8_epi16(scales_rearrange_2); - // Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block - __m256i iacc_mat_00 = _mm256_add_epi32(iacc_mat_00_sp1, iacc_mat_00_sp2); - __m256i iacc_mat_01 = _mm256_add_epi32(iacc_mat_01_sp1, iacc_mat_01_sp2); - __m256i iacc_mat_10 = _mm256_add_epi32(iacc_mat_10_sp1, iacc_mat_10_sp2); - __m256i iacc_mat_11 = _mm256_add_epi32(iacc_mat_11_sp1, iacc_mat_11_sp2); + // Scales of the 3rd sub block from each super block + __m128i scales_rearrange_3 = _mm_shuffle_epi8(scales_23, scalemask2); + __m256i scales_3 = _mm256_cvtepu8_epi16(scales_rearrange_3); - // Straighten out to make 4 row vectors - __m256i iacc_row_0 = _mm256_blend_epi32(iacc_mat_00, _mm256_shuffle_epi32(iacc_mat_01, 78), 204); - __m256i iacc_row_1 = _mm256_blend_epi32(_mm256_shuffle_epi32(iacc_mat_00, 78), iacc_mat_01, 204); - __m256i iacc_row_2 = _mm256_blend_epi32(iacc_mat_10, _mm256_shuffle_epi32(iacc_mat_11, 78), 204); - __m256i iacc_row_3 = _mm256_blend_epi32(_mm256_shuffle_epi32(iacc_mat_10, 78), iacc_mat_11, 204); + // Scales of the 4th sub block from each super block + __m128i scales_rearrange_4 = _mm_shuffle_epi8(scales_45, scalemask1); + __m256i scales_4 = _mm256_cvtepu8_epi16(scales_rearrange_4); - // Load the scale(d) values for all the 4 Q8_0 blocks and repeat it across lanes - const __m256 row_scale_f32 = GGML_F32Cx8_REPEAT_LOAD(a_ptrs[rp][b].d, loadMask); + // Scales of the 5th sub block from each super block + __m128i scales_rearrange_5 = _mm_shuffle_epi8(scales_45, scalemask2); + __m256i scales_5 = _mm256_cvtepu8_epi16(scales_rearrange_5); - // Multiply with appropiate scales and accumulate - acc_rows[rp * 4] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_0), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 0)), acc_rows[rp * 4]); - acc_rows[rp * 4 + 1] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_1), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 85)), acc_rows[rp * 4 + 1]); - acc_rows[rp * 4 + 2] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_2), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 170)), acc_rows[rp * 4 + 2]); - acc_rows[rp * 4 + 3] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_3), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 255)), acc_rows[rp * 4 + 3]); - } - } + // Scales of the 6th sub block from each super block + __m128i scales_rearrange_6 = _mm_shuffle_epi8(scales_67, scalemask1); + __m256i scales_6 = _mm256_cvtepu8_epi16(scales_rearrange_6); - // Store the accumulated values - for (int i = 0; i < 16; i++) { - _mm256_storeu_ps((float *)(s + ((y * 4 + i) * bs + x * 8)), acc_rows[i]); - } - } - } + // Scales of the 7th sub block from each super block + __m128i scales_rearrange_7 = _mm_shuffle_epi8(scales_67, scalemask2); + __m256i scales_7 = _mm256_cvtepu8_epi16(scales_rearrange_7); - // Take a block_q8_0x4 structures at each pass of the loop and perform dot product operation - for (; y < nr / 4; y ++) { + // Load the sub block values corresponding to sb in block_q8_K 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 + sb * 128))); + __m256i lhs_vec_1 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 16 + sb * 128))); + __m256i lhs_vec_2 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 32 + sb * 128))); + __m256i lhs_vec_3 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 48 + sb * 128))); + __m256i lhs_vec_4 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 64 + sb * 128))); + __m256i lhs_vec_5 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 80 + sb * 128))); + __m256i lhs_vec_6 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 96 + sb * 128))); + __m256i lhs_vec_7 = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i *)(a_ptr[b].qs + 112 + sb * 128))); - const block_q8_0x4 * a_ptr = a_ptr_start + (y * nb); + lhs_vec_0 = _mm256_permute2f128_si256(lhs_vec_0, lhs_vec_0, 0); + lhs_vec_1 = _mm256_permute2f128_si256(lhs_vec_1, lhs_vec_1, 0); + lhs_vec_2 = _mm256_permute2f128_si256(lhs_vec_2, lhs_vec_2, 0); + lhs_vec_3 = _mm256_permute2f128_si256(lhs_vec_3, lhs_vec_3, 0); + lhs_vec_4 = _mm256_permute2f128_si256(lhs_vec_4, lhs_vec_4, 0); + lhs_vec_5 = _mm256_permute2f128_si256(lhs_vec_5, lhs_vec_5, 0); + lhs_vec_6 = _mm256_permute2f128_si256(lhs_vec_6, lhs_vec_6, 0); + lhs_vec_7 = _mm256_permute2f128_si256(lhs_vec_7, lhs_vec_7, 0); - // Load the eight block_q4_0 quantized values interleaved with each other in chunks of eight - B0,B1 ....B6,B7 - for (int64_t x = xstart; x < nc / 8; x++) { + __m256i iacc_0 = _mm256_setzero_si256(); + __m256i iacc_1 = _mm256_setzero_si256(); + __m256i iacc_2 = _mm256_setzero_si256(); + __m256i iacc_3 = _mm256_setzero_si256(); + __m256i iacc_4 = _mm256_setzero_si256(); + __m256i iacc_5 = _mm256_setzero_si256(); + __m256i iacc_6 = _mm256_setzero_si256(); + __m256i iacc_7 = _mm256_setzero_si256(); - const block_q4_0x8 * b_ptr = b_ptr_start + (x * b_nb); + // Dot product done within 32 bit lanes and accumulated in the same vector + // First done for 0th sub block and then for seven (1st - 7th) other sub blocks processed for each sb (sb < QK_K/128 loop) // B0(0-3) B4(0-3) B1(0-3) B5(0-3) B2(0-3) B6(0-3) B3(0-3) B7(0-3) with A0(0-3) + // B0(4-7) B4(4-7) B1(4-7) B5(4-7) B2(4-7) B6(4-7) B3(4-7) B7(4-7) with A0(4-7) + // B0(8-11) B4(8-11) B1(8-11) B5(8-11) B2(8-11) B6(8-11) B3(8-11) B7(8-11) with A0(8-11) + // B0(12-15) B4(12-15) B1(12-15) B5(12-15) B2(12-15) B6(12-15) B3(12-15) B7(12-15) with A0(12-15) - // Master FP accumulators - __m256 acc_rows[4]; - for (int i = 0; i < 4; i++) { - acc_rows[i] = _mm256_setzero_ps(); - } + iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_00 ,_mm256_shuffle_epi32(rhs_vec_4567_00, 177), 170), _mm256_shuffle_epi32(lhs_vec_0, 0))); + iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_00, 177) ,rhs_vec_4567_00, 170), _mm256_shuffle_epi32(lhs_vec_0, 85))); - for (int64_t b = 0; b < nb; b++) { - // Load the eight block_q8_0 quantized values interleaved with each other in chunks of eight - B0,B1 ....B6,B7 - const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs)); - const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs + 32)); - const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs + 64)); - const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256((const __m256i *)(b_ptr[b].qs + 96)); + iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_01 ,_mm256_shuffle_epi32(rhs_vec_4567_01, 177), 170), _mm256_shuffle_epi32(lhs_vec_0, 170))); + iacc_0 = _mm256_add_epi16(iacc_0, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_01, 177) ,rhs_vec_4567_01, 170), _mm256_shuffle_epi32(lhs_vec_0, 255))); - // Save the values in the following vectors in the formats B0B1B4B5, B2B3B6B7 for further processing and storing of valuess - const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32(rhs_raw_mat_0123_0, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_0, requiredOrder), 240); - const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_0, requiredOrder), rhs_raw_mat_4567_0, 240); - const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32(rhs_raw_mat_0123_1, _mm256_permutevar8x32_epi32(rhs_raw_mat_4567_1, requiredOrder), 240); - const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32(_mm256_permutevar8x32_epi32(rhs_raw_mat_0123_1, requiredOrder), rhs_raw_mat_4567_1, 240); + iacc_0 = _mm256_madd_epi16(iacc_0, scales_0); - // 4-bit -> 8-bit - Sign is maintained - const __m256i rhs_mat_0145_0 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_0145_0, m4b)); //B0(0-7) B1(0-7) B4(0-7) B5(0-7) - const __m256i rhs_mat_2367_0 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_2367_0, m4b)); //B2(0-7) B3(0-7) B6(0-7) B7(0-7) + iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_10 ,_mm256_shuffle_epi32(rhs_vec_4567_10, 177), 170), _mm256_shuffle_epi32(lhs_vec_1, 0))); + iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_10, 177) ,rhs_vec_4567_10, 170), _mm256_shuffle_epi32(lhs_vec_1, 85))); - const __m256i rhs_mat_0145_1 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_0145_1, m4b)); //B0(8-15) B1(8-15) B4(8-15) B5(8-15) - const __m256i rhs_mat_2367_1 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(rhs_raw_mat_2367_1, m4b)); //B2(8-15) B3(8-15) B6(8-15) B7(8-15) + iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_11 ,_mm256_shuffle_epi32(rhs_vec_4567_11, 177), 170), _mm256_shuffle_epi32(lhs_vec_1, 170))); + iacc_1 = _mm256_add_epi16(iacc_1, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_11, 177) ,rhs_vec_4567_11, 170), _mm256_shuffle_epi32(lhs_vec_1, 255))); - const __m256i rhs_mat_0145_2 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_0145_0, 4), m4b)); //B0(16-23) B1(16-23) B4(16-23) B5(16-23) - const __m256i rhs_mat_2367_2 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_2367_0, 4), m4b)); //B2(16-23) B3(16-23) B6(16-23) B7(16-23) + iacc_1 = _mm256_madd_epi16(iacc_1, scales_1); - const __m256i rhs_mat_0145_3 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_0145_1, 4), m4b)); //B0(24-31) B1(24-31) B4(24-31) B5(24-31) - const __m256i rhs_mat_2367_3 = _mm256_shuffle_epi8(signextendlut, _mm256_and_si256(_mm256_srli_epi16(rhs_raw_mat_2367_1, 4), m4b)); //B2(24-31) B3(24-31) B6(24-31) B7(24-31) + iacc_2 = _mm256_add_epi16(iacc_2, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_20 ,_mm256_shuffle_epi32(rhs_vec_4567_20, 177), 170), _mm256_shuffle_epi32(lhs_vec_2, 0))); + iacc_2 = _mm256_add_epi16(iacc_2, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_20, 177) ,rhs_vec_4567_20, 170), _mm256_shuffle_epi32(lhs_vec_2, 85))); - // Shuffle pattern one - right side input - const __m256i rhs_mat_0145_0_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_0, 136); //B0(0-3) B1(0-3) B0(0-3) B1(0-3) B4(0-3) B5(0-3) B4(0-3) B5(0-3) - const __m256i rhs_mat_2367_0_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_0, 136); //B2(0-3) B3(0-3) B2(0-3) B3(0-3) B6(0-3) B7(0-3) B6(0-3) B7(0-3) + iacc_2 = _mm256_add_epi16(iacc_2, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_21 ,_mm256_shuffle_epi32(rhs_vec_4567_21, 177), 170), _mm256_shuffle_epi32(lhs_vec_2, 170))); + iacc_2 = _mm256_add_epi16(iacc_2, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_21, 177) ,rhs_vec_4567_21, 170), _mm256_shuffle_epi32(lhs_vec_2, 255))); - const __m256i rhs_mat_0145_1_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_1, 136); //B0(8-11) B1(8-11) B0(8-11) B1(8-11) B4(8-11) B5(8-11) B4(8-11) B5(8-11) - const __m256i rhs_mat_2367_1_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_1, 136); //B2(8-11) B3(8-11) B2(8-11) B3(8-11) B6(8-11) B7(8-11) B6(8-11) B7(8-11) + iacc_2 = _mm256_madd_epi16(iacc_2, scales_2); - const __m256i rhs_mat_0145_2_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_2, 136); //B0(16-19) B1(16-19) B0(16-19) B1(16-19) B4(16-19) B5(16-19) B4(16-19) B5(16-19) - const __m256i rhs_mat_2367_2_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_2, 136); //B2(16-19) B3(16-19) B2(16-19) B3(16-19) B6(16-19) B7(16-19) B6(16-19) B7(16-19) + iacc_3 = _mm256_add_epi16(iacc_3, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_30 ,_mm256_shuffle_epi32(rhs_vec_4567_30, 177), 170), _mm256_shuffle_epi32(lhs_vec_3, 0))); + iacc_3 = _mm256_add_epi16(iacc_3, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_30, 177) ,rhs_vec_4567_30, 170), _mm256_shuffle_epi32(lhs_vec_3, 85))); - const __m256i rhs_mat_0145_3_sp1 = _mm256_shuffle_epi32(rhs_mat_0145_3, 136); //B0(24-27) B1(24-27) B0(24-27) B1(24-27) B4(24-27) B5(24-27) B4(24-27) B5(24-27) - const __m256i rhs_mat_2367_3_sp1 = _mm256_shuffle_epi32(rhs_mat_2367_3, 136); //B2(24-27) B3(24-27) B2(24-27) B3(24-27) B6(24-27) B7(24-27) B6(24-27) B7(24-27) + iacc_3 = _mm256_add_epi16(iacc_3, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_31 ,_mm256_shuffle_epi32(rhs_vec_4567_31, 177), 170), _mm256_shuffle_epi32(lhs_vec_3, 170))); + iacc_3 = _mm256_add_epi16(iacc_3, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_31, 177) ,rhs_vec_4567_31, 170), _mm256_shuffle_epi32(lhs_vec_3, 255))); - // Shuffle pattern two - right side input + iacc_3 = _mm256_madd_epi16(iacc_3, scales_3); - const __m256i rhs_mat_0145_0_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_0, 221); //B0(4-7) B1(4-7) B0(4-7) B1(4-7) B4(4-7) B5(4-7) B4(4-7) B5(4-7) - const __m256i rhs_mat_2367_0_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_0, 221); //B2(4-7) B3(4-7) B2(4-7) B3(4-7) B6(4-7) B7(4-7) B6(4-7) B7(4-7) + iacc_4 = _mm256_add_epi16(iacc_4, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_40 ,_mm256_shuffle_epi32(rhs_vec_4567_40, 177), 170), _mm256_shuffle_epi32(lhs_vec_4, 0))); + iacc_4 = _mm256_add_epi16(iacc_4, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_40, 177) ,rhs_vec_4567_40, 170), _mm256_shuffle_epi32(lhs_vec_4, 85))); - const __m256i rhs_mat_0145_1_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_1, 221); //B0(12-15) B1(12-15) B0(12-15) B1(12-15) B4(12-15) B5(12-15) B4(12-15) B5(12-15) - const __m256i rhs_mat_2367_1_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_1, 221); //B2(12-15) B3(12-15) B2(12-15) B3(12-15) B6(12-15) B7(12-15) B6(12-15) B7(12-15) + iacc_4 = _mm256_add_epi16(iacc_4, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_41 ,_mm256_shuffle_epi32(rhs_vec_4567_41, 177), 170), _mm256_shuffle_epi32(lhs_vec_4, 170))); + iacc_4 = _mm256_add_epi16(iacc_4, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_41, 177) ,rhs_vec_4567_41, 170), _mm256_shuffle_epi32(lhs_vec_4, 255))); - const __m256i rhs_mat_0145_2_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_2, 221); //B0(20-23) B1(20-23) B0(20-23) B1(20-23) B4(20-23) B5(20-23) B4(20-23) B5(20-23) - const __m256i rhs_mat_2367_2_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_2, 221); //B2(20-23) B3(20-23) B2(20-23) B3(20-23) B6(20-23) B7(20-23) B6(20-23) B7(20-23) + iacc_4 = _mm256_madd_epi16(iacc_4, scales_4); - const __m256i rhs_mat_0145_3_sp2 = _mm256_shuffle_epi32(rhs_mat_0145_3, 221); //B0(28-31) B1(28-31) B0(28-31) B1(28-31) B4(28-31) B5(28-31) B4(28-31) B5(28-31) - const __m256i rhs_mat_2367_3_sp2 = _mm256_shuffle_epi32(rhs_mat_2367_3, 221); //B2(28-31) B3(28-31) B2(28-31) B3(28-31) B6(28-31) B7(28-31) B6(28-31) B7(28-31) + iacc_5 = _mm256_add_epi16(iacc_5, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_50 ,_mm256_shuffle_epi32(rhs_vec_4567_50, 177), 170), _mm256_shuffle_epi32(lhs_vec_5, 0))); + iacc_5 = _mm256_add_epi16(iacc_5, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_50, 177) ,rhs_vec_4567_50, 170), _mm256_shuffle_epi32(lhs_vec_5, 85))); - // Scale values - Load the wight scale values of block_q4_0x8 - const __m256 col_scale_f32 = GGML_F32Cx8_LOAD(b_ptr[b].d); + iacc_5 = _mm256_add_epi16(iacc_5, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_51 ,_mm256_shuffle_epi32(rhs_vec_4567_51, 177), 170), _mm256_shuffle_epi32(lhs_vec_5, 170))); + iacc_5 = _mm256_add_epi16(iacc_5, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_51, 177) ,rhs_vec_4567_51, 170), _mm256_shuffle_epi32(lhs_vec_5, 255))); - // Load the four block_q4_0 quantized values interleaved with each other in chunks of eight - A0,A1,A2,A3 - // Loaded as set of 128 bit vectors and repeated into a 256 bit vector - __m256i lhs_mat_0123_0 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs))); - __m256i lhs_mat_01_0 = _mm256_permute2f128_si256(lhs_mat_0123_0, lhs_mat_0123_0, 0); - __m256i lhs_mat_23_0 = _mm256_permute2f128_si256(lhs_mat_0123_0, lhs_mat_0123_0, 17); - __m256i lhs_mat_0123_1 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs + 32))); - __m256i lhs_mat_01_1 = _mm256_permute2f128_si256(lhs_mat_0123_1, lhs_mat_0123_1, 0); - __m256i lhs_mat_23_1 = _mm256_permute2f128_si256(lhs_mat_0123_1, lhs_mat_0123_1, 17); - __m256i lhs_mat_0123_2 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs + 64))); - __m256i lhs_mat_01_2 = _mm256_permute2f128_si256(lhs_mat_0123_2, lhs_mat_0123_2, 0); - __m256i lhs_mat_23_2 = _mm256_permute2f128_si256(lhs_mat_0123_2, lhs_mat_0123_2, 17); - __m256i lhs_mat_0123_3 = _mm256_loadu_si256((const __m256i *)((a_ptr[b].qs + 96))); - __m256i lhs_mat_01_3 = _mm256_permute2f128_si256(lhs_mat_0123_3, lhs_mat_0123_3, 0); - __m256i lhs_mat_23_3 = _mm256_permute2f128_si256(lhs_mat_0123_3, lhs_mat_0123_3, 17); + iacc_5 = _mm256_madd_epi16(iacc_5, scales_5); - // Shuffle pattern one - left side input + iacc_6 = _mm256_add_epi16(iacc_6, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_60 ,_mm256_shuffle_epi32(rhs_vec_4567_60, 177), 170), _mm256_shuffle_epi32(lhs_vec_6, 0))); + iacc_6 = _mm256_add_epi16(iacc_6, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_60, 177) ,rhs_vec_4567_60, 170), _mm256_shuffle_epi32(lhs_vec_6, 85))); - const __m256i lhs_mat_01_0_sp1 = _mm256_shuffle_epi32(lhs_mat_01_0, 160); //A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) - const __m256i lhs_mat_23_0_sp1 = _mm256_shuffle_epi32(lhs_mat_23_0, 160); //A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) + iacc_6 = _mm256_add_epi16(iacc_6, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_61 ,_mm256_shuffle_epi32(rhs_vec_4567_61, 177), 170), _mm256_shuffle_epi32(lhs_vec_6, 170))); + iacc_6 = _mm256_add_epi16(iacc_6, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_61, 177) ,rhs_vec_4567_61, 170), _mm256_shuffle_epi32(lhs_vec_6, 255))); - const __m256i lhs_mat_01_1_sp1 = _mm256_shuffle_epi32(lhs_mat_01_1, 160); //A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) - const __m256i lhs_mat_23_1_sp1 = _mm256_shuffle_epi32(lhs_mat_23_1, 160); //A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) + iacc_6 = _mm256_madd_epi16(iacc_6, scales_6); - const __m256i lhs_mat_01_2_sp1 = _mm256_shuffle_epi32(lhs_mat_01_2, 160); //A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) - const __m256i lhs_mat_23_2_sp1 = _mm256_shuffle_epi32(lhs_mat_23_2, 160); //A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) + iacc_7 = _mm256_add_epi16(iacc_7, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_70 ,_mm256_shuffle_epi32(rhs_vec_4567_70, 177), 170), _mm256_shuffle_epi32(lhs_vec_7, 0))); + iacc_7 = _mm256_add_epi16(iacc_7, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_70, 177) ,rhs_vec_4567_70, 170), _mm256_shuffle_epi32(lhs_vec_7, 85))); - const __m256i lhs_mat_01_3_sp1 = _mm256_shuffle_epi32(lhs_mat_01_3, 160); //A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) - const __m256i lhs_mat_23_3_sp1 = _mm256_shuffle_epi32(lhs_mat_23_3, 160); //A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) + iacc_7 = _mm256_add_epi16(iacc_7, _mm256_maddubs_epi16(_mm256_blend_epi32(rhs_vec_0123_71 ,_mm256_shuffle_epi32(rhs_vec_4567_71, 177), 170), _mm256_shuffle_epi32(lhs_vec_7, 170))); + iacc_7 = _mm256_add_epi16(iacc_7, _mm256_maddubs_epi16(_mm256_blend_epi32(_mm256_shuffle_epi32(rhs_vec_0123_71, 177) ,rhs_vec_4567_71, 170), _mm256_shuffle_epi32(lhs_vec_7, 255))); - // Shuffle pattern two - left side input + iacc_7 = _mm256_madd_epi16(iacc_7, scales_7); - const __m256i lhs_mat_01_0_sp2 = _mm256_shuffle_epi32(lhs_mat_01_0, 245); //A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) - const __m256i lhs_mat_23_0_sp2 = _mm256_shuffle_epi32(lhs_mat_23_0, 245); //A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) + // Accumulate the iacc value for one sb + __m256i iacc_sb = _mm256_add_epi32(_mm256_add_epi32(_mm256_add_epi32(iacc_0, iacc_1), _mm256_add_epi32(iacc_2, iacc_3)), _mm256_add_epi32(_mm256_add_epi32(iacc_4, iacc_5), _mm256_add_epi32(iacc_6, iacc_7))); - const __m256i lhs_mat_01_1_sp2 = _mm256_shuffle_epi32(lhs_mat_01_1, 245); //A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) - const __m256i lhs_mat_23_1_sp2 = _mm256_shuffle_epi32(lhs_mat_23_1, 245); //A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) + __m128i q8sums = _mm_loadu_si128((const __m128i *)(a_ptr[b].bsums + sb * 8)); + __m256i q8s = _mm256_castsi128_si256(q8sums); + q8s= _mm256_permute2f128_si256(q8s, q8s, 0); - const __m256i lhs_mat_01_2_sp2 = _mm256_shuffle_epi32(lhs_mat_01_2, 245); //A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) - const __m256i lhs_mat_23_2_sp2 = _mm256_shuffle_epi32(lhs_mat_23_2, 245); //A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) + // Broadcast the bsums of the two corresponding subblocks of q8_k + // Multiply-Add with corresponding mins of Q2_Kx8 with bsums + __m256i iacc_min_sb_01 = _mm256_madd_epi16(_mm256_shuffle_epi32(q8s, 0), mins_01); + __m256i iacc_min_sb_23 = _mm256_madd_epi16(_mm256_shuffle_epi32(q8s, 85), mins_23); + __m256i iacc_min_sb_45 = _mm256_madd_epi16(_mm256_shuffle_epi32(q8s, 170), mins_45); + __m256i iacc_min_sb_67 = _mm256_madd_epi16(_mm256_shuffle_epi32(q8s, 255), mins_67); - const __m256i lhs_mat_01_3_sp2 = _mm256_shuffle_epi32(lhs_mat_01_3, 245); //A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) - const __m256i lhs_mat_23_3_sp2 = _mm256_shuffle_epi32(lhs_mat_23_3, 245); //A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) + __m256i iacc_min_sb = _mm256_add_epi32(_mm256_add_epi32(iacc_min_sb_01, iacc_min_sb_23), _mm256_add_epi32(iacc_min_sb_45,iacc_min_sb_67)); - // The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane - // Resembles MMLAs into 2x2 matrices in ARM Version - const __m256i zero = _mm256_setzero_si256(); - __m256i iacc_mat_00_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp1, rhs_mat_0145_3_sp1), lhs_mat_01_2_sp1, rhs_mat_0145_2_sp1), lhs_mat_01_1_sp1, rhs_mat_0145_1_sp1), lhs_mat_01_0_sp1, rhs_mat_0145_0_sp1); - __m256i iacc_mat_01_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp1, rhs_mat_2367_3_sp1), lhs_mat_01_2_sp1, rhs_mat_2367_2_sp1), lhs_mat_01_1_sp1, rhs_mat_2367_1_sp1), lhs_mat_01_0_sp1, rhs_mat_2367_0_sp1); - __m256i iacc_mat_10_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp1, rhs_mat_0145_3_sp1), lhs_mat_23_2_sp1, rhs_mat_0145_2_sp1), lhs_mat_23_1_sp1, rhs_mat_0145_1_sp1), lhs_mat_23_0_sp1, rhs_mat_0145_0_sp1); - __m256i iacc_mat_11_sp1 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp1, rhs_mat_2367_3_sp1), lhs_mat_23_2_sp1, rhs_mat_2367_2_sp1), lhs_mat_23_1_sp1, rhs_mat_2367_1_sp1), lhs_mat_23_0_sp1, rhs_mat_2367_0_sp1); - __m256i iacc_mat_00_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp2, rhs_mat_0145_3_sp2), lhs_mat_01_2_sp2, rhs_mat_0145_2_sp2), lhs_mat_01_1_sp2, rhs_mat_0145_1_sp2), lhs_mat_01_0_sp2, rhs_mat_0145_0_sp2); - __m256i iacc_mat_01_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_01_3_sp2, rhs_mat_2367_3_sp2), lhs_mat_01_2_sp2, rhs_mat_2367_2_sp2), lhs_mat_01_1_sp2, rhs_mat_2367_1_sp2), lhs_mat_01_0_sp2, rhs_mat_2367_0_sp2); - __m256i iacc_mat_10_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp2, rhs_mat_0145_3_sp2), lhs_mat_23_2_sp2, rhs_mat_0145_2_sp2), lhs_mat_23_1_sp2, rhs_mat_0145_1_sp2), lhs_mat_23_0_sp2, rhs_mat_0145_0_sp2); - __m256i iacc_mat_11_sp2 = mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(mul_sum_i8_pairs_acc_int32x8(zero, lhs_mat_23_3_sp2, rhs_mat_2367_3_sp2), lhs_mat_23_2_sp2, rhs_mat_2367_2_sp2), lhs_mat_23_1_sp2, rhs_mat_2367_1_sp2), lhs_mat_23_0_sp2, rhs_mat_2367_0_sp2); + // Accumulate for the complete block + iacc_b = _mm256_add_epi32(iacc_b, iacc_sb); + iacc_min_b = _mm256_add_epi32(iacc_min_b, iacc_min_sb); + } - // Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block - __m256i iacc_mat_00 = _mm256_add_epi32(iacc_mat_00_sp1, iacc_mat_00_sp2); - __m256i iacc_mat_01 = _mm256_add_epi32(iacc_mat_01_sp1, iacc_mat_01_sp2); - __m256i iacc_mat_10 = _mm256_add_epi32(iacc_mat_10_sp1, iacc_mat_10_sp2); - __m256i iacc_mat_11 = _mm256_add_epi32(iacc_mat_11_sp1, iacc_mat_11_sp2); + //Multiply-Add with scale values for complete super block + acc_row = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_b), _mm256_mul_ps(col_scale_f32, row_scale_f32), acc_row); + acc_min_rows = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_min_b), _mm256_mul_ps(col_dmin_f32, row_scale_f32), acc_min_rows); + } + // Accumulated output values permuted so as to be stored in appropriate order post accumulation + acc_row = _mm256_permutevar8x32_ps(acc_row, finalpermutemask); + _mm256_storeu_ps(s + (y * nr + x * 8), _mm256_sub_ps(acc_row, acc_min_rows)); + } + } +#else + ggml_gemv_q2_K_8x8_q8_K_generic(n, s, bs, vx, vy, nr, nc); - // Straighten out to make 4 row vectors - __m256i iacc_row_0 = _mm256_blend_epi32(iacc_mat_00, _mm256_shuffle_epi32(iacc_mat_01, 78), 204); - __m256i iacc_row_1 = _mm256_blend_epi32(_mm256_shuffle_epi32(iacc_mat_00, 78), iacc_mat_01, 204); - __m256i iacc_row_2 = _mm256_blend_epi32(iacc_mat_10, _mm256_shuffle_epi32(iacc_mat_11, 78), 204); - __m256i iacc_row_3 = _mm256_blend_epi32(_mm256_shuffle_epi32(iacc_mat_10, 78), iacc_mat_11, 204); +#endif +} - // Load the scale(d) values for all the 4 Q8_0 blocks and repeat it across lanes - const __m256 row_scale_f32 = GGML_F32Cx8_REPEAT_LOAD(a_ptr[b].d, loadMask); +void ggml_gemm_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc) { +#if defined(__AVX2__) || defined(__AVX512F__) + { + // Lookup table to convert signed nibbles to signed bytes + __m256i signextendlut = _mm256_castsi128_si256(_mm_set_epi8(-1, -2, -3, -4, -5, -6, -7, -8, 7, 6, 5, 4, 3, 2, 1, 0)); + signextendlut = _mm256_permute2f128_si256(signextendlut, signextendlut, 0); - // Multiply with appropiate scales and accumulate - acc_rows[0] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_0), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 0)), acc_rows[0]); - acc_rows[1] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_1), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 85)), acc_rows[1]); - acc_rows[2] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_2), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 170)), acc_rows[2]); - acc_rows[3] = _mm256_fmadd_ps(_mm256_cvtepi32_ps(iacc_row_3), _mm256_mul_ps(col_scale_f32, _mm256_shuffle_ps(row_scale_f32, row_scale_f32, 255)), acc_rows[3]); - } + gemm_q4_b32_8x8_q8_0_lut_avx(n, s, bs, vx, vy, nr, nc, signextendlut); - // Store the accumulated values - for (int i = 0; i < 4; i++) { - _mm256_storeu_ps((float *)(s + ((y * 4 + i) * bs + x * 8)), acc_rows[i]); - } - } - } return; } +#endif // defined(__AVX2__) || defined(__AVX512F__) -#endif // #if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) ggml_gemm_q4_0_8x8_q8_0_generic(n, s, bs, vx, vy, nr, nc); } @@ -3364,6 +3408,21 @@ void ggml_gemm_q4_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo #endif } +void ggml_gemm_iq4_nl_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc) { +#if defined(__AVX2__) || defined(__AVX512F__) + { + __m256i signextendlut = _mm256_castsi128_si256(_mm_loadu_si128((const __m128i*)kvalues_iq4nl)); + signextendlut = _mm256_permute2f128_si256(signextendlut, signextendlut, 0); + + gemm_q4_b32_8x8_q8_0_lut_avx(n, s, bs, vx, vy, nr, nc, signextendlut); + + return; + } +#endif // defined(__AVX2__) || defined(__AVX512F__) + + ggml_gemm_iq4_nl_4x4_q8_0(n, s, bs, vx, vy, nr, nc); +} + void ggml_gemm_q2_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc) { const int qk = QK_K; const int nb = n / qk; diff --git a/ggml/src/ggml-cpu/repack.cpp b/ggml/src/ggml-cpu/repack.cpp index 2583aefae47..f531d21e232 100644 --- a/ggml/src/ggml-cpu/repack.cpp +++ b/ggml/src/ggml-cpu/repack.cpp @@ -206,8 +206,9 @@ void ggml_gemv_q4_0_4x4_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs, const int ncols_interleaved = 4; const int blocklen = 4; - assert (n % qk == 0); - assert (nc % ncols_interleaved == 0); + assert(nr == 1); + assert(n % qk == 0); + assert(nc % ncols_interleaved == 0); UNUSED(s); UNUSED(bs); @@ -307,30 +308,28 @@ void ggml_gemv_q4_0_8x8_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs, UNUSED(ncols_interleaved); UNUSED(blocklen); - { - float sumf[8]; - int sumi; + float sumf[8]; + int sumi; - const block_q8_0 * a_ptr = (const block_q8_0 *) vy; - for (int x = 0; x < nc / ncols_interleaved; x++) { - const block_q4_0x8 * b_ptr = (const block_q4_0x8 *) vx + (x * nb); + const block_q8_0 * a_ptr = (const block_q8_0 *) vy; + for (int x = 0; x < nc / ncols_interleaved; x++) { + const block_q4_0x8 * b_ptr = (const block_q4_0x8 *) vx + (x * nb); - for (int j = 0; j < ncols_interleaved; j++) sumf[j] = 0.0; - for (int l = 0; l < nb; l++) { - for (int k = 0; k < (qk / (2 * blocklen)); k++) { - for (int j = 0; j < ncols_interleaved; j++) { - sumi = 0; - for (int i = 0; i < blocklen; ++i) { - const int v0 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] << 4); - 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; - } - sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d); + for (int j = 0; j < ncols_interleaved; j++) sumf[j] = 0.0; + for (int l = 0; l < nb; l++) { + for (int k = 0; k < (qk / (2 * blocklen)); k++) { + for (int j = 0; j < ncols_interleaved; j++) { + sumi = 0; + for (int i = 0; i < blocklen; ++i) { + const int v0 = (int8_t) (b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] << 4); + 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; } + sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d); } } - for (int j = 0; j < ncols_interleaved; j++) s[x * ncols_interleaved + j] = sumf[j]; } + for (int j = 0; j < ncols_interleaved; j++) s[x * ncols_interleaved + j] = sumf[j]; } } @@ -494,43 +493,73 @@ void ggml_gemv_iq4_nl_4x4_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs const int ncols_interleaved = 4; const int blocklen = 4; - assert (n % qk == 0); - assert (nc % ncols_interleaved == 0); + assert(nr == 1); + assert(n % qk == 0); + assert(nc % ncols_interleaved == 0); - UNUSED(s); UNUSED(bs); - UNUSED(vx); - UNUSED(vy); UNUSED(nr); - UNUSED(nc); - UNUSED(nb); - UNUSED(ncols_interleaved); - UNUSED(blocklen); - { - float sumf[4]; - int sumi; + float sumf[4]; + int sumi; - const block_q8_0 * a_ptr = (const block_q8_0 *) vy; - for (int x = 0; x < nc / ncols_interleaved; x++) { - const block_iq4_nlx4 * b_ptr = (const block_iq4_nlx4 *) vx + (x * nb); + const block_q8_0 * a_ptr = (const block_q8_0 *) vy; + for (int x = 0; x < nc / ncols_interleaved; x++) { + const block_iq4_nlx4 * b_ptr = (const block_iq4_nlx4 *) vx + (x * nb); - for (int j = 0; j < ncols_interleaved; j++) sumf[j] = 0.0; - for (int l = 0; l < nb; l++) { - for (int k = 0; k < (qk / (2 * blocklen)); k++) { - for (int j = 0; j < ncols_interleaved; j++) { - sumi = 0; - for (int i = 0; i < blocklen; ++i) { - const int v0 = kvalues_iq4nl[b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0x0F]; - 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])); - } - sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d); + for (int j = 0; j < ncols_interleaved; j++) sumf[j] = 0.0; + for (int l = 0; l < nb; l++) { + for (int k = 0; k < (qk / (2 * blocklen)); k++) { + for (int j = 0; j < ncols_interleaved; j++) { + sumi = 0; + for (int i = 0; i < blocklen; ++i) { + const int v0 = kvalues_iq4nl[b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0x0F]; + 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])); } + sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d); } } - for (int j = 0; j < ncols_interleaved; j++) s[x * ncols_interleaved + j] = sumf[j]; } + for (int j = 0; j < ncols_interleaved; j++) s[x * ncols_interleaved + j] = sumf[j]; + } +} + +void ggml_gemv_iq4_nl_8x8_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc) { + const int qk = QK8_0; + const int nb = n / qk; + const int ncols_interleaved = 8; + const int blocklen = 8; + + assert(nr == 1); + assert(n % qk == 0); + assert(nc % ncols_interleaved == 0); + + UNUSED(bs); + UNUSED(nr); + + float sumf[8]; + int sumi; + + const block_q8_0 * a_ptr = (const block_q8_0 *) vy; + for (int x = 0; x < nc / ncols_interleaved; x++) { + const block_iq4_nlx8 * b_ptr = (const block_iq4_nlx8 *) vx + (x * nb); + + for (int j = 0; j < ncols_interleaved; j++) sumf[j] = 0.0; + for (int l = 0; l < nb; l++) { + for (int k = 0; k < (qk / (2 * blocklen)); k++) { + for (int j = 0; j < ncols_interleaved; j++) { + sumi = 0; + for (int i = 0; i < blocklen; ++i) { + const int v0 = kvalues_iq4nl[b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0x0F]; + 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])); + } + sumf[j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d); + } + } + } + for (int j = 0; j < ncols_interleaved; j++) s[x * ncols_interleaved + j] = sumf[j]; } } @@ -934,6 +963,50 @@ void ggml_gemm_iq4_nl_4x4_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs } } +void ggml_gemm_iq4_nl_8x8_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc) { + const int qk = QK8_0; + const int nb = n / qk; + const int ncols_interleaved = 8; + const int blocklen = 8; + + assert(n % qk == 0); + assert(nr % 4 == 0); + assert(nc % ncols_interleaved == 0); + + float sumf[4][8]; + int sumi; + + for (int y = 0; y < nr / 4; y++) { + const block_q8_0x4 * a_ptr = (const block_q8_0x4 *) vy + (y * nb); + for (int x = 0; x < nc / ncols_interleaved; x++) { + const block_iq4_nlx8 * b_ptr = (const block_iq4_nlx8 *) vx + (x * nb); + for (int m = 0; m < 4; m++) { + for (int j = 0; j < ncols_interleaved; j++) sumf[m][j] = 0.0; + } + for (int l = 0; l < nb; l++) { + for (int k = 0; k < (qk / (2 * blocklen)); k++) { + for (int m = 0; m < 4; m++) { + for (int j = 0; j < ncols_interleaved; j++) { + sumi = 0; + for (int i = 0; i < blocklen; ++i) { + const int v0 = kvalues_iq4nl[b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] & 0x0F]; + const int v1 = kvalues_iq4nl[b_ptr[l].qs[k * ncols_interleaved * blocklen + j * blocklen + i] >> 4]; + 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])); + } + sumf[m][j] += sumi * GGML_CPU_FP16_TO_FP32(b_ptr[l].d[j]) * GGML_CPU_FP16_TO_FP32(a_ptr[l].d[m]); + } + } + } + } + for (int m = 0; m < 4; m++) { + for (int j = 0; j < ncols_interleaved; j++) + s[(y * 4 + m) * bs + x * ncols_interleaved + j] = sumf[m][j]; + } + } + } +} + } // extern "C" static block_q4_0x4 make_block_q4_0x4(block_q4_0 * in, unsigned int blck_size_interleave) { @@ -1285,15 +1358,16 @@ static block_iq4_nlx4 make_block_iq4_nlx4(block_iq4_nl * in, unsigned int blck_s static int repack_iq4_nl_to_iq4_nl_4_bl(struct ggml_tensor * t, int interleave_block, const void * GGML_RESTRICT data, size_t data_size) { GGML_ASSERT(t->type == GGML_TYPE_IQ4_NL); - //GGML_ASSERT(interleave_block == 4 || interleave_block == 8); GGML_ASSERT(interleave_block == 4); - block_iq4_nlx4 * dst = (block_iq4_nlx4 *)t->data; - const block_iq4_nl * src = (const block_iq4_nl *)data; + const block_iq4_nl * src = (const block_iq4_nl *)data; + block_iq4_nlx4 * dst = ( block_iq4_nlx4 *)t->data; + block_iq4_nl dst_tmp[4]; + int nrow = ggml_nrows(t); int nrows_interleaved = 4; - int nblocks = t->ne[0] / QK4_0; + int nblocks = t->ne[0] / QK4_NL; GGML_ASSERT(data_size == nrow * nblocks * sizeof(block_iq4_nl)); @@ -1315,6 +1389,63 @@ static int repack_iq4_nl_to_iq4_nl_4_bl(struct ggml_tensor * t, int interleave_b GGML_UNUSED(data_size); } +static block_iq4_nlx8 make_block_iq4_nlx8(block_iq4_nl * in, unsigned int blck_size_interleave) { + block_iq4_nlx8 out; + + for (int i = 0; i < 8; i++) { + out.d[i] = in[i].d; + } + + const int end = QK4_NL * 4 / blck_size_interleave; + + if (blck_size_interleave == 8) { + for (int i = 0; i < end; ++i) { + int src_id = i % 8; + int src_offset = (i / 8) * blck_size_interleave; + int dst_offset = i * blck_size_interleave; + + memcpy(&out.qs[dst_offset], &in[src_id].qs[src_offset], sizeof(uint64_t)); + } + } else { + GGML_ASSERT(false); + } + + return out; +} + +static int repack_iq4_nl_to_iq4_nl_8_bl(struct ggml_tensor * t, int interleave_block, const void * GGML_RESTRICT data, size_t data_size) { + GGML_ASSERT(t->type == GGML_TYPE_IQ4_NL); + GGML_ASSERT(interleave_block == 8); + + const block_iq4_nl * src = (const block_iq4_nl *)data; + block_iq4_nlx8 * dst = ( block_iq4_nlx8 *)t->data; + + block_iq4_nl dst_tmp[8]; + + int nrow = ggml_nrows(t); + int nrows_interleaved = 8; + int nblocks = t->ne[0] / QK4_NL; + + GGML_ASSERT(data_size == nrow * nblocks * sizeof(block_iq4_nl)); + + if (t->ne[1] % nrows_interleaved != 0) { + return -1; + } + + for (int b = 0; b < nrow; b += nrows_interleaved) { + for (int64_t x = 0; x < nblocks; x++) { + for (int i = 0; i < nrows_interleaved; i++) { + dst_tmp[i] = src[x + i * nblocks]; + } + *dst++ = make_block_iq4_nlx8(dst_tmp, interleave_block); + } + src += nrows_interleaved * nblocks; + } + return 0; + + GGML_UNUSED(data_size); +} + namespace ggml::cpu::repack { // repack template @@ -1350,6 +1481,10 @@ template <> int repack(struct ggml_tensor * t, const void * // return repack_iq4_nl_to_iq4_nl_4_bl(t, 8, data, data_size); //} +template <> int repack(struct ggml_tensor * t, const void * data, size_t data_size) { + return repack_iq4_nl_to_iq4_nl_8_bl(t, 8, data, data_size); +} + // gemv template void gemv(int, float *, size_t, const void *, const void *, int, int); @@ -1378,6 +1513,10 @@ template <> void gemv(int n, float * s, size ggml_gemv_iq4_nl_4x4_q8_0(n, s, bs, vx, vy, nr, nc); } +template <> void gemv(int n, float * s, size_t bs, const void * vx, const void * vy, int nr, int nc) { + ggml_gemv_iq4_nl_8x8_q8_0(n, s, bs, vx, vy, nr, nc); +} + // gemm template void gemm(int, float *, size_t, const void *, const void *, int, int); @@ -1406,6 +1545,10 @@ template <> void gemm(int n, float * s, size ggml_gemm_iq4_nl_4x4_q8_0(n, s, bs, vx, vy, nr, nc); } +template <> void gemm(int n, float * s, size_t bs, const void * vx, const void * vy, int nr, int nc) { + ggml_gemm_iq4_nl_8x8_q8_0(n, s, bs, vx, vy, nr, nc); +} + class tensor_traits_base : public ggml::cpu::tensor_traits { public: virtual int repack(struct ggml_tensor * t, const void * data, size_t data_size) = 0; @@ -1680,6 +1823,7 @@ static const ggml::cpu::tensor_traits * ggml_repack_get_optimal_repack_type(cons // instance for IQ4 static const ggml::cpu::repack::tensor_traits iq4_nl_4x4_q8_0; + static const ggml::cpu::repack::tensor_traits iq4_nl_8x8_q8_0; if (cur->type == GGML_TYPE_Q4_0) { if (ggml_cpu_has_avx2() || (ggml_cpu_has_sve() && ggml_cpu_has_matmul_int8() && ggml_cpu_get_sve_cnt() == QK8_0)) { @@ -1710,6 +1854,11 @@ static const ggml::cpu::tensor_traits * ggml_repack_get_optimal_repack_type(cons } } } else if (cur->type == GGML_TYPE_IQ4_NL) { + if (ggml_cpu_has_avx2()) { + if (cur->ne[1] % 8 == 0) { + return &iq4_nl_8x8_q8_0; + } + } if (ggml_cpu_has_neon() && ggml_cpu_has_dotprod()) { if (cur->ne[1] % 4 == 0) { return &iq4_nl_4x4_q8_0; diff --git a/ggml/src/ggml-cpu/repack.h b/ggml/src/ggml-cpu/repack.h index cd322e74389..cb32b503d3a 100644 --- a/ggml/src/ggml-cpu/repack.h +++ b/ggml/src/ggml-cpu/repack.h @@ -67,6 +67,13 @@ struct block_iq4_nlx4 { static_assert(sizeof(block_iq4_nlx4) == 4 * sizeof(ggml_half) + QK4_NL * 2, "wrong iq4_nlx4 block size/padding"); +struct block_iq4_nlx8 { + ggml_half d[8]; // deltas for 8 iq4_nl blocks + uint8_t qs[QK4_NL * 4]; // nibbles / quants for 8 iq4_nl blocks +}; + +static_assert(sizeof(block_iq4_nlx8) == 8 * sizeof(ggml_half) + QK4_NL * 4, "wrong iq4_nlx8 block size/padding"); + #if defined(__cplusplus) extern "C" { #endif @@ -80,12 +87,14 @@ void ggml_gemv_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo void ggml_gemv_q4_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemv_q2_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemv_iq4_nl_4x4_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); +void ggml_gemv_iq4_nl_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemm_q4_0_4x4_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemm_q4_0_4x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemm_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemm_q4_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemm_q2_K_8x8_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemm_iq4_nl_4x4_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); +void ggml_gemm_iq4_nl_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); // Native implementations void ggml_quantize_mat_q8_0_4x4_generic(const float * GGML_RESTRICT x, void * GGML_RESTRICT vy, int64_t k); @@ -97,12 +106,14 @@ void ggml_gemv_q4_0_8x8_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs, void ggml_gemv_q4_K_8x8_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemv_q2_K_8x8_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemv_iq4_nl_4x4_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); +void ggml_gemv_iq4_nl_8x8_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemm_q4_0_4x4_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemm_q4_0_4x8_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemm_q4_0_8x8_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemm_q4_K_8x8_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemm_q2_K_8x8_q8_K_generic(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); void ggml_gemm_iq4_nl_4x4_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); +void ggml_gemm_iq4_nl_8x8_q8_0_generic(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, const void * GGML_RESTRICT vy, int nr, int nc); #if defined(__cplusplus) } // extern "C" From 07aa869a91837d95fcb5612c65a188763ac38647 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigbj=C3=B8rn=20Skj=C3=A6ret?= Date: Wed, 13 Aug 2025 11:30:45 +0200 Subject: [PATCH 05/13] ci : add more python requirements to copilot-setup-steps (#15289) * ci : add flake8 and pyright to copilot-setup-steps.yml * add tools/server/tests/requirements.txt --- .github/workflows/copilot-setup-steps.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml index 14f7c5e3f7b..a6553187ef5 100644 --- a/.github/workflows/copilot-setup-steps.yml +++ b/.github/workflows/copilot-setup-steps.yml @@ -49,4 +49,5 @@ jobs: run: | python3 -m venv .venv .venv/bin/activate - pip install -r requirements/requirements-all.txt + pip install -r requirements/requirements-all.txt -r tools/server/tests/requirements.txt + pip install flake8 pyright From 648ebcdb739abfb5a9be14f4c5c0fd19ff268ef0 Mon Sep 17 00:00:00 2001 From: Ali Tariq Date: Wed, 13 Aug 2025 15:14:44 +0500 Subject: [PATCH 06/13] ci : Added CI with RISC-V RVV1.0 Hardware (#14439) * Changed the CI file to hw * Changed the CI file to hw * Added to sudoers for apt * Removed the clone command and used checkout * Added libcurl * Added gcc-14 * Checking gcc --version * added gcc-14 symlink * added CC and C++ variables * Added the gguf weight * Changed the weights path * Added system specification * Removed white spaces * ci: Replace Jenkins riscv native build Cloud-V pipeline with GitHub Actions workflow Removed the legacy .devops/cloud-v-pipeline Jenkins CI configuration and introduced .github/workflows/build-riscv-native.yml for native RISC-V builds using GitHub Actions. * removed trailing whitespaces --------- Co-authored-by: Akif Ejaz --- .devops/cloud-v-pipeline | 22 ------------ .github/workflows/build-riscv-native.yml | 43 ++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 22 deletions(-) delete mode 100644 .devops/cloud-v-pipeline create mode 100644 .github/workflows/build-riscv-native.yml diff --git a/.devops/cloud-v-pipeline b/.devops/cloud-v-pipeline deleted file mode 100644 index af8c0cea615..00000000000 --- a/.devops/cloud-v-pipeline +++ /dev/null @@ -1,22 +0,0 @@ -node('x86_runner1'){ // Running on x86 runner containing latest vector qemu, latest vector gcc and all the necessary libraries - stage('Cleanup'){ - cleanWs() // Cleaning previous CI build in workspace - } - stage('checkout repo'){ - retry(5){ // Retry if the cloning fails due to some reason - checkout scm // Clone the repo on Runner - } - } - stage('Compiling llama.cpp'){ - sh'''#!/bin/bash - make RISCV=1 RISCV_CROSS_COMPILE=1 # Compiling llama for RISC-V - ''' - } - stage('Running llama.cpp'){ - sh'''#!/bin/bash - module load gnu-bin2/0.1 # loading latest versions of vector qemu and vector gcc - qemu-riscv64 -L /softwares/gnu-bin2/sysroot -cpu rv64,v=true,vlen=256,elen=64,vext_spec=v1.0 ./llama-cli -m /home/alitariq/codellama-7b.Q4_K_M.gguf -p "Anything" -n 9 > llama_log.txt # Running llama.cpp on vector qemu-riscv64 - cat llama_log.txt # Printing results - ''' - } -} diff --git a/.github/workflows/build-riscv-native.yml b/.github/workflows/build-riscv-native.yml new file mode 100644 index 00000000000..a968f6d5197 --- /dev/null +++ b/.github/workflows/build-riscv-native.yml @@ -0,0 +1,43 @@ +name: Build on RISCV Linux Machine by Cloud-V +on: + workflow_dispatch: + workflow_call: + +jobs: + bianbu-riscv64-native: # Bianbu 2.2 + runs-on: self-hosted + + steps: + - name: Install prerequisites + run: | + sudo apt-get update || true + sudo apt-get install -y libatomic1 + - uses: actions/checkout@v4 + - name: Setup Riscv + run: | + sudo apt-get update || true + sudo apt-get install -y --no-install-recommends \ + build-essential \ + gcc-14-riscv64-linux-gnu \ + g++-14-riscv64-linux-gnu \ + cmake + + - name: Build + run: | + cmake -B build -DLLAMA_CURL=OFF \ + -DCMAKE_BUILD_TYPE=Release \ + -DGGML_OPENMP=OFF \ + -DLLAMA_BUILD_EXAMPLES=ON \ + -DLLAMA_BUILD_TOOLS=ON \ + -DLLAMA_BUILD_TESTS=OFF \ + -DCMAKE_SYSTEM_NAME=Linux \ + -DCMAKE_SYSTEM_PROCESSOR=riscv64 \ + -DCMAKE_C_COMPILER=riscv64-linux-gnu-gcc-14 \ + -DCMAKE_CXX_COMPILER=riscv64-linux-gnu-g++-14 \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_FIND_ROOT_PATH=/usr/lib/riscv64-linux-gnu \ + -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \ + -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \ + -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=BOTH + + cmake --build build --config Release -j $(nproc) From e885445bc1719d2e289a9b2e11714e0f994e68be Mon Sep 17 00:00:00 2001 From: Aldehir Rojas Date: Wed, 13 Aug 2025 05:28:21 -0500 Subject: [PATCH 07/13] server : filter out harmony thought messages (#15278) --- tools/server/public/index.html.gz | Bin 1914095 -> 1914135 bytes tools/server/webui/src/utils/misc.ts | 7 ++++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/server/public/index.html.gz b/tools/server/public/index.html.gz index a472714efb74e89e79cc02d65f0349f279417a82..eddf12f9697c2c61c61fc58c3795f547070f2fb3 100644 GIT binary patch delta 1809645 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 z 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%0DQ{j?HPU}>rUAOKB{YgmeHfGB%MTcv5k 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
UzKe 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

!e}J-pHi78- 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 z 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