From 7e0d40b535c74858a300311430309b92cc21c5bb Mon Sep 17 00:00:00 2001 From: xiezhongtao Date: Fri, 16 Jan 2026 18:12:13 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=80=E5=9B=9E=E5=88=B0=20b7516=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 308 +- CMakeLists.txt | 32 +- CONTRIBUTING.md | 39 +- README.md | 22 +- SECURITY.md | 58 +- build-xcframework.sh | 14 +- ci/run.sh | 23 +- cmake/download-models.cmake | 21 - cmake/license.cmake | 40 - common/CMakeLists.txt | 38 +- common/arg.cpp | 456 +- common/arg.h | 9 +- common/chat-parser.cpp | 126 - common/chat.cpp | 110 +- common/chat.h | 2 - common/common.cpp | 65 +- common/common.h | 82 +- common/debug.cpp | 165 - common/debug.h | 43 - common/download.cpp | 459 +- common/download.h | 37 +- common/llguidance.cpp | 16 +- common/preset.cpp | 89 +- common/preset.h | 11 +- common/regex-partial.cpp | 26 +- common/sampling.cpp | 143 +- common/sampling.h | 4 +- convert_hf_to_gguf.py | 889 +- convert_hf_to_gguf_update.py | 5 - docs/backend/CANN.md | 4 - docs/backend/OPENCL.md | 52 +- docs/backend/SYCL.md | 2 +- docs/backend/hexagon/CMakeUserPresets.json | 6 +- docs/backend/hexagon/README.md | 14 +- docs/backend/hexagon/developer.md | 2 +- docs/build-riscv64-spacemit.md | 2 +- docs/build.md | 31 +- docs/ops.md | 9 +- docs/ops/BLAS.csv | 762 +- docs/ops/Metal.csv | 682 +- docs/ops/WebGPU.csv | 763 +- docs/ops/zDNN.csv | 13483 ++++------------ docs/preset.md | 97 - examples/CMakeLists.txt | 2 +- examples/batched/batched.cpp | 19 +- examples/debug/README.md | 54 - examples/debug/debug.cpp | 253 - examples/diffusion/diffusion-cli.cpp | 1 - examples/embedding/embedding.cpp | 50 +- examples/eval-callback/CMakeLists.txt | 27 +- examples/eval-callback/eval-callback.cpp | 161 +- examples/llama.android/app/build.gradle.kts | 7 +- .../java/com/example/llama/MainActivity.kt | 44 +- .../app/src/main/res/layout/activity_main.xml | 5 +- .../llama.android/gradle/libs.versions.toml | 8 +- examples/llama.android/lib/build.gradle.kts | 2 +- .../lib/src/main/cpp/ai_chat.cpp | 2 +- .../java/com/arm/aichat/InferenceEngine.kt | 2 +- .../aichat/internal/InferenceEngineImpl.kt | 39 +- .../CMakeLists.txt | 4 +- examples/model-conversion/Makefile | 13 +- examples/model-conversion/README.md | 18 +- examples/model-conversion/logits.cpp | 268 + .../causal/compare-embeddings-logits.sh | 5 +- .../scripts/causal/compare-logits.py | 13 +- .../scripts/causal/modelcard.template | 2 +- .../causal/run-casual-gen-embeddings-org.py | 2 +- .../run-converted-model-embeddings-logits.sh | 4 +- .../scripts/causal/run-converted-model.sh | 4 +- .../scripts/causal/run-org-model.py | 256 +- .../scripts/embedding/run-converted-model.sh | 17 +- .../scripts/embedding/run-original-model.py | 348 +- .../model-conversion/scripts/utils/common.py | 149 - .../scripts/utils/compare_tokens.py | 76 - .../scripts/utils/semantic_check.py | 25 +- examples/retrieval/retrieval.cpp | 26 +- examples/sycl/build.sh | 4 +- examples/sycl/run-llama2.sh | 4 +- examples/sycl/run-llama3.sh | 4 +- examples/sycl/win-build-sycl.bat | 4 +- examples/sycl/win-run-llama2.bat | 2 +- examples/sycl/win-run-llama3.bat | 2 +- ggml/CMakeLists.txt | 14 +- ggml/include/ggml-backend.h | 2 +- ggml/include/ggml.h | 5 - ggml/src/CMakeLists.txt | 32 +- ggml/src/ggml-backend-impl.h | 2 +- ggml/src/ggml-backend.cpp | 22 +- ggml/src/ggml-blas/CMakeLists.txt | 20 +- ggml/src/ggml-blas/ggml-blas.cpp | 14 +- ggml/src/ggml-cann/aclnn_ops.cpp | 324 +- ggml/src/ggml-cann/aclnn_ops.h | 17 - ggml/src/ggml-cann/common.h | 164 +- ggml/src/ggml-cann/ggml-cann.cpp | 271 +- ggml/src/ggml-cpu/CMakeLists.txt | 14 +- ggml/src/ggml-cpu/ggml-cpu-impl.h | 2 +- ggml/src/ggml-cpu/kleidiai/kernels.cpp | 111 +- ggml/src/ggml-cpu/kleidiai/kleidiai.cpp | 23 +- ggml/src/ggml-cpu/simd-mappings.h | 35 +- ggml/src/ggml-cpu/vec.cpp | 18 - ggml/src/ggml-cuda/CMakeLists.txt | 70 +- ggml/src/ggml-cuda/argsort.cu | 75 +- ggml/src/ggml-cuda/argsort.cuh | 16 - ggml/src/ggml-cuda/common.cuh | 159 +- ggml/src/ggml-cuda/cpy.cu | 220 +- ggml/src/ggml-cuda/cumsum.cu | 140 +- ggml/src/ggml-cuda/fattn-common.cuh | 16 +- ggml/src/ggml-cuda/fattn-mma-f16.cuh | 207 +- ggml/src/ggml-cuda/fattn-tile.cuh | 42 +- ggml/src/ggml-cuda/fattn-vec.cuh | 6 +- ggml/src/ggml-cuda/fattn.cu | 42 +- ggml/src/ggml-cuda/ggml-cuda.cu | 234 +- ggml/src/ggml-cuda/mean.cu | 6 +- ggml/src/ggml-cuda/mma.cuh | 70 +- ggml/src/ggml-cuda/mmq.cu | 69 +- ggml/src/ggml-cuda/mmq.cuh | 181 +- ggml/src/ggml-cuda/norm.cu | 94 +- ggml/src/ggml-cuda/quantize.cu | 151 - ggml/src/ggml-cuda/quantize.cuh | 14 - ggml/src/ggml-cuda/reduce_rows.cuh | 18 +- ggml/src/ggml-cuda/softmax.cu | 202 +- ggml/src/ggml-cuda/ssm-scan.cu | 133 +- ggml/src/ggml-cuda/top-k.cu | 96 - ggml/src/ggml-cuda/top-k.cuh | 3 - ggml/src/ggml-cuda/vendors/cuda.h | 4 - ggml/src/ggml-cuda/vendors/hip.h | 5 - ggml/src/ggml-cuda/vendors/musa.h | 1 - ggml/src/ggml-hexagon/ggml-hexagon.cpp | 1218 +- ggml/src/ggml-hexagon/htp-utils.h | 1 - ggml/src/ggml-hexagon/htp/CMakeLists.txt | 11 +- ggml/src/ggml-hexagon/htp/act-ops.c | 391 +- ggml/src/ggml-hexagon/htp/binary-ops.c | 57 +- ggml/src/ggml-hexagon/htp/cpy-ops.c | 251 - ggml/src/ggml-hexagon/htp/flash-attn-ops.c | 561 - ggml/src/ggml-hexagon/htp/get-rows-ops.c | 106 - ggml/src/ggml-hexagon/htp/hex-dump.h | 77 - ggml/src/ggml-hexagon/htp/hex-fastdiv.h | 37 - ggml/src/ggml-hexagon/htp/hex-utils.h | 51 - ggml/src/ggml-hexagon/htp/htp-ctx.h | 7 +- .../ggml-hexagon/htp/{hex-dma.c => htp-dma.c} | 2 +- .../ggml-hexagon/htp/{hex-dma.h => htp-dma.h} | 1 + ggml/src/ggml-hexagon/htp/htp-msg.h | 11 +- ggml/src/ggml-hexagon/htp/htp-ops.h | 40 +- ggml/src/ggml-hexagon/htp/hvx-arith.h | 457 - ggml/src/ggml-hexagon/htp/hvx-base.h | 167 - ggml/src/ggml-hexagon/htp/hvx-copy.h | 247 - ggml/src/ggml-hexagon/htp/hvx-dump.h | 132 - ggml/src/ggml-hexagon/htp/hvx-exp.c | 94 + ggml/src/ggml-hexagon/htp/hvx-exp.h | 215 - ggml/src/ggml-hexagon/htp/hvx-floor.h | 100 - ggml/src/ggml-hexagon/htp/hvx-inverse.c | 72 + ggml/src/ggml-hexagon/htp/hvx-inverse.h | 176 - ggml/src/ggml-hexagon/htp/hvx-reduce.h | 225 - ggml/src/ggml-hexagon/htp/hvx-scale.h | 133 - ggml/src/ggml-hexagon/htp/hvx-sigmoid.c | 49 + ggml/src/ggml-hexagon/htp/hvx-sigmoid.h | 114 - ggml/src/ggml-hexagon/htp/hvx-sqrt.h | 60 - ggml/src/ggml-hexagon/htp/hvx-types.h | 36 - ggml/src/ggml-hexagon/htp/hvx-utils.c | 1067 ++ ggml/src/ggml-hexagon/htp/hvx-utils.h | 1111 +- ggml/src/ggml-hexagon/htp/main.c | 228 +- ggml/src/ggml-hexagon/htp/matmul-ops.c | 1082 +- ggml/src/ggml-hexagon/htp/ops-utils.h | 149 + ggml/src/ggml-hexagon/htp/rope-ops.c | 25 +- ggml/src/ggml-hexagon/htp/set-rows-ops.c | 164 - ggml/src/ggml-hexagon/htp/softmax-ops.c | 49 +- ggml/src/ggml-hexagon/htp/unary-ops.c | 69 +- ggml/src/ggml-hexagon/htp/worker-pool.c | 4 + ggml/src/ggml-hexagon/op-desc.h | 153 - ggml/src/ggml-impl.h | 4 + ggml/src/ggml-metal/CMakeLists.txt | 18 +- ggml/src/ggml-metal/ggml-metal-device.cpp | 57 - ggml/src/ggml-metal/ggml-metal-device.h | 4 - ggml/src/ggml-metal/ggml-metal-device.m | 7 - ggml/src/ggml-metal/ggml-metal-impl.h | 20 - ggml/src/ggml-metal/ggml-metal-ops.cpp | 73 +- ggml/src/ggml-metal/ggml-metal-ops.h | 1 - ggml/src/ggml-metal/ggml-metal.cpp | 7 +- ggml/src/ggml-metal/ggml-metal.metal | 80 +- ggml/src/ggml-opencl/CMakeLists.txt | 4 - ggml/src/ggml-opencl/ggml-opencl.cpp | 485 +- ggml/src/ggml-opencl/kernels/expm1.cl | 82 - ggml/src/ggml-opencl/kernels/fill.cl | 17 - ggml/src/ggml-opencl/kernels/softplus.cl | 88 - ggml/src/ggml-opencl/kernels/solve_tri.cl | 51 - ggml/src/ggml-rpc/ggml-rpc.cpp | 19 +- ggml/src/ggml-sycl/CMakeLists.txt | 43 +- ggml/src/ggml-sycl/ggml-sycl.cpp | 8 +- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 1315 +- .../vulkan-shaders/count_experts.comp | 51 - .../ggml-vulkan/vulkan-shaders/cumsum.comp | 42 +- .../vulkan-shaders/cumsum_multipass1.comp | 60 - .../vulkan-shaders/cumsum_multipass2.comp | 66 - .../vulkan-shaders/dequant_funcs.glsl | 11 +- .../vulkan-shaders/mul_mat_vec.comp | 1 + .../vulkan-shaders/mul_mat_vec_base.glsl | 4 +- .../vulkan-shaders/mul_mat_vec_iq1_m.comp | 2 +- .../vulkan-shaders/mul_mat_vec_iq1_s.comp | 2 +- .../vulkan-shaders/mul_mat_vec_iq2_s.comp | 2 +- .../vulkan-shaders/mul_mat_vec_iq2_xs.comp | 4 +- .../vulkan-shaders/mul_mat_vec_iq2_xxs.comp | 2 +- .../vulkan-shaders/mul_mat_vec_iq3_s.comp | 2 +- .../vulkan-shaders/mul_mat_vec_iq3_xxs.comp | 2 +- .../vulkan-shaders/mul_mat_vec_q2_k.comp | 2 +- .../vulkan-shaders/mul_mat_vec_q3_k.comp | 2 +- .../vulkan-shaders/mul_mat_vec_q4_k.comp | 2 +- .../vulkan-shaders/mul_mat_vec_q5_k.comp | 2 +- .../vulkan-shaders/mul_mat_vec_q6_k.comp | 2 +- .../vulkan-shaders/mul_mat_vecq.comp | 13 +- .../vulkan-shaders/mul_mat_vecq_funcs.glsl | 115 - .../ggml-vulkan/vulkan-shaders/mul_mm.comp | 22 +- .../vulkan-shaders/mul_mm_cm2.comp | 51 +- .../vulkan-shaders/mul_mm_funcs.glsl | 101 +- .../vulkan-shaders/mul_mm_id_funcs.glsl | 4 +- .../ggml-vulkan/vulkan-shaders/mul_mmq.comp | 22 +- .../vulkan-shaders/mul_mmq_funcs.glsl | 6 +- .../vulkan-shaders/quantize_q8_1.comp | 16 +- .../vulkan-shaders/rope_multi.comp | 5 +- .../ggml-vulkan/vulkan-shaders/rope_neox.comp | 5 +- .../ggml-vulkan/vulkan-shaders/rope_norm.comp | 5 +- .../vulkan-shaders/rope_params.glsl | 1 - .../vulkan-shaders/rope_vision.comp | 5 +- .../ggml-vulkan/vulkan-shaders/ssm_scan.comp | 108 +- .../ggml-vulkan/vulkan-shaders/topk_moe.comp | 79 +- .../src/ggml-vulkan/vulkan-shaders/types.glsl | 318 +- .../ggml-vulkan/vulkan-shaders/upscale.comp | 54 - .../vulkan-shaders/vulkan-shaders-gen.cpp | 12 +- .../ggml-webgpu/ggml-webgpu-shader-lib.hpp | 169 - ggml/src/ggml-webgpu/ggml-webgpu.cpp | 315 +- ggml/src/ggml-webgpu/pre_wgsl.hpp | 778 - .../ggml-webgpu/wgsl-shaders/flash_attn.wgsl | 591 - .../ggml-webgpu/wgsl-shaders/unary_op.wgsl | 24 +- ggml/src/ggml.c | 8 +- gguf-py/gguf/constants.py | 243 +- gguf-py/gguf/gguf_writer.py | 38 - gguf-py/gguf/tensor_mapping.py | 115 +- gguf-py/pyproject.toml | 1 - grammars/README.md | 3 - include/llama-cpp.h | 4 +- include/llama.h | 148 +- licenses/LICENSE-curl | 9 + .../LICENSE => licenses/LICENSE-httplib | 1 - licenses/LICENSE-linenoise | 26 + models/templates/llama-cpp-deepseek-r1.jinja | 6 +- scripts/debug-test.sh | 3 +- scripts/pr2wt.sh | 79 - scripts/serve-static.js | 2 +- scripts/snapdragon/adb/run-bench.sh | 22 +- scripts/snapdragon/adb/run-cli.sh | 26 +- scripts/snapdragon/adb/run-completion.sh | 59 - scripts/snapdragon/adb/run-mtmd.sh | 5 +- scripts/snapdragon/adb/run-tool.sh | 7 +- scripts/sync-ggml.last | 2 +- scripts/sync_vendor.py | 3 +- scripts/tool_bench.py | 2 +- src/CMakeLists.txt | 4 - src/llama-adapter.cpp | 7 +- src/llama-adapter.h | 4 - src/llama-arch.cpp | 96 - src/llama-arch.h | 6 - src/llama-chat.cpp | 31 - src/llama-chat.h | 2 - src/llama-context.cpp | 1027 +- src/llama-context.h | 54 +- src/llama-cparams.h | 2 - src/llama-grammar.cpp | 53 +- src/llama-grammar.h | 2 - src/llama-graph.cpp | 258 +- src/llama-graph.h | 77 +- src/llama-hparams.cpp | 4 - src/llama-hparams.h | 17 +- src/llama-kv-cache.h | 2 +- src/llama-mmap.cpp | 139 +- src/llama-mmap.h | 9 +- src/llama-model-loader.cpp | 32 +- src/llama-model-loader.h | 2 - src/llama-model-saver.cpp | 3 - src/llama-model.cpp | 619 +- src/llama-model.h | 13 +- src/llama-quant.cpp | 2 +- src/llama-sampling.cpp | 1700 +- src/llama-sampling.h | 26 +- src/llama-vocab.cpp | 177 +- src/llama-vocab.h | 3 - src/llama.cpp | 237 +- src/models/afmoe.cpp | 14 +- src/models/bert.cpp | 6 +- src/models/cogvlm.cpp | 8 +- src/models/cohere2-iswa.cpp | 3 - src/models/deepseek2.cpp | 2 +- src/models/exaone-moe.cpp | 146 - src/models/gemma-embedding.cpp | 8 +- src/models/gemma2-iswa.cpp | 7 +- src/models/gemma3.cpp | 7 +- src/models/gemma3n-iswa.cpp | 27 +- src/models/llama-iswa.cpp | 8 +- src/models/llama.cpp | 25 +- src/models/maincoder.cpp | 117 - src/models/mimo2-iswa.cpp | 123 - src/models/models.h | 30 +- src/models/modern-bert.cpp | 20 +- src/models/openai-moe-iswa.cpp | 7 +- src/models/plamo3.cpp | 128 - src/models/qwen3next.cpp | 382 +- src/models/smallthinker.cpp | 16 +- src/unicode.cpp | 37 +- tests/CMakeLists.txt | 35 +- tests/test-arg-parser.cpp | 12 +- tests/test-backend-ops.cpp | 249 +- tests/test-backend-sampler.cpp | 1165 -- tests/test-chat.cpp | 32 +- tests/test-regex-partial.cpp | 28 +- tools/CMakeLists.txt | 3 +- tools/cli/README.md | 23 +- tools/completion/README.md | 30 +- tools/completion/completion.cpp | 5 +- tools/fit-params/fit-params.cpp | 8 +- tools/llama-bench/llama-bench.cpp | 58 +- tools/mtmd/CMakeLists.txt | 2 - tools/mtmd/clip-graph.h | 4 + tools/mtmd/clip-impl.h | 64 +- tools/mtmd/clip-model.h | 60 +- tools/mtmd/clip.cpp | 333 +- tools/mtmd/clip.h | 7 +- tools/mtmd/models/mobilenetv5.cpp | 451 - tools/mtmd/models/models.h | 43 - tools/mtmd/models/siglip.cpp | 13 +- tools/mtmd/models/whisper-enc.cpp | 9 - tools/mtmd/models/youtuvl.cpp | 179 - tools/mtmd/mtmd-audio.cpp | 580 +- tools/mtmd/mtmd-audio.h | 73 - tools/mtmd/mtmd-cli.cpp | 7 - tools/mtmd/mtmd.cpp | 35 +- tools/mtmd/mtmd.h | 23 +- tools/quantize/quantize.cpp | 6 - tools/run/CMakeLists.txt | 23 + tools/run/README.md | 52 + tools/run/linenoise.cpp/linenoise.cpp | 1995 +++ tools/run/linenoise.cpp/linenoise.h | 137 + tools/run/run.cpp | 1408 ++ tools/server/CMakeLists.txt | 8 + tools/server/README.md | 36 +- tools/server/public/index.html.gz | Bin 1451551 -> 1451262 bytes tools/server/server-common.cpp | 23 +- tools/server/server-context.cpp | 447 +- tools/server/server-models.cpp | 236 +- tools/server/server-models.h | 19 +- tools/server/server-queue.cpp | 45 +- tools/server/server-queue.h | 5 +- tools/server/server-task.cpp | 151 +- tools/server/server-task.h | 86 +- tools/server/server.cpp | 4 +- .../server/tests/unit/test_chat_completion.py | 46 +- .../tests/unit/test_compat_anthropic.py | 89 - tools/server/tests/unit/test_completion.py | 6 +- .../app/chat/ChatForm/ChatForm.svelte | 91 +- .../ChatFormActionFileAttachments.svelte | 15 +- .../ChatFormActions/ChatFormActions.svelte | 2 +- .../ChatFormFileInputInvisible.svelte | 24 +- .../ChatMessages/ChatMessageAssistant.svelte | 26 +- .../ChatMessages/ChatMessageStatistics.svelte | 79 +- .../app/chat/ChatSettings/ChatSettings.svelte | 5 - .../src/lib/constants/settings-config.ts | 3 - .../lib/hooks/use-processing-state.svelte.ts | 136 +- tools/server/webui/src/lib/services/chat.ts | 23 +- .../webui/src/lib/stores/chat.svelte.ts | 15 +- .../webui/src/lib/stores/settings.svelte.ts | 9 +- tools/server/webui/src/lib/types/api.d.ts | 5 - .../server/webui/src/lib/types/settings.d.ts | 3 +- tools/server/webui/src/lib/utils/clipboard.ts | 5 +- tools/server/webui/src/lib/utils/file-type.ts | 23 +- tools/server/webui/src/lib/utils/index.ts | 1 + .../src/lib/utils/modality-file-validation.ts | 38 +- .../src/lib/utils/process-uploaded-files.ts | 22 +- tools/server/webui/src/routes/+layout.svelte | 2 +- .../tests/stories/ChatForm.stories.svelte | 5 +- tools/tts/README.md | 2 +- vendor/cpp-httplib/CMakeLists.txt | 7 +- vendor/cpp-httplib/httplib.cpp | 1484 +- vendor/cpp-httplib/httplib.h | 1149 +- 380 files changed, 18454 insertions(+), 38808 deletions(-) delete mode 100644 cmake/download-models.cmake delete mode 100644 cmake/license.cmake delete mode 100644 common/debug.cpp delete mode 100644 common/debug.h delete mode 100644 docs/preset.md delete mode 100644 examples/debug/README.md delete mode 100644 examples/debug/debug.cpp rename examples/{debug => model-conversion}/CMakeLists.txt (73%) create mode 100644 examples/model-conversion/logits.cpp delete mode 100755 examples/model-conversion/scripts/utils/compare_tokens.py delete mode 100644 ggml/src/ggml-cuda/top-k.cu delete mode 100644 ggml/src/ggml-cuda/top-k.cuh delete mode 100644 ggml/src/ggml-hexagon/htp/cpy-ops.c delete mode 100644 ggml/src/ggml-hexagon/htp/flash-attn-ops.c delete mode 100644 ggml/src/ggml-hexagon/htp/get-rows-ops.c delete mode 100644 ggml/src/ggml-hexagon/htp/hex-dump.h delete mode 100644 ggml/src/ggml-hexagon/htp/hex-fastdiv.h delete mode 100644 ggml/src/ggml-hexagon/htp/hex-utils.h rename ggml/src/ggml-hexagon/htp/{hex-dma.c => htp-dma.c} (98%) rename ggml/src/ggml-hexagon/htp/{hex-dma.h => htp-dma.h} (99%) delete mode 100644 ggml/src/ggml-hexagon/htp/hvx-arith.h delete mode 100644 ggml/src/ggml-hexagon/htp/hvx-base.h delete mode 100644 ggml/src/ggml-hexagon/htp/hvx-copy.h delete mode 100644 ggml/src/ggml-hexagon/htp/hvx-dump.h create mode 100644 ggml/src/ggml-hexagon/htp/hvx-exp.c delete mode 100644 ggml/src/ggml-hexagon/htp/hvx-exp.h delete mode 100644 ggml/src/ggml-hexagon/htp/hvx-floor.h create mode 100644 ggml/src/ggml-hexagon/htp/hvx-inverse.c delete mode 100644 ggml/src/ggml-hexagon/htp/hvx-inverse.h delete mode 100644 ggml/src/ggml-hexagon/htp/hvx-reduce.h delete mode 100644 ggml/src/ggml-hexagon/htp/hvx-scale.h create mode 100644 ggml/src/ggml-hexagon/htp/hvx-sigmoid.c delete mode 100644 ggml/src/ggml-hexagon/htp/hvx-sigmoid.h delete mode 100644 ggml/src/ggml-hexagon/htp/hvx-sqrt.h delete mode 100644 ggml/src/ggml-hexagon/htp/hvx-types.h create mode 100644 ggml/src/ggml-hexagon/htp/hvx-utils.c create mode 100644 ggml/src/ggml-hexagon/htp/ops-utils.h delete mode 100644 ggml/src/ggml-hexagon/htp/set-rows-ops.c delete mode 100644 ggml/src/ggml-hexagon/op-desc.h delete mode 100644 ggml/src/ggml-opencl/kernels/expm1.cl delete mode 100644 ggml/src/ggml-opencl/kernels/fill.cl delete mode 100644 ggml/src/ggml-opencl/kernels/softplus.cl delete mode 100644 ggml/src/ggml-opencl/kernels/solve_tri.cl delete mode 100644 ggml/src/ggml-vulkan/vulkan-shaders/count_experts.comp delete mode 100644 ggml/src/ggml-vulkan/vulkan-shaders/cumsum_multipass1.comp delete mode 100644 ggml/src/ggml-vulkan/vulkan-shaders/cumsum_multipass2.comp delete mode 100644 ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp delete mode 100644 ggml/src/ggml-webgpu/pre_wgsl.hpp delete mode 100644 ggml/src/ggml-webgpu/wgsl-shaders/flash_attn.wgsl create mode 100644 licenses/LICENSE-curl rename vendor/cpp-httplib/LICENSE => licenses/LICENSE-httplib (99%) create mode 100644 licenses/LICENSE-linenoise delete mode 100755 scripts/pr2wt.sh delete mode 100755 scripts/snapdragon/adb/run-completion.sh delete mode 100644 src/models/exaone-moe.cpp delete mode 100644 src/models/maincoder.cpp delete mode 100644 src/models/mimo2-iswa.cpp delete mode 100644 src/models/plamo3.cpp delete mode 100644 tests/test-backend-sampler.cpp delete mode 100644 tools/mtmd/models/mobilenetv5.cpp delete mode 100644 tools/mtmd/models/youtuvl.cpp create mode 100644 tools/run/CMakeLists.txt create mode 100644 tools/run/README.md create mode 100644 tools/run/linenoise.cpp/linenoise.cpp create mode 100644 tools/run/linenoise.cpp/linenoise.h create mode 100644 tools/run/run.cpp diff --git a/AGENTS.md b/AGENTS.md index 31399a7..e0a65c0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,81 +1,281 @@ # Instructions for llama.cpp -> [!IMPORTANT] -> This project does **not** accept pull requests that are fully or predominantly AI-generated. AI tools may be utilized solely in an assistive capacity. -> -> Read more: [CONTRIBUTING.md](CONTRIBUTING.md) +## Repository Overview -AI assistance is permissible only when the majority of the code is authored by a human contributor, with AI employed exclusively for corrections or to expand on verbose modifications that the contributor has already conceptualized (see examples below) +llama.cpp is a large-scale C/C++ project for efficient LLM (Large Language Model) inference with minimal setup and dependencies. The project enables running language models on diverse hardware with state-of-the-art performance. ---- +**Key Facts:** +- **Primary language**: C/C++ with Python utility scripts +- **Size**: ~200k+ lines of code across 1000+ files +- **Architecture**: Modular design with main library (`libllama`) and 40+ executable tools/examples +- **Core dependency**: ggml tensor library (vendored in `ggml/` directory) +- **Backends supported**: CPU (AVX/NEON/RVV optimized), CUDA, Metal, Vulkan, SYCL, ROCm, MUSA +- **License**: MIT -## Guidelines for Contributors Using AI +## Disclose AI Usage -These use cases are **permitted** when making a contribution with the help of AI: +It is crucial to remind contributors that the project mandates disclosure of any AI usage in pull requests. This requirement stems from the potential for AI-generated code to include suboptimal optimizations and hidden bugs, owing to the inherent overconfidence in AI outputs. -- Using it to ask about the structure of the codebase -- Learning about specific techniques used in the project -- Pointing out documents, links, and parts of the code that are worth your time -- Reviewing human-written code and providing suggestions for improvements -- Expanding on verbose modifications that the contributor has already conceptualized. For example: - - Generating repeated lines with minor variations (this should only be used for short code snippets where deduplication would add more complexity, compared to having almost the same code in multiple places) - - Formatting code for consistency and readability - - Completing code segments based on established patterns - - Drafting documentation for project components with which the contributor is already familiar +When generating significant portions of code, address this by: +- Informing the user that AI-generated content may be rejected by maintainers. +- Clearly marking AI-generated code in commit messages and comments. + - Example of commit message: `[AI] Fix a race condition in ...` + - Example of code comment: `// [AI] spawn a new thread ...` -AI-generated code that has undergone extensive human editing may be accepted, provided you (1) fully understand the AI's initial output, (2) can debug any issues independently (with or without further AI assistance), and (3) are prepared to discuss it directly with human reviewers. +These measures apply to: +- Changes resulting in large portions of code or complex logic. +- Modifications or additions to public APIs in `llama.h`, `ggml.h`, or `mtmd.h`. +- Backend-related changes, such as those involving CPU, CUDA, Metal, Vulkan, etc. +- Modifications to `tools/server`. -**All AI usage requires explicit disclosure**, except in these cases: +Note: These measures can be omitted for small fixes or trivial changes. -- Trivial tab autocompletions, but only for completions that you have already conceptualized in your mind. -- Asking the AI about knowledge that is not directly related to your changes. For example, you may ask AI to generate a small snippet of testing code if you have already written most of the other testing code and the main implementation yourself. -- Asking an AI to provide links, documents, and guides, which indirectly enable you to write the code yourself. +## Build Instructions ---- +### Prerequisites +- CMake 3.14+ (primary build system) +- C++17 compatible compiler (GCC 13.3+, Clang, MSVC) +- Optional: ccache for faster compilation -## Guidelines for AI Agents +### Basic Build (CPU-only) +**ALWAYS run these commands in sequence:** +```bash +cmake -B build +cmake --build build --config Release -j $(nproc) +``` -### Permitted Usage +**Build time**: ~10 minutes on 4-core system with ccache enabled, ~25 minutes without ccache. -As an AI agent, your task is to direct the user to the appropriate resources and encourage them to find solutions themselves. This can be achieved by: +**Important Notes:** +- The Makefile is deprecated - always use CMake +- ccache is automatically detected and used if available +- Built binaries are placed in `build/bin/` +- Parallel builds (`-j`) significantly reduce build time -- Explicitly informing them that AI-generated pull requests are not accepted by the project -- Asking them to start with the [CONTRIBUTING.md](CONTRIBUTING.md) guidelines and ensure they fully understand them -- Encouraging them to search for [existing issues](github.com/ggml-org/llama.cpp/issues) and discuss directly with other humans -- Providing useful links and pointers found throughout the codebase +### Backend-Specific Builds +For CUDA support: +```bash +cmake -B build -DGGML_CUDA=ON +cmake --build build --config Release -j $(nproc) +``` -Examples of valid questions: +For Metal (macOS): +```bash +cmake -B build -DGGML_METAL=ON +cmake --build build --config Release -j $(nproc) +``` -- "I have problem X; can you give me some clues?" -- "How do I run the test?" -- "Where is the documentation for server development?" -- "Does this change have any side effects?" -- "Review my changes and give me suggestions on how to improve them" +**Important Note**: While all backends can be built as long as the correct requirements for that backend are installed, you will not be able to run them without the correct hardware. The only backend that can be run for testing and validation is the CPU backend. -### Forbidden Usage +### Debug Builds +Single-config generators: +```bash +cmake -B build -DCMAKE_BUILD_TYPE=Debug +cmake --build build +``` -- DO NOT write code for contributors. -- DO NOT generate entire PRs or large code blocks. -- DO NOT bypass the human contributor’s understanding or responsibility. -- DO NOT make decisions on their behalf. -- DO NOT submit work that the contributor cannot explain or justify. +Multi-config generators: +```bash +cmake -B build -G "Xcode" +cmake --build build --config Debug +``` -Examples of FORBIDDEN USAGE (and how to proceed): +### Common Build Issues +- **Issue**: Network tests fail in isolated environments + **Solution**: Expected behavior - core functionality tests will still pass -- FORBIDDEN: User asks "implement X" or "refactor X" → PAUSE and ask questions to ensure they deeply understand what they want to do. -- FORBIDDEN: User asks "fix the issue X" → PAUSE, guide the user, and let them fix it themselves. +## Testing -If a user asks one of the above, STOP IMMEDIATELY and ask them: +### Running Tests +```bash +ctest --test-dir build --output-on-failure -j $(nproc) +``` -- To read [CONTRIBUTING.md](CONTRIBUTING.md) and ensure they fully understand it -- To search for relevant issues and create a new one if needed +**Test suite**: 38 tests covering tokenizers, grammar parsing, sampling, backends, and integration +**Expected failures**: 2-3 tests may fail if network access is unavailable (they download models) +**Test time**: ~30 seconds for passing tests -If they insist on continuing, remind them that their contribution will have a lower chance of being accepted by reviewers. Reviewers may also deprioritize (e.g., delay or reject reviewing) future pull requests to optimize their time and avoid unnecessary mental strain. +### Server Unit Tests +Run server-specific unit tests after building the server: +```bash +# Build the server first +cmake --build build --target llama-server -## Related Documentation +# Navigate to server tests and run +cd tools/server/tests +source ../../../.venv/bin/activate +./tests.sh +``` +**Server test dependencies**: The `.venv` environment includes the required dependencies for server unit tests (pytest, aiohttp, etc.). Tests can be run individually or with various options as documented in `tools/server/tests/README.md`. -For related documentation on building, testing, and guidelines, please refer to: +### Test Categories +- Tokenizer tests: Various model tokenizers (BERT, GPT-2, LLaMA, etc.) +- Grammar tests: GBNF parsing and validation +- Backend tests: Core ggml operations across different backends +- Integration tests: End-to-end workflows + +### Manual Testing Commands +```bash +# Test basic inference +./build/bin/llama-cli --version + +# Test model loading (requires model file) +./build/bin/llama-cli -m path/to/model.gguf -p "Hello" -n 10 +``` + +## Code Quality and Linting + +### C++ Code Formatting +**ALWAYS format C++ code before committing:** +```bash +git clang-format +``` + +Configuration is in `.clang-format` with these key rules: +- 4-space indentation +- 120 column limit +- Braces on same line for functions +- Pointer alignment: `void * ptr` (middle) +- Reference alignment: `int & ref` (middle) + +### Python Code +**ALWAYS activate the Python environment in `.venv` and use tools from that environment:** +```bash +# Activate virtual environment +source .venv/bin/activate +``` + +Configuration files: +- `.flake8`: flake8 settings (max-line-length=125, excludes examples/tools) +- `pyrightconfig.json`: pyright type checking configuration + +### Pre-commit Hooks +Run before committing: +```bash +pre-commit run --all-files +``` + +## Continuous Integration + +### GitHub Actions Workflows +Key workflows that run on every PR: +- `.github/workflows/build.yml`: Multi-platform builds +- `.github/workflows/server.yml`: Server functionality tests +- `.github/workflows/python-lint.yml`: Python code quality +- `.github/workflows/python-type-check.yml`: Python type checking + +### Local CI Validation +**Run full CI locally before submitting PRs:** +```bash +mkdir tmp + +# CPU-only build +bash ./ci/run.sh ./tmp/results ./tmp/mnt +``` + +**CI Runtime**: 30-60 minutes depending on backend configuration + +### Triggering CI +Add `ggml-ci` to commit message to trigger heavy CI workloads on the custom CI infrastructure. + +## Project Layout and Architecture + +### Core Directories +- **`src/`**: Main llama library implementation (`llama.cpp`, `llama-*.cpp`) +- **`include/`**: Public API headers, primarily `include/llama.h` +- **`ggml/`**: Core tensor library (submodule with custom GGML framework) +- **`examples/`**: 30+ example applications and tools +- **`tools/`**: Additional development and utility tools (server benchmarks, tests) +- **`tests/`**: Comprehensive test suite with CTest integration +- **`docs/`**: Detailed documentation (build guides, API docs, etc.) +- **`scripts/`**: Utility scripts for CI, data processing, and automation +- **`common/`**: Shared utility code used across examples + +### Key Files +- **`CMakeLists.txt`**: Primary build configuration +- **`include/llama.h`**: Main C API header (~2000 lines) +- **`src/llama.cpp`**: Core library implementation (~8000 lines) +- **`CONTRIBUTING.md`**: Coding guidelines and PR requirements +- **`.clang-format`**: C++ formatting rules +- **`.pre-commit-config.yaml`**: Git hook configuration + +### Built Executables (in `build/bin/`) +Primary tools: +- **`llama-cli`**: Main inference tool +- **`llama-server`**: OpenAI-compatible HTTP server +- **`llama-quantize`**: Model quantization utility +- **`llama-perplexity`**: Model evaluation tool +- **`llama-bench`**: Performance benchmarking +- **`llama-convert-llama2c-to-ggml`**: Model conversion utilities + +### Configuration Files +- **CMake**: `CMakeLists.txt`, `cmake/` directory +- **Linting**: `.clang-format`, `.clang-tidy`, `.flake8` +- **CI**: `.github/workflows/`, `ci/run.sh` +- **Git**: `.gitignore` (includes build artifacts, models, cache) + +### Dependencies +- **System**: OpenMP, libcurl (for model downloading) +- **Optional**: CUDA SDK, Metal framework, Vulkan SDK, Intel oneAPI +- **Bundled**: httplib, json (header-only libraries in vendored form) + +## Common Validation Steps + +### After Making Changes +1. **Format code**: `git clang-format` +2. **Build**: `cmake --build build --config Release` +3. **Test**: `ctest --test-dir build --output-on-failure` +4. **Server tests** (if modifying server): `cd tools/server/tests && source ../../../.venv/bin/activate && ./tests.sh` +5. **Manual validation**: Test relevant tools in `build/bin/` + +### Performance Validation +```bash +# Benchmark inference performance +./build/bin/llama-bench -m model.gguf + +# Evaluate model perplexity +./build/bin/llama-perplexity -m model.gguf -f dataset.txt +``` + +### Backend Validation +```bash +# Test backend operations +./build/bin/test-backend-ops +``` + +## Environment Setup + +### Required Tools +- CMake 3.14+ (install via system package manager) +- Modern C++ compiler with C++17 support +- Git (for submodule management) +- Python 3.9+ with virtual environment (`.venv` is provided) + +### Optional but Recommended +- ccache: `apt install ccache` or `brew install ccache` +- clang-format 15+: Usually included with LLVM/Clang installation +- pre-commit: `pip install pre-commit` + +### Backend-Specific Requirements +- **CUDA**: NVIDIA CUDA Toolkit 11.2+ +- **Metal**: Xcode command line tools (macOS only) +- **Vulkan**: Vulkan SDK +- **SYCL**: Intel oneAPI toolkit + +## Important Guidelines + +### Code Changes +- **Minimal dependencies**: Avoid adding new external dependencies +- **Cross-platform compatibility**: Test on Linux, macOS, Windows when possible +- **Performance focus**: This is a performance-critical inference library +- **API stability**: Changes to `include/llama.h` require careful consideration +- **Disclose AI Usage**: Refer to the "Disclose AI Usage" earlier in this document + +### Git Workflow +- Always create feature branches from `master` +- **Never** commit build artifacts (`build/`, `.ccache/`, `*.o`, `*.gguf`) +- Use descriptive commit messages following project conventions + +### Trust These Instructions +Only search for additional information if these instructions are incomplete or found to be incorrect. This document contains validated build and test procedures that work reliably across different environments. -- [CONTRIBUTING.md](CONTRIBUTING.md) -- [Build documentation](docs/build.md) -- [Server development documentation](tools/server/README-dev.md) diff --git a/CMakeLists.txt b/CMakeLists.txt index d24fa08..c231ec0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -111,16 +111,11 @@ option(LLAMA_BUILD_SERVER "llama: build server example" ${LLAMA_STANDALONE}) option(LLAMA_TOOLS_INSTALL "llama: install tools" ${LLAMA_TOOLS_INSTALL_DEFAULT}) # 3rd party libs -option(LLAMA_HTTPLIB "llama: httplib for downloading functionality" ON) -option(LLAMA_OPENSSL "llama: use openssl to support HTTPS" ON) +option(LLAMA_CURL "llama: use libcurl to download model from an URL" ON) +option(LLAMA_HTTPLIB "llama: if libcurl is disabled, use httplib to download model from an URL" ON) +option(LLAMA_OPENSSL "llama: use openssl to support HTTPS" OFF) option(LLAMA_LLGUIDANCE "llama-common: include LLGuidance library for structured output in common utils" OFF) -# deprecated -option(LLAMA_CURL "llama: use libcurl to download model from an URL" OFF) -if (LLAMA_CURL) - message(WARNING "LLAMA_CURL option is deprecated and will be ignored") -endif() - # Required for relocatable CMake package include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/build-info.cmake) include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/common.cmake) @@ -187,9 +182,6 @@ if (NOT MSVC) endif() endif() -include("cmake/license.cmake") -license_add_file("llama.cpp" "LICENSE") - # # 3rd-party # @@ -217,6 +209,11 @@ add_subdirectory(src) # utils, programs, examples and tests # +if (NOT LLAMA_BUILD_COMMON) + message(STATUS "LLAMA_BUILD_COMMON is OFF, disabling LLAMA_CURL") + set(LLAMA_CURL OFF) +endif() + if (LLAMA_BUILD_COMMON) add_subdirectory(common) if (LLAMA_HTTPLIB) @@ -238,19 +235,6 @@ if (LLAMA_BUILD_COMMON AND LLAMA_BUILD_TOOLS) add_subdirectory(tools) endif() -# Automatically add all files from the 'licenses' directory -file(GLOB EXTRA_LICENSES "${CMAKE_SOURCE_DIR}/licenses/LICENSE-*") - -foreach(FILE_PATH ${EXTRA_LICENSES}) - get_filename_component(FILE_NAME "${FILE_PATH}" NAME) - string(REGEX REPLACE "^LICENSE-" "" NAME "${FILE_NAME}") - license_add_file("${NAME}" "${FILE_PATH}") -endforeach() - -if (LLAMA_BUILD_COMMON) - license_generate(common) -endif() - # # install # diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c928bc3..4545ff8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,45 +6,21 @@ The project differentiates between 3 levels of contributors: - Collaborators (Triage): people with significant contributions, who may be responsible for some parts of the code, and are expected to maintain and review contributions for the code they own - Maintainers: responsible for reviewing and merging PRs, after approval from the code owners -# AI Usage Policy - -> [!IMPORTANT] -> This project does **not** accept pull requests that are fully or predominantly AI-generated. AI tools may be utilized solely in an assistive capacity. -> -> Detailed information regarding permissible and restricted uses of AI can be found in the [AGENTS.md](AGENTS.md) file. - -Code that is initially generated by AI and subsequently edited will still be considered AI-generated. AI assistance is permissible only when the majority of the code is authored by a human contributor, with AI employed exclusively for corrections or to expand on verbose modifications that the contributor has already conceptualized (e.g., generating repeated lines with minor variations). - -If AI is used to generate any portion of the code, contributors must adhere to the following requirements: - -1. Explicitly disclose the manner in which AI was employed. -2. Perform a comprehensive manual review prior to submitting the pull request. -3. Be prepared to explain every line of code they submitted when asked about it by a maintainer. -4. Using AI to write pull request descriptions or to respond to human reviewers is strictly prohibited. - -For more info, please refer to the [AGENTS.md](AGENTS.md) file. - # Pull requests (for contributors & collaborators) -Before submitting your PR: -- Search for existing PRs to prevent duplicating efforts - llama.cpp uses the ggml tensor library for model evaluation. If you are unfamiliar with ggml, consider taking a look at the [examples in the ggml repository](https://github.com/ggml-org/ggml/tree/master/examples/). [simple](https://github.com/ggml-org/ggml/tree/master/examples/simple) shows the bare minimum for using ggml. [gpt-2](https://github.com/ggml-org/ggml/tree/master/examples/gpt-2) has minimal implementations for language model inference using GPT-2. [mnist](https://github.com/ggml-org/ggml/tree/master/examples/mnist) demonstrates how to train and evaluate a simple image classifier - Test your changes: - Execute [the full CI locally on your machine](ci/README.md) before publishing - Verify that the perplexity and the performance are not affected negatively by your changes (use `llama-perplexity` and `llama-bench`) - If you modified the `ggml` source, run the `test-backend-ops` tool to check whether different backend implementations of the `ggml` operators produce consistent results (this requires access to at least two different `ggml` backends) - If you modified a `ggml` operator or added a new one, add the corresponding test cases to `test-backend-ops` -- Create separate PRs for each feature or fix: - - Avoid combining unrelated changes in a single PR - - For intricate features, consider opening a feature request first to discuss and align expectations - - When adding support for a new model or feature, focus on **CPU support only** in the initial PR unless you have a good reason not to. Add support for other backends like CUDA in follow-up PRs +- Create separate PRs for each feature or fix. Avoid combining unrelated changes in a single PR +- When adding support for a new model or feature, focus on **CPU support only** in the initial PR unless you have a good reason not to. Add support for other backends like CUDA in follow-up PRs - Consider allowing write access to your branch for faster reviews, as reviewers can push commits directly - -After submitting your PR: -- Expect requests for modifications to ensure the code meets llama.cpp's standards for quality and long-term maintainability -- Maintainers will rely on your insights and approval when making a final decision to approve and merge a PR - If your PR becomes stale, rebase it on top of latest `master` to get maintainers attention -- Consider adding yourself to [CODEOWNERS](CODEOWNERS) to indicate your availability for fixing related issues and reviewing related PRs +- Maintainers will rely on your insights and approval when making a final decision to approve and merge a PR +- Consider adding yourself to [CODEOWNERS](CODEOWNERS) to indicate your availability for reviewing related PRs +- Using AI to generate PRs is permitted. However, you must (1) explicitly disclose how AI was used and (2) conduct a thorough manual review before publishing the PR. Note that trivial tab autocompletions do not require disclosure. # Pull requests (for maintainers) @@ -55,11 +31,6 @@ After submitting your PR: - When merging a PR, make sure you have a good understanding of the changes - Be mindful of maintenance: most of the work going into a feature happens after the PR is merged. If the PR author is not committed to contribute long-term, someone else needs to take responsibility (you) -Maintainers reserve the right to decline review or close pull requests for any reason, particularly under any of the following conditions: -- The proposed change is already mentioned in the roadmap or an existing issue, and it has been assigned to someone. -- The pull request duplicates an existing one. -- The contributor fails to adhere to this contributing guide. - # Coding guidelines - Avoid adding third-party dependencies, extra files, extra headers, etc. diff --git a/README.md b/README.md index 9641db6..7e2bdbe 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # llama.cpp -> Sync with upstream `ggml-org/llama.cpp` tag `b7751` +> Sync with upstream `ggml-org/llama.cpp` tag `b7516` ## Build Docker Image ```bash -docker buildx build --build-context hyhal=/opt/hyhal -t enginex-hygon/hygon-llama.cpp:b7751 . +docker buildx build --build-context hyhal=/opt/hyhal -t enginex-hygon/hygon-llama.cpp:b7516 . ``` ![llama](https://user-images.githubusercontent.com/1991296/230134379-7181e485-c521-4d23-a0d6-f7b3b61ba524.png) @@ -208,7 +208,6 @@ Instructions for adding support for new models: [HOWTO-add-model.md](docs/develo *(to have a project listed here, it should clearly state that it depends on `llama.cpp`)* - [AI Sublime Text plugin](https://github.com/yaroslavyaroslav/OpenAI-sublime-text) (MIT) -- [BonzAI App](https://apps.apple.com/us/app/bonzai-your-local-ai-agent/id6752847988) (proprietary) - [cztomsik/ava](https://github.com/cztomsik/ava) (MIT) - [Dot](https://github.com/alexpinel/Dot) (GPL) - [eva](https://github.com/ylsdamxssjxxdd/eva) (MIT) @@ -491,6 +490,21 @@ To learn more about model quantization, [read this documentation](tools/quantize +## [`llama-run`](tools/run) + +#### A comprehensive example for running `llama.cpp` models. Useful for inferencing. Used with RamaLama [^3]. + +-
+ Run a model with a specific prompt (by default it's pulled from Ollama registry) + + ```bash + llama-run granite-code + ``` + +
+ +[^3]: [RamaLama](https://github.com/containers/ramalama) + ## [`llama-simple`](examples/simple) #### A minimal example for implementing apps with `llama.cpp`. Useful for developers. @@ -594,5 +608,7 @@ $ echo "source ~/.llama-completion.bash" >> ~/.bashrc - [stb-image](https://github.com/nothings/stb) - Single-header image format decoder, used by multimodal subsystem - Public domain - [nlohmann/json](https://github.com/nlohmann/json) - Single-header JSON library, used by various tools/examples - MIT License - [minja](https://github.com/google/minja) - Minimal Jinja parser in C++, used by various tools/examples - MIT License +- [linenoise.cpp](./tools/run/linenoise.cpp/linenoise.cpp) - C++ library that provides readline-like line editing capabilities, used by `llama-run` - BSD 2-Clause License +- [curl](https://curl.se/) - Client-side URL transfer library, used by various tools/examples - [CURL License](https://curl.se/docs/copyright.html) - [miniaudio.h](https://github.com/mackron/miniaudio) - Single-header audio format decoder, used by multimodal subsystem - Public domain - [subprocess.h](https://github.com/sheredom/subprocess.h) - Single-header process launching solution for C and C++ - Public domain diff --git a/SECURITY.md b/SECURITY.md index 9a93732..ae496f4 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,52 +1,12 @@ # Security Policy - - [**Reporting a vulnerability**](#reporting-a-vulnerability) - - [**Requirements**](#requirements) - - [**Covered Topics**](#covered-topics) - [**Using llama.cpp securely**](#using-llamacpp-securely) - [Untrusted models](#untrusted-models) - [Untrusted inputs](#untrusted-inputs) - [Data privacy](#data-privacy) - [Untrusted environments or networks](#untrusted-environments-or-networks) - [Multi-Tenant environments](#multi-tenant-environments) - -## Reporting a vulnerability - -If you have discovered a security vulnerability in this project that falls inside the [covered topics](#covered-topics), please report it privately. **Do not disclose it as a public issue.** This gives us time to work with you to fix the issue before public exposure, reducing the chance that the exploit will be used before a patch is released. - -Please disclose it as a private [security advisory](https://github.com/ggml-org/llama.cpp/security/advisories/new). - -A team of volunteers on a reasonable-effort basis maintains this project. As such, please give us at least 90 days to work on a fix before public exposure. - -> [!IMPORTANT] -> For collaborators: if you are interested in helping out with reviewing privting security disclosures, please see: https://github.com/ggml-org/llama.cpp/discussions/18080 - -## Requirements - -Before submitting your report, ensure you meet the following requirements: - -- You have read this policy and fully understand it. -- AI is only permitted in an assistive capacity as stated in [AGENTS.md](AGENTS.md). We do not accept reports that are written exclusively by AI. -- Your report must include a working Proof-of-Concept in the form of a script and/or attached files. - -Maintainers reserve the right to close the report if these requirements are not fulfilled. - -## Covered Topics - -Only vulnerabilities that fall within these parts of the project are considered valid. For problems falling outside of this list, please report them as issues. - -- `src/**/*` -- `ggml/**/*` -- `gguf-py/**/*` -- `tools/server/*`, **excluding** the following topics: - - Web UI - - Features marked as experimental - - Features not recommended for use in untrusted environments (e.g., router, MCP) - - Bugs that can lead to Denial-of-Service attack - -Note that none of the topics under [Using llama.cpp securely](#using-llamacpp-securely) are considered vulnerabilities in LLaMA C++. - -For vulnerabilities that fall within the `vendor` directory, please report them directly to the third-party project. + - [**Reporting a vulnerability**](#reporting-a-vulnerability) ## Using llama.cpp securely @@ -95,3 +55,19 @@ If you intend to run multiple models in parallel with shared memory, it is your 3. Model Sharing: In a multitenant model sharing design, tenants and users must understand the security risks of running code provided by others. Since there are no reliable methods to detect malicious models, sandboxing the model execution is the recommended approach to mitigate the risk. 4. Hardware Attacks: GPUs or TPUs can also be attacked. [Researches](https://scholar.google.com/scholar?q=gpu+side+channel) has shown that side channel attacks on GPUs are possible, which can make data leak from other models or processes running on the same system at the same time. + +## Reporting a vulnerability + +Beware that none of the topics under [Using llama.cpp securely](#using-llamacpp-securely) are considered vulnerabilities of LLaMA C++. + + +However, If you have discovered a security vulnerability in this project, please report it privately. **Do not disclose it as a public issue.** This gives us time to work with you to fix the issue before public exposure, reducing the chance that the exploit will be used before a patch is released. + +Please disclose it as a private [security advisory](https://github.com/ggml-org/llama.cpp/security/advisories/new). + +Please note that using AI to identify vulnerabilities and generate reports is permitted. However, you must (1) explicitly disclose how AI was used and (2) conduct a thorough manual review before submitting the report. + +A team of volunteers on a reasonable-effort basis maintains this project. As such, please give us at least 90 days to work on a fix before public exposure. + +> [!IMPORTANT] +> For collaborators: if you are interested in helping out with reviewing privting security disclosures, please see: https://github.com/ggml-org/llama.cpp/discussions/18080 diff --git a/build-xcframework.sh b/build-xcframework.sh index 0eec871..81280f7 100755 --- a/build-xcframework.sh +++ b/build-xcframework.sh @@ -414,7 +414,7 @@ cmake -B build-ios-sim -G Xcode \ -DCMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS=iphonesimulator \ -DCMAKE_C_FLAGS="${COMMON_C_FLAGS}" \ -DCMAKE_CXX_FLAGS="${COMMON_CXX_FLAGS}" \ - -DLLAMA_OPENSSL=OFF \ + -DLLAMA_CURL=OFF \ -S . cmake --build build-ios-sim --config Release -- -quiet @@ -428,7 +428,7 @@ cmake -B build-ios-device -G Xcode \ -DCMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS=iphoneos \ -DCMAKE_C_FLAGS="${COMMON_C_FLAGS}" \ -DCMAKE_CXX_FLAGS="${COMMON_CXX_FLAGS}" \ - -DLLAMA_OPENSSL=OFF \ + -DLLAMA_CURL=OFF \ -S . cmake --build build-ios-device --config Release -- -quiet @@ -439,7 +439,7 @@ cmake -B build-macos -G Xcode \ -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" \ -DCMAKE_C_FLAGS="${COMMON_C_FLAGS}" \ -DCMAKE_CXX_FLAGS="${COMMON_CXX_FLAGS}" \ - -DLLAMA_OPENSSL=OFF \ + -DLLAMA_CURL=OFF \ -S . cmake --build build-macos --config Release -- -quiet @@ -453,7 +453,7 @@ cmake -B build-visionos -G Xcode \ -DCMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS=xros \ -DCMAKE_C_FLAGS="-D_XOPEN_SOURCE=700 ${COMMON_C_FLAGS}" \ -DCMAKE_CXX_FLAGS="-D_XOPEN_SOURCE=700 ${COMMON_CXX_FLAGS}" \ - -DLLAMA_OPENSSL=OFF \ + -DLLAMA_CURL=OFF \ -DLLAMA_HTTPLIB=OFF \ -DLLAMA_BUILD_SERVER=OFF \ -S . @@ -469,7 +469,7 @@ cmake -B build-visionos-sim -G Xcode \ -DCMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS=xrsimulator \ -DCMAKE_C_FLAGS="-D_XOPEN_SOURCE=700 ${COMMON_C_FLAGS}" \ -DCMAKE_CXX_FLAGS="-D_XOPEN_SOURCE=700 ${COMMON_CXX_FLAGS}" \ - -DLLAMA_OPENSSL=OFF \ + -DLLAMA_CURL=OFF \ -DLLAMA_HTTPLIB=OFF \ -DLLAMA_BUILD_SERVER=OFF \ -S . @@ -487,7 +487,7 @@ cmake -B build-tvos-sim -G Xcode \ -DCMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS=appletvsimulator \ -DCMAKE_C_FLAGS="${COMMON_C_FLAGS}" \ -DCMAKE_CXX_FLAGS="${COMMON_CXX_FLAGS}" \ - -DLLAMA_OPENSSL=OFF \ + -DLLAMA_CURL=OFF \ -S . cmake --build build-tvos-sim --config Release -- -quiet @@ -502,7 +502,7 @@ cmake -B build-tvos-device -G Xcode \ -DCMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS=appletvos \ -DCMAKE_C_FLAGS="${COMMON_C_FLAGS}" \ -DCMAKE_CXX_FLAGS="${COMMON_CXX_FLAGS}" \ - -DLLAMA_OPENSSL=OFF \ + -DLLAMA_CURL=OFF \ -S . cmake --build build-tvos-device --config Release -- -quiet diff --git a/ci/run.sh b/ci/run.sh index 6ca6ea5..0a4a0e4 100755 --- a/ci/run.sh +++ b/ci/run.sh @@ -45,15 +45,14 @@ sd=`dirname $0` cd $sd/../ SRC=`pwd` -CMAKE_EXTRA="-DLLAMA_FATAL_WARNINGS=${LLAMA_FATAL_WARNINGS:-ON} -DLLAMA_OPENSSL=OFF -DGGML_SCHED_NO_REALLOC=ON" +CMAKE_EXTRA="-DLLAMA_FATAL_WARNINGS=${LLAMA_FATAL_WARNINGS:-ON} -DLLAMA_CURL=ON -DGGML_SCHED_NO_REALLOC=ON" if [ ! -z ${GG_BUILD_METAL} ]; then CMAKE_EXTRA="${CMAKE_EXTRA} -DGGML_METAL=ON" fi if [ ! -z ${GG_BUILD_CUDA} ]; then - # TODO: Remove GGML_CUDA_CUB_3DOT2 flag once CCCL 3.2 is bundled within CTK and that CTK version is used in this project - CMAKE_EXTRA="${CMAKE_EXTRA} -DGGML_CUDA=ON -DGGML_CUDA_CUB_3DOT2=ON" + CMAKE_EXTRA="${CMAKE_EXTRA} -DGGML_CUDA=ON" if command -v nvidia-smi >/dev/null 2>&1; then CUDA_ARCH=$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader,nounits 2>/dev/null | head -1 | tr -d '.') @@ -105,20 +104,7 @@ if [ ! -z ${GG_BUILD_VULKAN} ]; then fi if [ ! -z ${GG_BUILD_WEBGPU} ]; then - CMAKE_EXTRA="${CMAKE_EXTRA} -DGGML_WEBGPU=1 -DGGML_METAL=OFF -DGGML_BLAS=OFF" - - if [ ! -z "${GG_BUILD_WEBGPU_DAWN_PREFIX}" ]; then - if [ -z "${CMAKE_PREFIX_PATH}" ]; then - export CMAKE_PREFIX_PATH="${GG_BUILD_WEBGPU_DAWN_PREFIX}" - else - export CMAKE_PREFIX_PATH="${GG_BUILD_WEBGPU_DAWN_PREFIX}:${CMAKE_PREFIX_PATH}" - fi - fi - - # For some systems, Dawn_DIR needs to be set explicitly, e.g., the lib64 path - if [ ! -z "${GG_BUILD_WEBGPU_DAWN_DIR}" ]; then - CMAKE_EXTRA="${CMAKE_EXTRA} -DDawn_DIR=${GG_BUILD_WEBGPU_DAWN_DIR}" - fi + CMAKE_EXTRA="${CMAKE_EXTRA} -DGGML_WEBGPU=1" fi if [ ! -z ${GG_BUILD_MUSA} ]; then @@ -297,8 +283,7 @@ function gg_sum_test_scripts { } function gg_get_model { - #local gguf_0="$MNT/models/qwen3/0.6B/ggml-model-f16.gguf" - local gguf_0="$MNT/models/qwen3/0.6B/ggml-model-q4_0.gguf" + local gguf_0="$MNT/models/qwen3/0.6B/ggml-model-f16.gguf" if [[ -s $gguf_0 ]]; then echo -n "$gguf_0" else diff --git a/cmake/download-models.cmake b/cmake/download-models.cmake deleted file mode 100644 index de25290..0000000 --- a/cmake/download-models.cmake +++ /dev/null @@ -1,21 +0,0 @@ -get_filename_component(DEST_DIR "${DEST}" DIRECTORY) -file(MAKE_DIRECTORY "${DEST_DIR}") - -if(NOT EXISTS "${DEST}") - message(STATUS "Downloading ${NAME} from ggml-org/models...") -endif() - -file(DOWNLOAD - "https://huggingface.co/ggml-org/models/resolve/main/${NAME}?download=true" - "${DEST}" - TLS_VERIFY ON - EXPECTED_HASH ${HASH} - STATUS status -) - -list(GET status 0 code) - -if(NOT code EQUAL 0) - list(GET status 1 msg) - message(FATAL_ERROR "Failed to download ${NAME}: ${msg}") -endif() diff --git a/cmake/license.cmake b/cmake/license.cmake deleted file mode 100644 index de06660..0000000 --- a/cmake/license.cmake +++ /dev/null @@ -1,40 +0,0 @@ -define_property(GLOBAL PROPERTY LICENSE_TEXT - BRIEF_DOCS "Embedded licenses" - FULL_DOCS "Global string containing all aggregated licenses" -) - -function(license_add_file NAME FILE) - if(NOT IS_ABSOLUTE "${FILE}") - set(FILE "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}") - endif() - if(EXISTS "${FILE}") - set(TITLE "License for ${NAME}") - string(REGEX REPLACE "." "=" UNDERLINE "${TITLE}") - file(READ "${FILE}" TEXT) - get_property(TMP GLOBAL PROPERTY LICENSE_TEXT) - string(APPEND TMP "R\"=L=(${TITLE}\n${UNDERLINE}\n\n${TEXT})=L=\",\n") - set_property(GLOBAL PROPERTY LICENSE_TEXT "${TMP}") - else() - message(WARNING "License file '${FILE}' not found") - endif() -endfunction() - -function(license_generate TARGET_NAME) - message(STATUS "Generating embedded license file for target: ${TARGET_NAME}") - get_property(TEXT GLOBAL PROPERTY LICENSE_TEXT) - - set(CPP_CONTENT "// Generated by CMake\n\n") - string(APPEND CPP_CONTENT "const char* LICENSES[] = {\n") - string(APPEND CPP_CONTENT "${TEXT}") - string(APPEND CPP_CONTENT "nullptr\n") - string(APPEND CPP_CONTENT "};\n") - - set(CPP_FILE "${CMAKE_BINARY_DIR}/license.cpp") - file(WRITE "${CPP_FILE}" "${CPP_CONTENT}") - - if(TARGET ${TARGET_NAME}) - target_sources(${TARGET_NAME} PRIVATE "${CPP_FILE}") - else() - message(FATAL_ERROR "Target '${TARGET_NAME}' does not exist") - endif() -endfunction() diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 723973e..f7b9915 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -60,8 +60,6 @@ add_library(${TARGET} STATIC common.h console.cpp console.h - debug.cpp - debug.h download.cpp download.h http.h @@ -97,7 +95,17 @@ endif() # TODO: use list(APPEND LLAMA_COMMON_EXTRA_LIBS ...) set(LLAMA_COMMON_EXTRA_LIBS build_info) -if (LLAMA_HTTPLIB) +if (LLAMA_CURL) + # Use curl to download model url + find_package(CURL) + if (NOT CURL_FOUND) + message(FATAL_ERROR "Could NOT find CURL. Hint: to disable this feature, set -DLLAMA_CURL=OFF") + endif() + target_compile_definitions(${TARGET} PUBLIC LLAMA_USE_CURL) + include_directories(${CURL_INCLUDE_DIRS}) + set(LLAMA_COMMON_EXTRA_LIBS ${LLAMA_COMMON_EXTRA_LIBS} ${CURL_LIBRARIES}) +elseif (LLAMA_HTTPLIB) + # otherwise, use cpp-httplib target_compile_definitions(${TARGET} PUBLIC LLAMA_USE_HTTPLIB) set(LLAMA_COMMON_EXTRA_LIBS ${LLAMA_COMMON_EXTRA_LIBS} cpp-httplib) endif() @@ -147,3 +155,27 @@ if (LLAMA_LLGUIDANCE) endif () target_link_libraries(${TARGET} PRIVATE ${LLAMA_COMMON_EXTRA_LIBS} PUBLIC llama Threads::Threads) + + +# +# copy the license files +# + +# Check if running in GitHub Actions +if (DEFINED ENV{GITHUB_ACTIONS} AND "$ENV{GITHUB_ACTIONS}" STREQUAL "true") + message(STATUS "Running inside GitHub Actions - copying license files") + + # Copy all files from licenses/ to build/bin/ + file(GLOB LICENSE_FILES "${CMAKE_SOURCE_DIR}/licenses/*") + foreach(LICENSE_FILE ${LICENSE_FILES}) + get_filename_component(FILENAME ${LICENSE_FILE} NAME) + add_custom_command( + POST_BUILD + TARGET ${TARGET} + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${LICENSE_FILE}" + "$/${FILENAME}" + COMMENT "Copying ${FILENAME} to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") + message(STATUS "Copying ${LICENSE_FILE} to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${FILENAME}") + endforeach() +endif() diff --git a/common/arg.cpp b/common/arg.cpp index 163c9b7..1302065 100644 --- a/common/arg.cpp +++ b/common/arg.cpp @@ -2,11 +2,10 @@ #include "chat.h" #include "common.h" -#include "download.h" #include "json-schema-to-grammar.h" #include "log.h" #include "sampling.h" -#include "preset.h" +#include "download.h" // fix problem with std::min and std::max #if defined(_WIN32) @@ -48,8 +47,6 @@ #define LLAMA_MAX_URL_LENGTH 2084 // Maximum URL Length in Chrome: 2083 -extern const char * LICENSES[]; - using json = nlohmann::ordered_json; using namespace common_arg_utils; @@ -271,55 +268,6 @@ static void parse_tensor_buffer_overrides(const std::string & value, std::vector } } -static std::string clean_file_name(const std::string & fname) { - std::string clean_fname = fname; - string_replace_all(clean_fname, "\\", "_"); - string_replace_all(clean_fname, "/", "_"); - return clean_fname; -} - -static bool common_params_handle_remote_preset(common_params & params, llama_example ex) { - GGML_ASSERT(!params.model.hf_repo.empty()); - - // the returned hf_repo is without tag - auto [hf_repo, hf_tag] = common_download_split_repo_tag(params.model.hf_repo); - - // "latest" tag (default if not specified) is translated to "default" preset - if (hf_tag == "latest") { - hf_tag = "default"; - } - - const bool offline = params.offline; - std::string model_endpoint = get_model_endpoint(); - auto preset_url = model_endpoint + hf_repo + "/resolve/main/preset.ini"; - - // prepare local path for caching - auto preset_fname = clean_file_name(hf_repo + "_preset.ini"); - auto preset_path = fs_get_cache_file(preset_fname); - const int status = common_download_file_single(preset_url, preset_path, params.hf_token, offline); - const bool has_preset = status >= 200 && status < 400; - - // remote preset is optional, so we don't error out if not found - if (has_preset) { - LOG_INF("applying remote preset from %s\n", preset_url.c_str()); - common_preset_context ctx(ex, /* only_remote_allowed */ true); - common_preset global; - auto remote_presets = ctx.load_from_ini(preset_path, global); - remote_presets = ctx.cascade(global, remote_presets); - if (remote_presets.find(hf_tag) != remote_presets.end()) { - common_preset preset = remote_presets.at(hf_tag); - LOG_INF("\n%s", preset.to_ini().c_str()); // to_ini already added trailing newline - preset.apply_to_params(params); - } else { - throw std::runtime_error("Remote preset.ini does not contain [" + std::string(hf_tag) + "] section"); - } - } else { - LOG_INF("%s", "no remote preset found, skipping\n"); - } - - return has_preset; -} - struct handle_model_result { bool found_mmproj = false; common_params_model mmproj; @@ -341,7 +289,7 @@ static handle_model_result common_params_handle_model( if (model.path.empty()) { auto auto_detected = common_get_hf_file(model.hf_repo, bearer_token, offline); if (auto_detected.repo.empty() || auto_detected.ggufFile.empty()) { - exit(1); // error message already printed + exit(1); // built without CURL, error message already printed } model.name = model.hf_repo; // repo name with tag model.hf_repo = auto_detected.repo; // repo name without tag @@ -361,7 +309,9 @@ static handle_model_result common_params_handle_model( // make sure model path is present (for caching purposes) if (model.path.empty()) { // this is to avoid different repo having same file name, or same file name in different subdirs - std::string filename = clean_file_name(model.hf_repo + "_" + model.hf_file); + std::string filename = model.hf_repo + "_" + model.hf_file; + // to make sure we don't have any slashes in the filename + string_replace_all(filename, "/", "_"); model.path = fs_get_cache_file(filename); } @@ -475,87 +425,61 @@ static bool common_params_parse_ex(int argc, char ** argv, common_params_context } }; - auto parse_cli_args = [&]() { - std::set seen_args; + std::set seen_args; - for (int i = 1; i < argc; i++) { - const std::string arg_prefix = "--"; + for (int i = 1; i < argc; i++) { + const std::string arg_prefix = "--"; - std::string arg = argv[i]; - if (arg.compare(0, arg_prefix.size(), arg_prefix) == 0) { - std::replace(arg.begin(), arg.end(), '_', '-'); - } - if (arg_to_options.find(arg) == arg_to_options.end()) { - throw std::invalid_argument(string_format("error: invalid argument: %s", arg.c_str())); - } - if (!seen_args.insert(arg).second) { - LOG_WRN("DEPRECATED: argument '%s' specified multiple times, use comma-separated values instead (only last value will be used)\n", arg.c_str()); - } - auto & tmp = arg_to_options[arg]; - auto opt = *tmp.first; - bool is_positive = tmp.second; - if (opt.has_value_from_env()) { - fprintf(stderr, "warn: %s environment variable is set, but will be overwritten by command line argument %s\n", opt.env, arg.c_str()); - } - try { - if (opt.handler_void) { - opt.handler_void(params); - continue; - } - if (opt.handler_bool) { - opt.handler_bool(params, is_positive); - continue; - } - - // arg with single value - check_arg(i); - std::string val = argv[++i]; - if (opt.handler_int) { - opt.handler_int(params, std::stoi(val)); - continue; - } - if (opt.handler_string) { - opt.handler_string(params, val); - continue; - } - - // arg with 2 values - check_arg(i); - std::string val2 = argv[++i]; - if (opt.handler_str_str) { - opt.handler_str_str(params, val, val2); - continue; - } - } catch (std::exception & e) { - throw std::invalid_argument(string_format( - "error while handling argument \"%s\": %s\n\n" - "usage:\n%s\n\nto show complete usage, run with -h", - arg.c_str(), e.what(), opt.to_string().c_str())); - } + std::string arg = argv[i]; + if (arg.compare(0, arg_prefix.size(), arg_prefix) == 0) { + std::replace(arg.begin(), arg.end(), '_', '-'); } - }; - - // parse the first time to get -hf option (used for remote preset) - parse_cli_args(); - - // maybe handle remote preset - if (!params.model.hf_repo.empty()) { - std::string cli_hf_repo = params.model.hf_repo; - bool has_preset = common_params_handle_remote_preset(params, ctx_arg.ex); - - // special case: if hf_repo explicitly set by preset, we need to preserve it (ignore CLI value) - // this is useful when we have one HF repo pointing to other HF repos (one model - multiple GGUFs) - std::string preset_hf_repo = params.model.hf_repo; - bool preset_has_hf_repo = preset_hf_repo != cli_hf_repo; - - if (has_preset) { - // re-parse CLI args to override preset values - parse_cli_args(); + if (arg_to_options.find(arg) == arg_to_options.end()) { + throw std::invalid_argument(string_format("error: invalid argument: %s", arg.c_str())); } + if (!seen_args.insert(arg).second) { + LOG_WRN("DEPRECATED: argument '%s' specified multiple times, use comma-separated values instead (only last value will be used)\n", arg.c_str()); + } + auto & tmp = arg_to_options[arg]; + auto opt = *tmp.first; + bool is_positive = tmp.second; + if (opt.has_value_from_env()) { + fprintf(stderr, "warn: %s environment variable is set, but will be overwritten by command line argument %s\n", opt.env, arg.c_str()); + } + try { + if (opt.handler_void) { + opt.handler_void(params); + continue; + } + if (opt.handler_bool) { + opt.handler_bool(params, is_positive); + continue; + } - // preserve hf_repo from preset if needed - if (preset_has_hf_repo) { - params.model.hf_repo = preset_hf_repo; + // arg with single value + check_arg(i); + std::string val = argv[++i]; + if (opt.handler_int) { + opt.handler_int(params, std::stoi(val)); + continue; + } + if (opt.handler_string) { + opt.handler_string(params, val); + continue; + } + + // arg with 2 values + check_arg(i); + std::string val2 = argv[++i]; + if (opt.handler_str_str) { + opt.handler_str_str(params, val, val2); + continue; + } + } catch (std::exception & e) { + throw std::invalid_argument(string_format( + "error while handling argument \"%s\": %s\n\n" + "usage:\n%s\n\nto show complete usage, run with -h", + arg.c_str(), e.what(), opt.to_string().c_str())); } } @@ -755,6 +679,7 @@ static void common_params_print_completion(common_params_context & ctx_arg) { "llama-quantize", "llama-qwen2vl-cli", "llama-retrieval", + "llama-run", "llama-save-load-state", "llama-server", "llama-simple", @@ -929,54 +854,6 @@ bool common_arg_utils::is_autoy(const std::string & value) { return value == "auto" || value == "-1"; } -// Simple CSV parser that handles quoted fields and escaped quotes -// example: -// input: value1,"value, with, commas","value with ""escaped"" quotes",value4 -// output: [value1] [value, with, commas] [value with "escaped" quotes] [value4] -static std::vector parse_csv_row(const std::string& input) { - std::vector fields; - std::string field; - bool in_quotes = false; - - for (size_t i = 0; i < input.length(); ++i) { - char ch = input[i]; - - if (ch == '"') { - if (!in_quotes) { - // start of quoted field (only valid if at beginning of field) - if (!field.empty()) { - // quote appeared in middle of unquoted field, treat as literal - field += '"'; - } else { - in_quotes = true; // start - } - } else { - if (i + 1 < input.length() && input[i + 1] == '"') { - // escaped quote: "" - field += '"'; - ++i; // skip the next quote - } else { - in_quotes = false; // end - } - } - } else if (ch == ',') { - if (in_quotes) { - field += ','; - } else { - fields.push_back(std::move(field)); - field.clear(); - } - } else { - field += ch; - } - } - - // Add the last field - fields.push_back(std::move(field)); - - return fields; -} - common_params_context common_params_parser_init(common_params & params, llama_example ex, void(*print_usage)(int, char **)) { // per-example default params // we define here to make sure it's included in llama-gen-docs @@ -1041,16 +918,6 @@ common_params_context common_params_parser_init(common_params & params, llama_ex exit(0); } )); - add_opt(common_arg( - {"--license"}, - "show source code license and dependencies", - [](common_params &) { - for (int i = 0; LICENSES[i]; ++i) { - printf("%s\n", LICENSES[i]); - } - exit(0); - } - )); add_opt(common_arg( {"-cl", "--cache-list"}, "show list of models in cache", @@ -1295,7 +1162,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex [](common_params & params) { params.kv_unified = true; } - ).set_env("LLAMA_ARG_KV_UNIFIED").set_examples({LLAMA_EXAMPLE_SERVER, LLAMA_EXAMPLE_PERPLEXITY, LLAMA_EXAMPLE_BATCHED})); + ).set_env("LLAMA_ARG_KV_UNIFIED").set_examples({LLAMA_EXAMPLE_SERVER, LLAMA_EXAMPLE_PERPLEXITY})); add_opt(common_arg( {"--context-shift"}, {"--no-context-shift"}, @@ -1383,7 +1250,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex {"--in-file"}, "FNAME", "an input file (use comma-separated values to specify multiple files)", [](common_params & params, const std::string & value) { - for (const auto & item : parse_csv_row(value)) { + for (const auto & item : string_split(value, ',')) { std::ifstream file(item); if (!file) { throw std::runtime_error(string_format("error: failed to open file '%s'\n", item.c_str())); @@ -1530,7 +1397,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex [](common_params & params, bool value) { params.warmup = value; } - ).set_examples({LLAMA_EXAMPLE_COMPLETION, LLAMA_EXAMPLE_CLI, LLAMA_EXAMPLE_SERVER, LLAMA_EXAMPLE_MTMD, LLAMA_EXAMPLE_EMBEDDING, LLAMA_EXAMPLE_RETRIEVAL, LLAMA_EXAMPLE_PERPLEXITY, LLAMA_EXAMPLE_DEBUG})); + ).set_examples({LLAMA_EXAMPLE_COMPLETION, LLAMA_EXAMPLE_CLI, LLAMA_EXAMPLE_SERVER, LLAMA_EXAMPLE_MTMD, LLAMA_EXAMPLE_EMBEDDING, LLAMA_EXAMPLE_RETRIEVAL, LLAMA_EXAMPLE_PERPLEXITY})); add_opt(common_arg( {"--spm-infill"}, string_format( @@ -1729,26 +1596,6 @@ common_params_context common_params_parser_init(common_params & params, llama_ex } } ).set_sparam()); - add_opt(common_arg( - {"--adaptive-target"}, "N", - string_format("adaptive-p: select tokens near this probability (valid range 0.0 " - "to 1.0; negative = disabled) (default: %.2f)\n" - "[(more info)](https://github.com/ggml-org/llama.cpp/pull/17927)", - (double)params.sampling.adaptive_target), - [](common_params & params, const std::string & value) { - params.sampling.adaptive_target = std::stof(value); - } - ).set_sparam()); - add_opt(common_arg( - {"--adaptive-decay"}, "N", - string_format("adaptive-p: decay rate for target adaptation over time. lower values " - "are more reactive, higher values are more stable.\n" - "(valid range 0.0 to 0.99) (default: %.2f)", - (double)params.sampling.adaptive_decay), - [](common_params & params, const std::string & value) { - params.sampling.adaptive_decay = std::stof(value); - } - ).set_sparam()); add_opt(common_arg( {"--dynatemp-range"}, "N", string_format("dynamic temperature range (default: %.1f, 0.0 = disabled)", (double)params.sampling.dynatemp_range), @@ -1848,13 +1695,6 @@ common_params_context common_params_parser_init(common_params & params, llama_ex params.sampling.grammar = json_schema_to_grammar(json::parse(schema)); } ).set_sparam()); - add_opt(common_arg( - {"-bs", "--backend-sampling"}, - "enable backend sampling (experimental) (default: disabled)", - [](common_params & params) { - params.sampling.backend_sampling = true; - } - ).set_sparam().set_env("LLAMA_ARG_BACKEND_SAMPLING")); add_opt(common_arg( {"--pooling"}, "{none,mean,cls,last,rank}", "pooling type for embeddings, use model default if unspecified", @@ -1866,7 +1706,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex else if (value == "rank") { params.pooling_type = LLAMA_POOLING_TYPE_RANK; } else { throw std::invalid_argument("invalid value"); } } - ).set_examples({LLAMA_EXAMPLE_EMBEDDING, LLAMA_EXAMPLE_RETRIEVAL, LLAMA_EXAMPLE_SERVER, LLAMA_EXAMPLE_DEBUG}).set_env("LLAMA_ARG_POOLING")); + ).set_examples({LLAMA_EXAMPLE_EMBEDDING, LLAMA_EXAMPLE_RETRIEVAL, LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_POOLING")); add_opt(common_arg( {"--attention"}, "{causal,non-causal}", "attention type for embeddings, use model default if unspecified", @@ -2155,7 +1995,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex {"--image", "--audio"}, "FILE", "path to an image or audio file. use with multimodal models, use comma-separated values for multiple files\n", [](common_params & params, const std::string & value) { - for (const auto & item : parse_csv_row(value)) { + for (const auto & item : string_split(value, ',')) { params.image.emplace_back(item); } } @@ -2177,7 +2017,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex if (llama_supports_rpc()) { add_opt(common_arg( {"--rpc"}, "SERVERS", - "comma separated list of RPC servers (host:port)", + "comma separated list of RPC servers", [](common_params & params, const std::string & value) { add_rpc_devices(value); GGML_UNUSED(params); @@ -2194,22 +2034,11 @@ common_params_context common_params_parser_init(common_params & params, llama_ex add_opt(common_arg( {"--mmap"}, {"--no-mmap"}, - string_format("whether to memory-map model. Explicitly enabling mmap disables direct-io. (if mmap disabled, slower load but may reduce pageouts if not using mlock) (default: %s)", params.use_mmap ? "enabled" : "disabled"), + string_format("whether to memory-map model (if disabled, slower load but may reduce pageouts if not using mlock) (default: %s)", params.use_mmap ? "enabled" : "disabled"), [](common_params & params, bool value) { params.use_mmap = value; - if (value) { - params.use_direct_io = false; // disable direct io when mmap is explicitly enabled - } } ).set_env("LLAMA_ARG_MMAP")); - add_opt(common_arg( - {"-dio", "--direct-io"}, - {"-ndio", "--no-direct-io"}, - string_format("use DirectIO if available. Takes precedence over --mmap (default: %s)", params.use_direct_io ? "enabled" : "disabled"), - [](common_params & params, bool value) { - params.use_direct_io = value; - } - ).set_env("LLAMA_ARG_DIO")); add_opt(common_arg( {"--numa"}, "TYPE", "attempt optimizations that help on some NUMA systems\n" @@ -2258,7 +2087,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex "override tensor buffer type", [](common_params & params, const std::string & value) { parse_tensor_buffer_overrides(value, params.tensor_buft_overrides); } - ).set_env("LLAMA_ARG_OVERRIDE_TENSOR")); + )); add_opt(common_arg( {"-otd", "--override-tensor-draft"}, "=,...", "override tensor buffer type for draft model", [](common_params & params, const std::string & value) { @@ -2308,18 +2137,11 @@ common_params_context common_params_parser_init(common_params & params, llama_ex } } ).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_SERVER, LLAMA_EXAMPLE_CLI}).set_env("LLAMA_ARG_N_CPU_MOE_DRAFT")); - GGML_ASSERT(params.n_gpu_layers < 0); // string_format would need to be extended for a default >= 0 add_opt(common_arg( {"-ngl", "--gpu-layers", "--n-gpu-layers"}, "N", - string_format("max. number of layers to store in VRAM, either an exact number, 'auto', or 'all' (default: %s)", params.n_gpu_layers == -1 ? "auto" : "all"), - [](common_params & params, const std::string & value) { - if (value == "auto") { - params.n_gpu_layers = -1; - } else if (value == "all") { - params.n_gpu_layers = -2; - } else { - params.n_gpu_layers = std::stoi(value); - } + string_format("max. number of layers to store in VRAM (default: %d)", params.n_gpu_layers), + [](common_params & params, int value) { + params.n_gpu_layers = value; if (!llama_supports_gpu_offload()) { fprintf(stderr, "warning: no usable GPU found, --gpu-layers option will be ignored\n"); fprintf(stderr, "warning: one possible reason is that llama.cpp was compiled without GPU support\n"); @@ -2361,7 +2183,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex std::vector split_arg{ it, {} }; if (split_arg.size() >= llama_max_devices()) { throw std::invalid_argument( - string_format("got %zu input configs, but system only has %zu devices", split_arg.size(), llama_max_devices()) + string_format("got %d input configs, but system only has %d devices", (int)split_arg.size(), (int)llama_max_devices()) ); } for (size_t i = 0; i < llama_max_devices(); ++i) { @@ -2401,28 +2223,10 @@ common_params_context common_params_parser_init(common_params & params, llama_ex } ).set_env("LLAMA_ARG_FIT")); add_opt(common_arg( - { "-fitt", "--fit-target" }, "MiB0,MiB1,MiB2,...", - string_format("target margin per device for --fit, comma-separated list of values, " - "single value is broadcast across all devices, default: %zu", params.fit_params_target[0]/(1024*1024)), - [](common_params & params, const std::string & value) { - std::string arg_next = value; - - // split string by , and / - const std::regex regex{ R"([,/]+)" }; - std::sregex_token_iterator it{ arg_next.begin(), arg_next.end(), regex, -1 }; - std::vector split_arg{ it, {} }; - if (split_arg.size() >= llama_max_devices()) { - throw std::invalid_argument( - string_format("got %zu input configs, but system only has %zu devices", split_arg.size(), llama_max_devices()) - ); - } - if (split_arg.size() == 1) { - std::fill(params.fit_params_target.begin(), params.fit_params_target.end(), std::stoul(split_arg[0]) * 1024*1024); - return; - } - for (size_t i = 0; i < split_arg.size(); i++) { - params.fit_params_target[i] = std::stoul(split_arg[i]) * 1024*1024; - } + { "-fitt", "--fit-target" }, "MiB", + string_format("target margin per device for --fit option, default: %zu", params.fit_params_target/(1024*1024)), + [](common_params & params, int value) { + params.fit_params_target = value * size_t(1024*1024); } ).set_env("LLAMA_ARG_FIT_TARGET")); add_opt(common_arg( @@ -2441,12 +2245,37 @@ common_params_context common_params_parser_init(common_params & params, llama_ex )); add_opt(common_arg( {"--override-kv"}, "KEY=TYPE:VALUE,...", - "advanced option to override model metadata by key. to specify multiple overrides, either use comma-separated values.\n" + "advanced option to override model metadata by key. to specify multiple overrides, either use comma-separated or repeat this argument.\n" "types: int, float, bool, str. example: --override-kv tokenizer.ggml.add_bos_token=bool:false,tokenizer.ggml.add_eos_token=bool:false", [](common_params & params, const std::string & value) { - for (const auto & item : parse_csv_row(value)) { - if (!string_parse_kv_override(item.c_str(), params.kv_overrides)) { - throw std::runtime_error(string_format("error: Invalid type for KV override: %s\n", item.c_str())); + std::vector kv_overrides; + + std::string current; + bool escaping = false; + + for (const char c : value) { + if (escaping) { + current.push_back(c); + escaping = false; + } else if (c == '\\') { + escaping = true; + } else if (c == ',') { + kv_overrides.push_back(current); + current.clear(); + } else { + current.push_back(c); + } + } + + if (escaping) { + current.push_back('\\'); + } + + kv_overrides.push_back(current); + + for (const auto & kv_override : kv_overrides) { + if (!string_parse_kv_override(kv_override.c_str(), params.kv_overrides)) { + throw std::runtime_error(string_format("error: Invalid type for KV override: %s\n", kv_override.c_str())); } } } @@ -2463,7 +2292,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex {"--lora"}, "FNAME", "path to LoRA adapter (use comma-separated values to load multiple adapters)", [](common_params & params, const std::string & value) { - for (const auto & item : parse_csv_row(value)) { + for (const auto & item : string_split(value, ',')) { params.lora_adapters.push_back({ item, 1.0, "", "", nullptr }); } } @@ -2474,7 +2303,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex "path to LoRA adapter with user defined scaling (format: FNAME:SCALE,...)\n" "note: use comma-separated values", [](common_params & params, const std::string & value) { - for (const auto & item : parse_csv_row(value)) { + for (const auto & item : string_split(value, ',')) { auto parts = string_split(item, ':'); if (parts.size() != 2) { throw std::invalid_argument("lora-scaled format: FNAME:SCALE"); @@ -2488,7 +2317,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex {"--control-vector"}, "FNAME", "add a control vector\nnote: use comma-separated values to add multiple control vectors", [](common_params & params, const std::string & value) { - for (const auto & item : parse_csv_row(value)) { + for (const auto & item : string_split(value, ',')) { params.control_vectors.push_back({ 1.0f, item, }); } } @@ -2498,7 +2327,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex "add a control vector with user defined scaling SCALE\n" "note: use comma-separated values (format: FNAME:SCALE,...)", [](common_params & params, const std::string & value) { - for (const auto & item : parse_csv_row(value)) { + for (const auto & item : string_split(value, ',')) { auto parts = string_split(item, ':'); if (parts.size() != 2) { throw std::invalid_argument("control-vector-scaled format: FNAME:SCALE"); @@ -2596,7 +2425,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex {"--context-file"}, "FNAME", "file to load context from (use comma-separated values to specify multiple files)", [](common_params & params, const std::string & value) { - for (const auto & item : parse_csv_row(value)) { + for (const auto & item : string_split(value, ',')) { std::ifstream file(item, std::ios::binary); if (!file) { throw std::runtime_error(string_format("error: failed to open file '%s'\n", item.c_str())); @@ -2743,7 +2572,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex [](common_params & params, int value) { params.embd_normalize = value; } - ).set_examples({LLAMA_EXAMPLE_EMBEDDING, LLAMA_EXAMPLE_DEBUG})); + ).set_examples({LLAMA_EXAMPLE_EMBEDDING})); add_opt(common_arg( {"--embd-output-format"}, "FORMAT", "empty = default, \"array\" = [[],[]...], \"json\" = openai style, \"json+\" = same \"json\" + cosine similarity matrix, \"raw\" = plain whitespace-delimited output (one embedding per line)", @@ -2821,7 +2650,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex [](common_params & params) { params.embedding = true; } - ).set_examples({LLAMA_EXAMPLE_SERVER, LLAMA_EXAMPLE_DEBUG}).set_env("LLAMA_ARG_EMBEDDINGS")); + ).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_EMBEDDINGS")); add_opt(common_arg( {"--rerank", "--reranking"}, string_format("enable reranking endpoint on server (default: %s)", "disabled"), @@ -2832,13 +2661,9 @@ common_params_context common_params_parser_init(common_params & params, llama_ex ).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_RERANKING")); add_opt(common_arg( {"--api-key"}, "KEY", - "API key to use for authentication, multiple keys can be provided as a comma-separated list (default: none)", + "API key to use for authentication (default: none)", [](common_params & params, const std::string & value) { - for (const auto & key : parse_csv_row(value)) { - if (!key.empty()) { - params.api_keys.push_back(key); - } - } + params.api_keys.push_back(value); } ).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_API_KEY")); add_opt(common_arg( @@ -2852,7 +2677,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex std::string key; while (std::getline(key_file, key)) { if (!key.empty()) { - params.api_keys.push_back(key); + params.api_keys.push_back(key); } } key_file.close(); @@ -2874,7 +2699,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex ).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_SSL_CERT_FILE")); add_opt(common_arg( {"--chat-template-kwargs"}, "STRING", - "sets additional params for the json template parser, must be a valid json object string, e.g. '{\"key1\":\"value1\",\"key2\":\"value2\"}'", + string_format("sets additional params for the json template parser"), [](common_params & params, const std::string & value) { auto parsed = json::parse(value); for (const auto & item : parsed.items()) { @@ -2897,18 +2722,10 @@ common_params_context common_params_parser_init(common_params & params, llama_ex params.n_threads_http = value; } ).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_THREADS_HTTP")); - add_opt(common_arg( - {"--cache-prompt"}, - {"--no-cache-prompt"}, - string_format("whether to enable prompt caching (default: %s)", params.cache_prompt ? "enabled" : "disabled"), - [](common_params & params, bool value) { - params.cache_prompt = value; - } - ).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_CACHE_PROMPT")); add_opt(common_arg( {"--cache-reuse"}, "N", string_format( - "min chunk size to attempt reusing from the cache via KV shifting, requires prompt caching to be enabled (default: %d)\n" + "min chunk size to attempt reusing from the cache via KV shifting (default: %d)\n" "[(card)](https://ggml.ai/f0.png)", params.n_cache_reuse ), [](common_params & params, int value) { @@ -3358,19 +3175,11 @@ common_params_context common_params_parser_init(common_params & params, llama_ex params.speculative.devices = parse_device_list(value); } ).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_SERVER, LLAMA_EXAMPLE_CLI})); - GGML_ASSERT(params.speculative.n_gpu_layers < 0); // string_format would need to be extended for a default >= 0 add_opt(common_arg( {"-ngld", "--gpu-layers-draft", "--n-gpu-layers-draft"}, "N", - string_format("max. number of draft model layers to store in VRAM, either an exact number, 'auto', or 'all' (default: %s)", - params.speculative.n_gpu_layers == -1 ? "auto" : "all"), - [](common_params & params, const std::string & value) { - if (value == "auto") { - params.speculative.n_gpu_layers = -1; - } else if (value == "all") { - params.speculative.n_gpu_layers = -2; - } else { - params.speculative.n_gpu_layers = std::stoi(value); - } + "number of layers to store in VRAM for the draft model", + [](common_params & params, int value) { + params.speculative.n_gpu_layers = value; if (!llama_supports_gpu_offload()) { fprintf(stderr, "warning: no usable GPU found, --gpu-layers-draft option will be ignored\n"); fprintf(stderr, "warning: one possible reason is that llama.cpp was compiled without GPU support\n"); @@ -3520,27 +3329,6 @@ common_params_context common_params_parser_init(common_params & params, llama_ex } } ).set_examples({ LLAMA_EXAMPLE_FINETUNE })); - add_opt(common_arg( - {"--save-logits"}, - string_format("save final logits to files for verification (default: %s)", params.save_logits ? "true" : "false"), - [](common_params & params) { - params.save_logits = true; - } - ).set_examples({LLAMA_EXAMPLE_DEBUG})); - add_opt(common_arg( - {"--logits-output-dir"}, "PATH", - string_format("directory for saving logits output files (default: %s)", params.logits_output_dir.c_str()), - [](common_params & params, const std::string & value) { - params.logits_output_dir = value; - } - ).set_examples({LLAMA_EXAMPLE_DEBUG})); - add_opt(common_arg( - {"--tensor-filter"}, "REGEX", - "filter tensor names for debug output (regex pattern, can be specified multiple times)", - [](common_params & params, const std::string & value) { - params.tensor_filter.push_back(value); - } - ).set_examples({LLAMA_EXAMPLE_DEBUG})); // presets add_opt(common_arg( @@ -3730,15 +3518,15 @@ void common_params_add_preset_options(std::vector & args) { [](common_params &, const std::string &) { /* unused */ } ).set_env(COMMON_ARG_PRESET_LOAD_ON_STARTUP).set_preset_only()); - args.push_back(common_arg( - {"stop-timeout"}, "SECONDS", - "in server router mode, force-kill model instance after this many seconds of graceful shutdown", - [](common_params &, int) { /* unused */ } - ).set_env(COMMON_ARG_PRESET_STOP_TIMEOUT).set_preset_only()); - // args.push_back(common_arg( // {"pin"}, // "in server router mode, do not unload this model if models_max is exceeded", // [](common_params &) { /* unused */ } // ).set_preset_only()); + + // args.push_back(common_arg( + // {"unload-idle-seconds"}, "SECONDS", + // "in server router mode, unload models idle for more than this many seconds", + // [](common_params &, int) { /* unused */ } + // ).set_preset_only()); } diff --git a/common/arg.h b/common/arg.h index 55782a1..f5111c6 100644 --- a/common/arg.h +++ b/common/arg.h @@ -10,7 +10,6 @@ // pseudo-env variable to identify preset-only arguments #define COMMON_ARG_PRESET_LOAD_ON_STARTUP "__PRESET_LOAD_ON_STARTUP" -#define COMMON_ARG_PRESET_STOP_TIMEOUT "__PRESET_STOP_TIMEOUT" // // CLI argument parsing @@ -129,3 +128,11 @@ void common_params_add_preset_options(std::vector & args); // initialize argument parser context - used by test-arg-parser and preset common_params_context common_params_parser_init(common_params & params, llama_example ex, void(*print_usage)(int, char **) = nullptr); + +struct common_remote_params { + std::vector headers; + long timeout = 0; // CURLOPT_TIMEOUT, in seconds ; 0 means no timeout + long max_size = 0; // max size of the response ; unlimited if 0 ; max is 2GB +}; +// get remote file content, returns +std::pair> common_remote_get_content(const std::string & url, const common_remote_params & params); diff --git a/common/chat-parser.cpp b/common/chat-parser.cpp index 2f07351..d740dac 100644 --- a/common/chat-parser.cpp +++ b/common/chat-parser.cpp @@ -1395,126 +1395,6 @@ static void common_chat_parse_seed_oss(common_chat_msg_parser & builder) { builder.consume_reasoning_with_xml_tool_calls(form, "", ""); } -static void common_chat_parse_solar_open(common_chat_msg_parser & builder) { - builder.try_parse_reasoning("<|think|>", "<|end|><|begin|>assistant<|content|>"); - - // TODO: Tool calling - - builder.add_content(builder.consume_rest()); -} - -static void common_chat_parse_exaone_moe_content(common_chat_msg_parser & builder) { - // 1) { "name": "...", "arguments": {...} } - // 2) { "id": "...", "type": "function", "function": { "name": "...", "arguments": {...} } } - static const common_regex tool_call_open(R"(]*>)"); - - if (!builder.syntax().parse_tool_calls) { - LOG_DBG("%s: not parse_tool_calls\n", __func__); - builder.add_content(builder.consume_rest()); - return; - } - - LOG_DBG("%s: parse_tool_calls\n", __func__); - - // Find all blocks - while (auto first = builder.try_find_regex(tool_call_open, std::string::npos, /* add_prelude_to_content= */ true)) { - builder.move_to(first->groups[0].end); - builder.consume_spaces(); - - builder.try_consume_literal("```json"); - builder.try_consume_literal("```"); - builder.consume_spaces(); - - // Consume JSON object - auto data = builder.consume_json(); - - builder.consume_spaces(); - builder.try_consume_literal("```"); - builder.consume_spaces(); - - if (!builder.try_consume_literal("")) { - throw common_chat_msg_partial_exception("incomplete tool call"); - } - builder.consume_spaces(); - - // Extract name and arguments - std::string name; - std::string id; - nlohmann::ordered_json arguments; - - const auto extract_args = [&](const nlohmann::ordered_json & obj) -> bool { - if (!obj.contains("name") || !obj.contains("arguments")) { - return false; - } - name = obj.at("name").get(); - arguments = obj.at("arguments"); - if (obj.contains("id") && obj.at("id").is_string()) { - id = obj.at("id").get(); - } - return true; - }; - - if (!extract_args(data.json)) { - if (data.json.contains("function") && data.json.at("function").is_object()) { - auto fn = data.json.at("function"); - extract_args(fn); - if (id.empty() && data.json.contains("id") && data.json.at("id").is_string()) { - id = data.json.at("id").get(); - } - } - } - - // If name is empty, treat the JSON object as content - if (name.empty()) { - LOG_DBG("%s: tool call missing name, treating as content\n", __func__); - builder.add_content(data.json.dump()); - continue; - } - - std::string args_str = arguments.dump(); - if (!builder.add_tool_call(name, id, args_str)) { - throw common_chat_msg_partial_exception("incomplete tool call"); - } - } - - builder.add_content(builder.consume_rest()); -} - -static void common_chat_parse_exaone_moe(common_chat_msg_parser & builder) { - LOG_DBG("%s: parsing exaone_moe\n", __func__); - // EXAONE MoE outputs reasoning content between "" and "" tags, followed by regular content - // First try to parse using the standard reasoning parsing method - LOG_DBG("%s: thinking_forced_open: %s\n", __func__, std::to_string(builder.syntax().thinking_forced_open).c_str()); - - auto start_pos = builder.pos(); - auto found_end_think = builder.try_find_literal(""); - builder.move_to(start_pos); - - if (builder.syntax().thinking_forced_open && !builder.is_partial() && !found_end_think) { - LOG_DBG("%s: no end_think, not partial, adding content\n", __func__); - common_chat_parse_exaone_moe_content(builder); - } else if (builder.try_parse_reasoning("", "")) { - // If reasoning was parsed successfully, the remaining content is regular content - LOG_DBG("%s: parsed reasoning, adding content\n", __func__); - common_chat_parse_exaone_moe_content(builder); - } else { - if (builder.syntax().reasoning_format == COMMON_REASONING_FORMAT_NONE) { - LOG_DBG("%s: reasoning_format none, adding content\n", __func__); - common_chat_parse_exaone_moe_content(builder); - return; - } - // If no reasoning tags found, check if we should treat everything as reasoning - if (builder.syntax().thinking_forced_open) { - // If thinking is forced open but no tags found, treat everything as reasoning - LOG_DBG("%s: thinking_forced_open, adding reasoning content\n", __func__); - builder.add_reasoning_content(builder.consume_rest()); - } else { - LOG_DBG("%s: no thinking_forced_open, adding content\n", __func__); - common_chat_parse_exaone_moe_content(builder); - } - } -} - static void common_chat_parse_content_only(common_chat_msg_parser & builder) { builder.try_parse_reasoning("", ""); builder.add_content(builder.consume_rest()); @@ -1599,12 +1479,6 @@ static void common_chat_parse(common_chat_msg_parser & builder) { case COMMON_CHAT_FORMAT_XIAOMI_MIMO: common_chat_parse_xiaomi_mimo(builder); break; - case COMMON_CHAT_FORMAT_SOLAR_OPEN: - common_chat_parse_solar_open(builder); - break; - case COMMON_CHAT_FORMAT_EXAONE_MOE: - common_chat_parse_exaone_moe(builder); - break; default: throw std::runtime_error(std::string("Unsupported format: ") + common_chat_format_name(builder.syntax().format)); } diff --git a/common/chat.cpp b/common/chat.cpp index d531388..0a426f4 100644 --- a/common/chat.cpp +++ b/common/chat.cpp @@ -319,7 +319,7 @@ json common_chat_msgs_to_json_oaicompat(const std::vector & msg } } } else { - jmsg["content"] = ""; + jmsg["content"] = json(); // null } if (!msg.reasoning_content.empty()) { jmsg["reasoning_content"] = msg.reasoning_content; @@ -380,8 +380,8 @@ std::vector common_chat_tools_parse_oaicompat(const json & too const auto & function = tool.at("function"); result.push_back({ /* .name = */ function.at("name"), - /* .description = */ function.value("description", ""), - /* .parameters = */ function.value("parameters", json::object()).dump(), + /* .description = */ function.at("description"), + /* .parameters = */ function.at("parameters").dump(), }); } } @@ -669,8 +669,6 @@ const char * common_chat_format_name(common_chat_format format) { case COMMON_CHAT_FORMAT_QWEN3_CODER_XML: return "Qwen3 Coder"; case COMMON_CHAT_FORMAT_APRIEL_1_5: return "Apriel 1.5"; case COMMON_CHAT_FORMAT_XIAOMI_MIMO: return "Xiaomi MiMo"; - case COMMON_CHAT_FORMAT_SOLAR_OPEN: return "Solar Open"; - case COMMON_CHAT_FORMAT_EXAONE_MOE: return "EXAONE MoE"; case COMMON_CHAT_FORMAT_PEG_SIMPLE: return "peg-simple"; case COMMON_CHAT_FORMAT_PEG_NATIVE: return "peg-native"; case COMMON_CHAT_FORMAT_PEG_CONSTRUCTED: return "peg-constructed"; @@ -2066,7 +2064,7 @@ static common_chat_params common_chat_params_init_gpt_oss(const common_chat_temp // Trigger on tool calls that appear in the commentary channel data.grammar_triggers.push_back({ COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN, - "<\\|channel\\|>(?:commentary|analysis) to" + "<\\|channel\\|>(commentary|analysis) to" }); // Trigger tool calls that appear in the role section, either at the @@ -2399,17 +2397,17 @@ static common_chat_params common_chat_params_init_hermes_2_pro(const common_chat (inputs.parallel_tool_calls ? "(" + tool_call + ")+" : tool_call)); // Trigger on some common known "good bad" outputs (only from the start and with a json that's about a specific argument name to avoid false positives) data.grammar_triggers.push_back({ - COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN, + COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN_FULL, // If thinking_forced_open, then we capture the tag in the grammar, // (important for required tool choice) and in the trigger's first capture (decides what is sent to the grammar) - std::string(data.thinking_forced_open ? "(\\s*)" : "") + ( + std::string(data.thinking_forced_open ? "[\\s\\S]*?(\\s*)" : "(?:[\\s\\S]*?\\s*)?") + ( "\\s*(" "(?:" "||||)?" "\\s*\\{\\s*\"name\"\\s*:\\s*\"(?:" + string_join(escaped_names, "|") + ")\"" ")" - ")" + ")[\\s\\S]*" ), }); data.preserved_tokens = { @@ -2519,86 +2517,6 @@ static common_chat_params common_chat_params_init_granite(const common_chat_temp return data; } -static common_chat_params common_chat_params_init_solar_open(const common_chat_template & tmpl, const struct templates_params & inputs) { - common_chat_params data; - - // TODO: Reasoning effort - json additional_context = {}; - - data.prompt = apply(tmpl, inputs, std::nullopt, std::nullopt, additional_context); - data.format = COMMON_CHAT_FORMAT_SOLAR_OPEN; - - data.preserved_tokens = { - "<|think|>", - "<|content|>", - "<|begin|>", - "<|end|>", - }; - - // TODO: Tool calling - - return data; -} - -static common_chat_params common_chat_params_init_exaone_moe(const common_chat_template & tmpl, const struct templates_params & inputs) { - common_chat_params data; - - data.prompt = apply(tmpl, inputs); - data.format = COMMON_CHAT_FORMAT_EXAONE_MOE; - if (string_ends_with(data.prompt, "\n")) { - if (!inputs.enable_thinking) { - data.prompt += "\n\n"; - } else { - data.thinking_forced_open = true; - } - } - - if (inputs.tools.is_array() && !inputs.tools.empty()) { - data.grammar_lazy = inputs.tool_choice != COMMON_CHAT_TOOL_CHOICE_REQUIRED && inputs.json_schema.is_null(); - data.grammar = build_grammar([&](const common_grammar_builder & builder) { - std::vector tool_rules; - foreach_function(inputs.tools, [&](const json & tool) { - const auto & function = tool.at("function"); - std::string name = function.at("name"); - auto parameters = function.at("parameters"); - builder.resolve_refs(parameters); - // Expect: {"name": "", "arguments": {...}} - tool_rules.push_back(builder.add_rule( - name + "-call", - "\"\" space " + - builder.add_schema(name + "-obj", json{ - {"type", "object"}, - {"properties", { - {"name", json{{"const", name}}}, - {"arguments", parameters}, - }}, - {"required", json::array({"name", "arguments"})}, - }) + - " space \"\" space")); - }); - - auto tool_call = builder.add_rule("tool_call", string_join(tool_rules, " | ")); - builder.add_rule("root", - std::string(data.thinking_forced_open ? "( \"\" space )? " : "") + - (inputs.parallel_tool_calls ? "(" + tool_call + ")+" : tool_call)); - - data.grammar_triggers.push_back({ - COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN_FULL, - std::string(data.thinking_forced_open ? "[\\s\\S]*?(\\s*)?" : "") + - "()[\\s\\S]*" - }); - data.preserved_tokens = { - "", - "", - "", - "", - }; - }); - } - - return data; -} - static common_chat_params common_chat_params_init_without_tools(const common_chat_template & tmpl, const struct templates_params & inputs) { common_chat_params data; data.prompt = apply(tmpl, inputs); @@ -2769,13 +2687,6 @@ static common_chat_params common_chat_templates_apply_jinja( return common_chat_params_init_xiaomi_mimo(tmpl, params); } - // EXAONE MoE format detection - if (src.find("") != std::string::npos && - src.find("") != std::string::npos && - src.find("<|tool_declare|>") != std::string::npos) { - return common_chat_params_init_exaone_moe(tmpl, params); - } - // Hermes 2/3 Pro, Qwen 2.5 Instruct (w/ tools) if (src.find("") != std::string::npos && params.json_schema.is_null()) { return common_chat_params_init_hermes_2_pro(tmpl, params); @@ -2869,13 +2780,6 @@ static common_chat_params common_chat_templates_apply_jinja( return common_chat_params_init_magistral(tmpl, params); } - // Solar Open - if (src.find("<|tool_response:begin|>") != std::string::npos && - src.find("<|tool_response:name|>") != std::string::npos && - src.find("<|tool_response:result|>") != std::string::npos) { - return common_chat_params_init_solar_open(tmpl, params); - } - // Plain handler (no tools) if (params.tools.is_null() || inputs.tool_choice == COMMON_CHAT_TOOL_CHOICE_NONE) { return common_chat_params_init_without_tools(tmpl, params); diff --git a/common/chat.h b/common/chat.h index 454085e..6085510 100644 --- a/common/chat.h +++ b/common/chat.h @@ -124,8 +124,6 @@ enum common_chat_format { COMMON_CHAT_FORMAT_QWEN3_CODER_XML, COMMON_CHAT_FORMAT_APRIEL_1_5, COMMON_CHAT_FORMAT_XIAOMI_MIMO, - COMMON_CHAT_FORMAT_SOLAR_OPEN, - COMMON_CHAT_FORMAT_EXAONE_MOE, // These are intended to be parsed by the PEG parser COMMON_CHAT_FORMAT_PEG_SIMPLE, diff --git a/common/common.cpp b/common/common.cpp index 26250ab..acf2ec8 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -251,7 +251,7 @@ bool set_process_priority(enum ggml_sched_priority prio) { case GGML_SCHED_PRIO_REALTIME: p = -20; break; } - if (setpriority(PRIO_PROCESS, 0, p) != 0) { + if (!setpriority(PRIO_PROCESS, 0, p)) { LOG_WRN("failed to set process priority %d : %s (%d)\n", prio, strerror(errno), errno); return false; } @@ -1086,7 +1086,6 @@ struct common_init_result::impl { std::vector lora; std::vector samplers; - std::vector samplers_seq_config; }; common_init_result::common_init_result(common_params & params) : @@ -1097,7 +1096,7 @@ common_init_result::common_init_result(common_params & params) : if (params.fit_params) { LOG_INF("%s: fitting params to device memory, for bugs during this step try to reproduce them with -fit off, or provide --verbose logs if the bug only occurs with -fit on\n", __func__); llama_params_fit(params.model.path.c_str(), &mparams, &cparams, - params.tensor_split, params.tensor_buft_overrides.data(), params.fit_params_target.data(), params.fit_params_min_ctx, + params.tensor_split, params.tensor_buft_overrides.data(), params.fit_params_target, params.fit_params_min_ctx, params.verbosity >= 4 ? GGML_LOG_LEVEL_DEBUG : GGML_LOG_LEVEL_ERROR); } @@ -1110,25 +1109,6 @@ common_init_result::common_init_result(common_params & params) : const llama_vocab * vocab = llama_model_get_vocab(model); - // load and optionally apply lora adapters (must be loaded before context creation) - for (auto & la : params.lora_adapters) { - llama_adapter_lora_ptr lora; - lora.reset(llama_adapter_lora_init(model, la.path.c_str())); - if (lora == nullptr) { - LOG_ERR("%s: failed to load lora adapter '%s'\n", __func__, la.path.c_str()); - pimpl->model.reset(model); - return; - } - - char buf[1024]; - la.ptr = lora.get(); - llama_adapter_meta_val_str(la.ptr, "adapter.lora.task_name", buf, sizeof(buf)); - la.task_name = buf; - llama_adapter_meta_val_str(la.ptr, "adapter.lora.prompt_prefix", buf, sizeof(buf)); - la.prompt_prefix = buf; - pimpl->lora.emplace_back(std::move(lora)); // copy to list of loaded adapters - } - // updates params.sampling // TODO: fix naming common_init_sampler_from_model(model, params.sampling); @@ -1163,18 +1143,10 @@ common_init_result::common_init_result(common_params & params) : // params.sampling.dry_penalty_last_n = llama_n_ctx(lctx); //} - // init the backend samplers as part of the context creation pimpl->samplers.resize(cparams.n_seq_max); - pimpl->samplers_seq_config.resize(cparams.n_seq_max); for (int i = 0; i < (int) cparams.n_seq_max; ++i) { pimpl->samplers[i].reset(common_sampler_init(model, params.sampling)); - pimpl->samplers_seq_config[i] = { i, common_sampler_get(pimpl->samplers[i].get()) }; - } - - if (params.sampling.backend_sampling) { - cparams.samplers = pimpl->samplers_seq_config.data(); - cparams.n_samplers = pimpl->samplers_seq_config.size(); } llama_context * lctx = llama_init_from_model(model, cparams); @@ -1198,12 +1170,6 @@ common_sampler * common_init_result::sampler(llama_seq_id seq_id) { return pimpl->samplers[seq_id].get(); } -void common_init_result::reset_samplers() { - for (int i = 0; i < (int) pimpl->samplers.size(); ++i) { - llama_sampler_reset(common_sampler_get(pimpl->samplers[i].get())); - } -} - std::vector & common_init_result::lora() { return pimpl->lora; } @@ -1279,6 +1245,24 @@ common_init_result_ptr common_init_from_params(common_params & params) { } } + // load and optionally apply lora adapters + for (auto & la : params.lora_adapters) { + llama_adapter_lora_ptr lora; + lora.reset(llama_adapter_lora_init(model, la.path.c_str())); + if (lora == nullptr) { + LOG_ERR("%s: failed to apply lora adapter '%s'\n", __func__, la.path.c_str()); + return res; + } + + char buf[1024]; + la.ptr = lora.get(); + llama_adapter_meta_val_str(la.ptr, "adapter.lora.task_name", buf, sizeof(buf)); + la.task_name = buf; + llama_adapter_meta_val_str(la.ptr, "adapter.lora.prompt_prefix", buf, sizeof(buf)); + la.prompt_prefix = buf; + res->lora().emplace_back(std::move(lora)); // copy to list of loaded adapters + } + if (!params.lora_init_without_apply) { common_set_adapter_lora(lctx, params.lora_adapters); } @@ -1319,9 +1303,6 @@ common_init_result_ptr common_init_from_params(common_params & params) { llama_synchronize(lctx); llama_perf_context_reset(lctx); llama_set_warmup(lctx, false); - - // reset samplers to reset RNG state after warmup to the seeded state - res->reset_samplers(); } return res; @@ -1360,12 +1341,14 @@ struct llama_model_params common_model_params_to_llama(common_params & params) { mparams.devices = params.devices.data(); } - mparams.n_gpu_layers = params.n_gpu_layers; + if (params.n_gpu_layers != -1) { + mparams.n_gpu_layers = params.n_gpu_layers; + } + mparams.main_gpu = params.main_gpu; mparams.split_mode = params.split_mode; mparams.tensor_split = params.tensor_split; mparams.use_mmap = params.use_mmap; - mparams.use_direct_io = params.use_direct_io; mparams.use_mlock = params.use_mlock; mparams.check_tensors = params.check_tensors; mparams.use_extra_bufts = !params.no_extra_bufts; diff --git a/common/common.h b/common/common.h index b9566df..3343720 100644 --- a/common/common.h +++ b/common/common.h @@ -80,8 +80,6 @@ int32_t cpu_get_num_math(); // enum llama_example { - LLAMA_EXAMPLE_BATCHED, - LLAMA_EXAMPLE_DEBUG, LLAMA_EXAMPLE_COMMON, LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_COMPLETION, @@ -119,7 +117,6 @@ enum common_sampler_type { COMMON_SAMPLER_TYPE_INFILL = 9, COMMON_SAMPLER_TYPE_PENALTIES = 10, COMMON_SAMPLER_TYPE_TOP_N_SIGMA = 11, - COMMON_SAMPLER_TYPE_ADAPTIVE_P = 12, }; // dimensionality reduction methods, used by cvector-generator @@ -167,34 +164,32 @@ enum common_params_sampling_config : uint64_t { struct common_params_sampling { uint32_t seed = LLAMA_DEFAULT_SEED; // the seed used to initialize llama_sampler - int32_t n_prev = 64; // number of previous tokens to remember - int32_t n_probs = 0; // if greater than 0, output the probabilities of top n_probs tokens. - int32_t min_keep = 0; // 0 = disabled, otherwise samplers should return at least min_keep tokens - int32_t top_k = 40; // <= 0 to use vocab size - float top_p = 0.95f; // 1.0 = disabled - float min_p = 0.05f; // 0.0 = disabled - float xtc_probability = 0.00f; // 0.0 = disabled - float xtc_threshold = 0.10f; // > 0.5 disables XTC - float typ_p = 1.00f; // typical_p, 1.0 = disabled - float temp = 0.80f; // <= 0.0 to sample greedily, 0.0 to not output probabilities - float dynatemp_range = 0.00f; // 0.0 = disabled - float dynatemp_exponent = 1.00f; // controls how entropy maps to temperature in dynamic temperature sampler - int32_t penalty_last_n = 64; // last n tokens to penalize (0 = disable penalty, -1 = context size) - float penalty_repeat = 1.00f; // 1.0 = disabled - float penalty_freq = 0.00f; // 0.0 = disabled - float penalty_present = 0.00f; // 0.0 = disabled - float dry_multiplier = 0.0f; // 0.0 = disabled; DRY repetition penalty for tokens extending repetition: - float dry_base = 1.75f; // 0.0 = disabled; multiplier * base ^ (length of sequence before token - allowed length) - int32_t dry_allowed_length = 2; // tokens extending repetitions beyond this receive penalty - int32_t dry_penalty_last_n = -1; // how many tokens to scan for repetitions (0 = disable penalty, -1 = context size) - float adaptive_target = -1.0f; // select tokens near this probability (valid range 0.0 to 1.0; negative = disabled) - float adaptive_decay = 0.90f; // EMA decay for adaptation; history ≈ 1/(1-decay) tokens (0.0 - 0.99) - int32_t mirostat = 0; // 0 = disabled, 1 = mirostat, 2 = mirostat 2.0 - float top_n_sigma = -1.00f; // -1.0 = disabled - float mirostat_tau = 5.00f; // target entropy - float mirostat_eta = 0.10f; // learning rate + int32_t n_prev = 64; // number of previous tokens to remember + int32_t n_probs = 0; // if greater than 0, output the probabilities of top n_probs tokens. + int32_t min_keep = 0; // 0 = disabled, otherwise samplers should return at least min_keep tokens + int32_t top_k = 40; // <= 0 to use vocab size + float top_p = 0.95f; // 1.0 = disabled + float min_p = 0.05f; // 0.0 = disabled + float xtc_probability = 0.00f; // 0.0 = disabled + float xtc_threshold = 0.10f; // > 0.5 disables XTC + float typ_p = 1.00f; // typical_p, 1.0 = disabled + float temp = 0.80f; // <= 0.0 to sample greedily, 0.0 to not output probabilities + float dynatemp_range = 0.00f; // 0.0 = disabled + float dynatemp_exponent = 1.00f; // controls how entropy maps to temperature in dynamic temperature sampler + int32_t penalty_last_n = 64; // last n tokens to penalize (0 = disable penalty, -1 = context size) + float penalty_repeat = 1.00f; // 1.0 = disabled + float penalty_freq = 0.00f; // 0.0 = disabled + float penalty_present = 0.00f; // 0.0 = disabled + float dry_multiplier = 0.0f; // 0.0 = disabled; DRY repetition penalty for tokens extending repetition: + float dry_base = 1.75f; // 0.0 = disabled; multiplier * base ^ (length of sequence before token - allowed length) + int32_t dry_allowed_length = 2; // tokens extending repetitions beyond this receive penalty + int32_t dry_penalty_last_n = -1; // how many tokens to scan for repetitions (0 = disable penalty, -1 = context size) + int32_t mirostat = 0; // 0 = disabled, 1 = mirostat, 2 = mirostat 2.0 + float top_n_sigma = -1.00f;// -1.0 = disabled + float mirostat_tau = 5.00f; // target entropy + float mirostat_eta = 0.10f; // learning rate bool ignore_eos = false; - bool no_perf = false; // disable performance metrics + bool no_perf = false; // disable performance metrics bool timing_per_token = false; uint64_t user_sampling_config = 0; // bitfield to track user-specified samplers @@ -221,8 +216,6 @@ struct common_params_sampling { std::vector logit_bias; // logit biases to apply std::vector logit_bias_eog; // pre-calculated logit biases for EOG tokens - bool backend_sampling = false; - bool has_logit_bias() const { return !logit_bias.empty(); } @@ -336,14 +329,12 @@ struct common_params { // offload params std::vector devices; // devices to use for offloading - int32_t n_gpu_layers = -1; // number of layers to store in VRAM, -1 is auto, <= -2 is all - int32_t main_gpu = 0; // the GPU that is used for scratch and small tensors - float tensor_split[128] = {0}; // how split tensors should be distributed across GPUs - bool fit_params = true; // whether to fit unset model/context parameters to free device memory - int32_t fit_params_min_ctx = 4096; // minimum context size to set when trying to reduce memory use - - // margin per device in bytes for fitting parameters to free memory: - std::vector fit_params_target = std::vector(llama_max_devices(), 1024 * 1024*1024); + int32_t n_gpu_layers = -1; // number of layers to store in VRAM (-1 - use default) + int32_t main_gpu = 0; // the GPU that is used for scratch and small tensors + float tensor_split[128] = {0}; // how split tensors should be distributed across GPUs + bool fit_params = true; // whether to fit unset model/context parameters to free device memory + size_t fit_params_target = 1024 * 1024*1024; // margin per device in bytes for fitting parameters to free memory + int32_t fit_params_min_ctx = 4096; // minimum context size to set when trying to reduce memory use enum llama_split_mode split_mode = LLAMA_SPLIT_MODE_LAYER; // how to split the model across GPUs @@ -379,11 +370,6 @@ struct common_params { std::string lookup_cache_dynamic = ""; // path of dynamic ngram cache file for lookup decoding // NOLINT std::string logits_file = ""; // file for saving *all* logits // NOLINT - // llama-debug specific options - std::string logits_output_dir = "data"; // directory for saving logits output files // NOLINT - bool save_logits = false; // whether to save logits to files // NOLINT - std::vector tensor_filter; // filter tensor names for debug output (regex) // NOLINT - std::vector in_files; // all input files std::vector antiprompt; // strings upon which more user input is prompted (a.k.a. reverse prompts) std::vector kv_overrides; @@ -434,8 +420,7 @@ struct common_params { bool kv_unified = false; // enable unified KV cache bool input_prefix_bos = false; // prefix BOS to user inputs, preceding input_prefix - bool use_mmap = true; // enable mmap to use filesystem cache - bool use_direct_io = true; // read from disk without buffering for faster model loading + bool use_mmap = true; // use mmap for faster loads bool use_mlock = false; // use mlock to keep model in memory bool verbose_prompt = false; // print prompt tokens before generation bool display_prompt = true; // print prompt before generation @@ -479,7 +464,6 @@ struct common_params { int32_t timeout_write = timeout_read; // http write timeout in seconds int32_t n_threads_http = -1; // number of threads to process HTTP requests (TODO: support threadpool) int32_t n_cache_reuse = 0; // min chunk size to reuse from the cache via KV shifting - bool cache_prompt = true; // whether to enable prompt caching int32_t n_ctx_checkpoints = 8; // max number of context checkpoints per slot int32_t cache_ram_mib = 8192; // -1 = no limit, 0 - disable, 1 = 1 MiB, etc. @@ -705,9 +689,7 @@ struct common_init_result { llama_model * model(); llama_context * context(); - common_sampler * sampler(llama_seq_id seq_id); - void reset_samplers(); std::vector & lora(); diff --git a/common/debug.cpp b/common/debug.cpp deleted file mode 100644 index fdaddb1..0000000 --- a/common/debug.cpp +++ /dev/null @@ -1,165 +0,0 @@ -#include "debug.h" - -#include "log.h" - -#include -#include - -static std::string common_ggml_ne_string(const ggml_tensor * t) { - std::string str; - for (int i = 0; i < GGML_MAX_DIMS; ++i) { - str += std::to_string(t->ne[i]); - if (i + 1 < GGML_MAX_DIMS) { - str += ", "; - } - } - return str; -} - -static float common_ggml_get_float_value(const uint8_t * data, - ggml_type type, - const size_t * nb, - size_t i0, - size_t i1, - size_t i2, - size_t i3) { - size_t i = i3 * nb[3] + i2 * nb[2] + i1 * nb[1] + i0 * nb[0]; - float v; - if (type == GGML_TYPE_F16) { - v = ggml_fp16_to_fp32(*(const ggml_fp16_t *) &data[i]); - } else if (type == GGML_TYPE_F32) { - v = *(const float *) &data[i]; - } else if (type == GGML_TYPE_I64) { - v = (float) *(const int64_t *) &data[i]; - } else if (type == GGML_TYPE_I32) { - v = (float) *(const int32_t *) &data[i]; - } else if (type == GGML_TYPE_I16) { - v = (float) *(const int16_t *) &data[i]; - } else if (type == GGML_TYPE_I8) { - v = (float) *(const int8_t *) &data[i]; - } else if (type == GGML_TYPE_BF16) { - v = ggml_bf16_to_fp32(*(const ggml_bf16_t *) &data[i]); - } else { - GGML_ABORT("fatal error"); - } - return v; -} - -template -void common_debug_print_tensor(uint8_t * data, ggml_type type, const int64_t * ne, const size_t * nb, int64_t n) { - GGML_ASSERT(n > 0); - float sum = 0; - for (int64_t i3 = 0; i3 < ne[3]; i3++) { - for (int64_t i2 = 0; i2 < ne[2]; i2++) { - for (int64_t i1 = 0; i1 < ne[1]; i1++) { - for (int64_t i0 = 0; i0 < ne[0]; i0++) { - const float v = common_ggml_get_float_value(data, type, nb, i0, i1, i2, i3); - sum += v; - } - } - } - } - for (int64_t i3 = 0; i3 < ne[3]; i3++) { - LOG_ERR(" [\n"); - for (int64_t i2 = 0; i2 < ne[2]; i2++) { - if (i2 == n && ne[2] > 2 * n) { - LOG_ERR(" ..., \n"); - i2 = ne[2] - n; - } - LOG_ERR(" [\n"); - for (int64_t i1 = 0; i1 < ne[1]; i1++) { - if (i1 == n && ne[1] > 2 * n) { - LOG_ERR(" ..., \n"); - i1 = ne[1] - n; - } - LOG_ERR(" ["); - for (int64_t i0 = 0; i0 < ne[0]; i0++) { - if (i0 == n && ne[0] > 2 * n) { - LOG_ERR("..., "); - i0 = ne[0] - n; - } - const float v = common_ggml_get_float_value(data, type, nb, i0, i1, i2, i3); - LOG_ERR("%12.4f", v); - if (i0 < ne[0] - 1) { - LOG_ERR(", "); - } - } - LOG_ERR("],\n"); - } - LOG_ERR(" ],\n"); - } - LOG_ERR(" ]\n"); - LOG_ERR(" sum = %f\n", sum); - } - - if constexpr (abort) { - if (std::isnan(sum)) { - LOG_ERR("encountered NaN - aborting\n"); - exit(0); - } - } -} - -/** - * GGML operations callback during the graph execution. - * - * @param t current tensor - * @param ask when ask is true, the scheduler wants to know if we are interested in data from this tensor - * if we return true, a follow-up call will be made with ask=false in which we can do the actual collection. - * see ggml_backend_sched_eval_callback - * @param user_data user data to pass at each call back - * @return true to receive data or continue the graph, false otherwise - */ -template bool common_debug_cb_eval(struct ggml_tensor * t, bool ask, void * user_data) { - auto * cb_data = (base_callback_data *) user_data; - - const struct ggml_tensor * src0 = t->src[0]; - const struct ggml_tensor * src1 = t->src[1]; - - if (ask) { - return true; // Always retrieve data - } - - bool matches_filter = cb_data->tensor_filters.empty(); - - if (!matches_filter) { - for (const auto & filter : cb_data->tensor_filters) { - if (std::regex_search(t->name, filter)) { - matches_filter = true; - break; - } - } - } - - char src1_str[128] = { 0 }; - if (src1) { - snprintf(src1_str, sizeof(src1_str), "%s{%s}", src1->name, common_ggml_ne_string(src1).c_str()); - } - - if (matches_filter) { - LOG_ERR("%s: %24s = (%s) %10s(%s{%s}, %s}) = {%s}\n", __func__, t->name, ggml_type_name(t->type), - ggml_op_desc(t), src0->name, common_ggml_ne_string(src0).c_str(), src1 ? src1_str : "", - common_ggml_ne_string(t).c_str()); - } - - const bool is_host = ggml_backend_buffer_is_host(t->buffer); - - if (!is_host) { - auto n_bytes = ggml_nbytes(t); - cb_data->data.resize(n_bytes); - ggml_backend_tensor_get(t, cb_data->data.data(), 0, n_bytes); - } - - if (!ggml_is_quantized(t->type) && matches_filter) { - uint8_t * data = is_host ? (uint8_t *) t->data : cb_data->data.data(); - common_debug_print_tensor(data, t->type, t->ne, t->nb, 3); - } - - return true; -} - -// Explicit template instantiations -template bool common_debug_cb_eval(ggml_tensor *, bool, void *); -template bool common_debug_cb_eval(ggml_tensor *, bool, void *); -template void common_debug_print_tensor(uint8_t *, ggml_type, const int64_t *, const size_t *, int64_t); -template void common_debug_print_tensor(uint8_t *, ggml_type, const int64_t *, const size_t *, int64_t); diff --git a/common/debug.h b/common/debug.h deleted file mode 100644 index 0c55963..0000000 --- a/common/debug.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once -#include "common.h" -#include -#include -#include - -// common debug functions and structs - -// Print a tensor's detailed data -// data - the tensor's data in byte format -// type - the tensor's quantization type -// ne - the tensor dimensions array -// nb - the tensor strides array -// n - the number of rows/columns to fully print -template void common_debug_print_tensor(uint8_t * data, ggml_type type, const int64_t * ne, const size_t * nb, int64_t n); - -// Intended to use as callback for ggml_backend_sched_eval_callback -// prints tensors that are processed in the computation graph -// by default prints all tensors, but can be configured by creating a `base_callback_data` instance with -// non-empty filter_patterns. See examples/debug.ccp for possible usage patterns -// The template parameter determins whether an error should be thrown whenever a NaN is encountered -// in a tensor (useful for stopping debug sessions on first erroneous tensor) -// The callback data will be passed as the third parameter (user_data) -template bool common_debug_cb_eval(struct ggml_tensor * t, bool ask, void * user_data); -struct base_callback_data { - std::vector data; - std::vector tensor_filters; - - base_callback_data() = default; - - base_callback_data(common_params & params, const std::vector & filter_patterns) { - for (const auto & pattern : filter_patterns) { - try { - std::string anchored_pattern = "^" + pattern; - tensor_filters.emplace_back(anchored_pattern, std::regex::optimize); - } catch (const std::regex_error & e) { - throw std::runtime_error("Invalid regex pattern '" + pattern + "': " + e.what()); - } - } - params.cb_eval = common_debug_cb_eval; - params.cb_eval_user_data = this; - } -}; diff --git a/common/download.cpp b/common/download.cpp index a377804..ef87472 100644 --- a/common/download.cpp +++ b/common/download.cpp @@ -19,7 +19,10 @@ #include #include -#if defined(LLAMA_USE_HTTPLIB) +#if defined(LLAMA_USE_CURL) +#include +#include +#elif defined(LLAMA_USE_HTTPLIB) #include "http.h" #endif @@ -154,21 +157,322 @@ static std::string read_etag(const std::string & path) { return none; } -static bool is_http_status_ok(int status) { - return status >= 200 && status < 400; -} +#ifdef LLAMA_USE_CURL -std::pair common_download_split_repo_tag(const std::string & hf_repo_with_tag) { - auto parts = string_split(hf_repo_with_tag, ':'); - std::string tag = parts.size() > 1 ? parts.back() : "latest"; - std::string hf_repo = parts[0]; - if (string_split(hf_repo, '/').size() != 2) { - throw std::invalid_argument("error: invalid HF repo format, expected /[:quant]\n"); +// +// CURL utils +// + +using curl_ptr = std::unique_ptr; + +// cannot use unique_ptr for curl_slist, because we cannot update without destroying the old one +struct curl_slist_ptr { + struct curl_slist * ptr = nullptr; + ~curl_slist_ptr() { + if (ptr) { + curl_slist_free_all(ptr); + } } - return {hf_repo, tag}; +}; + +static CURLcode common_curl_perf(CURL * curl) { + CURLcode res = curl_easy_perform(curl); + if (res != CURLE_OK) { + LOG_ERR("%s: curl_easy_perform() failed\n", __func__); + } + + return res; } -#if defined(LLAMA_USE_HTTPLIB) +// Send a HEAD request to retrieve the etag and last-modified headers +struct common_load_model_from_url_headers { + std::string etag; + std::string last_modified; + std::string accept_ranges; +}; + +struct FILE_deleter { + void operator()(FILE * f) const { fclose(f); } +}; + +static size_t common_header_callback(char * buffer, size_t, size_t n_items, void * userdata) { + common_load_model_from_url_headers * headers = (common_load_model_from_url_headers *) userdata; + static std::regex header_regex("([^:]+): (.*)\r\n"); + static std::regex etag_regex("ETag", std::regex_constants::icase); + static std::regex last_modified_regex("Last-Modified", std::regex_constants::icase); + static std::regex accept_ranges_regex("Accept-Ranges", std::regex_constants::icase); + std::string header(buffer, n_items); + std::smatch match; + if (std::regex_match(header, match, header_regex)) { + const std::string & key = match[1]; + const std::string & value = match[2]; + if (std::regex_match(key, match, etag_regex)) { + headers->etag = value; + } else if (std::regex_match(key, match, last_modified_regex)) { + headers->last_modified = value; + } else if (std::regex_match(key, match, accept_ranges_regex)) { + headers->accept_ranges = value; + } + } + + return n_items; +} + +static size_t common_write_callback(void * data, size_t size, size_t nmemb, void * fd) { + return std::fwrite(data, size, nmemb, static_cast(fd)); +} + +// helper function to hide password in URL +static std::string llama_download_hide_password_in_url(const std::string & url) { + // Use regex to match and replace the user[:password]@ pattern in URLs + // Pattern: scheme://[user[:password]@]host[...] + static const std::regex url_regex(R"(^(?:[A-Za-z][A-Za-z0-9+.-]://)(?:[^/@]+@)?.$)"); + std::smatch match; + + if (std::regex_match(url, match, url_regex)) { + // match[1] = scheme (e.g., "https://") + // match[2] = user[:password]@ part + // match[3] = rest of URL (host and path) + return match[1].str() + "********@" + match[3].str(); + } + + return url; // No credentials found or malformed URL +} + +static void common_curl_easy_setopt_head(CURL * curl, const std::string & url) { + // Set the URL, allow to follow http redirection + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + +# if defined(_WIN32) + // CURLSSLOPT_NATIVE_CA tells libcurl to use standard certificate store of + // operating system. Currently implemented under MS-Windows. + curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); +# endif + + curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); // will trigger the HEAD verb + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L); // hide head request progress + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, common_header_callback); +} + +static void common_curl_easy_setopt_get(CURL * curl) { + curl_easy_setopt(curl, CURLOPT_NOBODY, 0L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, common_write_callback); + + // display download progress + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L); +} + +static bool common_pull_file(CURL * curl, const std::string & path_temporary) { + if (std::filesystem::exists(path_temporary)) { + const std::string partial_size = std::to_string(std::filesystem::file_size(path_temporary)); + LOG_INF("%s: server supports range requests, resuming download from byte %s\n", __func__, partial_size.c_str()); + const std::string range_str = partial_size + "-"; + curl_easy_setopt(curl, CURLOPT_RANGE, range_str.c_str()); + } + + // Always open file in append mode could be resuming + std::unique_ptr outfile(fopen(path_temporary.c_str(), "ab")); + if (!outfile) { + LOG_ERR("%s: error opening local file for writing: %s\n", __func__, path_temporary.c_str()); + return false; + } + + common_curl_easy_setopt_get(curl); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile.get()); + + return common_curl_perf(curl) == CURLE_OK; +} + +static bool common_download_head(CURL * curl, + curl_slist_ptr & http_headers, + const std::string & url, + const std::string & bearer_token) { + if (!curl) { + LOG_ERR("%s: error initializing libcurl\n", __func__); + return false; + } + + http_headers.ptr = curl_slist_append(http_headers.ptr, "User-Agent: llama-cpp"); + // Check if hf-token or bearer-token was specified + if (!bearer_token.empty()) { + std::string auth_header = "Authorization: Bearer " + bearer_token; + http_headers.ptr = curl_slist_append(http_headers.ptr, auth_header.c_str()); + } + + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_headers.ptr); + common_curl_easy_setopt_head(curl, url); + return common_curl_perf(curl) == CURLE_OK; +} + +// download one single file from remote URL to local path +static bool common_download_file_single_online(const std::string & url, + const std::string & path, + const std::string & bearer_token) { + static const int max_attempts = 3; + static const int retry_delay_seconds = 2; + for (int i = 0; i < max_attempts; ++i) { + std::string etag; + + // Check if the file already exists locally + const auto file_exists = std::filesystem::exists(path); + if (file_exists) { + etag = read_etag(path); + } else { + LOG_INF("%s: no previous model file found %s\n", __func__, path.c_str()); + } + + bool head_request_ok = false; + bool should_download = !file_exists; // by default, we should download if the file does not exist + + // Initialize libcurl + curl_ptr curl(curl_easy_init(), &curl_easy_cleanup); + common_load_model_from_url_headers headers; + curl_easy_setopt(curl.get(), CURLOPT_HEADERDATA, &headers); + curl_slist_ptr http_headers; + const bool was_perform_successful = common_download_head(curl.get(), http_headers, url, bearer_token); + if (!was_perform_successful) { + head_request_ok = false; + } + + long http_code = 0; + curl_easy_getinfo(curl.get(), CURLINFO_RESPONSE_CODE, &http_code); + if (http_code == 200) { + head_request_ok = true; + } else { + LOG_WRN("%s: HEAD invalid http status code received: %ld\n", __func__, http_code); + head_request_ok = false; + } + + // if head_request_ok is false, we don't have the etag or last-modified headers + // we leave should_download as-is, which is true if the file does not exist + bool should_download_from_scratch = false; + if (head_request_ok) { + // check if ETag or Last-Modified headers are different + // if it is, we need to download the file again + if (!etag.empty() && etag != headers.etag) { + LOG_WRN("%s: ETag header is different (%s != %s): triggering a new download\n", __func__, etag.c_str(), + headers.etag.c_str()); + should_download = true; + should_download_from_scratch = true; + } + } + + const bool accept_ranges_supported = !headers.accept_ranges.empty() && headers.accept_ranges != "none"; + if (should_download) { + if (file_exists && + !accept_ranges_supported) { // Resumable downloads not supported, delete and start again. + LOG_WRN("%s: deleting previous downloaded file: %s\n", __func__, path.c_str()); + if (remove(path.c_str()) != 0) { + LOG_ERR("%s: unable to delete file: %s\n", __func__, path.c_str()); + return false; + } + } + + const std::string path_temporary = path + ".downloadInProgress"; + if (should_download_from_scratch) { + if (std::filesystem::exists(path_temporary)) { + if (remove(path_temporary.c_str()) != 0) { + LOG_ERR("%s: unable to delete file: %s\n", __func__, path_temporary.c_str()); + return false; + } + } + + if (std::filesystem::exists(path)) { + if (remove(path.c_str()) != 0) { + LOG_ERR("%s: unable to delete file: %s\n", __func__, path.c_str()); + return false; + } + } + } + if (head_request_ok) { + write_etag(path, headers.etag); + } + + // start the download + LOG_INF("%s: trying to download model from %s to %s (server_etag:%s, server_last_modified:%s)...\n", + __func__, llama_download_hide_password_in_url(url).c_str(), path_temporary.c_str(), + headers.etag.c_str(), headers.last_modified.c_str()); + const bool was_pull_successful = common_pull_file(curl.get(), path_temporary); + if (!was_pull_successful) { + if (i + 1 < max_attempts) { + const int exponential_backoff_delay = std::pow(retry_delay_seconds, i) * 1000; + LOG_WRN("%s: retrying after %d milliseconds...\n", __func__, exponential_backoff_delay); + std::this_thread::sleep_for(std::chrono::milliseconds(exponential_backoff_delay)); + } else { + LOG_ERR("%s: curl_easy_perform() failed after %d attempts\n", __func__, max_attempts); + } + + continue; + } + + long http_code = 0; + curl_easy_getinfo(curl.get(), CURLINFO_RESPONSE_CODE, &http_code); + if (http_code < 200 || http_code >= 400) { + LOG_ERR("%s: invalid http status code received: %ld\n", __func__, http_code); + return false; + } + + if (rename(path_temporary.c_str(), path.c_str()) != 0) { + LOG_ERR("%s: unable to rename file: %s to %s\n", __func__, path_temporary.c_str(), path.c_str()); + return false; + } + } else { + LOG_INF("%s: using cached file: %s\n", __func__, path.c_str()); + } + + break; + } + + return true; +} + +std::pair> common_remote_get_content(const std::string & url, const common_remote_params & params) { + curl_ptr curl(curl_easy_init(), &curl_easy_cleanup); + curl_slist_ptr http_headers; + std::vector res_buffer; + + curl_easy_setopt(curl.get(), CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl.get(), CURLOPT_NOPROGRESS, 1L); + curl_easy_setopt(curl.get(), CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl.get(), CURLOPT_VERBOSE, 0L); + typedef size_t(*CURLOPT_WRITEFUNCTION_PTR)(void * ptr, size_t size, size_t nmemb, void * data); + auto write_callback = [](void * ptr, size_t size, size_t nmemb, void * data) -> size_t { + auto data_vec = static_cast *>(data); + data_vec->insert(data_vec->end(), (char *)ptr, (char *)ptr + size * nmemb); + return size * nmemb; + }; + curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION, static_cast(write_callback)); + curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &res_buffer); +#if defined(_WIN32) + curl_easy_setopt(curl.get(), CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); +#endif + if (params.timeout > 0) { + curl_easy_setopt(curl.get(), CURLOPT_TIMEOUT, params.timeout); + } + if (params.max_size > 0) { + curl_easy_setopt(curl.get(), CURLOPT_MAXFILESIZE, params.max_size); + } + http_headers.ptr = curl_slist_append(http_headers.ptr, "User-Agent: llama-cpp"); + for (const auto & header : params.headers) { + http_headers.ptr = curl_slist_append(http_headers.ptr, header.c_str()); + } + curl_easy_setopt(curl.get(), CURLOPT_HTTPHEADER, http_headers.ptr); + + CURLcode res = curl_easy_perform(curl.get()); + + if (res != CURLE_OK) { + std::string error_msg = curl_easy_strerror(res); + throw std::runtime_error("error: cannot make GET request: " + error_msg); + } + + long res_code; + curl_easy_getinfo(curl.get(), CURLINFO_RESPONSE_CODE, &res_code); + + return { res_code, std::move(res_buffer) }; +} + +#elif defined(LLAMA_USE_HTTPLIB) class ProgressBar { static inline std::mutex mutex; @@ -313,11 +617,9 @@ static bool common_pull_file(httplib::Client & cli, } // download one single file from remote URL to local path -// returns status code or -1 on error -static int common_download_file_single_online(const std::string & url, +static bool common_download_file_single_online(const std::string & url, const std::string & path, - const std::string & bearer_token, - const common_header_list & custom_headers) { + const std::string & bearer_token) { static const int max_attempts = 3; static const int retry_delay_seconds = 2; @@ -327,9 +629,6 @@ static int common_download_file_single_online(const std::string & url, if (!bearer_token.empty()) { default_headers.insert({"Authorization", "Bearer " + bearer_token}); } - for (const auto & h : custom_headers) { - default_headers.emplace(h.first, h.second); - } cli.set_default_headers(default_headers); const bool file_exists = std::filesystem::exists(path); @@ -348,10 +647,8 @@ static int common_download_file_single_online(const std::string & url, LOG_WRN("%s: HEAD invalid http status code received: %d\n", __func__, head ? head->status : -1); if (file_exists) { LOG_INF("%s: Using cached file (HEAD failed): %s\n", __func__, path.c_str()); - return 304; // 304 Not Modified - fake cached response + return true; } - return head->status; // cannot use cached file, return raw status code - // TODO: maybe retry only on certain codes } std::string etag; @@ -383,12 +680,12 @@ static int common_download_file_single_online(const std::string & url, if (file_exists) { if (!should_download_from_scratch) { LOG_INF("%s: using cached file: %s\n", __func__, path.c_str()); - return 304; // 304 Not Modified - fake cached response + return true; } LOG_WRN("%s: deleting previous downloaded file: %s\n", __func__, path.c_str()); if (remove(path.c_str()) != 0) { LOG_ERR("%s: unable to delete file: %s\n", __func__, path.c_str()); - return -1; + return false; } } @@ -400,7 +697,7 @@ static int common_download_file_single_online(const std::string & url, existing_size = std::filesystem::file_size(path_temporary); } else if (remove(path_temporary.c_str()) != 0) { LOG_ERR("%s: unable to delete file: %s\n", __func__, path_temporary.c_str()); - return -1; + return false; } } @@ -421,16 +718,15 @@ static int common_download_file_single_online(const std::string & url, if (std::rename(path_temporary.c_str(), path.c_str()) != 0) { LOG_ERR("%s: unable to rename file: %s to %s\n", __func__, path_temporary.c_str(), path.c_str()); - return -1; + return false; } if (!etag.empty()) { write_etag(path, etag); } - - return head->status; // TODO: use actual GET status? + break; } - return -1; // max attempts reached + return true; } std::pair> common_remote_get_content(const std::string & url, @@ -438,9 +734,13 @@ std::pair> common_remote_get_content(const std::string auto [cli, parts] = common_http_client(url); httplib::Headers headers = {{"User-Agent", "llama-cpp"}}; - for (const auto & header : params.headers) { - headers.emplace(header.first, header.second); + size_t pos = header.find(':'); + if (pos != std::string::npos) { + headers.emplace(header.substr(0, pos), header.substr(pos + 1)); + } else { + headers.emplace(header, ""); + } } if (params.timeout > 0) { @@ -465,45 +765,36 @@ std::pair> common_remote_get_content(const std::string return { res->status, std::move(buf) }; } -int common_download_file_single(const std::string & url, - const std::string & path, - const std::string & bearer_token, - bool offline, - const common_header_list & headers) { +#endif // LLAMA_USE_CURL + +#if defined(LLAMA_USE_CURL) || defined(LLAMA_USE_HTTPLIB) + +static bool common_download_file_single(const std::string & url, + const std::string & path, + const std::string & bearer_token, + bool offline) { if (!offline) { - return common_download_file_single_online(url, path, bearer_token, headers); + return common_download_file_single_online(url, path, bearer_token); } if (!std::filesystem::exists(path)) { LOG_ERR("%s: required file is not available in cache (offline mode): %s\n", __func__, path.c_str()); - return -1; + return false; } LOG_INF("%s: using cached file (offline mode): %s\n", __func__, path.c_str()); - return 304; // Not Modified - fake cached response + return true; } // download multiple files from remote URLs to local paths // the input is a vector of pairs -static bool common_download_file_multiple(const std::vector> & urls, - const std::string & bearer_token, - bool offline, - const common_header_list & headers) { +static bool common_download_file_multiple(const std::vector> & urls, const std::string & bearer_token, bool offline) { // Prepare download in parallel std::vector> futures_download; - futures_download.reserve(urls.size()); - for (auto const & item : urls) { - futures_download.push_back( - std::async( - std::launch::async, - [&bearer_token, offline, &headers](const std::pair & it) -> bool { - const int http_status = common_download_file_single(it.first, it.second, bearer_token, offline, headers); - return is_http_status_ok(http_status); - }, - item - ) - ); + futures_download.push_back(std::async(std::launch::async, [bearer_token, offline](const std::pair & it) -> bool { + return common_download_file_single(it.first, it.second, bearer_token, offline); + }, item)); } // Wait for all downloads to complete @@ -516,18 +807,17 @@ static bool common_download_file_multiple(const std::vector(hf_repo_with_tag, ':'); + std::string tag = parts.size() > 1 ? parts.back() : "latest"; + std::string hf_repo = parts[0]; + if (string_split(hf_repo, '/').size() != 2) { + throw std::invalid_argument("error: invalid HF repo format, expected /[:quant]\n"); + } std::string url = get_model_endpoint() + "v2/" + hf_repo + "/manifests/" + tag; // headers - common_header_list headers = custom_headers; - headers.push_back({"Accept", "application/json"}); + std::vector headers; + headers.push_back("Accept: application/json"); if (!bearer_token.empty()) { - headers.push_back({"Authorization", "Bearer " + bearer_token}); + headers.push_back("Authorization: Bearer " + bearer_token); } // Important: the User-Agent must be "llama-cpp" to get the "ggufFile" field in the response // User-Agent header is already set in common_remote_get_content, no need to set it here @@ -661,7 +952,7 @@ common_hf_file_res common_get_hf_file(const std::string & hf_repo_with_tag, } else if (res_code == 401) { throw std::runtime_error("error: model is private or does not exist; if you are accessing a gated model, please provide a valid HF token"); } else { - throw std::runtime_error(string_format("error from HF API (%s), response code: %ld, data: %s", url.c_str(), res_code, res_str.c_str())); + throw std::runtime_error(string_format("error from HF API, response code: %ld, data: %s", res_code, res_str.c_str())); } // check response @@ -740,10 +1031,9 @@ std::string common_docker_resolve_model(const std::string & docker) { const std::string url_prefix = "https://registry-1.docker.io/v2/" + repo; std::string manifest_url = url_prefix + "/manifests/" + tag; common_remote_params manifest_params; - manifest_params.headers.push_back({"Authorization", "Bearer " + token}); - manifest_params.headers.push_back({"Accept", - "application/vnd.docker.distribution.manifest.v2+json,application/vnd.oci.image.manifest.v1+json" - }); + manifest_params.headers.push_back("Authorization: Bearer " + token); + manifest_params.headers.push_back( + "Accept: application/vnd.docker.distribution.manifest.v2+json,application/vnd.oci.image.manifest.v1+json"); auto manifest_res = common_remote_get_content(manifest_url, manifest_params); if (manifest_res.first != 200) { throw std::runtime_error("Failed to get Docker manifest, HTTP code: " + std::to_string(manifest_res.first)); @@ -780,8 +1070,7 @@ std::string common_docker_resolve_model(const std::string & docker) { std::string local_path = fs_get_cache_file(model_filename); const std::string blob_url = url_prefix + "/blobs/" + gguf_digest; - const int http_status = common_download_file_single(blob_url, local_path, token, false, {}); - if (!is_http_status_ok(http_status)) { + if (!common_download_file_single(blob_url, local_path, token, false)) { throw std::runtime_error("Failed to download Docker Model"); } @@ -795,11 +1084,11 @@ std::string common_docker_resolve_model(const std::string & docker) { #else -common_hf_file_res common_get_hf_file(const std::string &, const std::string &, bool, const common_header_list &) { +common_hf_file_res common_get_hf_file(const std::string &, const std::string &, bool) { throw std::runtime_error("download functionality is not enabled in this build"); } -bool common_download_model(const common_params_model &, const std::string &, bool, const common_header_list &) { +bool common_download_model(const common_params_model &, const std::string &, bool) { throw std::runtime_error("download functionality is not enabled in this build"); } @@ -807,15 +1096,7 @@ std::string common_docker_resolve_model(const std::string &) { throw std::runtime_error("download functionality is not enabled in this build"); } -int common_download_file_single(const std::string &, - const std::string &, - const std::string &, - bool, - const common_header_list &) { - throw std::runtime_error("download functionality is not enabled in this build"); -} - -#endif // defined(LLAMA_USE_HTTPLIB) +#endif // LLAMA_USE_CURL || LLAMA_USE_HTTPLIB std::vector common_list_cached_models() { std::vector models; diff --git a/common/download.h b/common/download.h index 1c1d8e6..d1321e6 100644 --- a/common/download.h +++ b/common/download.h @@ -1,27 +1,12 @@ #pragma once #include -#include struct common_params_model; -using common_header = std::pair; -using common_header_list = std::vector; - -struct common_remote_params { - common_header_list headers; - long timeout = 0; // in seconds, 0 means no timeout - long max_size = 0; // unlimited if 0 -}; - -// get remote file content, returns -std::pair> common_remote_get_content(const std::string & url, const common_remote_params & params); - -// split HF repo with tag into -// for example: "user/model:tag" -> <"user/model", "tag"> -// if tag is not present, default to "latest" -// example: "user/model" -> <"user/model", "latest"> -std::pair common_download_split_repo_tag(const std::string & hf_repo_with_tag); +// +// download functionalities +// struct common_cached_model_info { std::string manifest_path; @@ -56,29 +41,17 @@ struct common_hf_file_res { common_hf_file_res common_get_hf_file( const std::string & hf_repo_with_tag, const std::string & bearer_token, - bool offline, - const common_header_list & headers = {} -); + bool offline); // returns true if download succeeded bool common_download_model( const common_params_model & model, const std::string & bearer_token, - bool offline, - const common_header_list & headers = {} -); + bool offline); // returns list of cached models std::vector common_list_cached_models(); -// download single file from url to local path -// returns status code or -1 on error -int common_download_file_single(const std::string & url, - const std::string & path, - const std::string & bearer_token, - bool offline, - const common_header_list & headers = {}); - // resolve and download model from Docker registry // return local path to downloaded model file std::string common_docker_resolve_model(const std::string & docker); diff --git a/common/llguidance.cpp b/common/llguidance.cpp index d58f147..adce620 100644 --- a/common/llguidance.cpp +++ b/common/llguidance.cpp @@ -106,16 +106,12 @@ static void llama_sampler_llg_free(llama_sampler * smpl) { } static llama_sampler_i llama_sampler_llg_i = { - /* .name = */ llama_sampler_llg_name, - /* .accept = */ llama_sampler_llg_accept_impl, - /* .apply = */ llama_sampler_llg_apply, - /* .reset = */ llama_sampler_llg_reset, - /* .clone = */ llama_sampler_llg_clone, - /* .free = */ llama_sampler_llg_free, - /* .backend_init = */ NULL, - /* .backend_accept = */ NULL, - /* .backend_apply = */ NULL, - /* .backend_set_input = */ NULL, + /* .name = */ llama_sampler_llg_name, + /* .accept = */ llama_sampler_llg_accept_impl, + /* .apply = */ llama_sampler_llg_apply, + /* .reset = */ llama_sampler_llg_reset, + /* .clone = */ llama_sampler_llg_clone, + /* .free = */ llama_sampler_llg_free, }; static size_t llama_sampler_llg_tokenize_fn(const void * user_data, const uint8_t * bytes, size_t bytes_len, diff --git a/common/preset.cpp b/common/preset.cpp index 57ccd00..e2fc18c 100644 --- a/common/preset.cpp +++ b/common/preset.cpp @@ -16,48 +16,6 @@ static std::string rm_leading_dashes(const std::string & str) { return str.substr(pos); } -// only allow a subset of args for remote presets for security reasons -// do not add more args unless absolutely necessary -// args that output to files are strictly prohibited -static std::set get_remote_preset_whitelist(const std::map & key_to_opt) { - static const std::set allowed_options = { - "model-url", - "hf-repo", - "hf-repo-draft", - "hf-repo-v", // vocoder - "hf-file-v", // vocoder - "mmproj-url", - "pooling", - "jinja", - "batch-size", - "ubatch-size", - "cache-reuse", - "chat-template-kwargs", - "mmap", - // note: sampling params are automatically allowed by default - // negated args will be added automatically if the positive arg is specified above - }; - - std::set allowed_keys; - - for (const auto & it : key_to_opt) { - const std::string & key = it.first; - const common_arg & opt = it.second; - if (allowed_options.find(key) != allowed_options.end() || opt.is_sparam) { - allowed_keys.insert(key); - // also add variant keys (args without leading dashes and env vars) - for (const auto & arg : opt.get_args()) { - allowed_keys.insert(rm_leading_dashes(arg)); - } - for (const auto & env : opt.get_env()) { - allowed_keys.insert(env); - } - } - } - - return allowed_keys; -} - std::vector common_preset::to_args(const std::string & bin_path) const { std::vector args; @@ -163,29 +121,6 @@ void common_preset::merge(const common_preset & other) { } } -void common_preset::apply_to_params(common_params & params) const { - for (const auto & [opt, val] : options) { - // apply each option to params - if (opt.handler_string) { - opt.handler_string(params, val); - } else if (opt.handler_int) { - opt.handler_int(params, std::stoi(val)); - } else if (opt.handler_bool) { - opt.handler_bool(params, common_arg_utils::is_truthy(val)); - } else if (opt.handler_str_str) { - // not supported yet - throw std::runtime_error(string_format( - "%s: option with two values is not supported yet", - __func__ - )); - } else if (opt.handler_void) { - opt.handler_void(params); - } else { - GGML_ABORT("unknown handler type"); - } - } -} - static std::map> parse_ini_from_file(const std::string & path) { std::map> parsed; @@ -295,16 +230,10 @@ static std::string parse_bool_arg(const common_arg & arg, const std::string & ke return value; } -common_preset_context::common_preset_context(llama_example ex, bool only_remote_allowed) +common_preset_context::common_preset_context(llama_example ex) : ctx_params(common_params_parser_init(default_params, ex)) { common_params_add_preset_options(ctx_params.options); key_to_opt = get_map_key_opt(ctx_params); - - // setup allowed keys if only_remote_allowed is true - if (only_remote_allowed) { - filter_allowed_keys = true; - allowed_keys = get_remote_preset_whitelist(key_to_opt); - } } common_presets common_preset_context::load_from_ini(const std::string & path, common_preset & global) const { @@ -320,18 +249,7 @@ common_presets common_preset_context::load_from_ini(const std::string & path, co } LOG_DBG("loading preset: %s\n", preset.name.c_str()); for (const auto & [key, value] : section.second) { - if (key == "version") { - // skip version key (reserved for future use) - continue; - } - LOG_DBG("option: %s = %s\n", key.c_str(), value.c_str()); - if (filter_allowed_keys && allowed_keys.find(key) == allowed_keys.end()) { - throw std::runtime_error(string_format( - "option '%s' is not allowed in remote presets", - key.c_str() - )); - } if (key_to_opt.find(key) != key_to_opt.end()) { const auto & opt = key_to_opt.at(key); if (is_bool_arg(opt)) { @@ -341,10 +259,7 @@ common_presets common_preset_context::load_from_ini(const std::string & path, co } LOG_DBG("accepted option: %s = %s\n", key.c_str(), preset.options[opt].c_str()); } else { - throw std::runtime_error(string_format( - "option '%s' not recognized in preset '%s'", - key.c_str(), preset.name.c_str() - )); + // TODO: maybe warn about unknown key? } } diff --git a/common/preset.h b/common/preset.h index 11ba6ef..3a84d1b 100644 --- a/common/preset.h +++ b/common/preset.h @@ -6,7 +6,6 @@ #include #include #include -#include // // INI preset parser and writer @@ -41,9 +40,6 @@ struct common_preset { // merge another preset into this one, overwriting existing options void merge(const common_preset & other); - - // apply preset options to common_params - void apply_to_params(common_params & params) const; }; // interface for multiple presets in one file @@ -54,12 +50,7 @@ struct common_preset_context { common_params default_params; // unused for now common_params_context ctx_params; std::map key_to_opt; - - bool filter_allowed_keys = false; - std::set allowed_keys; - - // if only_remote_allowed is true, only accept whitelisted keys - common_preset_context(llama_example ex, bool only_remote_allowed = false); + common_preset_context(llama_example ex); // load presets from INI file common_presets load_from_ini(const std::string & path, common_preset & global) const; diff --git a/common/regex-partial.cpp b/common/regex-partial.cpp index e667a20..4bff6b6 100644 --- a/common/regex-partial.cpp +++ b/common/regex-partial.cpp @@ -27,7 +27,7 @@ common_regex_match common_regex::search(const std::string & input, size_t pos, b return res; } std::match_results srmatch; - if (std::regex_search(input.rbegin(), input.rend() - pos, srmatch, rx_reversed_partial, std::regex_constants::match_continuous)) { + if (std::regex_match(input.rbegin(), input.rend() - pos, srmatch, rx_reversed_partial)) { auto group = srmatch[1].str(); if (group.length() != 0) { auto it = srmatch[1].second.base(); @@ -55,18 +55,18 @@ common_regex_match common_regex::search(const std::string & input, size_t pos, b to see if a string ends with a partial regex match, but but it's not in std::regex yet. Instead, we'll the regex into a partial match regex operating as a full match on the reverse iterators of the input. - - /abcd/ -> ^(dcba|cba|ba|a) -> ^((?:(?:(?:(?:d)?c)?b)?a) - - /a|b/ -> ^(a|b) + - /abcd/ -> (dcba|cba|ba|a).* -> ((?:(?:(?:(?:d)?c)?b)?a).* + - /a|b/ -> (a|b).* - /a*?/ -> error, could match "" - - /a*b/ -> ^((?:b)?a*+) (final repetitions become eager) - - /.*?ab/ -> ^((?:b)?a) (omit .*) - - /a.*?b/ -> ^((?:b)?.*?a) (keep reluctant matches) - - /a(bc)d/ -> ^((?:(?:d)?(?:(?:c)?b))?a) - - /a(bc|de)/ -> ^((?:(?:(?:e)?d)?|(?:(?:c)?b)?)?a) - - /ab{2,4}c/ -> ^cbbb?b?a -> ^((?:(?:(?:(?:(?:c)?b)?b)?b?)?b?)?a) + - /a*b/ -> ((?:b)?a*+).* (final repetitions become eager) + - /.*?ab/ -> ((?:b)?a).* (merge .*) + - /a.*?b/ -> ((?:b)?.*?a).* (keep reluctant matches) + - /a(bc)d/ -> ((?:(?:d)?(?:(?:c)?b))?a).* + - /a(bc|de)/ -> ((?:(?:(?:e)?d)?|(?:(?:c)?b)?)?a).* + - /ab{2,4}c/ -> abbb?b?c -> ((?:(?:(?:(?:(?:c)?b)?b)?b?)?b?)?a).* - The regex will match a reversed string fully, and the end of the first (And only) capturing group will indicate the reversed start of the original partial pattern. - All other groups are turned into non-capturing groups, and reluctant quantifiers are ignored. + The regex will match a reversed string fully, and the end of the first (And only) capturing group will indicate the reversed start of the original partial pattern + (i.e. just where the final .* starts in the inverted pattern; all other groups are turned into non-capturing groups, and reluctant quantifiers are ignored) */ std::string regex_to_reversed_partial_regex(const std::string & pattern) { auto it = pattern.begin(); @@ -177,7 +177,7 @@ std::string regex_to_reversed_partial_regex(const std::string & pattern) { } } - // /abcd/ -> ^(dcba|cba|ba|a) -> ^((?:(?:(?:d)?c)?b)?a) + // /abcd/ -> (dcba|cba|ba|a).* -> ((?:(?:(?:d)?c)?b)?a).* // if n(=4) parts, opening n-1(=3) non-capturing groups after the 1 capturing group // We'll do the outermost capturing group and final .* in the enclosing function. std::vector res_alts; @@ -200,5 +200,5 @@ std::string regex_to_reversed_partial_regex(const std::string & pattern) { throw std::runtime_error("Unmatched '(' in pattern"); } - return "^(" + res + ")"; + return "(" + res + ")[\\s\\S]*"; } diff --git a/common/sampling.cpp b/common/sampling.cpp index 11a1d48..c66f935 100644 --- a/common/sampling.cpp +++ b/common/sampling.cpp @@ -120,34 +120,17 @@ struct common_sampler { } void set_logits(struct llama_context * ctx, int idx) { - const float * sampled_probs = llama_get_sampled_probs_ith (ctx, idx); - const float * sampled_logits = llama_get_sampled_logits_ith (ctx, idx); - const llama_token * sampled_ids = llama_get_sampled_candidates_ith(ctx, idx); + const auto * logits = llama_get_logits_ith(ctx, idx); const llama_model * model = llama_get_model(ctx); const llama_vocab * vocab = llama_model_get_vocab(model); const int n_vocab = llama_vocab_n_tokens(vocab); - if (sampled_probs) { - const uint32_t sampled_probs_count = llama_get_sampled_probs_count_ith(ctx, idx); - cur.resize(sampled_probs_count); - for (uint32_t i = 0; i < sampled_probs_count; ++i) { - cur[i] = llama_token_data{sampled_ids[i], sampled_logits[i], sampled_probs[i]}; - } - } else if (sampled_logits) { - const uint32_t sampled_logits_count = llama_get_sampled_logits_count_ith(ctx, idx); - cur.resize(sampled_logits_count); - for (uint32_t i = 0; i < sampled_logits_count; i++) { - cur[i] = llama_token_data{sampled_ids[i], sampled_logits[i], 0.0f}; - } - } else { - const auto * logits = llama_get_logits_ith(ctx, idx); - GGML_ASSERT(logits != nullptr); - cur.resize(n_vocab); - for (llama_token token_id = 0; token_id < n_vocab; token_id++) { - cur[token_id] = llama_token_data{token_id, logits[token_id], 0.0f}; - } + cur.resize(n_vocab); + + for (llama_token token_id = 0; token_id < n_vocab; token_id++) { + cur[token_id] = llama_token_data{token_id, logits[token_id], 0.0f}; } cur_p = { cur.data(), cur.size(), -1, false }; @@ -167,16 +150,16 @@ std::string common_params_sampling::print() const { "\trepeat_last_n = %d, repeat_penalty = %.3f, frequency_penalty = %.3f, presence_penalty = %.3f\n" "\tdry_multiplier = %.3f, dry_base = %.3f, dry_allowed_length = %d, dry_penalty_last_n = %d\n" "\ttop_k = %d, top_p = %.3f, min_p = %.3f, xtc_probability = %.3f, xtc_threshold = %.3f, typical_p = %.3f, top_n_sigma = %.3f, temp = %.3f\n" - "\tmirostat = %d, mirostat_lr = %.3f, mirostat_ent = %.3f, adaptive_target = %.3f, adaptive_decay = %.3f", + "\tmirostat = %d, mirostat_lr = %.3f, mirostat_ent = %.3f", penalty_last_n, penalty_repeat, penalty_freq, penalty_present, dry_multiplier, dry_base, dry_allowed_length, dry_penalty_last_n, top_k, top_p, min_p, xtc_probability, xtc_threshold, typ_p, top_n_sigma, temp, - mirostat, mirostat_eta, mirostat_tau, adaptive_target, adaptive_decay); + mirostat, mirostat_eta, mirostat_tau); return std::string(result); } -struct common_sampler * common_sampler_init(const struct llama_model * model, struct common_params_sampling & params) { +struct common_sampler * common_sampler_init(const struct llama_model * model, const struct common_params_sampling & params) { const llama_vocab * vocab = llama_model_get_vocab(model); llama_sampler_chain_params lparams = llama_sampler_chain_default_params(); @@ -196,30 +179,24 @@ struct common_sampler * common_sampler_init(const struct llama_model * model, st #endif // LLAMA_USE_LLGUIDANCE } else { std::vector trigger_patterns; + std::vector patterns_anywhere; std::vector trigger_tokens; for (const auto & trigger : params.grammar_triggers) { switch (trigger.type) { case COMMON_GRAMMAR_TRIGGER_TYPE_WORD: { const auto & word = trigger.value; - trigger_patterns.push_back(regex_escape(word)); + patterns_anywhere.push_back(regex_escape(word)); break; } case COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN: { - trigger_patterns.push_back(trigger.value); + patterns_anywhere.push_back(trigger.value); break; } case COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN_FULL: { - const auto & pattern = trigger.value; - std::string anchored = "^$"; - if (!pattern.empty()) { - anchored = (pattern.front() != '^' ? "^" : "") - + pattern - + (pattern.back() != '$' ? "$" : ""); - } - trigger_patterns.push_back(anchored); + trigger_patterns.push_back(trigger.value); break; } case COMMON_GRAMMAR_TRIGGER_TYPE_TOKEN: @@ -233,6 +210,10 @@ struct common_sampler * common_sampler_init(const struct llama_model * model, st } } + if (!patterns_anywhere.empty()) { + trigger_patterns.push_back("^[\\s\\S]*?(" + string_join(patterns_anywhere, "|") + ")[\\s\\S]*"); + } + std::vector trigger_patterns_c; trigger_patterns_c.reserve(trigger_patterns.size()); for (const auto & regex : trigger_patterns) { @@ -255,9 +236,6 @@ struct common_sampler * common_sampler_init(const struct llama_model * model, st } if (params.mirostat == 0) { - - bool use_adaptive_p = false; // see below - for (const auto & cnstr : params.samplers) { switch (cnstr) { case COMMON_SAMPLER_TYPE_DRY: @@ -267,54 +245,43 @@ struct common_sampler * common_sampler_init(const struct llama_model * model, st for (const auto & str : params.dry_sequence_breakers) { c_breakers.push_back(str.c_str()); } - samplers.push_back(llama_sampler_init_dry(vocab, llama_model_n_ctx_train(model), params.dry_multiplier, params.dry_base, params.dry_allowed_length, params.dry_penalty_last_n, c_breakers.data(), c_breakers.size())); + + samplers.push_back(llama_sampler_init_dry (vocab, llama_model_n_ctx_train(model), params.dry_multiplier, params.dry_base, params.dry_allowed_length, params.dry_penalty_last_n, c_breakers.data(), c_breakers.size())); } break; case COMMON_SAMPLER_TYPE_TOP_K: - samplers.push_back(llama_sampler_init_top_k(params.top_k)); + samplers.push_back(llama_sampler_init_top_k (params.top_k)); break; case COMMON_SAMPLER_TYPE_TOP_P: - samplers.push_back(llama_sampler_init_top_p(params.top_p, params.min_keep)); + samplers.push_back(llama_sampler_init_top_p (params.top_p, params.min_keep)); break; case COMMON_SAMPLER_TYPE_TOP_N_SIGMA: samplers.push_back(llama_sampler_init_top_n_sigma(params.top_n_sigma)); break; case COMMON_SAMPLER_TYPE_MIN_P: - samplers.push_back(llama_sampler_init_min_p(params.min_p, params.min_keep)); + samplers.push_back(llama_sampler_init_min_p (params.min_p, params.min_keep)); break; case COMMON_SAMPLER_TYPE_XTC: - samplers.push_back(llama_sampler_init_xtc(params.xtc_probability, params.xtc_threshold, params.min_keep, params.seed)); + samplers.push_back(llama_sampler_init_xtc (params.xtc_probability, params.xtc_threshold, params.min_keep, params.seed)); break; case COMMON_SAMPLER_TYPE_TYPICAL_P: - samplers.push_back(llama_sampler_init_typical(params.typ_p, params.min_keep)); + samplers.push_back(llama_sampler_init_typical (params.typ_p, params.min_keep)); break; case COMMON_SAMPLER_TYPE_TEMPERATURE: - samplers.push_back(llama_sampler_init_temp_ext(params.temp, params.dynatemp_range, params.dynatemp_exponent)); + samplers.push_back(llama_sampler_init_temp_ext (params.temp, params.dynatemp_range, params.dynatemp_exponent)); break; case COMMON_SAMPLER_TYPE_INFILL: - samplers.push_back(llama_sampler_init_infill(vocab)); + samplers.push_back(llama_sampler_init_infill (vocab)); break; case COMMON_SAMPLER_TYPE_PENALTIES: - samplers.push_back(llama_sampler_init_penalties(params.penalty_last_n, params.penalty_repeat, params.penalty_freq, params.penalty_present)); - break; - case COMMON_SAMPLER_TYPE_ADAPTIVE_P: - // the `adaptive-p` sampler is like `dist` and `mirostat` in that it selects - // a single token, so we will add `dist` at the end of the chain by default, - // unless the user specifically included `adaptive-p`. we set this flag here - // so we know to add the sampler at the very end. - use_adaptive_p = true; + samplers.push_back(llama_sampler_init_penalties (params.penalty_last_n, params.penalty_repeat, params.penalty_freq, params.penalty_present)); break; default: GGML_ASSERT(false && "unknown sampler type"); } } - if (use_adaptive_p) { - // only if user explicitly included adaptive-p sampler - samplers.push_back(llama_sampler_init_adaptive_p(params.adaptive_target, params.adaptive_decay, params.seed)); - } else { - // default: sample from distribution - samplers.push_back(llama_sampler_init_dist(params.seed)); - } + + samplers.push_back(llama_sampler_init_dist(params.seed)); } else if (params.mirostat == 1) { samplers.push_back(llama_sampler_init_temp(params.temp)); samplers.push_back(llama_sampler_init_mirostat(llama_vocab_n_tokens(vocab), params.seed, params.mirostat_tau, params.mirostat_eta, 100)); @@ -329,12 +296,6 @@ struct common_sampler * common_sampler_init(const struct llama_model * model, st llama_sampler_chain_add(chain, smpl); } - if (grmr && params.backend_sampling) { - LOG_WRN("%s: backend sampling is not compatible with grammar, disabling\n", __func__); - - params.backend_sampling = false; - } - auto * result = new common_sampler { /* .params = */ params, /* .grmr = */ grmr, @@ -348,21 +309,15 @@ struct common_sampler * common_sampler_init(const struct llama_model * model, st } void common_sampler_free(struct common_sampler * gsmpl) { - if (!gsmpl) { - return; + if (gsmpl) { + llama_sampler_free(gsmpl->grmr); + llama_sampler_free(gsmpl->chain); + + delete gsmpl; } - - llama_sampler_free(gsmpl->grmr); - llama_sampler_free(gsmpl->chain); - - delete gsmpl; } void common_sampler_accept(struct common_sampler * gsmpl, llama_token token, bool accept_grammar) { - if (!gsmpl) { - return; - } - const auto tm = gsmpl->tm(); if (gsmpl->grmr && accept_grammar) { @@ -375,10 +330,6 @@ void common_sampler_accept(struct common_sampler * gsmpl, llama_token token, boo } void common_sampler_reset(struct common_sampler * gsmpl) { - if (!gsmpl) { - return; - } - gsmpl->reset(); } @@ -439,10 +390,6 @@ void common_perf_print(const struct llama_context * ctx, const struct common_sam } struct llama_sampler * common_sampler_get(const struct common_sampler * gsmpl) { - if (!gsmpl) { - return nullptr; - } - return gsmpl->chain; } @@ -458,25 +405,6 @@ llama_token common_sampler_sample(struct common_sampler * gsmpl, struct llama_co auto & chain = gsmpl->chain; auto & cur_p = gsmpl->cur_p; // initialized by set_logits - // Check if a backend sampler has already sampled a token in which case we - // return that token id directly. - { - id = llama_get_sampled_token_ith(ctx, idx); - - if (id != LLAMA_TOKEN_NULL) { - LOG_DBG("%s: Backend sampler selected token: '%d'. Will not run any CPU samplers\n", __func__, id); - - GGML_ASSERT(!gsmpl->grmr && "using grammar in combination with backend sampling is not supported"); - - // TODO: simplify - gsmpl->cur.resize(1); - gsmpl->cur[0] = { id, 0.0f, 1.0f }; - cur_p = { gsmpl->cur.data(), gsmpl->cur.size(), 0, true }; - - return id; - } - } - gsmpl->set_logits(ctx, idx); if (grammar_first) { @@ -639,7 +567,6 @@ char common_sampler_type_to_chr(enum common_sampler_type cnstr) { case COMMON_SAMPLER_TYPE_XTC: return 'x'; case COMMON_SAMPLER_TYPE_INFILL: return 'i'; case COMMON_SAMPLER_TYPE_PENALTIES: return 'e'; - case COMMON_SAMPLER_TYPE_ADAPTIVE_P: return 'a'; default : return '?'; } } @@ -656,7 +583,6 @@ std::string common_sampler_type_to_str(enum common_sampler_type cnstr) { case COMMON_SAMPLER_TYPE_XTC: return "xtc"; case COMMON_SAMPLER_TYPE_INFILL: return "infill"; case COMMON_SAMPLER_TYPE_PENALTIES: return "penalties"; - case COMMON_SAMPLER_TYPE_ADAPTIVE_P: return "adaptive_p"; default : return ""; } } @@ -673,7 +599,6 @@ std::vector common_sampler_types_from_names(const std::vect { "xtc", COMMON_SAMPLER_TYPE_XTC }, { "infill", COMMON_SAMPLER_TYPE_INFILL }, { "penalties", COMMON_SAMPLER_TYPE_PENALTIES }, - { "adaptive_p", COMMON_SAMPLER_TYPE_ADAPTIVE_P }, }; // since samplers names are written multiple ways @@ -689,7 +614,6 @@ std::vector common_sampler_types_from_names(const std::vect { "typ", COMMON_SAMPLER_TYPE_TYPICAL_P }, { "min-p", COMMON_SAMPLER_TYPE_MIN_P }, { "temp", COMMON_SAMPLER_TYPE_TEMPERATURE }, - { "adaptive-p", COMMON_SAMPLER_TYPE_ADAPTIVE_P }, }; std::vector samplers; @@ -726,7 +650,6 @@ std::vector common_sampler_types_from_chars(const std::stri { common_sampler_type_to_chr(COMMON_SAMPLER_TYPE_XTC), COMMON_SAMPLER_TYPE_XTC }, { common_sampler_type_to_chr(COMMON_SAMPLER_TYPE_INFILL), COMMON_SAMPLER_TYPE_INFILL }, { common_sampler_type_to_chr(COMMON_SAMPLER_TYPE_PENALTIES), COMMON_SAMPLER_TYPE_PENALTIES }, - { common_sampler_type_to_chr(COMMON_SAMPLER_TYPE_ADAPTIVE_P), COMMON_SAMPLER_TYPE_ADAPTIVE_P }, }; std::vector samplers; diff --git a/common/sampling.h b/common/sampling.h index 5b57ad6..c710103 100644 --- a/common/sampling.h +++ b/common/sampling.h @@ -36,8 +36,7 @@ struct common_sampler; // llama_sampler API overloads -// note: can mutate params in some cases -struct common_sampler * common_sampler_init(const struct llama_model * model, struct common_params_sampling & params); +struct common_sampler * common_sampler_init(const struct llama_model * model, const struct common_params_sampling & params); void common_sampler_free(struct common_sampler * gsmpl); @@ -49,7 +48,6 @@ struct common_sampler * common_sampler_clone (struct common_sampler * gsmpl); // arguments can be nullptr to skip printing void common_perf_print(const struct llama_context * ctx, const struct common_sampler * gsmpl); -// get the underlying llama_sampler_chain struct llama_sampler * common_sampler_get(const struct common_sampler * gsmpl); // extended sampling implementation: diff --git a/convert_hf_to_gguf.py b/convert_hf_to_gguf.py index 464ecba..16c5acf 100755 --- a/convert_hf_to_gguf.py +++ b/convert_hf_to_gguf.py @@ -528,11 +528,7 @@ class ModelBase: return () def prepare_tensors(self): - # Handle empty tensor_map for models with block_count=0 (like MobileNetV5) - if self.tensor_map.mapping: - max_name_len = max(len(s) for _, s in self.tensor_map.mapping.values()) + len(".weight,") - else: - max_name_len = len("vision_encoder.weight,") # Default reasonable length + max_name_len = max(len(s) for _, s in self.tensor_map.mapping.values()) + len(".weight,") for name, data_torch in chain(self.generate_extra_tensors(), self.get_tensors()): # we don't need these @@ -775,14 +771,9 @@ class TextModel(ModelBase): self.rope_parameters = self.hparams.get("rope_parameters", self.hparams.get("rope_scaling")) or {} - rope_theta = self.find_hparam(["global_rope_theta", "rope_global_theta", "rope_theta_global", "rope_theta", "rotary_emb_base"], optional=True) - local_rope_theta = self.find_hparam(["local_rope_theta", "rope_local_theta", "rope_theta_local", "swa_rope_theta", "rope_local_base_freq"], optional=True) - # Ensure "rope_theta" and "rope_type" is mirrored in rope_parameters if "full_attention" not in self.rope_parameters and "sliding_attention" not in self.rope_parameters: - if local_rope_theta is not None: - self.rope_parameters["sliding_attention"] = {"rope_theta": local_rope_theta} - if "rope_theta" not in self.rope_parameters and rope_theta is not None: + if "rope_theta" not in self.rope_parameters and (rope_theta := self.find_hparam(["rope_theta", "global_rope_theta", "rotary_emb_base"], optional=True)) is not None: self.rope_parameters["rope_theta"] = rope_theta if "rope_type" not in self.rope_parameters and (rope_type := self.rope_parameters.get("type")) is not None: self.rope_parameters["rope_type"] = rope_type @@ -848,7 +839,6 @@ class TextModel(ModelBase): self.gguf_writer.add_head_count_kv(n_head_kv) logger.info(f"gguf: key-value head count = {n_head_kv}") - # TODO: Handle "sliding_attention" similarly when models start implementing it rope_params = self.rope_parameters.get("full_attention", self.rope_parameters) if (rope_type := rope_params.get("rope_type")) is not None: rope_factor = rope_params.get("factor") @@ -895,9 +885,6 @@ class TextModel(ModelBase): if (rope_theta := rope_params.get("rope_theta")) is not None: self.gguf_writer.add_rope_freq_base(rope_theta) logger.info(f"gguf: rope theta = {rope_theta}") - if (local_rope_theta := self.rope_parameters.get("sliding_attention", {}).get("rope_theta")) is not None: - self.gguf_writer.add_rope_freq_base_swa(local_rope_theta) - logger.info(f"gguf: rope theta swa = {local_rope_theta}") if (f_rms_eps := self.find_hparam(["rms_norm_eps", "norm_eps"], optional=True)) is not None: self.gguf_writer.add_layer_norm_rms_eps(f_rms_eps) logger.info(f"gguf: rms norm epsilon = {f_rms_eps}") @@ -1075,9 +1062,6 @@ class TextModel(ModelBase): if chkhsh == "66b8d4e19ab16c3bfd89bce5d785fb7e0155e8648708a1f42077cb9fe002c273": # ref: https://huggingface.co/alvarobartt/grok-2-tokenizer res = "grok-2" - if chkhsh == "b3d1dd861f1d4c5c0d2569ce36baf3f90fe8a102db3de50dd71ff860d91be3df": - # ref: https://huggingface.co/aari1995/German_Semantic_V3 - res = "jina-v2-de" if chkhsh == "0ef9807a4087ebef797fc749390439009c3b9eda9ad1a097abbe738f486c01e5": # ref: https://huggingface.co/meta-llama/Meta-Llama-3-8B res = "llama-bpe" @@ -1246,15 +1230,6 @@ class TextModel(ModelBase): if chkhsh == "4a2e2abae11ca2b86d570fc5b44be4d5eb5e72cc8f22dd136a94b37da83ab665": # ref: https://huggingface.co/KORMo-Team/KORMo-tokenizer res = "kormo" - if chkhsh == "9d70134b369a70e5735009b6de918f7581b5211f7c074d1f89f753aea8248af1": - # ref: https://huggingface.co/tencent/Youtu-LLM-2B - res = "youtu" - if chkhsh == "16389f0a1f51ee53e562ffd51c371dc508639ab0e4261502071836e50e223e91": - # ref: https://huggingface.co/upstage/Solar-Open-100B - res = "solar-open" - if chkhsh == "6c81ce329e0802883b22eabab0d3fa48357337ef1ecb45443828bf1f6254833f": - # ref: https://huggingface.co/LGAI-EXAONE/K-EXAONE-236B-A23B - res = "exaone-moe" if res is None: logger.warning("\n") @@ -1721,84 +1696,6 @@ class TextModel(ModelBase): if template is not None: self.gguf_writer.add_chat_template(template) - def _set_vocab_plamo(self): - # PLaMo models use a custom tokenizer with a .jsonl file - tokenizer_jsonl_path = self.dir_model / "tokenizer.jsonl" - tokenizer_config_path = self.dir_model / "tokenizer_config.json" - - if not tokenizer_jsonl_path.is_file(): - raise FileNotFoundError(f"PLaMo tokenizer file not found: {tokenizer_jsonl_path}") - - # Load tokenizer config - with open(tokenizer_config_path, "r", encoding="utf-8") as f: - tokenizer_config = json.load(f) - - # Load tokens from JSONL file (actually a list format) - tokens = [] - scores = [] - toktypes = [] - - with open(tokenizer_jsonl_path, "r", encoding="utf-8") as f: - for line_num, line in enumerate(f): - if line.strip(): - token_data = json.loads(line) - # Format: [token, score, type, ?, ?, ?, ?] - token = token_data[0].encode("utf-8") - score = float(token_data[1]) - token_type_str = token_data[2] if len(token_data) > 2 else "NORMAL" - - tokens.append(token) - scores.append(score) - - if token_type_str == "UNKNOWN": - toktypes.append(gguf.TokenType.UNKNOWN) - elif token_type_str == "CONTROL": - toktypes.append(gguf.TokenType.CONTROL) - elif token_type_str == "BYTE": - toktypes.append(gguf.TokenType.BYTE) - else: - token_str = token_data[0] - if token_str.startswith("<|plamo:") and token_str.endswith("|>"): - toktypes.append(gguf.TokenType.CONTROL) - else: - toktypes.append(gguf.TokenType.NORMAL) - - vocab_size = self.hparams["vocab_size"] - if vocab_size > len(tokens): - pad_count = vocab_size - len(tokens) - logger.debug(f"Padding vocab with {pad_count} token(s) - [PAD1] through [PAD{pad_count}]") - for i in range(1, pad_count + 1): - tokens.append(bytes(f"[PAD{i}]", encoding="utf-8")) - scores.append(-1000.0) - toktypes.append(gguf.TokenType.UNUSED) - - self.gguf_writer.add_tokenizer_model("plamo2") - self.gguf_writer.add_tokenizer_pre("default") - self.gguf_writer.add_token_list(tokens) - self.gguf_writer.add_token_scores(scores) - self.gguf_writer.add_token_types(toktypes) - - if "bos_token" in tokenizer_config and tokenizer_config["bos_token"] is not None: - token_id = tokens.index(tokenizer_config["bos_token"].encode("utf-8")) - self.gguf_writer.add_bos_token_id(token_id) - if "eos_token" in tokenizer_config and tokenizer_config["eos_token"] is not None: - token_id = tokens.index(tokenizer_config["eos_token"].encode("utf-8")) - self.gguf_writer.add_eos_token_id(token_id) - if "pad_token" in tokenizer_config and tokenizer_config["pad_token"] is not None: - token_id = tokens.index(tokenizer_config["pad_token"].encode("utf-8")) - self.gguf_writer.add_pad_token_id(token_id) - if "sep_token" in tokenizer_config and tokenizer_config["sep_token"] is not None: - token_id = tokens.index(tokenizer_config["sep_token"].encode("utf-8")) - self.gguf_writer.add_sep_token_id(token_id) - if "unk_token" in tokenizer_config and tokenizer_config["unk_token"] is not None: - token_id = tokens.index(tokenizer_config["unk_token"].encode("utf-8")) - self.gguf_writer.add_unk_token_id(token_id) - - # Add <|plamo:op|> as EOT to ensure appropriate end of generation - self.gguf_writer.add_eot_token_id(4) - - self.gguf_writer.add_add_space_prefix(False) - class MmprojModel(ModelBase): model_type = ModelType.MMPROJ @@ -2511,7 +2408,6 @@ class StableLMModel(TextModel): "VLlama3ForCausalLM", "LlavaForConditionalGeneration", "VoxtralForConditionalGeneration", - "IQuestCoderForCausalLM", "LlamaModel") class LlamaModel(TextModel): model_arch = gguf.MODEL_ARCH.LLAMA @@ -3529,7 +3425,7 @@ class QwenModel(TextModel): self._set_vocab_qwen() -@ModelBase.register("Qwen2Model", "Qwen2ForCausalLM", "Qwen2AudioForConditionalGeneration", "KORMoForCausalLM", "AudioFlamingo3ForConditionalGeneration") +@ModelBase.register("Qwen2Model", "Qwen2ForCausalLM", "Qwen2AudioForConditionalGeneration", "KORMoForCausalLM") class Qwen2Model(TextModel): model_arch = gguf.MODEL_ARCH.QWEN2 @@ -4370,37 +4266,7 @@ class Qwen3NextModel(Qwen2MoeModel): elif name.endswith("norm.weight") and not name.endswith("linear_attn.norm.weight"): data_torch = data_torch + 1 - if "in_proj_qkvz.weight" in name: - # original order: [q, k, v, z] * head_count - # corrected order: [q * head_count, k * head_count, v * head_count, z * head_count] - head_k_dim = self.hparams["linear_key_head_dim"] - head_v_dim = self.hparams["linear_value_head_dim"] - num_v_heads = self.hparams["linear_num_value_heads"] - num_k_heads = self.hparams["linear_num_key_heads"] - hidden_size = self.hparams["hidden_size"] - split_arg_list_qkvz = [ - head_k_dim, # q partition - head_k_dim, # k partition - (num_v_heads // num_k_heads * head_v_dim), # v partition - (num_v_heads // num_k_heads * head_v_dim), # z partition - ] - # view as (n_embd, head_count, [q+k+v+z]) - data_torch = data_torch.permute(1, 0).contiguous() - data_torch = data_torch.view(-1, num_k_heads, sum(split_arg_list_qkvz)) - # split into q, k, v, z - q, k, v, z = torch.split(data_torch, split_arg_list_qkvz, dim=-1) - # flatten dim + head_count - q = q.contiguous().view(hidden_size, -1) - k = k.contiguous().view(hidden_size, -1) - v = v.contiguous().view(hidden_size, -1) - z = z.contiguous().view(hidden_size, -1) - # stack back - qkv = torch.cat([q, k, v], dim=-1).permute(1, 0).contiguous() - z = z.permute(1, 0).contiguous() - yield (self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_QKV, bid, ".weight"), qkv) - yield (self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_GATE, bid, ".weight"), z) - else: - yield from super().modify_tensors(data_torch, name, bid) + yield from super().modify_tensors(data_torch, name, bid) @ModelBase.register("RND1") @@ -4932,7 +4798,87 @@ class Plamo2Model(TextModel): model_arch = gguf.MODEL_ARCH.PLAMO2 def set_vocab(self): - self._set_vocab_plamo() + # PLaMo 2 uses a custom tokenizer with a .jsonl file + # We need to handle this specially + tokenizer_jsonl_path = self.dir_model / "tokenizer.jsonl" + tokenizer_config_path = self.dir_model / "tokenizer_config.json" + + if not tokenizer_jsonl_path.is_file(): + raise FileNotFoundError(f"PLaMo 2 tokenizer file not found: {tokenizer_jsonl_path}") + + # Load tokenizer config + with open(tokenizer_config_path, 'r', encoding='utf-8') as f: + tokenizer_config = json.load(f) + + # Load tokens from JSONL file (actually a list format) + tokens = [] + scores = [] + toktypes = [] + + with open(tokenizer_jsonl_path, 'r', encoding='utf-8') as f: + for line_num, line in enumerate(f): + if line.strip(): + token_data = json.loads(line) + # Format: [token, score, type, ?, ?, ?, ?] + token = token_data[0].encode("utf-8") + score = float(token_data[1]) + token_type_str = token_data[2] if len(token_data) > 2 else "NORMAL" + + tokens.append(token) + scores.append(score) + + # Map token type strings to GGUF token types + if token_type_str == "UNKNOWN": + toktypes.append(gguf.TokenType.UNKNOWN) + elif token_type_str == "CONTROL": + toktypes.append(gguf.TokenType.CONTROL) + elif token_type_str == "BYTE": + toktypes.append(gguf.TokenType.BYTE) + else: + # Check for PLaMo-2 special tokens + token_str = token_data[0] + if token_str.startswith("<|plamo:") and token_str.endswith("|>"): + toktypes.append(gguf.TokenType.CONTROL) + else: + toktypes.append(gguf.TokenType.NORMAL) + + vocab_size = self.hparams["vocab_size"] + if vocab_size > len(tokens): + pad_count = vocab_size - len(tokens) + logger.debug(f"Padding vocab with {pad_count} token(s) - [PAD1] through [PAD{pad_count}]") + for i in range(1, pad_count + 1): + tokens.append(bytes(f"[PAD{i}]", encoding="utf-8")) + scores.append(-1000.0) + toktypes.append(gguf.TokenType.UNUSED) + + # Use "plamo2" tokenizer type for PLaMo-2's custom Aho-Corasick tokenizer + self.gguf_writer.add_tokenizer_model("plamo2") + self.gguf_writer.add_tokenizer_pre("default") + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_scores(scores) + self.gguf_writer.add_token_types(toktypes) + + # Add special tokens from config + if "bos_token" in tokenizer_config and tokenizer_config["bos_token"] is not None: + token_id = tokens.index(tokenizer_config["bos_token"].encode("utf-8")) + self.gguf_writer.add_bos_token_id(token_id) + if "eos_token" in tokenizer_config and tokenizer_config["eos_token"] is not None: + token_id = tokens.index(tokenizer_config["eos_token"].encode("utf-8")) + self.gguf_writer.add_eos_token_id(token_id) + if "pad_token" in tokenizer_config and tokenizer_config["pad_token"] is not None: + token_id = tokens.index(tokenizer_config["pad_token"].encode("utf-8")) + self.gguf_writer.add_pad_token_id(token_id) + if "sep_token" in tokenizer_config and tokenizer_config["sep_token"] is not None: + token_id = tokens.index(tokenizer_config["sep_token"].encode("utf-8")) + self.gguf_writer.add_sep_token_id(token_id) + if "unk_token" in tokenizer_config and tokenizer_config["unk_token"] is not None: + token_id = tokens.index(tokenizer_config["unk_token"].encode("utf-8")) + self.gguf_writer.add_unk_token_id(token_id) + + # Add <|plamo:op|> as EOT to ensure appropriate end of generation + self.gguf_writer.add_eot_token_id(4) + + self.gguf_writer.add_add_space_prefix(False) def set_gguf_parameters(self): hparams = self.hparams @@ -5020,55 +4966,6 @@ class Plamo2Model(TextModel): return [(new_name, data_torch)] -@ModelBase.register("Plamo3ForCausalLM", "PLaMo3ForCausalLM") -class Plamo3Model(TextModel): - model_arch = gguf.MODEL_ARCH.PLAMO3 - - def set_vocab(self): - self._set_vocab_plamo() - - tokenizer_config_path = self.dir_model / "tokenizer_config.json" - tokenizer_config = {} - - if tokenizer_config_path.is_file(): - with open(tokenizer_config_path, encoding="utf-8") as f: - tokenizer_config = json.load(f) - - chat_template = tokenizer_config.get("chat_template") - chat_template_jinja = self.dir_model / "chat_template.jinja" - - if chat_template_jinja.is_file(): - with open(chat_template_jinja, encoding="utf-8") as f: - chat_template = f.read() - - if chat_template: - self.gguf_writer.add_chat_template(chat_template) - - def set_gguf_parameters(self): - super().set_gguf_parameters() - self.gguf_writer.add_vocab_size(self.hparams["vocab_size"]) - if (sliding_window := self.find_hparam(["window_size", "sliding_window"], optional=True)) is not None: - self.gguf_writer.add_sliding_window(sliding_window) - self.gguf_writer.add_sliding_window_pattern(self.hparams["sliding_window_pattern"]) - - def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: - - if name.endswith(".pre_mixer_norm.weight"): - data_torch = data_torch + 1.0 - elif name.endswith(".post_mixer_norm.weight"): - data_torch = data_torch + 1.0 / 5 - elif name.endswith(".pre_mlp_norm.weight"): - data_torch = data_torch + 1.0 - elif name.endswith(".post_mlp_norm.weight"): - data_torch = data_torch + 1.0 / (5**1.5) - elif name.endswith((".mixer.q_norm.weight", ".mixer.k_norm.weight")): - data_torch = data_torch + 1.0 - elif name.endswith(".norm.weight"): - data_torch = data_torch + 1.0 - - return [(self.map_tensor_name(name), data_torch)] - - @ModelBase.register("CodeShellForCausalLM") class CodeShellModel(TextModel): model_arch = gguf.MODEL_ARCH.CODESHELL @@ -5339,14 +5236,13 @@ class BertModel(TextModel): self.gguf_writer.add_token_type_count(self.hparams.get("type_vocab_size", 1)) # convert to phantom space vocab - def phantom(tok, toktype): - if toktype == gguf.TokenType.CONTROL: + def phantom(tok): + if tok.startswith("[") and tok.endswith("]"): return tok if tok.startswith("##"): return tok[2:] return "\u2581" + tok - assert len(tokens) == len(toktypes) - tokens = list(map(phantom, tokens, toktypes)) + tokens = list(map(phantom, tokens)) # add vocab to gguf self.gguf_writer.add_tokenizer_model("bert") @@ -6075,175 +5971,7 @@ class Gemma3VisionModel(MmprojModel): return [] # skip other tensors -class ConformerAudioModel(MmprojModel): - _batch_norm_tensors: list[dict[str, Tensor]] | None = None - - @staticmethod - def is_audio_tensor(name: str): - return any(p in name for p in ["audio", "codebook", "conformer", "depth_embedding", "depthformer", "depth_linear"]) - - def tensor_force_quant(self, name, new_name, bid, n_dims): - if ConformerAudioModel.is_audio_tensor(name): - if ".conv" in name or "_conv" in name and ".weight" in name: - return gguf.GGMLQuantizationType.F32 - return super().tensor_force_quant(name, new_name, bid, n_dims) - - def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: - # fold running_mean, running_var and eps into weight and bias for batch_norm - if "batch_norm" in name: - if self._batch_norm_tensors is None: - self._batch_norm_tensors = [{} for _ in range(self.block_count)] - assert bid is not None - self._batch_norm_tensors[bid][name] = data_torch - - if len(self._batch_norm_tensors[bid]) < 5: - return [] - - weight = self._batch_norm_tensors[bid][f"conformer.layers.{bid}.conv.batch_norm.weight"] - bias = self._batch_norm_tensors[bid][f"conformer.layers.{bid}.conv.batch_norm.bias"] - running_mean = self._batch_norm_tensors[bid][f"conformer.layers.{bid}.conv.batch_norm.running_mean"] - running_var = self._batch_norm_tensors[bid][f"conformer.layers.{bid}.conv.batch_norm.running_var"] - eps = 1e-5 # default value - - a = weight / torch.sqrt(running_var + eps) - b = bias - running_mean * a - return [ - (self.map_tensor_name(f"conformer.layers.{bid}.conv.batch_norm.weight"), a), - (self.map_tensor_name(f"conformer.layers.{bid}.conv.batch_norm.bias"), b), - ] - - # reshape conv weights - if name.startswith("conformer.pre_encode.conv.") and name.endswith(".bias"): - data_torch = data_torch[:, None, None] - if "conv.depthwise_conv" in name and name.endswith(".weight"): - assert data_torch.shape[1] == 1 - data_torch = data_torch.reshape(data_torch.shape[0], data_torch.shape[2]) - if "conv.pointwise_conv" in name and name.endswith(".weight"): - assert data_torch.shape[2] == 1 - data_torch = data_torch.reshape(data_torch.shape[0], data_torch.shape[1]) - - return [(self.map_tensor_name(name), data_torch)] - - @ModelBase.register("Gemma3nForConditionalGeneration") -class Gemma3nVisionAudioModel(ConformerAudioModel): - has_audio_encoder = True - has_vision_encoder = True - - # Double indexed mapping for MobileNetV5 blocks (not supported by tensor_mapping.py) - # This is the only known model having this, so we prefer implementing it outside of tensor_mapping.py - block_tensor_mapping = { - "model.vision_tower.timm_model.blocks.{bid}.{sid}.conv_exp.weight": "v.blk.{bid}.{sid}.conv_exp.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.bn1.weight": "v.blk.{bid}.{sid}.bn1.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.conv_pwl.weight": "v.blk.{bid}.{sid}.conv_pwl.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.bn2.weight": "v.blk.{bid}.{sid}.bn2.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.dw_start.conv.weight": "v.blk.{bid}.{sid}.dw_start.conv.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.dw_start.bn.weight": "v.blk.{bid}.{sid}.dw_start.bn.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.dw_mid.conv.weight": "v.blk.{bid}.{sid}.dw_mid.conv.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.dw_mid.bn.weight": "v.blk.{bid}.{sid}.dw_mid.bn.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.pw_exp.conv.weight": "v.blk.{bid}.{sid}.pw_exp.conv.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.pw_exp.bn.weight": "v.blk.{bid}.{sid}.pw_exp.bn.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.pw_proj.conv.weight": "v.blk.{bid}.{sid}.pw_proj.conv.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.pw_proj.bn.weight": "v.blk.{bid}.{sid}.pw_proj.bn.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.layer_scale.gamma": "v.blk.{bid}.{sid}.layer_scale.gamma", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.attn.query.proj.weight": "v.blk.{bid}.{sid}.attn.query.proj.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.attn.key.proj.weight": "v.blk.{bid}.{sid}.attn.key.proj.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.attn.value.proj.weight": "v.blk.{bid}.{sid}.attn.value.proj.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.attn.output.proj.weight": "v.blk.{bid}.{sid}.attn.output.proj.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.attn.key.down_conv.weight": "v.blk.{bid}.{sid}.attn.key.down_conv.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.attn.key.norm.weight": "v.blk.{bid}.{sid}.attn.key.norm.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.attn.value.down_conv.weight": "v.blk.{bid}.{sid}.attn.value.down_conv.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.attn.value.norm.weight": "v.blk.{bid}.{sid}.attn.value.norm.weight", - "model.vision_tower.timm_model.blocks.{bid}.{sid}.norm.weight": "v.blk.{bid}.{sid}.norm.weight", - } - - def __init__(self, *args, **kwargs): - # Parent init will call find_hparam which now returns 0 for empty keys - super().__init__(*args, **kwargs) - assert self.hparams_vision is not None - self.hparams_vision["n_layers"] = 128 # fake value for audio encoder, vision encoder doesn't use it - self.hparams_vision["intermediate_size"] = self.hparams_vision.get("intermediate_size", 2048) * 4 - self.hparams_vision["num_attention_heads"] = self.hparams_vision.get("num_attention_heads", 8) - - # MobileNetV5 does not use image_mean/std - self.preprocessor_config["image_mean"] = [0.0 ,0.0 , 0.0] - self.preprocessor_config["image_std"] = [1.0 ,1.0 ,1.0] - self.hparams_vision["image_size"] = self.preprocessor_config.get( - "size", {"height": 768, "width": 768} - )["height"] - - # Image sequence length (256 tokens = 16x16 for Gemma3n) - image_seq_length = self.preprocessor_config.get("image_seq_length", 256) - image_size = self.hparams_vision["image_size"] - self.hparams_vision["patch_size"] = image_size // image_seq_length - - # remap audio hparams - assert self.hparams_audio is not None - self.hparams_audio["n_layers"] = self.hparams_audio["conf_num_hidden_layers"] - self.hparams_audio["num_attention_heads"] = self.hparams_audio["conf_num_attention_heads"] - self.hparams_audio["feat_in"] = self.hparams_audio["input_feat_size"] - self.hparams_audio["intermediate_size"] = self.hparams_audio.get("intermediate_size", 6144) - - def set_gguf_parameters(self): - super().set_gguf_parameters() - - # vision params - self.gguf_writer.add_clip_vision_projector_type(gguf.VisionProjectorType.GEMMA3NV) - self.gguf_writer.add_vision_attention_layernorm_eps(self.hparams.get("layer_norm_eps", 1e-6)) - - # audio params - assert self.hparams_audio is not None - self.gguf_writer.add_clip_audio_projector_type(gguf.VisionProjectorType.GEMMA3NA) - self.gguf_writer.add_audio_num_mel_bins(self.hparams_audio["feat_in"]) - self.gguf_writer.add_audio_attention_layernorm_eps(1e-5) - - def tensor_force_quant(self, name, new_name, bid, n_dims): - # Force quantization settings for specific tensor types - if "input_projection" in name or "input_proj" in name: - return gguf.GGMLQuantizationType.F16 - if ".embeddings." in name or "stem" in name: - return gguf.GGMLQuantizationType.F32 - return super().tensor_force_quant(name, new_name, bid, n_dims) - - def custom_map(self, name: str) -> str: - """Parses names like model.vision_tower.timm_model.blocks.1.2.suffix and applies template mapping.""" - parts = name.split(".") - # MobileNet blocks have at least 7 parts: model, vision_tower, timm_model, blocks, bid, sid, and suffix - if len(parts) >= 7: - bid, sid = parts[4], parts[5] - suffix = ".".join(parts[6:]) - template = f"model.vision_tower.timm_model.blocks.{{bid}}.{{sid}}.{suffix}" - if template in self.block_tensor_mapping: - return self.block_tensor_mapping[template].format(bid=bid, sid=sid) - - raise ValueError(f"Unknown name: {name}") - - def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: - if (ConformerAudioModel.is_audio_tensor(name)): - name = name.replace("model.audio_tower.conformer.", "conformer.layers.") - return super().modify_tensors(data_torch, name, bid) - - # Gemma3n uses - # - model.embed_vision.* for projection layers - # - model.vision_tower.* for vision encoder - # Skip non-vision tensors - if not (name.startswith("model.embed_vision.") or name.startswith("model.vision_tower.")): - return [] - - if name.startswith("model.vision_tower.timm_model.blocks."): - # Double-indexed block tensors through custom logic - new_name = self.custom_map(name) - else: - # Route non-repeating (conv_stem, msfa, embedding, etc.) and un-catched through tensor_mapping.py - new_name = self.map_tensor_name(name) - - if new_name.endswith("conv_stem.conv.bias") or new_name.endswith("layer_scale.gamma"): - data_torch = data_torch.unsqueeze(0).unsqueeze(-1).unsqueeze(-1) # [1, C, 1, 1] - - return [(new_name, data_torch)] - - -@ModelBase.register("Gemma3nForCausalLM", "Gemma3nForConditionalGeneration") class Gemma3NModel(Gemma3Model): model_arch = gguf.MODEL_ARCH.GEMMA3N norm_shift = 0.0 # same value with Gemma3p5RMSNorm scale_shift on python code @@ -6266,25 +5994,8 @@ class Gemma3NModel(Gemma3Model): ] def set_vocab(self): - # For Gemma3n multimodal models, we need the FULL vocab_size (262400) - # which includes special tokens from 262144-262399 for vision/audio. - # The vocab_size_per_layer_input (262144) is only the embedding size per layer. - # Temporarily override the hparams lookup order to prioritize vocab_size. - - # Store original vocab_size_per_layer_input if it exists - vocab_size_per_layer_input = self.hparams.get("vocab_size_per_layer_input") - - # Temporarily remove vocab_size_per_layer_input to force using vocab_size - if vocab_size_per_layer_input is not None: - del self.hparams["vocab_size_per_layer_input"] - - # Call parent set_vocab which will now use vocab_size (262400) super().set_vocab() - # Restore vocab_size_per_layer_input for later use - if vocab_size_per_layer_input is not None: - self.hparams["vocab_size_per_layer_input"] = vocab_size_per_layer_input - def set_gguf_parameters(self): super().set_gguf_parameters() self.gguf_writer.add_altup_active_idx(self.hparams["altup_active_idx"]) @@ -6320,32 +6031,8 @@ class Gemma3NModel(Gemma3Model): if "language_model." not in name: return [] # skip non-language model tensors - # Pad token embeddings for vision/audio special tokens (262144-262399) - if "embed_tokens.weight" in name or "embed_tokens_per_layer" in name: - # Move to CPU to avoid meta device issues during padding - data_torch = data_torch.to(device="cpu") - - vocab_size = self.hparams.get("vocab_size", 262400) - current_size = data_torch.shape[0] # First dimension is vocab_size - - if current_size < vocab_size: - # Pad with zeros for vision/audio tokens (they get embeddings from vision tower) - padding_size = vocab_size - current_size - tensor_type = "per-layer embeddings" if "per_layer" in name else "token embeddings" - logger.info(f"Padding {tensor_type} shape {list(data_torch.shape)} from {current_size} to {vocab_size} (adding {padding_size} vision/audio token slots)") - - # Create padding with zeros (vision tokens won't use these embeddings) - padding = torch.zeros((padding_size, data_torch.shape[1]), dtype=data_torch.dtype, device=data_torch.device) - data_torch = torch.cat([data_torch, padding], dim=0) - - # Continue with normal processing - name = name.replace("language_model.", "") - return [(self.map_tensor_name(name), data_torch)] - if "altup_unembed_projections" in name: data_torch = data_torch.to(device="cpu") - # altup_unembed matrices are [hidden_size, hidden_size], NOT vocab-based - # They should NOT be padded if ".0." in name: self._altup_unembd[0] = data_torch elif ".1." in name: @@ -6669,17 +6356,6 @@ class ARwkv7Model(Rwkv7Model): self.gguf_writer.add_head_count(0) -@ModelBase.register("MaincoderForCausalLM") -class MaincoderModel(TextModel): - model_arch = gguf.MODEL_ARCH.MAINCODER - - def set_gguf_parameters(self): - super().set_gguf_parameters() - - if (head_dim := self.hparams.get("head_dim")) is not None: - self.gguf_writer.add_rope_dimension_count(head_dim) - - @ModelBase.register("MambaForCausalLM", "MambaLMHeadModel", "FalconMambaForCausalLM") class MambaModel(TextModel): model_arch = gguf.MODEL_ARCH.MAMBA @@ -7457,8 +7133,6 @@ class DeepseekModel(TextModel): "DeepseekV2ForCausalLM", "DeepseekV3ForCausalLM", "KimiVLForConditionalGeneration", - "YoutuForCausalLM", - "YoutuVLForConditionalGeneration" ) class DeepseekV2Model(TextModel): model_arch = gguf.MODEL_ARCH.DEEPSEEK2 @@ -7525,15 +7199,7 @@ class DeepseekV2Model(TextModel): super().set_gguf_parameters() hparams = self.hparams - # first_k_dense_replace: number of leading layers using dense FFN instead of MoE - # For non-MoE models (like Youtu), set to n_layer to use dense FFN for all layers - # For MoE models (like DeepSeek-V2), this is the number of leading non-MoE layers - has_moe = hparams.get("n_routed_experts") is not None - first_k_dense_replace = hparams.get("first_k_dense_replace") - if first_k_dense_replace is None: - # Default: if no MoE, all layers are dense; if MoE, none are dense - first_k_dense_replace = hparams["num_hidden_layers"] if not has_moe else 0 - self.gguf_writer.add_leading_dense_block_count(first_k_dense_replace) + self.gguf_writer.add_leading_dense_block_count(hparams["first_k_dense_replace"]) self.gguf_writer.add_vocab_size(hparams["vocab_size"]) if "q_lora_rank" in hparams and hparams["q_lora_rank"] is not None: self.gguf_writer.add_q_lora_rank(hparams["q_lora_rank"]) @@ -7545,24 +7211,11 @@ class DeepseekV2Model(TextModel): self.gguf_writer.add_key_length_mla(hparams["qk_nope_head_dim"] + hparams["qk_rope_head_dim"]) self.gguf_writer.add_value_length_mla(hparams["v_head_dim"]) - # MoE parameters (required by C++ code for DEEPSEEK2 arch) - # For non-MoE models like Youtu, use intermediate_size as expert_feed_forward_length - moe_intermediate_size = self.find_hparam(["moe_intermediate_size", "intermediate_size"], optional=False) - self.gguf_writer.add_expert_feed_forward_length(moe_intermediate_size) - - if (n_routed_experts := hparams.get("n_routed_experts")) is not None: - self.gguf_writer.add_expert_count(n_routed_experts) - - # expert_shared_count is required by C++ code, default to 0 for non-MoE models - n_shared_experts = hparams.get("n_shared_experts", 0) - self.gguf_writer.add_expert_shared_count(n_shared_experts) - - # When not set, C++ code will use scale_w = false to skip the no-op scaling - if (routed_scaling_factor := hparams.get("routed_scaling_factor")) is not None: - self.gguf_writer.add_expert_weights_scale(routed_scaling_factor) - - if (norm_topk_prob := hparams.get("norm_topk_prob")) is not None and norm_topk_prob: - self.gguf_writer.add_expert_weights_norm(norm_topk_prob) + self.gguf_writer.add_expert_feed_forward_length(hparams["moe_intermediate_size"]) + self.gguf_writer.add_expert_count(hparams["n_routed_experts"]) + self.gguf_writer.add_expert_shared_count(hparams["n_shared_experts"]) + self.gguf_writer.add_expert_weights_scale(hparams["routed_scaling_factor"]) + self.gguf_writer.add_expert_weights_norm(hparams["norm_topk_prob"]) self.gguf_writer.add_rope_dimension_count(hparams["qk_rope_head_dim"]) @@ -7578,17 +7231,10 @@ class DeepseekV2Model(TextModel): # skip vision tensors and remove "language_model." for Kimi-VL if "vision_tower" in name or "multi_modal_projector" in name: return [] - if name.startswith("siglip2.") or name.startswith("merger."): - return [] + if name.startswith("language_model."): name = name.replace("language_model.", "") - # skip lm_head.weight if tie_word_embeddings is True - if self.hparams.get("tie_word_embeddings", False): - if name == "lm_head.weight" or name == "model.lm_head.weight": - logger.info("Skipping tied output layer 'lm_head.weight' (will use token_embd.weight)") - return [] - # rename e_score_correction_bias tensors if name.endswith("e_score_correction_bias"): name = name.replace("e_score_correction_bias", "e_score_correction.bias") @@ -7716,89 +7362,6 @@ class MiniMaxM2Model(TextModel): return super().modify_tensors(data_torch, name, bid) -@ModelBase.register("MiMoV2FlashForCausalLM") -class MimoV2Model(TextModel): - model_arch = gguf.MODEL_ARCH.MIMO2 - - def set_gguf_parameters(self): - super().set_gguf_parameters() - - assert self.hparams["swa_head_dim"] == self.hparams["head_dim"] - assert self.hparams["swa_num_attention_heads"] == self.hparams["num_attention_heads"] - assert self.hparams["swa_v_head_dim"] == self.hparams["v_head_dim"] - assert self.hparams["topk_method"] == "noaux_tc" - - n_head_kv = self.hparams["num_key_value_heads"] - n_head_kv_swa = self.hparams["swa_num_key_value_heads"] - n_head_kv_arr = [n_head_kv_swa if use_swa == 1 else n_head_kv for use_swa in self.hparams["hybrid_layer_pattern"]] - self.gguf_writer.add_head_count_kv(n_head_kv_arr) - - self.gguf_writer.add_sliding_window(self.hparams["sliding_window"]) - self.gguf_writer.add_sliding_window_pattern(self.hparams["hybrid_layer_pattern"]) - self.gguf_writer.add_value_length(self.hparams["v_head_dim"]) - self.gguf_writer.add_expert_count(self.hparams["n_routed_experts"]) - self.gguf_writer.add_expert_feed_forward_length(self.hparams["moe_intermediate_size"]) - - rope_dim = int(self.hparams["head_dim"] * self.hparams["partial_rotary_factor"]) - self.gguf_writer.add_rope_dimension_count(rope_dim) - - self.gguf_writer.add_layer_norm_rms_eps(self.hparams.get("layernorm_epsilon", 1e-5)) - - _experts: list[dict[str, Tensor]] | None = None - - def modify_tensors(self, data_torch, name, bid): - if name.endswith("e_score_correction_bias"): - name = name.replace("e_score_correction_bias", "e_score_correction.bias") - - if "attention_sink" in name and not name.endswith(".weight"): - name += ".weight" - - # TODO: mimo v2 does not indicate the number of next-token-prediction layers, therefore we cannot do the same way as GLM4_MOE - if "model.mtp." in name: - return [] - - # process the experts separately - if name.find("mlp.experts") != -1: - n_experts = self.hparams["n_routed_experts"] - assert bid is not None - - if self._experts is None: - self._experts = [{} for _ in range(self.block_count)] - - self._experts[bid][name] = data_torch - - if len(self._experts[bid]) >= n_experts * 3: - tensors: list[tuple[str, Tensor]] = [] - - # merge the experts into a single 3d tensor - for w_name in ["gate_proj", "up_proj", "down_proj"]: - datas: list[Tensor] = [] - - for xid in range(n_experts): - ename_to_retrieve = f"model.layers.{bid}.mlp.experts.{xid}.{w_name}.weight" - datas.append(self._experts[bid][ename_to_retrieve]) - del self._experts[bid][ename_to_retrieve] - - data_torch = torch.stack(datas, dim=0) - merged_name = f"model.layers.{bid}.mlp.experts.{w_name}.weight" - new_name = self.map_tensor_name(merged_name) - tensors.append((new_name, data_torch)) - - return tensors - else: - return [] - return [(self.map_tensor_name(name), data_torch)] - - def prepare_tensors(self): - super().prepare_tensors() - - if self._experts is not None: - # flatten `list[dict[str, Tensor]]` into `list[str]` - experts = [k for d in self._experts for k in d.keys()] - if len(experts) > 0: - raise ValueError(f"Unprocessed experts: {experts}") - - @ModelBase.register("PanguEmbeddedForCausalLM") class PanguEmbeddedModel(TextModel): model_arch = gguf.MODEL_ARCH.PANGU_EMBED @@ -8751,102 +8314,6 @@ class Exaone4Model(TextModel): yield (self.format_tensor_name(gguf.MODEL_TENSOR.ROPE_FREQS), torch.tensor(rope_factors, dtype=torch.float32)) -@ModelBase.register("ExaoneMoEForCausalLM") -class ExaoneMoEModel(Exaone4Model): - model_arch = gguf.MODEL_ARCH.EXAONE_MOE - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.block_count = self.hparams["num_hidden_layers"] + self.hparams.get("num_nextn_predict_layers", 0) - self.tensor_map = gguf.get_tensor_name_map(self.model_arch, self.block_count) - - def set_gguf_parameters(self): - super().set_gguf_parameters() - self.gguf_writer.add_expert_count(self.hparams["num_experts"]) - moe_intermediate_size = self.hparams["moe_intermediate_size"] - num_shared_experts = self.hparams["num_shared_experts"] - self.gguf_writer.add_expert_feed_forward_length(moe_intermediate_size) - self.gguf_writer.add_expert_shared_count(num_shared_experts) - self.gguf_writer.add_expert_shared_feed_forward_length(moe_intermediate_size * num_shared_experts) - self.gguf_writer.add_expert_weights_scale(self.hparams["routed_scaling_factor"]) - self.gguf_writer.add_expert_weights_norm(self.hparams["norm_topk_prob"]) - n_dense_layer = self.hparams.get("first_k_dense_replace", self.hparams.get("first_last_k_dense_replace", 0)) - self.gguf_writer.add_leading_dense_block_count(n_dense_layer) - self.gguf_writer.add_nextn_predict_layers(self.hparams.get("num_nextn_predict_layers", 0)) - - self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.NONE) - - _experts: list[dict[str, Tensor]] | None = None - - def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: - if name.startswith("mtp."): - if name.find("layers.") != -1: - # `mtp.layers.0.[module_name]` format - name = name.replace(f"mtp.layers.{bid}", f"model.layers.{bid + self.hparams['num_hidden_layers']}") - else: - # mtp fc/norm weights - remapper = { - "mtp.fc": "model.layers.{bid}.eh_proj", - "mtp.pre_fc_norm_embedding": "model.layers.{bid}.enorm", - "mtp.pre_fc_norm_hidden": "model.layers.{bid}.hnorm", - "mtp.norm": "model.layers.{bid}.shared_head.norm", - } - _n = Path(name) - new_name = remapper[_n.stem] + _n.suffix - - # set shared weights for all NextN/MTP layers - tensors = [] - for bid in range(self.hparams['num_hidden_layers'], self.block_count): - new_name = new_name.format(bid=bid) - tensors.append((self.map_tensor_name(new_name), data_torch)) - return tensors - - if name.endswith("e_score_correction_bias"): - name = name.replace("e_score_correction_bias", "e_score_correction.bias") - - if name.find("mlp.experts") != -1: - n_experts = self.hparams["num_experts"] - assert bid is not None - - if self._experts is None: - self._experts = [{} for _ in range(self.block_count)] - - self._experts[bid][name] = data_torch - - if len(self._experts[bid]) >= n_experts * 3: - tensors: list[tuple[str, Tensor]] = [] - - # merge the experts into a single 3d tensor - for w_name in ["down_proj", "gate_proj", "up_proj"]: - datas: list[Tensor] = [] - - for xid in range(n_experts): - ename = f"model.layers.{bid}.mlp.experts.{xid}.{w_name}.weight" - datas.append(self._experts[bid][ename]) - del self._experts[bid][ename] - - data_torch = torch.stack(datas, dim=0) - - merged_name = f"model.layers.{bid}.mlp.experts.{w_name}.weight" - - new_name = self.map_tensor_name(merged_name) - - tensors.append((new_name, data_torch)) - return tensors - else: - return [] - - return [(self.map_tensor_name(name), data_torch)] - - def prepare_tensors(self): - super().prepare_tensors() - if self._experts is not None: - # flatten `list[dict[str, Tensor]]` into `list[str]` - experts = [k for d in self._experts for k in d.keys()] - if len(experts) > 0: - raise ValueError(f"Unprocessed experts: {experts}") - - @ModelBase.register("GraniteForCausalLM") class GraniteModel(LlamaModel): """Conversion for IBM's GraniteForCausalLM""" @@ -9228,11 +8695,6 @@ class NemotronHModel(GraniteHybridModel): raise ValueError(f"Unprocessed experts: {experts}") -@ModelBase.register("LlamaBidirectionalModel") -class LlamaEmbedNemotronModel(LlamaModel): - model_arch = gguf.MODEL_ARCH.LLAMA_EMBED - - @ModelBase.register("BailingMoeForCausalLM") class BailingMoeModel(TextModel): model_arch = gguf.MODEL_ARCH.BAILINGMOE @@ -9693,19 +9155,6 @@ class VoxtralWhisperEncoderModel(WhisperEncoderModel): self.gguf_writer.add_audio_stack_factor(4) # == intermediate_size // hidden_size -@ModelBase.register("AudioFlamingo3ForConditionalGeneration") -class AudioFlamingo3WhisperEncoderModel(WhisperEncoderModel): - def set_gguf_parameters(self): - super().set_gguf_parameters() - self.gguf_writer.add_clip_projector_type(gguf.VisionProjectorType.MUSIC_FLAMINGO) - - def tensor_force_quant(self, name, new_name, bid, n_dims): - if ".conv" in name and ".weight" in name: - # Was trained in BF16, being safe, avoiding quantizing to FP16 - return gguf.GGMLQuantizationType.F32 - return super().tensor_force_quant(name, new_name, bid, n_dims) - - @ModelBase.register("FalconH1ForCausalLM") class FalconH1Model(Mamba2Model): model_arch = gguf.MODEL_ARCH.FALCON_H1 @@ -10278,7 +9727,7 @@ class LFM2Model(TextModel): self._add_feed_forward_length() def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: - if self._is_vision_tensor(name) or ConformerAudioModel.is_audio_tensor(name): + if self._is_vision_tensor(name) or self._is_audio_tensor(name): # skip multimodal tensors return [] @@ -10294,26 +9743,8 @@ class LFM2Model(TextModel): def _is_vision_tensor(self, name: str) -> bool: return "vision_tower" in name or "multi_modal_projector" in name - -@ModelBase.register("Lfm2Model") -class LFM2ColBertModel(LFM2Model): - model_arch = gguf.MODEL_ARCH.LFM2 - dense_tensor_name = "dense_2" - - def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: - if not name.startswith(self.dense_tensor_name): - name = "model." + name - - return super().modify_tensors(data_torch, name, bid) - - def generate_extra_tensors(self) -> Iterable[tuple[str, Tensor]]: - # dense tensor is stored in a separate safetensors file - from safetensors.torch import load_file - tensors_file = self.dir_model / "1_Dense" / "model.safetensors" - assert tensors_file.is_file() - tensor = load_file(tensors_file)["linear.weight"] - self.gguf_writer.add_embedding_length_out(tensor.shape[0]) - yield f"{self.dense_tensor_name}.weight", tensor.clone() + def _is_audio_tensor(self, name: str): + return any(p in name for p in ["audio", "codebook", "conformer", "depth_embedding", "depthformer", "depth_linear"]) @ModelBase.register("Lfm2MoeForCausalLM") @@ -10421,11 +9852,13 @@ class LFM2VLModel(MmprojModel): @ModelBase.register("Lfm2AudioForConditionalGeneration") -class LFM2AudioModel(ConformerAudioModel): +class LFM2AudioModel(MmprojModel): has_vision_encoder = False has_audio_encoder = True model_name = "Lfm2AudioEncoder" + _batch_norm_tensors: list[dict[str, Tensor]] | None = None + def get_audio_config(self) -> dict[str, Any] | None: return self.global_config.get("encoder") @@ -10439,7 +9872,12 @@ class LFM2AudioModel(ConformerAudioModel): self.gguf_writer.add_audio_num_mel_bins(self.hparams_audio["feat_in"]) self.gguf_writer.add_audio_attention_layernorm_eps(1e-5) - def modify_tensors(self, data_torch, name, bid): + def tensor_force_quant(self, name, new_name, bid, n_dims): + if ".conv" in name and ".weight" in name: + return gguf.GGMLQuantizationType.F32 + return super().tensor_force_quant(name, new_name, bid, n_dims) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: # skip language model tensors if name.startswith("lfm."): return [] @@ -10452,7 +9890,40 @@ class LFM2AudioModel(ConformerAudioModel): if any(p in name for p in ["codebook_offsets", "depth_embeddings", "depth_linear", "depthformer"]): return [] - return super().modify_tensors(data_torch, name, bid) + # fold running_mean, running_var and eps into weight and bias for batch_norm + if "batch_norm" in name: + if self._batch_norm_tensors is None: + self._batch_norm_tensors = [{} for _ in range(self.block_count)] + assert bid is not None + self._batch_norm_tensors[bid][name] = data_torch + + if len(self._batch_norm_tensors[bid]) < 5: + return [] + + weight = self._batch_norm_tensors[bid][f"conformer.layers.{bid}.conv.batch_norm.weight"] + bias = self._batch_norm_tensors[bid][f"conformer.layers.{bid}.conv.batch_norm.bias"] + running_mean = self._batch_norm_tensors[bid][f"conformer.layers.{bid}.conv.batch_norm.running_mean"] + running_var = self._batch_norm_tensors[bid][f"conformer.layers.{bid}.conv.batch_norm.running_var"] + eps = 1e-5 # default value + + a = weight / torch.sqrt(running_var + eps) + b = bias - running_mean * a + return [ + (self.map_tensor_name(f"conformer.layers.{bid}.conv.batch_norm.weight"), a), + (self.map_tensor_name(f"conformer.layers.{bid}.conv.batch_norm.bias"), b), + ] + + # reshape conv weights + if name.startswith("conformer.pre_encode.conv.") and name.endswith(".bias"): + data_torch = data_torch[:, None, None] + if "conv.depthwise_conv" in name and name.endswith(".weight"): + assert data_torch.shape[1] == 1 + data_torch = data_torch.reshape(data_torch.shape[0], data_torch.shape[2]) + if "conv.pointwise_conv" in name and name.endswith(".weight"): + assert data_torch.shape[2] == 1 + data_torch = data_torch.reshape(data_torch.shape[0], data_torch.shape[1]) + + return [(self.map_tensor_name(name), data_torch)] @ModelBase.register("SmallThinkerForCausalLM") @@ -10546,6 +10017,7 @@ class ModernBertModel(BertModel): self.gguf_writer.add_sliding_window(self.hparams["local_attention"]) if (sliding_window_pattern := self.hparams.get("global_attn_every_n_layers")) is not None: self.gguf_writer.add_sliding_window_pattern(sliding_window_pattern) + self.gguf_writer.add_rope_freq_base_swa(self.rope_parameters.get("sliding_attention", {"rope_theta": self.hparams.get("local_rope_theta")})["rope_theta"]) self.gguf_writer.add_rope_scaling_type(gguf.RopeScalingType.NONE) self.gguf_writer.add_vocab_size(self.hparams["vocab_size"]) @@ -10995,79 +10467,6 @@ class JanusProVisionModel(MmprojModel): return [] -@ModelBase.register("YoutuVLForConditionalGeneration") -class YoutuVLVisionModel(MmprojModel): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - assert self.hparams_vision is not None - self.hparams_vision["image_size"] = self.hparams_vision.get("image_size", 560) - - def set_gguf_parameters(self): - super().set_gguf_parameters() - - self.gguf_writer.add_clip_projector_type(gguf.VisionProjectorType.YOUTUVL) - self.gguf_writer.add_vision_attention_layernorm_eps(self.hparams.get("layer_norm_eps", 1e-6)) - - # Handle activation function - hidden_act = str(self.hparams.get("hidden_act", "gelu_pytorch_tanh")).lower() - if hidden_act in ("gelu", "gelu_pytorch_tanh", "gelu_fast", "gelu_new", "gelu_accurate"): - self.gguf_writer.add_vision_use_gelu(True) - elif hidden_act == "silu": - self.gguf_writer.add_vision_use_silu(True) - else: - raise ValueError(f"Unsupported activation function for YOUTUVL: {hidden_act}") - - self.gguf_writer.add_vision_spatial_merge_size(self.hparams.get("spatial_merge_size", 2)) - - window_size = self.hparams.get("window_size") - if window_size is not None: - self.gguf_writer.add_vision_window_size(window_size) - # fullatt_block_indexes contains explicit layer indices that use full attention - # e.g., [2, 5, 8, 11] means layers 2, 5, 8, 11 use full attention - # All other layers use window attention - fullatt_block_indexes = self.hparams.get("fullatt_block_indexes") - assert fullatt_block_indexes is not None, "fullatt_block_indexes is required for youtuvl" - # Store the explicit layer indices for YoutuVL (irregular pattern approach) - self.gguf_writer.add_vision_wa_layer_indexes(layers=fullatt_block_indexes) - - def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: - del bid # unused - - # Skip language model tensors - skip_prefixes = ('lm_head.', 'model.layers.', 'model.embed_tokens.', 'model.norm.') - if name.startswith(skip_prefixes): - return [] - - # Try to map the tensor using TensorNameMap (handles vision encoder and projector) - try: - new_name = self.map_tensor_name(name) - return [(new_name, data_torch)] - except ValueError: - # If mapping fails, log warning and skip - logger.warning(f"Cannot map tensor: {name}") - return [] - - -@ModelBase.register("SolarOpenForCausalLM") -class SolarOpenModel(Glm4MoeModel): - model_arch = gguf.MODEL_ARCH.GLM4_MOE - - def set_vocab(self): - from transformers import AutoTokenizer - tokenizer = AutoTokenizer.from_pretrained(self.dir_model) - special_vocab = gguf.SpecialVocab(self.dir_model, load_merges=True) - tokens, toktypes, tokpre = self.get_vocab_base() - self.gguf_writer.add_tokenizer_model("gpt2") - self.gguf_writer.add_tokenizer_pre(tokpre) - self.gguf_writer.add_token_list(tokens) - self.gguf_writer.add_token_types(toktypes) - special_vocab._set_special_token("eos", tokenizer.get_added_vocab()["<|endoftext|>"]) - special_vocab._set_special_token("eot", tokenizer.get_added_vocab()["<|endoftext|>"]) - special_vocab._set_special_token("unk", tokenizer.get_added_vocab()[""]) - special_vocab._set_special_token("bos", tokenizer.get_added_vocab()["<|startoftext|>"]) - special_vocab.add_to_gguf(self.gguf_writer) - - ###### CONVERSION LOGIC ###### @@ -11273,8 +10672,8 @@ def parse_args() -> argparse.Namespace: parser.add_argument( "--sentence-transformers-dense-modules", action="store_true", - help=("Whether to include sentence-transformers dense modules. " - "It can be used for sentence-transformers models, like google/embeddinggemma-300m. " + help=("Whether to include sentence-transformers dense modules." + "It can be used for sentence-transformers models, like google/embeddinggemma-300m" "Default these modules are not included.") ) diff --git a/convert_hf_to_gguf_update.py b/convert_hf_to_gguf_update.py index aa9843e..4378378 100755 --- a/convert_hf_to_gguf_update.py +++ b/convert_hf_to_gguf_update.py @@ -145,9 +145,6 @@ models = [ {"name": "granite-docling", "tokt": TOKENIZER_TYPE.BPE, "repo": "https://huggingface.co/ibm-granite/granite-docling-258M", }, {"name": "minimax-m2", "tokt": TOKENIZER_TYPE.BPE, "repo": "https://huggingface.co/MiniMaxAI/MiniMax-M2", }, {"name": "kormo", "tokt": TOKENIZER_TYPE.BPE, "repo": "https://huggingface.co/KORMo-Team/KORMo-tokenizer", }, - {"name": "youtu", "tokt": TOKENIZER_TYPE.BPE, "repo": "https://huggingface.co/tencent/Youtu-LLM-2B", }, - {"name": "solar-open", "tokt": TOKENIZER_TYPE.BPE, "repo": "https://huggingface.co/upstage/Solar-Open-100B", }, - {"name": "exaone-moe", "tokt": TOKENIZER_TYPE.BPE, "repo": "https://huggingface.co/LGAI-EXAONE/K-EXAONE-236B-A23B", }, ] # some models are known to be broken upstream, so we will skip them as exceptions @@ -168,8 +165,6 @@ pre_computed_hashes = [ {"name": "kimi-k2", "tokt": TOKENIZER_TYPE.BPE, "repo": "https://huggingface.co/moonshotai/Kimi-K2-Base", "chkhsh": "81212dc7cdb7e0c1074ca62c5aeab0d43c9f52b8a737be7b12a777c953027890"}, {"name": "qwen2", "tokt": TOKENIZER_TYPE.BPE, "repo": "https://huggingface.co/Qwen/Qwen3-Embedding-0.6B", "chkhsh": "d4540891389ea895b53b399da6ac824becc30f2fba0e9ddbb98f92e55ca0e97c"}, {"name": "grok-2", "tokt": TOKENIZER_TYPE.BPE, "repo": "https://huggingface.co/alvarobartt/grok-2-tokenizer", "chkhsh": "66b8d4e19ab16c3bfd89bce5d785fb7e0155e8648708a1f42077cb9fe002c273"}, - # jina-v2-de variants - {"name": "jina-v2-de", "tokt": TOKENIZER_TYPE.BPE, "repo": "https://huggingface.co/aari1995/German_Semantic_V3", "chkhsh": "b3d1dd861f1d4c5c0d2569ce36baf3f90fe8a102db3de50dd71ff860d91be3df"}, ] diff --git a/docs/backend/CANN.md b/docs/backend/CANN.md index b03c2a1..37dcfae 100755 --- a/docs/backend/CANN.md +++ b/docs/backend/CANN.md @@ -327,7 +327,3 @@ Maximum number of compiled CANN graphs kept in the LRU cache, default is 12. Whe ### GGML_CANN_PREFILL_USE_GRAPH Enable ACL graph execution during the prefill stage, default is false. This option is only effective when FA is enabled. - -### GGML_CANN_OPERATOR_FUSION - -Enable operator fusion during computation, default is false. This option fuses compatible operators (e.g., ADD + RMS_NORM) to reduce overhead and improve performance. diff --git a/docs/backend/OPENCL.md b/docs/backend/OPENCL.md index 0561a74..e52baff 100644 --- a/docs/backend/OPENCL.md +++ b/docs/backend/OPENCL.md @@ -17,7 +17,7 @@ OpenCL (Open Computing Language) is an open, royalty-free standard for cross-pla ### Llama.cpp + OpenCL -The llama.cpp OpenCL backend is designed to enable llama.cpp on **Qualcomm Adreno GPU** firstly via OpenCL. Thanks to the portabilty of OpenCL, the OpenCL backend can also run on certain Intel GPUs such as those that do not have [SYCL](/docs/backend/SYCL.md) support although the performance is not optimal. +The llama.cpp OpenCL backend is designed to enable llama.cpp on **Qualcomm Adreno GPU** firstly via OpenCL. Thanks to the portabilty of OpenCL, the OpenCL backend can also run on certain Intel GPUs although the performance is not optimal. ## OS @@ -218,56 +218,6 @@ cmake .. -G Ninja ` ninja ``` -## Linux - -The two steps just above also apply to Linux. When building for linux, the commands are mostly the same as those for PowerShell on Windows, but in the second step they do not have the `-DCMAKE_TOOLCHAIN_FILE` parameter, and then in both steps the backticks are replaced with back slashes. - -If not installed already, install Git, CMake, Clang, Ninja and Python, then run in the terminal the following: - -### I. Setup Environment - -1. **Install OpenCL Headers and Library** - -```bash -mkdir -p ~/dev/llm - -cd ~/dev/llm -git clone https://github.com/KhronosGroup/OpenCL-Headers && cd OpenCL-Headers -mkdir build && cd build -cmake .. -G Ninja \ - -DBUILD_TESTING=OFF \ - -DOPENCL_HEADERS_BUILD_TESTING=OFF \ - -DOPENCL_HEADERS_BUILD_CXX_TESTS=OFF \ - -DCMAKE_INSTALL_PREFIX="$HOME/dev/llm/opencl" -cmake --build . --target install - -cd ~/dev/llm -git clone https://github.com/KhronosGroup/OpenCL-ICD-Loader && cd OpenCL-ICD-Loader -mkdir build && cd build -cmake .. -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_PREFIX_PATH="$HOME/dev/llm/opencl" \ - -DCMAKE_INSTALL_PREFIX="$HOME/dev/llm/opencl" -cmake --build . --target install -``` - -### II. Build llama.cpp - -```bash -mkdir -p ~/dev/llm -cd ~/dev/llm - -git clone https://github.com/ggml-org/llama.cpp && cd llama.cpp -mkdir build && cd build - -cmake .. -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_PREFIX_PATH="$HOME/dev/llm/opencl" \ - -DBUILD_SHARED_LIBS=OFF \ - -DGGML_OPENCL=ON -ninja -``` - ## Known Issues - Flash attention does not always improve performance. diff --git a/docs/backend/SYCL.md b/docs/backend/SYCL.md index bcb3ce6..f44458e 100644 --- a/docs/backend/SYCL.md +++ b/docs/backend/SYCL.md @@ -829,7 +829,7 @@ use 1 SYCL GPUs: [0] with Max compute units:512 No. We can't support Ollama issue directly, because we aren't familiar with Ollama. - Suggest reproducing on llama.cpp and report similar issue to llama.cpp. We will support it. + Sugguest reproducing on llama.cpp and report similar issue to llama.cpp. We will surpport it. It's same for other projects including llama.cpp SYCL backend. diff --git a/docs/backend/hexagon/CMakeUserPresets.json b/docs/backend/hexagon/CMakeUserPresets.json index 1f2676c..98d7221 100644 --- a/docs/backend/hexagon/CMakeUserPresets.json +++ b/docs/backend/hexagon/CMakeUserPresets.json @@ -1,4 +1,4 @@ -{ +{ "version": 4, "configurePresets": [ { @@ -23,7 +23,7 @@ "GGML_OPENCL": "ON", "GGML_HEXAGON": "ON", "GGML_HEXAGON_FP32_QUANTIZE_GROUP_SIZE": "128", - "LLAMA_OPENSSL": "OFF" + "LLAMA_CURL": "OFF" } }, @@ -38,7 +38,7 @@ "GGML_OPENCL": "ON", "GGML_HEXAGON": "ON", "GGML_HEXAGON_FP32_QUANTIZE_GROUP_SIZE": "128", - "LLAMA_OPENSSL": "OFF" + "LLAMA_CURL": "OFF" } }, diff --git a/docs/backend/hexagon/README.md b/docs/backend/hexagon/README.md index 3befdf7..85f136e 100644 --- a/docs/backend/hexagon/README.md +++ b/docs/backend/hexagon/README.md @@ -106,7 +106,7 @@ Here are some examples of running various llama.cpp tools via ADB. Simple question for Llama-3.2-1B ``` -~/src/llama.cpp$ M=Llama-3.2-1B-Instruct-Q4_0.gguf D=HTP0 ./scripts/snapdragon/adb/run-completion.sh -p "what is the most popular cookie in the world?" +~/src/llama.cpp$ M=Llama-3.2-1B-Instruct-Q4_0.gguf D=HTP0 ./scripts/snapdragon/adb/run-cli.sh -no-cnv -p "what is the most popular cookie in the world?" ... ggml-hex: Hexagon backend (experimental) : allocating new registry : ndev 1 ggml-hex: Hexagon Arch version v79 @@ -136,7 +136,7 @@ llama_memory_breakdown_print: | - HTP0-REPACK | 504 = Summary request for OLMoE-1B-7B. This is a large model that requires two HTP sessions/devices ``` -~/src/llama.cpp$ M=OLMoE-1B-7B-0125-Instruct-Q4_0.gguf NDEV=2 D=HTP0,HTP1 ./scripts/snapdragon/adb/run-completion.sh -f surfing.txt +~/src/llama.cpp$ M=OLMoE-1B-7B-0125-Instruct-Q4_0.gguf NDEV=2 D=HTP0,HTP1 ./scripts/snapdragon/adb/run-cli.sh -f surfing.txt -no-cnv ... ggml-hex: Hexagon backend (experimental) : allocating new registry : ndev 1 ggml-hex: Hexagon Arch version v81 @@ -210,10 +210,6 @@ build: 6a8cf8914 (6733) Controls whether the Hexagon backend allocates host buffers. By default, all buffers except for REPACK are host buffers. This option is required for testing Ops that require REPACK buffers (MUL_MAT and MUL_MAT_ID). -- `GGML_HEXAGON_EXPERIMENTAL=1` - Controls whether the Hexagon backend enables experimental features. - This option is required for enabling/testing experimental Ops (FLASH_ATTN_EXT). - - `GGML_HEXAGON_VERBOSE=1` Enables verbose logging of Ops from the backend. Example output: @@ -238,6 +234,6 @@ build: 6a8cf8914 (6733) Examples: - `GGML_HEXAGON_OPMASK=0x1 llama-completion ...` - Ops are enqueued but NPU-side processing is stubbed out - `GGML_HEXAGON_OPMASK=0x3 llama-completion ...` - NPU performs dynamic quantization and skips the rest - `GGML_HEXAGON_OPMASK=0x7 llama-completion ...` - Full queuing and processing of Ops (default) + `GGML_HEXAGON_OPMASK=0x1 llama-cli ...` - Ops are enqueued but NPU-side processing is stubbed out + `GGML_HEXAGON_OPMASK=0x3 llama-cli ...` - NPU performs dynamic quantization and skips the rest + `GGML_HEXAGON_OPMASK=0x7 llama-cli ...` - Full queuing and processing of Ops (default) diff --git a/docs/backend/hexagon/developer.md b/docs/backend/hexagon/developer.md index fc4d160..200a7aa 100644 --- a/docs/backend/hexagon/developer.md +++ b/docs/backend/hexagon/developer.md @@ -49,7 +49,7 @@ Each Hexagon device behaves like a GPU from the offload and model splitting pers Here is an example of running GPT-OSS-20B model on a newer Snapdragon device with 16GB of DDR. ``` -M=gpt-oss-20b-Q4_0.gguf NDEV=4 D=HTP0,HTP1,HTP2,HTP3 P=surfing.txt scripts/snapdragon/adb/run-completion.sh -f surfing.txt -n 32 +M=gpt-oss-20b-Q4_0.gguf NDEV=4 D=HTP0,HTP1,HTP2,HTP3 P=surfing.txt scripts/snapdragon/adb/run-cli.sh -no-cnv -f surfing.txt -n 32 ... LD_LIBRARY_PATH=/data/local/tmp/llama.cpp/lib ADSP_LIBRARY_PATH=/data/local/tmp/llama.cpp/lib diff --git a/docs/build-riscv64-spacemit.md b/docs/build-riscv64-spacemit.md index cd6bbe1..79bd4de 100644 --- a/docs/build-riscv64-spacemit.md +++ b/docs/build-riscv64-spacemit.md @@ -15,7 +15,7 @@ Below is the build script: it requires utilizing RISC-V vector instructions for cmake -B build \ -DCMAKE_BUILD_TYPE=Release \ -DGGML_CPU_RISCV64_SPACEMIT=ON \ - -DLLAMA_OPENSSL=OFF \ + -DLLAMA_CURL=OFF \ -DGGML_RVV=ON \ -DGGML_RV_ZFH=ON \ -DGGML_RV_ZICBOP=ON \ diff --git a/docs/build.md b/docs/build.md index fce9361..4a69117 100644 --- a/docs/build.md +++ b/docs/build.md @@ -65,10 +65,10 @@ cmake --build build --config Release cmake --preset x64-windows-llvm-release cmake --build build-x64-windows-llvm-release ``` -- If you want HTTPS/TLS features, you may install OpenSSL development libraries. If not installed, the project will build and run without SSL support. - - **Debian / Ubuntu:** `sudo apt-get install libssl-dev` - - **Fedora / RHEL / Rocky / Alma:** `sudo dnf install openssl-devel` - - **Arch / Manjaro:** `sudo pacman -S openssl` +- Curl usage is enabled by default and can be turned off with `-DLLAMA_CURL=OFF`. Otherwise you need to install development libraries for libcurl. + - **Debian / Ubuntu:** `sudo apt-get install libcurl4-openssl-dev` # (or `libcurl4-gnutls-dev` if you prefer GnuTLS) + - **Fedora / RHEL / Rocky / Alma:** `sudo dnf install libcurl-devel` + - **Arch / Manjaro:** `sudo pacman -S curl` # includes libcurl headers ## BLAS Build @@ -150,38 +150,19 @@ We also have a [guide](./backend/CUDA-FEDORA.md) for setting up CUDA toolkit in ### Compilation - -Make sure to read the notes about the CPU build for general instructions for e.g. speeding up the compilation. - ```bash cmake -B build -DGGML_CUDA=ON cmake --build build --config Release ``` -### Non-Native Builds - -By default llama.cpp will be built for the hardware that is connected to the system at that time. -For a build covering all CUDA GPUs, disable `GGML_NATIVE`: - -```bash -cmake -B build -DGGML_CUDA=ON -DGGML_NATIVE=OFF -``` - -The resulting binary should run on all CUDA GPUs with optimal performance, though some just-in-time compilation may be required. - ### Override Compute Capability Specifications -If `nvcc` cannot detect your gpu, you may get compile warnings such as: +If `nvcc` cannot detect your gpu, you may get compile-warnings such as: ```text nvcc warning : Cannot find valid GPU for '-arch=native', default arch is used ``` -One option is to do a non-native build as described above. -However, this will result in a large binary that takes a long time to compile. -Alternatively it is also possible to explicitly specify CUDA architectures. -This may also make sense for a non-native build, for that one should look at the logic in `ggml/src/ggml-cuda/CMakeLists.txt` as a starting point. - -To override the default CUDA architectures: +To override the `native` GPU detection: #### 1. Take note of the `Compute Capability` of your NVIDIA devices: ["CUDA: Your GPU Compute > Capability"](https://developer.nvidia.com/cuda-gpus). diff --git a/docs/ops.md b/docs/ops.md index fa3fb4f..b395d23 100644 --- a/docs/ops.md +++ b/docs/ops.md @@ -22,7 +22,7 @@ Legend: | ARANGE | ❌ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | | ARGMAX | ❌ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | | ARGSORT | ❌ | ✅ | ✅ | ✅ | ✅ | 🟡 | 🟡 | ✅ | ❌ | ❌ | ❌ | -| CEIL | ❌ | ❌ | ✅ | 🟡 | ❌ | ❌ | 🟡 | 🟡 | ✅ | ❌ | ❌ | +| CEIL | ❌ | ❌ | ✅ | 🟡 | ❌ | ❌ | 🟡 | 🟡 | ❌ | ❌ | ❌ | | CLAMP | ❌ | ✅ | ✅ | ✅ | 🟡 | 🟡 | ✅ | 🟡 | ❌ | ❌ | ❌ | | CONCAT | ❌ | ✅ | ✅ | 🟡 | ✅ | 🟡 | ✅ | ✅ | ❌ | ❌ | ❌ | | CONT | ❌ | 🟡 | ✅ | ✅ | ✅ | 🟡 | 🟡 | ✅ | 🟡 | ❌ | ❌ | @@ -32,7 +32,7 @@ Legend: | CONV_TRANSPOSE_1D | ❌ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | | CONV_TRANSPOSE_2D | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | | COS | ❌ | ✅ | ✅ | ✅ | 🟡 | ❌ | ✅ | 🟡 | ❌ | ❌ | ❌ | -| COUNT_EQUAL | ❌ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | +| COUNT_EQUAL | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | | CPY | ❌ | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | ❌ | ❌ | | CROSS_ENTROPY_LOSS | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | CROSS_ENTROPY_LOSS_BACK | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | @@ -57,6 +57,7 @@ Legend: | GET_ROWS | ❌ | 🟡 | ✅ | 🟡 | ✅ | 🟡 | 🟡 | 🟡 | 🟡 | ❌ | ❌ | | GET_ROWS_BACK | ❌ | ❌ | 🟡 | 🟡 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | GROUP_NORM | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | +| GROUP_NORM_MUL_ADD | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | HARDSIGMOID | ❌ | ✅ | ✅ | 🟡 | 🟡 | ❌ | ✅ | 🟡 | ✅ | ❌ | ❌ | | HARDSWISH | ❌ | ✅ | ✅ | 🟡 | 🟡 | ❌ | ✅ | 🟡 | ✅ | ❌ | ❌ | | IM2COL | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | @@ -70,9 +71,10 @@ Legend: | MUL_MAT_ID | ❌ | 🟡 | ✅ | ✅ | ✅ | 🟡 | 🟡 | ✅ | ❌ | ❌ | ❌ | | NEG | ❌ | ✅ | ✅ | 🟡 | 🟡 | ❌ | ✅ | 🟡 | ✅ | ❌ | ❌ | | NORM | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 🟡 | ❌ | ❌ | ❌ | +| NORM_MUL_ADD | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | OPT_STEP_ADAMW | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | | OPT_STEP_SGD | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | -| OUT_PROD | 🟡 | ❌ | 🟡 | 🟡 | ❌ | ❌ | 🟡 | ❌ | ❌ | ❌ | 🟡 | +| OUT_PROD | 🟡 | ❌ | 🟡 | 🟡 | ❌ | ❌ | 🟡 | ❌ | ❌ | ❌ | ❌ | | PAD | ❌ | ✅ | ✅ | 🟡 | 🟡 | 🟡 | 🟡 | ✅ | ❌ | ❌ | ❌ | | PAD_REFLECT_1D | ❌ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | | POOL_2D | ❌ | 🟡 | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | @@ -97,6 +99,7 @@ Legend: | SILU | ❌ | ✅ | ✅ | 🟡 | 🟡 | 🟡 | ✅ | 🟡 | ✅ | ❌ | ❌ | | SILU_BACK | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | | SIN | ❌ | ✅ | ✅ | ✅ | 🟡 | ❌ | ✅ | 🟡 | ❌ | ❌ | ❌ | +| SOFTCAP | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | SOFTPLUS | ❌ | ❌ | ✅ | 🟡 | 🟡 | ❌ | ❌ | 🟡 | ❌ | ❌ | ❌ | | SOFT_MAX | ❌ | 🟡 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | | SOFT_MAX_BACK | ❌ | ❌ | 🟡 | 🟡 | ❌ | ❌ | 🟡 | ✅ | ❌ | ❌ | ❌ | diff --git a/docs/ops/BLAS.csv b/docs/ops/BLAS.csv index 3af7245..0b7042a 100644 --- a/docs/ops/BLAS.csv +++ b/docs/ops/BLAS.csv @@ -965,7 +965,6 @@ "BLAS","IM2COL","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[12,12,1,2560],ne_kernel=[3,3,1,2560],s0=1,s1=1,p0=1,p1=1,d0=1,d1=1,is_2D=1","support","0","no","BLAS" "BLAS","IM2COL","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[12,12,2,2560],ne_kernel=[3,3,2,2560],s0=1,s1=1,p0=1,p1=1,d0=1,d1=1,is_2D=1","support","0","no","BLAS" "BLAS","IM2COL","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[5,5,1,32],ne_kernel=[3,4,1,32],s0=1,s1=1,p0=0,p1=0,d0=1,d1=1,is_2D=1","support","0","no","BLAS" -"BLAS","IM2COL","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[2,2,1536,729],ne_kernel=[2,2,1536,4096],s0=1,s1=1,p0=0,p1=0,d0=1,d1=1,is_2D=1","support","0","no","BLAS" "BLAS","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[10,10,10,9],ne_kernel=[3,3,3,1],IC=3,s0=1,s1=1,s2=1,p0=1,p1=1,p2=1,d0=1,d1=1,d2=1,v=0","support","0","no","BLAS" "BLAS","IM2COL_3D","type_input=f32,type_kernel=f16,dst_type=f32,ne_input=[10,10,10,9],ne_kernel=[3,3,3,1],IC=3,s0=1,s1=1,s2=1,p0=1,p1=1,p2=1,d0=1,d1=1,d2=1,v=0","support","0","no","BLAS" "BLAS","IM2COL_3D","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[10,10,10,9],ne_kernel=[3,3,3,1],IC=3,s0=1,s1=1,s2=1,p0=1,p1=1,p2=1,d0=1,d1=1,d2=1,v=0","support","0","no","BLAS" @@ -4965,7 +4964,6 @@ "BLAS","CONV_TRANSPOSE_1D","ne_input=[2,1,1,1],ne_kernel=[3,1,1,1],s0=1,p0=0,d0=1","support","0","no","BLAS" "BLAS","CONV_TRANSPOSE_2D","ne_input=[3,2,3,1],ne_kernel=[2,2,1,3],stride=1","support","0","no","BLAS" "BLAS","CONV_TRANSPOSE_2D","ne_input=[10,10,9,1],ne_kernel=[3,3,1,9],stride=2","support","0","no","BLAS" -"BLAS","CONV_TRANSPOSE_2D","ne_input=[129,63,35,1],ne_kernel=[3,3,48,35],stride=1","support","0","no","BLAS" "BLAS","COUNT_EQUAL","type=f32,ne=[4,500,1,1]","support","0","no","BLAS" "BLAS","COUNT_EQUAL","type=f32,ne=[4,5000,1,1]","support","0","no","BLAS" "BLAS","ARGMAX","type=f32,ne=[32,1,1,1]","support","0","no","BLAS" @@ -5717,15 +5715,15 @@ "BLAS","L2_NORM","type=f32,ne=[64,5,4,3]","support","0","no","BLAS" "BLAS","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000001,inplace=1","support","0","no","BLAS" "BLAS","L2_NORM","type=f32,ne=[64,5,4,3]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[3,1024,1,1],ne_b=[3,1024,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[6,1024,1,1],ne_b=[3,1024,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[3,1024,4,1],ne_b=[3,1024,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[3,1536,1,1],ne_b=[3,1536,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[6,1536,1,1],ne_b=[3,1536,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[3,1536,4,1],ne_b=[3,1536,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[3,2048,1,1],ne_b=[3,2048,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[6,2048,1,1],ne_b=[3,2048,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[3,2048,4,1],ne_b=[3,2048,1,1]","support","0","no","BLAS" +"BLAS","SSM_CONV","type=f32,ne_a=[4,1024,1,1],ne_b=[3,1024,1,1]","support","0","no","BLAS" +"BLAS","SSM_CONV","type=f32,ne_a=[8,1024,1,1],ne_b=[3,1024,1,1]","support","0","no","BLAS" +"BLAS","SSM_CONV","type=f32,ne_a=[4,1024,4,1],ne_b=[3,1024,1,1]","support","0","no","BLAS" +"BLAS","SSM_CONV","type=f32,ne_a=[4,1536,1,1],ne_b=[3,1536,1,1]","support","0","no","BLAS" +"BLAS","SSM_CONV","type=f32,ne_a=[8,1536,1,1],ne_b=[3,1536,1,1]","support","0","no","BLAS" +"BLAS","SSM_CONV","type=f32,ne_a=[4,1536,4,1],ne_b=[3,1536,1,1]","support","0","no","BLAS" +"BLAS","SSM_CONV","type=f32,ne_a=[4,2048,1,1],ne_b=[3,2048,1,1]","support","0","no","BLAS" +"BLAS","SSM_CONV","type=f32,ne_a=[8,2048,1,1],ne_b=[3,2048,1,1]","support","0","no","BLAS" +"BLAS","SSM_CONV","type=f32,ne_a=[4,2048,4,1],ne_b=[3,2048,1,1]","support","0","no","BLAS" "BLAS","SSM_CONV","type=f32,ne_a=[4,1024,1,1],ne_b=[4,1024,1,1]","support","0","no","BLAS" "BLAS","SSM_CONV","type=f32,ne_a=[8,1024,1,1],ne_b=[4,1024,1,1]","support","0","no","BLAS" "BLAS","SSM_CONV","type=f32,ne_a=[4,1024,4,1],ne_b=[4,1024,1,1]","support","0","no","BLAS" @@ -5735,15 +5733,6 @@ "BLAS","SSM_CONV","type=f32,ne_a=[4,2048,1,1],ne_b=[4,2048,1,1]","support","0","no","BLAS" "BLAS","SSM_CONV","type=f32,ne_a=[8,2048,1,1],ne_b=[4,2048,1,1]","support","0","no","BLAS" "BLAS","SSM_CONV","type=f32,ne_a=[4,2048,4,1],ne_b=[4,2048,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[9,1024,1,1],ne_b=[9,1024,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[18,1024,1,1],ne_b=[9,1024,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[9,1024,4,1],ne_b=[9,1024,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[9,1536,1,1],ne_b=[9,1536,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[18,1536,1,1],ne_b=[9,1536,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[9,1536,4,1],ne_b=[9,1536,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[9,2048,1,1],ne_b=[9,2048,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[18,2048,1,1],ne_b=[9,2048,1,1]","support","0","no","BLAS" -"BLAS","SSM_CONV","type=f32,ne_a=[9,2048,4,1],ne_b=[9,2048,1,1]","support","0","no","BLAS" "BLAS","SSM_SCAN","type=f32,d_state=16,head_dim=1,n_head=1024,n_group=1,n_seq_tokens=32,n_seqs=4","support","0","no","BLAS" "BLAS","SSM_SCAN","type=f32,d_state=128,head_dim=64,n_head=16,n_group=2,n_seq_tokens=32,n_seqs=4","support","0","no","BLAS" "BLAS","SSM_SCAN","type=f32,d_state=256,head_dim=64,n_head=8,n_group=2,n_seq_tokens=32,n_seqs=4","support","0","no","BLAS" @@ -6603,30 +6592,6 @@ "BLAS","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=67,bs=[1,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","BLAS" "BLAS","MUL_MAT","type_a=f32,type_b=f32,m=64,n=77,k=77,bs=[12,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","BLAS" "BLAS","MUL_MAT","type_a=q4_0,type_b=f32,m=576,n=512,k=576,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","BLAS" -"BLAS","MUL_MAT","type_a=q4_0,type_b=f32,m=1,n=2048,k=8192,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=f32,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=f16,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=bf16,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=q4_0,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=q4_1,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=q5_0,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=q5_1,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=q8_0,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=mxfp4,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=q2_K,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=q3_K,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=q4_K,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=q5_K,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=q6_K,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=iq2_xs,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=iq2_s,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=iq1_s,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=iq1_m,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=iq4_nl,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=iq3_s,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" -"BLAS","MUL_MAT","type_a=iq4_xs,type_b=f32,m=1,n=64,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","BLAS" "BLAS","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[1,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","BLAS" "BLAS","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=2112,o=1","support","0","no","BLAS" "BLAS","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[1,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","BLAS" @@ -8951,11 +8916,6 @@ "BLAS","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","BLAS" "BLAS","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","BLAS" "BLAS","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","BLAS" -"BLAS","SOFT_MAX","type=f32,ne=[200001,2,3,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","BLAS" -"BLAS","SOFT_MAX","type=f32,ne=[200001,2,3,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","BLAS" -"BLAS","SOFT_MAX","type=f32,ne=[200000,1,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","BLAS" -"BLAS","SOFT_MAX","type=f32,ne=[200000,4,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","BLAS" -"BLAS","SOFT_MAX","type=f32,ne=[643251,3,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","BLAS" "BLAS","SOFT_MAX_BACK","type=f32,ne=[16,16,1,1],scale=1.000000,max_bias=0.000000","support","0","no","BLAS" "BLAS","SOFT_MAX_BACK","type=f32,ne=[15,15,1,1],scale=1.000000,max_bias=0.000000","support","0","no","BLAS" "BLAS","SOFT_MAX_BACK","type=f32,ne=[16,16,2,3],scale=1.000000,max_bias=0.000000","support","0","no","BLAS" @@ -9008,7 +8968,6 @@ "BLAS","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" -"BLAS","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" @@ -9018,7 +8977,6 @@ "BLAS","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" -"BLAS","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" @@ -9029,13 +8987,11 @@ "BLAS","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" -"BLAS","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" -"BLAS","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" @@ -9045,7 +9001,6 @@ "BLAS","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" -"BLAS","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" @@ -9056,13 +9011,11 @@ "BLAS","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" -"BLAS","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" -"BLAS","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" @@ -9072,7 +9025,6 @@ "BLAS","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" -"BLAS","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" @@ -9083,13 +9035,11 @@ "BLAS","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" -"BLAS","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" -"BLAS","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" @@ -9099,7 +9049,6 @@ "BLAS","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" -"BLAS","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" @@ -9110,7 +9059,6 @@ "BLAS","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" -"BLAS","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" @@ -9236,7 +9184,6 @@ "BLAS","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" -"BLAS","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" @@ -9246,7 +9193,6 @@ "BLAS","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" -"BLAS","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" @@ -9257,13 +9203,11 @@ "BLAS","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" -"BLAS","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" -"BLAS","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" @@ -9273,7 +9217,6 @@ "BLAS","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" -"BLAS","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" @@ -9284,13 +9227,11 @@ "BLAS","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" -"BLAS","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" -"BLAS","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" @@ -9300,7 +9241,6 @@ "BLAS","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" -"BLAS","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" @@ -9311,13 +9251,11 @@ "BLAS","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" -"BLAS","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" -"BLAS","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" @@ -9327,7 +9265,6 @@ "BLAS","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" -"BLAS","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" @@ -9338,7 +9275,6 @@ "BLAS","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" -"BLAS","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" "BLAS","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","BLAS" @@ -9606,333 +9542,333 @@ "BLAS","ARGSORT","type=f32,ne=[2048,2,1,3],order=1","support","0","no","BLAS" "BLAS","ARGSORT","type=f32,ne=[2049,2,1,3],order=1","support","0","no","BLAS" "BLAS","ARGSORT","type=f32,ne=[2,8,8192,1],order=1","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[12,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[13,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[13,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[15,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[15,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[15,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[19,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[19,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[19,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[19,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[27,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[27,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[27,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[27,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[27,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[43,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[43,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[43,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[43,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[43,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[64,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[75,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[64,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[75,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[64,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[75,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[64,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[75,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[64,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[75,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[128,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[139,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[128,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[139,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[128,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[139,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[128,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[139,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[128,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[139,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[128,1,1,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[139,1,2,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[256,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[267,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[256,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[267,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[256,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[267,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[256,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[267,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[256,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[267,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[256,1,1,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[267,1,2,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[512,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[523,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[512,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[523,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[512,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[523,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[512,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[523,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[512,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[523,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[512,1,1,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[523,1,2,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[512,1,1,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[523,1,2,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=9999,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=9999,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=9999,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=9999,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=9999,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=9999,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=9999,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=9999,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=9999,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=9999,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=100,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=500,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=1023,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=9999,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=9999,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16,10,10,10],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[60,10,10,10],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1023,2,1,3],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1024,2,1,3],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1025,2,1,3],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2047,2,1,3],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2048,2,1,3],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2049,2,1,3],k=1,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16,10,10,10],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[60,10,10,10],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1023,2,1,3],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1024,2,1,3],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1025,2,1,3],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2047,2,1,3],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2048,2,1,3],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2049,2,1,3],k=2,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16,10,10,10],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[60,10,10,10],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1023,2,1,3],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1024,2,1,3],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1025,2,1,3],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2047,2,1,3],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2048,2,1,3],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2049,2,1,3],k=3,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16,10,10,10],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[60,10,10,10],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1023,2,1,3],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1024,2,1,3],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1025,2,1,3],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2047,2,1,3],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2048,2,1,3],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2049,2,1,3],k=7,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16,10,10,10],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[60,10,10,10],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1023,2,1,3],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1024,2,1,3],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[1025,2,1,3],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2047,2,1,3],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2048,2,1,3],k=15,ties=0","support","0","no","BLAS" -"BLAS","TOP_K","type=f32,ne=[2049,2,1,3],k=15,ties=0","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[12,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[13,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[13,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[15,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[15,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[15,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[19,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[19,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[19,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[19,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[27,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[27,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[27,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[27,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[27,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[43,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[43,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[43,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[43,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[43,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[64,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[75,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[64,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[75,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[64,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[75,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[64,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[75,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[64,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[75,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[128,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[139,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[128,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[139,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[128,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[139,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[128,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[139,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[128,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[139,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[128,1,1,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[139,1,2,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[256,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[267,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[256,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[267,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[256,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[267,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[256,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[267,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[256,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[267,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[256,1,1,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[267,1,2,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[512,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[523,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[512,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[523,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[512,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[523,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[512,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[523,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[512,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[523,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[512,1,1,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[523,1,2,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[512,1,1,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[523,1,2,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1024,1,1,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1035,1,2,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2048,1,1,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2059,1,2,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4096,1,1,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[4107,1,2,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8192,1,1,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[8203,1,2,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=9999","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16395,1,2,1],k=9999","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32768,1,1,1],k=9999","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[32779,1,2,1],k=9999","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65536,1,1,1],k=9999","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[65547,1,2,1],k=9999","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131072,1,1,1],k=9999","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[131083,1,2,1],k=9999","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262144,1,1,1],k=9999","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[262155,1,2,1],k=9999","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=100","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=500","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=1023","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524288,1,1,1],k=9999","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[524299,1,2,1],k=9999","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16,10,10,10],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[60,10,10,10],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1023,2,1,3],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1024,2,1,3],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1025,2,1,3],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2047,2,1,3],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2048,2,1,3],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2049,2,1,3],k=1","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16,10,10,10],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[60,10,10,10],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1023,2,1,3],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1024,2,1,3],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1025,2,1,3],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2047,2,1,3],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2048,2,1,3],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2049,2,1,3],k=2","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16,10,10,10],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[60,10,10,10],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1023,2,1,3],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1024,2,1,3],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1025,2,1,3],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2047,2,1,3],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2048,2,1,3],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2049,2,1,3],k=3","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16,10,10,10],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[60,10,10,10],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1023,2,1,3],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1024,2,1,3],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1025,2,1,3],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2047,2,1,3],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2048,2,1,3],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2049,2,1,3],k=7","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16,10,10,10],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[60,10,10,10],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1023,2,1,3],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1024,2,1,3],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[1025,2,1,3],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[16384,1,1,1],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2047,2,1,3],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2048,2,1,3],k=15","support","0","no","BLAS" +"BLAS","TOP_K","type=f32,ne=[2049,2,1,3],k=15","support","0","no","BLAS" "BLAS","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=nearest,transpose=0","support","0","no","BLAS" "BLAS","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=nearest,transpose=1","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=nearest","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=nearest","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=nearest,flags=none","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=nearest,flags=none","support","0","no","BLAS" "BLAS","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bilinear,transpose=0","support","0","no","BLAS" "BLAS","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bilinear,transpose=1","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bilinear","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=bilinear","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bilinear,flags=none","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=bilinear,flags=none","support","0","no","BLAS" "BLAS","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bicubic,transpose=0","support","0","no","BLAS" "BLAS","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bicubic,transpose=1","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bicubic","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=bicubic","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bilinear|antialias,transpose=0","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bilinear|antialias,transpose=1","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bilinear|antialias","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=bilinear|antialias","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bilinear|align_corners","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[1,4,3,2],ne_tgt=[2,8,3,2],mode=bilinear|align_corners","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[4,1,3,2],ne_tgt=[1,1,3,2],mode=bilinear|align_corners","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bicubic|align_corners","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[1,4,3,2],ne_tgt=[2,8,3,2],mode=bicubic|align_corners","support","0","no","BLAS" -"BLAS","UPSCALE","type=f32,ne=[4,1,3,2],ne_tgt=[1,1,3,2],mode=bicubic|align_corners","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bicubic,flags=none","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=bicubic,flags=none","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=513,transpose=0","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=513,transpose=1","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bilinear,flags=none","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=bilinear,flags=none","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bilinear,flags=align_corners","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[1,4,3,2],ne_tgt=[2,8,3,2],mode=bilinear,flags=align_corners","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[4,1,3,2],ne_tgt=[1,1,3,2],mode=bilinear,flags=align_corners","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bicubic,flags=align_corners","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[1,4,3,2],ne_tgt=[2,8,3,2],mode=bicubic,flags=align_corners","support","0","no","BLAS" +"BLAS","UPSCALE","type=f32,ne=[4,1,3,2],ne_tgt=[1,1,3,2],mode=bicubic,flags=align_corners","support","0","no","BLAS" "BLAS","SUM","type=f32,ne=[10,5,4,3]","support","0","no","BLAS" "BLAS","SUM_ROWS","type=f32,ne=[10,5,4,3],permute=0,slice=0","support","0","no","BLAS" "BLAS","SUM","type=f32,ne=[11,5,6,3],permute=[0,2,1,3]","support","0","no","BLAS" @@ -9955,9 +9891,8 @@ "BLAS","GROUP_NORM","type=f32,ne=[64,64,320,1],num_groups=32,eps=0.000001","support","0","no","BLAS" "BLAS","GROUP_NORM","type=f32,ne=[9,9,1280,1],num_groups=32,eps=0.000001","support","0","no","BLAS" "BLAS","ACC","type=f32,ne_a=[256,17,1,1],ne_b=[256,16,1,1]","support","0","no","BLAS" -"BLAS","PAD","type=f32,ne_a=[512,512,1,1],pad_0=1,pad_1=1,circular=0","support","0","no","BLAS" -"BLAS","PAD","type=f32,ne_a=[33,17,2,1],pad_0=4,pad_1=3,circular=1","support","0","no","BLAS" -"BLAS","PAD","type=f32,ne_a=[512,512,3,1],lp0=1,rp0=1,lp1=1,rp1=1,lp2=1,rp2=1,lp3=1,rp3=1,v=0,circular=0","support","0","no","BLAS" +"BLAS","PAD","type=f32,ne_a=[512,512,1,1],pad_0=1,pad_1=1","support","0","no","BLAS" +"BLAS","PAD","type=f32,ne_a=[512,512,3,1],lp0=1,rp0=1,lp1=1,rp1=1,lp2=1,rp2=1,lp3=1,rp3=1,v=0","support","0","no","BLAS" "BLAS","PAD_REFLECT_1D","type=f32,ne_a=[512,34,2,1],pad_0=10,pad_1=9","support","0","no","BLAS" "BLAS","PAD_REFLECT_1D","type=f32,ne_a=[3000,384,4,1],pad_0=10,pad_1=9","support","0","no","BLAS" "BLAS","ROLL","shift0=3,shift1=-2,shift3=1,shift4=-1","support","0","no","BLAS" @@ -9979,7 +9914,6 @@ "BLAS","CUMSUM","type=f32,ne=[2048,5,4,3]","support","0","no","BLAS" "BLAS","CUMSUM","type=f32,ne=[242004,1,1,1]","support","0","no","BLAS" "BLAS","CUMSUM","type=f32,ne=[375960,1,1,1]","support","0","no","BLAS" -"BLAS","CUMSUM","type=f32,ne=[20481,4,1,1]","support","0","no","BLAS" "BLAS","XIELU","type=f32,ne=[10,5,4,3]","support","0","no","BLAS" "BLAS","TRI","type=f32,ne=[10,10,4,3],tri_type=3","support","0","no","BLAS" "BLAS","TRI","type=f32,ne=[10,10,4,3],tri_type=2","support","0","no","BLAS" @@ -9989,41 +9923,17 @@ "BLAS","FILL","type=f32,ne=[303,207,11,3],c=2.000000","support","0","no","BLAS" "BLAS","FILL","type=f32,ne=[800,600,4,4],c=-152.000000","support","0","no","BLAS" "BLAS","FILL","type=f32,ne=[2048,512,2,2],c=3.500000","support","0","no","BLAS" -"BLAS","DIAG","type=f32,ne=[10,1,4,3]","support","0","no","BLAS" -"BLAS","DIAG","type=f32,ne=[79,1,19,13]","support","0","no","BLAS" -"BLAS","DIAG","type=f32,ne=[256,1,8,16]","support","0","no","BLAS" "BLAS","SOLVE_TRI","type=f32,ne_lhs=[10,10,4,3],ne_rhs=[3,10,4,3]","support","0","no","BLAS" "BLAS","SOLVE_TRI","type=f32,ne_lhs=[11,11,1,1],ne_rhs=[5,11,1,1]","support","0","no","BLAS" "BLAS","SOLVE_TRI","type=f32,ne_lhs=[17,17,2,4],ne_rhs=[9,17,2,4]","support","0","no","BLAS" "BLAS","SOLVE_TRI","type=f32,ne_lhs=[30,30,7,1],ne_rhs=[8,30,7,1]","support","0","no","BLAS" "BLAS","SOLVE_TRI","type=f32,ne_lhs=[42,42,5,2],ne_rhs=[10,42,5,2]","support","0","no","BLAS" "BLAS","SOLVE_TRI","type=f32,ne_lhs=[64,64,2,2],ne_rhs=[10,64,2,2]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[64,64,2,2],ne_rhs=[64,64,2,2]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[79,79,5,3],ne_rhs=[417,79,5,3]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,2],ne_rhs=[32,128,4,2]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[80,80,2,8],ne_rhs=[80,80,2,8]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[80,80,2,8],ne_rhs=[79,80,2,8]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[80,80,2,8],ne_rhs=[81,80,2,8]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[80,80,8,8],ne_rhs=[80,80,8,8]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[80,80,8,8],ne_rhs=[79,80,8,8]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[80,80,8,8],ne_rhs=[81,80,8,8]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[84,84,4,4],ne_rhs=[32,84,4,4]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[95,95,8,8],ne_rhs=[40,95,8,8]","support","0","no","BLAS" "BLAS","SOLVE_TRI","type=f32,ne_lhs=[100,100,4,4],ne_rhs=[41,100,4,4]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,4],ne_rhs=[31,128,4,4]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,4],ne_rhs=[32,128,4,4]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[128,128,3,4],ne_rhs=[32,128,3,4]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,1],ne_rhs=[32,128,4,1]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[64,64,4,4],ne_rhs=[200,64,4,4]","support","0","no","BLAS" -"BLAS","SOLVE_TRI","type=f32,ne_lhs=[64,64,4,4],ne_rhs=[384,64,4,4]","support","0","no","BLAS" -"BLAS","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=0,circular=0","support","0","no","BLAS" -"BLAS","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=0,circular=0","support","0","no","BLAS" -"BLAS","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=0,circular=1","support","0","no","BLAS" -"BLAS","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=0,circular=1","support","0","no","BLAS" -"BLAS","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=1,circular=0","support","0","no","BLAS" -"BLAS","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=1,circular=0","support","0","no","BLAS" -"BLAS","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=1,circular=1","support","0","no","BLAS" -"BLAS","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=1,circular=1","support","0","no","BLAS" +"BLAS","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=0","support","0","no","BLAS" +"BLAS","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=0","support","0","no","BLAS" +"BLAS","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=1","support","0","no","BLAS" +"BLAS","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=1","support","0","no","BLAS" "BLAS","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","BLAS" "BLAS","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","BLAS" "BLAS","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","BLAS" diff --git a/docs/ops/Metal.csv b/docs/ops/Metal.csv index 02fd75f..5f7450e 100644 --- a/docs/ops/Metal.csv +++ b/docs/ops/Metal.csv @@ -965,7 +965,6 @@ "Metal","IM2COL","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[12,12,1,2560],ne_kernel=[3,3,1,2560],s0=1,s1=1,p0=1,p1=1,d0=1,d1=1,is_2D=1","support","1","yes","Metal" "Metal","IM2COL","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[12,12,2,2560],ne_kernel=[3,3,2,2560],s0=1,s1=1,p0=1,p1=1,d0=1,d1=1,is_2D=1","support","1","yes","Metal" "Metal","IM2COL","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[5,5,1,32],ne_kernel=[3,4,1,32],s0=1,s1=1,p0=0,p1=0,d0=1,d1=1,is_2D=1","support","1","yes","Metal" -"Metal","IM2COL","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[2,2,1536,729],ne_kernel=[2,2,1536,4096],s0=1,s1=1,p0=0,p1=0,d0=1,d1=1,is_2D=1","support","1","yes","Metal" "Metal","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[10,10,10,9],ne_kernel=[3,3,3,1],IC=3,s0=1,s1=1,s2=1,p0=1,p1=1,p2=1,d0=1,d1=1,d2=1,v=0","support","0","no","Metal" "Metal","IM2COL_3D","type_input=f32,type_kernel=f16,dst_type=f32,ne_input=[10,10,10,9],ne_kernel=[3,3,3,1],IC=3,s0=1,s1=1,s2=1,p0=1,p1=1,p2=1,d0=1,d1=1,d2=1,v=0","support","0","no","Metal" "Metal","IM2COL_3D","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[10,10,10,9],ne_kernel=[3,3,3,1],IC=3,s0=1,s1=1,s2=1,p0=1,p1=1,p2=1,d0=1,d1=1,d2=1,v=0","support","0","no","Metal" @@ -4965,9 +4964,8 @@ "Metal","CONV_TRANSPOSE_1D","ne_input=[2,1,1,1],ne_kernel=[3,1,1,1],s0=1,p0=0,d0=1","support","1","yes","Metal" "Metal","CONV_TRANSPOSE_2D","ne_input=[3,2,3,1],ne_kernel=[2,2,1,3],stride=1","support","1","yes","Metal" "Metal","CONV_TRANSPOSE_2D","ne_input=[10,10,9,1],ne_kernel=[3,3,1,9],stride=2","support","1","yes","Metal" -"Metal","CONV_TRANSPOSE_2D","ne_input=[129,63,35,1],ne_kernel=[3,3,48,35],stride=1","support","1","yes","Metal" -"Metal","COUNT_EQUAL","type=f32,ne=[4,500,1,1]","support","1","yes","Metal" -"Metal","COUNT_EQUAL","type=f32,ne=[4,5000,1,1]","support","1","yes","Metal" +"Metal","COUNT_EQUAL","type=f32,ne=[4,500,1,1]","support","0","no","Metal" +"Metal","COUNT_EQUAL","type=f32,ne=[4,5000,1,1]","support","0","no","Metal" "Metal","ARGMAX","type=f32,ne=[32,1,1,1]","support","1","yes","Metal" "Metal","ARGMAX","type=f32,ne=[32,513,1,1]","support","1","yes","Metal" "Metal","ARGMAX","type=f32,ne=[100,10,1,1]","support","1","yes","Metal" @@ -5717,15 +5715,15 @@ "Metal","L2_NORM","type=f32,ne=[64,5,4,3]","support","1","yes","Metal" "Metal","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000001,inplace=1","support","1","yes","Metal" "Metal","L2_NORM","type=f32,ne=[64,5,4,3]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[3,1024,1,1],ne_b=[3,1024,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[6,1024,1,1],ne_b=[3,1024,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[3,1024,4,1],ne_b=[3,1024,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[3,1536,1,1],ne_b=[3,1536,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[6,1536,1,1],ne_b=[3,1536,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[3,1536,4,1],ne_b=[3,1536,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[3,2048,1,1],ne_b=[3,2048,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[6,2048,1,1],ne_b=[3,2048,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[3,2048,4,1],ne_b=[3,2048,1,1]","support","1","yes","Metal" +"Metal","SSM_CONV","type=f32,ne_a=[4,1024,1,1],ne_b=[3,1024,1,1]","support","1","yes","Metal" +"Metal","SSM_CONV","type=f32,ne_a=[8,1024,1,1],ne_b=[3,1024,1,1]","support","1","yes","Metal" +"Metal","SSM_CONV","type=f32,ne_a=[4,1024,4,1],ne_b=[3,1024,1,1]","support","1","yes","Metal" +"Metal","SSM_CONV","type=f32,ne_a=[4,1536,1,1],ne_b=[3,1536,1,1]","support","1","yes","Metal" +"Metal","SSM_CONV","type=f32,ne_a=[8,1536,1,1],ne_b=[3,1536,1,1]","support","1","yes","Metal" +"Metal","SSM_CONV","type=f32,ne_a=[4,1536,4,1],ne_b=[3,1536,1,1]","support","1","yes","Metal" +"Metal","SSM_CONV","type=f32,ne_a=[4,2048,1,1],ne_b=[3,2048,1,1]","support","1","yes","Metal" +"Metal","SSM_CONV","type=f32,ne_a=[8,2048,1,1],ne_b=[3,2048,1,1]","support","1","yes","Metal" +"Metal","SSM_CONV","type=f32,ne_a=[4,2048,4,1],ne_b=[3,2048,1,1]","support","1","yes","Metal" "Metal","SSM_CONV","type=f32,ne_a=[4,1024,1,1],ne_b=[4,1024,1,1]","support","1","yes","Metal" "Metal","SSM_CONV","type=f32,ne_a=[8,1024,1,1],ne_b=[4,1024,1,1]","support","1","yes","Metal" "Metal","SSM_CONV","type=f32,ne_a=[4,1024,4,1],ne_b=[4,1024,1,1]","support","1","yes","Metal" @@ -5735,15 +5733,6 @@ "Metal","SSM_CONV","type=f32,ne_a=[4,2048,1,1],ne_b=[4,2048,1,1]","support","1","yes","Metal" "Metal","SSM_CONV","type=f32,ne_a=[8,2048,1,1],ne_b=[4,2048,1,1]","support","1","yes","Metal" "Metal","SSM_CONV","type=f32,ne_a=[4,2048,4,1],ne_b=[4,2048,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[9,1024,1,1],ne_b=[9,1024,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[18,1024,1,1],ne_b=[9,1024,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[9,1024,4,1],ne_b=[9,1024,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[9,1536,1,1],ne_b=[9,1536,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[18,1536,1,1],ne_b=[9,1536,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[9,1536,4,1],ne_b=[9,1536,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[9,2048,1,1],ne_b=[9,2048,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[18,2048,1,1],ne_b=[9,2048,1,1]","support","1","yes","Metal" -"Metal","SSM_CONV","type=f32,ne_a=[9,2048,4,1],ne_b=[9,2048,1,1]","support","1","yes","Metal" "Metal","SSM_SCAN","type=f32,d_state=16,head_dim=1,n_head=1024,n_group=1,n_seq_tokens=32,n_seqs=4","support","1","yes","Metal" "Metal","SSM_SCAN","type=f32,d_state=128,head_dim=64,n_head=16,n_group=2,n_seq_tokens=32,n_seqs=4","support","1","yes","Metal" "Metal","SSM_SCAN","type=f32,d_state=256,head_dim=64,n_head=8,n_group=2,n_seq_tokens=32,n_seqs=4","support","1","yes","Metal" @@ -8927,8 +8916,6 @@ "Metal","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","1","yes","Metal" "Metal","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","1","yes","Metal" "Metal","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","1","yes","Metal" -"Metal","SOFT_MAX","type=f32,ne=[200001,2,3,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","1","yes","Metal" -"Metal","SOFT_MAX","type=f32,ne=[200001,2,3,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","1","yes","Metal" "Metal","SOFT_MAX_BACK","type=f32,ne=[16,16,1,1],scale=1.000000,max_bias=0.000000","support","0","no","Metal" "Metal","SOFT_MAX_BACK","type=f32,ne=[15,15,1,1],scale=1.000000,max_bias=0.000000","support","0","no","Metal" "Metal","SOFT_MAX_BACK","type=f32,ne=[16,16,2,3],scale=1.000000,max_bias=0.000000","support","0","no","Metal" @@ -9555,311 +9542,311 @@ "Metal","ARGSORT","type=f32,ne=[2048,2,1,3],order=1","support","1","yes","Metal" "Metal","ARGSORT","type=f32,ne=[2049,2,1,3],order=1","support","1","yes","Metal" "Metal","ARGSORT","type=f32,ne=[2,8,8192,1],order=1","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[12,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[13,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[13,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[15,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[15,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[15,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[19,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[19,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[19,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[19,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[27,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[27,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[27,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[27,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[27,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[43,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[43,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[43,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[43,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[43,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[64,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[75,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[64,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[75,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[64,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[75,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[64,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[75,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[64,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[75,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[128,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[139,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[128,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[139,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[128,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[139,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[128,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[139,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[128,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[139,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[128,1,1,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[139,1,2,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[256,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[267,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[256,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[267,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[256,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[267,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[256,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[267,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[256,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[267,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[256,1,1,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[267,1,2,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[512,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[523,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[512,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[523,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[512,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[523,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[512,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[523,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[512,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[523,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[512,1,1,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[523,1,2,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[512,1,1,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[523,1,2,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=9999,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=9999,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=9999,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=9999,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=9999,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=9999,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=9999,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=9999,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=9999,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=9999,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=100,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=500,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=1023,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=9999,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=9999,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16,10,10,10],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[60,10,10,10],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1023,2,1,3],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1024,2,1,3],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1025,2,1,3],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2047,2,1,3],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2048,2,1,3],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2049,2,1,3],k=1,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16,10,10,10],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[60,10,10,10],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1023,2,1,3],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1024,2,1,3],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1025,2,1,3],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2047,2,1,3],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2048,2,1,3],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2049,2,1,3],k=2,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16,10,10,10],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[60,10,10,10],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1023,2,1,3],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1024,2,1,3],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1025,2,1,3],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2047,2,1,3],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2048,2,1,3],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2049,2,1,3],k=3,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16,10,10,10],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[60,10,10,10],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1023,2,1,3],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1024,2,1,3],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1025,2,1,3],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2047,2,1,3],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2048,2,1,3],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2049,2,1,3],k=7,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16,10,10,10],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[60,10,10,10],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1023,2,1,3],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1024,2,1,3],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[1025,2,1,3],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2047,2,1,3],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2048,2,1,3],k=15,ties=0","support","1","yes","Metal" -"Metal","TOP_K","type=f32,ne=[2049,2,1,3],k=15,ties=0","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[12,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[13,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[13,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[15,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[15,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[15,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[19,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[19,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[19,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[19,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[27,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[27,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[27,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[27,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[27,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[43,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[43,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[43,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[43,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[43,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[64,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[75,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[64,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[75,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[64,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[75,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[64,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[75,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[64,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[75,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[128,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[139,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[128,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[139,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[128,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[139,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[128,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[139,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[128,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[139,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[128,1,1,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[139,1,2,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[256,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[267,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[256,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[267,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[256,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[267,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[256,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[267,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[256,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[267,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[256,1,1,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[267,1,2,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[512,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[523,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[512,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[523,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[512,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[523,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[512,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[523,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[512,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[523,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[512,1,1,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[523,1,2,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[512,1,1,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[523,1,2,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1024,1,1,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1035,1,2,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2048,1,1,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2059,1,2,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4096,1,1,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[4107,1,2,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8192,1,1,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[8203,1,2,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=9999","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16395,1,2,1],k=9999","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32768,1,1,1],k=9999","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[32779,1,2,1],k=9999","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65536,1,1,1],k=9999","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[65547,1,2,1],k=9999","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131072,1,1,1],k=9999","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[131083,1,2,1],k=9999","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262144,1,1,1],k=9999","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[262155,1,2,1],k=9999","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=100","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=500","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=1023","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524288,1,1,1],k=9999","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[524299,1,2,1],k=9999","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16,10,10,10],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[60,10,10,10],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1023,2,1,3],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1024,2,1,3],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1025,2,1,3],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2047,2,1,3],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2048,2,1,3],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2049,2,1,3],k=1","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16,10,10,10],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[60,10,10,10],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1023,2,1,3],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1024,2,1,3],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1025,2,1,3],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2047,2,1,3],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2048,2,1,3],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2049,2,1,3],k=2","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16,10,10,10],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[60,10,10,10],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1023,2,1,3],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1024,2,1,3],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1025,2,1,3],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2047,2,1,3],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2048,2,1,3],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2049,2,1,3],k=3","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16,10,10,10],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[60,10,10,10],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1023,2,1,3],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1024,2,1,3],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1025,2,1,3],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2047,2,1,3],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2048,2,1,3],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2049,2,1,3],k=7","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16,10,10,10],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[60,10,10,10],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1023,2,1,3],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1024,2,1,3],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[1025,2,1,3],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[16384,1,1,1],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2047,2,1,3],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2048,2,1,3],k=15","support","1","yes","Metal" +"Metal","TOP_K","type=f32,ne=[2049,2,1,3],k=15","support","1","yes","Metal" "Metal","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=nearest,transpose=0","support","1","yes","Metal" "Metal","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=nearest,transpose=1","support","1","yes","Metal" "Metal","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=nearest,flags=none","support","1","yes","Metal" @@ -9904,9 +9891,8 @@ "Metal","GROUP_NORM","type=f32,ne=[64,64,320,1],num_groups=32,eps=0.000001","support","1","yes","Metal" "Metal","GROUP_NORM","type=f32,ne=[9,9,1280,1],num_groups=32,eps=0.000001","support","1","yes","Metal" "Metal","ACC","type=f32,ne_a=[256,17,1,1],ne_b=[256,16,1,1]","support","1","yes","Metal" -"Metal","PAD","type=f32,ne_a=[512,512,1,1],pad_0=1,pad_1=1,circular=0","support","1","yes","Metal" -"Metal","PAD","type=f32,ne_a=[33,17,2,1],pad_0=4,pad_1=3,circular=1","support","0","no","Metal" -"Metal","PAD","type=f32,ne_a=[512,512,3,1],lp0=1,rp0=1,lp1=1,rp1=1,lp2=1,rp2=1,lp3=1,rp3=1,v=0,circular=0","support","0","no","Metal" +"Metal","PAD","type=f32,ne_a=[512,512,1,1],pad_0=1,pad_1=1","support","1","yes","Metal" +"Metal","PAD","type=f32,ne_a=[512,512,3,1],lp0=1,rp0=1,lp1=1,rp1=1,lp2=1,rp2=1,lp3=1,rp3=1,v=0","support","0","no","Metal" "Metal","PAD_REFLECT_1D","type=f32,ne_a=[512,34,2,1],pad_0=10,pad_1=9","support","1","yes","Metal" "Metal","PAD_REFLECT_1D","type=f32,ne_a=[3000,384,4,1],pad_0=10,pad_1=9","support","1","yes","Metal" "Metal","ROLL","shift0=3,shift1=-2,shift3=1,shift4=-1","support","0","no","Metal" @@ -9937,41 +9923,17 @@ "Metal","FILL","type=f32,ne=[303,207,11,3],c=2.000000","support","1","yes","Metal" "Metal","FILL","type=f32,ne=[800,600,4,4],c=-152.000000","support","1","yes","Metal" "Metal","FILL","type=f32,ne=[2048,512,2,2],c=3.500000","support","1","yes","Metal" -"Metal","DIAG","type=f32,ne=[10,1,4,3]","support","0","no","Metal" -"Metal","DIAG","type=f32,ne=[79,1,19,13]","support","0","no","Metal" -"Metal","DIAG","type=f32,ne=[256,1,8,16]","support","0","no","Metal" "Metal","SOLVE_TRI","type=f32,ne_lhs=[10,10,4,3],ne_rhs=[3,10,4,3]","support","0","no","Metal" "Metal","SOLVE_TRI","type=f32,ne_lhs=[11,11,1,1],ne_rhs=[5,11,1,1]","support","0","no","Metal" "Metal","SOLVE_TRI","type=f32,ne_lhs=[17,17,2,4],ne_rhs=[9,17,2,4]","support","0","no","Metal" "Metal","SOLVE_TRI","type=f32,ne_lhs=[30,30,7,1],ne_rhs=[8,30,7,1]","support","0","no","Metal" "Metal","SOLVE_TRI","type=f32,ne_lhs=[42,42,5,2],ne_rhs=[10,42,5,2]","support","0","no","Metal" "Metal","SOLVE_TRI","type=f32,ne_lhs=[64,64,2,2],ne_rhs=[10,64,2,2]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[64,64,2,2],ne_rhs=[64,64,2,2]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[79,79,5,3],ne_rhs=[417,79,5,3]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,2],ne_rhs=[32,128,4,2]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[80,80,2,8],ne_rhs=[80,80,2,8]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[80,80,2,8],ne_rhs=[79,80,2,8]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[80,80,2,8],ne_rhs=[81,80,2,8]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[80,80,8,8],ne_rhs=[80,80,8,8]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[80,80,8,8],ne_rhs=[79,80,8,8]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[80,80,8,8],ne_rhs=[81,80,8,8]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[84,84,4,4],ne_rhs=[32,84,4,4]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[95,95,8,8],ne_rhs=[40,95,8,8]","support","0","no","Metal" "Metal","SOLVE_TRI","type=f32,ne_lhs=[100,100,4,4],ne_rhs=[41,100,4,4]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,4],ne_rhs=[31,128,4,4]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,4],ne_rhs=[32,128,4,4]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[128,128,3,4],ne_rhs=[32,128,3,4]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,1],ne_rhs=[32,128,4,1]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[64,64,4,4],ne_rhs=[200,64,4,4]","support","0","no","Metal" -"Metal","SOLVE_TRI","type=f32,ne_lhs=[64,64,4,4],ne_rhs=[384,64,4,4]","support","0","no","Metal" -"Metal","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=0,circular=0","support","1","yes","Metal" -"Metal","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=0,circular=0","support","0","no","Metal" -"Metal","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=0,circular=1","support","0","no","Metal" -"Metal","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=0,circular=1","support","0","no","Metal" -"Metal","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=1,circular=0","support","1","yes","Metal" -"Metal","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=1,circular=0","support","0","no","Metal" -"Metal","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=1,circular=1","support","0","no","Metal" -"Metal","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=1,circular=1","support","0","no","Metal" +"Metal","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=0","support","1","yes","Metal" +"Metal","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=0","support","0","no","Metal" +"Metal","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=1","support","1","yes","Metal" +"Metal","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=1","support","0","no","Metal" "Metal","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","1","yes","Metal" "Metal","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","1","yes","Metal" "Metal","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","1","yes","Metal" diff --git a/docs/ops/WebGPU.csv b/docs/ops/WebGPU.csv index 8cd7e12..bfff75e 100644 --- a/docs/ops/WebGPU.csv +++ b/docs/ops/WebGPU.csv @@ -35,8 +35,8 @@ "WebGPU: WebGPU","GELU_ERF","type=f16,ne_a=[5,7,11,13],v=0","support","1","yes","WebGPU" "WebGPU: WebGPU","FLOOR","type=f16,ne_a=[128,2,2,2],v=0","support","0","no","WebGPU" "WebGPU: WebGPU","FLOOR","type=f16,ne_a=[5,7,11,13],v=0","support","0","no","WebGPU" -"WebGPU: WebGPU","CEIL","type=f16,ne_a=[128,2,2,2],v=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","CEIL","type=f16,ne_a=[5,7,11,13],v=0","support","1","yes","WebGPU" +"WebGPU: WebGPU","CEIL","type=f16,ne_a=[128,2,2,2],v=0","support","0","no","WebGPU" +"WebGPU: WebGPU","CEIL","type=f16,ne_a=[5,7,11,13],v=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROUND","type=f16,ne_a=[128,2,2,2],v=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROUND","type=f16,ne_a=[5,7,11,13],v=0","support","0","no","WebGPU" "WebGPU: WebGPU","TRUNC","type=f16,ne_a=[128,2,2,2],v=0","support","0","no","WebGPU" @@ -77,8 +77,8 @@ "WebGPU: WebGPU","GELU_ERF","type=f16,ne_a=[5,7,11,13],v=1","support","1","yes","WebGPU" "WebGPU: WebGPU","FLOOR","type=f16,ne_a=[128,2,2,2],v=1","support","0","no","WebGPU" "WebGPU: WebGPU","FLOOR","type=f16,ne_a=[5,7,11,13],v=1","support","0","no","WebGPU" -"WebGPU: WebGPU","CEIL","type=f16,ne_a=[128,2,2,2],v=1","support","1","yes","WebGPU" -"WebGPU: WebGPU","CEIL","type=f16,ne_a=[5,7,11,13],v=1","support","1","yes","WebGPU" +"WebGPU: WebGPU","CEIL","type=f16,ne_a=[128,2,2,2],v=1","support","0","no","WebGPU" +"WebGPU: WebGPU","CEIL","type=f16,ne_a=[5,7,11,13],v=1","support","0","no","WebGPU" "WebGPU: WebGPU","ROUND","type=f16,ne_a=[128,2,2,2],v=1","support","0","no","WebGPU" "WebGPU: WebGPU","ROUND","type=f16,ne_a=[5,7,11,13],v=1","support","0","no","WebGPU" "WebGPU: WebGPU","TRUNC","type=f16,ne_a=[128,2,2,2],v=1","support","0","no","WebGPU" @@ -119,8 +119,8 @@ "WebGPU: WebGPU","GELU_ERF","type=f32,ne_a=[5,7,11,13],v=0","support","1","yes","WebGPU" "WebGPU: WebGPU","FLOOR","type=f32,ne_a=[128,2,2,2],v=0","support","0","no","WebGPU" "WebGPU: WebGPU","FLOOR","type=f32,ne_a=[5,7,11,13],v=0","support","0","no","WebGPU" -"WebGPU: WebGPU","CEIL","type=f32,ne_a=[128,2,2,2],v=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","CEIL","type=f32,ne_a=[5,7,11,13],v=0","support","1","yes","WebGPU" +"WebGPU: WebGPU","CEIL","type=f32,ne_a=[128,2,2,2],v=0","support","0","no","WebGPU" +"WebGPU: WebGPU","CEIL","type=f32,ne_a=[5,7,11,13],v=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROUND","type=f32,ne_a=[128,2,2,2],v=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROUND","type=f32,ne_a=[5,7,11,13],v=0","support","0","no","WebGPU" "WebGPU: WebGPU","TRUNC","type=f32,ne_a=[128,2,2,2],v=0","support","0","no","WebGPU" @@ -161,8 +161,8 @@ "WebGPU: WebGPU","GELU_ERF","type=f32,ne_a=[5,7,11,13],v=1","support","1","yes","WebGPU" "WebGPU: WebGPU","FLOOR","type=f32,ne_a=[128,2,2,2],v=1","support","0","no","WebGPU" "WebGPU: WebGPU","FLOOR","type=f32,ne_a=[5,7,11,13],v=1","support","0","no","WebGPU" -"WebGPU: WebGPU","CEIL","type=f32,ne_a=[128,2,2,2],v=1","support","1","yes","WebGPU" -"WebGPU: WebGPU","CEIL","type=f32,ne_a=[5,7,11,13],v=1","support","1","yes","WebGPU" +"WebGPU: WebGPU","CEIL","type=f32,ne_a=[128,2,2,2],v=1","support","0","no","WebGPU" +"WebGPU: WebGPU","CEIL","type=f32,ne_a=[5,7,11,13],v=1","support","0","no","WebGPU" "WebGPU: WebGPU","ROUND","type=f32,ne_a=[128,2,2,2],v=1","support","0","no","WebGPU" "WebGPU: WebGPU","ROUND","type=f32,ne_a=[5,7,11,13],v=1","support","0","no","WebGPU" "WebGPU: WebGPU","TRUNC","type=f32,ne_a=[128,2,2,2],v=1","support","0","no","WebGPU" @@ -965,7 +965,6 @@ "WebGPU: WebGPU","IM2COL","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[12,12,1,2560],ne_kernel=[3,3,1,2560],s0=1,s1=1,p0=1,p1=1,d0=1,d1=1,is_2D=1","support","0","no","WebGPU" "WebGPU: WebGPU","IM2COL","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[12,12,2,2560],ne_kernel=[3,3,2,2560],s0=1,s1=1,p0=1,p1=1,d0=1,d1=1,is_2D=1","support","0","no","WebGPU" "WebGPU: WebGPU","IM2COL","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[5,5,1,32],ne_kernel=[3,4,1,32],s0=1,s1=1,p0=0,p1=0,d0=1,d1=1,is_2D=1","support","0","no","WebGPU" -"WebGPU: WebGPU","IM2COL","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[2,2,1536,729],ne_kernel=[2,2,1536,4096],s0=1,s1=1,p0=0,p1=0,d0=1,d1=1,is_2D=1","support","0","no","WebGPU" "WebGPU: WebGPU","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[10,10,10,9],ne_kernel=[3,3,3,1],IC=3,s0=1,s1=1,s2=1,p0=1,p1=1,p2=1,d0=1,d1=1,d2=1,v=0","support","0","no","WebGPU" "WebGPU: WebGPU","IM2COL_3D","type_input=f32,type_kernel=f16,dst_type=f32,ne_input=[10,10,10,9],ne_kernel=[3,3,3,1],IC=3,s0=1,s1=1,s2=1,p0=1,p1=1,p2=1,d0=1,d1=1,d2=1,v=0","support","0","no","WebGPU" "WebGPU: WebGPU","IM2COL_3D","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[10,10,10,9],ne_kernel=[3,3,3,1],IC=3,s0=1,s1=1,s2=1,p0=1,p1=1,p2=1,d0=1,d1=1,d2=1,v=0","support","0","no","WebGPU" @@ -4965,7 +4964,6 @@ "WebGPU: WebGPU","CONV_TRANSPOSE_1D","ne_input=[2,1,1,1],ne_kernel=[3,1,1,1],s0=1,p0=0,d0=1","support","0","no","WebGPU" "WebGPU: WebGPU","CONV_TRANSPOSE_2D","ne_input=[3,2,3,1],ne_kernel=[2,2,1,3],stride=1","support","0","no","WebGPU" "WebGPU: WebGPU","CONV_TRANSPOSE_2D","ne_input=[10,10,9,1],ne_kernel=[3,3,1,9],stride=2","support","0","no","WebGPU" -"WebGPU: WebGPU","CONV_TRANSPOSE_2D","ne_input=[129,63,35,1],ne_kernel=[3,3,48,35],stride=1","support","0","no","WebGPU" "WebGPU: WebGPU","COUNT_EQUAL","type=f32,ne=[4,500,1,1]","support","0","no","WebGPU" "WebGPU: WebGPU","COUNT_EQUAL","type=f32,ne=[4,5000,1,1]","support","0","no","WebGPU" "WebGPU: WebGPU","ARGMAX","type=f32,ne=[32,1,1,1]","support","0","no","WebGPU" @@ -5717,15 +5715,15 @@ "WebGPU: WebGPU","L2_NORM","type=f32,ne=[64,5,4,3]","support","0","no","WebGPU" "WebGPU: WebGPU","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000001,inplace=1","support","1","yes","WebGPU" "WebGPU: WebGPU","L2_NORM","type=f32,ne=[64,5,4,3]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[3,1024,1,1],ne_b=[3,1024,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[6,1024,1,1],ne_b=[3,1024,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[3,1024,4,1],ne_b=[3,1024,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[3,1536,1,1],ne_b=[3,1536,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[6,1536,1,1],ne_b=[3,1536,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[3,1536,4,1],ne_b=[3,1536,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[3,2048,1,1],ne_b=[3,2048,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[6,2048,1,1],ne_b=[3,2048,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[3,2048,4,1],ne_b=[3,2048,1,1]","support","0","no","WebGPU" +"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[4,1024,1,1],ne_b=[3,1024,1,1]","support","0","no","WebGPU" +"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[8,1024,1,1],ne_b=[3,1024,1,1]","support","0","no","WebGPU" +"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[4,1024,4,1],ne_b=[3,1024,1,1]","support","0","no","WebGPU" +"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[4,1536,1,1],ne_b=[3,1536,1,1]","support","0","no","WebGPU" +"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[8,1536,1,1],ne_b=[3,1536,1,1]","support","0","no","WebGPU" +"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[4,1536,4,1],ne_b=[3,1536,1,1]","support","0","no","WebGPU" +"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[4,2048,1,1],ne_b=[3,2048,1,1]","support","0","no","WebGPU" +"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[8,2048,1,1],ne_b=[3,2048,1,1]","support","0","no","WebGPU" +"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[4,2048,4,1],ne_b=[3,2048,1,1]","support","0","no","WebGPU" "WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[4,1024,1,1],ne_b=[4,1024,1,1]","support","0","no","WebGPU" "WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[8,1024,1,1],ne_b=[4,1024,1,1]","support","0","no","WebGPU" "WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[4,1024,4,1],ne_b=[4,1024,1,1]","support","0","no","WebGPU" @@ -5735,15 +5733,6 @@ "WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[4,2048,1,1],ne_b=[4,2048,1,1]","support","0","no","WebGPU" "WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[8,2048,1,1],ne_b=[4,2048,1,1]","support","0","no","WebGPU" "WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[4,2048,4,1],ne_b=[4,2048,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[9,1024,1,1],ne_b=[9,1024,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[18,1024,1,1],ne_b=[9,1024,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[9,1024,4,1],ne_b=[9,1024,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[9,1536,1,1],ne_b=[9,1536,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[18,1536,1,1],ne_b=[9,1536,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[9,1536,4,1],ne_b=[9,1536,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[9,2048,1,1],ne_b=[9,2048,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[18,2048,1,1],ne_b=[9,2048,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SSM_CONV","type=f32,ne_a=[9,2048,4,1],ne_b=[9,2048,1,1]","support","0","no","WebGPU" "WebGPU: WebGPU","SSM_SCAN","type=f32,d_state=16,head_dim=1,n_head=1024,n_group=1,n_seq_tokens=32,n_seqs=4","support","0","no","WebGPU" "WebGPU: WebGPU","SSM_SCAN","type=f32,d_state=128,head_dim=64,n_head=16,n_group=2,n_seq_tokens=32,n_seqs=4","support","0","no","WebGPU" "WebGPU: WebGPU","SSM_SCAN","type=f32,d_state=256,head_dim=64,n_head=8,n_group=2,n_seq_tokens=32,n_seqs=4","support","0","no","WebGPU" @@ -8673,7 +8662,7 @@ "WebGPU: WebGPU","CLAMP","type=f16,ne=[10,5,4,3],min=-0.500000,max=0.500000","support","0","no","WebGPU" "WebGPU: WebGPU","LEAKY_RELU","type=f16,ne_a=[10,5,4,3],negative_slope=0.100000","support","0","no","WebGPU" "WebGPU: WebGPU","FLOOR","type=f16,ne=[10,2,2,2]","support","0","no","WebGPU" -"WebGPU: WebGPU","CEIL","type=f16,ne=[10,2,2,2]","support","1","yes","WebGPU" +"WebGPU: WebGPU","CEIL","type=f16,ne=[10,2,2,2]","support","0","no","WebGPU" "WebGPU: WebGPU","ROUND","type=f16,ne=[10,2,2,2]","support","0","no","WebGPU" "WebGPU: WebGPU","TRUNC","type=f16,ne=[10,2,2,2]","support","0","no","WebGPU" "WebGPU: WebGPU","SQR","type=f16,ne=[7,1,5,3]","support","0","no","WebGPU" @@ -8685,8 +8674,8 @@ "WebGPU: WebGPU","LEAKY_RELU","type=f16,ne_a=[7,1,5,3],negative_slope=0.100000","support","0","no","WebGPU" "WebGPU: WebGPU","FLOOR","type=f16,ne=[7,1,5,3]","support","0","no","WebGPU" "WebGPU: WebGPU","FLOOR","type=f16,ne=[1024,1024,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","CEIL","type=f16,ne=[7,1,5,3]","support","1","yes","WebGPU" -"WebGPU: WebGPU","CEIL","type=f16,ne=[1024,1024,1,1]","support","1","yes","WebGPU" +"WebGPU: WebGPU","CEIL","type=f16,ne=[7,1,5,3]","support","0","no","WebGPU" +"WebGPU: WebGPU","CEIL","type=f16,ne=[1024,1024,1,1]","support","0","no","WebGPU" "WebGPU: WebGPU","ROUND","type=f16,ne=[7,1,5,3]","support","0","no","WebGPU" "WebGPU: WebGPU","ROUND","type=f16,ne=[1024,1024,1,1]","support","0","no","WebGPU" "WebGPU: WebGPU","TRUNC","type=f16,ne=[7,1,5,3]","support","0","no","WebGPU" @@ -8699,7 +8688,7 @@ "WebGPU: WebGPU","CLAMP","type=f32,ne=[10,5,4,3],min=-0.500000,max=0.500000","support","0","no","WebGPU" "WebGPU: WebGPU","LEAKY_RELU","type=f32,ne_a=[10,5,4,3],negative_slope=0.100000","support","0","no","WebGPU" "WebGPU: WebGPU","FLOOR","type=f32,ne=[10,2,2,2]","support","0","no","WebGPU" -"WebGPU: WebGPU","CEIL","type=f32,ne=[10,2,2,2]","support","1","yes","WebGPU" +"WebGPU: WebGPU","CEIL","type=f32,ne=[10,2,2,2]","support","0","no","WebGPU" "WebGPU: WebGPU","ROUND","type=f32,ne=[10,2,2,2]","support","0","no","WebGPU" "WebGPU: WebGPU","TRUNC","type=f32,ne=[10,2,2,2]","support","0","no","WebGPU" "WebGPU: WebGPU","SQR","type=f32,ne=[7,1,5,3]","support","0","no","WebGPU" @@ -8711,8 +8700,8 @@ "WebGPU: WebGPU","LEAKY_RELU","type=f32,ne_a=[7,1,5,3],negative_slope=0.100000","support","0","no","WebGPU" "WebGPU: WebGPU","FLOOR","type=f32,ne=[7,1,5,3]","support","0","no","WebGPU" "WebGPU: WebGPU","FLOOR","type=f32,ne=[1024,1024,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","CEIL","type=f32,ne=[7,1,5,3]","support","1","yes","WebGPU" -"WebGPU: WebGPU","CEIL","type=f32,ne=[1024,1024,1,1]","support","1","yes","WebGPU" +"WebGPU: WebGPU","CEIL","type=f32,ne=[7,1,5,3]","support","0","no","WebGPU" +"WebGPU: WebGPU","CEIL","type=f32,ne=[1024,1024,1,1]","support","0","no","WebGPU" "WebGPU: WebGPU","ROUND","type=f32,ne=[7,1,5,3]","support","0","no","WebGPU" "WebGPU: WebGPU","ROUND","type=f32,ne=[1024,1024,1,1]","support","0","no","WebGPU" "WebGPU: WebGPU","TRUNC","type=f32,ne=[7,1,5,3]","support","0","no","WebGPU" @@ -8927,8 +8916,6 @@ "WebGPU: WebGPU","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","SOFT_MAX","type=f32,ne=[200001,2,3,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","SOFT_MAX","type=f32,ne=[200001,2,3,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","SOFT_MAX_BACK","type=f32,ne=[16,16,1,1],scale=1.000000,max_bias=0.000000","support","0","no","WebGPU" "WebGPU: WebGPU","SOFT_MAX_BACK","type=f32,ne=[15,15,1,1],scale=1.000000,max_bias=0.000000","support","0","no","WebGPU" "WebGPU: WebGPU","SOFT_MAX_BACK","type=f32,ne=[16,16,2,3],scale=1.000000,max_bias=0.000000","support","0","no","WebGPU" @@ -8981,7 +8968,6 @@ "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" @@ -8991,7 +8977,6 @@ "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" @@ -9002,13 +8987,11 @@ "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" @@ -9018,7 +9001,6 @@ "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" @@ -9029,13 +9011,11 @@ "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" @@ -9045,7 +9025,6 @@ "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" @@ -9056,13 +9035,11 @@ "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" @@ -9072,7 +9049,6 @@ "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" @@ -9083,7 +9059,6 @@ "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" -"WebGPU: WebGPU","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" "WebGPU: WebGPU","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","1","yes","WebGPU" @@ -9209,7 +9184,6 @@ "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" -"WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" @@ -9219,7 +9193,6 @@ "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" -"WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" @@ -9230,13 +9203,11 @@ "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" -"WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" -"WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" @@ -9246,7 +9217,6 @@ "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" -"WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" @@ -9257,13 +9227,11 @@ "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" -"WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" -"WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" @@ -9273,7 +9241,6 @@ "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" -"WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" @@ -9284,13 +9251,11 @@ "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" -"WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" -"WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" @@ -9300,7 +9265,6 @@ "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" -"WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" @@ -9311,7 +9275,6 @@ "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" -"WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" "WebGPU: WebGPU","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","WebGPU" @@ -9579,333 +9542,333 @@ "WebGPU: WebGPU","ARGSORT","type=f32,ne=[2048,2,1,3],order=1","support","0","no","WebGPU" "WebGPU: WebGPU","ARGSORT","type=f32,ne=[2049,2,1,3],order=1","support","0","no","WebGPU" "WebGPU: WebGPU","ARGSORT","type=f32,ne=[2,8,8192,1],order=1","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[12,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[13,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[13,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[15,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[15,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[15,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[19,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[19,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[19,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[19,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[27,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[27,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[27,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[27,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[27,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[43,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[43,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[43,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[43,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[43,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[64,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[75,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[64,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[75,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[64,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[75,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[64,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[75,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[64,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[75,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[128,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[139,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[128,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[139,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[128,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[139,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[128,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[139,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[128,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[139,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[128,1,1,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[139,1,2,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[256,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[267,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[256,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[267,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[256,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[267,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[256,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[267,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[256,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[267,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[256,1,1,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[267,1,2,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[512,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[523,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[512,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[523,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[512,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[523,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[512,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[523,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[512,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[523,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[512,1,1,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[523,1,2,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[512,1,1,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[523,1,2,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=9999,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=9999,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=9999,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=9999,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=9999,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=9999,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=9999,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=9999,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=9999,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=9999,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=100,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=500,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=1023,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=9999,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=9999,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,10,10,10],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[60,10,10,10],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1023,2,1,3],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,2,1,3],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1025,2,1,3],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2047,2,1,3],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,2,1,3],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2049,2,1,3],k=1,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,10,10,10],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[60,10,10,10],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1023,2,1,3],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,2,1,3],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1025,2,1,3],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2047,2,1,3],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,2,1,3],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2049,2,1,3],k=2,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,10,10,10],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[60,10,10,10],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1023,2,1,3],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,2,1,3],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1025,2,1,3],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2047,2,1,3],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,2,1,3],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2049,2,1,3],k=3,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,10,10,10],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[60,10,10,10],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1023,2,1,3],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,2,1,3],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1025,2,1,3],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2047,2,1,3],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,2,1,3],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2049,2,1,3],k=7,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,10,10,10],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[60,10,10,10],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1023,2,1,3],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,2,1,3],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[1025,2,1,3],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2047,2,1,3],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,2,1,3],k=15,ties=0","support","0","no","WebGPU" -"WebGPU: WebGPU","TOP_K","type=f32,ne=[2049,2,1,3],k=15,ties=0","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[12,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[13,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[13,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[15,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[15,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[15,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[19,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[19,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[19,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[19,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[27,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[27,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[27,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[27,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[27,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[43,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[43,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[43,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[43,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[43,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[64,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[75,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[64,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[75,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[64,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[75,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[64,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[75,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[64,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[75,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[128,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[139,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[128,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[139,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[128,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[139,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[128,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[139,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[128,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[139,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[128,1,1,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[139,1,2,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[256,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[267,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[256,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[267,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[256,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[267,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[256,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[267,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[256,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[267,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[256,1,1,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[267,1,2,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[512,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[523,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[512,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[523,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[512,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[523,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[512,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[523,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[512,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[523,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[512,1,1,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[523,1,2,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[512,1,1,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[523,1,2,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,1,1,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1035,1,2,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,1,1,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2059,1,2,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4096,1,1,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[4107,1,2,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8192,1,1,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[8203,1,2,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=9999","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16395,1,2,1],k=9999","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32768,1,1,1],k=9999","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[32779,1,2,1],k=9999","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65536,1,1,1],k=9999","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[65547,1,2,1],k=9999","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131072,1,1,1],k=9999","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[131083,1,2,1],k=9999","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262144,1,1,1],k=9999","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[262155,1,2,1],k=9999","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=100","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=500","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=1023","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524288,1,1,1],k=9999","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[524299,1,2,1],k=9999","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,10,10,10],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[60,10,10,10],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1023,2,1,3],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,2,1,3],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1025,2,1,3],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2047,2,1,3],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,2,1,3],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2049,2,1,3],k=1","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,10,10,10],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[60,10,10,10],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1023,2,1,3],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,2,1,3],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1025,2,1,3],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2047,2,1,3],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,2,1,3],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2049,2,1,3],k=2","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,10,10,10],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[60,10,10,10],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1023,2,1,3],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,2,1,3],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1025,2,1,3],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2047,2,1,3],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,2,1,3],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2049,2,1,3],k=3","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,10,10,10],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[60,10,10,10],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1023,2,1,3],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,2,1,3],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1025,2,1,3],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2047,2,1,3],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,2,1,3],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2049,2,1,3],k=7","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16,10,10,10],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[60,10,10,10],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1023,2,1,3],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1024,2,1,3],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[1025,2,1,3],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[16384,1,1,1],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2047,2,1,3],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2048,2,1,3],k=15","support","0","no","WebGPU" +"WebGPU: WebGPU","TOP_K","type=f32,ne=[2049,2,1,3],k=15","support","0","no","WebGPU" "WebGPU: WebGPU","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=nearest,transpose=0","support","0","no","WebGPU" "WebGPU: WebGPU","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=nearest,transpose=1","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=nearest","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=nearest","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=nearest,flags=none","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=nearest,flags=none","support","0","no","WebGPU" "WebGPU: WebGPU","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bilinear,transpose=0","support","0","no","WebGPU" "WebGPU: WebGPU","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bilinear,transpose=1","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bilinear","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=bilinear","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bilinear,flags=none","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=bilinear,flags=none","support","0","no","WebGPU" "WebGPU: WebGPU","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bicubic,transpose=0","support","0","no","WebGPU" "WebGPU: WebGPU","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bicubic,transpose=1","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bicubic","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=bicubic","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bilinear|antialias,transpose=0","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bilinear|antialias,transpose=1","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bilinear|antialias","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=bilinear|antialias","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bilinear|align_corners","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[1,4,3,2],ne_tgt=[2,8,3,2],mode=bilinear|align_corners","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[4,1,3,2],ne_tgt=[1,1,3,2],mode=bilinear|align_corners","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bicubic|align_corners","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[1,4,3,2],ne_tgt=[2,8,3,2],mode=bicubic|align_corners","support","0","no","WebGPU" -"WebGPU: WebGPU","UPSCALE","type=f32,ne=[4,1,3,2],ne_tgt=[1,1,3,2],mode=bicubic|align_corners","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bicubic,flags=none","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=bicubic,flags=none","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=513,transpose=0","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=513,transpose=1","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bilinear,flags=none","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=bilinear,flags=none","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bilinear,flags=align_corners","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[1,4,3,2],ne_tgt=[2,8,3,2],mode=bilinear,flags=align_corners","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[4,1,3,2],ne_tgt=[1,1,3,2],mode=bilinear,flags=align_corners","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bicubic,flags=align_corners","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[1,4,3,2],ne_tgt=[2,8,3,2],mode=bicubic,flags=align_corners","support","0","no","WebGPU" +"WebGPU: WebGPU","UPSCALE","type=f32,ne=[4,1,3,2],ne_tgt=[1,1,3,2],mode=bicubic,flags=align_corners","support","0","no","WebGPU" "WebGPU: WebGPU","SUM","type=f32,ne=[10,5,4,3]","support","0","no","WebGPU" "WebGPU: WebGPU","SUM_ROWS","type=f32,ne=[10,5,4,3],permute=0,slice=0","support","0","no","WebGPU" "WebGPU: WebGPU","SUM","type=f32,ne=[11,5,6,3],permute=[0,2,1,3]","support","0","no","WebGPU" @@ -9928,9 +9891,8 @@ "WebGPU: WebGPU","GROUP_NORM","type=f32,ne=[64,64,320,1],num_groups=32,eps=0.000001","support","0","no","WebGPU" "WebGPU: WebGPU","GROUP_NORM","type=f32,ne=[9,9,1280,1],num_groups=32,eps=0.000001","support","0","no","WebGPU" "WebGPU: WebGPU","ACC","type=f32,ne_a=[256,17,1,1],ne_b=[256,16,1,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","PAD","type=f32,ne_a=[512,512,1,1],pad_0=1,pad_1=1,circular=0","support","0","no","WebGPU" -"WebGPU: WebGPU","PAD","type=f32,ne_a=[33,17,2,1],pad_0=4,pad_1=3,circular=1","support","0","no","WebGPU" -"WebGPU: WebGPU","PAD","type=f32,ne_a=[512,512,3,1],lp0=1,rp0=1,lp1=1,rp1=1,lp2=1,rp2=1,lp3=1,rp3=1,v=0,circular=0","support","0","no","WebGPU" +"WebGPU: WebGPU","PAD","type=f32,ne_a=[512,512,1,1],pad_0=1,pad_1=1","support","0","no","WebGPU" +"WebGPU: WebGPU","PAD","type=f32,ne_a=[512,512,3,1],lp0=1,rp0=1,lp1=1,rp1=1,lp2=1,rp2=1,lp3=1,rp3=1,v=0","support","0","no","WebGPU" "WebGPU: WebGPU","PAD_REFLECT_1D","type=f32,ne_a=[512,34,2,1],pad_0=10,pad_1=9","support","0","no","WebGPU" "WebGPU: WebGPU","PAD_REFLECT_1D","type=f32,ne_a=[3000,384,4,1],pad_0=10,pad_1=9","support","0","no","WebGPU" "WebGPU: WebGPU","ROLL","shift0=3,shift1=-2,shift3=1,shift4=-1","support","0","no","WebGPU" @@ -9941,7 +9903,6 @@ "WebGPU: WebGPU","CUMSUM","type=f32,ne=[10,5,4,3]","support","0","no","WebGPU" "WebGPU: WebGPU","CUMSUM","type=f32,ne=[127,5,4,3]","support","0","no","WebGPU" "WebGPU: WebGPU","CUMSUM","type=f32,ne=[128,5,4,3]","support","0","no","WebGPU" -"WebGPU: WebGPU","CUMSUM","type=f32,ne=[128,128,4,4]","support","0","no","WebGPU" "WebGPU: WebGPU","CUMSUM","type=f32,ne=[255,5,4,3]","support","0","no","WebGPU" "WebGPU: WebGPU","CUMSUM","type=f32,ne=[256,5,4,3]","support","0","no","WebGPU" "WebGPU: WebGPU","CUMSUM","type=f32,ne=[511,5,4,3]","support","0","no","WebGPU" @@ -9961,41 +9922,17 @@ "WebGPU: WebGPU","FILL","type=f32,ne=[303,207,11,3],c=2.000000","support","0","no","WebGPU" "WebGPU: WebGPU","FILL","type=f32,ne=[800,600,4,4],c=-152.000000","support","0","no","WebGPU" "WebGPU: WebGPU","FILL","type=f32,ne=[2048,512,2,2],c=3.500000","support","0","no","WebGPU" -"WebGPU: WebGPU","DIAG","type=f32,ne=[10,1,4,3]","support","0","no","WebGPU" -"WebGPU: WebGPU","DIAG","type=f32,ne=[79,1,19,13]","support","0","no","WebGPU" -"WebGPU: WebGPU","DIAG","type=f32,ne=[256,1,8,16]","support","0","no","WebGPU" "WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[10,10,4,3],ne_rhs=[3,10,4,3]","support","0","no","WebGPU" "WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[11,11,1,1],ne_rhs=[5,11,1,1]","support","0","no","WebGPU" "WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[17,17,2,4],ne_rhs=[9,17,2,4]","support","0","no","WebGPU" "WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[30,30,7,1],ne_rhs=[8,30,7,1]","support","0","no","WebGPU" "WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[42,42,5,2],ne_rhs=[10,42,5,2]","support","0","no","WebGPU" "WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[64,64,2,2],ne_rhs=[10,64,2,2]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[64,64,2,2],ne_rhs=[64,64,2,2]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[79,79,5,3],ne_rhs=[417,79,5,3]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,2],ne_rhs=[32,128,4,2]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[80,80,2,8],ne_rhs=[80,80,2,8]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[80,80,2,8],ne_rhs=[79,80,2,8]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[80,80,2,8],ne_rhs=[81,80,2,8]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[80,80,8,8],ne_rhs=[80,80,8,8]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[80,80,8,8],ne_rhs=[79,80,8,8]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[80,80,8,8],ne_rhs=[81,80,8,8]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[84,84,4,4],ne_rhs=[32,84,4,4]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[95,95,8,8],ne_rhs=[40,95,8,8]","support","0","no","WebGPU" "WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[100,100,4,4],ne_rhs=[41,100,4,4]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,4],ne_rhs=[31,128,4,4]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,4],ne_rhs=[32,128,4,4]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[128,128,3,4],ne_rhs=[32,128,3,4]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,1],ne_rhs=[32,128,4,1]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[64,64,4,4],ne_rhs=[200,64,4,4]","support","0","no","WebGPU" -"WebGPU: WebGPU","SOLVE_TRI","type=f32,ne_lhs=[64,64,4,4],ne_rhs=[384,64,4,4]","support","0","no","WebGPU" -"WebGPU: WebGPU","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=0,circular=0","support","0","no","WebGPU" -"WebGPU: WebGPU","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=0,circular=0","support","0","no","WebGPU" -"WebGPU: WebGPU","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=0,circular=1","support","0","no","WebGPU" -"WebGPU: WebGPU","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=0,circular=1","support","0","no","WebGPU" -"WebGPU: WebGPU","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=1,circular=0","support","0","no","WebGPU" -"WebGPU: WebGPU","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=1,circular=0","support","0","no","WebGPU" -"WebGPU: WebGPU","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=1,circular=1","support","0","no","WebGPU" -"WebGPU: WebGPU","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=1,circular=1","support","0","no","WebGPU" +"WebGPU: WebGPU","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=0","support","0","no","WebGPU" +"WebGPU: WebGPU","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=0","support","0","no","WebGPU" +"WebGPU: WebGPU","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=1","support","0","no","WebGPU" +"WebGPU: WebGPU","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=1","support","0","no","WebGPU" "WebGPU: WebGPU","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","WebGPU" "WebGPU: WebGPU","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","WebGPU" "WebGPU: WebGPU","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","WebGPU" diff --git a/docs/ops/zDNN.csv b/docs/ops/zDNN.csv index dcc55cd..5540c2c 100644 --- a/docs/ops/zDNN.csv +++ b/docs/ops/zDNN.csv @@ -27,20 +27,8 @@ "zDNN","HARDSIGMOID","type=f16,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" "zDNN","EXP","type=f16,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" "zDNN","EXP","type=f16,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" -"zDNN","EXPM1","type=f16,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" -"zDNN","EXPM1","type=f16,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" -"zDNN","SOFTPLUS","type=f16,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" -"zDNN","SOFTPLUS","type=f16,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" "zDNN","GELU_ERF","type=f16,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" "zDNN","GELU_ERF","type=f16,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" -"zDNN","FLOOR","type=f16,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" -"zDNN","FLOOR","type=f16,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" -"zDNN","CEIL","type=f16,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" -"zDNN","CEIL","type=f16,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" -"zDNN","ROUND","type=f16,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" -"zDNN","ROUND","type=f16,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" -"zDNN","TRUNC","type=f16,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" -"zDNN","TRUNC","type=f16,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" "zDNN","ABS","type=f16,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" "zDNN","ABS","type=f16,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" "zDNN","SGN","type=f16,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" @@ -69,20 +57,8 @@ "zDNN","HARDSIGMOID","type=f16,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" "zDNN","EXP","type=f16,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" "zDNN","EXP","type=f16,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" -"zDNN","EXPM1","type=f16,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" -"zDNN","EXPM1","type=f16,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" -"zDNN","SOFTPLUS","type=f16,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" -"zDNN","SOFTPLUS","type=f16,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" "zDNN","GELU_ERF","type=f16,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" "zDNN","GELU_ERF","type=f16,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" -"zDNN","FLOOR","type=f16,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" -"zDNN","FLOOR","type=f16,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" -"zDNN","CEIL","type=f16,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" -"zDNN","CEIL","type=f16,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" -"zDNN","ROUND","type=f16,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" -"zDNN","ROUND","type=f16,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" -"zDNN","TRUNC","type=f16,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" -"zDNN","TRUNC","type=f16,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" "zDNN","ABS","type=f32,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" "zDNN","ABS","type=f32,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" "zDNN","SGN","type=f32,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" @@ -111,20 +87,8 @@ "zDNN","HARDSIGMOID","type=f32,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" "zDNN","EXP","type=f32,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" "zDNN","EXP","type=f32,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" -"zDNN","EXPM1","type=f32,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" -"zDNN","EXPM1","type=f32,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" -"zDNN","SOFTPLUS","type=f32,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" -"zDNN","SOFTPLUS","type=f32,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" "zDNN","GELU_ERF","type=f32,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" "zDNN","GELU_ERF","type=f32,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" -"zDNN","FLOOR","type=f32,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" -"zDNN","FLOOR","type=f32,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" -"zDNN","CEIL","type=f32,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" -"zDNN","CEIL","type=f32,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" -"zDNN","ROUND","type=f32,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" -"zDNN","ROUND","type=f32,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" -"zDNN","TRUNC","type=f32,ne_a=[128,2,2,2],v=0","support","0","no","zDNN" -"zDNN","TRUNC","type=f32,ne_a=[5,7,11,13],v=0","support","0","no","zDNN" "zDNN","ABS","type=f32,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" "zDNN","ABS","type=f32,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" "zDNN","SGN","type=f32,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" @@ -153,20 +117,8 @@ "zDNN","HARDSIGMOID","type=f32,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" "zDNN","EXP","type=f32,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" "zDNN","EXP","type=f32,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" -"zDNN","EXPM1","type=f32,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" -"zDNN","EXPM1","type=f32,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" -"zDNN","SOFTPLUS","type=f32,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" -"zDNN","SOFTPLUS","type=f32,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" "zDNN","GELU_ERF","type=f32,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" "zDNN","GELU_ERF","type=f32,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" -"zDNN","FLOOR","type=f32,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" -"zDNN","FLOOR","type=f32,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" -"zDNN","CEIL","type=f32,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" -"zDNN","CEIL","type=f32,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" -"zDNN","ROUND","type=f32,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" -"zDNN","ROUND","type=f32,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" -"zDNN","TRUNC","type=f32,ne_a=[128,2,2,2],v=1","support","0","no","zDNN" -"zDNN","TRUNC","type=f32,ne_a=[5,7,11,13],v=1","support","0","no","zDNN" "zDNN","REGLU","type=f16,ne_a=[128,2,2,2],v=0,swapped=0","support","0","no","zDNN" "zDNN","REGLU","type=f16,ne_a=[5,7,11,13],v=0,swapped=0","support","0","no","zDNN" "zDNN","REGLU","type=f16,ne_a=[128,2,2,2],v=0,swapped=1","support","0","no","zDNN" @@ -295,109 +247,103 @@ "zDNN","SWIGLU_OAI","type=f32,ne_a=[128,2,2,2],v=1,alpha=0.500000,limit=7.000000","support","0","no","zDNN" "zDNN","SWIGLU_OAI","type=f32,ne_a=[128,2,2,2],v=1,alpha=1.702000,limit=2.000000","support","0","no","zDNN" "zDNN","SWIGLU_OAI","type=f32,ne_a=[128,2,2,2],v=1,alpha=1.702000,limit=7.000000","support","0","no","zDNN" -"zDNN","GET_ROWS","type=f32,n=76800,m=5,r=4,be1=1,be2=2,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=f32,n=256,m=80000,r=70000,be1=2,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=f32,n=256,m=5,r=4,be1=700,be2=100,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q4_0,n=76800,m=5,r=4,be1=1,be2=2,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q4_0,n=256,m=80000,r=70000,be1=2,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q4_0,n=256,m=5,r=4,be1=700,be2=100,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=f32,n=1,m=8,r=2,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=f32,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=f32,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=f32,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=f32,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=f16,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=f16,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=f16,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=f16,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=bf16,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=bf16,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=bf16,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=bf16,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q4_0,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q4_0,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q4_0,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q4_0,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q4_1,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q4_1,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q4_1,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q4_1,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q5_0,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q5_0,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q5_0,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q5_0,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q5_1,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q5_1,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q5_1,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q5_1,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q8_0,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q8_0,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q8_0,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q8_0,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=mxfp4,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=mxfp4,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=mxfp4,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=mxfp4,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q2_K,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q2_K,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q2_K,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q2_K,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q3_K,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q3_K,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q3_K,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q3_K,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q4_K,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q4_K,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q4_K,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q4_K,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q5_K,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q5_K,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q5_K,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q5_K,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q6_K,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q6_K,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q6_K,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=q6_K,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq2_xxs,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq2_xxs,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq2_xxs,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq2_xxs,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq2_xs,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq2_xs,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq2_xs,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq2_xs,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq2_s,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq2_s,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq2_s,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq2_s,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq3_xxs,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq3_xxs,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq3_xxs,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq3_xxs,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq1_s,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq1_s,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq1_s,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq1_s,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq1_m,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq1_m,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq1_m,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq1_m,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq4_nl,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq4_nl,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq4_nl,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq4_nl,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq3_s,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq3_s,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq3_s,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq3_s,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq4_xs,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq4_xs,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq4_xs,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=iq4_xs,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=i32,n=256,m=5,r=4,be1=1,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=i32,n=256,m=5,r=4,be1=1,be2=1,v=1","support","0","no","zDNN" -"zDNN","GET_ROWS","type=i32,n=256,m=5,r=4,be1=7,be2=1,v=0","support","0","no","zDNN" -"zDNN","GET_ROWS","type=i32,n=256,m=5,r=4,be1=7,be2=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=f32,n=1,m=8,r=2,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=f32,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=f32,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=f32,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=f32,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=f16,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=f16,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=f16,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=f16,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=bf16,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=bf16,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=bf16,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=bf16,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q4_0,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q4_0,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q4_0,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q4_0,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q4_1,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q4_1,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q4_1,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q4_1,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q5_0,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q5_0,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q5_0,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q5_0,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q5_1,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q5_1,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q5_1,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q5_1,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q8_0,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q8_0,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q8_0,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q8_0,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=mxfp4,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=mxfp4,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=mxfp4,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=mxfp4,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q2_K,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q2_K,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q2_K,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q2_K,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q3_K,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q3_K,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q3_K,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q3_K,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q4_K,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q4_K,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q4_K,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q4_K,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q5_K,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q5_K,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q5_K,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q5_K,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q6_K,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q6_K,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q6_K,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=q6_K,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq2_xxs,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq2_xxs,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq2_xxs,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq2_xxs,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq2_xs,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq2_xs,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq2_xs,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq2_xs,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq2_s,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq2_s,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq2_s,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq2_s,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq3_xxs,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq3_xxs,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq3_xxs,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq3_xxs,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq1_s,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq1_s,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq1_s,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq1_s,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq1_m,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq1_m,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq1_m,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq1_m,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq4_nl,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq4_nl,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq4_nl,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq4_nl,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq3_s,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq3_s,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq3_s,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq3_s,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq4_xs,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq4_xs,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq4_xs,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=iq4_xs,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=i32,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=i32,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" +"zDNN","GET_ROWS","type=i32,n=256,m=5,r=4,b=7,v=0","support","0","no","zDNN" +"zDNN","GET_ROWS","type=i32,n=256,m=5,r=4,b=7,v=1","support","0","no","zDNN" "zDNN","GET_ROWS_BACK","type=f32,n=1,m=8,r=2,b=1,v=0","support","0","no","zDNN" "zDNN","GET_ROWS_BACK","type=f32,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" "zDNN","GET_ROWS_BACK","type=f32,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" @@ -447,309 +393,307 @@ "zDNN","GET_ROWS_BACK","type=iq4_xs,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" "zDNN","GET_ROWS_BACK","type=i32,n=256,m=5,r=4,b=1,v=0","support","0","no","zDNN" "zDNN","GET_ROWS_BACK","type=i32,n=256,m=5,r=4,b=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[1,8,1,3],nr23=[1,1],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i32,ne=[1,8,1,3],nr23=[1,1],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q8_0,type_idx=i32,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[3,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[31,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[33,5,1,1],nr23=[2,3],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[3,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[31,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[33,5,1,1],nr23=[2,3],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[3,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[31,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[33,5,1,7],nr23=[2,3],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[3,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[31,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f32,type_idx=i64,ne=[33,5,1,7],nr23=[2,3],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[3,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[31,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[33,5,1,1],nr23=[2,3],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[3,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[31,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[33,5,1,1],nr23=[2,3],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[3,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[31,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[33,5,1,7],nr23=[2,3],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[3,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[31,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=f16,type_idx=i64,ne=[33,5,1,7],nr23=[2,3],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[3,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[31,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[33,5,1,1],nr23=[2,3],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[3,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[31,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[33,5,1,1],nr23=[2,3],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[3,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[31,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[33,5,1,7],nr23=[2,3],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[3,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[31,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=bf16,type_idx=i64,ne=[33,5,1,7],nr23=[2,3],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_0,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_0,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_0,type_idx=i64,ne=[96,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_0,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_0,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_0,type_idx=i64,ne=[96,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_0,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_0,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_0,type_idx=i64,ne=[96,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_0,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_0,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_0,type_idx=i64,ne=[96,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_1,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_1,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_1,type_idx=i64,ne=[96,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_1,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_1,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_1,type_idx=i64,ne=[96,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_1,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_1,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_1,type_idx=i64,ne=[96,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_1,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_1,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_1,type_idx=i64,ne=[96,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_0,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_0,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_0,type_idx=i64,ne=[96,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_0,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_0,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_0,type_idx=i64,ne=[96,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_0,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_0,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_0,type_idx=i64,ne=[96,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_0,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_0,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_0,type_idx=i64,ne=[96,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_1,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_1,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_1,type_idx=i64,ne=[96,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_1,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_1,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_1,type_idx=i64,ne=[96,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_1,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_1,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_1,type_idx=i64,ne=[96,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_1,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_1,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_1,type_idx=i64,ne=[96,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q8_0,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q8_0,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q8_0,type_idx=i64,ne=[96,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q8_0,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q8_0,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q8_0,type_idx=i64,ne=[96,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q8_0,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q8_0,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q8_0,type_idx=i64,ne=[96,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q8_0,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q8_0,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q8_0,type_idx=i64,ne=[96,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=mxfp4,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=mxfp4,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=mxfp4,type_idx=i64,ne=[96,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=mxfp4,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=mxfp4,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=mxfp4,type_idx=i64,ne=[96,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=mxfp4,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=mxfp4,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=mxfp4,type_idx=i64,ne=[96,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=mxfp4,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=mxfp4,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=mxfp4,type_idx=i64,ne=[96,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q2_K,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q2_K,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q2_K,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q2_K,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q2_K,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q2_K,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q2_K,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q2_K,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q2_K,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q2_K,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q2_K,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q2_K,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q3_K,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q3_K,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q3_K,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q3_K,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q3_K,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q3_K,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q3_K,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q3_K,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q3_K,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q3_K,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q3_K,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q3_K,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_K,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_K,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_K,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_K,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_K,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_K,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_K,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_K,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_K,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_K,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_K,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q4_K,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_K,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_K,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_K,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_K,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_K,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_K,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_K,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_K,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_K,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_K,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_K,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q5_K,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q6_K,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q6_K,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q6_K,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q6_K,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q6_K,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q6_K,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q6_K,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q6_K,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q6_K,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q6_K,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q6_K,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=q6_K,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xxs,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xxs,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xxs,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xxs,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xxs,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xxs,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xxs,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xxs,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xxs,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xxs,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xxs,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xxs,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xs,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xs,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xs,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xs,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xs,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xs,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xs,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xs,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xs,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xs,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xs,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_xs,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_s,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_s,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_s,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_s,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_s,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_s,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_s,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_s,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_s,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_s,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_s,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq2_s,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_xxs,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_xxs,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_xxs,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_xxs,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_xxs,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_xxs,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_xxs,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_xxs,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_xxs,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_xxs,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_xxs,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_xxs,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_s,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_s,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_s,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_s,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_s,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_s,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_s,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_s,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_s,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_s,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_s,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_s,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_m,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_m,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_m,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_m,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_m,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_m,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_m,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_m,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_m,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_m,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_m,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq1_m,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_nl,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_nl,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_nl,type_idx=i64,ne=[96,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_nl,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_nl,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_nl,type_idx=i64,ne=[96,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_nl,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_nl,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_nl,type_idx=i64,ne=[96,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_nl,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_nl,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_nl,type_idx=i64,ne=[96,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_s,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_s,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_s,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_s,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_s,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_s,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_s,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_s,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_s,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_s,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_s,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq3_s,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_xs,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_xs,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_xs,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_xs,type_idx=i64,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_xs,type_idx=i64,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_xs,type_idx=i64,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_xs,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_xs,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_xs,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_xs,type_idx=i64,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_xs,type_idx=i64,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" -"zDNN","SET_ROWS","type=iq4_xs,type_idx=i64,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[1,8,1,3],nr23=[1,1],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[3,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[31,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[33,5,1,1],nr23=[2,3],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[3,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[31,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[33,5,1,1],nr23=[2,3],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[3,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[31,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[33,5,1,7],nr23=[2,3],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[3,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[31,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f32,ne=[33,5,1,7],nr23=[2,3],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[3,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[31,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[33,5,1,1],nr23=[2,3],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[3,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[31,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[33,5,1,1],nr23=[2,3],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[3,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[31,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[33,5,1,7],nr23=[2,3],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[3,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[31,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=f16,ne=[33,5,1,7],nr23=[2,3],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[3,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[31,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[33,5,1,1],nr23=[2,3],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[3,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[31,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[33,5,1,1],nr23=[2,3],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[3,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[31,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[33,5,1,7],nr23=[2,3],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[3,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[31,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=bf16,ne=[33,5,1,7],nr23=[2,3],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_0,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_0,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_0,ne=[96,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_0,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_0,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_0,ne=[96,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_0,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_0,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_0,ne=[96,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_0,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_0,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_0,ne=[96,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_1,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_1,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_1,ne=[96,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_1,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_1,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_1,ne=[96,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_1,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_1,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_1,ne=[96,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_1,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_1,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_1,ne=[96,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_0,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_0,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_0,ne=[96,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_0,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_0,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_0,ne=[96,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_0,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_0,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_0,ne=[96,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_0,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_0,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_0,ne=[96,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_1,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_1,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_1,ne=[96,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_1,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_1,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_1,ne=[96,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_1,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_1,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_1,ne=[96,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_1,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_1,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_1,ne=[96,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q8_0,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q8_0,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q8_0,ne=[96,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q8_0,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q8_0,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q8_0,ne=[96,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q8_0,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q8_0,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q8_0,ne=[96,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q8_0,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q8_0,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q8_0,ne=[96,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=mxfp4,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=mxfp4,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=mxfp4,ne=[96,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=mxfp4,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=mxfp4,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=mxfp4,ne=[96,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=mxfp4,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=mxfp4,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=mxfp4,ne=[96,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=mxfp4,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=mxfp4,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=mxfp4,ne=[96,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q2_K,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q2_K,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q2_K,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q2_K,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q2_K,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q2_K,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q2_K,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q2_K,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q2_K,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q2_K,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q2_K,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q2_K,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q3_K,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q3_K,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q3_K,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q3_K,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q3_K,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q3_K,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q3_K,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q3_K,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q3_K,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q3_K,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q3_K,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q3_K,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_K,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_K,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_K,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_K,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_K,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_K,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_K,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_K,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_K,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_K,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_K,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q4_K,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_K,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_K,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_K,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_K,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_K,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_K,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_K,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_K,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_K,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_K,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_K,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q5_K,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q6_K,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q6_K,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q6_K,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q6_K,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q6_K,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q6_K,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q6_K,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q6_K,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q6_K,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q6_K,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q6_K,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=q6_K,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xxs,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xxs,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xxs,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xxs,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xxs,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xxs,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xxs,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xxs,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xxs,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xxs,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xxs,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xxs,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xs,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xs,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xs,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xs,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xs,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xs,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xs,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xs,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xs,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xs,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xs,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_xs,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_s,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_s,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_s,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_s,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_s,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_s,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_s,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_s,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_s,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_s,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_s,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq2_s,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_xxs,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_xxs,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_xxs,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_xxs,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_xxs,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_xxs,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_xxs,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_xxs,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_xxs,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_xxs,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_xxs,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_xxs,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_s,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_s,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_s,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_s,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_s,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_s,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_s,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_s,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_s,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_s,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_s,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_s,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_m,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_m,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_m,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_m,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_m,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_m,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_m,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_m,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_m,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_m,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_m,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq1_m,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_nl,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_nl,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_nl,ne=[96,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_nl,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_nl,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_nl,ne=[96,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_nl,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_nl,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_nl,ne=[96,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_nl,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_nl,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_nl,ne=[96,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_s,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_s,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_s,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_s,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_s,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_s,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_s,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_s,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_s,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_s,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_s,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq3_s,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_xs,ne=[256,5,1,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_xs,ne=[256,11,1,1],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_xs,ne=[768,3,1,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_xs,ne=[256,5,1,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_xs,ne=[256,11,1,1],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_xs,ne=[768,3,1,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_xs,ne=[256,5,7,3],nr23=[1,1],r=1,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_xs,ne=[256,11,1,7],nr23=[2,3],r=7,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_xs,ne=[768,3,7,1],nr23=[2,3],r=2,v=0","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_xs,ne=[256,5,7,3],nr23=[1,1],r=1,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_xs,ne=[256,11,1,7],nr23=[2,3],r=7,v=1","support","0","no","zDNN" +"zDNN","SET_ROWS","type=iq4_xs,ne=[768,3,7,1],nr23=[2,3],r=2,v=1","support","0","no","zDNN" "zDNN","POOL_2D","pool_type=avg,type_input=f32,ne_input=[10,10,3,1],k0=1,k1=1,s0=1,s1=1,p0=0,p1=0","support","0","no","zDNN" "zDNN","POOL_2D","pool_type=avg,type_input=f32,ne_input=[10,10,3,1],k0=1,k1=1,s0=1,s1=1,p0=0,p1=1","support","0","no","zDNN" "zDNN","POOL_2D","pool_type=avg,type_input=f32,ne_input=[10,10,3,1],k0=1,k1=1,s0=1,s1=1,p0=1,p1=0","support","0","no","zDNN" @@ -965,2058 +909,521 @@ "zDNN","IM2COL","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[12,12,1,2560],ne_kernel=[3,3,1,2560],s0=1,s1=1,p0=1,p1=1,d0=1,d1=1,is_2D=1","support","0","no","zDNN" "zDNN","IM2COL","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[12,12,2,2560],ne_kernel=[3,3,2,2560],s0=1,s1=1,p0=1,p1=1,d0=1,d1=1,is_2D=1","support","0","no","zDNN" "zDNN","IM2COL","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[5,5,1,32],ne_kernel=[3,4,1,32],s0=1,s1=1,p0=0,p1=0,d0=1,d1=1,is_2D=1","support","0","no","zDNN" -"zDNN","IM2COL","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[2,2,1536,729],ne_kernel=[2,2,1536,4096],s0=1,s1=1,p0=0,p1=0,d0=1,d1=1,is_2D=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[10,10,10,9],ne_kernel=[3,3,3,1],IC=3,s0=1,s1=1,s2=1,p0=1,p1=1,p2=1,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f16,dst_type=f32,ne_input=[10,10,10,9],ne_kernel=[3,3,3,1],IC=3,s0=1,s1=1,s2=1,p0=1,p1=1,p2=1,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[10,10,10,9],ne_kernel=[3,3,3,1],IC=3,s0=1,s1=1,s2=1,p0=1,p1=1,p2=1,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=1,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=0","support","0","no","zDNN" -"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3,v=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[10,10,10,9],ne_kernel=[3,3,3,1],IC=3,s0=1,s1=1,s2=1,p0=1,p1=1,p2=1,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f16,dst_type=f32,ne_input=[10,10,10,9],ne_kernel=[3,3,3,1],IC=3,s0=1,s1=1,s2=1,p0=1,p1=1,p2=1,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f16,dst_type=f16,ne_input=[10,10,10,9],ne_kernel=[3,3,3,1],IC=3,s0=1,s1=1,s2=1,p0=1,p1=1,p2=1,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=1,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=1,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=1,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=0,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=0,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=0,d0=3,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=1,d1=3,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=1,d2=3","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=1","support","0","no","zDNN" +"zDNN","IM2COL_3D","type_input=f32,type_kernel=f32,dst_type=f32,ne_input=[20,20,10,3],ne_kernel=[3,3,3,3],IC=3,s0=3,s1=3,s2=3,p0=3,p1=3,p2=3,d0=3,d1=3,d2=3","support","0","no","zDNN" "zDNN","CONV_2D","ne_input=[1,1,1,2],ne_kernel=[1,1,1,1],type_kernel=f32,stride0=1,stride1=5,padding0=5,padding1=2,dilation0=2,dilation1=4,cwhn=0","support","0","no","zDNN" "zDNN","CONV_2D","ne_input=[1,1,1,2],ne_kernel=[1,1,1,1],type_kernel=f16,stride0=1,stride1=5,padding0=5,padding1=2,dilation0=2,dilation1=4,cwhn=0","support","0","no","zDNN" "zDNN","CONV_2D","ne_input=[141,1,1,2],ne_kernel=[1,1,1,1],type_kernel=f32,stride0=1,stride1=5,padding0=5,padding1=2,dilation0=2,dilation1=4,cwhn=0","support","0","no","zDNN" @@ -4965,7 +3372,6 @@ "zDNN","CONV_TRANSPOSE_1D","ne_input=[2,1,1,1],ne_kernel=[3,1,1,1],s0=1,p0=0,d0=1","support","0","no","zDNN" "zDNN","CONV_TRANSPOSE_2D","ne_input=[3,2,3,1],ne_kernel=[2,2,1,3],stride=1","support","0","no","zDNN" "zDNN","CONV_TRANSPOSE_2D","ne_input=[10,10,9,1],ne_kernel=[3,3,1,9],stride=2","support","0","no","zDNN" -"zDNN","CONV_TRANSPOSE_2D","ne_input=[129,63,35,1],ne_kernel=[3,3,48,35],stride=1","support","0","no","zDNN" "zDNN","COUNT_EQUAL","type=f32,ne=[4,500,1,1]","support","0","no","zDNN" "zDNN","COUNT_EQUAL","type=f32,ne=[4,5000,1,1]","support","0","no","zDNN" "zDNN","ARGMAX","type=f32,ne=[32,1,1,1]","support","0","no","zDNN" @@ -5015,451 +3421,411 @@ "zDNN","SET","type_src=i32,type_dst=i32,ne=[6,5,4,3],dim=1","support","0","no","zDNN" "zDNN","SET","type_src=i32,type_dst=i32,ne=[6,5,4,3],dim=2","support","0","no","zDNN" "zDNN","SET","type_src=i32,type_dst=i32,ne=[6,5,4,3],dim=3","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[1,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[1,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[1,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[2,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[2,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[2,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[3,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[3,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[3,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f16,ne=[1,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f16,ne=[1,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f16,ne=[1,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f16,ne=[2,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f16,ne=[2,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f16,ne=[2,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f16,ne=[3,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f16,ne=[3,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f16,ne=[3,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[1,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[1,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[1,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[2,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[2,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[2,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[3,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[3,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[3,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[32,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[32,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[32,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[64,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[64,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[64,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[96,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[96,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[96,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[32,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[32,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[32,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[64,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[64,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[64,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[96,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[96,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[96,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[32,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[32,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[32,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[64,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[64,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[64,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[96,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[96,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[96,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[32,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[32,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[32,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[64,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[64,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[64,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[96,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[96,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[96,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[32,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[32,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[32,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[64,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[64,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[64,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[96,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[96,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[96,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[32,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[32,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[32,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[64,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[64,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[64,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[96,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[96,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[96,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[32,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[32,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[32,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[64,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[64,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[64,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[96,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[96,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[96,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f16,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f16,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=bf16,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=bf16,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q4_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q4_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q4_1,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q4_1,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q5_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q5_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q5_1,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q5_1,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q8_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q8_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=mxfp4,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=mxfp4,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q2_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q2_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q3_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q3_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q4_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q4_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q5_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q5_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q6_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=q6_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq2_xxs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq2_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq2_xs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq2_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq2_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq2_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq3_xxs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq3_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq1_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq1_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq1_m,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq1_m,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq4_nl,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq4_nl,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq3_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq3_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq4_xs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=iq4_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=f16,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=f16,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q4_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q4_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q4_1,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q4_1,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q5_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q5_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q5_1,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q5_1,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q8_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q8_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=mxfp4,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=mxfp4,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q2_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q2_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q3_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q3_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q4_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q4_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q5_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q5_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q6_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=q6_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq2_xxs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq2_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq2_xs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq2_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq2_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq2_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq3_xxs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq3_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq1_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq1_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq1_m,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq1_m,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq4_nl,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq4_nl,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq3_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq3_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq4_xs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=iq4_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f16,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f16,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=bf16,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=bf16,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q4_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q4_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q4_1,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q4_1,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q5_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q5_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q5_1,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q5_1,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q8_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q8_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=mxfp4,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=mxfp4,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q2_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q2_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q3_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q3_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q4_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q4_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q5_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q5_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q6_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=q6_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq2_xxs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq2_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq2_xs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq2_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq2_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq2_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq3_xxs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq3_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq1_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq1_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq1_m,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq1_m,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq4_nl,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq4_nl,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq3_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq3_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq4_xs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=iq4_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_0,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_0,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_1,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_1,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_0,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_0,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_1,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_1,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q8_0,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q8_0,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=mxfp4,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=mxfp4,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q2_K,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q2_K,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q3_K,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q3_K,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_K,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q4_K,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_K,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q5_K,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q6_K,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=q6_K,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xxs,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xxs,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xs,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_xs,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_s,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq2_s,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_xxs,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_xxs,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_s,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_s,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_m,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq1_m,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_nl,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_nl,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_s,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq3_s,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_xs,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=iq4_xs,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f16,ne=[256,2,3,4],permute_src=[1,0,2,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f32,ne=[256,2,3,4],permute_src=[1,0,2,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f16,ne=[256,2,3,4],permute_src=[1,0,2,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[256,2,3,4],permute_src=[1,0,2,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=i32,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=i32,ne=[256,2,3,4],permute_src=[1,0,2,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=i32,type_dst=f32,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=i32,type_dst=f32,ne=[256,2,3,4],permute_src=[1,0,2,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f16,ne=[256,4,3,1],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=1","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[256,4,3,1],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=1","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[256,4,3,3],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=1","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[256,4,3,1],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=1","support","0","no","zDNN" -"zDNN","CPY","type_src=f16,type_dst=f16,ne=[256,4,1,1],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=1","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[256,4,1,1],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=1","support","0","no","zDNN" -"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[256,4,1,1],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=1","support","0","no","zDNN" -"zDNN","CPY","type_src=i32,type_dst=i32,ne=[256,4,1,1],permute_src=[0,0,0,0],permute_dst=[0,0,0,0],_src_transpose=1","support","0","no","zDNN" -"zDNN","CPY","type_src=i32,type_dst=i32,ne=[256,1,4,1],permute_src=[1,2,0,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CPY","type_src=f32,type_dst=f32,ne=[256,1,4,1],permute_src=[1,2,0,3],permute_dst=[0,0,0,0],_src_transpose=0","support","0","no","zDNN" -"zDNN","CONT","type=f32,ne=[2,1,1,1],use_view_slice=1","support","0","no","zDNN" -"zDNN","CONT","type=f32,ne=[2,1,3,5],use_view_slice=1","support","0","no","zDNN" -"zDNN","CONT","type=f32,ne=[2,3,5,7],use_view_slice=1","support","0","no","zDNN" -"zDNN","CONT","type=f32,ne=[1,4,4,1],use_view_slice=1","support","0","no","zDNN" -"zDNN","CONT","type=f32,ne=[1,8,17,1],use_view_slice=1","support","0","no","zDNN" -"zDNN","CONT","type=f32,ne=[10,10,10,1],use_view_slice=1","support","0","no","zDNN" -"zDNN","CONT","type=f32,ne=[2,1,1,1],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=f32,ne=[2,1,3,5],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=f32,ne=[2,3,5,7],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=f32,ne=[1,4,4,1],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=f32,ne=[1,8,17,1],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=f32,ne=[10,10,10,1],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=i32,ne=[2,1,1,1],use_view_slice=1","support","0","no","zDNN" -"zDNN","CONT","type=i32,ne=[2,1,3,5],use_view_slice=1","support","0","no","zDNN" -"zDNN","CONT","type=i32,ne=[2,3,5,7],use_view_slice=1","support","0","no","zDNN" -"zDNN","CONT","type=i32,ne=[1,4,4,1],use_view_slice=1","support","0","no","zDNN" -"zDNN","CONT","type=i32,ne=[1,8,17,1],use_view_slice=1","support","0","no","zDNN" -"zDNN","CONT","type=i32,ne=[10,10,10,1],use_view_slice=1","support","0","no","zDNN" -"zDNN","CONT","type=i32,ne=[2,1,1,1],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=i32,ne=[2,1,3,5],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=i32,ne=[2,3,5,7],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=i32,ne=[1,4,4,1],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=i32,ne=[1,8,17,1],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=i32,ne=[10,10,10,1],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=f16,ne=[2,1,1,1],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=f16,ne=[2,1,3,5],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=f16,ne=[2,3,5,7],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=f16,ne=[1,4,4,1],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=f16,ne=[1,8,17,1],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=f16,ne=[10,10,10,1],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=bf16,ne=[2,1,1,1],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=bf16,ne=[2,1,3,5],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=bf16,ne=[2,3,5,7],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=bf16,ne=[1,4,4,1],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=bf16,ne=[1,8,17,1],use_view_slice=0","support","0","no","zDNN" -"zDNN","CONT","type=bf16,ne=[10,10,10,1],use_view_slice=0","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f32,ne=[1,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f32,ne=[1,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f32,ne=[1,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f32,ne=[2,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f32,ne=[2,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f32,ne=[2,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f32,ne=[3,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f32,ne=[3,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f32,ne=[3,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f16,ne=[1,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f16,ne=[1,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f16,ne=[1,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f16,ne=[2,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f16,ne=[2,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f16,ne=[2,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f16,ne=[3,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f16,ne=[3,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f16,ne=[3,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[1,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[1,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[1,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[2,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[2,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[2,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[3,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[3,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[3,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[32,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[32,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[32,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[64,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[64,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[64,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[96,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[96,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_0,type_dst=q4_0,ne=[96,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[32,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[32,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[32,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[64,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[64,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[64,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[96,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[96,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_1,type_dst=q4_1,ne=[96,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[32,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[32,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[32,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[64,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[64,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[64,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[96,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[96,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_0,type_dst=q5_0,ne=[96,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[32,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[32,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[32,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[64,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[64,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[64,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[96,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[96,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_1,type_dst=q5_1,ne=[96,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[32,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[32,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[32,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[64,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[64,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[64,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[96,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[96,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q8_0,type_dst=q8_0,ne=[96,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[32,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[32,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[32,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[64,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[64,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[64,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[96,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[96,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=mxfp4,type_dst=mxfp4,ne=[96,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q2_K,type_dst=q2_K,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q3_K,type_dst=q3_K,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_K,type_dst=q4_K,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_K,type_dst=q5_K,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q6_K,type_dst=q6_K,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xxs,type_dst=iq2_xxs,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xs,type_dst=iq2_xs,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_s,type_dst=iq2_s,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_xxs,type_dst=iq3_xxs,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_s,type_dst=iq1_s,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_m,type_dst=iq1_m,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[32,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[32,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[32,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[64,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[64,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[64,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[96,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[96,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_nl,type_dst=iq4_nl,ne=[96,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_s,type_dst=iq3_s,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[256,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[256,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[512,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[512,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[512,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[768,2,3,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[768,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_xs,type_dst=iq4_xs,ne=[768,2,3,4],permute_src=[0,3,1,2],permute_dst=[0,2,1,3]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f16,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f16,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=bf16,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=bf16,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q4_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q4_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q4_1,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q4_1,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q5_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q5_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q5_1,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q5_1,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q8_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q8_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=mxfp4,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=mxfp4,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q2_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q2_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q3_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q3_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q4_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q4_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q5_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q5_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q6_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=q6_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq2_xxs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq2_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq2_xs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq2_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq2_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq2_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq3_xxs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq3_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq1_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq1_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq1_m,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq1_m,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq4_nl,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq4_nl,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq3_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq3_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq4_xs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=iq4_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=f16,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=f16,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=bf16,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q4_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q4_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q4_1,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q4_1,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q5_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q5_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q5_1,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q5_1,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q8_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q8_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=mxfp4,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=mxfp4,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q2_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q2_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q3_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q3_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q4_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q4_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q5_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q5_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q6_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=q6_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq2_xxs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq2_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq2_xs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq2_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq2_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq2_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq3_xxs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq3_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq1_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq1_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq1_m,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq1_m,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq4_nl,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq4_nl,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq3_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq3_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq4_xs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=iq4_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f16,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f16,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=bf16,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=bf16,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q4_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q4_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q4_1,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q4_1,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q5_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q5_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q5_1,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q5_1,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q8_0,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q8_0,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=mxfp4,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=mxfp4,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q2_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q2_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q3_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q3_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q4_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q4_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q5_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q5_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q6_K,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=q6_K,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq2_xxs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq2_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq2_xs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq2_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq2_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq2_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq3_xxs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq3_xxs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq1_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq1_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq1_m,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq1_m,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq4_nl,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq4_nl,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq3_s,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq3_s,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq4_xs,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=iq4_xs,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=bf16,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_0,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_0,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_1,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_1,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_0,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_0,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_1,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_1,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q8_0,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q8_0,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=mxfp4,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=mxfp4,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q2_K,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q2_K,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q3_K,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q3_K,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_K,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q4_K,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_K,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q5_K,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q6_K,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=q6_K,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xxs,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xxs,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xs,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_xs,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_s,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq2_s,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_xxs,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_xxs,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_s,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_s,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_m,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq1_m,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_nl,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_nl,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_s,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq3_s,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_xs,type_dst=f32,ne=[256,4,4,4],permute_src=[0,0,0,0],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=iq4_xs,type_dst=f32,ne=[256,2,3,4],permute_src=[0,2,1,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f16,ne=[256,2,3,4],permute_src=[1,0,2,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f16,type_dst=f32,ne=[256,2,3,4],permute_src=[1,0,2,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f16,ne=[256,2,3,4],permute_src=[1,0,2,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CPY","type_src=f32,type_dst=f32,ne=[256,2,3,4],permute_src=[1,0,2,3],permute_dst=[0,0,0,0]","support","0","no","zDNN" +"zDNN","CONT","type=f32,ne=[10,10,10,1]","support","0","no","zDNN" +"zDNN","CONT","type=f32,ne=[2,1,1,1]","support","0","no","zDNN" +"zDNN","CONT","type=f32,ne=[2,1,3,5]","support","0","no","zDNN" +"zDNN","CONT","type=f32,ne=[2,3,5,7]","support","0","no","zDNN" +"zDNN","CONT","type=f16,ne=[2,1,1,1]","support","0","no","zDNN" +"zDNN","CONT","type=f16,ne=[2,1,3,5]","support","0","no","zDNN" +"zDNN","CONT","type=f16,ne=[2,3,5,7]","support","0","no","zDNN" +"zDNN","CONT","type=bf16,ne=[2,1,1,1]","support","0","no","zDNN" +"zDNN","CONT","type=bf16,ne=[2,1,3,5]","support","0","no","zDNN" +"zDNN","CONT","type=bf16,ne=[2,3,5,7]","support","0","no","zDNN" "zDNN","ADD","type=f16,ne=[1,1,8,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" "zDNN","SUB","type=f16,ne=[1,1,8,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" "zDNN","MUL","type=f16,ne=[1,1,8,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" @@ -5512,10 +3878,6 @@ "zDNN","SUB","type=f16,ne=[10,5,4,3],nr=[2,2,2,2],nf=1","support","0","no","zDNN" "zDNN","MUL","type=f16,ne=[10,5,4,3],nr=[2,2,2,2],nf=1","support","0","no","zDNN" "zDNN","DIV","type=f16,ne=[10,5,4,3],nr=[2,2,2,2],nf=1","support","0","no","zDNN" -"zDNN","ADD","type=f16,ne=[1,1,65536,1],nr=[256,1,1,1],nf=1","support","0","no","zDNN" -"zDNN","SUB","type=f16,ne=[1,1,65536,1],nr=[256,1,1,1],nf=1","support","0","no","zDNN" -"zDNN","MUL","type=f16,ne=[1,1,65536,1],nr=[256,1,1,1],nf=1","support","0","no","zDNN" -"zDNN","DIV","type=f16,ne=[1,1,65536,1],nr=[256,1,1,1],nf=1","support","0","no","zDNN" "zDNN","ADD","type=f16,ne=[1280,1,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" "zDNN","SUB","type=f16,ne=[1280,1,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" "zDNN","MUL","type=f16,ne=[1280,1,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" @@ -5568,10 +3930,6 @@ "zDNN","SUB","type=f16,ne=[640,1,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" "zDNN","MUL","type=f16,ne=[640,1,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" "zDNN","DIV","type=f16,ne=[640,1,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" -"zDNN","ADD","type=f16,ne=[64,262144,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" -"zDNN","SUB","type=f16,ne=[64,262144,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" -"zDNN","MUL","type=f16,ne=[64,262144,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" -"zDNN","DIV","type=f16,ne=[64,262144,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" "zDNN","ADD","type=f32,ne=[1,1,8,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" "zDNN","SUB","type=f32,ne=[1,1,8,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" "zDNN","MUL","type=f32,ne=[1,1,8,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" @@ -5624,10 +3982,6 @@ "zDNN","SUB","type=f32,ne=[10,5,4,3],nr=[2,2,2,2],nf=1","support","0","no","zDNN" "zDNN","MUL","type=f32,ne=[10,5,4,3],nr=[2,2,2,2],nf=1","support","0","no","zDNN" "zDNN","DIV","type=f32,ne=[10,5,4,3],nr=[2,2,2,2],nf=1","support","0","no","zDNN" -"zDNN","ADD","type=f32,ne=[1,1,65536,1],nr=[256,1,1,1],nf=1","support","0","no","zDNN" -"zDNN","SUB","type=f32,ne=[1,1,65536,1],nr=[256,1,1,1],nf=1","support","0","no","zDNN" -"zDNN","MUL","type=f32,ne=[1,1,65536,1],nr=[256,1,1,1],nf=1","support","0","no","zDNN" -"zDNN","DIV","type=f32,ne=[1,1,65536,1],nr=[256,1,1,1],nf=1","support","0","no","zDNN" "zDNN","ADD","type=f32,ne=[1280,1,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" "zDNN","SUB","type=f32,ne=[1280,1,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" "zDNN","MUL","type=f32,ne=[1280,1,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" @@ -5680,52 +4034,83 @@ "zDNN","SUB","type=f32,ne=[640,1,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" "zDNN","MUL","type=f32,ne=[640,1,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" "zDNN","DIV","type=f32,ne=[640,1,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" -"zDNN","ADD","type=f32,ne=[64,262144,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" -"zDNN","SUB","type=f32,ne=[64,262144,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" -"zDNN","MUL","type=f32,ne=[64,262144,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" -"zDNN","DIV","type=f32,ne=[64,262144,1,1],nr=[1,1,1,1],nf=1","support","0","no","zDNN" +"zDNN","ADD","type=f32,ne=[10,5,4,3],nr=[2,1,1,1],nf=2","support","0","no","zDNN" +"zDNN","ADD","type=f32,ne=[16,5,4,3],nr=[1,2,1,1],nf=3","support","0","no","zDNN" +"zDNN","ADD","type=f32,ne=[10,5,4,3],nr=[1,1,2,1],nf=4","support","0","no","zDNN" +"zDNN","ADD","type=f32,ne=[16,5,4,3],nr=[1,1,1,2],nf=5","support","0","no","zDNN" +"zDNN","ADD","type=f32,ne=[10,5,4,3],nr=[1,1,2,2],nf=6","support","0","no","zDNN" +"zDNN","ADD","type=f32,ne=[10,5,4,3],nr=[1,2,2,2],nf=7","support","0","no","zDNN" +"zDNN","ADD","type=f32,ne=[16,5,4,3],nr=[2,2,2,2],nf=8","support","0","no","zDNN" +"zDNN","ADD","type=f32,ne=[16,5,4,3],nr=[1,1,1,1],nf=16","support","0","no","zDNN" "zDNN","ADD1","type=f32,ne=[10,5,4,3]","support","0","no","zDNN" -"zDNN","ADD1","type=f32,ne=[1024,1024,1,1]","support","0","no","zDNN" -"zDNN","SCALE","type=f32,ne=[10,10,10,10],scale=2.000000,bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SCALE","type=f32,ne=[10,10,10,10],scale=2.000000,bias=1.000000,inplace=0","support","0","no","zDNN" -"zDNN","SCALE","type=f32,ne=[10,10,10,10],scale=2.000000,bias=1.000000,inplace=1","support","0","no","zDNN" -"zDNN","SCALE","type=f32,ne=[100,10,10,10],scale=2.000000,bias=1.000000,inplace=0","support","0","no","zDNN" +"zDNN","SCALE","type=f32,ne=[10,10,10,10],scale=2.000000,bias=0.000000","support","0","no","zDNN" +"zDNN","SCALE","type=f32,ne=[10,10,10,10],scale=2.000000,bias=1.000000","support","0","no","zDNN" +"zDNN","SOFTCAP","type=f32,ne=[10,10,10,10],softcap=50.000000","support","0","no","zDNN" "zDNN","SILU_BACK","type=f32,ne=[64,5,4,3],eps=0.000001","support","0","no","zDNN" "zDNN","NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000000","support","0","no","zDNN" -"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000000,inplace=0","support","0","no","zDNN" +"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000000","support","0","no","zDNN" "zDNN","NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.000000","support","0","no","zDNN" -"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.000000,inplace=0","support","0","no","zDNN" +"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.000000","support","0","no","zDNN" "zDNN","RMS_NORM_BACK","type=f32,ne=[64,5,4,3],eps=0.000000","support","0","no","zDNN" "zDNN","L2_NORM","type=f32,ne=[64,5,4,3]","support","0","no","zDNN" "zDNN","NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000001","support","0","no","zDNN" -"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000001,inplace=0","support","0","no","zDNN" +"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000001","support","0","no","zDNN" "zDNN","NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.000001","support","0","no","zDNN" -"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.000001,inplace=0","support","0","no","zDNN" +"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.000001","support","0","no","zDNN" "zDNN","RMS_NORM_BACK","type=f32,ne=[64,5,4,3],eps=0.000001","support","0","no","zDNN" "zDNN","L2_NORM","type=f32,ne=[64,5,4,3]","support","0","no","zDNN" "zDNN","NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000100","support","0","no","zDNN" -"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000100,inplace=0","support","0","no","zDNN" +"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000100","support","0","no","zDNN" "zDNN","NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.000100","support","0","no","zDNN" -"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.000100,inplace=0","support","0","no","zDNN" +"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.000100","support","0","no","zDNN" "zDNN","RMS_NORM_BACK","type=f32,ne=[64,5,4,3],eps=0.000100","support","0","no","zDNN" "zDNN","L2_NORM","type=f32,ne=[64,5,4,3]","support","0","no","zDNN" "zDNN","NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.100000","support","0","no","zDNN" -"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.100000,inplace=0","support","0","no","zDNN" +"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.100000","support","0","no","zDNN" "zDNN","NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.100000","support","0","no","zDNN" -"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.100000,inplace=0","support","0","no","zDNN" +"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.100000","support","0","no","zDNN" "zDNN","RMS_NORM_BACK","type=f32,ne=[64,5,4,3],eps=0.100000","support","0","no","zDNN" "zDNN","L2_NORM","type=f32,ne=[64,5,4,3]","support","0","no","zDNN" -"zDNN","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000001,inplace=1","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.000000,broadcast=0,multi_add=0","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.000000,broadcast=1,multi_add=0","support","0","no","zDNN" +"zDNN","NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.000000,broadcast=0","support","0","no","zDNN" +"zDNN","NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.000000,broadcast=1","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.000001,broadcast=0,multi_add=0","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.000001,broadcast=1,multi_add=0","support","0","no","zDNN" +"zDNN","NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.000001,broadcast=0","support","0","no","zDNN" +"zDNN","NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.000001,broadcast=1","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.000100,broadcast=0,multi_add=0","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.000100,broadcast=1,multi_add=0","support","0","no","zDNN" +"zDNN","NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.000100,broadcast=0","support","0","no","zDNN" +"zDNN","NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.000100,broadcast=1","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.100000,broadcast=0,multi_add=0","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.100000,broadcast=1,multi_add=0","support","0","no","zDNN" +"zDNN","NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.100000,broadcast=0","support","0","no","zDNN" +"zDNN","NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.100000,broadcast=1","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=1.000000,broadcast=0,multi_add=0","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=1.000000,broadcast=1,multi_add=0","support","0","no","zDNN" +"zDNN","NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=1.000000,broadcast=0","support","0","no","zDNN" +"zDNN","NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=1.000000,broadcast=1","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[1,1,1,1],eps=0.000001,broadcast=0,multi_add=0","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[1,1,1,1],eps=0.000001,broadcast=0,multi_add=1","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[511,1,1,1],eps=0.000001,broadcast=0,multi_add=0","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[511,1,1,1],eps=0.000001,broadcast=0,multi_add=1","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[1025,1,1,1],eps=0.000001,broadcast=0,multi_add=0","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[1025,1,1,1],eps=0.000001,broadcast=0,multi_add=1","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[8192,1,1,1],eps=0.000001,broadcast=0,multi_add=0","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[8192,1,1,1],eps=0.000001,broadcast=0,multi_add=1","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[16896,1,1,1],eps=0.000001,broadcast=0,multi_add=0","support","0","no","zDNN" +"zDNN","RMS_NORM_MUL_ADD","type=f32,ne=[16896,1,1,1],eps=0.000001,broadcast=0,multi_add=1","support","0","no","zDNN" "zDNN","L2_NORM","type=f32,ne=[64,5,4,3]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[3,1024,1,1],ne_b=[3,1024,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[6,1024,1,1],ne_b=[3,1024,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[3,1024,4,1],ne_b=[3,1024,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[3,1536,1,1],ne_b=[3,1536,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[6,1536,1,1],ne_b=[3,1536,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[3,1536,4,1],ne_b=[3,1536,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[3,2048,1,1],ne_b=[3,2048,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[6,2048,1,1],ne_b=[3,2048,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[3,2048,4,1],ne_b=[3,2048,1,1]","support","0","no","zDNN" +"zDNN","SSM_CONV","type=f32,ne_a=[4,1024,1,1],ne_b=[3,1024,1,1]","support","0","no","zDNN" +"zDNN","SSM_CONV","type=f32,ne_a=[8,1024,1,1],ne_b=[3,1024,1,1]","support","0","no","zDNN" +"zDNN","SSM_CONV","type=f32,ne_a=[4,1024,4,1],ne_b=[3,1024,1,1]","support","0","no","zDNN" +"zDNN","SSM_CONV","type=f32,ne_a=[4,1536,1,1],ne_b=[3,1536,1,1]","support","0","no","zDNN" +"zDNN","SSM_CONV","type=f32,ne_a=[8,1536,1,1],ne_b=[3,1536,1,1]","support","0","no","zDNN" +"zDNN","SSM_CONV","type=f32,ne_a=[4,1536,4,1],ne_b=[3,1536,1,1]","support","0","no","zDNN" +"zDNN","SSM_CONV","type=f32,ne_a=[4,2048,1,1],ne_b=[3,2048,1,1]","support","0","no","zDNN" +"zDNN","SSM_CONV","type=f32,ne_a=[8,2048,1,1],ne_b=[3,2048,1,1]","support","0","no","zDNN" +"zDNN","SSM_CONV","type=f32,ne_a=[4,2048,4,1],ne_b=[3,2048,1,1]","support","0","no","zDNN" "zDNN","SSM_CONV","type=f32,ne_a=[4,1024,1,1],ne_b=[4,1024,1,1]","support","0","no","zDNN" "zDNN","SSM_CONV","type=f32,ne_a=[8,1024,1,1],ne_b=[4,1024,1,1]","support","0","no","zDNN" "zDNN","SSM_CONV","type=f32,ne_a=[4,1024,4,1],ne_b=[4,1024,1,1]","support","0","no","zDNN" @@ -5735,15 +4120,6 @@ "zDNN","SSM_CONV","type=f32,ne_a=[4,2048,1,1],ne_b=[4,2048,1,1]","support","0","no","zDNN" "zDNN","SSM_CONV","type=f32,ne_a=[8,2048,1,1],ne_b=[4,2048,1,1]","support","0","no","zDNN" "zDNN","SSM_CONV","type=f32,ne_a=[4,2048,4,1],ne_b=[4,2048,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[9,1024,1,1],ne_b=[9,1024,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[18,1024,1,1],ne_b=[9,1024,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[9,1024,4,1],ne_b=[9,1024,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[9,1536,1,1],ne_b=[9,1536,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[18,1536,1,1],ne_b=[9,1536,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[9,1536,4,1],ne_b=[9,1536,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[9,2048,1,1],ne_b=[9,2048,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[18,2048,1,1],ne_b=[9,2048,1,1]","support","0","no","zDNN" -"zDNN","SSM_CONV","type=f32,ne_a=[9,2048,4,1],ne_b=[9,2048,1,1]","support","0","no","zDNN" "zDNN","SSM_SCAN","type=f32,d_state=16,head_dim=1,n_head=1024,n_group=1,n_seq_tokens=32,n_seqs=4","support","0","no","zDNN" "zDNN","SSM_SCAN","type=f32,d_state=128,head_dim=64,n_head=16,n_group=2,n_seq_tokens=32,n_seqs=4","support","0","no","zDNN" "zDNN","SSM_SCAN","type=f32,d_state=256,head_dim=64,n_head=8,n_group=2,n_seq_tokens=32,n_seqs=4","support","0","no","zDNN" @@ -5759,1836 +4135,1548 @@ "zDNN","GATED_LINEAR_ATTN","type=f32,head_count=32,head_size=64,n_seq_tokens=32,n_seqs=1","support","0","no","zDNN" "zDNN","GATED_LINEAR_ATTN","type=f32,head_count=32,head_size=64,n_seq_tokens=32,n_seqs=4","support","0","no","zDNN" "zDNN","GATED_LINEAR_ATTN","type=f32,head_count=32,head_size=64,n_seq_tokens=128,n_seqs=4","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=32,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=1,k=32,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=1,k=32,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=32,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=1,k=32,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=1,k=1,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","1","yes","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=64,n=2,k=128,bs=[8,1],nr=[1,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=83,n=2,k=128,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=64,n=2,k=64,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=83,n=2,k=64,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=64,n=45,k=128,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=45,k=64,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=193,bs=[1,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=67,bs=[1,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=32,k=32,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=3","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[1,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[1,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[1,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[1,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[1,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[1,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[1,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[1,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[1,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[1,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[1,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[1,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[1,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[1,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[1,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[1,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[1,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[1,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[1,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[1,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[1,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[1,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[1,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[1,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[1,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[1,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[1,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[1,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[1,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[1,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[1,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[1,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[1,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[1,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[1,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[1,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[1,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[2,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[2,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[2,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[2,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[2,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[2,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[2,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[2,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[2,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[2,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[2,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[2,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[2,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[2,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[2,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[2,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[2,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[2,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[2,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[2,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[2,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[2,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[2,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[2,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[2,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[2,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[2,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[2,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[2,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[2,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[2,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[2,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[2,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[2,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[2,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[2,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[2,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[2,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[2,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[2,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[2,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[2,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[2,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[2,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[2,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[2,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[2,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[2,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[4,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[4,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[4,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[4,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[4,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[4,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[4,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[4,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[4,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[4,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[4,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[4,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[4,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[4,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[4,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[4,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[4,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[4,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[4,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[4,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[4,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[4,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[4,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[4,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[4,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[4,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[4,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[4,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[4,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[4,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[4,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[4,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[4,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[4,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[4,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[4,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[4,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[4,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[4,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[4,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[4,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[4,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[4,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[4,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[4,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[4,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[4,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[4,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[8,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[8,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[8,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[8,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[8,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[8,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[8,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[8,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[8,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[8,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[8,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[8,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[8,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[8,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[8,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[8,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[8,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[8,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[8,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[8,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[8,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[8,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[8,1],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[8,1],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[8,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[8,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[8,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[8,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[8,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[8,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[8,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[8,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[8,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[8,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[8,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[8,1],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[8,1],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[1,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[1,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[1,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[1,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[1,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[1,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[1,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[1,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[1,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[1,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[1,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[1,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[1,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[1,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[1,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[1,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[1,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[1,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[1,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[1,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[1,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[1,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[1,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[1,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[1,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[1,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[1,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[1,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[1,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[1,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[1,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[1,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[1,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[1,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[1,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[1,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[1,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[1,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[1,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[1,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[1,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[1,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[1,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[1,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[1,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[1,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[1,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[1,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[2,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[2,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[2,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[2,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[2,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[2,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[2,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[2,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[2,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[2,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[2,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[2,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[2,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[2,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[2,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[2,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[2,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[2,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[2,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[2,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[2,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[2,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[2,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[2,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[2,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[2,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[2,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[2,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[2,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[2,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[2,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[2,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[2,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[2,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[2,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[2,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[2,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[4,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[4,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[4,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[4,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[4,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[4,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[4,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[4,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[4,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[4,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[4,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[4,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[4,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[4,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[4,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[4,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[4,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[4,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[4,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[4,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[4,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[4,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[4,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[4,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[4,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[4,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[4,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[4,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[4,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[4,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[4,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[4,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[4,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[4,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[4,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[4,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[4,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[4,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[4,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[4,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[4,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[4,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[4,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[4,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[4,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[4,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[4,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[4,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[8,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[8,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[8,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[8,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[8,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[8,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[8,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[8,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[8,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[8,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[8,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[8,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[8,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[8,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[8,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[8,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[8,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[8,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[8,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[8,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[8,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[8,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[8,3],nr=[1,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[8,3],nr=[1,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[8,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[8,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[8,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[8,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[8,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[8,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[8,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[8,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[8,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[8,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[8,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[8,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[8,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[8,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[8,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[8,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[8,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[8,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[8,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[8,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[8,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[8,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[8,3],nr=[4,1],per=[0,2,1,3],k_v=0,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[8,3],nr=[4,1],per=[0,1,2,3],k_v=1,o=1","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=16,n_used=16,b=0,m=32,n=1024,k=16","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=2,n_used=2,b=0,m=32,n=8192,k=64","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=16,n_used=16,b=0,m=50,n=200,k=64","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=16,n_used=16,b=1,m=32,n=1024,k=16","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=2,n_used=2,b=1,m=32,n=8192,k=64","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=16,n_used=16,b=1,m=50,n=200,k=64","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=1,n_used=1,b=0,m=8,n=16,k=1","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=32,n_used=2,b=0,m=2880,n=32,k=2880","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=4,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=5,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=17,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q5_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q5_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q5_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q5_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q2_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q2_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q3_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q3_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q5_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q5_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q6_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=q6_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_xs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_s,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq2_s,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq3_xxs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq3_xxs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq1_s,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq1_s,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq1_m,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq1_m,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq4_nl,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq4_nl,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq3_s,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq3_s,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq4_xs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=iq4_xs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=bf16,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256","support","0","no","zDNN" -"zDNN","MUL_MAT_ID","type_a=bf16,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256","support","0","no","zDNN" -"zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=1,bs=[1,1],nr=[1,1],trans_b=0","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=2,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=3,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=4,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=5,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=6,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=7,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=8,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=9,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=8,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=4,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_0,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_K,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=mxfp4,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f32,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[1,1],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[3,1],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[1,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[3,2],nr=[2,2],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=8,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,1,3,2],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=256,bs=[2,3],nr=[1,1],per=[0,3,2,1],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=1,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=8,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xxs,type_b=f16,m=16,n=16,k=1024,bs=[3,2],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=32,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q4_1,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=1,k=32,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=1,k=32,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_1,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=32,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q8_0,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q2_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q3_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q5_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=q6_K,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_xs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq2_s,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_xxs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_s,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq1_m,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=1,k=32,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_nl,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq3_s,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=iq4_xs,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=1,k=1,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=16,n=1,k=256,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","1","yes","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=64,n=2,k=128,bs=[8,1],nr=[1,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=83,n=2,k=128,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=64,n=2,k=64,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=83,n=2,k=64,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=64,n=45,k=128,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=45,k=64,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=193,bs=[1,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=67,bs=[1,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=16,n=32,k=32,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=1,o=3","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[1,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[1,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[1,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[1,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[1,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[1,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[1,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[1,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[1,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[1,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[1,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[1,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[1,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[1,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[1,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[1,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[1,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[1,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[1,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[1,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[1,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[1,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[1,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[1,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[1,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[1,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[1,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[1,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[1,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[1,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[1,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[1,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[1,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[1,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[1,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[1,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[1,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[2,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[2,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[2,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[2,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[2,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[2,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[2,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[2,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[2,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[2,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[2,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[2,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[2,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[2,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[2,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[2,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[2,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[2,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[2,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[2,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[2,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[2,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[2,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[2,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[2,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[2,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[2,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[2,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[2,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[2,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[2,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[2,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[2,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[2,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[2,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[2,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[2,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[2,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[2,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[2,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[2,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[2,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[2,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[2,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[2,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[2,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[2,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[2,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[4,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[4,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[4,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[4,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[4,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[4,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[4,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[4,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[4,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[4,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[4,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[4,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[4,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[4,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[4,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[4,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[4,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[4,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[4,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[4,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[4,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[4,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[4,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[4,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[4,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[4,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[4,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[4,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[4,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[4,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[4,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[4,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[4,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[4,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[4,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[4,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[4,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[4,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[4,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[4,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[4,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[4,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[4,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[4,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[4,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[4,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[4,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[4,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[8,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[8,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[8,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[8,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[8,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[8,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[8,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[8,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[8,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[8,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[8,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[8,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[8,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[8,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[8,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[8,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[8,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[8,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[8,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[8,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[8,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[8,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[8,1],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[8,1],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[8,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[8,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[8,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[8,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[8,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[8,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[8,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[8,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[8,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[8,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[8,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[8,1],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[8,1],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[1,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[1,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[1,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[1,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[1,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[1,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[1,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[1,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[1,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[1,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[1,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[1,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[1,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[1,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[1,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[1,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[1,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[1,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[1,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[1,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[1,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[1,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[1,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[1,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[1,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[1,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[1,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[1,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[1,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[1,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[1,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[1,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[1,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[1,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[1,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[1,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[1,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[1,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[1,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[1,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[1,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[1,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[1,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[1,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[1,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[1,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[1,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[1,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[2,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[2,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[2,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[2,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[2,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[2,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[2,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[2,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[2,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[2,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[2,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[2,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[2,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[2,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[2,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[2,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[2,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[2,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[2,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[2,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[2,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[2,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[2,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[2,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[2,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[2,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[2,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[2,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[2,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[2,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[2,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[2,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[2,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[2,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[2,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[2,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[2,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[4,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[4,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[4,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[4,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[4,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[4,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[4,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[4,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[4,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[4,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[4,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[4,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[4,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[4,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[4,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[4,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[4,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[4,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[4,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[4,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[4,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[4,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[4,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[4,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[4,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[4,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[4,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[4,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[4,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[4,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[4,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[4,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[4,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[4,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[4,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[4,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[4,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[4,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[4,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[4,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[4,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[4,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[4,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[4,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[4,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[4,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[4,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[4,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[8,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[8,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[8,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[8,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[8,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[8,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[8,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[8,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[8,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[8,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[8,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[8,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[8,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[8,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[8,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[8,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[8,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[8,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[8,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[8,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[8,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[8,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[8,3],nr=[1,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[8,3],nr=[1,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=128,bs=[8,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1056,bs=[8,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=128,bs=[8,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1056,bs=[8,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=128,bs=[8,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1056,bs=[8,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1056,n=1,k=129,bs=[8,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=128,n=1,k=1057,bs=[8,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1056,n=1,k=129,bs=[8,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=128,n=1,k=1057,bs=[8,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1056,n=1,k=129,bs=[8,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=128,n=1,k=1057,bs=[8,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=128,bs=[8,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1056,bs=[8,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=128,bs=[8,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1056,bs=[8,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=128,bs=[8,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1056,bs=[8,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=1057,n=1,k=129,bs=[8,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f16,type_b=f32,m=129,n=1,k=1057,bs=[8,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=1057,n=1,k=129,bs=[8,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=bf16,type_b=f32,m=129,n=1,k=1057,bs=[8,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=1057,n=1,k=129,bs=[8,3],nr=[4,1],per=[0,2,1,3],v=0,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT","type_a=f32,type_b=f32,m=129,n=1,k=1057,bs=[8,3],nr=[4,1],per=[0,1,2,3],v=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=16,n_used=16,b=0,m=32,n=1024,k=16,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=2,n_used=2,b=0,m=32,n=8192,k=64,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=16,n_used=16,b=0,m=50,n=200,k=64,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=16,n_used=16,b=1,m=32,n=1024,k=16,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=2,n_used=2,b=1,m=32,n=8192,k=64,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=16,n_used=16,b=1,m=50,n=200,k=64,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=1,n_used=1,b=0,m=8,n=16,k=1,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=16,n_used=16,b=0,m=32,n=32,k=32,o=3","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f32,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=f16,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_0,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_K,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=mxfp4,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=4,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=1,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=2,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=0,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xxs,type_b=f32,n_mats=8,n_used=4,b=1,m=512,n=129,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q4_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q5_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q5_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q5_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q5_1,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q8_0,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q2_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q2_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q3_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q3_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q5_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q5_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q6_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=q6_K,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_xs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_s,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq2_s,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq3_xxs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq3_xxs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq1_s,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq1_s,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq1_m,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq1_m,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq4_nl,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq4_nl,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq3_s,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq3_s,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq4_xs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=iq4_xs,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=bf16,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=1,k=256,o=1","support","0","no","zDNN" +"zDNN","MUL_MAT_ID","type_a=bf16,type_b=f32,n_mats=4,n_used=2,b=0,m=512,n=32,k=256,o=1","support","0","no","zDNN" +"zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=1,bs=[1,1],nr=[1,1],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=1,bs=[1,1],nr=[1,2],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=1,bs=[1,1],nr=[2,1],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=1,bs=[1,1],nr=[2,2],trans_b=0","support","0","no","zDNN" @@ -7604,7 +5692,7 @@ "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=1,bs=[3,3],nr=[1,2],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=1,bs=[3,3],nr=[2,1],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=1,bs=[3,3],nr=[2,2],trans_b=0","support","0","no","zDNN" -"zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=16,bs=[1,1],nr=[1,1],trans_b=0","support","1","yes","zDNN" +"zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=16,bs=[1,1],nr=[1,1],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=16,bs=[1,1],nr=[1,2],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=16,bs=[1,1],nr=[2,1],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=16,bs=[1,1],nr=[2,2],trans_b=0","support","0","no","zDNN" @@ -7620,7 +5708,7 @@ "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=16,bs=[3,3],nr=[1,2],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=16,bs=[3,3],nr=[2,1],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=1,k=16,bs=[3,3],nr=[2,2],trans_b=0","support","0","no","zDNN" -"zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=16,k=1,bs=[1,1],nr=[1,1],trans_b=0","support","1","yes","zDNN" +"zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=16,k=1,bs=[1,1],nr=[1,1],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=16,k=1,bs=[1,1],nr=[1,2],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=16,k=1,bs=[1,1],nr=[2,1],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=16,k=1,bs=[1,1],nr=[2,2],trans_b=0","support","0","no","zDNN" @@ -7636,7 +5724,7 @@ "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=16,k=1,bs=[3,3],nr=[1,2],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=16,k=1,bs=[3,3],nr=[2,1],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=16,k=1,bs=[3,3],nr=[2,2],trans_b=0","support","0","no","zDNN" -"zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=16,k=16,bs=[1,1],nr=[1,1],trans_b=0","support","1","yes","zDNN" +"zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=16,k=16,bs=[1,1],nr=[1,1],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=16,k=16,bs=[1,1],nr=[1,2],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=16,k=16,bs=[1,1],nr=[2,1],trans_b=0","support","0","no","zDNN" "zDNN","OUT_PROD","type_a=f32,type_b=f32,m=256,n=16,k=16,bs=[1,1],nr=[2,2],trans_b=0","support","0","no","zDNN" @@ -8654,791 +6742,638 @@ "zDNN","SIN","type=f16,ne=[10,2,2,2]","support","0","no","zDNN" "zDNN","COS","type=f16,ne=[10,2,2,2]","support","0","no","zDNN" "zDNN","CLAMP","type=f16,ne=[10,5,4,3],min=-0.500000,max=0.500000","support","0","no","zDNN" -"zDNN","LEAKY_RELU","type=f16,ne_a=[10,5,4,3],negative_slope=0.100000","support","0","no","zDNN" -"zDNN","FLOOR","type=f16,ne=[10,2,2,2]","support","0","no","zDNN" -"zDNN","CEIL","type=f16,ne=[10,2,2,2]","support","0","no","zDNN" -"zDNN","ROUND","type=f16,ne=[10,2,2,2]","support","0","no","zDNN" -"zDNN","TRUNC","type=f16,ne=[10,2,2,2]","support","0","no","zDNN" -"zDNN","SQR","type=f16,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","SQRT","type=f16,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","LOG","type=f16,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","SIN","type=f16,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","COS","type=f16,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","CLAMP","type=f16,ne=[7,1,5,3],min=-0.500000,max=0.500000","support","0","no","zDNN" -"zDNN","LEAKY_RELU","type=f16,ne_a=[7,1,5,3],negative_slope=0.100000","support","0","no","zDNN" -"zDNN","FLOOR","type=f16,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","FLOOR","type=f16,ne=[1024,1024,1,1]","support","0","no","zDNN" -"zDNN","CEIL","type=f16,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","CEIL","type=f16,ne=[1024,1024,1,1]","support","0","no","zDNN" -"zDNN","ROUND","type=f16,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","ROUND","type=f16,ne=[1024,1024,1,1]","support","0","no","zDNN" -"zDNN","TRUNC","type=f16,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","TRUNC","type=f16,ne=[1024,1024,1,1]","support","0","no","zDNN" "zDNN","SQR","type=f32,ne=[10,5,4,3]","support","0","no","zDNN" "zDNN","SQRT","type=f32,ne=[10,3,3,2]","support","0","no","zDNN" "zDNN","LOG","type=f32,ne=[10,5,4,3]","support","0","no","zDNN" "zDNN","SIN","type=f32,ne=[10,2,2,2]","support","0","no","zDNN" "zDNN","COS","type=f32,ne=[10,2,2,2]","support","0","no","zDNN" "zDNN","CLAMP","type=f32,ne=[10,5,4,3],min=-0.500000,max=0.500000","support","0","no","zDNN" -"zDNN","LEAKY_RELU","type=f32,ne_a=[10,5,4,3],negative_slope=0.100000","support","0","no","zDNN" -"zDNN","FLOOR","type=f32,ne=[10,2,2,2]","support","0","no","zDNN" -"zDNN","CEIL","type=f32,ne=[10,2,2,2]","support","0","no","zDNN" -"zDNN","ROUND","type=f32,ne=[10,2,2,2]","support","0","no","zDNN" -"zDNN","TRUNC","type=f32,ne=[10,2,2,2]","support","0","no","zDNN" -"zDNN","SQR","type=f32,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","SQRT","type=f32,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","LOG","type=f32,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","SIN","type=f32,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","COS","type=f32,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","CLAMP","type=f32,ne=[7,1,5,3],min=-0.500000,max=0.500000","support","0","no","zDNN" -"zDNN","LEAKY_RELU","type=f32,ne_a=[7,1,5,3],negative_slope=0.100000","support","0","no","zDNN" -"zDNN","FLOOR","type=f32,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","FLOOR","type=f32,ne=[1024,1024,1,1]","support","0","no","zDNN" -"zDNN","CEIL","type=f32,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","CEIL","type=f32,ne=[1024,1024,1,1]","support","0","no","zDNN" -"zDNN","ROUND","type=f32,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","ROUND","type=f32,ne=[1024,1024,1,1]","support","0","no","zDNN" -"zDNN","TRUNC","type=f32,ne=[7,1,5,3]","support","0","no","zDNN" -"zDNN","TRUNC","type=f32,ne=[1024,1024,1,1]","support","0","no","zDNN" "zDNN","DIAG_MASK_INF","type=f32,ne=[10,10,1,1],n_past=5","support","0","no","zDNN" "zDNN","DIAG_MASK_INF","type=f32,ne=[10,10,3,1],n_past=5","support","0","no","zDNN" "zDNN","DIAG_MASK_INF","type=f32,ne=[10,10,3,2],n_past=5","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,2,32,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=1","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,2,32,1],mask=0,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=1","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,2,32,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=1","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,2,32,1],mask=0,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=1","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f32,nr23=[3,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[2,3],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f16,nr23=[3,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[2,3],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f32,nr23=[3,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[2,3],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f16,nr23=[3,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[2,3],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f32,nr23=[3,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[2,3],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f16,nr23=[3,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[2,3],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f32,nr23=[3,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[2,3],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f16,nr23=[3,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[2,3],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,2,32,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=1","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,2,32,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=1","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f32,nr23=[3,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[2,3],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f16,nr23=[3,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[2,3],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f32,nr23=[3,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[2,3],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f16,nr23=[3,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[2,3],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f32,nr23=[3,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[2,3],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f16,nr23=[3,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[2,3],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f32,nr23=[3,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[2,3],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f16,nr23=[3,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[2,3],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,2,32,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=1","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,2,32,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=1","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,2,32,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,2,32,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[16,2,32,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[200001,2,3,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[200001,2,3,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[200000,1,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[200000,4,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" -"zDNN","SOFT_MAX","type=f32,ne=[643251,3,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000,inplace=0","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=0,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f32,nr23=[3,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[2,3],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f16,nr23=[3,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[2,3],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f32,nr23=[3,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[2,3],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f16,nr23=[3,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[2,3],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f32,nr23=[3,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[2,3],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f16,nr23=[3,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[2,3],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f32,nr23=[3,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[2,3],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=0,m_prec=f16,nr23=[3,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[2,3],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f32,nr23=[3,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[2,3],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f16,nr23=[3,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[2,3],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f32,nr23=[3,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[2,3],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f16,nr23=[3,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[2,3],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f32,nr23=[3,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[2,3],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f16,nr23=[3,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[2,3],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f32,nr23=[3,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[2,3],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,16,1,3],mask=1,sinks=1,m_prec=f16,nr23=[3,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[2,3],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[15,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,16,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,15,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1024,1024,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[1023,1023,1,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,2,32,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,2,32,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[16,2,32,1],mask=0,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=0,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=1,m_prec=f32,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" +"zDNN","SOFT_MAX","type=f32,ne=[32,2,32,1],mask=1,sinks=1,m_prec=f16,nr23=[1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[16,16,1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[15,15,1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[16,16,2,3],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[16,1024,1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[15,1023,1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[16,1024,2,3],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,16,1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1023,15,1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,16,2,3],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,1024,1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1023,1023,1,1],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,1024,2,3],scale=1.000000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[16,16,1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[15,15,1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[16,16,2,3],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[16,1024,1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[15,1023,1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[16,1024,2,3],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,16,1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1023,15,1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,16,2,3],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,1024,1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1023,1023,1,1],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,1024,2,3],scale=0.100000,max_bias=0.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[16,16,1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[15,15,1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[16,16,2,3],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[16,1024,1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[15,1023,1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[16,1024,2,3],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,16,1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1023,15,1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,16,2,3],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,1024,1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1023,1023,1,1],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,1024,2,3],scale=1.000000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[16,16,1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[15,15,1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[16,16,2,3],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[16,1024,1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[15,1023,1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[16,1024,2,3],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,16,1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1023,15,1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,16,2,3],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,1024,1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" "zDNN","SOFT_MAX_BACK","type=f32,ne=[1023,1023,1,1],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" -"zDNN","SOFT_MAX_BACK","type=f32,ne=[1024,1024,2,3],scale=0.100000,max_bias=8.000000","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,16,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[16,16,8192,1],n_dims=16,mode=40,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1,inplace=0","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=24,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=24,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=40,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=24,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0,inplace=1","support","0","no","zDNN" -"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=24,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0,inplace=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,40,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,52,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,64,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,1,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,71,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,8,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=20,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,2,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,32,4,1],n_dims=32,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=128,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,12,2,1],n_dims=20,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,28,2,1],n_dims=32,mode=8,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[80,16,2,1],n_dims=80,mode=24,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.000000,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.000000,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.000000,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f32,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=0,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=0","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[128,32,2,1],n_dims=128,mode=0,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" +"zDNN","ROPE_BACK","type=f16,ne_a=[64,128,2,1],n_dims=64,mode=2,n_ctx=512,fs=1.424500,ef=0.746500,af=1.424500,ff=1,v=1","support","0","no","zDNN" "zDNN","CONCAT","type=f32,ne_a=[11,12,13,14],ne_b_d=7,dim=0,v=0","support","0","no","zDNN" "zDNN","CONCAT","type=i32,ne_a=[11,12,13,14],ne_b_d=7,dim=0,v=0","support","0","no","zDNN" "zDNN","CONCAT","type=f32,ne_a=[11,12,13,14],ne_b_d=7,dim=1,v=0","support","0","no","zDNN" @@ -9471,432 +7406,25 @@ "zDNN","CONCAT","type=i32,ne_a=[11,12,13,14],ne_b_d=7,dim=2,v=3","support","0","no","zDNN" "zDNN","CONCAT","type=f32,ne_a=[11,12,13,14],ne_b_d=7,dim=3,v=3","support","0","no","zDNN" "zDNN","CONCAT","type=i32,ne_a=[11,12,13,14],ne_b_d=7,dim=3,v=3","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[3,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[4,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[7,1,1,1],order=0","support","0","no","zDNN" "zDNN","ARGSORT","type=f32,ne=[8,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[15,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[16,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[31,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[32,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[63,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[64,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[127,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[128,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[255,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[256,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[511,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[512,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[1023,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[1024,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[2047,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[2048,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[4095,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[4096,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[8191,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[8192,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[16383,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[16384,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[32767,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[32768,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[65535,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[65536,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[131071,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[131072,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[262143,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[262144,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[524287,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[524288,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[1048575,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[1048576,1,1,1],order=0","support","0","no","zDNN" "zDNN","ARGSORT","type=f32,ne=[16,10,10,10],order=0","support","0","no","zDNN" "zDNN","ARGSORT","type=f32,ne=[60,10,10,10],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[1023,2,1,3],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[1024,2,1,3],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[1025,2,1,3],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[2047,2,1,3],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[2048,2,1,3],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[2049,2,1,3],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[2,8,8192,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[3,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[4,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[7,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[8,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[15,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[16,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[31,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[32,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[63,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[64,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[127,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[128,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[255,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[256,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[511,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[512,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[1023,1,1,1],order=0","support","0","no","zDNN" "zDNN","ARGSORT","type=f32,ne=[1024,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[2047,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[2048,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[4095,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[4096,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[8191,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[8192,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[16383,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[16384,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[32767,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[32768,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[65535,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[65536,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[131071,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[131072,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[262143,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[262144,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[524287,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[524288,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[1048575,1,1,1],order=0","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[1048576,1,1,1],order=0","support","0","no","zDNN" +"zDNN","ARGSORT","type=f32,ne=[8,1,1,1],order=1","support","0","no","zDNN" "zDNN","ARGSORT","type=f32,ne=[16,10,10,10],order=1","support","0","no","zDNN" "zDNN","ARGSORT","type=f32,ne=[60,10,10,10],order=1","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[1023,2,1,3],order=1","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[1024,2,1,3],order=1","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[1025,2,1,3],order=1","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[2047,2,1,3],order=1","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[2048,2,1,3],order=1","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[2049,2,1,3],order=1","support","0","no","zDNN" -"zDNN","ARGSORT","type=f32,ne=[2,8,8192,1],order=1","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[12,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[13,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[13,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[15,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[15,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[15,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[19,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[19,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[19,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[19,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[27,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[27,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[27,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[27,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[27,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[43,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[43,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[43,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[43,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[43,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[64,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[75,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[64,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[75,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[64,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[75,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[64,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[75,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[64,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[75,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[128,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[139,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[128,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[139,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[128,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[139,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[128,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[139,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[128,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[139,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[128,1,1,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[139,1,2,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[256,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[267,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[256,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[267,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[256,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[267,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[256,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[267,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[256,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[267,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[256,1,1,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[267,1,2,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[512,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[523,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[512,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[523,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[512,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[523,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[512,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[523,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[512,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[523,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[512,1,1,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[523,1,2,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[512,1,1,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[523,1,2,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1024,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1035,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1024,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1035,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1024,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1035,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1024,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1035,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1024,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1035,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1024,1,1,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1035,1,2,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1024,1,1,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1035,1,2,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1024,1,1,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1035,1,2,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2048,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2059,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2048,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2059,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2048,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2059,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2048,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2059,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2048,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2059,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2048,1,1,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2059,1,2,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2048,1,1,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2059,1,2,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2048,1,1,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2059,1,2,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4096,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4107,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4096,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4107,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4096,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4107,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4096,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4107,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4096,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4107,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4096,1,1,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4107,1,2,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4096,1,1,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4107,1,2,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4096,1,1,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[4107,1,2,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8192,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8203,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8192,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8203,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8192,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8203,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8192,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8203,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8192,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8203,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8192,1,1,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8203,1,2,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8192,1,1,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8203,1,2,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8192,1,1,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[8203,1,2,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16384,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16395,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16384,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16395,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16384,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16395,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16384,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16395,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16384,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16395,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16384,1,1,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16395,1,2,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16384,1,1,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16395,1,2,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16384,1,1,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16395,1,2,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16384,1,1,1],k=9999,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16395,1,2,1],k=9999,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32768,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32779,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32768,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32779,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32768,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32779,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32768,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32779,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32768,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32779,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32768,1,1,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32779,1,2,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32768,1,1,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32779,1,2,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32768,1,1,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32779,1,2,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32768,1,1,1],k=9999,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[32779,1,2,1],k=9999,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65536,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65547,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65536,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65547,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65536,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65547,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65536,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65547,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65536,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65547,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65536,1,1,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65547,1,2,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65536,1,1,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65547,1,2,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65536,1,1,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65547,1,2,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65536,1,1,1],k=9999,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[65547,1,2,1],k=9999,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131072,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131083,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131072,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131083,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131072,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131083,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131072,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131083,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131072,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131083,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131072,1,1,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131083,1,2,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131072,1,1,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131083,1,2,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131072,1,1,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131083,1,2,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131072,1,1,1],k=9999,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[131083,1,2,1],k=9999,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262144,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262155,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262144,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262155,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262144,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262155,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262144,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262155,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262144,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262155,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262144,1,1,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262155,1,2,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262144,1,1,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262155,1,2,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262144,1,1,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262155,1,2,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262144,1,1,1],k=9999,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[262155,1,2,1],k=9999,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524288,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524299,1,2,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524288,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524299,1,2,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524288,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524299,1,2,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524288,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524299,1,2,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524288,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524299,1,2,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524288,1,1,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524299,1,2,1],k=100,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524288,1,1,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524299,1,2,1],k=500,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524288,1,1,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524299,1,2,1],k=1023,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524288,1,1,1],k=9999,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[524299,1,2,1],k=9999,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16,10,10,10],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[60,10,10,10],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1023,2,1,3],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1024,2,1,3],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1025,2,1,3],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16384,1,1,1],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2047,2,1,3],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2048,2,1,3],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2049,2,1,3],k=1,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16,10,10,10],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[60,10,10,10],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1023,2,1,3],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1024,2,1,3],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1025,2,1,3],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16384,1,1,1],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2047,2,1,3],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2048,2,1,3],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2049,2,1,3],k=2,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16,10,10,10],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[60,10,10,10],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1023,2,1,3],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1024,2,1,3],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1025,2,1,3],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16384,1,1,1],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2047,2,1,3],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2048,2,1,3],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2049,2,1,3],k=3,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16,10,10,10],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[60,10,10,10],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1023,2,1,3],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1024,2,1,3],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1025,2,1,3],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16384,1,1,1],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2047,2,1,3],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2048,2,1,3],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2049,2,1,3],k=7,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16,10,10,10],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[60,10,10,10],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1023,2,1,3],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1024,2,1,3],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[1025,2,1,3],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[16384,1,1,1],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2047,2,1,3],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2048,2,1,3],k=15,ties=0","support","0","no","zDNN" -"zDNN","TOP_K","type=f32,ne=[2049,2,1,3],k=15,ties=0","support","0","no","zDNN" +"zDNN","ARGSORT","type=f32,ne=[1024,1,1,1],order=1","support","0","no","zDNN" "zDNN","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=nearest,transpose=0","support","0","no","zDNN" "zDNN","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=nearest,transpose=1","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=nearest","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=nearest","support","0","no","zDNN" +"zDNN","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=0","support","0","no","zDNN" +"zDNN","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=0","support","0","no","zDNN" "zDNN","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bilinear,transpose=0","support","0","no","zDNN" "zDNN","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bilinear,transpose=1","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bilinear","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=bilinear","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bicubic,transpose=0","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bicubic,transpose=1","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bicubic","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=bicubic","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bilinear|antialias,transpose=0","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[512,512,3,2],scale_factor=2,mode=bilinear|antialias,transpose=1","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bilinear|antialias","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=bilinear|antialias","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bilinear|align_corners","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[1,4,3,2],ne_tgt=[2,8,3,2],mode=bilinear|align_corners","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[4,1,3,2],ne_tgt=[1,1,3,2],mode=bilinear|align_corners","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=bicubic|align_corners","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[1,4,3,2],ne_tgt=[2,8,3,2],mode=bicubic|align_corners","support","0","no","zDNN" -"zDNN","UPSCALE","type=f32,ne=[4,1,3,2],ne_tgt=[1,1,3,2],mode=bicubic|align_corners","support","0","no","zDNN" +"zDNN","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=1","support","0","no","zDNN" +"zDNN","UPSCALE","type=f32,ne=[5,7,11,13],ne_tgt=[2,5,7,11],mode=1","support","0","no","zDNN" +"zDNN","UPSCALE","type=f32,ne=[2,5,7,11],ne_tgt=[5,7,11,13],mode=257","support","0","no","zDNN" "zDNN","SUM","type=f32,ne=[10,5,4,3]","support","0","no","zDNN" "zDNN","SUM_ROWS","type=f32,ne=[10,5,4,3],permute=0,slice=0","support","0","no","zDNN" -"zDNN","SUM","type=f32,ne=[11,5,6,3],permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","SUM","type=f32,ne=[11,5,6,3],permute=[0,3,2,1]","support","0","no","zDNN" -"zDNN","SUM","type=f32,ne=[11,5,6,3],permute=[0,1,3,2]","support","0","no","zDNN" "zDNN","SUM_ROWS","type=f32,ne=[11,5,6,3],permute=1,slice=0","support","0","no","zDNN" "zDNN","SUM_ROWS","type=f32,ne=[11,5,6,3],permute=0,slice=1","support","0","no","zDNN" "zDNN","SUM_ROWS","type=f32,ne=[11,5,6,3],permute=1,slice=1","support","0","no","zDNN" @@ -9907,104 +7435,21 @@ "zDNN","SUM","type=f32,ne=[33,1024,1,1]","support","0","no","zDNN" "zDNN","SUM_ROWS","type=f32,ne=[33,1024,1,1],permute=0,slice=0","support","0","no","zDNN" "zDNN","SUM","type=f32,ne=[33,256,1,1]","support","0","no","zDNN" -"zDNN","SUM","type=f32,ne=[33,256,1,1],permute=[1,0,2,3]","support","0","no","zDNN" "zDNN","SUM_ROWS","type=f32,ne=[33,256,1,1],permute=0,slice=0","support","0","no","zDNN" "zDNN","MEAN","type=f32,ne=[33,256,1,1]","support","0","no","zDNN" "zDNN","MEAN","type=f32,ne=[32769,1,1,1]","support","0","no","zDNN" "zDNN","GROUP_NORM","type=f32,ne=[64,64,320,1],num_groups=32,eps=0.000001","support","0","no","zDNN" "zDNN","GROUP_NORM","type=f32,ne=[9,9,1280,1],num_groups=32,eps=0.000001","support","0","no","zDNN" +"zDNN","GROUP_NORM_MUL_ADD","type=f32,ne=[64,64,320,1],num_groups=4,eps=0.000010","support","0","no","zDNN" +"zDNN","GROUP_NORM_MUL_ADD","type=f32,ne=[9,9,1280,1],num_groups=4,eps=0.000010","support","0","no","zDNN" "zDNN","ACC","type=f32,ne_a=[256,17,1,1],ne_b=[256,16,1,1]","support","0","no","zDNN" -"zDNN","PAD","type=f32,ne_a=[512,512,1,1],pad_0=1,pad_1=1,circular=0","support","0","no","zDNN" -"zDNN","PAD","type=f32,ne_a=[33,17,2,1],pad_0=4,pad_1=3,circular=1","support","0","no","zDNN" -"zDNN","PAD","type=f32,ne_a=[512,512,3,1],lp0=1,rp0=1,lp1=1,rp1=1,lp2=1,rp2=1,lp3=1,rp3=1,v=0,circular=0","support","0","no","zDNN" +"zDNN","PAD","type=f32,ne_a=[512,512,1,1],pad_0=1,pad_1=1","support","0","no","zDNN" +"zDNN","PAD","type=f32,ne_a=[512,512,3,1],lp0=1,rp0=1,lp1=1,rp1=1,lp2=1,rp2=1,lp3=1,rp3=1","support","0","no","zDNN" "zDNN","PAD_REFLECT_1D","type=f32,ne_a=[512,34,2,1],pad_0=10,pad_1=9","support","0","no","zDNN" -"zDNN","PAD_REFLECT_1D","type=f32,ne_a=[3000,384,4,1],pad_0=10,pad_1=9","support","0","no","zDNN" "zDNN","ROLL","shift0=3,shift1=-2,shift3=1,shift4=-1","support","0","no","zDNN" "zDNN","ARANGE","type=f32,start=0.000000,stop=10.000000,step=1.000000","support","0","no","zDNN" -"zDNN","ARANGE","type=f32,start=0.000000,stop=1048576.000000,step=1.000000","support","0","no","zDNN" "zDNN","TIMESTEP_EMBEDDING","type=f32,ne_a=[2,1,1,1],dim=320,max_period=10000","support","0","no","zDNN" "zDNN","LEAKY_RELU","type=f32,ne_a=[10,5,4,3],negative_slope=0.100000","support","0","no","zDNN" -"zDNN","CUMSUM","type=f32,ne=[10,5,4,3]","support","0","no","zDNN" -"zDNN","CUMSUM","type=f32,ne=[127,5,4,3]","support","0","no","zDNN" -"zDNN","CUMSUM","type=f32,ne=[128,5,4,3]","support","0","no","zDNN" -"zDNN","CUMSUM","type=f32,ne=[128,128,4,4]","support","0","no","zDNN" -"zDNN","CUMSUM","type=f32,ne=[255,5,4,3]","support","0","no","zDNN" -"zDNN","CUMSUM","type=f32,ne=[256,5,4,3]","support","0","no","zDNN" -"zDNN","CUMSUM","type=f32,ne=[511,5,4,3]","support","0","no","zDNN" -"zDNN","CUMSUM","type=f32,ne=[512,5,4,3]","support","0","no","zDNN" -"zDNN","CUMSUM","type=f32,ne=[1023,5,4,3]","support","0","no","zDNN" -"zDNN","CUMSUM","type=f32,ne=[1024,5,4,3]","support","0","no","zDNN" -"zDNN","CUMSUM","type=f32,ne=[2047,5,4,3]","support","0","no","zDNN" -"zDNN","CUMSUM","type=f32,ne=[2048,5,4,3]","support","0","no","zDNN" -"zDNN","CUMSUM","type=f32,ne=[242004,1,1,1]","support","0","no","zDNN" -"zDNN","CUMSUM","type=f32,ne=[375960,1,1,1]","support","0","no","zDNN" -"zDNN","CUMSUM","type=f32,ne=[20481,4,1,1]","support","0","no","zDNN" -"zDNN","XIELU","type=f32,ne=[10,5,4,3]","support","0","no","zDNN" -"zDNN","TRI","type=f32,ne=[10,10,4,3],tri_type=3","support","0","no","zDNN" -"zDNN","TRI","type=f32,ne=[10,10,4,3],tri_type=2","support","0","no","zDNN" -"zDNN","TRI","type=f32,ne=[10,10,4,3],tri_type=1","support","0","no","zDNN" -"zDNN","TRI","type=f32,ne=[10,10,4,3],tri_type=0","support","0","no","zDNN" -"zDNN","FILL","type=f32,ne=[10,10,4,3],c=0.000000","support","0","no","zDNN" -"zDNN","FILL","type=f32,ne=[303,207,11,3],c=2.000000","support","0","no","zDNN" -"zDNN","FILL","type=f32,ne=[800,600,4,4],c=-152.000000","support","0","no","zDNN" -"zDNN","FILL","type=f32,ne=[2048,512,2,2],c=3.500000","support","0","no","zDNN" -"zDNN","DIAG","type=f32,ne=[10,1,4,3]","support","0","no","zDNN" -"zDNN","DIAG","type=f32,ne=[79,1,19,13]","support","0","no","zDNN" -"zDNN","DIAG","type=f32,ne=[256,1,8,16]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[10,10,4,3],ne_rhs=[3,10,4,3]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[11,11,1,1],ne_rhs=[5,11,1,1]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[17,17,2,4],ne_rhs=[9,17,2,4]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[30,30,7,1],ne_rhs=[8,30,7,1]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[42,42,5,2],ne_rhs=[10,42,5,2]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[64,64,2,2],ne_rhs=[10,64,2,2]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[64,64,2,2],ne_rhs=[64,64,2,2]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[79,79,5,3],ne_rhs=[417,79,5,3]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,2],ne_rhs=[32,128,4,2]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[80,80,2,8],ne_rhs=[80,80,2,8]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[80,80,2,8],ne_rhs=[79,80,2,8]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[80,80,2,8],ne_rhs=[81,80,2,8]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[80,80,8,8],ne_rhs=[80,80,8,8]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[80,80,8,8],ne_rhs=[79,80,8,8]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[80,80,8,8],ne_rhs=[81,80,8,8]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[84,84,4,4],ne_rhs=[32,84,4,4]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[95,95,8,8],ne_rhs=[40,95,8,8]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[100,100,4,4],ne_rhs=[41,100,4,4]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,4],ne_rhs=[31,128,4,4]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,4],ne_rhs=[32,128,4,4]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[128,128,3,4],ne_rhs=[32,128,3,4]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[128,128,4,1],ne_rhs=[32,128,4,1]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[64,64,4,4],ne_rhs=[200,64,4,4]","support","0","no","zDNN" -"zDNN","SOLVE_TRI","type=f32,ne_lhs=[64,64,4,4],ne_rhs=[384,64,4,4]","support","0","no","zDNN" -"zDNN","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=0,circular=0","support","0","no","zDNN" -"zDNN","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=0,circular=0","support","0","no","zDNN" -"zDNN","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=0,circular=1","support","0","no","zDNN" -"zDNN","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=0,circular=1","support","0","no","zDNN" -"zDNN","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=1,circular=0","support","0","no","zDNN" -"zDNN","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=1,circular=0","support","0","no","zDNN" -"zDNN","PAD","type=f32,ne_a=[512,512,1,1],lp0=0,rp0=1,lp1=0,rp1=1,lp2=0,rp2=0,lp3=0,rp3=0,v=1,circular=1","support","0","no","zDNN" -"zDNN","PAD","type=f32,ne_a=[11,22,33,44],lp0=1,rp0=2,lp1=3,rp1=4,lp2=5,rp2=6,lp3=7,rp3=8,v=1,circular=1","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10013,8 +7458,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10023,8 +7466,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10033,8 +7474,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10043,28 +7482,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10073,8 +7506,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10083,8 +7514,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10093,8 +7522,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10103,28 +7530,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10133,8 +7538,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10143,8 +7546,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10153,8 +7554,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10163,28 +7562,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10193,8 +7586,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10203,8 +7594,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10213,8 +7602,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10223,188 +7610,102 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10413,8 +7714,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10423,8 +7722,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10433,8 +7730,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10443,28 +7738,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10473,8 +7762,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10483,8 +7770,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10493,8 +7778,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10503,28 +7786,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10533,8 +7794,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10543,8 +7802,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10553,8 +7810,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10563,28 +7818,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10593,8 +7842,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10603,8 +7850,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10613,8 +7858,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -10623,508 +7866,294 @@ "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=40,hsv=40,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11133,8 +8162,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11143,8 +8170,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11153,8 +8178,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11163,28 +8186,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11193,8 +8210,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11203,8 +8218,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11213,8 +8226,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11223,28 +8234,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11253,8 +8242,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11263,8 +8250,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11273,8 +8258,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11283,28 +8266,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11313,8 +8290,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11323,8 +8298,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11333,8 +8306,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11343,188 +8314,102 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11533,8 +8418,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11543,8 +8426,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11553,8 +8434,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11563,28 +8442,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11593,8 +8466,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11603,8 +8474,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11613,8 +8482,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11623,28 +8490,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11653,8 +8498,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11663,8 +8506,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11673,8 +8514,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11683,28 +8522,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11713,8 +8546,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11723,8 +8554,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11733,8 +8562,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -11743,1068 +8570,294 @@ "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[1,3],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=64,hsv=64,nh=4,nr23=[4,3],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=72,hsv=72,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -12813,8 +8866,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -12823,8 +8874,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -12833,8 +8882,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -12843,28 +8890,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -12873,8 +8914,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -12883,8 +8922,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -12893,8 +8930,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -12903,108 +8938,54 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -13013,8 +8994,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -13023,8 +9002,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -13033,8 +9010,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -13043,28 +9018,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -13073,8 +9042,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -13083,8 +9050,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -13093,8 +9058,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -13103,848 +9066,150 @@ "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=80,hsv=80,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=96,hsv=96,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -13953,8 +9218,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -13963,8 +9226,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -13973,8 +9234,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -13983,8 +9242,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -13993,8 +9250,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14003,8 +9258,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14013,8 +9266,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14023,48 +9274,38 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14073,8 +9314,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14083,8 +9322,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14093,8 +9330,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14103,8 +9338,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14113,8 +9346,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14123,8 +9354,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14133,8 +9362,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14143,8 +9370,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14153,8 +9378,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14163,8 +9386,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14173,8 +9394,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14183,8 +9402,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14193,8 +9410,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14203,8 +9418,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14213,8 +9426,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14223,648 +9434,390 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14873,8 +9826,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14883,8 +9834,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14893,8 +9842,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14903,8 +9850,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14913,8 +9858,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14923,8 +9866,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14933,8 +9874,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14943,48 +9882,38 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -14993,8 +9922,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -15003,8 +9930,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -15013,8 +9938,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -15023,8 +9946,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -15033,8 +9954,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -15043,8 +9962,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -15053,8 +9970,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -15063,8 +9978,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -15073,8 +9986,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -15083,8 +9994,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -15093,8 +10002,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -15103,8 +10010,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -15113,8 +10018,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -15123,8 +10026,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -15133,8 +10034,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -15143,1428 +10042,902 @@ "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=128,hsv=128,nh=4,nr23=[16,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=10.000000,prec=def,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16573,8 +10946,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16583,8 +10954,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16593,8 +10962,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16603,28 +10970,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16633,8 +10994,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16643,8 +11002,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16653,8 +11010,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16663,108 +11018,54 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16773,8 +11074,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16783,8 +11082,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16793,8 +11090,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16803,28 +11098,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16833,8 +11122,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16843,8 +11130,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16853,8 +11138,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -16863,268 +11146,150 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=128,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17133,8 +11298,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17143,8 +11306,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17153,8 +11314,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17163,28 +11322,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17193,8 +11346,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17203,8 +11354,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17213,8 +11362,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17223,108 +11370,54 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17333,8 +11426,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17343,8 +11434,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17353,8 +11442,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17363,28 +11450,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17393,8 +11474,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17403,8 +11482,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17413,8 +11490,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17423,268 +11498,150 @@ "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=192,hsv=192,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17693,8 +11650,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17703,8 +11658,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17713,8 +11666,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17723,28 +11674,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17753,8 +11698,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17763,8 +11706,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17773,8 +11714,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17783,108 +11722,54 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17893,8 +11778,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17903,8 +11786,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17913,8 +11794,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17923,28 +11802,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17953,8 +11826,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17963,8 +11834,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17973,8 +11842,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -17983,268 +11850,150 @@ "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=256,hsv=256,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18253,8 +12002,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18263,8 +12010,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18273,8 +12018,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18283,28 +12026,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18313,8 +12050,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18323,8 +12058,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18333,8 +12066,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18343,108 +12074,54 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=1,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18453,8 +12130,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18463,8 +12138,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18473,8 +12146,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18483,28 +12154,22 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18513,8 +12178,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18523,8 +12186,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18533,8 +12194,6 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" @@ -18543,242 +12202,146 @@ "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,2,1,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,2,1,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=1,sinks=0,max_bias=8.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=1,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=113,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[1,1],kv=1024,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=1,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=3,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=32,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q4_0,permute=[0,1,2,3]","support","0","no","zDNN" -"zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f32,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=f16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=bf16,permute=[0,1,2,3]","support","0","no","zDNN" "zDNN","FLASH_ATTN_EXT","hsk=576,hsv=512,nh=4,nr23=[4,1],kv=512,nb=35,mask=0,sinks=0,max_bias=0.000000,logit_softcap=0.000000,prec=f32,type_KV=q8_0,permute=[0,1,2,3]","support","0","no","zDNN" diff --git a/docs/preset.md b/docs/preset.md deleted file mode 100644 index d49fb0a..0000000 --- a/docs/preset.md +++ /dev/null @@ -1,97 +0,0 @@ -# llama.cpp INI Presets - -## Introduction - -The INI preset feature, introduced in [PR#17859](https://github.com/ggml-org/llama.cpp/pull/17859), allows users to create reusable and shareable parameter configurations for llama.cpp. - -### Using Presets with the Server - -When running multiple models on the server (router mode), INI preset files can be used to configure model-specific parameters. Please refer to the [server documentation](../tools/server/README.md) for more details. - -### Using a Remote Preset - -> [!NOTE] -> -> This feature is currently only supported via the `-hf` option. - -For GGUF models hosted on Hugging Face, you can include a `preset.ini` file in the root directory of the repository to define specific configurations for that model. - -Example: - -```ini -hf-repo-draft = username/my-draft-model-GGUF -temp = 0.5 -top-k = 20 -top-p = 0.95 -``` - -For security reasons, only certain options are allowed. Please refer to [preset.cpp](../common/preset.cpp) for the complete list of permitted options. - -Example usage: - -Assuming your repository `username/my-model-with-preset` contains a `preset.ini` with the configuration above: - -```sh -llama-cli -hf username/my-model-with-preset - -# This is equivalent to: -llama-cli -hf username/my-model-with-preset \ - --hf-repo-draft username/my-draft-model-GGUF \ - --temp 0.5 \ - --top-k 20 \ - --top-p 0.95 -``` - -You can also override preset arguments by specifying them on the command line: - -```sh -# Force temp = 0.1, overriding the preset value -llama-cli -hf username/my-model-with-preset --temp 0.1 -``` - -If you want to define multiple preset configurations for one or more GGUF models, you can create a blank HF repo for each preset. Each HF repo should contain a `preset.ini` file that references the actual model(s): - -```ini -hf-repo = user/my-model-main -hf-repo-draft = user/my-model-draft -temp = 0.8 -ctx-size = 1024 -; (and other configurations) -``` - -### Named presets - -If you want to define multiple preset configurations for one or more GGUF models, you can create a blank HF repo containing a single `preset.ini` file that references the actual model(s): - -```ini -[*] -mmap = 1 - -[gpt-oss-20b-hf] -hf = ggml-org/gpt-oss-20b-GGUF -batch-size = 2048 -ubatch-size = 2048 -top-p = 1.0 -top-k = 0 -min-p = 0.01 -temp = 1.0 -chat-template-kwargs = {"reasoning_effort": "high"} - -[gpt-oss-120b-hf] -hf = ggml-org/gpt-oss-120b-GGUF -batch-size = 2048 -ubatch-size = 2048 -top-p = 1.0 -top-k = 0 -min-p = 0.01 -temp = 1.0 -chat-template-kwargs = {"reasoning_effort": "high"} -``` - -You can then use it via `llama-cli` or `llama-server`, example: - -```sh -llama-server -hf user/repo:gpt-oss-120b-hf -``` - -Please make sure to provide the correct `hf-repo` for each child preset. Otherwise, you may get error: `The specified tag is not a valid quantization scheme.` diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index a29dc70..91797cf 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -15,7 +15,6 @@ llama_add_compile_flags() if (EMSCRIPTEN) else() add_subdirectory(batched) - add_subdirectory(debug) add_subdirectory(embedding) add_subdirectory(eval-callback) @@ -35,6 +34,7 @@ else() add_subdirectory(gen-docs) add_subdirectory(training) add_subdirectory(diffusion) + add_subdirectory(model-conversion) if (NOT GGML_BACKEND_DL) add_subdirectory(convert-llama2c-to-ggml) # these examples use the backends directly and cannot be built with dynamic loading diff --git a/examples/batched/batched.cpp b/examples/batched/batched.cpp index a8c19a6..36a12d2 100644 --- a/examples/batched/batched.cpp +++ b/examples/batched/batched.cpp @@ -21,7 +21,7 @@ int main(int argc, char ** argv) { params.prompt = "Hello my name is"; params.n_predict = 32; - if (!common_params_parse(argc, argv, params, LLAMA_EXAMPLE_BATCHED, print_usage)) { + if (!common_params_parse(argc, argv, params, LLAMA_EXAMPLE_COMMON, print_usage)) { return 1; } @@ -68,7 +68,7 @@ int main(int argc, char ** argv) { auto sparams = llama_sampler_chain_default_params(); sparams.no_perf = false; - std::vector sampler_configs; + std::vector samplers; for (int32_t i = 0; i < n_parallel; ++i) { llama_sampler * smpl = llama_sampler_chain_init(sparams); @@ -78,12 +78,7 @@ int main(int argc, char ** argv) { llama_sampler_chain_add(smpl, llama_sampler_init_temp (params.sampling.temp)); llama_sampler_chain_add(smpl, llama_sampler_init_dist (params.sampling.seed)); - sampler_configs.push_back({ i, smpl }); - } - - if (params.sampling.backend_sampling) { - ctx_params.samplers = sampler_configs.data(); - ctx_params.n_samplers = sampler_configs.size(); + samplers.push_back(smpl); } llama_context * ctx = llama_init_from_model(model, ctx_params); @@ -185,7 +180,7 @@ int main(int argc, char ** argv) { continue; } - const llama_token new_token_id = llama_sampler_sample(sampler_configs[i].sampler, ctx, i_batch[i]); + const llama_token new_token_id = llama_sampler_sample(samplers[i], ctx, i_batch[i]); // is it an end of generation? -> mark the stream as finished if (llama_vocab_is_eog(vocab, new_token_id) || n_cur == n_predict) { @@ -241,15 +236,15 @@ int main(int argc, char ** argv) { __func__, n_decode, (t_main_end - t_main_start) / 1000000.0f, n_decode / ((t_main_end - t_main_start) / 1000000.0f)); LOG("\n"); - llama_perf_sampler_print(sampler_configs[0].sampler); + llama_perf_sampler_print(samplers[0]); llama_perf_context_print(ctx); fprintf(stderr, "\n"); llama_batch_free(batch); - for (auto & sampler_config : sampler_configs) { - llama_sampler_free(sampler_config.sampler); + for (auto & sampler_config : samplers) { + llama_sampler_free(sampler_config); } llama_free(ctx); diff --git a/examples/debug/README.md b/examples/debug/README.md deleted file mode 100644 index 28e00c9..0000000 --- a/examples/debug/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# llama.cpp/examples/debug - -This is a utility intended to help debug a model by registering a callback that -logs GGML operations and tensor data. It can also store the generated logits or -embeddings as well as the prompt and token ids for comparision with the original -model. - -### Usage - -```shell -llama-debug \ - --hf-repo ggml-org/models \ - --hf-file phi-2/ggml-model-q4_0.gguf \ - --model phi-2-q4_0.gguf \ - --prompt hello \ - --save-logits \ - --verbose -``` -The tensor data is logged as debug and required the --verbose flag. The reason -for this is that while useful for a model with many layers there can be a lot of -output. You can filter the tensor names using the `--tensor-filter` option. - -A recommended approach is to first run without `--verbose` and see if the -generated logits/embeddings are close to the original model. If they are not, -then it might be required to inspect tensor by tensor and in that case it is -useful to enable the `--verbose` flag along with `--tensor-filter` to focus on -specific tensors. - -### Options -This example supports all standard `llama.cpp` options and also accepts the -following options: -```console -$ llama-debug --help -... - ------ example-specific params ----- - ---save-logits save final logits to files for verification (default: false) ---logits-output-dir PATH directory for saving logits output files (default: data) ---tensor-filter REGEX filter tensor names for debug output (regex pattern, can be specified multiple times) -``` - -### Output Files - -When `--save-logits` is enabled, the following files are created in the output -directory: - -* `llamacpp-[-embeddings].bin` - Binary output (logits or embeddings) -* `llamacpp-[-embeddings].txt` - Text output (logits or embeddings, one per line) -* `llamacpp-[-embeddings]-prompt.txt` - Prompt text and token IDs -* `llamacpp-[-embeddings]-tokens.bin` - Binary token IDs for programmatic comparison - -These files can be compared against the original model's output to verify the -converted model. diff --git a/examples/debug/debug.cpp b/examples/debug/debug.cpp deleted file mode 100644 index 88947ac..0000000 --- a/examples/debug/debug.cpp +++ /dev/null @@ -1,253 +0,0 @@ -#include "debug.h" -#include "arg.h" -#include "common.h" -#include "log.h" -#include "llama.h" - -#include -#include -#include -#include -#include -#include - -static void print_usage(int /*argc*/, char ** argv) { - const std::string usage_template = R"( - example usage: - - Print tensors: - - {prog} -m model.gguf -p "Hello my name is" --verbose - - The tensors to be printed can be filtered with --tensor-filter option. - - Save logits/embeddings: - - {prog} -m model.gguf -p "Hello my name is" --save-logits - - Add --embedding to save embeddings)" "\n"; - - // Fix the source code indentation above that is introduced by the raw string literal. - std::string usage = std::regex_replace(usage_template, std::regex("\\n {8}"), "\n"); - usage = std::regex_replace(usage, std::regex("\\{prog\\}"), argv[0]); - LOG("%s\n", usage.c_str()); -} - -static bool has_pooling(llama_context * ctx) { - switch (llama_pooling_type(ctx)) { - case LLAMA_POOLING_TYPE_NONE: - case LLAMA_POOLING_TYPE_UNSPECIFIED: - return false; - default: - return true; - } -} - -struct output_data { - float * data_ptr = nullptr; - int data_size = 0; - std::string type_suffix; - std::vector embd_norm; - std::string prompt; - std::vector tokens; - - output_data(llama_context * ctx, const llama_model * model, const common_params & params) { - const llama_vocab * vocab = llama_model_get_vocab(model); - const bool add_bos = llama_vocab_get_add_bos(vocab); - - tokens = common_tokenize(ctx, params.prompt, add_bos); - prompt = params.prompt; - - if (params.embedding) { - const int n_embd = llama_model_n_embd_out(model); - const bool pooling = has_pooling(ctx); - const int n_embd_count = pooling ? 1 : tokens.size(); - const int n_floats = n_embd * n_embd_count; - - float * embd_raw = pooling ? llama_get_embeddings_seq(ctx, 0) : llama_get_embeddings(ctx); - if (embd_raw == nullptr) { - throw std::runtime_error("failed to get embeddings from the model"); - } - - LOG_DBG("pooling_enabled: %s\n", pooling ? "true" : "false"); - LOG_DBG("n_embd: %d\n", n_embd); - LOG_DBG("n_floats: %d\n", n_floats); - LOG_DBG("n_embd_count: %d\n", n_embd_count); - - data_ptr = embd_raw; - data_size = n_floats; - type_suffix = "-embeddings"; - - if (params.embd_normalize >= 0) { - embd_norm.resize(n_floats); - for (int i = 0; i < n_embd_count; i++) { - common_embd_normalize(embd_raw+i*n_embd, embd_norm.data()+i*n_embd, n_embd, params.embd_normalize); - } - data_ptr = embd_norm.data(); - } - } else { - const float * logits = llama_get_logits_ith(ctx, tokens.size() - 1); - const int n_logits = llama_vocab_n_tokens(vocab); - - data_ptr = const_cast(logits); - data_size = n_logits; - type_suffix = ""; - } - } -}; - -static void save_output_data(const output_data & output, const std::string & model_name, const std::string & output_dir) { - std::filesystem::create_directory(output_dir); - auto base_path = std::filesystem::path{output_dir} / ("llamacpp-" + model_name + output.type_suffix); - - // Save logits/embeddings to binary file. - { - std::filesystem::path filepath{base_path.string() + ".bin"}; - std::ofstream file{filepath, std::ios::binary}; - if (!file) { - throw std::runtime_error("failed to open binary output file: " + filepath.string()); - } - file.write(reinterpret_cast(output.data_ptr), output.data_size * sizeof(float)); - LOG("Data saved to %s\n", filepath.c_str()); - } - - // Save logits/embeddings to text file. - { - std::filesystem::path filepath{base_path.string() + ".txt"}; - std::ofstream file{filepath}; - if (!file) { - throw std::runtime_error("failed to open text output file: " + filepath.string()); - } - for (int i = 0; i < output.data_size; i++) { - file << i << ": " << output.data_ptr[i] << '\n'; - } - LOG("Data saved to %s\n", filepath.c_str()); - } - - // Save prompt and tokens to text file. - { - std::filesystem::path filepath{base_path.string() + "-prompt.txt"}; - std::ofstream file{filepath}; - if (!file) { - throw std::runtime_error("failed to open prompt output file: " + filepath.string()); - } - - file << "prompt: " << output.prompt << '\n'; - file << "n_tokens: " << output.tokens.size() << '\n'; - - file << "token ids: "; - for (size_t i = 0; i < output.tokens.size(); i++) { - file << output.tokens[i]; - if (i + 1 < output.tokens.size()) { - file << ", "; - } - } - file << '\n'; - LOG("Prompt saved to %s\n", filepath.c_str()); - } - - // Save token ids to binary file. - { - std::filesystem::path filepath{base_path.string() + "-tokens.bin"}; - std::ofstream file{filepath, std::ios::binary}; - if (!file) { - throw std::runtime_error("failed to open tokens binary file: " + filepath.string()); - } - file.write(reinterpret_cast(output.tokens.data()), output.tokens.size() * sizeof(llama_token)); - LOG("Tokens saved to %s\n", filepath.c_str()); - } - -} - -static void print_tokenized_prompt(llama_context * ctx, const std::vector & tokens, const std::string & prompt) { - const llama_model * model = llama_get_model(ctx); - const llama_vocab * vocab = llama_model_get_vocab(model); - - LOG("Model add_bos: %s\n", llama_vocab_get_add_bos(vocab) ? "true" : "false"); - LOG("Input prompt: \"%s\"\n", prompt.c_str()); - LOG("Token ids (%zu):\n", tokens.size()); - - for (auto id : tokens) { - std::string piece(128, '\0'); - int n = llama_token_to_piece(vocab, id, piece.data(), piece.size(), 0, true); - if (n < 0) { - LOG_ERR("failed to convert token %d to piece\n", id); - continue; - } - piece.resize(n); - LOG("%s(%d) ", piece.c_str(), id); - } - LOG("\n"); -} - -static bool run(llama_context * ctx, const common_params & params) { - const llama_model * model = llama_get_model(ctx); - const llama_vocab * vocab = llama_model_get_vocab(model); - - const bool add_bos = llama_vocab_get_add_bos(vocab); - - std::vector tokens = common_tokenize(ctx, params.prompt, add_bos); - - if (tokens.empty()) { - LOG_ERR("%s : there are not input tokens to process - (try to provide a prompt with '-p')\n", __func__); - return false; - } - - if (llama_decode(ctx, llama_batch_get_one(tokens.data(), tokens.size()))) { - LOG_ERR("%s : failed to eval\n", __func__); - return false; - } - - print_tokenized_prompt(ctx, tokens, params.prompt); - - if (params.save_logits) { - output_data output {ctx, model, params}; - std::filesystem::path model_path{params.model.path}; - std::string model_name{model_path.stem().string()}; - save_output_data(output, model_name, params.logits_output_dir); - } - - return true; -} - -int main(int argc, char ** argv) { - common_params params; - - if (!common_params_parse(argc, argv, params, LLAMA_EXAMPLE_DEBUG, print_usage)) { - return 1; - } - - common_init(); - - llama_backend_init(); - llama_numa_init(params.numa); - - base_callback_data cb_data(params, params.tensor_filter); - - auto llama_init = common_init_from_params(params); - - auto * model = llama_init->model(); - auto * ctx = llama_init->context(); - - if (model == nullptr || ctx == nullptr) { - LOG_ERR("%s : failed to init\n", __func__); - return 1; - } - - { - LOG_INF("\n"); - LOG_INF("%s\n", common_params_get_system_info(params).c_str()); - LOG_INF("\n"); - } - - if (!run(ctx, params)) { - return 1; - } - - LOG("\n"); - llama_perf_context_print(ctx); - - llama_backend_free(); - - return 0; -} diff --git a/examples/diffusion/diffusion-cli.cpp b/examples/diffusion/diffusion-cli.cpp index d50f754..273942a 100644 --- a/examples/diffusion/diffusion-cli.cpp +++ b/examples/diffusion/diffusion-cli.cpp @@ -553,7 +553,6 @@ int main(int argc, char ** argv) { model_params.n_gpu_layers = params.n_gpu_layers; model_params.devices = params.devices.data(); model_params.use_mmap = params.use_mmap; - model_params.use_direct_io = params.use_direct_io; model_params.use_mlock = params.use_mlock; model_params.check_tensors = params.check_tensors; diff --git a/examples/embedding/embedding.cpp b/examples/embedding/embedding.cpp index d8eaaa2..81111e8 100644 --- a/examples/embedding/embedding.cpp +++ b/examples/embedding/embedding.cpp @@ -33,7 +33,7 @@ static void batch_add_seq(llama_batch & batch, const std::vector & toke } } -static void batch_decode(llama_context * ctx, llama_batch & batch, float * output, int n_seq, int n_embd_out, int embd_norm) { +static void batch_decode(llama_context * ctx, llama_batch & batch, float * output, int n_seq, int n_embd, int embd_norm) { const enum llama_pooling_type pooling_type = llama_pooling_type(ctx); // clear previous kv_cache values (irrelevant for embeddings) @@ -65,8 +65,8 @@ static void batch_decode(llama_context * ctx, llama_batch & batch, float * outpu GGML_ASSERT(embd != NULL && "failed to get sequence embeddings"); } - float * out = output + embd_pos * n_embd_out; - common_embd_normalize(embd, out, n_embd_out, embd_norm); + float * out = output + embd_pos * n_embd; + common_embd_normalize(embd, out, n_embd, embd_norm); } } @@ -252,8 +252,8 @@ int main(int argc, char ** argv) { } // allocate output - const int n_embd_out = llama_model_n_embd_out(model); - std::vector embeddings(n_embd_count * n_embd_out, 0); + const int n_embd = llama_model_n_embd(model); + std::vector embeddings(n_embd_count * n_embd, 0); float * emb = embeddings.data(); // break into batches @@ -267,8 +267,8 @@ int main(int argc, char ** argv) { // encode if at capacity if (batch.n_tokens + n_toks > n_batch || s >= n_seq_max) { - float * out = emb + e * n_embd_out; - batch_decode(ctx, batch, out, s, n_embd_out, params.embd_normalize); + float * out = emb + e * n_embd; + batch_decode(ctx, batch, out, s, n_embd, params.embd_normalize); e += pooling_type == LLAMA_POOLING_TYPE_NONE ? batch.n_tokens : s; s = 0; common_batch_clear(batch); @@ -280,8 +280,8 @@ int main(int argc, char ** argv) { } // final batch - float * out = emb + e * n_embd_out; - batch_decode(ctx, batch, out, s, n_embd_out, params.embd_normalize); + float * out = emb + e * n_embd; + batch_decode(ctx, batch, out, s, n_embd, params.embd_normalize); if (params.embd_out.empty()) { LOG("\n"); @@ -289,19 +289,19 @@ int main(int argc, char ** argv) { if (pooling_type == LLAMA_POOLING_TYPE_NONE) { for (int j = 0; j < n_embd_count; j++) { LOG("embedding %d: ", j); - for (int i = 0; i < std::min(3, n_embd_out); i++) { + for (int i = 0; i < std::min(3, n_embd); i++) { if (params.embd_normalize == 0) { - LOG("%6.0f ", emb[j * n_embd_out + i]); + LOG("%6.0f ", emb[j * n_embd + i]); } else { - LOG("%9.6f ", emb[j * n_embd_out + i]); + LOG("%9.6f ", emb[j * n_embd + i]); } } LOG(" ... "); - for (int i = n_embd_out - 3; i < n_embd_out; i++) { + for (int i = n_embd - 3; i < n_embd; i++) { if (params.embd_normalize == 0) { - LOG("%6.0f ", emb[j * n_embd_out + i]); + LOG("%6.0f ", emb[j * n_embd + i]); } else { - LOG("%9.6f ", emb[j * n_embd_out + i]); + LOG("%9.6f ", emb[j * n_embd + i]); } } LOG("\n"); @@ -320,9 +320,9 @@ int main(int argc, char ** argv) { for (uint32_t i = 0; i < n_cls_out; i++) { // NOTE: if you change this log - update the tests in ci/run.sh if (n_cls_out == 1) { - LOG("rerank score %d: %8.3f\n", j, emb[j * n_embd_out]); + LOG("rerank score %d: %8.3f\n", j, emb[j * n_embd]); } else { - LOG("rerank score %d: %8.3f [%s]\n", j, emb[j * n_embd_out + i], cls_out_labels[i].c_str()); + LOG("rerank score %d: %8.3f [%s]\n", j, emb[j * n_embd + i], cls_out_labels[i].c_str()); } } } @@ -330,11 +330,11 @@ int main(int argc, char ** argv) { // print the first part of the embeddings or for a single prompt, the full embedding for (int j = 0; j < n_prompts; j++) { LOG("embedding %d: ", j); - for (int i = 0; i < (n_prompts > 1 ? std::min(16, n_embd_out) : n_embd_out); i++) { + for (int i = 0; i < (n_prompts > 1 ? std::min(16, n_embd) : n_embd); i++) { if (params.embd_normalize == 0) { - LOG("%6.0f ", emb[j * n_embd_out + i]); + LOG("%6.0f ", emb[j * n_embd + i]); } else { - LOG("%9.6f ", emb[j * n_embd_out + i]); + LOG("%9.6f ", emb[j * n_embd + i]); } } LOG("\n"); @@ -350,7 +350,7 @@ int main(int argc, char ** argv) { LOG("\n"); for (int i = 0; i < n_prompts; i++) { for (int j = 0; j < n_prompts; j++) { - float sim = common_embd_similarity_cos(emb + i * n_embd_out, emb + j * n_embd_out, n_embd_out); + float sim = common_embd_similarity_cos(emb + i * n_embd, emb + j * n_embd, n_embd); LOG("%6.2f ", sim); } LOG("%1.10s", prompts[i].c_str()); @@ -368,9 +368,9 @@ int main(int argc, char ** argv) { if (notArray) LOG(" {\n \"object\": \"embedding\",\n \"index\": %d,\n \"embedding\": ",j); LOG("["); for (int i = 0;;) { // at least one iteration (n_embd > 0) - LOG(params.embd_normalize == 0 ? "%1.0f" : "%1.7f", emb[j * n_embd_out + i]); + LOG(params.embd_normalize == 0 ? "%1.0f" : "%1.7f", emb[j * n_embd + i]); i++; - if (i < n_embd_out) LOG(","); else break; + if (i < n_embd) LOG(","); else break; } LOG(notArray ? "]\n }" : "]"); j++; @@ -383,7 +383,7 @@ int main(int argc, char ** argv) { for (int i = 0;;) { // at least two iteration (n_embd_count > 1) LOG(" ["); for (int j = 0;;) { // at least two iteration (n_embd_count > 1) - float sim = common_embd_similarity_cos(emb + i * n_embd_out, emb + j * n_embd_out, n_embd_out); + float sim = common_embd_similarity_cos(emb + i * n_embd, emb + j * n_embd, n_embd); LOG("%6.2f", sim); j++; if (j < n_embd_count) LOG(", "); else break; @@ -397,7 +397,7 @@ int main(int argc, char ** argv) { if (notArray) LOG("\n}\n"); } else if (params.embd_out == "raw") { - print_raw_embeddings(emb, n_embd_count, n_embd_out, model, pooling_type, params.embd_normalize); + print_raw_embeddings(emb, n_embd_count, n_embd, model, pooling_type, params.embd_normalize); } LOG("\n"); diff --git a/examples/eval-callback/CMakeLists.txt b/examples/eval-callback/CMakeLists.txt index 6439690..c514e43 100644 --- a/examples/eval-callback/CMakeLists.txt +++ b/examples/eval-callback/CMakeLists.txt @@ -4,23 +4,12 @@ install(TARGETS ${TARGET} RUNTIME) target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT}) target_compile_features(${TARGET} PRIVATE cxx_std_17) -if(LLAMA_BUILD_TESTS) - if(NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "s390x") - set(MODEL_NAME "tinyllamas/stories15M-q4_0.gguf") - set(MODEL_HASH "SHA256=66967fbece6dbe97886593fdbb73589584927e29119ec31f08090732d1861739") - else() - set(MODEL_NAME "tinyllamas/stories15M-be.Q4_0.gguf") - set(MODEL_HASH "SHA256=9aec857937849d976f30397e97eb1cabb53eb9dcb1ce4611ba8247fb5f44c65d") - endif() - set(MODEL_DEST "${CMAKE_BINARY_DIR}/${MODEL_NAME}") - set(TEST_TARGET test-eval-callback) - add_test(NAME ${TEST_TARGET}-download-model COMMAND ${CMAKE_COMMAND} - -DDEST=${MODEL_DEST} - -DNAME=${MODEL_NAME} - -DHASH=${MODEL_HASH} - -P ${CMAKE_SOURCE_DIR}/cmake/download-models.cmake - ) - set_tests_properties(${TEST_TARGET}-download-model PROPERTIES FIXTURES_SETUP ${TEST_TARGET}-download-model) - add_test(NAME ${TEST_TARGET} COMMAND llama-eval-callback -m "${MODEL_DEST}" --prompt hello --seed 42 -ngl 0) - set_tests_properties(${TEST_TARGET} PROPERTIES FIXTURES_REQUIRED ${TEST_TARGET}-download-model) +set(TEST_TARGET test-eval-callback) +if(NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "s390x") + add_test(NAME ${TEST_TARGET} + COMMAND llama-eval-callback --hf-repo ggml-org/models --hf-file tinyllamas/stories260K.gguf --model stories260K.gguf --prompt hello --seed 42 -ngl 0) +else() + add_test(NAME ${TEST_TARGET} + COMMAND llama-eval-callback --hf-repo ggml-org/models --hf-file tinyllamas/stories260K-be.gguf --model stories260K-be.gguf --prompt hello --seed 42 -ngl 0) endif() +set_property(TEST ${TEST_TARGET} PROPERTY LABELS eval-callback curl) diff --git a/examples/eval-callback/eval-callback.cpp b/examples/eval-callback/eval-callback.cpp index bd58734..408338f 100644 --- a/examples/eval-callback/eval-callback.cpp +++ b/examples/eval-callback/eval-callback.cpp @@ -1,12 +1,165 @@ #include "arg.h" #include "common.h" -#include "debug.h" #include "log.h" #include "llama.h" -#include "llama-cpp.h" +#include "ggml.h" + +#include +#include #include #include +/** + * This the arbitrary data which will be passed to each callback. + * Later on we can for example add operation or tensor name filter from the CLI arg, or a file descriptor to dump the tensor. + */ +struct callback_data { + std::vector data; +}; + +static std::string ggml_ne_string(const ggml_tensor * t) { + std::string str; + for (int i = 0; i < GGML_MAX_DIMS; ++i) { + str += std::to_string(t->ne[i]); + if (i + 1 < GGML_MAX_DIMS) { + str += ", "; + } + } + return str; +} + +static inline float ggml_compute_bf16_to_fp32(ggml_bf16_t h) { + union { + float f; + uint32_t i; + } u; + u.i = (uint32_t)h.bits << 16; + return u.f; +} + +static float ggml_get_float_value(const uint8_t * data, ggml_type type, const size_t * nb, size_t i0, size_t i1, size_t i2, size_t i3) { + size_t i = i3 * nb[3] + i2 * nb[2] + i1 * nb[1] + i0 * nb[0]; + float v; + if (type == GGML_TYPE_F16) { + v = ggml_fp16_to_fp32(*(const ggml_fp16_t *) &data[i]); + } else if (type == GGML_TYPE_F32) { + v = *(const float *) &data[i]; + } else if (type == GGML_TYPE_I64) { + v = (float) *(const int64_t *) &data[i]; + } else if (type == GGML_TYPE_I32) { + v = (float) *(const int32_t *) &data[i]; + } else if (type == GGML_TYPE_I16) { + v = (float) *(const int16_t *) &data[i]; + } else if (type == GGML_TYPE_I8) { + v = (float) *(const int8_t *) &data[i]; + } else if (type == GGML_TYPE_BF16) { + v = ggml_compute_bf16_to_fp32(*(const ggml_bf16_t *) &data[i]); + } else { + GGML_ABORT("fatal error"); + } + return v; +} + +static void ggml_print_tensor(uint8_t * data, ggml_type type, const int64_t * ne, const size_t * nb, int64_t n) { + GGML_ASSERT(n > 0); + float sum = 0; + for (int64_t i3 = 0; i3 < ne[3]; i3++) { + for (int64_t i2 = 0; i2 < ne[2]; i2++) { + for (int64_t i1 = 0; i1 < ne[1]; i1++) { + for (int64_t i0 = 0; i0 < ne[0]; i0++) { + const float v = ggml_get_float_value(data, type, nb, i0, i1, i2, i3); + sum += v; + } + } + } + } + for (int64_t i3 = 0; i3 < ne[3]; i3++) { + LOG(" [\n"); + for (int64_t i2 = 0; i2 < ne[2]; i2++) { + if (i2 == n && ne[2] > 2*n) { + LOG(" ..., \n"); + i2 = ne[2] - n; + } + LOG(" [\n"); + for (int64_t i1 = 0; i1 < ne[1]; i1++) { + if (i1 == n && ne[1] > 2*n) { + LOG(" ..., \n"); + i1 = ne[1] - n; + } + LOG(" ["); + for (int64_t i0 = 0; i0 < ne[0]; i0++) { + if (i0 == n && ne[0] > 2*n) { + LOG("..., "); + i0 = ne[0] - n; + } + const float v = ggml_get_float_value(data, type, nb, i0, i1, i2, i3); + LOG("%12.4f", v); + if (i0 < ne[0] - 1) LOG(", "); + } + LOG("],\n"); + } + LOG(" ],\n"); + } + LOG(" ]\n"); + LOG(" sum = %f\n", sum); + } + + // TODO: make this abort configurable/optional? + if (std::isnan(sum)) { + LOG_ERR("encountered NaN - aborting\n"); + exit(0); + } +} + +/** + * GGML operations callback during the graph execution. + * + * @param t current tensor + * @param ask when ask is true, the scheduler wants to know if we are interested in data from this tensor + * if we return true, a follow-up call will be made with ask=false in which we can do the actual collection. + * see ggml_backend_sched_eval_callback + * @param user_data user data to pass at each call back + * @return true to receive data or continue the graph, false otherwise + */ +static bool ggml_debug(struct ggml_tensor * t, bool ask, void * user_data) { + auto * cb_data = (callback_data *) user_data; + + const struct ggml_tensor * src0 = t->src[0]; + const struct ggml_tensor * src1 = t->src[1]; + + if (ask) { + return true; // Always retrieve data + } + + char src1_str[128] = {0}; + if (src1) { + snprintf(src1_str, sizeof(src1_str), "%s{%s}", src1->name, ggml_ne_string(src1).c_str()); + } + + LOG("%s: %24s = (%s) %10s(%s{%s}, %s}) = {%s}\n", __func__, + t->name, ggml_type_name(t->type), ggml_op_desc(t), + src0->name, ggml_ne_string(src0).c_str(), + src1 ? src1_str : "", + ggml_ne_string(t).c_str()); + + + // copy the data from the GPU memory if needed + const bool is_host = ggml_backend_buffer_is_host(t->buffer); + + if (!is_host) { + auto n_bytes = ggml_nbytes(t); + cb_data->data.resize(n_bytes); + ggml_backend_tensor_get(t, cb_data->data.data(), 0, n_bytes); + } + + if (!ggml_is_quantized(t->type)) { + uint8_t * data = is_host ? (uint8_t *) t->data : cb_data->data.data(); + ggml_print_tensor(data, t->type, t->ne, t->nb, 3); + } + + return true; +} + static bool run(llama_context * ctx, const common_params & params) { const llama_model * model = llama_get_model(ctx); const llama_vocab * vocab = llama_model_get_vocab(model); @@ -29,7 +182,7 @@ static bool run(llama_context * ctx, const common_params & params) { } int main(int argc, char ** argv) { - base_callback_data cb_data; + callback_data cb_data; common_params params; @@ -44,7 +197,7 @@ int main(int argc, char ** argv) { // pass the callback to the backend scheduler // it will be executed for each node during the graph computation - params.cb_eval = common_debug_cb_eval; + params.cb_eval = ggml_debug; params.cb_eval_user_data = &cb_data; params.warmup = false; diff --git a/examples/llama.android/app/build.gradle.kts b/examples/llama.android/app/build.gradle.kts index 2edfe98..3524fe3 100644 --- a/examples/llama.android/app/build.gradle.kts +++ b/examples/llama.android/app/build.gradle.kts @@ -41,8 +41,11 @@ android { } } compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" } } diff --git a/examples/llama.android/app/src/main/java/com/example/llama/MainActivity.kt b/examples/llama.android/app/src/main/java/com/example/llama/MainActivity.kt index 872ec2b..52c5dc2 100644 --- a/examples/llama.android/app/src/main/java/com/example/llama/MainActivity.kt +++ b/examples/llama.android/app/src/main/java/com/example/llama/MainActivity.kt @@ -6,7 +6,6 @@ import android.util.Log import android.widget.EditText import android.widget.TextView import android.widget.Toast -import androidx.activity.addCallback import androidx.activity.enableEdgeToEdge import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity @@ -19,7 +18,6 @@ import com.arm.aichat.gguf.GgufMetadata import com.arm.aichat.gguf.GgufMetadataReader import com.google.android.material.floatingactionbutton.FloatingActionButton import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -38,7 +36,6 @@ class MainActivity : AppCompatActivity() { // Arm AI Chat inference engine private lateinit var engine: InferenceEngine - private var generationJob: Job? = null // Conversation states private var isModelReady = false @@ -50,13 +47,11 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) enableEdgeToEdge() setContentView(R.layout.activity_main) - // View model boilerplate and state management is out of this basic sample's scope - onBackPressedDispatcher.addCallback { Log.w(TAG, "Ignore back press for simplicity") } // Find views ggufTv = findViewById(R.id.gguf) messagesRv = findViewById(R.id.messages) - messagesRv.layoutManager = LinearLayoutManager(this).apply { stackFromEnd = true } + messagesRv.layoutManager = LinearLayoutManager(this) messagesRv.adapter = messageAdapter userInputEt = findViewById(R.id.user_input) userActionFab = findViewById(R.id.fab) @@ -162,35 +157,33 @@ class MainActivity : AppCompatActivity() { * Validate and send the user message into [InferenceEngine] */ private fun handleUserInput() { - userInputEt.text.toString().also { userMsg -> - if (userMsg.isEmpty()) { + userInputEt.text.toString().also { userSsg -> + if (userSsg.isEmpty()) { Toast.makeText(this, "Input message is empty!", Toast.LENGTH_SHORT).show() } else { userInputEt.text = null - userInputEt.isEnabled = false userActionFab.isEnabled = false // Update message states - messages.add(Message(UUID.randomUUID().toString(), userMsg, true)) + messages.add(Message(UUID.randomUUID().toString(), userSsg, true)) lastAssistantMsg.clear() messages.add(Message(UUID.randomUUID().toString(), lastAssistantMsg.toString(), false)) - generationJob = lifecycleScope.launch(Dispatchers.Default) { - engine.sendUserPrompt(userMsg) + lifecycleScope.launch(Dispatchers.Default) { + engine.sendUserPrompt(userSsg) .onCompletion { withContext(Dispatchers.Main) { - userInputEt.isEnabled = true userActionFab.isEnabled = true } }.collect { token -> + val messageCount = messages.size + check(messageCount > 0 && !messages[messageCount - 1].isUser) + + messages.removeAt(messageCount - 1).copy( + content = lastAssistantMsg.append(token).toString() + ).let { messages.add(it) } + withContext(Dispatchers.Main) { - val messageCount = messages.size - check(messageCount > 0 && !messages[messageCount - 1].isUser) - - messages.removeAt(messageCount - 1).copy( - content = lastAssistantMsg.append(token).toString() - ).let { messages.add(it) } - messageAdapter.notifyItemChanged(messages.size - 1) } } @@ -202,7 +195,6 @@ class MainActivity : AppCompatActivity() { /** * Run a benchmark with the model file */ - @Deprecated("This benchmark doesn't accurately indicate GUI performance expected by app developers") private suspend fun runBenchmark(modelName: String, modelFile: File) = withContext(Dispatchers.Default) { Log.i(TAG, "Starts benchmarking $modelName") @@ -231,16 +223,6 @@ class MainActivity : AppCompatActivity() { if (!it.exists()) { it.mkdir() } } - override fun onStop() { - generationJob?.cancel() - super.onStop() - } - - override fun onDestroy() { - engine.destroy() - super.onDestroy() - } - companion object { private val TAG = MainActivity::class.java.simpleName diff --git a/examples/llama.android/app/src/main/res/layout/activity_main.xml b/examples/llama.android/app/src/main/res/layout/activity_main.xml index d15772b..ad805a6 100644 --- a/examples/llama.android/app/src/main/res/layout/activity_main.xml +++ b/examples/llama.android/app/src/main/res/layout/activity_main.xml @@ -24,7 +24,7 @@ android:id="@+id/gguf" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="16dp" + android:layout_margin="16dp" android:text="Selected GGUF model's metadata will show here." style="@style/TextAppearance.MaterialComponents.Body2" /> @@ -33,7 +33,8 @@ + android:layout_marginHorizontal="16dp" + android:layout_marginVertical="8dp" /> (InferenceEngine.State.Uninitialized) - override val state: StateFlow = _state.asStateFlow() + override val state: StateFlow = _state private var _readyForSystemPrompt = false - @Volatile - private var _cancelGeneration = false /** * Single-threaded coroutine dispatcher & scope for LLama asynchronous operations @@ -173,8 +169,6 @@ internal class InferenceEngineImpl private constructor( } Log.i(TAG, "Model loaded!") _readyForSystemPrompt = true - - _cancelGeneration = false _state.value = InferenceEngine.State.ModelReady } catch (e: Exception) { Log.e(TAG, (e.message ?: "Error loading model") + "\n" + pathToModel, e) @@ -237,19 +231,15 @@ internal class InferenceEngineImpl private constructor( Log.i(TAG, "User prompt processed. Generating assistant prompt...") _state.value = InferenceEngine.State.Generating - while (!_cancelGeneration) { + while (true) { generateNextToken()?.let { utf8token -> if (utf8token.isNotEmpty()) emit(utf8token) } ?: break } - if (_cancelGeneration) { - Log.i(TAG, "Assistant generation aborted per requested.") - } else { - Log.i(TAG, "Assistant generation complete. Awaiting user prompt...") - } + Log.i(TAG, "Assistant generation complete. Awaiting user prompt...") _state.value = InferenceEngine.State.ModelReady } catch (e: CancellationException) { - Log.i(TAG, "Assistant generation's flow collection cancelled.") + Log.i(TAG, "Generation cancelled by user.") _state.value = InferenceEngine.State.ModelReady throw e } catch (e: Exception) { @@ -278,9 +268,8 @@ internal class InferenceEngineImpl private constructor( /** * Unloads the model and frees resources, or reset error states */ - override fun cleanUp() { - _cancelGeneration = true - runBlocking(llamaDispatcher) { + override suspend fun cleanUp() = + withContext(llamaDispatcher) { when (val state = _state.value) { is InferenceEngine.State.ModelReady -> { Log.i(TAG, "Unloading model and free resources...") @@ -304,21 +293,17 @@ internal class InferenceEngineImpl private constructor( else -> throw IllegalStateException("Cannot unload model in ${state.javaClass.simpleName}") } } - } /** * Cancel all ongoing coroutines and free GGML backends */ override fun destroy() { - _cancelGeneration = true - runBlocking(llamaDispatcher) { - _readyForSystemPrompt = false - when(_state.value) { - is InferenceEngine.State.Uninitialized -> {} - is InferenceEngine.State.Initialized -> shutdown() - else -> { unload(); shutdown() } - } - } + _readyForSystemPrompt = false llamaScope.cancel() + when(_state.value) { + is InferenceEngine.State.Uninitialized -> {} + is InferenceEngine.State.Initialized -> shutdown() + else -> { unload(); shutdown() } + } } } diff --git a/examples/debug/CMakeLists.txt b/examples/model-conversion/CMakeLists.txt similarity index 73% rename from examples/debug/CMakeLists.txt rename to examples/model-conversion/CMakeLists.txt index 3459307..fc1746c 100644 --- a/examples/debug/CMakeLists.txt +++ b/examples/model-conversion/CMakeLists.txt @@ -1,5 +1,5 @@ -set(TARGET llama-debug) -add_executable(${TARGET} debug.cpp) +set(TARGET llama-logits) +add_executable(${TARGET} logits.cpp) install(TARGETS ${TARGET} RUNTIME) target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT}) target_compile_features(${TARGET} PRIVATE cxx_std_17) diff --git a/examples/model-conversion/Makefile b/examples/model-conversion/Makefile index 3b05059..25b0514 100644 --- a/examples/model-conversion/Makefile +++ b/examples/model-conversion/Makefile @@ -25,8 +25,6 @@ define quantize_model @echo "Export the quantized model path to $(2) variable in your environment" endef -DEVICE ?= auto - ### ### Casual Model targets/recipes ### @@ -55,13 +53,13 @@ causal-convert-mm-model: causal-run-original-model: $(call validate_model_path,causal-run-original-model) - @MODEL_PATH="$(MODEL_PATH)" ./scripts/causal/run-org-model.py --device "$(DEVICE)" + @MODEL_PATH="$(MODEL_PATH)" ./scripts/causal/run-org-model.py causal-run-converted-model: @CONVERTED_MODEL="$(CONVERTED_MODEL)" ./scripts/causal/run-converted-model.sh causal-verify-logits: causal-run-original-model causal-run-converted-model - @MODEL_PATH="$(MODEL_PATH)" ./scripts/causal/compare-logits.py + @./scripts/causal/compare-logits.py @MODEL_PATH="$(MODEL_PATH)" ./scripts/utils/check-nmse.py -m ${MODEL_PATH} causal-run-original-embeddings: @@ -138,13 +136,16 @@ embedding-run-original-model-st: embedding-run-original-model embedding-run-converted-model: @./scripts/embedding/run-converted-model.sh $(CONVERTED_EMBEDDING_MODEL) \ $(if $(PROMPTS_FILE),--prompts-file "$(PROMPTS_FILE)") \ - $(if $(EMBD_NORMALIZE),--embd-normalize "$(EMBD_NORMALIZE)") + $(if $(USE_POOLING),--pooling) + +embedding-run-converted-model-st: USE_POOLING=1 +embedding-run-converted-model-st: embedding-run-converted-model embedding-verify-logits: embedding-run-original-model embedding-run-converted-model @./scripts/embedding/compare-embeddings-logits.sh \ $(if $(PROMPTS_FILE),--prompts-file "$(PROMPTS_FILE)") -embedding-verify-logits-st: embedding-run-original-model-st embedding-run-converted-model +embedding-verify-logits-st: embedding-run-original-model-st embedding-run-converted-model-st @./scripts/embedding/compare-embeddings-logits.sh \ $(if $(PROMPTS_FILE),--prompts-file "$(PROMPTS_FILE)") diff --git a/examples/model-conversion/README.md b/examples/model-conversion/README.md index 637870a..8163b30 100644 --- a/examples/model-conversion/README.md +++ b/examples/model-conversion/README.md @@ -198,13 +198,14 @@ model, and the other is a text file which allows for manual visual inspection. #### Using SentenceTransformer with numbered layers For models that have numbered SentenceTransformer layers (01_Pooling, 02_Dense, -03_Dense, 04_Normalize), these will be applied automatically when running the -converted model but currently there is a separate target to run the original -version: +03_Dense, 04_Normalize), use the `-st` targets to apply all these layers: ```console # Run original model with SentenceTransformer (applies all numbered layers) (venv) $ make embedding-run-original-model-st + +# Run converted model with pooling enabled +(venv) $ make embedding-run-converted-model-st ``` This will use the SentenceTransformer library to load and run the model, which @@ -212,17 +213,6 @@ automatically applies all the numbered layers in the correct order. This is particularly useful when comparing with models that should include these additional transformation layers beyond just the base model output. -The type of normalization can be specified for the converted model but is not -strictly necessary as the verification uses cosine similarity and the magnitude -of the output vectors does not affect this. But the normalization type can be -specified as an argument to the target which might be useful for manual -inspection: -```console -(venv) $ make embedding-verify-logits-st EMBD_NORMALIZE=1 -``` -The original model will apply the normalization according to the normalization -layer specified in the modules.json configuration file. - ### Model conversion After updates have been made to [gguf-py](../../gguf-py) to add support for the new model the model can be converted to GGUF format using the following command: diff --git a/examples/model-conversion/logits.cpp b/examples/model-conversion/logits.cpp new file mode 100644 index 0000000..5bcf063 --- /dev/null +++ b/examples/model-conversion/logits.cpp @@ -0,0 +1,268 @@ +#include "llama.h" +#include "common.h" + + +#include +#include +#include +#include +#include +#include + +static void print_usage(int, char ** argv) { + printf("\nexample usage:\n"); + printf("\n %s -m model.gguf [-ngl n_gpu_layers] -embd-mode [-pooling] [-embd-norm ] [prompt]\n", argv[0]); + printf("\n"); + printf(" -embd-norm: normalization type for pooled embeddings (default: 2)\n"); + printf(" -1=none, 0=max absolute int16, 1=taxicab, 2=Euclidean/L2, >2=p-norm\n"); + printf("\n"); +} + +int main(int argc, char ** argv) { + std::string model_path; + std::string prompt = "Hello, my name is"; + int ngl = 0; + bool embedding_mode = false; + bool pooling_enabled = false; + int32_t embd_norm = 2; // (-1=none, 0=max absolute int16, 1=taxicab, 2=Euclidean/L2, >2=p-norm) + + { + int i = 1; + for (; i < argc; i++) { + if (strcmp(argv[i], "-m") == 0) { + if (i + 1 < argc) { + model_path = argv[++i]; + } else { + print_usage(argc, argv); + return 1; + } + } else if (strcmp(argv[i], "-ngl") == 0) { + if (i + 1 < argc) { + try { + ngl = std::stoi(argv[++i]); + } catch (...) { + print_usage(argc, argv); + return 1; + } + } else { + print_usage(argc, argv); + return 1; + } + } else if (strcmp(argv[i], "-embd-mode") == 0) { + embedding_mode = true; + } else if (strcmp(argv[i], "-pooling") == 0) { + pooling_enabled = true; + } else if (strcmp(argv[i], "-embd-norm") == 0) { + if (i + 1 < argc) { + try { + embd_norm = std::stoi(argv[++i]); + } catch (...) { + print_usage(argc, argv); + return 1; + } + } else { + print_usage(argc, argv); + return 1; + } + } else { + // prompt starts here + break; + } + } + + if (model_path.empty()) { + print_usage(argc, argv); + return 1; + } + + if (i < argc) { + prompt = argv[i++]; + for (; i < argc; i++) { + prompt += " "; + prompt += argv[i]; + } + } + } + + ggml_backend_load_all(); + llama_model_params model_params = llama_model_default_params(); + model_params.n_gpu_layers = ngl; + + llama_model * model = llama_model_load_from_file(model_path.c_str(), model_params); + + if (model == NULL) { + fprintf(stderr , "%s: error: unable to load model\n" , __func__); + return 1; + } + + // Extract basename from model_path + const char * basename = strrchr(model_path.c_str(), '/'); + basename = (basename == NULL) ? model_path.c_str() : basename + 1; + + char model_name[256]; + strncpy(model_name, basename, 255); + model_name[255] = '\0'; + + char * dot = strrchr(model_name, '.'); + if (dot != NULL && strcmp(dot, ".gguf") == 0) { + *dot = '\0'; + } + printf("Model name: %s\n", model_name); + + const llama_vocab * vocab = llama_model_get_vocab(model); + const int n_prompt = -llama_tokenize(vocab, prompt.c_str(), prompt.size(), NULL, 0, true, true); + + std::vector prompt_tokens(n_prompt); + if (llama_tokenize(vocab, prompt.c_str(), prompt.size(), prompt_tokens.data(), prompt_tokens.size(), true, true) < 0) { + fprintf(stderr, "%s: error: failed to tokenize the prompt\n", __func__); + return 1; + } + + llama_context_params ctx_params = llama_context_default_params(); + ctx_params.n_ctx = n_prompt; + ctx_params.n_batch = n_prompt; + ctx_params.no_perf = false; + if (embedding_mode) { + ctx_params.embeddings = true; + ctx_params.pooling_type = pooling_enabled ? LLAMA_POOLING_TYPE_MEAN : LLAMA_POOLING_TYPE_NONE; + ctx_params.n_ubatch = ctx_params.n_batch; + } + + llama_context * ctx = llama_init_from_model(model, ctx_params); + if (ctx == NULL) { + fprintf(stderr , "%s: error: failed to create the llama_context\n" , __func__); + return 1; + } + + printf("Input prompt: \"%s\"\n", prompt.c_str()); + printf("Tokenized prompt (%d tokens): ", n_prompt); + for (auto id : prompt_tokens) { + char buf[128]; + int n = llama_token_to_piece(vocab, id, buf, sizeof(buf), 0, true); + if (n < 0) { + fprintf(stderr, "%s: error: failed to convert token to piece\n", __func__); + return 1; + } + std::string s(buf, n); + printf("%s (%d)", s.c_str(), id); + } + printf("\n"); + + llama_batch batch = llama_batch_get_one(prompt_tokens.data(), prompt_tokens.size()); + + if (llama_decode(ctx, batch)) { + fprintf(stderr, "%s : failed to eval\n", __func__); + return 1; + } + + float * data_ptr; + int data_size; + const char * type; + std::vector embd_out; + + if (embedding_mode) { + const int n_embd = llama_model_n_embd(model); + const int n_embd_count = pooling_enabled ? 1 : batch.n_tokens; + const int n_embeddings = n_embd * n_embd_count; + float * embeddings; + type = "-embeddings"; + + if (llama_pooling_type(ctx) != LLAMA_POOLING_TYPE_NONE) { + embeddings = llama_get_embeddings_seq(ctx, 0); + embd_out.resize(n_embeddings); + printf("Normalizing embeddings using norm: %d\n", embd_norm); + common_embd_normalize(embeddings, embd_out.data(), n_embeddings, embd_norm); + embeddings = embd_out.data(); + } else { + embeddings = llama_get_embeddings(ctx); + } + + printf("Embedding dimension: %d\n", n_embd); + printf("\n"); + + // Print embeddings in the specified format + for (int j = 0; j < n_embd_count; j++) { + printf("embedding %d: ", j); + + // Print first 3 values + for (int i = 0; i < 3 && i < n_embd; i++) { + printf("%9.6f ", embeddings[j * n_embd + i]); + } + + printf(" ... "); + + // Print last 3 values + for (int i = n_embd - 3; i < n_embd; i++) { + if (i >= 0) { + printf("%9.6f ", embeddings[j * n_embd + i]); + } + } + + printf("\n"); + } + printf("\n"); + + printf("Embeddings size: %d\n", n_embeddings); + + data_ptr = embeddings; + data_size = n_embeddings; + } else { + float * logits = llama_get_logits_ith(ctx, batch.n_tokens - 1); + const int n_logits = llama_vocab_n_tokens(vocab); + type = ""; + printf("Vocab size: %d\n", n_logits); + + data_ptr = logits; + data_size = n_logits; + } + + std::filesystem::create_directory("data"); + + // Save data to binary file + char bin_filename[512]; + snprintf(bin_filename, sizeof(bin_filename), "data/llamacpp-%s%s.bin", model_name, type); + printf("Saving data to %s\n", bin_filename); + + FILE * f = fopen(bin_filename, "wb"); + if (f == NULL) { + fprintf(stderr, "%s: error: failed to open binary output file\n", __func__); + return 1; + } + fwrite(data_ptr, sizeof(float), data_size, f); + fclose(f); + + // Also save as text for debugging + char txt_filename[512]; + snprintf(txt_filename, sizeof(txt_filename), "data/llamacpp-%s%s.txt", model_name, type); + f = fopen(txt_filename, "w"); + if (f == NULL) { + fprintf(stderr, "%s: error: failed to open text output file\n", __func__); + return 1; + } + for (int i = 0; i < data_size; i++) { + fprintf(f, "%d: %.6f\n", i, data_ptr[i]); + } + fclose(f); + + if (!embedding_mode) { + printf("First 10 logits: "); + for (int i = 0; i < 10 && i < data_size; i++) { + printf("%.6f ", data_ptr[i]); + } + printf("\n"); + + printf("Last 10 logits: "); + for (int i = data_size - 10; i < data_size; i++) { + if (i >= 0) printf("%.6f ", data_ptr[i]); + } + printf("\n\n"); + } + + printf("Data saved to %s\n", bin_filename); + printf("Data saved to %s\n", txt_filename); + + llama_free(ctx); + llama_model_free(model); + + return 0; +} diff --git a/examples/model-conversion/scripts/causal/compare-embeddings-logits.sh b/examples/model-conversion/scripts/causal/compare-embeddings-logits.sh index 2ae4dc7..c53c89d 100755 --- a/examples/model-conversion/scripts/causal/compare-embeddings-logits.sh +++ b/examples/model-conversion/scripts/causal/compare-embeddings-logits.sh @@ -5,11 +5,8 @@ set -e MODEL_PATH="${1:-"$MODEL_PATH"}" MODEL_NAME="${2:-$(basename "$MODEL_PATH")}" -CONVERTED_MODEL_PATH="${1:-"$CONVERTED_MODEL"}" -CONVERTED_MODEL_NAME="${2:-$(basename "$CONVERTED_MODEL_PATH" ".gguf")}" - if [ -t 0 ]; then - CPP_EMBEDDINGS="data/llamacpp-${CONVERTED_MODEL_NAME}-embeddings.bin" + CPP_EMBEDDINGS="data/llamacpp-${MODEL_NAME}-embeddings.bin" else # Process piped JSON data and convert to binary (matching logits.cpp format) TEMP_FILE=$(mktemp /tmp/tmp.XXXXXX.binn) diff --git a/examples/model-conversion/scripts/causal/compare-logits.py b/examples/model-conversion/scripts/causal/compare-logits.py index 83bd14c..894302c 100755 --- a/examples/model-conversion/scripts/causal/compare-logits.py +++ b/examples/model-conversion/scripts/causal/compare-logits.py @@ -3,11 +3,10 @@ import sys import numpy as np from pathlib import Path -import os # Add utils directory to path for direct script execution sys.path.insert(0, str(Path(__file__).parent.parent / "utils")) -from common import get_model_name_from_env_path, compare_tokens, exit_with_warning # type: ignore[import-not-found] +from common import get_model_name_from_env_path # type: ignore[import-not-found] def quick_logits_check(pytorch_file, llamacpp_file): """Lightweight sanity check before NMSE""" @@ -39,7 +38,6 @@ def quick_logits_check(pytorch_file, llamacpp_file): return True def main(): - model_path = os.environ.get('MODEL_PATH') model_name = get_model_name_from_env_path('MODEL_PATH') data_dir = Path("data") pytorch_file = data_dir / f"pytorch-{model_name}.bin" @@ -60,12 +58,6 @@ def main(): print("Checked all required files were found. Proceeding...\n") - # Verify tokens as they are a prerequisite for logits comparison. - print("🔍 Token Comparison Check") - print("=" * 40) - if not compare_tokens(f"pytorch-{model_name}", f"llamacpp-{llamacpp_model_name}"): - exit_with_warning("\n❌ Token mismatch detected", model_path) - print() print("🔍 GGML Model Validation for model ", model_name) print("=" * 40) @@ -81,7 +73,8 @@ def main(): print(" Ok to proceed with NMSE check...") sys.exit(0) else: - exit_with_warning(f"❌ NOK: Top 10 predictions don't match - generation will differ", model_path) + print(f"❌ NOK: Top 10 predictions don't match - generation will differ") + sys.exit(1) if __name__ == "__main__": main() diff --git a/examples/model-conversion/scripts/causal/modelcard.template b/examples/model-conversion/scripts/causal/modelcard.template index a045950..cfa8e6b 100644 --- a/examples/model-conversion/scripts/causal/modelcard.template +++ b/examples/model-conversion/scripts/causal/modelcard.template @@ -7,7 +7,7 @@ base_model: Recommended way to run this model: ```sh -llama-server -hf {namespace}/{model_name}-GGUF +llama-server -hf {namespace}/{model_name}-GGUF -c 0 ``` Then, access http://localhost:8080 diff --git a/examples/model-conversion/scripts/causal/run-casual-gen-embeddings-org.py b/examples/model-conversion/scripts/causal/run-casual-gen-embeddings-org.py index 4ab778f..55ad821 100755 --- a/examples/model-conversion/scripts/causal/run-casual-gen-embeddings-org.py +++ b/examples/model-conversion/scripts/causal/run-casual-gen-embeddings-org.py @@ -67,7 +67,7 @@ with torch.no_grad(): last_hidden_states = outputs.hidden_states[-1] # Get embeddings for all tokens - token_embeddings = last_hidden_states[0].float().cpu().numpy() # Remove batch dimension + token_embeddings = last_hidden_states[0].cpu().numpy() # Remove batch dimension print(f"Hidden states shape: {last_hidden_states.shape}") print(f"Token embeddings shape: {token_embeddings.shape}") diff --git a/examples/model-conversion/scripts/causal/run-converted-model-embeddings-logits.sh b/examples/model-conversion/scripts/causal/run-converted-model-embeddings-logits.sh index 3cce3fc..fa16a02 100755 --- a/examples/model-conversion/scripts/causal/run-converted-model-embeddings-logits.sh +++ b/examples/model-conversion/scripts/causal/run-converted-model-embeddings-logits.sh @@ -13,6 +13,6 @@ if [ -z "$CONVERTED_MODEL" ]; then exit 1 fi -cmake --build ../../build --target llama-debug -j8 +cmake --build ../../build --target llama-logits -j8 -../../build/bin/llama-debug -m $CONVERTED_MODEL --embedding -p "Hello world today" --save-logits +../../build/bin/llama-logits -m $CONVERTED_MODEL -embd-mode "Hello world today" diff --git a/examples/model-conversion/scripts/causal/run-converted-model.sh b/examples/model-conversion/scripts/causal/run-converted-model.sh index b6c3d38..529e998 100755 --- a/examples/model-conversion/scripts/causal/run-converted-model.sh +++ b/examples/model-conversion/scripts/causal/run-converted-model.sh @@ -21,6 +21,6 @@ fi echo $CONVERTED_MODEL echo $MODEL_TESTING_PROMPT -cmake --build ../../build --target llama-debug -j8 +cmake --build ../../build --target llama-logits -j8 -../../build/bin/llama-debug -m "$CONVERTED_MODEL" -p "$MODEL_TESTING_PROMPT" --save-logits +../../build/bin/llama-logits -m "$CONVERTED_MODEL" "$MODEL_TESTING_PROMPT" diff --git a/examples/model-conversion/scripts/causal/run-org-model.py b/examples/model-conversion/scripts/causal/run-org-model.py index 215f1a9..14bb12f 100755 --- a/examples/model-conversion/scripts/causal/run-org-model.py +++ b/examples/model-conversion/scripts/causal/run-org-model.py @@ -4,165 +4,149 @@ import argparse import os import sys import importlib -import torch -import numpy as np - -from transformers import AutoTokenizer, AutoModelForCausalLM, AutoModelForImageTextToText, AutoConfig +from pathlib import Path # Add parent directory to path for imports sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) -from utils.common import debug_hook, save_output_data -def parse_arguments(): - parser = argparse.ArgumentParser(description="Process model with specified path") - parser.add_argument("--model-path", "-m", help="Path to the model") - parser.add_argument("--prompt-file", "-f", help="Optional prompt file", required=False) - parser.add_argument("--verbose", "-v", action="store_true", help="Enable verbose debug output") - parser.add_argument("--device", "-d", help="Device to use (cpu, cuda, mps, auto)", default="auto") - return parser.parse_args() +from transformers import AutoTokenizer, AutoModelForCausalLM, AutoModelForImageTextToText, AutoConfig +import torch +import numpy as np +from utils.common import debug_hook -def load_model_and_tokenizer(model_path, device="auto"): - print("Loading model and tokenizer using AutoTokenizer:", model_path) - tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) - config = AutoConfig.from_pretrained(model_path, trust_remote_code=True) - multimodal = False - full_config = config +parser = argparse.ArgumentParser(description="Process model with specified path") +parser.add_argument("--model-path", "-m", help="Path to the model") +parser.add_argument("--prompt-file", "-f", help="Optional prompt file", required=False) +parser.add_argument("--verbose", "-v", action="store_true", help="Enable verbose debug output") +args = parser.parse_args() - # Determine device_map based on device argument - if device == "cpu": - device_map = {"": "cpu"} - print("Forcing CPU usage") - elif device == "auto": - device_map = "auto" - else: - device_map = {"": device} +model_path = os.environ.get("MODEL_PATH", args.model_path) +if model_path is None: + parser.error( + "Model path must be specified either via --model-path argument or MODEL_PATH environment variable" + ) - print("Model type: ", config.model_type) - if "vocab_size" not in config and "text_config" in config: - config = config.text_config - multimodal = True +### If you want to dump RoPE activations, uncomment the following lines: +### === START ROPE DEBUG === +# from utils.common import setup_rope_debug +# setup_rope_debug("transformers.models.apertus.modeling_apertus") +### == END ROPE DEBUG === - print("Vocab size: ", config.vocab_size) - print("Hidden size: ", config.hidden_size) - print("Number of layers: ", config.num_hidden_layers) - print("BOS token id: ", config.bos_token_id) - print("EOS token id: ", config.eos_token_id) - unreleased_model_name = os.getenv("UNRELEASED_MODEL_NAME") - if unreleased_model_name: - model_name_lower = unreleased_model_name.lower() - unreleased_module_path = ( - f"transformers.models.{model_name_lower}.modular_{model_name_lower}" +print("Loading model and tokenizer using AutoTokenizer:", model_path) +tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) +config = AutoConfig.from_pretrained(model_path, trust_remote_code=True) +multimodal = False +full_config = config + +print("Model type: ", config.model_type) +if "vocab_size" not in config and "text_config" in config: + config = config.text_config + multimodal = True +print("Vocab size: ", config.vocab_size) +print("Hidden size: ", config.hidden_size) +print("Number of layers: ", config.num_hidden_layers) +print("BOS token id: ", config.bos_token_id) +print("EOS token id: ", config.eos_token_id) + +unreleased_model_name = os.getenv("UNRELEASED_MODEL_NAME") +if unreleased_model_name: + model_name_lower = unreleased_model_name.lower() + unreleased_module_path = ( + f"transformers.models.{model_name_lower}.modular_{model_name_lower}" + ) + class_name = f"{unreleased_model_name}ForCausalLM" + print(f"Importing unreleased model module: {unreleased_module_path}") + + try: + model_class = getattr( + importlib.import_module(unreleased_module_path), class_name + ) + model = model_class.from_pretrained( + model_path + ) # Note: from_pretrained, not fromPretrained + except (ImportError, AttributeError) as e: + print(f"Failed to import or load model: {e}") + exit(1) +else: + if multimodal: + model = AutoModelForImageTextToText.from_pretrained( + model_path, device_map="auto", offload_folder="offload", trust_remote_code=True, config=full_config ) - class_name = f"{unreleased_model_name}ForCausalLM" - print(f"Importing unreleased model module: {unreleased_module_path}") - - try: - model_class = getattr(importlib.import_module(unreleased_module_path), class_name) - model = model_class.from_pretrained( - model_path, - device_map=device_map, - offload_folder="offload", - trust_remote_code=True, - config=config - ) - except (ImportError, AttributeError) as e: - print(f"Failed to import or load model: {e}") - exit(1) else: - if multimodal: - model = AutoModelForImageTextToText.from_pretrained( - model_path, - device_map=device_map, - offload_folder="offload", - trust_remote_code=True, - config=full_config - ) - else: - model = AutoModelForCausalLM.from_pretrained( - model_path, - device_map=device_map, - offload_folder="offload", - trust_remote_code=True, - config=config - ) + model = AutoModelForCausalLM.from_pretrained( + model_path, device_map="auto", offload_folder="offload", trust_remote_code=True, config=config + ) - print(f"Model class: {model.__class__.__name__}") +if args.verbose: + for name, module in model.named_modules(): + if len(list(module.children())) == 0: # only leaf modules + module.register_forward_hook(debug_hook(name)) - return model, tokenizer, config +model_name = os.path.basename(model_path) +# Printing the Model class to allow for easier debugging. This can be useful +# when working with models that have not been publicly released yet and this +# migth require that the concrete class is imported and used directly instead +# of using AutoModelForCausalLM. +print(f"Model class: {model.__class__.__name__}") -def enable_torch_debugging(model): - for name, module in model.named_modules(): - if len(list(module.children())) == 0: # only leaf modules - module.register_forward_hook(debug_hook(name)) +device = next(model.parameters()).device +if args.prompt_file: + with open(args.prompt_file, encoding='utf-8') as f: + prompt = f.read() +elif os.getenv("MODEL_TESTING_PROMPT"): + prompt = os.getenv("MODEL_TESTING_PROMPT") +else: + prompt = "Hello, my name is" +input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to(device) -def get_prompt(args): - if args.prompt_file: - with open(args.prompt_file, encoding='utf-8') as f: - return f.read() - elif os.getenv("MODEL_TESTING_PROMPT"): - return os.getenv("MODEL_TESTING_PROMPT") - else: - return "Hello, my name is" +print(f"Input tokens: {input_ids}") +print(f"Input text: {repr(prompt)}") +print(f"Tokenized: {tokenizer.convert_ids_to_tokens(input_ids[0])}") -def main(): - args = parse_arguments() - model_path = os.environ.get("MODEL_PATH", args.model_path) - if model_path is None: - print("Error: Model path must be specified either via --model-path argument or MODEL_PATH environment variable") - sys.exit(1) +batch_size = 512 +with torch.no_grad(): + past = None + outputs = None + for i in range(0, input_ids.size(1), batch_size): + print(f"Processing chunk with tokens {i} to {i + batch_size}") + chunk = input_ids[:, i:i + batch_size] + outputs = model(chunk.to(model.device), past_key_values=past, use_cache=True) + past = outputs.past_key_values - model, tokenizer, config = load_model_and_tokenizer(model_path, args.device) + logits = outputs.logits # type: ignore - if args.verbose: - enable_torch_debugging(model) + # Extract logits for the last token (next token prediction) + last_logits = logits[0, -1, :].float().cpu().numpy() - model_name = os.path.basename(model_path) + print(f"Logits shape: {logits.shape}") + print(f"Last token logits shape: {last_logits.shape}") + print(f"Vocab size: {len(last_logits)}") - # Iterate over the model parameters (the tensors) and get the first one - # and use it to get the device the model is on. - device = next(model.parameters()).device - prompt = get_prompt(args) - input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to(device) - token_ids = input_ids[0].cpu().tolist() + data_dir = Path("data") + data_dir.mkdir(exist_ok=True) + bin_filename = data_dir / f"pytorch-{model_name}.bin" + txt_filename = data_dir / f"pytorch-{model_name}.txt" - print(f"Input tokens: {input_ids}") - print(f"Input text: {repr(prompt)}") - print(f"Tokenized: {tokenizer.convert_ids_to_tokens(input_ids[0])}") + # Save to file for comparison + last_logits.astype(np.float32).tofile(bin_filename) - batch_size = 512 + # Also save as text file for easy inspection + with open(txt_filename, "w") as f: + for i, logit in enumerate(last_logits): + f.write(f"{i}: {logit:.6f}\n") - with torch.no_grad(): - past = None - outputs = None - for i in range(0, input_ids.size(1), batch_size): - print(f"Processing chunk with tokens {i} to {i + batch_size}") - chunk = input_ids[:, i:i + batch_size] - outputs = model(chunk.to(model.device), past_key_values=past, use_cache=True) - past = outputs.past_key_values + # Print some sample logits for quick verification + print(f"First 10 logits: {last_logits[:10]}") + print(f"Last 10 logits: {last_logits[-10:]}") - logits = outputs.logits # type: ignore + # Show top 5 predicted tokens + top_indices = np.argsort(last_logits)[-5:][::-1] + print("Top 5 predictions:") + for idx in top_indices: + token = tokenizer.decode([idx]) + print(f" Token {idx} ({repr(token)}): {last_logits[idx]:.6f}") - # Extract logits for the last token (next token prediction) - last_logits = logits[0, -1, :].float().cpu().numpy() - - print(f"Logits shape: {logits.shape}") - print(f"Last token logits shape: {last_logits.shape}") - print(f"Vocab size: {len(last_logits)}") - - # Print some sample logits for quick verification - print(f"First 10 logits: {last_logits[:10]}") - print(f"Last 10 logits: {last_logits[-10:]}") - - # Show top 5 predicted tokens - top_indices = np.argsort(last_logits)[-5:][::-1] - print("Top 5 predictions:") - for idx in top_indices: - token = tokenizer.decode([idx]) - print(f" Token {idx} ({repr(token)}): {last_logits[idx]:.6f}") - - save_output_data(last_logits, token_ids, prompt, model_name) - -if __name__ == "__main__": - main() + print(f"Saved bin logits to: {bin_filename}") + print(f"Saved txt logist to: {txt_filename}") diff --git a/examples/model-conversion/scripts/embedding/run-converted-model.sh b/examples/model-conversion/scripts/embedding/run-converted-model.sh index 84625ce..0f490e6 100755 --- a/examples/model-conversion/scripts/embedding/run-converted-model.sh +++ b/examples/model-conversion/scripts/embedding/run-converted-model.sh @@ -5,7 +5,7 @@ set -e # Parse command line arguments CONVERTED_MODEL="" PROMPTS_FILE="" -EMBD_NORMALIZE="2" +USE_POOLING="" while [[ $# -gt 0 ]]; do case $1 in @@ -13,9 +13,9 @@ while [[ $# -gt 0 ]]; do PROMPTS_FILE="$2" shift 2 ;; - --embd-normalize) - EMBD_NORMALIZE="$2" - shift 2 + --pooling) + USE_POOLING="1" + shift ;; *) if [ -z "$CONVERTED_MODEL" ]; then @@ -50,5 +50,10 @@ fi echo $CONVERTED_MODEL -cmake --build ../../build --target llama-debug -j8 -../../build/bin/llama-debug -m "$CONVERTED_MODEL" --embedding -p "$PROMPT" --save-logits --embd-normalize $EMBD_NORMALIZE +cmake --build ../../build --target llama-logits -j8 +# TODO: update logits.cpp to accept a --file/-f option for the prompt +if [ -n "$USE_POOLING" ]; then + ../../build/bin/llama-logits -m "$CONVERTED_MODEL" -embd-mode -pooling "$PROMPT" +else + ../../build/bin/llama-logits -m "$CONVERTED_MODEL" -embd-mode "$PROMPT" +fi diff --git a/examples/model-conversion/scripts/embedding/run-original-model.py b/examples/model-conversion/scripts/embedding/run-original-model.py index 0802cbc..640e200 100755 --- a/examples/model-conversion/scripts/embedding/run-original-model.py +++ b/examples/model-conversion/scripts/embedding/run-original-model.py @@ -2,242 +2,176 @@ import argparse import os -import sys +import numpy as np import importlib +from pathlib import Path from transformers import AutoTokenizer, AutoConfig, AutoModel import torch -# Add parent directory to path for imports -sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) -from utils.common import save_output_data +unreleased_model_name = os.getenv('UNRELEASED_MODEL_NAME') +parser = argparse.ArgumentParser(description='Process model with specified path') +parser.add_argument('--model-path', '-m', help='Path to the model') +parser.add_argument('--prompts-file', '-p', help='Path to file containing prompts (one per line)') +parser.add_argument('--use-sentence-transformers', action='store_true', + help='Use SentenceTransformer to apply all numbered layers (01_Pooling, 02_Dense, 03_Dense, 04_Normalize)') +args = parser.parse_args() -def parse_arguments(): - parser = argparse.ArgumentParser(description='Run original embedding model') - parser.add_argument( - '--model-path', - '-m', - help='Path to the model' - ) - parser.add_argument( - '--prompts-file', - '-p', - help='Path to file containing prompts (one per line)' - ) - parser.add_argument( - '--use-sentence-transformers', - action='store_true', - help=('Use SentenceTransformer to apply all numbered layers ' - '(01_Pooling, 02_Dense, 03_Dense, 04_Normalize)') - ) - parser.add_argument( - '--device', - '-d', - help='Device to use (cpu, cuda, mps, auto)', - default='auto' - ) - return parser.parse_args() +def read_prompt_from_file(file_path): + try: + with open(file_path, 'r', encoding='utf-8') as f: + return f.read().strip() + except FileNotFoundError: + print(f"Error: Prompts file '{file_path}' not found") + exit(1) + except Exception as e: + print(f"Error reading prompts file: {e}") + exit(1) +model_path = os.environ.get('EMBEDDING_MODEL_PATH', args.model_path) +if model_path is None: + parser.error("Model path must be specified either via --model-path argument or EMBEDDING_MODEL_PATH environment variable") -def load_model_and_tokenizer(model_path, use_sentence_transformers=False, device="auto"): - if device == "cpu": - device_map = {"": "cpu"} - print("Forcing CPU usage") - elif device == "auto": - # On Mac, "auto" device_map can cause issues with accelerate - # So we detect the best device manually - if torch.cuda.is_available(): - device_map = {"": "cuda"} - print("Using CUDA") - elif torch.backends.mps.is_available(): - device_map = {"": "mps"} - print("Using MPS (Apple Metal)") - else: - device_map = {"": "cpu"} - print("Using CPU") - else: - device_map = {"": device} +# Determine if we should use SentenceTransformer +use_sentence_transformers = args.use_sentence_transformers or os.environ.get('USE_SENTENCE_TRANSFORMERS', '').lower() in ('1', 'true', 'yes') - if use_sentence_transformers: - from sentence_transformers import SentenceTransformer - print("Using SentenceTransformer to apply all numbered layers") - model = SentenceTransformer(model_path) - tokenizer = model.tokenizer - config = model[0].auto_model.config # type: ignore - else: - tokenizer = AutoTokenizer.from_pretrained(model_path) - config = AutoConfig.from_pretrained(model_path, trust_remote_code=True) +if use_sentence_transformers: + from sentence_transformers import SentenceTransformer + print("Using SentenceTransformer to apply all numbered layers") + model = SentenceTransformer(model_path) + tokenizer = model.tokenizer + config = model[0].auto_model.config # type: ignore +else: + tokenizer = AutoTokenizer.from_pretrained(model_path) - # This can be used to override the sliding window size for manual testing. This - # can be useful to verify the sliding window attention mask in the original model - # and compare it with the converted .gguf model. - if hasattr(config, 'sliding_window'): - original_sliding_window = config.sliding_window - print(f"Modified sliding window: {original_sliding_window} -> {config.sliding_window}") + config = AutoConfig.from_pretrained(model_path) - unreleased_model_name = os.getenv('UNRELEASED_MODEL_NAME') - print(f"Using unreleased model: {unreleased_model_name}") - if unreleased_model_name: - model_name_lower = unreleased_model_name.lower() - unreleased_module_path = f"transformers.models.{model_name_lower}.modular_{model_name_lower}" - class_name = f"{unreleased_model_name}Model" - print(f"Importing unreleased model module: {unreleased_module_path}") + # This can be used to override the sliding window size for manual testing. This + # can be useful to verify the sliding window attention mask in the original model + # and compare it with the converted .gguf model. + if hasattr(config, 'sliding_window'): + original_sliding_window = config.sliding_window + #original_sliding_window = 6 + print(f"Modified sliding window: {original_sliding_window} -> {config.sliding_window}") - try: - model_class = getattr(importlib.import_module(unreleased_module_path), class_name) - model = model_class.from_pretrained( - model_path, - device_map=device_map, - offload_folder="offload", - trust_remote_code=True, - config=config - ) - except (ImportError, AttributeError) as e: - print(f"Failed to import or load model: {e}") - sys.exit(1) - else: - model = AutoModel.from_pretrained( - model_path, - device_map=device_map, - offload_folder="offload", - trust_remote_code=True, - config=config - ) - print(f"Model class: {type(model)}") - print(f"Model file: {type(model).__module__}") + print(f"Using unreleased model: {unreleased_model_name}") + if unreleased_model_name: + model_name_lower = unreleased_model_name.lower() + unreleased_module_path = f"transformers.models.{model_name_lower}.modular_{model_name_lower}" + class_name = f"{unreleased_model_name}Model" + print(f"Importing unreleased model module: {unreleased_module_path}") - # Verify the model is using the correct sliding window - if hasattr(model.config, 'sliding_window'): # type: ignore - print(f"Model's sliding_window: {model.config.sliding_window}") # type: ignore - else: - print("Model config does not have sliding_window attribute") - - return model, tokenizer, config - - -def get_prompt(args): - if args.prompts_file: try: - with open(args.prompts_file, 'r', encoding='utf-8') as f: - return f.read().strip() - except FileNotFoundError: - print(f"Error: Prompts file '{args.prompts_file}' not found") - sys.exit(1) - except Exception as e: - print(f"Error reading prompts file: {e}") - sys.exit(1) + model_class = getattr(importlib.import_module(unreleased_module_path), class_name) + model = model_class.from_pretrained(model_path, config=config) + except (ImportError, AttributeError) as e: + print(f"Failed to import or load model: {e}") + exit(1) else: - return "Hello world today" + model = AutoModel.from_pretrained(model_path, config=config) + print(f"Model class: {type(model)}") + print(f"Model file: {type(model).__module__}") - -def main(): - args = parse_arguments() - - model_path = os.environ.get('EMBEDDING_MODEL_PATH', args.model_path) - if model_path is None: - print("Error: Model path must be specified either via --model-path argument " - "or EMBEDDING_MODEL_PATH environment variable") - sys.exit(1) - - # Determine if we should use SentenceTransformer - use_st = ( - args.use_sentence_transformers or os.environ.get('USE_SENTENCE_TRANSFORMERS', '').lower() in ('1', 'true', 'yes') - ) - - model, tokenizer, config = load_model_and_tokenizer(model_path, use_st, args.device) - - # Get the device the model is on - if not use_st: - device = next(model.parameters()).device +# Verify the model is using the correct sliding window +if not use_sentence_transformers: + if hasattr(model.config, 'sliding_window'): # type: ignore + print(f"Model's sliding_window: {model.config.sliding_window}") # type: ignore else: - # For SentenceTransformer, get device from the underlying model - device = next(model[0].auto_model.parameters()).device # type: ignore + print("Model config does not have sliding_window attribute") - model_name = os.path.basename(model_path) +model_name = os.path.basename(model_path) - prompt_text = get_prompt(args) +if args.prompts_file: + prompt_text = read_prompt_from_file(args.prompts_file) texts = [prompt_text] +else: + texts = ["Hello world today"] - with torch.no_grad(): - if use_st: - embeddings = model.encode(texts, convert_to_numpy=True) - all_embeddings = embeddings # Shape: [batch_size, hidden_size] +with torch.no_grad(): + if use_sentence_transformers: + embeddings = model.encode(texts, convert_to_numpy=True) + all_embeddings = embeddings # Shape: [batch_size, hidden_size] - encoded = tokenizer( - texts, - padding=True, - truncation=True, - return_tensors="pt" - ) - tokens = encoded['input_ids'][0] - token_ids = tokens.cpu().tolist() - token_strings = tokenizer.convert_ids_to_tokens(tokens) - for i, (token_id, token_str) in enumerate(zip(tokens, token_strings)): - print(f"{token_id:6d} -> '{token_str}'") + encoded = tokenizer( + texts, + padding=True, + truncation=True, + return_tensors="pt" + ) + tokens = encoded['input_ids'][0] + token_strings = tokenizer.convert_ids_to_tokens(tokens) + for i, (token_id, token_str) in enumerate(zip(tokens, token_strings)): + print(f"{token_id:6d} -> '{token_str}'") - print(f"Embeddings shape (after all SentenceTransformer layers): {all_embeddings.shape}") - print(f"Embedding dimension: {all_embeddings.shape[1] if len(all_embeddings.shape) > 1 else all_embeddings.shape[0]}") # type: ignore - else: - # Standard approach: use base model output only - encoded = tokenizer( - texts, - padding=True, - truncation=True, - return_tensors="pt" - ) + print(f"Embeddings shape (after all SentenceTransformer layers): {all_embeddings.shape}") + print(f"Embedding dimension: {all_embeddings.shape[1] if len(all_embeddings.shape) > 1 else all_embeddings.shape[0]}") # type: ignore + else: + # Standard approach: use base model output only + encoded = tokenizer( + texts, + padding=True, + truncation=True, + return_tensors="pt" + ) - tokens = encoded['input_ids'][0] - token_ids = tokens.cpu().tolist() - token_strings = tokenizer.convert_ids_to_tokens(tokens) - for i, (token_id, token_str) in enumerate(zip(tokens, token_strings)): - print(f"{token_id:6d} -> '{token_str}'") + tokens = encoded['input_ids'][0] + token_strings = tokenizer.convert_ids_to_tokens(tokens) + for i, (token_id, token_str) in enumerate(zip(tokens, token_strings)): + print(f"{token_id:6d} -> '{token_str}'") - # Move inputs to the same device as the model - encoded = {k: v.to(device) for k, v in encoded.items()} - outputs = model(**encoded) - hidden_states = outputs.last_hidden_state # Shape: [batch_size, seq_len, hidden_size] + outputs = model(**encoded) + hidden_states = outputs.last_hidden_state # Shape: [batch_size, seq_len, hidden_size] - all_embeddings = hidden_states[0].float().cpu().numpy() # Shape: [seq_len, hidden_size] + all_embeddings = hidden_states[0].cpu().numpy() # Shape: [seq_len, hidden_size] - print(f"Hidden states shape: {hidden_states.shape}") - print(f"All embeddings shape: {all_embeddings.shape}") - print(f"Embedding dimension: {all_embeddings.shape[1]}") + print(f"Hidden states shape: {hidden_states.shape}") + print(f"All embeddings shape: {all_embeddings.shape}") + print(f"Embedding dimension: {all_embeddings.shape[1]}") - if len(all_embeddings.shape) == 1: - n_embd = all_embeddings.shape[0] # type: ignore - n_embd_count = 1 - all_embeddings = all_embeddings.reshape(1, -1) - else: - n_embd = all_embeddings.shape[1] # type: ignore - n_embd_count = all_embeddings.shape[0] # type: ignore + if len(all_embeddings.shape) == 1: + n_embd = all_embeddings.shape[0] # type: ignore + n_embd_count = 1 + all_embeddings = all_embeddings.reshape(1, -1) + else: + n_embd = all_embeddings.shape[1] # type: ignore + n_embd_count = all_embeddings.shape[0] # type: ignore - print() + print() + for j in range(n_embd_count): + embedding = all_embeddings[j] + print(f"embedding {j}: ", end="") + + # Print first 3 values + for i in range(min(3, n_embd)): + print(f"{embedding[i]:9.6f} ", end="") + + print(" ... ", end="") + + # Print last 3 values + for i in range(n_embd - 3, n_embd): + print(f"{embedding[i]:9.6f} ", end="") + + print() # New line + + print() + + data_dir = Path("data") + data_dir.mkdir(exist_ok=True) + bin_filename = data_dir / f"pytorch-{model_name}-embeddings.bin" + txt_filename = data_dir / f"pytorch-{model_name}-embeddings.txt" + + flattened_embeddings = all_embeddings.flatten() + flattened_embeddings.astype(np.float32).tofile(bin_filename) + + with open(txt_filename, "w") as f: + idx = 0 for j in range(n_embd_count): - embedding = all_embeddings[j] - print(f"embedding {j}: ", end="") - - # Print first 3 values - for i in range(min(3, n_embd)): - print(f"{embedding[i]:9.6f} ", end="") - - print(" ... ", end="") - - # Print last 3 values - for i in range(n_embd - 3, n_embd): - print(f"{embedding[i]:9.6f} ", end="") - - print() # New line - - print() - - flattened_embeddings = all_embeddings.flatten() - print(f"Total values: {len(flattened_embeddings)} ({n_embd_count} embeddings × {n_embd} dimensions)") - print("") - - save_output_data(flattened_embeddings, token_ids, prompt_text, model_name, type_suffix="-embeddings") - - -if __name__ == "__main__": - main() + for value in all_embeddings[j]: + f.write(f"{idx}: {value:.6f}\n") + idx += 1 + print(f"Total values: {len(flattened_embeddings)} ({n_embd_count} embeddings × {n_embd} dimensions)") + print("") + print(f"Saved bin embeddings to: {bin_filename}") + print(f"Saved txt embeddings to: {txt_filename}") diff --git a/examples/model-conversion/scripts/utils/common.py b/examples/model-conversion/scripts/utils/common.py index aa4bab2..7595d04 100644 --- a/examples/model-conversion/scripts/utils/common.py +++ b/examples/model-conversion/scripts/utils/common.py @@ -3,11 +3,6 @@ import os import sys import torch -import transformers -import json -import textwrap -import numpy as np -from pathlib import Path def get_model_name_from_env_path(env_path_name): @@ -153,147 +148,3 @@ def setup_rope_debug(model_module_path: str, function_name: str = "apply_rotary_ # Patch it setattr(module, function_name, debug_rope) print(f"RoPE debug patching applied to {model_module_path}.{function_name}") - - -def save_output_data(data, tokens, prompt, model_name, type_suffix="", output_dir="data"): - """ - Save output data (logits/embeddings), tokens, and prompt to files. - - Args: - data: numpy array of floats (logits or embeddings) - tokens: list or array of token IDs - prompt: string containing the input prompt - model_name: name of the model - type_suffix: optional suffix like "-embeddings" (default: "") - output_dir: directory to save files (default: "data") - - Creates the following files in output_dir: - - pytorch-{model_name}{type_suffix}.bin - - pytorch-{model_name}{type_suffix}.txt - - pytorch-{model_name}{type_suffix}-prompt.txt - - pytorch-{model_name}{type_suffix}-tokens.bin - """ - data_dir = Path(output_dir) - data_dir.mkdir(exist_ok=True) - base_path = data_dir / f"pytorch-{model_name}{type_suffix}" - - # Convert and flatten logits/embeddings - data = data.cpu().numpy() if isinstance(data, torch.Tensor) else np.asarray(data) - data = data.flatten() if data.ndim > 1 else data - - # Save logits/embedding files - data.astype(np.float32).tofile(f"{base_path}.bin") - print(f"Data saved to {base_path}.bin") - - with open(f"{base_path}.txt", "w") as f: - f.writelines(f"{i}: {value:.6f}\n" for i, value in enumerate(data)) - print(f"Data saved to {base_path}.txt") - - # Convert and flatten tokens - tokens = tokens.cpu().numpy() if isinstance(tokens, torch.Tensor) else np.asarray(tokens) - tokens = tokens.flatten() if tokens.ndim > 1 else tokens - - # Save token binary file - tokens.astype(np.int32).tofile(f"{base_path}-tokens.bin") - print(f"Tokens saved to {base_path}-tokens.bin") - - # Save prompt file - with open(f"{base_path}-prompt.txt", "w") as f: - f.write(f"prompt: {prompt}\n") - f.write(f"n_tokens: {len(tokens)}\n") - f.write(f"token ids: {', '.join(str(int(tid)) for tid in tokens)}\n") - print(f"Prompt saved to {base_path}-prompt.txt") - - -def compare_tokens(original, converted, type_suffix="", output_dir="data"): - data_dir = Path(output_dir) - - # Read tokens from both models - tokens1_file = data_dir / f"{original}{type_suffix}-tokens.bin" - tokens2_file = data_dir / f"{converted}{type_suffix}-tokens.bin" - - if not tokens1_file.exists(): - print(f"Error: Token file not found: {tokens1_file}") - return False - - if not tokens2_file.exists(): - print(f"Error: Token file not found: {tokens2_file}") - return False - - tokens1 = np.fromfile(tokens1_file, dtype=np.int32) - tokens2 = np.fromfile(tokens2_file, dtype=np.int32) - - print(f"\nComparing tokens between:") - print(f" Original : {original} ({len(tokens1)} tokens)") - print(f" Converted: {converted} ({len(tokens2)} tokens)") - - if len(tokens1) != len(tokens2): - print(f"\n❌ Token count mismatch: {len(tokens1)} vs {len(tokens2)}") - return False - - if np.array_equal(tokens1, tokens2): - print(f"\n✅ All {len(tokens1)} tokens match!") - return True - - mismatches = np.where(tokens1 != tokens2)[0] - print(f"\n❌ Found {len(mismatches)} mismatched tokens:") - - num_to_show = min(len(mismatches), 10) - for idx in mismatches[:num_to_show]: - print(f" Position {idx}: {tokens1[idx]} vs {tokens2[idx]}") - - if len(mismatches) > num_to_show: - print(f" ... and {len(mismatches) - num_to_show} more mismatches") - - return False - - -def show_version_warning(current_version, model_version): - if not model_version: - return False - - try: - from packaging.version import parse, InvalidVersion - try: - return parse(current_version) < parse(model_version) - except InvalidVersion: - return current_version != model_version - except ImportError: - return current_version != model_version - -def get_model_transformers_version(model_path): - if not model_path: - return None - - config_path = Path(model_path) / "config.json" - if not config_path.is_file(): - return None - - try: - with open(config_path, "r", encoding="utf-8") as f: - config = json.load(f) - return config.get("transformers_version") - except (IOError, json.JSONDecodeError) as e: - print(f"Warning: Could not read or parse {config_path}: {e}", file=sys.stderr) - return None - -def exit_with_warning(message, model_path): - print(message) - - if model_path and transformers is not None: - model_transformers_version = get_model_transformers_version(model_path) - transformers_version = transformers.__version__ - if show_version_warning(transformers_version, model_transformers_version): - warning_message = f""" - ===================================================================== - Verification failure might be due to a transformers version mismatch: - - Current transformers version: {transformers_version} - Model's required version : {model_transformers_version} - - Consider installing the version specified by the model's config: - pip install transformers=={model_transformers_version} - ===================================================================== - """ - print(textwrap.dedent(warning_message)) - sys.exit(1) diff --git a/examples/model-conversion/scripts/utils/compare_tokens.py b/examples/model-conversion/scripts/utils/compare_tokens.py deleted file mode 100755 index a286cb5..0000000 --- a/examples/model-conversion/scripts/utils/compare_tokens.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import sys -from common import compare_tokens # type: ignore - - -def parse_arguments(): - parser = argparse.ArgumentParser( - description='Compare tokens between two models', - formatter_class=argparse.RawDescriptionHelpFormatter, - epilog=""" -Examples: - %(prog)s pytorch-gemma-3-270m-it llamacpp-gemma-3-270m-it-bf16 - """ - ) - parser.add_argument( - 'original', - help='Original model name' - ) - parser.add_argument( - 'converted', - help='Converted model name' - ) - parser.add_argument( - '-s', '--suffix', - default='', - help='Type suffix (e.g., "-embeddings")' - ) - parser.add_argument( - '-d', '--data-dir', - default='data', - help='Directory containing token files (default: data)' - ) - parser.add_argument( - '-v', '--verbose', - action='store_true', - help='Print prompts from both models' - ) - return parser.parse_args() - - -def main(): - args = parse_arguments() - - if args.verbose: - from pathlib import Path - data_dir = Path(args.data_dir) - - prompt1_file = data_dir / f"{args.original}{args.suffix}-prompt.txt" - prompt2_file = data_dir / f"{args.converted}{args.suffix}-prompt.txt" - - if prompt1_file.exists(): - print(f"\nOriginal model prompt ({args.original}):") - print(f" {prompt1_file.read_text().strip()}") - - if prompt2_file.exists(): - print(f"\nConverted model prompt ({args.converted}):") - print(f" {prompt2_file.read_text().strip()}") - - print() - - result = compare_tokens( - args.original, - args.converted, - type_suffix=args.suffix, - output_dir=args.data_dir - ) - - # Enable the script to be used in shell scripts so that they can check - # the exit code for success/failure. - sys.exit(0 if result else 1) - - -if __name__ == "__main__": - main() diff --git a/examples/model-conversion/scripts/utils/semantic_check.py b/examples/model-conversion/scripts/utils/semantic_check.py index 73e20ea..2ac8b6b 100644 --- a/examples/model-conversion/scripts/utils/semantic_check.py +++ b/examples/model-conversion/scripts/utils/semantic_check.py @@ -4,10 +4,8 @@ import numpy as np import argparse import os import importlib -from pathlib import Path from transformers import AutoTokenizer, AutoConfig, AutoModelForCausalLM, AutoModel -from common import compare_tokens, exit_with_warning # type: ignore[import-not-found] unreleased_model_name = os.getenv('UNRELEASED_MODEL_NAME') @@ -159,31 +157,16 @@ def main(): else: prompt = args.prompt - python_emb_path = Path(args.python_embeddings) - cpp_emb_path = Path(args.cpp_embeddings) - - # Extract base names (e.g., "pytorch-model-name-embeddings.bin" -> "pytorch-model-name") - python_model_name = python_emb_path.stem.replace("-embeddings", "") - cpp_model_name = cpp_emb_path.stem.replace("-embeddings", "") - print("Semantic Similarity Test Between Python and llama.cpp Embedding Models") print("=" * 70) - # First verify tokens match before comparing embeddings - print("\n🔍 Token Comparison Check") - print("=" * 70) - data_dir = python_emb_path.parent - if not compare_tokens(python_model_name, cpp_model_name, type_suffix="-embeddings", output_dir=str(data_dir)): - exit_with_warning("\n❌ Token mismatch detected", args.model_path) - print() - # Single prompt detailed comparison print(f"\nTesting with prompt: '{prompt}'") # Load the python model to get configuration information and also to load the tokenizer. print("Loading model and tokenizer using AutoTokenizer:", args.model_path) tokenizer = AutoTokenizer.from_pretrained(args.model_path) - config = AutoConfig.from_pretrained(args.model_path, trust_remote_code=True) + config = AutoConfig.from_pretrained(args.model_path) if unreleased_model_name: model_name_lower = unreleased_model_name.lower() @@ -203,9 +186,9 @@ def main(): exit(1) else: if args.causal: - model = AutoModelForCausalLM.from_pretrained(args.model_path, trust_remote_code=True) + model = AutoModelForCausalLM.from_pretrained(args.model_path) else: - model = AutoModel.from_pretrained(args.model_path, trust_remote_code=True) + model = AutoModel.from_pretrained(args.model_path) encoded = tokenizer(prompt, return_tensors="pt") tokens = tokenizer.convert_ids_to_tokens(encoded['input_ids'][0]) @@ -236,7 +219,7 @@ def main(): elif avg_cross_sim > 0.70: print("⚠️ FAIR: Models have some differences") else: - exit_with_warning("❌ POOR: Models are significantly different", args.model_path) + print("❌ POOR: Models are significantly different") if __name__ == "__main__": main() diff --git a/examples/retrieval/retrieval.cpp b/examples/retrieval/retrieval.cpp index 3f2afd4..2c2143a 100644 --- a/examples/retrieval/retrieval.cpp +++ b/examples/retrieval/retrieval.cpp @@ -217,13 +217,13 @@ int main(int argc, char ** argv) { struct llama_batch batch = llama_batch_init(n_batch, 0, 1); // allocate output - const int n_embd_out = llama_model_n_embd_out(model); - std::vector embeddings(n_chunks * n_embd_out, 0); + const int n_embd = llama_model_n_embd(model); + std::vector embeddings(n_chunks * n_embd, 0); float * emb = embeddings.data(); // break into batches - unsigned int p = 0; // number of prompts processed already - unsigned int s = 0; // number of prompts in current batch + int p = 0; // number of prompts processed already + int s = 0; // number of prompts in current batch for (int k = 0; k < n_chunks; k++) { // clamp to n_batch tokens auto & inp = chunks[k].tokens; @@ -231,9 +231,9 @@ int main(int argc, char ** argv) { const uint64_t n_toks = inp.size(); // encode if at capacity - if (batch.n_tokens + n_toks > n_batch || s >= llama_n_seq_max(ctx)) { - float * out = emb + p * n_embd_out; - batch_process(ctx, batch, out, s, n_embd_out); + if (batch.n_tokens + n_toks > n_batch) { + float * out = emb + p * n_embd; + batch_process(ctx, batch, out, s, n_embd); common_batch_clear(batch); p += s; s = 0; @@ -245,12 +245,12 @@ int main(int argc, char ** argv) { } // final batch - float * out = emb + p * n_embd_out; - batch_process(ctx, batch, out, s, n_embd_out); + float * out = emb + p * n_embd; + batch_process(ctx, batch, out, s, n_embd); // save embeddings to chunks for (int i = 0; i < n_chunks; i++) { - chunks[i].embedding = std::vector(emb + i * n_embd_out, emb + (i + 1) * n_embd_out); + chunks[i].embedding = std::vector(emb + i * n_embd, emb + (i + 1) * n_embd); // clear tokens as they are no longer needed chunks[i].tokens.clear(); } @@ -266,8 +266,8 @@ int main(int argc, char ** argv) { batch_add_seq(query_batch, query_tokens, 0); - std::vector query_emb(n_embd_out, 0); - batch_process(ctx, query_batch, query_emb.data(), 1, n_embd_out); + std::vector query_emb(n_embd, 0); + batch_process(ctx, query_batch, query_emb.data(), 1, n_embd); common_batch_clear(query_batch); @@ -275,7 +275,7 @@ int main(int argc, char ** argv) { { std::vector> similarities; for (int i = 0; i < n_chunks; i++) { - float sim = common_embd_similarity_cos(chunks[i].embedding.data(), query_emb.data(), n_embd_out); + float sim = common_embd_similarity_cos(chunks[i].embedding.data(), query_emb.data(), n_embd); similarities.push_back(std::make_pair(i, sim)); } diff --git a/examples/sycl/build.sh b/examples/sycl/build.sh index 635e74f..1993520 100755 --- a/examples/sycl/build.sh +++ b/examples/sycl/build.sh @@ -8,10 +8,10 @@ cd build source /opt/intel/oneapi/setvars.sh #for FP16 -#cmake .. -DGGML_SYCL=ON -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx -DGGML_SYCL_F16=ON -DLLAMA_OPENSSL=OFF # faster for long-prompt inference +#cmake .. -DGGML_SYCL=ON -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx -DGGML_SYCL_F16=ON -DLLAMA_CURL=OFF # faster for long-prompt inference #for FP32 -cmake .. -DGGML_SYCL=ON -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx -DLLAMA_OPENSSL=OFF +cmake .. -DGGML_SYCL=ON -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx -DLLAMA_CURL=OFF #build example/main #cmake --build . --config Release --target main diff --git a/examples/sycl/run-llama2.sh b/examples/sycl/run-llama2.sh index cf23619..a018e45 100755 --- a/examples/sycl/run-llama2.sh +++ b/examples/sycl/run-llama2.sh @@ -22,9 +22,9 @@ if [ $# -gt 0 ]; then GGML_SYCL_DEVICE=$1 echo "use $GGML_SYCL_DEVICE as main GPU" #use signle GPU only - ZES_ENABLE_SYSMAN=1 ./build/bin/llama-completion -m ${MODEL_FILE} -no-cnv -p "${INPUT_PROMPT}" -n 400 -e -ngl ${NGL} -s 0 -c ${CONTEXT} -mg $GGML_SYCL_DEVICE -sm none + ZES_ENABLE_SYSMAN=1 ./build/bin/llama-cli -m ${MODEL_FILE} -p "${INPUT_PROMPT}" -n 400 -e -ngl ${NGL} -s 0 -c ${CONTEXT} -mg $GGML_SYCL_DEVICE -sm none else #use multiple GPUs with same max compute units - ZES_ENABLE_SYSMAN=1 ./build/bin/llama-completion -m ${MODEL_FILE} -no-cnv -p "${INPUT_PROMPT}" -n 400 -e -ngl ${NGL} -s 0 -c ${CONTEXT} + ZES_ENABLE_SYSMAN=1 ./build/bin/llama-cli -m ${MODEL_FILE} -p "${INPUT_PROMPT}" -n 400 -e -ngl ${NGL} -s 0 -c ${CONTEXT} fi diff --git a/examples/sycl/run-llama3.sh b/examples/sycl/run-llama3.sh index feee516..4770255 100755 --- a/examples/sycl/run-llama3.sh +++ b/examples/sycl/run-llama3.sh @@ -24,8 +24,8 @@ export UR_L0_ENABLE_RELAXED_ALLOCATION_LIMITS=1 if [ $# -gt 0 ]; then GGML_SYCL_DEVICE=$1 echo "Using $GGML_SYCL_DEVICE as the main GPU" - ZES_ENABLE_SYSMAN=1 ./build/bin/llama-completion -m ${MODEL_FILE} -no-cnv -p "${INPUT_PROMPT}" -n 400 -e -ngl ${NGL} -s 0 -c ${CONTEXT} -mg $GGML_SYCL_DEVICE -sm none + ZES_ENABLE_SYSMAN=1 ./build/bin/llama-cli -m ${MODEL_FILE} -p "${INPUT_PROMPT}" -n 400 -e -ngl ${NGL} -s 0 -c ${CONTEXT} -mg $GGML_SYCL_DEVICE -sm none else #use multiple GPUs with same max compute units - ZES_ENABLE_SYSMAN=1 ./build/bin/llama-completion -m ${MODEL_FILE} -no-cnv -p "${INPUT_PROMPT}" -n 400 -e -ngl ${NGL} -s 0 -c ${CONTEXT} + ZES_ENABLE_SYSMAN=1 ./build/bin/llama-cli -m ${MODEL_FILE} -p "${INPUT_PROMPT}" -n 400 -e -ngl ${NGL} -s 0 -c ${CONTEXT} fi diff --git a/examples/sycl/win-build-sycl.bat b/examples/sycl/win-build-sycl.bat index fc8b33b..862998e 100644 --- a/examples/sycl/win-build-sycl.bat +++ b/examples/sycl/win-build-sycl.bat @@ -13,10 +13,10 @@ if %errorlevel% neq 0 goto ERROR :: for FP16 :: faster for long-prompt inference -:: cmake -G "MinGW Makefiles" .. -DLLAMA_OPENSSL=OFF -DGGML_SYCL=ON -DCMAKE_CXX_COMPILER=icx -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DGGML_SYCL_F16=ON +:: cmake -G "MinGW Makefiles" .. -DLLAMA_CURL=OFF -DGGML_SYCL=ON -DCMAKE_CXX_COMPILER=icx -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DGGML_SYCL_F16=ON :: for FP32 -cmake -G "Ninja" .. -DLLAMA_OPENSSL=OFF -DGGML_SYCL=ON -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=icx -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release +cmake -G "Ninja" .. -DLLAMA_CURL=OFF -DGGML_SYCL=ON -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=icx -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release if %errorlevel% neq 0 goto ERROR :: build all binary diff --git a/examples/sycl/win-run-llama2.bat b/examples/sycl/win-run-llama2.bat index 32ff673..b654f88 100644 --- a/examples/sycl/win-run-llama2.bat +++ b/examples/sycl/win-run-llama2.bat @@ -8,4 +8,4 @@ set INPUT2="Building a website can be done in 10 simple steps:\nStep 1:" :: support malloc device memory more than 4GB. set UR_L0_ENABLE_RELAXED_ALLOCATION_LIMITS=1 -.\build\bin\llama-completion.exe -m models\llama-2-7b.Q4_0.gguf -no-cnv -p %INPUT2% -n 400 -e -ngl 99 -s 0 +.\build\bin\llama-cli.exe -m models\llama-2-7b.Q4_0.gguf -p %INPUT2% -n 400 -e -ngl 99 -s 0 diff --git a/examples/sycl/win-run-llama3.bat b/examples/sycl/win-run-llama3.bat index ea4ae69..608b834 100644 --- a/examples/sycl/win-run-llama3.bat +++ b/examples/sycl/win-run-llama3.bat @@ -8,4 +8,4 @@ set INPUT2="Building a website can be done in 10 simple steps:\nStep 1:" :: support malloc device memory more than 4GB. set UR_L0_ENABLE_RELAXED_ALLOCATION_LIMITS=1 -.\build\bin\llama-completion.exe -m models\Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf -no-cnv -p %INPUT2% -n 400 -s 0 -e -ngl 99 +.\build\bin\llama-cli.exe -m models\Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf -p %INPUT2% -n 400 -s 0 -e -ngl 99 diff --git a/ggml/CMakeLists.txt b/ggml/CMakeLists.txt index 0176ca1..18d117f 100644 --- a/ggml/CMakeLists.txt +++ b/ggml/CMakeLists.txt @@ -4,7 +4,7 @@ project("ggml" C CXX ASM) ### GGML Version set(GGML_VERSION_MAJOR 0) set(GGML_VERSION_MINOR 9) -set(GGML_VERSION_PATCH 5) +set(GGML_VERSION_PATCH 4) set(GGML_VERSION_BASE "${GGML_VERSION_MAJOR}.${GGML_VERSION_MINOR}.${GGML_VERSION_PATCH}") find_program(GIT_EXE NAMES git git.exe NO_CMAKE_FIND_ROOT_PATH) @@ -430,22 +430,10 @@ if (MSVC) configure_msvc_target(ggml-cpu-x64) configure_msvc_target(ggml-cpu-sse42) configure_msvc_target(ggml-cpu-sandybridge) - # __FMA__ and __F16C__ are not defined in MSVC, however they are implied with AVX2/AVX512 - # skipping ggml-cpu-ivybridge - # skipping ggml-cpu-piledriver configure_msvc_target(ggml-cpu-haswell) configure_msvc_target(ggml-cpu-skylakex) - configure_msvc_target(ggml-cpu-cannonlake) - configure_msvc_target(ggml-cpu-cascadelake) configure_msvc_target(ggml-cpu-icelake) - # MSVC 2022 doesn't support BF16 intrinsics without `/arch:AVX10.1` ?! - # https://learn.microsoft.com/en-us/cpp/intrinsics/x64-amd64-intrinsics-list?view=msvc-170 - # https://learn.microsoft.com/en-us/cpp/build/reference/arch-x64?view=msvc-170 - # skipping ggml-cpu-cooperlake - # skipping ggml-cpu-zen4 configure_msvc_target(ggml-cpu-alderlake) - # MSVC doesn't support AMX - # skipping ggml-cpu-sapphirerapids if (GGML_BUILD_EXAMPLES) configure_msvc_target(common-ggml) diff --git a/ggml/include/ggml-backend.h b/ggml/include/ggml-backend.h index a9d1778..4ed5f35 100644 --- a/ggml/include/ggml-backend.h +++ b/ggml/include/ggml-backend.h @@ -358,7 +358,7 @@ extern "C" { typedef bool (*ggml_backend_eval_callback)(int node_index, struct ggml_tensor * t1, struct ggml_tensor * t2, void * user_data); // Compare the output of two backends - GGML_API bool ggml_backend_compare_graph_backend(ggml_backend_t backend1, ggml_backend_t backend2, struct ggml_cgraph * graph, ggml_backend_eval_callback callback, void * user_data, struct ggml_tensor const * const * test_nodes, size_t num_test_nodes); + GGML_API bool ggml_backend_compare_graph_backend(ggml_backend_t backend1, ggml_backend_t backend2, struct ggml_cgraph * graph, ggml_backend_eval_callback callback, void * user_data, struct ggml_tensor * test_node); // Tensor initialization GGML_API enum ggml_status ggml_backend_tensor_alloc(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor, void * addr); diff --git a/ggml/include/ggml.h b/ggml/include/ggml.h index b69583d..20c912d 100644 --- a/ggml/include/ggml.h +++ b/ggml/include/ggml.h @@ -234,11 +234,6 @@ #if UINTPTR_MAX == 0xFFFFFFFF #define GGML_MEM_ALIGN 4 -#elif defined(__EMSCRIPTEN__) -// emscripten uses max_align_t == 8, so we need GGML_MEM_ALIGN == 8 for 64-bit wasm. -// (for 32-bit wasm, the first conditional is true and GGML_MEM_ALIGN stays 4.) -// ref: https://github.com/ggml-org/llama.cpp/pull/18628 - #define GGML_MEM_ALIGN 8 #else #define GGML_MEM_ALIGN 16 #endif diff --git a/ggml/src/CMakeLists.txt b/ggml/src/CMakeLists.txt index 6192a87..262d78a 100644 --- a/ggml/src/CMakeLists.txt +++ b/ggml/src/CMakeLists.txt @@ -357,29 +357,15 @@ if (GGML_CPU_ALL_VARIANTS) endif() if (GGML_SYSTEM_ARCH STREQUAL "x86") ggml_add_cpu_backend_variant(x64) - ggml_add_cpu_backend_variant(sse42 SSE42) - ggml_add_cpu_backend_variant(sandybridge SSE42 AVX) - if (NOT MSVC) - # __FMA__ and __F16C__ are not defined in MSVC, however they are implied with AVX2/AVX512 - ggml_add_cpu_backend_variant(ivybridge SSE42 AVX F16C) - ggml_add_cpu_backend_variant(piledriver SSE42 AVX F16C FMA) - endif() - ggml_add_cpu_backend_variant(haswell SSE42 AVX F16C FMA AVX2 BMI2) - ggml_add_cpu_backend_variant(skylakex SSE42 AVX F16C FMA AVX2 BMI2 AVX512) - ggml_add_cpu_backend_variant(cannonlake SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VBMI) - ggml_add_cpu_backend_variant(cascadelake SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VNNI) - ggml_add_cpu_backend_variant(icelake SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VBMI AVX512_VNNI) - if (NOT MSVC) - # MSVC 2022 doesn't support BF16 intrinsics without `/arch:AVX10.1` ?! - # https://learn.microsoft.com/en-us/cpp/intrinsics/x64-amd64-intrinsics-list?view=msvc-170 - # https://learn.microsoft.com/en-us/cpp/build/reference/arch-x64?view=msvc-170 - ggml_add_cpu_backend_variant(cooperlake SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VNNI AVX512_BF16) - ggml_add_cpu_backend_variant(zen4 SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16) - endif() - ggml_add_cpu_backend_variant(alderlake SSE42 AVX F16C FMA AVX2 BMI2 AVX_VNNI) + ggml_add_cpu_backend_variant(sse42 SSE42) + ggml_add_cpu_backend_variant(sandybridge SSE42 AVX) + ggml_add_cpu_backend_variant(haswell SSE42 AVX F16C AVX2 BMI2 FMA) + ggml_add_cpu_backend_variant(skylakex SSE42 AVX F16C AVX2 BMI2 FMA AVX512) + ggml_add_cpu_backend_variant(icelake SSE42 AVX F16C AVX2 BMI2 FMA AVX512 AVX512_VBMI AVX512_VNNI) + ggml_add_cpu_backend_variant(alderlake SSE42 AVX F16C AVX2 BMI2 FMA AVX_VNNI) if (NOT MSVC) # MSVC doesn't support AMX - ggml_add_cpu_backend_variant(sapphirerapids SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16 AMX_TILE AMX_INT8) + ggml_add_cpu_backend_variant(sapphirerapids SSE42 AVX F16C AVX2 BMI2 FMA AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16 AMX_TILE AMX_INT8) endif() elseif(GGML_SYSTEM_ARCH STREQUAL "ARM") if (CMAKE_SYSTEM_NAME MATCHES "Linux") @@ -401,8 +387,8 @@ if (GGML_CPU_ALL_VARIANTS) ggml_add_cpu_backend_variant(android_armv8.2_2 DOTPROD FP16_VECTOR_ARITHMETIC) ggml_add_cpu_backend_variant(android_armv8.6_1 DOTPROD FP16_VECTOR_ARITHMETIC MATMUL_INT8) ggml_add_cpu_backend_variant(android_armv9.0_1 DOTPROD MATMUL_INT8 FP16_VECTOR_ARITHMETIC SVE2) - ggml_add_cpu_backend_variant(android_armv9.2_1 DOTPROD MATMUL_INT8 FP16_VECTOR_ARITHMETIC SVE SME) - ggml_add_cpu_backend_variant(android_armv9.2_2 DOTPROD MATMUL_INT8 FP16_VECTOR_ARITHMETIC SVE SVE2 SME) + ggml_add_cpu_backend_variant(android_armv9.2_1 DOTPROD MATMUL_INT8 FP16_VECTOR_ARITHMETIC SME) + ggml_add_cpu_backend_variant(android_armv9.2_2 DOTPROD MATMUL_INT8 FP16_VECTOR_ARITHMETIC SVE SME) elseif (APPLE) ggml_add_cpu_backend_variant(apple_m1 DOTPROD) ggml_add_cpu_backend_variant(apple_m2_m3 DOTPROD MATMUL_INT8) diff --git a/ggml/src/ggml-backend-impl.h b/ggml/src/ggml-backend-impl.h index 59190b7..6792ba9 100644 --- a/ggml/src/ggml-backend-impl.h +++ b/ggml/src/ggml-backend-impl.h @@ -144,7 +144,7 @@ extern "C" { // device description: short informative description of the device, could be the model name const char * (*get_description)(ggml_backend_dev_t dev); - // device memory in bytes: 0 bytes to indicate no memory to report + // device memory in bytes void (*get_memory)(ggml_backend_dev_t dev, size_t * free, size_t * total); // device type diff --git a/ggml/src/ggml-backend.cpp b/ggml/src/ggml-backend.cpp index 1b59924..8547ecc 100644 --- a/ggml/src/ggml-backend.cpp +++ b/ggml/src/ggml-backend.cpp @@ -2053,7 +2053,7 @@ void ggml_backend_graph_copy_free(struct ggml_backend_graph_copy copy) { ggml_free(copy.ctx_unallocated); } -bool ggml_backend_compare_graph_backend(ggml_backend_t backend1, ggml_backend_t backend2, struct ggml_cgraph * graph, ggml_backend_eval_callback callback, void * user_data, struct ggml_tensor const * const * test_nodes, size_t num_test_nodes) { +bool ggml_backend_compare_graph_backend(ggml_backend_t backend1, ggml_backend_t backend2, struct ggml_cgraph * graph, ggml_backend_eval_callback callback, void * user_data, struct ggml_tensor * test_node) { struct ggml_backend_graph_copy copy = ggml_backend_graph_copy(backend2, graph); if (copy.buffer == NULL) { return false; @@ -2064,22 +2064,22 @@ bool ggml_backend_compare_graph_backend(ggml_backend_t backend1, ggml_backend_t assert(g1->n_nodes == g2->n_nodes); - if (num_test_nodes != 0) { - GGML_ASSERT(test_nodes); - // Compute the whole graph and only test the output for specific tensors + if (test_node != nullptr) { + // Compute the whole graph and only test the output for a specific tensor ggml_backend_graph_compute(backend1, g1); ggml_backend_graph_compute(backend2, g2); - bool verified = false; + int test_node_idx = -1; for (int i = 0; i < g1->n_nodes; i++) { - for (size_t j = 0; j < num_test_nodes; ++j) { - if (g1->nodes[i] == test_nodes[j]) { - callback(i, g1->nodes[i], g2->nodes[i], user_data); - verified = true; - } + struct ggml_tensor * t1 = g1->nodes[i]; + if (t1 == test_node) { + test_node_idx = i; + break; } } - GGML_ASSERT(verified); + GGML_ASSERT(test_node_idx != -1); + + callback(test_node_idx, g1->nodes[test_node_idx], g2->nodes[test_node_idx], user_data); } else { for (int i = 0; i < g1->n_nodes; i++) { struct ggml_tensor * t1 = g1->nodes[i]; diff --git a/ggml/src/ggml-blas/CMakeLists.txt b/ggml/src/ggml-blas/CMakeLists.txt index fb0936f..60ce4b1 100644 --- a/ggml/src/ggml-blas/CMakeLists.txt +++ b/ggml/src/ggml-blas/CMakeLists.txt @@ -32,12 +32,14 @@ if (BLAS_FOUND) pkg_check_modules(DepBLAS openblas) endif() elseif (${GGML_BLAS_VENDOR} MATCHES "FLAME") + add_compile_definitions(GGML_BLAS_USE_BLIS) pkg_check_modules(DepBLAS blis) elseif (${GGML_BLAS_VENDOR} MATCHES "ATLAS") pkg_check_modules(DepBLAS blas-atlas) elseif (${GGML_BLAS_VENDOR} MATCHES "FlexiBLAS") pkg_check_modules(DepBLAS flexiblas_api) elseif (${GGML_BLAS_VENDOR} MATCHES "Intel") + add_compile_definitions(GGML_BLAS_USE_MKL) # all Intel* libraries share the same include path pkg_check_modules(DepBLAS mkl-sdl) elseif (${GGML_BLAS_VENDOR} MATCHES "NVHPC") @@ -72,26 +74,10 @@ if (BLAS_FOUND) target_compile_options(ggml-blas PRIVATE ${BLAS_LINKER_FLAGS}) - if ("${GGML_BLAS_VENDOR}" STREQUAL "") - message(WARNING "GGML_BLAS_VENDOR is not set; some methods may not link properly.") - endif() - - if ("${GGML_BLAS_VENDOR}" MATCHES "Intel" OR ("${BLAS_INCLUDE_DIRS}" MATCHES "mkl" AND "${GGML_BLAS_VENDOR}" MATCHES "Generic")) + if ("${BLAS_INCLUDE_DIRS}" MATCHES "mkl" AND (${GGML_BLAS_VENDOR} MATCHES "Generic" OR ${GGML_BLAS_VENDOR} MATCHES "Intel")) add_compile_definitions(GGML_BLAS_USE_MKL) endif() - if ("${GGML_BLAS_VENDOR}" MATCHES "OpenBLAS") - add_compile_definitions(GGML_BLAS_USE_OPENBLAS) - endif() - - if ("${GGML_BLAS_VENDOR}" MATCHES "FLAME" OR "${GGML_BLAS_VENDOR}" MATCHES "AOCL" OR "${GGML_BLAS_VENDOR}" MATCHES "AOCL_mt") - add_compile_definitions(GGML_BLAS_USE_BLIS) - endif() - - if ("${GGML_BLAS_VENDOR}" MATCHES "NVPL") - add_compile_definitions(GGML_BLAS_USE_NVPL) - endif() - target_link_libraries (ggml-blas PRIVATE ${BLAS_LIBRARIES}) target_include_directories(ggml-blas PRIVATE ${BLAS_INCLUDE_DIRS}) else() diff --git a/ggml/src/ggml-blas/ggml-blas.cpp b/ggml/src/ggml-blas/ggml-blas.cpp index 84956cb..5b888cd 100644 --- a/ggml/src/ggml-blas/ggml-blas.cpp +++ b/ggml/src/ggml-blas/ggml-blas.cpp @@ -115,11 +115,15 @@ static void ggml_backend_blas_mul_mat(ggml_backend_blas_context * ctx, struct gg #endif } -#if defined(GGML_BLAS_USE_OPENBLAS) +#if defined(OPENBLAS_VERSION) openblas_set_num_threads(ctx->n_threads); -#elif defined(GGML_BLAS_USE_BLIS) +#endif + +#if defined(GGML_BLAS_USE_BLIS) bli_thread_set_num_threads(ctx->n_threads); -#elif defined(GGML_BLAS_USE_NVPL) +#endif + +#if defined(GGML_BLAS_USE_NVPL) nvpl_blas_set_num_threads(ctx->n_threads); #endif @@ -284,7 +288,7 @@ ggml_backend_t ggml_backend_blas_init(void) { /* .context = */ ctx, }; -#if defined(GGML_BLAS_USE_OPENBLAS) && defined(GGML_USE_OPENMP) +#if defined(OPENBLAS_VERSION) && defined(GGML_USE_OPENMP) if (openblas_get_parallel() != OPENBLAS_OPENMP) { GGML_LOG_DEBUG("%s: warning: ggml is using OpenMP, but OpenBLAS was compiled without OpenMP support\n", __func__); } @@ -325,7 +329,7 @@ static const char * ggml_backend_blas_device_get_description(ggml_backend_dev_t return "BLIS"; #elif defined(GGML_BLAS_USE_NVPL) return "NVPL"; - #elif defined(GGML_BLAS_USE_OPENBLAS) + #elif defined(OPENBLAS_VERSION) return "OpenBLAS"; #else return "BLAS"; diff --git a/ggml/src/ggml-cann/aclnn_ops.cpp b/ggml/src/ggml-cann/aclnn_ops.cpp index 6b718e0..835b53f 100644 --- a/ggml/src/ggml-cann/aclnn_ops.cpp +++ b/ggml/src/ggml-cann/aclnn_ops.cpp @@ -26,7 +26,6 @@ #include "ggml.h" #include -#include #include #include #include @@ -1963,7 +1962,7 @@ static void ggml_cann_mat_mul_fp(ggml_backend_cann_context & ctx, ggml_tensor * acl_tensor_ptr acl_weight_tensor; // Only check env once. - static bool weight_to_nz = parse_bool(get_env_as_lowercase("GGML_CANN_WEIGHT_NZ").value_or("on")); + static bool weight_to_nz = parse_bool(get_env("GGML_CANN_WEIGHT_NZ").value_or("on")); if (weight_to_nz && is_matmul_weight(weight)) { acl_weight_tensor = ggml_cann_create_tensor(weight, transpose_ne, transpose_nb, n_dims, ACL_FORMAT_FRACTAL_NZ); } else { @@ -2339,19 +2338,19 @@ static void aclnn_rope_cache_init(ggml_backend_cann_context & ctx, // Step1.2: prepare rope_yarn_ramp, if this part updated, should update theta_scale_tensor. // TODO: acl_yarn_ramp_tensor use rope cache. bool yarn_ramp_tensor_updated = false; + ggml_cann_pool_alloc yarn_ramp_allocator(ctx.pool()); acl_tensor_ptr acl_yarn_ramp_tensor; if (ext_factor != 0 && (theta_scale_updated || ctx.rope_cache.theta_scale_length != theta_scale_length || ctx.rope_cache.freq_scale != freq_scale)) { yarn_ramp_tensor_updated = true; - if (ctx.rope_cache.yarn_ramp_cache != nullptr) { - ACL_CHECK(aclrtFree(ctx.rope_cache.yarn_ramp_cache)); - } - ACL_CHECK(aclrtMalloc(&ctx.rope_cache.yarn_ramp_cache, theta_scale_length * sizeof(float), ACL_MEM_MALLOC_HUGE_FIRST)); + // -rope_yarn_ramp // const float y = (i0 / 2 - low) / MAX(0.001f, high - low); // return MIN(1, MAX(0, y)) - 1; + yarn_ramp_allocator.alloc(theta_scale_length * sizeof(float)); + void * yarn_ramp_buffer = yarn_ramp_allocator.get(); acl_yarn_ramp_tensor = - ggml_cann_create_tensor(ctx.rope_cache.yarn_ramp_cache, ACL_FLOAT, sizeof(float), theta_scale_ne, theta_scale_nb, 1); + ggml_cann_create_tensor(yarn_ramp_buffer, ACL_FLOAT, sizeof(float), theta_scale_ne, theta_scale_nb, 1); float zero_value = 0, one_value = 1; float denom_safe_value = MAX(0.001f, corr_dims[1] - corr_dims[0]); acl_scalar_ptr low = ggml_cann_create_scalar(&corr_dims[0], aclDataType::ACL_FLOAT); @@ -2381,10 +2380,8 @@ static void aclnn_rope_cache_init(ggml_backend_cann_context & ctx, acl_scalar_ptr freq_scale_1_sc = ggml_cann_create_scalar(&freq_scale_1, aclDataType::ACL_FLOAT); GGML_CANN_CALL_ACLNN_OP(ctx, InplaceMuls, acl_yarn_ramp_tensor.get(), freq_scale_1_sc.get()); GGML_CANN_CALL_ACLNN_OP(ctx, InplaceAdds, acl_yarn_ramp_tensor.get(), freq_scale_sc.get(), one.get()); - } else { - acl_yarn_ramp_tensor = - ggml_cann_create_tensor(ctx.rope_cache.yarn_ramp_cache, ACL_FLOAT, sizeof(float), theta_scale_ne, theta_scale_nb, 1); } + // Step 1.3: update theta_scale_tensor according to ext_factor or freq_scale. if (ext_factor != 0) { if (theta_scale_updated || yarn_ramp_tensor_updated) { @@ -2991,156 +2988,32 @@ void ggml_cann_argmax(ggml_backend_cann_context & ctx, ggml_tensor * dst) { GGML_CANN_CALL_ACLNN_OP(ctx, ArgMax, acl_src.get(), 3, false, acl_dst.get()); } -void ggml_cann_conv_transpose_1d(ggml_backend_cann_context& ctx, ggml_tensor* dst){ +void ggml_cann_conv_transpose_1d(ggml_backend_cann_context & ctx, ggml_tensor * dst) { ggml_tensor * src0 = dst->src[0]; ggml_tensor * src1 = dst->src[1]; // stride - int64_t s0 = ((const int32_t*)(dst->op_params))[0]; + int64_t s0 = ((const int32_t *) (dst->op_params))[0]; - acl_tensor_ptr acl_input = ggml_cann_create_tensor(src1, src1->ne, src1->nb, 3, ACL_FORMAT_NCL); + acl_tensor_ptr acl_input = ggml_cann_create_tensor(src1, src1->ne, src1->nb, 3, ACL_FORMAT_NCL); acl_tensor_ptr acl_weight = ggml_cann_create_tensor(src0, src0->ne, src0->nb, 3, ACL_FORMAT_NCL); - acl_tensor_ptr acl_dst = ggml_cann_create_tensor(dst, dst->ne, dst->nb, 3, ACL_FORMAT_NCL); - - // get base information of input and kernel - int64_t input_len = *(src1->ne); - int64_t dst_len = *(dst->ne); - int64_t kernel_size = *(src0->ne); - - // set the max kernel size for each conv - int64_t max_kernel_size = 255; - - // compute the partition of kernel - int64_t part_num = 1; - part_num = (kernel_size + max_kernel_size - 1) / max_kernel_size; + acl_tensor_ptr acl_dst = ggml_cann_create_tensor(dst, dst->ne, dst->nb, 3, ACL_FORMAT_NCL); int64_t strideVal[1]; - strideVal[0] = s0; - acl_int_array_ptr stride = ggml_cann_create_int_array(strideVal, 1); - int64_t paddingVal[] = {0}; - acl_int_array_ptr padding = ggml_cann_create_int_array(paddingVal, 1); - int64_t dilationVal[] = {1}; - acl_int_array_ptr dilation = ggml_cann_create_int_array(dilationVal, 1); - bool transposed = true; - int64_t groups = 1; - int8_t cubeMathType = 0; + strideVal[0] = s0; + acl_int_array_ptr stride = ggml_cann_create_int_array(strideVal, 1); + int64_t paddingVal[] = { 0 }; + acl_int_array_ptr padding = ggml_cann_create_int_array(paddingVal, 1); + int64_t dilationVal[] = { 1 }; + acl_int_array_ptr dilation = ggml_cann_create_int_array(dilationVal, 1); + int8_t cubeMathType = 0; #ifdef ASCEND_310P cubeMathType = 1; #endif - auto weight_type = ggml_cann_type_mapping(src0->type); - auto dst_type = ggml_cann_type_mapping(dst->type); - - // slice the kernel to make each conv available - int64_t slice_dim = -1; - int64_t slice_start = 0; - int64_t slice_end = max_kernel_size; - int64_t slice_step = 1; - int64_t interval = max_kernel_size; - - int64_t left_pad_len = dilationVal[0] * (max_kernel_size - 1) + 1 - 2 * paddingVal[0]; - int64_t right_pad_len = 0; - - acl_scalar_ptr alpha = nullptr; - float alphaValue = 1.0; - alpha = ggml_cann_create_scalar(&alphaValue, aclDataType::ACL_FLOAT); - - // set zero to destination - GGML_CANN_CALL_ACLNN_OP(ctx, InplaceZero, acl_dst.get()); - - for(int k = 0; k < part_num; k++){ - - // create part kernel tensor and slice from big kernel - slice_start = max_kernel_size * k; - if(k == part_num - 1){ - slice_end = kernel_size; - interval = kernel_size - max_kernel_size * k; - }else{ - slice_end = max_kernel_size * (k+1); - } - - int64_t part_ne[4]; - for(int i = 0; i < 4; i++) { - part_ne[i] = *(src0->ne + i); - } - part_ne[0] = interval; - - size_t part_nb[4]; - part_nb[0] = sizeof(weight_type); - for (int i = 1; i < 4; i++) { - part_nb[i] = part_nb[i - 1] * part_ne[i - 1]; - } - - ggml_cann_pool_alloc part_kernel_allocator; - part_kernel_allocator.alloc(ctx.pool(), part_nb[3]); - void* part_kernel_buf = part_kernel_allocator.get(); - - acl_tensor_ptr part_kernel = ggml_cann_create_tensor(part_kernel_buf, weight_type, - ggml_element_size(src0), part_ne, part_nb, 3, ACL_FORMAT_NCL); - - GGML_CANN_CALL_ACLNN_OP(ctx, Slice, acl_weight.get(), slice_dim, slice_start, slice_end, slice_step, part_kernel.get()); - - // create the part conv result tensor - int64_t part_dst_ne[4]; - for(int i = 0; i < 4; i++){ - part_dst_ne[i] = *(dst->ne + i); - } - part_dst_ne[0] = (input_len - 1) * strideVal[0] - 2 * paddingVal[0] + dilationVal[0] * (part_ne[0] - 1) + 1; - - size_t part_dst_nb[4]; - part_dst_nb[0] = sizeof(weight_type); - for (int i = 1; i < 4; i++) { - part_dst_nb[i] = part_dst_nb[i - 1] * part_dst_ne[i - 1]; - } - ggml_cann_pool_alloc part_dst_allocator; - part_dst_allocator.alloc(ctx.pool(), part_dst_nb[3]); - void* part_dst_buf = part_dst_allocator.get(); - - acl_tensor_ptr acl_part_dst = ggml_cann_create_tensor(part_dst_buf, dst_type, ggml_element_size(dst), - part_dst_ne, part_dst_nb, 3, ACL_FORMAT_NCL); - GGML_CANN_CALL_ACLNN_OP(ctx, InplaceZero, acl_part_dst.get()); - - // compute part conv transpose 1d - GGML_CANN_CALL_ACLNN_OP(ctx, Convolution, acl_input.get(), part_kernel.get(), nullptr, stride.get(), - padding.get(), dilation.get(), transposed, padding.get(), groups, acl_part_dst.get(), cubeMathType); - - // compute the position of part result in final result - int64_t global_start = slice_start; - int64_t global_end = std::min((input_len - 1) * strideVal[0] + slice_end, dst_len); - - left_pad_len = global_start; - right_pad_len = dst_len - global_end; - - std::vector padDataVal = {left_pad_len,right_pad_len}; - acl_int_array_ptr padData = ggml_cann_create_int_array(padDataVal.data(), 2); - - acl_scalar_ptr pad_value = nullptr; - float pad_valueVal = 0.0; - pad_value = ggml_cann_create_scalar(&pad_valueVal, aclDataType::ACL_FLOAT); - - int64_t conv_result_ne[4]; - for(int i = 0; i < 4; i++){ - conv_result_ne[i] = *(dst->ne + i); - } - - size_t conv_result_nb[4]; - conv_result_nb[0] = sizeof(weight_type); - for (int i = 1; i < 4; i++) { - conv_result_nb[i] = conv_result_nb[i - 1] * conv_result_ne[i - 1]; - } - - ggml_cann_pool_alloc conv_result_allocator; - conv_result_allocator.alloc(ctx.pool(), conv_result_nb[3]); - void* conv_result_buf = conv_result_allocator.get(); - - acl_tensor_ptr conv_result = ggml_cann_create_tensor(conv_result_buf, dst_type, ggml_element_size(dst), - conv_result_ne, conv_result_nb, 3, ACL_FORMAT_NCL); - - GGML_CANN_CALL_ACLNN_OP(ctx, InplaceZero, conv_result.get()); - GGML_CANN_CALL_ACLNN_OP(ctx, ConstantPadNd, acl_part_dst.get(), padData.get(), pad_value.get(), conv_result.get()); - GGML_CANN_CALL_ACLNN_OP(ctx, InplaceAdd, acl_dst.get(), conv_result.get(), alpha.get()); - } + GGML_CANN_CALL_ACLNN_OP(ctx, Convolution, acl_input.get(), acl_weight.get(), nullptr, stride.get(), padding.get(), + dilation.get(), true, padding.get(), 1, acl_dst.get(), cubeMathType); } void ggml_cann_elu(ggml_backend_cann_context & ctx, ggml_tensor * dst) { @@ -3703,160 +3576,3 @@ void ggml_cann_out_prod(ggml_backend_cann_context & ctx, ggml_tensor * dst) { break; } } - -void ggml_cann_ssm_conv(ggml_backend_cann_context & ctx, ggml_tensor * dst) { - ggml_tensor * src0 = dst->src[0]; // conv_x - ggml_tensor * src1 = dst->src[1]; // conv1d.weight - - // This op is currently defined only for F32 in ggml_cpu - GGML_ASSERT(src0->type == GGML_TYPE_F32); - GGML_ASSERT(src1->type == GGML_TYPE_F32); - GGML_ASSERT(dst->type == GGML_TYPE_F32); - - // Shapes follow ggml_compute_forward_ssm_conv_f32 - const int64_t nc = src1->ne[0]; // d_conv - const int64_t ncs = src0->ne[0]; // d_conv - 1 + n_t - const int64_t nr = src0->ne[1]; // d_inner - const int64_t n_s = src0->ne[2]; // n_seqs - - const int64_t n_t = dst->ne[1]; // tokens per sequence - - GGML_ASSERT(dst->ne[0] == nr); // dst: {d_inner, n_t, n_s} - GGML_ASSERT(src1->ne[1] == nr); // weight: {d_conv, d_inner} - GGML_ASSERT(ncs == nc - 1 + n_t); // conv_x: {d_conv - 1 + n_t, d_inner, n_s} - GGML_ASSERT(src0->nb[0] == sizeof(float)); - GGML_ASSERT(src1->nb[0] == sizeof(float)); - - // --- Build CANN tensors --- - - // 1) Input: conv_x as NCL - // - // src0->ne = { ncs, nr, n_s, 1 } // {L_in, C, N} - // Passing ACL_FORMAT_NCL here means: - // reversed dims -> [N, C, L_in] = [n_s, nr, ncs] - acl_tensor_ptr acl_x = ggml_cann_create_tensor(src0, src0->ne, src0->nb, 3, ACL_FORMAT_NCL); - - // 2) Weights: depthwise conv kernel, view src1 as {K, 1, C} - // - // src1 original: ne = { nc, nr, 1, 1 } // [K, C, 1, 1] - // we want a view: ne_w = { nc, 1, nr } // [K, 1, C] - // so that reversed dims -> [C, 1, K] which matches - // [out_channels, in_channels/groups, kernel_size] - int64_t w_ne[GGML_MAX_DIMS] = { nc, 1, nr, 1 }; // [K, 1 input ch. per group, C groups] - // Layout: src1 data is [K, C] with - // offset(k, c) = k*nb0 + c*nb1 - // We want offset_w(k, 0, c) = k*nb0 + c*nb1, - // so we can reuse nb0 and nb1, and set nb2 = nb1. - size_t w_nb[GGML_MAX_DIMS] = { src1->nb[0], src1->nb[1], src1->nb[1], src1->nb[3] }; // same as src1 - - acl_tensor_ptr acl_w = ggml_cann_create_tensor( - src1->data, ggml_cann_type_mapping(src1->type), ggml_type_size(src1->type), w_ne, w_nb, 3, ACL_FORMAT_NCL); - - // 3) Output: dst is { d_inner, n_t, n_s } (CLN) - // - // We need an NCL view of the same buffer: - // desired NCL logical shape: { L_out = n_t, C = nr, N = n_s } - // - // Original CLN layout: - // dst->ne = { nr, n_t, n_s } - // dst->nb[0] = sizeof(float) - // dst->nb[1] = nr * sizeof(float) - // dst->nb[2] = nr * n_t * sizeof(float) - // - // We want offset_new(L, C, N) = offset_orig(C, L, N). - // Choose: - // nb_y[0] = nr * sizeof(float); // step in L - // nb_y[1] = sizeof(float); // step in C - // nb_y[2] = nr * n_t * sizeof(float); // step in N - int64_t y_ne[GGML_MAX_DIMS] = { n_t, nr, n_s, 1 }; // [L_out, C, N] - size_t y_nb[GGML_MAX_DIMS] = { dst->ne[0] * sizeof(float), sizeof(float), dst->ne[0] * dst->ne[1] * sizeof(float), dst->nb[3] }; // [nr, 1, nr * n_t] - - acl_tensor_ptr acl_y = ggml_cann_create_tensor( - dst->data, ggml_cann_type_mapping(dst->type), ggml_type_size(dst->type), y_ne, y_nb, 3, ACL_FORMAT_NCL); - - // --- Conv1d parameters: depthwise, stride 1, no padding ("valid") --- - int64_t strideVal[1] = { 1 }; - int64_t paddingVal[1] = { 0 }; - int64_t dilationVal[1] = { 1 }; - - acl_int_array_ptr stride = ggml_cann_create_int_array(strideVal, 1); - acl_int_array_ptr padding = ggml_cann_create_int_array(paddingVal, 1); - acl_int_array_ptr dilation = ggml_cann_create_int_array(dilationVal, 1); - - const bool transposed = false; - const int64_t groups = nr; // depthwise: one group per inner dim - int8_t cubeMathType = 0; - -#ifdef ASCEND_310P - cubeMathType = 1; -#endif - - GGML_CANN_CALL_ACLNN_OP(ctx, - Convolution, - acl_x.get(), // input: N, C, L_in = ncs - acl_w.get(), // weight: [C, 1, K] with groups=nr - nullptr, // bias - stride.get(), - padding.get(), - dilation.get(), - transposed, - padding.get(), // output padding (unused for non-transposed) - groups, - acl_y.get(), - cubeMathType); -} - - -void ggml_cann_op_add_rms_norm_fused(ggml_backend_cann_context & ctx, - ggml_tensor * add_node, - ggml_tensor * rms_norm_node) { - // Get the two input tensors for ADD operation - ggml_tensor * x1 = add_node->src[0]; - ggml_tensor * x2 = add_node->src[1]; - - // Create ACL tensors for the two ADD inputs - acl_tensor_ptr acl_x1 = ggml_cann_create_tensor(x1); - acl_tensor_ptr acl_x2 = ggml_cann_create_tensor(x2); - - // Get epsilon parameter from rms_norm_tensor - float eps; - memcpy(&eps, rms_norm_node->op_params, sizeof(float)); - - // Build gamma tensor (RMS normalization scaling factor) - // Gamma should match the normalized dimensions (last dimension of x1) - size_t acl_gamma_nb[GGML_MAX_DIMS]; - acl_gamma_nb[0] = ggml_type_size(rms_norm_node->type); - for (int i = 1; i < GGML_MAX_DIMS; i++) { - acl_gamma_nb[i] = acl_gamma_nb[i - 1] * x1->ne[i - 1]; - } - acl_tensor_ptr acl_gamma = - get_cache_acl_tensor(ctx, &ctx.rms_norm_one_tensor_cache.cache, ctx.rms_norm_one_tensor_cache.size, x1->ne, - acl_gamma_nb, rms_norm_node->type, - 1, // dims - only the last dimension - 1.0f // value - ); - - // Build rstdOut tensor (output for normalized standard deviation) - // Shape should be the dimensions that are NOT normalized - int64_t acl_rstd_ne[] = { 1, x1->ne[1], x1->ne[2], x1->ne[3] }; - size_t acl_rstd_nb[GGML_MAX_DIMS - 1]; - acl_rstd_nb[0] = sizeof(float); - for (int i = 1; i < GGML_MAX_DIMS - 1; i++) { - acl_rstd_nb[i] = acl_rstd_nb[i - 1] * acl_rstd_ne[i - 1]; - } - acl_tensor_ptr acl_rstd = - get_cache_acl_tensor(ctx, &ctx.rms_norm_zero_tensor_cache.cache, ctx.rms_norm_zero_tensor_cache.size, - acl_rstd_ne, acl_rstd_nb, GGML_TYPE_F32, GGML_MAX_DIMS, - 0.0f // value - ); - - acl_tensor_ptr acl_xout = ggml_cann_create_tensor(add_node); - - // Create yOut tensor (final output after RMS normalization) - acl_tensor_ptr acl_yout = ggml_cann_create_tensor(rms_norm_node); - - // Call fused ADD + RMS_NORM operator - GGML_CANN_CALL_ACLNN_OP(ctx, AddRmsNorm, acl_x1.get(), acl_x2.get(), acl_gamma.get(), - eps, // double type - acl_yout.get(), acl_rstd.get(), acl_xout.get()); -} diff --git a/ggml/src/ggml-cann/aclnn_ops.h b/ggml/src/ggml-cann/aclnn_ops.h index 08ee7b1..1ebbc76 100644 --- a/ggml/src/ggml-cann/aclnn_ops.h +++ b/ggml/src/ggml-cann/aclnn_ops.h @@ -47,7 +47,6 @@ #include #include #include -#include #include #include @@ -935,20 +934,6 @@ template void register_acl_resources(std::vector get_env_as_lowercase(const std::string & name); +std::optional get_env(const std::string & name); bool parse_bool(const std::string & value); int parse_integer(const std::string & value); @@ -229,60 +229,6 @@ struct ggml_graph_node_properties { // op ggml_op node_op; int32_t op_params[GGML_MAX_OP_PARAMS / sizeof(int32_t)]; - - /** - * @brief Check if a ggml tensor node matches this property set. - * - * This function compares all relevant fields (address, op type, shape, source inputs, op params) - * to determine whether the current node matches these previously recorded properties. - * - * @param node The current ggml tensor node. - * @return true if all fields match (excluding GGML_OP_VIEW); false otherwise. - */ - bool has_matching_properties(ggml_tensor * node) { - if (node->data != this->node_address && node->op != GGML_OP_VIEW) { - return false; - } - - if (node->op != this->node_op) { - return false; - } - - for (int i = 0; i < GGML_MAX_DIMS; i++) { - if (node->ne[i] != this->ne[i]) { - return false; - } - if (node->nb[i] != this->nb[i]) { - return false; - } - } - - for (int i = 0; i < GGML_MAX_SRC; i++) { - if (node->src[i]) { - if (node->src[i]->data != this->src_address[i] && node->op != GGML_OP_VIEW) { - return false; - } - - for (int d = 0; d < GGML_MAX_DIMS; d++) { - if (node->src[i]->ne[d] != this->src_ne[i][d]) { - return false; - } - if (node->src[i]->nb[d] != this->src_nb[i][d]) { - return false; - } - } - } else { - if (this->src_address[i] != nullptr) { - return false; - } - } - } - - if (node->op == GGML_OP_SCALE || node->op == GGML_OP_UNARY || node->op == GGML_OP_GLU) { - return memcmp(this->op_params, node->op_params, GGML_MAX_OP_PARAMS) == 0; - } - return true; - } }; struct ggml_cann_graph { @@ -295,79 +241,6 @@ struct ggml_cann_graph { aclmdlRI graph = nullptr; std::vector ggml_graph_properties; - - /** - * @brief Create a new CANN graph from a ggml computation graph. - * - * This function creates a new ggml_cann_graph object and fills its node properties - * (operation type, dimensions, strides, input sources, and operation parameters) - * based on the current ggml computation graph. - * - * Each node in the ggml graph is mapped to a property entry in the new CANN graph: - * - node address - * - operation type - * - shape (ne) and strides (nb) - * - source tensor addresses - * - operation parameters - * - * @param cgraph The current ggml computation graph. - * @return Pointer to the newly created ggml_cann_graph object. - */ - static ggml_cann_graph * create_from_cgraph(ggml_cgraph * cgraph) { - ggml_cann_graph * new_graph = new ggml_cann_graph(); - new_graph->ggml_graph_properties.resize(cgraph->n_nodes); - - for (int node_idx = 0; node_idx < cgraph->n_nodes; ++node_idx) { - ggml_tensor * node = cgraph->nodes[node_idx]; - auto & prop = new_graph->ggml_graph_properties[node_idx]; - - prop.node_address = node->data; - prop.node_op = node->op; - - std::copy_n(node->ne, GGML_MAX_DIMS, prop.ne); - std::copy_n(node->nb, GGML_MAX_DIMS, prop.nb); - - for (int src = 0; src < GGML_MAX_SRC; ++src) { - if (node->src[src]) { - prop.src_address[src] = node->src[src]->data; - std::copy_n(node->src[src]->ne, GGML_MAX_DIMS, prop.src_ne[src]); - std::copy_n(node->src[src]->nb, GGML_MAX_DIMS, prop.src_nb[src]); - } else { - prop.src_address[src] = nullptr; - std::fill_n(prop.src_ne[src], GGML_MAX_DIMS, 0); - std::fill_n(prop.src_nb[src], GGML_MAX_DIMS, 0); - } - } - - memcpy(prop.op_params, node->op_params, GGML_MAX_OP_PARAMS); - } - - return new_graph; - } - - /** - * @brief Check whether this CANN graph matches the given ggml computation graph. - * - * This function compares the number of nodes and each node's properties - * (operation type, dimensions, strides, inputs, and operation parameters) - * to determine whether this CANN graph matches the given ggml graph. - * - * @param cgraph The current ggml computation graph. - * @return true if this CANN graph matches the ggml graph; false otherwise. - */ - bool matches_cgraph(ggml_cgraph * cgraph) { - if (this->ggml_graph_properties.size() != static_cast(cgraph->n_nodes)) { - return false; - } - - for (int i = 0; i < cgraph->n_nodes; ++i) { - if (!this->ggml_graph_properties[i].has_matching_properties(cgraph->nodes[i])) { - return false; - } - } - - return true; - } }; /** @@ -399,6 +272,15 @@ struct ggml_cann_graph_lru_cache { cache_list.push_front(new_node); } + /** + * @brief Move an existing graph to the front of the cache. + * @param node Pointer to the ggml_cann_graph to move. + */ + void move_to_front(ggml_cann_graph * node) { + cache_list.remove(node); + cache_list.push_front(node); + } + /** * @brief Clear all graphs from the cache (also frees memory). */ @@ -413,28 +295,6 @@ struct ggml_cann_graph_lru_cache { * @brief Destructor that clears the cache and frees all cached graphs. */ ~ggml_cann_graph_lru_cache() { clear(); } - - /** - * @brief Find a cached CANN graph that matches the given ggml graph and move it to front. - * - * This function iterates through the cached CANN graphs stored in the LRU cache and - * compares them against the given ggml computation graph. If a matching graph is found, - * it is promoted to the front of the LRU cache and returned. Otherwise, the function - * returns nullptr. - * - * @param cgraph The current ggml computation graph. - * @return true if found; false otherwise. - */ - bool find_and_move_to_front(ggml_cgraph * cgraph) { - for (auto & graph_ptr : this->cache_list) { - if (graph_ptr->matches_cgraph(cgraph)) { - cache_list.remove(graph_ptr); - cache_list.push_front(graph_ptr); - return true; - } - } - return false; - } }; #endif // USE_ACL_GRAPH @@ -458,9 +318,6 @@ struct ggml_cann_rope_cache { if (position_select_index_host) { free(position_select_index_host); } - if (yarn_ramp_cache) { - ACL_CHECK(aclrtFree(yarn_ramp_cache)); - } } bool equal(int64_t theta_scale_length, @@ -513,7 +370,6 @@ struct ggml_cann_rope_cache { float * theta_scale_exp_host = nullptr; int * position_select_index_host = nullptr; void * position_select_index = nullptr; - void * yarn_ramp_cache = nullptr; // sin/cos cache, used only to accelerate first layer on each device void * sin_cache = nullptr; void * cos_cache = nullptr; diff --git a/ggml/src/ggml-cann/ggml-cann.cpp b/ggml/src/ggml-cann/ggml-cann.cpp index d7a9384..da624c5 100644 --- a/ggml/src/ggml-cann/ggml-cann.cpp +++ b/ggml/src/ggml-cann/ggml-cann.cpp @@ -105,10 +105,10 @@ int32_t ggml_cann_get_device() { } /** - * @brief Get the value of the specified environment variable (name) as lowercase. + * @brief Get the value of the specified environment variable (name). * if not empty, return a std::string object */ -std::optional get_env_as_lowercase(const std::string & name) { +std::optional get_env(const std::string & name) { const char * val = std::getenv(name.c_str()); if (!val) { return std::nullopt; @@ -122,7 +122,7 @@ std::optional get_env_as_lowercase(const std::string & name) { * @brief Verify whether the environment variable is a valid value. */ bool parse_bool(const std::string & value) { - static const std::unordered_set valid_values = { "on", "1", "yes", "y", "enable", "true" }; + std::unordered_set valid_values = { "on", "1", "yes", "y", "enable", "true" }; return valid_values.find(value) != valid_values.end(); } @@ -259,7 +259,7 @@ struct ggml_cann_pool_buf_prio : public ggml_cann_pool { * @param device The device ID to associate with this buffer pool. */ explicit ggml_cann_pool_buf_prio(int device) : device(device) { - disable_clean = parse_bool(get_env_as_lowercase("GGML_CANN_DISABLE_BUF_POOL_CLEAN").value_or("")); + disable_clean = parse_bool(get_env("GGML_CANN_DISABLE_BUF_POOL_CLEAN").value_or("")); } /** @@ -452,7 +452,7 @@ struct ggml_cann_pool_buf : public ggml_cann_pool { * @param device The device ID to associate with this buffer pool. */ explicit ggml_cann_pool_buf(int device) : device(device) { - disable_clean = parse_bool(get_env_as_lowercase("GGML_CANN_DISABLE_BUF_POOL_CLEAN").value_or("")); + disable_clean = parse_bool(get_env("GGML_CANN_DISABLE_BUF_POOL_CLEAN").value_or("")); } /** @@ -764,7 +764,7 @@ struct ggml_cann_pool_vmm : public ggml_cann_pool { * @return A unique pointer to the created CANN pool. */ std::unique_ptr ggml_backend_cann_context::new_pool_for_device(int device) { - std::string mem_pool_type = get_env_as_lowercase("GGML_CANN_MEM_POOL").value_or(""); + std::string mem_pool_type = get_env("GGML_CANN_MEM_POOL").value_or(""); if (mem_pool_type == "prio") { GGML_LOG_INFO("%s: device %d use buffer pool with priority queue\n", __func__, device); @@ -1217,7 +1217,7 @@ static void ggml_backend_cann_buffer_set_tensor(ggml_backend_buffer_t buffer, // Why aclrtSynchronizeDevice? // Only check env once. - static bool weight_to_nz = parse_bool(get_env_as_lowercase("GGML_CANN_WEIGHT_NZ").value_or("on")); + static bool weight_to_nz = parse_bool(get_env("GGML_CANN_WEIGHT_NZ").value_or("on")); if (!need_transform(tensor->type)) { ACL_CHECK(aclrtMemcpy((char *) tensor->data + offset, size, data, size, ACL_MEMCPY_HOST_TO_DEVICE)); if (weight_to_nz && is_matmul_weight((const ggml_tensor *) tensor)) { @@ -1442,7 +1442,7 @@ static size_t ggml_backend_cann_buffer_type_get_alloc_size(ggml_backend_buffer_t int64_t ne0 = tensor->ne[0]; // Only check env once. - static bool weight_to_nz = parse_bool(get_env_as_lowercase("GGML_CANN_WEIGHT_NZ").value_or("on")); + static bool weight_to_nz = parse_bool(get_env("GGML_CANN_WEIGHT_NZ").value_or("on")); // last line must bigger than 32, because every single op deal at // least 32 bytes. @@ -1889,9 +1889,6 @@ static bool ggml_cann_compute_forward(ggml_backend_cann_context & ctx, struct gg case GGML_OP_OUT_PROD: ggml_cann_out_prod(ctx, dst); break; - case GGML_OP_SSM_CONV: - ggml_cann_ssm_conv(ctx, dst); - break; default: return false; } @@ -2078,39 +2075,161 @@ static void ggml_backend_cann_synchronize(ggml_backend_t backend) { ACL_CHECK(aclrtSynchronizeStream(cann_ctx->stream())); } +#ifdef USE_ACL_GRAPH /** - * @brief Check if CANN backend can fuse the specified operation sequence + * @brief Add a new CANN graph to the LRU cache by populating node properties from the ggml graph. * - * This function determines whether an operation sequence starting from the specified node - * can be fused into an optimized operation in the CANN backend. Operation fusion can reduce - * memory access overhead and improve computational efficiency. + * This function creates a new ggml_cann_graph object and fills its node properties + * (operation type, dimensions, strides, input sources, and operation parameters) + * based on the current ggml computation graph. * - * @param cgraph Pointer to the computation graph - * @param node_idx Index of the starting node in the computation graph - * @param ops Sequence of operation types to check for fusion - * @return true if the operations can be fused - * @return false if the operations cannot be fused + * Each node in the ggml graph is mapped to a property entry in the new CANN graph: + * - node address + * - operation type + * - shape (ne) and strides (nb) + * - source tensor addresses + * - operation parameters + * + * After initialization, the new graph is pushed into the LRU cache owned by the + * CANN backend context. The cache takes ownership of the graph and manages its + * lifetime (including deletion upon eviction). + * + * @param cann_ctx The CANN backend context containing the graph cache. + * @param cgraph The current ggml computation graph. */ -static bool ggml_cann_can_fuse(const struct ggml_cgraph * cgraph, - int node_idx, - std::initializer_list ops) { - if (!ggml_can_fuse(cgraph, node_idx, ops)) { +static void add_lru_matched_graph_node_properties(ggml_backend_cann_context * cann_ctx, ggml_cgraph * cgraph) { + // Create a new ggml_cann_graph object on the heap (its lifetime is managed by the cache). + ggml_cann_graph * new_graph = new ggml_cann_graph(); + new_graph->ggml_graph_properties.resize(cgraph->n_nodes); + + for (int node_idx = 0; node_idx < cgraph->n_nodes; ++node_idx) { + ggml_tensor * node = cgraph->nodes[node_idx]; + auto & prop = new_graph->ggml_graph_properties[node_idx]; + + prop.node_address = node->data; + prop.node_op = node->op; + + std::copy_n(node->ne, GGML_MAX_DIMS, prop.ne); + std::copy_n(node->nb, GGML_MAX_DIMS, prop.nb); + + for (int src = 0; src < GGML_MAX_SRC; ++src) { + if (node->src[src]) { + prop.src_address[src] = node->src[src]->data; + std::copy_n(node->src[src]->ne, GGML_MAX_DIMS, prop.src_ne[src]); + std::copy_n(node->src[src]->nb, GGML_MAX_DIMS, prop.src_nb[src]); + } else { + prop.src_address[src] = nullptr; + std::fill_n(prop.src_ne[src], GGML_MAX_DIMS, 0); + std::fill_n(prop.src_nb[src], GGML_MAX_DIMS, 0); + } + } + + memcpy(prop.op_params, node->op_params, GGML_MAX_OP_PARAMS); + } + + // Insert into the LRU cache (cache takes ownership and will delete it when evicted). + cann_ctx->graph_lru_cache.push(new_graph); +} + +/** + * @brief Check if a ggml tensor node matches a previously captured CANN graph node. + * + * This function compares all relevant fields (address, op type, shape, source inputs, op params) + * to determine whether the current node matches a previously recorded version. + * + * @param node The current ggml tensor node. + * @param graph_node_properties The stored properties of a CANN graph node. + * @return true if all fields match (excluding GGML_OP_VIEW); false otherwise. + */ +static bool ggml_graph_node_has_matching_properties(ggml_tensor * node, + ggml_graph_node_properties * graph_node_properties) { + if (node->data != graph_node_properties->node_address && node->op != GGML_OP_VIEW) { return false; } - // CANN backend supports fusing ADD + RMS_NORM operations - if ((ops.size() == 2) && ops.begin()[0] == GGML_OP_ADD && ops.begin()[1] == GGML_OP_RMS_NORM) { - ggml_tensor * add_node = cgraph->nodes[node_idx]; - // TODO: support broadcast for ADD + RMS_NORM - if (add_node->src[0]->ne[0] != add_node->src[1]->ne[0] || add_node->src[0]->ne[1] != add_node->src[1]->ne[1] || - add_node->src[0]->ne[2] != add_node->src[1]->ne[2] || add_node->src[0]->ne[3] != add_node->src[1]->ne[3]) { + if (node->op != graph_node_properties->node_op) { + return false; + } + + for (int i = 0; i < GGML_MAX_DIMS; i++) { + if (node->ne[i] != graph_node_properties->ne[i]) { return false; } - return true; + if (node->nb[i] != graph_node_properties->nb[i]) { + return false; + } + } + + for (int i = 0; i < GGML_MAX_SRC; i++) { + if (node->src[i]) { + if (node->src[i]->data != graph_node_properties->src_address[i] && node->op != GGML_OP_VIEW) { + return false; + } + + for (int d = 0; d < GGML_MAX_DIMS; d++) { + if (node->src[i]->ne[d] != graph_node_properties->src_ne[i][d]) { + return false; + } + if (node->src[i]->nb[d] != graph_node_properties->src_nb[i][d]) { + return false; + } + } + } else { + if (graph_node_properties->src_address[i] != nullptr) { + return false; + } + } + } + + if (node->op == GGML_OP_SCALE || node->op == GGML_OP_UNARY || node->op == GGML_OP_GLU) { + return memcmp(graph_node_properties->op_params, node->op_params, GGML_MAX_OP_PARAMS) == 0; + } + return true; +} + +/** + * @brief Check whether there is a cached CANN graph that matches the current ggml graph. + * + * This function iterates through the cached CANN graphs stored in the LRU cache and + * compares them against the given ggml computation graph. A match requires that the + * number of nodes is the same and that each node’s properties (operation type, + * dimensions, strides, inputs, and operation parameters) are identical. + * + * If a matching graph is found, it is promoted to the front of the LRU cache and the + * function returns true. Otherwise, the function returns false, indicating that a new + * CANN graph needs to be captured. + * + * @param cann_ctx The CANN backend context containing the graph cache. + * @param cgraph The current ggml computation graph. + * @return true if a matching cached graph exists; false otherwise. + */ +static bool is_matched_graph(ggml_backend_cann_context * cann_ctx, ggml_cgraph * cgraph) { + ggml_cann_graph_lru_cache & lru_cache = cann_ctx->graph_lru_cache; + for (auto & graph_ptr : lru_cache.cache_list) { + // Skip graphs with a different number of nodes. + if (graph_ptr->ggml_graph_properties.size() != static_cast(cgraph->n_nodes)) { + continue; + } + + // Check if all nodes match. + bool all_match = true; + for (int i = 0; i < cgraph->n_nodes; ++i) { + if (!ggml_graph_node_has_matching_properties(cgraph->nodes[i], &graph_ptr->ggml_graph_properties[i])) { + all_match = false; + break; + } + } + + if (all_match) { + // update cache_list && renturn graph_ptr + lru_cache.move_to_front(graph_ptr); + return true; + } } return false; } +#endif // USE_ACL_GRAPH /** * @brief Evaluate the computation graph and optionally capture or execute it using CANN graph API. @@ -2120,34 +2239,25 @@ static bool ggml_cann_can_fuse(const struct ggml_cgraph * cgraph, * * Otherwise, it falls back to op-by-op execution using the CANN compute kernel dispatcher. * - * @param cann_ctx The CANN backend context. - * @param cgraph The ggml computation graph. - * @param use_cann_graph Whether to use CANN graph execution. - * @param cann_graph_capture_required Whether graph capture is needed due to graph changes. + * @param cann_ctx The CANN backend context. + * @param cgraph The ggml computation graph. + * @param use_cann_graph Whether to use CANN graph execution. + * @param cann_graph_update_required Whether graph capture is needed due to graph changes. */ static void evaluate_and_capture_cann_graph(ggml_backend_cann_context * cann_ctx, ggml_cgraph * cgraph, - bool use_cann_graph, - bool cann_graph_capture_required) { + bool & use_cann_graph, + bool & cann_graph_update_required) { #ifdef USE_ACL_GRAPH - if (use_cann_graph && cann_graph_capture_required) { // Begin CANN graph capture + if (use_cann_graph && cann_graph_update_required) { // Begin CANN graph capture ACL_CHECK(aclmdlRICaptureBegin(cann_ctx->stream(), ACL_MODEL_RI_CAPTURE_MODE_GLOBAL)); } #endif // USE_ACL_GRAPH // Only perform the graph execution if CANN graphs are not enabled, or we are capturing the graph. // With the use of CANN graphs, the execution will be performed by the graph launch. - static bool opt_fusion = parse_bool(get_env_as_lowercase("GGML_CANN_OPERATOR_FUSION").value_or("")); - - if (!use_cann_graph || cann_graph_capture_required) { + if (!use_cann_graph || cann_graph_update_required) { for (int i = 0; i < cgraph->n_nodes; i++) { ggml_tensor * node = cgraph->nodes[i]; - if (opt_fusion) { - if (ggml_cann_can_fuse(cgraph, i, { GGML_OP_ADD, GGML_OP_RMS_NORM })) { - ggml_cann_op_add_rms_norm_fused(*cann_ctx, node, cgraph->nodes[i + 1]); - i++; - continue; - } - } if (ggml_is_empty(node) || node->op == GGML_OP_RESHAPE || node->op == GGML_OP_TRANSPOSE || node->op == GGML_OP_VIEW || node->op == GGML_OP_PERMUTE || node->op == GGML_OP_NONE) { @@ -2164,10 +2274,9 @@ static void evaluate_and_capture_cann_graph(ggml_backend_cann_context * cann_ctx #ifdef USE_ACL_GRAPH if (use_cann_graph) { - GGML_ASSERT(!cann_ctx->graph_lru_cache.cache_list.empty()); ggml_cann_graph * matched_graph = cann_ctx->graph_lru_cache.cache_list.front(); - if (cann_graph_capture_required) { // End CANN graph capture + if (cann_graph_update_required) { // End CANN graph capture ACL_CHECK(aclmdlRICaptureEnd(cann_ctx->stream(), &matched_graph->graph)); } @@ -2197,11 +2306,11 @@ static enum ggml_status ggml_backend_cann_graph_compute(ggml_backend_t backend, // calculate rope cache for fist layer in current device. cann_ctx->rope_cache.cached = false; - bool graph_capture_required = false; + bool cann_graph_update_required = false; #ifdef USE_ACL_GRAPH bool use_cann_graph = true; - static bool prefill_use_graph = parse_bool(get_env_as_lowercase("GGML_CANN_PREFILL_USE_GRAPH").value_or("")); + static bool prefill_use_graph = parse_bool(get_env("GGML_CANN_PREFILL_USE_GRAPH").value_or("")); if (!prefill_use_graph) { // Do not use acl_graph for prefill. for (int i = 0; i < cgraph->n_nodes; i++) { @@ -2222,17 +2331,16 @@ static enum ggml_status ggml_backend_cann_graph_compute(ggml_backend_t backend, if (use_cann_graph) { // If no matching graph is found, the graph needs to be recaptured. - graph_capture_required = !cann_ctx->graph_lru_cache.find_and_move_to_front(cgraph); - if (graph_capture_required) { + cann_graph_update_required = !is_matched_graph(cann_ctx, cgraph); + if (cann_graph_update_required) { // If no matching graph is found, add a new ACL graph. - ggml_cann_graph * new_graph = ggml_cann_graph::create_from_cgraph(cgraph); - cann_ctx->graph_lru_cache.push(new_graph); + add_lru_matched_graph_node_properties(cann_ctx, cgraph); } } #else bool use_cann_graph = false; #endif // USE_ACL_GRAPH - evaluate_and_capture_cann_graph(cann_ctx, cgraph, use_cann_graph, graph_capture_required); + evaluate_and_capture_cann_graph(cann_ctx, cgraph, use_cann_graph, cann_graph_update_required); return GGML_STATUS_SUCCESS; } @@ -2470,7 +2578,8 @@ static bool ggml_backend_cann_supports_op(ggml_backend_dev_t dev, const ggml_ten } } case GGML_OP_CONV_TRANSPOSE_1D: - return true; + // TODO: ((weightL - 1) * dilationW - padLeft)=1336 should not be larger than 255. + return (op->src[0]->ne[0] - 1) <= 255; case GGML_OP_SCALE: float bias; memcpy(&bias, (const float *) (op->op_params) + 1, sizeof(float)); @@ -2517,8 +2626,6 @@ static bool ggml_backend_cann_supports_op(ggml_backend_dev_t dev, const ggml_ten } return true; } - case GGML_OP_SSM_CONV: - return true; default: return false; } @@ -2541,6 +2648,27 @@ static bool ggml_backend_buft_is_cann(ggml_backend_buffer_type_t buft) { return buft->iface.get_name == ggml_backend_cann_buffer_type_name; } +/** + * @brief Determines if a tensor operation should be offloaded to the CANN + * backend. + * + * This function checks if a given tensor operation should be offloaded to the + * CANN backend based on the operation type and the size of the tensor. It + * returns true if the second dimension (ne[1]) of the tensor is greater than or + * equal to the minimum batch size and the operation is not GGML_OP_GET_ROWS. + * + * @param backend Pointer to the CANN backend. + * @param op Pointer to the tensor operation to check. + * @return bool Returns true if the operation should be offloaded, otherwise + * false. + */ +static bool ggml_backend_cann_offload_op(ggml_backend_dev_t dev, const ggml_tensor * op) { + const int min_batch_size = 32; + GGML_UNUSED(dev); + + return op->ne[1] >= min_batch_size && op->op != GGML_OP_GET_ROWS; +} + /** * @brief Records an event on the CANN backend stream. * @@ -2616,7 +2744,6 @@ struct ggml_backend_cann_device_context { int device; std::string name; std::string description; - int op_offload_min_batch_size; }; static const char * ggml_backend_cann_device_get_name(ggml_backend_dev_t dev) { @@ -2693,26 +2820,6 @@ static ggml_backend_buffer_type_t ggml_backend_cann_device_get_host_buffer_type( return ggml_backend_cann_host_buffer_type(); } -/** - * @brief Determines if a tensor operation should be offloaded to the CANN - * backend. - * - * This function checks if a given tensor operation should be offloaded to the - * CANN backend based on the operation type and the size of the tensor. It - * returns true if the second dimension (ne[1]) of the tensor is greater than or - * equal to the minimum batch size and the operation is not GGML_OP_GET_ROWS. - * - * @param backend Pointer to the CANN backend. - * @param op Pointer to the tensor operation to check. - * @return bool Returns true if the operation should be offloaded, otherwise - * false. - */ -static bool ggml_backend_cann_offload_op(ggml_backend_dev_t dev, const ggml_tensor * op) { - ggml_backend_cann_device_context * dev_ctx = (ggml_backend_cann_device_context *)dev->context; - - return op->ne[1] >= dev_ctx->op_offload_min_batch_size && op->op != GGML_OP_GET_ROWS; -} - /** * @brief Creates a new event for the CANN backend device. * @@ -2829,14 +2936,12 @@ ggml_backend_reg_t ggml_backend_cann_reg() { if (!initialized) { aclInit(nullptr); ggml_backend_cann_reg_context * ctx = new ggml_backend_cann_reg_context; - const int min_batch_size = getenv("GGML_OP_OFFLOAD_MIN_BATCH") ? atoi(getenv("GGML_OP_OFFLOAD_MIN_BATCH")) : 32; for (int i = 0; i < ggml_cann_info().device_count; i++) { ggml_backend_cann_device_context * dev_ctx = new ggml_backend_cann_device_context(); dev_ctx->description = aclrtGetSocName(); dev_ctx->device = i; dev_ctx->name = GGML_CANN_NAME + std::to_string(i); - dev_ctx->op_offload_min_batch_size = min_batch_size; ggml_cann_set_device(i); ggml_backend_dev_t dev = new ggml_backend_device{ /* .iface = */ ggml_backend_cann_device_interface, /* .reg = */ ®, diff --git a/ggml/src/ggml-cpu/CMakeLists.txt b/ggml/src/ggml-cpu/CMakeLists.txt index 7622d0b..28fb761 100644 --- a/ggml/src/ggml-cpu/CMakeLists.txt +++ b/ggml/src/ggml-cpu/CMakeLists.txt @@ -561,9 +561,9 @@ function(ggml_add_cpu_backend_variant_impl tag_name) # Fetch KleidiAI sources: include(FetchContent) - set(KLEIDIAI_COMMIT_TAG "v1.16.0") + set(KLEIDIAI_COMMIT_TAG "v1.14.0") set(KLEIDIAI_DOWNLOAD_URL "https://github.com/ARM-software/kleidiai/archive/refs/tags/${KLEIDIAI_COMMIT_TAG}.tar.gz") - set(KLEIDIAI_ARCHIVE_MD5 "0a9e9008adb6031f9e8cf70dff4a3321") + set(KLEIDIAI_ARCHIVE_MD5 "45e110675d93f99f82c23a1afcca76bc") if (POLICY CMP0135) cmake_policy(SET CMP0135 NEW) @@ -615,7 +615,6 @@ function(ggml_add_cpu_backend_variant_impl tag_name) string(FIND "${ARCH_FLAGS_TEMP}" "+dotprod" DOTPROD_ENABLED) string(FIND "${ARCH_FLAGS_TEMP}" "+i8mm" I8MM_ENABLED) string(FIND "${ARCH_FLAGS_TEMP}" "+sme" SME_ENABLED) - string(FIND "${ARCH_FLAGS_TEMP}" "+sve" SVE_ENABLED) set(PRIVATE_ARCH_FLAGS ${ARCH_FLAGS_TEMP}) @@ -660,15 +659,6 @@ function(ggml_add_cpu_backend_variant_impl tag_name) set(PRIVATE_ARCH_FLAGS "-fno-tree-vectorize;${PRIVATE_ARCH_FLAGS}+sve+sve2") endif() - if (NOT SVE_ENABLED MATCHES -1) - list(APPEND GGML_KLEIDIAI_SOURCES - ${KLEIDIAI_SRC}/kai/kai_common_sve_asm.S - ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod_asm.S - ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod.c - ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm_asm.S - ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm.c) - endif() - set_source_files_properties(${GGML_KLEIDIAI_SOURCES} PROPERTIES COMPILE_OPTIONS "${PRIVATE_ARCH_FLAGS}") list(APPEND GGML_CPU_SOURCES ${GGML_KLEIDIAI_SOURCES}) endif() diff --git a/ggml/src/ggml-cpu/ggml-cpu-impl.h b/ggml/src/ggml-cpu/ggml-cpu-impl.h index 0e8dd0a..7597377 100644 --- a/ggml/src/ggml-cpu/ggml-cpu-impl.h +++ b/ggml/src/ggml-cpu/ggml-cpu-impl.h @@ -328,7 +328,7 @@ inline static int32x4_t ggml_vdotq_s32(int32x4_t acc, int8x16_t a, int8x16_t b) #if defined(_MSC_VER) || defined(__MINGW32__) #include -#elif defined(__SSE__) || defined(__SSE3__) || defined(__SSSE3__) || defined(__AVX__) || defined(__F16C__) || defined(__AVX2__) || defined(__AVX512F__) || defined(__AVX512BF16__) +#elif defined(__AVX__) || defined(__AVX2__) || defined(__AVX512F__) || defined(__SSSE3__) || defined(__SSE3__) || defined(__SSE__) #include #endif diff --git a/ggml/src/ggml-cpu/kleidiai/kernels.cpp b/ggml/src/ggml-cpu/kleidiai/kernels.cpp index d114f2d..55a00f0 100644 --- a/ggml/src/ggml-cpu/kleidiai/kernels.cpp +++ b/ggml/src/ggml-cpu/kleidiai/kernels.cpp @@ -18,8 +18,6 @@ #include "kai_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod.h" #include "kai_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod.h" #include "kai_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm.h" -#include "kai_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm.h" -#include "kai_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod.h" #include "kai_lhs_pack_bf16p2vlx2_f32_sme.h" #include "kai_lhs_quant_pack_qsi8d32p_f32.h" @@ -71,9 +69,9 @@ static inline void kernel_run_fn10(size_t m, size_t n, size_t k, size_t /*bl*/, template static inline void kernel_run_float_fn10(size_t m, size_t n, size_t k, size_t /*bl*/, - const void* lhs, const void* rhs, void* dst, - size_t dst_stride_row, size_t dst_stride_col, - float clamp_min, float clamp_max) { + const void* lhs, const void* rhs, void* dst, + size_t dst_stride_row, size_t dst_stride_col, + float clamp_min, float clamp_max) { Fn(m, n, k, lhs, rhs, static_cast(dst), dst_stride_row, dst_stride_col, clamp_min, clamp_max); } @@ -154,8 +152,8 @@ static inline void rhs_pack_fn12(size_t num_groups, size_t n, size_t k, size_t n template static inline void rhs_pack_scale_fn12(size_t num_groups, size_t n, size_t k, size_t nr, size_t kr, size_t sr, size_t /*bl*/, - size_t /*rhs_stride*/, const void* rhs, const void* bias, const void* scale, - void* rhs_packed, size_t extra_bytes, const void* params) { + size_t /*rhs_stride*/, const void* rhs, const void* bias, const void* scale, + void* rhs_packed, size_t extra_bytes, const void* params) { Fn(num_groups, n, k, nr, kr, sr, static_cast(rhs), static_cast(bias), @@ -526,61 +524,6 @@ static ggml_kleidiai_kernels gemm_gemv_kernels[] = { }, #endif #else -#if defined(__ARM_FEATURE_SVE) - { - /* SVE i8mm GEMM */ - /* .kern_info = */ { - /* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm, - /* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm, - /* .get_mr = */ kai_get_mr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm, - /* .get_nr = */ kai_get_nr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm, - /* .get_kr = */ kai_get_kr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm, - /* .get_sr = */ kai_get_sr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm, - /* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm, - /* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm, - /* .get_lhs_offset_ex = */ &kernel_offs_fn3, - /* .get_rhs_packed_offset_ex = */ &kernel_offs_fn3, - /* .run_kernel_ex = */ &kernel_run_fn11, - }, - /* .gemm_lhs_info = */ { - /* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qsi8d32p4x8sb_f32_neon, - /* .get_packed_offset_ex = */ &lhs_offs_fn6, - /* .packed_size_ex = */ &lhs_ps_fn6, - /* .pack_func_ex = */ &lhs_pack_float_fn10, - }, - /* SVE dotprod GEMV */ - /* .kern_info = */ { - /* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod, - /* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod, - /* .get_mr = */ kai_get_mr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod, - /* .get_nr = */ kai_get_nr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod, - /* .get_kr = */ kai_get_kr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod, - /* .get_sr = */ kai_get_sr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod, - /* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod, - /* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod, - /* .get_lhs_offset_ex = */ &kernel_offs_fn3, - /* .get_rhs_packed_offset_ex = */ &kernel_offs_fn3, - /* .run_kernel_ex = */ &kernel_run_fn11, - }, - /* .gemv_lhs_info = */ { - /* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qsi8d32p_f32, - /* .get_packed_offset_ex = */ &lhs_offs_fn6, - /* .packed_size_ex = */ &lhs_ps_fn6, - /* .pack_func_ex = */ &lhs_pack_float_fn10, - }, - /* .rhs_info = */ { - /* .packed_stride = */ kai_get_rhs_packed_stride_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0, - /* .to_float = */ dequantize_row_qsi4c32pscalef16, - /* .packed_size_ex = */ &rhs_ps_fn5, - /* .packed_stride_ex = */ &rhs_stride_fn4, - /* .pack_func_ex = */ &rhs_pack_fn12, - }, - /* .required_cpu = */ CPU_FEATURE_SVE | CPU_FEATURE_I8MM | CPU_FEATURE_DOTPROD, - /* .lhs_type = */ GGML_TYPE_F32, - /* .rhs_type = */ GGML_TYPE_Q4_0, - /* .op_type = */ GGML_TYPE_F32, - }, -#endif #if defined(__ARM_FEATURE_MATMUL_INT8) { /* i8mm GEMM */ @@ -635,7 +578,7 @@ static ggml_kleidiai_kernels gemm_gemv_kernels[] = { /* .rhs_type = */ GGML_TYPE_Q4_0, /* .op_type = */ GGML_TYPE_F32, }, -#endif // __ARM_FEATURE_MATMUL_INT8 +#endif #if defined(__ARM_FEATURE_DOTPROD) { /* DOTPROD GEMM */ @@ -868,27 +811,26 @@ ggml_kleidiai_kernels * ggml_kleidiai_select_kernels(cpu_feature cpu_features, c ggml_kleidiai_kernels * kernel = nullptr; if (tensor->op == GGML_OP_MUL_MAT && tensor->src[0] != nullptr && tensor->src[1] != nullptr) { -#if defined(__ARM_FEATURE_SME) || \ - defined(__ARM_FEATURE_DOTPROD) || \ - defined(__ARM_FEATURE_MATMUL_INT8) || \ - defined(__ARM_FEATURE_SVE) - auto try_table = [&](auto & table) { - for (size_t i = 0; i < NELEMS(table) - 1; ++i) { - if ((cpu_features & table[i].required_cpu) == table[i].required_cpu && - table[i].lhs_type == tensor->src[1]->type && - table[i].rhs_type == tensor->src[0]->type && - table[i].op_type == tensor->type) { - kernel = &table[i]; - return true; +#if defined(__ARM_FEATURE_SME) || defined(__ARM_FEATURE_DOTPROD) || defined(__ARM_FEATURE_MATMUL_INT8) + for (size_t i = 0; i < NELEMS(gemm_gemv_kernels) - 1; ++i) { + if ((cpu_features & gemm_gemv_kernels[i].required_cpu) == gemm_gemv_kernels[i].required_cpu && + gemm_gemv_kernels[i].lhs_type == tensor->src[1]->type && + gemm_gemv_kernels[i].rhs_type == tensor->src[0]->type && + gemm_gemv_kernels[i].op_type == tensor->type) { + kernel = &gemm_gemv_kernels[i]; + break; + } + } + if (!kernel) { + for (size_t i = 0; i < NELEMS(gemm_gemv_kernels_q8) - 1; ++i) { + if ((cpu_features & gemm_gemv_kernels_q8[i].required_cpu) == gemm_gemv_kernels_q8[i].required_cpu && + gemm_gemv_kernels_q8[i].lhs_type == tensor->src[1]->type && + gemm_gemv_kernels_q8[i].rhs_type == tensor->src[0]->type && + gemm_gemv_kernels_q8[i].op_type == tensor->type) { + kernel = &gemm_gemv_kernels_q8[i]; + break; } } - return false; - }; - - if (tensor->src[0]->type == GGML_TYPE_Q8_0) { - try_table(gemm_gemv_kernels_q8); - } else { - try_table(gemm_gemv_kernels); } #else GGML_UNUSED(gemm_gemv_kernels); @@ -903,10 +845,7 @@ ggml_kleidiai_kernels * ggml_kleidiai_select_kernels(cpu_feature cpu_features, c ggml_kleidiai_kernels * ggml_kleidiai_select_kernels_q4_0(cpu_feature features) { ggml_kleidiai_kernels * kernels = nullptr; -#if defined(__ARM_FEATURE_SME) || \ - defined(__ARM_FEATURE_DOTPROD) || \ - defined(__ARM_FEATURE_MATMUL_INT8) || \ - defined(__ARM_FEATURE_SVE) +#if defined(__ARM_FEATURE_SME) || defined(__ARM_FEATURE_DOTPROD) || defined(__ARM_FEATURE_MATMUL_INT8) for (size_t i = 0; i < NELEMS(gemm_gemv_kernels) - 1; ++i) { if ((features & gemm_gemv_kernels[i].required_cpu) == gemm_gemv_kernels[i].required_cpu) { kernels = &gemm_gemv_kernels[i]; diff --git a/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp b/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp index ad23e73..6f2a90f 100644 --- a/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp +++ b/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp @@ -46,20 +46,13 @@ struct ggml_kleidiai_context { } static ctx = { CPU_FEATURE_NONE, NULL, NULL }; static const char* cpu_feature_to_string(cpu_feature f) { - if (f == CPU_FEATURE_NONE) { - return "NONE"; - } else if ((f & CPU_FEATURE_SME) == CPU_FEATURE_SME) { - return "SME"; - } else if ((f & CPU_FEATURE_SVE) == CPU_FEATURE_SVE) { - return "SVE"; - } - else if ((f & CPU_FEATURE_I8MM) == CPU_FEATURE_I8MM) { - return "I8MM"; - } else if ((f & CPU_FEATURE_DOTPROD) == CPU_FEATURE_DOTPROD) { - return "DOTPROD"; - } - else { - return "UNKNOWN"; + switch (f) { + case CPU_FEATURE_NONE: return "NONE"; + case CPU_FEATURE_DOTPROD: return "DOTPROD"; + case CPU_FEATURE_I8MM: return "I8MM"; + case CPU_FEATURE_SVE: return "SVE"; + case CPU_FEATURE_SME: return "SME"; + default: return "UNKNOWN"; } } @@ -75,7 +68,7 @@ static void init_kleidiai_context(void) { ctx.features = (ggml_cpu_has_dotprod() ? CPU_FEATURE_DOTPROD : CPU_FEATURE_NONE) | (ggml_cpu_has_matmul_int8() ? CPU_FEATURE_I8MM : CPU_FEATURE_NONE) | - ((ggml_cpu_has_sve() && ggml_cpu_get_sve_cnt() == QK8_0) ? CPU_FEATURE_SVE : CPU_FEATURE_NONE); + (ggml_cpu_has_sve() ? CPU_FEATURE_SVE : CPU_FEATURE_NONE); if (env_var) { sme_enabled = atoi(env_var); diff --git a/ggml/src/ggml-cpu/simd-mappings.h b/ggml/src/ggml-cpu/simd-mappings.h index e367f11..101a9c0 100644 --- a/ggml/src/ggml-cpu/simd-mappings.h +++ b/ggml/src/ggml-cpu/simd-mappings.h @@ -14,6 +14,10 @@ #include #endif +#if defined(__F16C__) +#include +#endif + #if defined(__riscv_v_intrinsic) #include #endif @@ -654,14 +658,6 @@ static inline void __avx_f32cx8_store(ggml_fp16_t *x, __m256 y) { vec_extract(x[0], 2) + \ vec_extract(x[0], 3); \ } -#define GGML_F32x4_REDUCE_4(res, s0, s1, s2, s3) \ -{ \ - vector float v = vec_add(vec_add(s0, s1), \ - vec_add(s2, s3)); \ - v = vec_add(v, vec_sld(v, v, 8)); \ - v = vec_add(v, vec_sld(v, v, 4)); \ - res += (ggml_float) vec_extract(v, 0); \ -} #define GGML_F32_VEC GGML_F32x4 #define GGML_F32_VEC_ZERO GGML_F32x4_ZERO @@ -698,29 +694,6 @@ static inline unsigned char ggml_endian_byte(int i) { r[i - GGML_ENDIAN_BYTE(0)]), \ 0, p - GGML_F16_EPR) -//BF16 POWER9 -#define GGML_BF16_STEP 16 -#define GGML_BF16_EPR 8 - -#define GGML_BF16x8 vector unsigned short -#define GGML_BF16x8_ZERO vec_splats((unsigned short)0) -#define GGML_BF16x8_LOAD(p) vec_xl(0, (const unsigned short *)(p)) - -#define GGML_BF16_VEC GGML_BF16x8 -#define GGML_BF16_VEC_ZERO GGML_BF16x8_ZERO -#define GGML_BF16_VEC_LOAD GGML_BF16x8_LOAD -#if defined(__LITTLE_ENDIAN__) -#define GGML_BF16_TO_F32_LO(v) ((vector float) vec_mergel(GGML_BF16_VEC_ZERO, (v))) -#define GGML_BF16_TO_F32_HI(v) ((vector float) vec_mergeh(GGML_BF16_VEC_ZERO, (v))) -#else -#define GGML_BF16_TO_F32_LO(v) ((vector float) vec_mergel((v), GGML_BF16_VEC_ZERO)) -#define GGML_BF16_TO_F32_HI(v) ((vector float) vec_mergeh((v), GGML_BF16_VEC_ZERO)) -#endif -#define GGML_BF16_FMA_LO(acc, x, y) \ - (acc) = GGML_F32x4_FMA((acc), GGML_BF16_TO_F32_LO(x), GGML_BF16_TO_F32_LO(y)) -#define GGML_BF16_FMA_HI(acc, x, y) \ - (acc) = GGML_F32x4_FMA((acc), GGML_BF16_TO_F32_HI(x), GGML_BF16_TO_F32_HI(y)) - #elif defined(__wasm_simd128__) #define GGML_SIMD diff --git a/ggml/src/ggml-cpu/vec.cpp b/ggml/src/ggml-cpu/vec.cpp index 8708cd4..427e632 100644 --- a/ggml/src/ggml-cpu/vec.cpp +++ b/ggml/src/ggml-cpu/vec.cpp @@ -237,24 +237,6 @@ void ggml_vec_dot_bf16(int n, float * GGML_RESTRICT s, size_t bs, ggml_bf16_t * sumf += __riscv_vfmv_f_s_f32m1_f32(redsum); #endif -#if defined(__POWER9_VECTOR__) - const int np = (n & ~(GGML_BF16_STEP - 1)); - if (np > 0) { - GGML_F32_VEC sum[4] = {GGML_F32_VEC_ZERO}; - for (; i < np; i += GGML_BF16_STEP) { - GGML_BF16_VEC vx0 = GGML_BF16_VEC_LOAD(x + i); - GGML_BF16_VEC vx1 = GGML_BF16_VEC_LOAD(x + i + 8); - GGML_BF16_VEC vy0 = GGML_BF16_VEC_LOAD(y + i); - GGML_BF16_VEC vy1 = GGML_BF16_VEC_LOAD(y + i + 8); - GGML_BF16_FMA_LO(sum[0], vx0, vy0); - GGML_BF16_FMA_HI(sum[1], vx0, vy0); - GGML_BF16_FMA_LO(sum[2], vx1, vy1); - GGML_BF16_FMA_HI(sum[3], vx1, vy1); - } - GGML_F32x4_REDUCE_4(sumf, sum[0], sum[1], sum[2], sum[3]); - } -#endif - for (; i < n; ++i) { sumf += (ggml_float)(GGML_BF16_TO_FP32(x[i]) * GGML_BF16_TO_FP32(y[i])); diff --git a/ggml/src/ggml-cuda/CMakeLists.txt b/ggml/src/ggml-cuda/CMakeLists.txt index d313c1a..67af1d8 100644 --- a/ggml/src/ggml-cuda/CMakeLists.txt +++ b/ggml/src/ggml-cuda/CMakeLists.txt @@ -15,7 +15,6 @@ if (CUDAToolkit_FOUND) # 80 == Ampere, asynchronous data loading, faster tensor core instructions # 86 == RTX 3000, needs CUDA v11.1 # 89 == RTX 4000, needs CUDA v11.8 - # 120 == Blackwell, needs CUDA v12.8, FP4 tensor cores # # XX-virtual == compile CUDA code as PTX, do JIT compilation to binary code on first run # XX-real == compile CUDA code as device code for this specific architecture @@ -35,69 +34,12 @@ if (CUDAToolkit_FOUND) if (CUDAToolkit_VERSION VERSION_GREATER_EQUAL "11.8") list(APPEND CMAKE_CUDA_ARCHITECTURES 89-real) endif() - - if (CUDAToolkit_VERSION VERSION_GREATER_EQUAL "12.8") - # The CUDA architecture 120f-virtual would in principle work for Blackwell support - # but the newly added "f" suffix conflicted with a preexising regex for validating CUDA architectures in CMake. - # So either a recent CMake version or one with the backported fix is needed. - # The following versions should work: - # - CMake >= v3.31.8 && CMake < v4.0.0 - # - CMake >= v4.0.2 - # This is NOT documented in the CMake release notes, - # check Modules/Internal/CMakeCUDAArchitecturesValidate.cmake in the CMake git repository instead. - # However, the architectures 120a-real and 121a-real should work with basically any CMake version and - # until the release of e.g. Rubin there is no benefit to shipping virtual architectures for Blackwell. - list(APPEND CMAKE_CUDA_ARCHITECTURES 120a-real) - endif() - if (CUDAToolkit_VERSION VERSION_GREATER_EQUAL "12.9") - list(APPEND CMAKE_CUDA_ARCHITECTURES 121a-real) - endif() endif() endif() + message(STATUS "Using CUDA architectures: ${CMAKE_CUDA_ARCHITECTURES}") enable_language(CUDA) - # TODO: Remove once CCCL 3.2 has been released and bundled with CUDA Toolkit - if (GGML_CUDA_CUB_3DOT2) - include(FetchContent) - - FetchContent_Declare( - CCCL - GIT_REPOSITORY https://github.com/nvidia/cccl.git - GIT_TAG v3.2.0-rc2 - GIT_SHALLOW TRUE - ) - - FetchContent_MakeAvailable(CCCL) - endif() - - # Replace any plain 12X CUDA architectures with their "architecture-specific" equivalents 12Xa. - # 12X is forwards-compatible, 12Xa is not. - # Notably the Blackwell FP4 tensor core instructions are not forwards compatible and therefore need 12Xa. - # But while 12X vs. 12Xa can be checked in device code there is (to my knowledge) no easy way to do the same check in host code. - # So for now just replace all instances of 12X with 12Xa, this should be fine until Rubin is released. - foreach(ARCHS IN ITEMS CMAKE_CUDA_ARCHITECTURES CMAKE_CUDA_ARCHITECTURES_NATIVE) - set(FIXED_ARCHS "") - foreach(ARCH IN LISTS ${ARCHS}) - if (ARCH MATCHES "^12[0-9](-real|-virtual)?$") - string(REGEX REPLACE "^(12[0-9])((-real|-virtual)?)$" "\\1a\\2" FIXED_ARCH ${ARCH}) - message(STATUS "Replacing ${ARCH} in ${ARCHS} with ${FIXED_ARCH}") - list(APPEND FIXED_ARCHS "${FIXED_ARCH}") - else() - list(APPEND FIXED_ARCHS "${ARCH}") - endif() - endforeach() - set(${ARCHS} ${FIXED_ARCHS}) - endforeach() - - # If we try to compile a "native" build it will use the 12X architectures and fail. - # So we should instead use the native architectures as determined by CMake after replacing 12X with 12Xa. - # But if at the time of the build no GPUs are connected at all CMAKE_CUDA_ARCHITECTURES will contain garbage that we should not use. - if (CMAKE_CUDA_ARCHITECTURES STREQUAL "native" AND CMAKE_CUDA_ARCHITECTURES_NATIVE MATCHES "^[0-9]+(a|f)?(-real|-virtual)?(;[0-9]+(a|f)?(-real|-virtual)?|;)*$") - set(CMAKE_CUDA_ARCHITECTURES ${CMAKE_CUDA_ARCHITECTURES_NATIVE}) - endif() - message(STATUS "Using CMAKE_CUDA_ARCHITECTURES=${CMAKE_CUDA_ARCHITECTURES} CMAKE_CUDA_ARCHITECTURES_NATIVE=${CMAKE_CUDA_ARCHITECTURES_NATIVE}") - file(GLOB GGML_HEADERS_CUDA "*.cuh") list(APPEND GGML_HEADERS_CUDA "../../include/ggml-cuda.h") @@ -160,9 +102,6 @@ if (CUDAToolkit_FOUND) # As of 12.3.1 CUDA Toolkit for Windows does not offer a static cublas library target_link_libraries(ggml-cuda PRIVATE CUDA::cudart_static CUDA::cublas) else () - if (GGML_CUDA_CUB_3DOT2) - target_link_libraries(ggml-cuda PRIVATE CCCL::CCCL) - endif() if (CUDAToolkit_VERSION VERSION_GREATER_EQUAL "10.1") target_link_libraries(ggml-cuda PRIVATE CUDA::cudart_static CUDA::cublas_static CUDA::cublasLt_static) else() @@ -170,9 +109,6 @@ if (CUDAToolkit_FOUND) endif() endif() else() - if (GGML_CUDA_CUB_3DOT2) - target_link_libraries(ggml-cuda PRIVATE CCCL::CCCL) - endif() target_link_libraries(ggml-cuda PRIVATE CUDA::cudart CUDA::cublas) endif() @@ -241,10 +177,6 @@ if (CUDAToolkit_FOUND) if (NOT MSVC) list(APPEND CUDA_CXX_FLAGS -Wno-pedantic) - else() - # CCCL 3.2 onwards will require a cpp-standard-compliant preprocessor for MSVC - # https://github.com/NVIDIA/cccl/pull/6827 - list(APPEND CUDA_CXX_FLAGS /Zc:preprocessor) endif() list(JOIN CUDA_CXX_FLAGS " " CUDA_CXX_FLAGS_JOINED) # pass host compiler flags as a single argument diff --git a/ggml/src/ggml-cuda/argsort.cu b/ggml/src/ggml-cuda/argsort.cu index 57c8a99..da9652c 100644 --- a/ggml/src/ggml-cuda/argsort.cu +++ b/ggml/src/ggml-cuda/argsort.cu @@ -22,13 +22,13 @@ static __global__ void init_offsets(int * offsets, const int ncols, const int nr } #ifdef GGML_CUDA_USE_CUB -void argsort_f32_i32_cuda_cub(ggml_cuda_pool & pool, - const float * x, - int * dst, - const int ncols, - const int nrows, - ggml_sort_order order, - cudaStream_t stream) { +static void argsort_f32_i32_cuda_cub(ggml_cuda_pool & pool, + const float * x, + int * dst, + const int ncols, + const int nrows, + ggml_sort_order order, + cudaStream_t stream) { ggml_cuda_pool_alloc temp_indices_alloc(pool, ncols * nrows); ggml_cuda_pool_alloc temp_keys_alloc(pool, ncols * nrows); ggml_cuda_pool_alloc offsets_alloc(pool, nrows + 1); @@ -49,49 +49,28 @@ void argsort_f32_i32_cuda_cub(ggml_cuda_pool & pool, size_t temp_storage_bytes = 0; if (order == GGML_SORT_ORDER_ASC) { - if (nrows == 1) { - DeviceRadixSort::SortPairs(nullptr, temp_storage_bytes, temp_keys, temp_keys, // keys (in-place) - temp_indices, dst, // values (indices) - ncols, 0, sizeof(float) * 8, stream); - } else { - DeviceSegmentedSort::SortPairs(nullptr, temp_storage_bytes, temp_keys, temp_keys, // keys (in-place) - temp_indices, dst, // values (indices) - ncols * nrows, nrows, // num items, num segments - d_offsets, d_offsets + 1, stream); - } + DeviceSegmentedRadixSort::SortPairs(nullptr, temp_storage_bytes, temp_keys, temp_keys, // keys (in-place) + temp_indices, dst, // values (indices) + ncols * nrows, nrows, // num items, num segments + d_offsets, d_offsets + 1, 0, sizeof(float) * 8, // all bits + stream); } else { - if (nrows == 1) { - DeviceRadixSort::SortPairsDescending(nullptr, temp_storage_bytes, temp_keys, temp_keys, // keys (in-place) - temp_indices, dst, // values (indices) - ncols, 0, sizeof(float) * 8, stream); - } else { - DeviceSegmentedSort::SortPairsDescending(nullptr, temp_storage_bytes, temp_keys, temp_keys, temp_indices, - dst, ncols * nrows, nrows, d_offsets, d_offsets + 1, stream); - } + DeviceSegmentedRadixSort::SortPairsDescending(nullptr, temp_storage_bytes, temp_keys, temp_keys, temp_indices, + dst, ncols * nrows, nrows, d_offsets, d_offsets + 1, 0, + sizeof(float) * 8, stream); } ggml_cuda_pool_alloc temp_storage_alloc(pool, temp_storage_bytes); void * d_temp_storage = temp_storage_alloc.get(); if (order == GGML_SORT_ORDER_ASC) { - if (nrows == 1) { - DeviceRadixSort::SortPairs(d_temp_storage, temp_storage_bytes, temp_keys, temp_keys, // keys (in-place) - temp_indices, dst, // values (indices) - ncols, 0, sizeof(float) * 8, stream); - } else { - DeviceSegmentedSort::SortPairs(d_temp_storage, temp_storage_bytes, temp_keys, temp_keys, temp_indices, dst, - ncols * nrows, nrows, d_offsets, d_offsets + 1, stream); - } + DeviceSegmentedRadixSort::SortPairs(d_temp_storage, temp_storage_bytes, temp_keys, temp_keys, temp_indices, dst, + ncols * nrows, nrows, d_offsets, d_offsets + 1, 0, sizeof(float) * 8, + stream); } else { - if (nrows == 1) { - DeviceRadixSort::SortPairsDescending(d_temp_storage, temp_storage_bytes, temp_keys, temp_keys, // keys (in-place) - temp_indices, dst, // values (indices) - ncols, 0, sizeof(float) * 8, stream); - } else { - DeviceSegmentedSort::SortPairsDescending(d_temp_storage, temp_storage_bytes, temp_keys, temp_keys, - temp_indices, dst, ncols * nrows, nrows, d_offsets, d_offsets + 1, - stream); - } + DeviceSegmentedRadixSort::SortPairsDescending(d_temp_storage, temp_storage_bytes, temp_keys, temp_keys, + temp_indices, dst, ncols * nrows, nrows, d_offsets, d_offsets + 1, + 0, sizeof(float) * 8, stream); } } #endif // GGML_CUDA_USE_CUB @@ -162,12 +141,12 @@ static int next_power_of_2(int x) { return n; } -void argsort_f32_i32_cuda_bitonic(const float * x, - int * dst, - const int ncols, - const int nrows, - ggml_sort_order order, - cudaStream_t stream) { +static void argsort_f32_i32_cuda_bitonic(const float * x, + int * dst, + const int ncols, + const int nrows, + ggml_sort_order order, + cudaStream_t stream) { // bitonic sort requires ncols to be power of 2 const int ncols_pad = next_power_of_2(ncols); diff --git a/ggml/src/ggml-cuda/argsort.cuh b/ggml/src/ggml-cuda/argsort.cuh index 22b7306..68a0015 100644 --- a/ggml/src/ggml-cuda/argsort.cuh +++ b/ggml/src/ggml-cuda/argsort.cuh @@ -1,19 +1,3 @@ #include "common.cuh" void ggml_cuda_op_argsort(ggml_backend_cuda_context & ctx, ggml_tensor * dst); - -#ifdef GGML_CUDA_USE_CUB -void argsort_f32_i32_cuda_cub(ggml_cuda_pool & pool, - const float * x, - int * dst, - const int ncols, - const int nrows, - ggml_sort_order order, - cudaStream_t stream); -#endif // GGML_CUDA_USE_CUB -void argsort_f32_i32_cuda_bitonic(const float * x, - int * dst, - const int ncols, - const int nrows, - ggml_sort_order order, - cudaStream_t stream); diff --git a/ggml/src/ggml-cuda/common.cuh b/ggml/src/ggml-cuda/common.cuh index eaaf876..9fcb2f9 100644 --- a/ggml/src/ggml-cuda/common.cuh +++ b/ggml/src/ggml-cuda/common.cuh @@ -50,10 +50,6 @@ #define GGML_CUDA_CC_TURING 750 #define GGML_CUDA_CC_AMPERE 800 #define GGML_CUDA_CC_ADA_LOVELACE 890 -// While BW spans CC 1000, 1100 & 1200, we are integrating Tensor Core instructions available to 1200 family, see -// https://docs.nvidia.com/cutlass/media/docs/cpp/blackwell_functionality.html#blackwell-sm120-gemms -#define GGML_CUDA_CC_BLACKWELL 1200 -#define GGML_CUDA_CC_RUBIN 1300 #define GGML_CUDA_CC_OFFSET_AMD 0x1000000 #define GGML_CUDA_CC_OFFSET_MTHREADS 0x0100000 #define GGML_CUDA_CC_IS_NVIDIA(cc) (cc < GGML_CUDA_CC_OFFSET_MTHREADS) @@ -250,10 +246,6 @@ static const char * cu_get_error_str(CUresult err) { #define AMPERE_MMA_AVAILABLE #endif // !defined(GGML_USE_HIP) && __CUDA_ARCH__ >= GGML_CUDA_CC_AMPERE -#if !defined(GGML_USE_HIP) && __CUDA_ARCH__ >= GGML_CUDA_CC_BLACKWELL && __CUDA_ARCH__ < GGML_CUDA_CC_RUBIN -# define BLACKWELL_MMA_AVAILABLE -#endif // !defined(GGML_USE_HIP) && __CUDA_ARCH__ >= GGML_CUDA_CC_BLACKWELL - #if !defined(GGML_USE_HIP) && __CUDA_ARCH__ >= GGML_CUDA_CC_AMPERE #define CP_ASYNC_AVAILABLE #endif // !defined(GGML_USE_HIP) && __CUDA_ARCH__ >= GGML_CUDA_CC_AMPERE @@ -262,10 +254,6 @@ static const char * cu_get_error_str(CUresult err) { #define FLASH_ATTN_AVAILABLE #endif // !defined(GGML_CUDA_NO_FA) && !(defined(GGML_USE_MUSA) && __MUSA_ARCH__ < 220) -#if defined(TURING_MMA_AVAILABLE) -#define LDMATRIX_TRANS_AVAILABLE -#endif // defined(TURING_MMA_AVAILABLE) - static bool fp16_available(const int cc) { return ggml_cuda_highest_compiled_arch(cc) >= GGML_CUDA_CC_PASCAL || (GGML_CUDA_CC_IS_MTHREADS(cc) && cc >= GGML_CUDA_CC_PH1); @@ -328,11 +316,6 @@ static bool cp_async_available(const int cc) { return GGML_CUDA_CC_IS_NVIDIA(cc) && ggml_cuda_highest_compiled_arch(cc) >= GGML_CUDA_CC_AMPERE; } -static bool blackwell_mma_available(const int cc) { - return GGML_CUDA_CC_IS_NVIDIA(cc) && ggml_cuda_highest_compiled_arch(cc) >= GGML_CUDA_CC_BLACKWELL && - ggml_cuda_highest_compiled_arch(cc) < GGML_CUDA_CC_RUBIN; -} - static constexpr __device__ int ggml_cuda_get_physical_warp_size() { #if defined(GGML_USE_HIP) && (defined(__GFX9__) || defined(__GFX8__)) return 64; @@ -530,86 +513,6 @@ static __device__ __forceinline__ half2 warp_prefix_inclusive_sum(half2 a) { #endif // FP16_AVAILABLE } -enum class block_reduce_method { - MAX, - SUM, -}; - -template -struct block_reduce_policy; - -template -inline constexpr bool is_any = (std::is_same_v || ...); - -template -inline constexpr bool ggml_cuda_dependent_false_v = false; - -template struct block_reduce_policy { - static __device__ T reduce(T val) { - if constexpr(is_any) { - return warp_reduce_sum(val); - } else { - static_assert(ggml_cuda_dependent_false_v, "Unsupported type for block reduce sum"); - } - } - - static __device__ T sentinel() { - if constexpr (std::is_same_v) { - return 0.0f; - } else if constexpr (std::is_same_v) { - return make_float2(0.0f, 0.0f); - } else if constexpr (std::is_same_v) { - return make_half2(0.0f, 0.0f); - } else if constexpr (std::is_same_v) { - return 0; - } else { - static_assert(ggml_cuda_dependent_false_v, "Unsupported type for block reduce sum"); - } - } -}; - -template struct block_reduce_policy { - static __device__ T reduce(T val) { - if constexpr (is_any) { - return warp_reduce_max(val); - } else { - static_assert(ggml_cuda_dependent_false_v, "Unsupported type for block reduce max"); - } - } - - static __device__ T sentinel() { - if constexpr (std::is_same_v) { - return -INFINITY; - } else if constexpr (std::is_same_v) { - return make_half2(-INFINITY, -INFINITY); - } else { - static_assert(ggml_cuda_dependent_false_v, "Unsupported type for block reduce max"); - } - } -}; - -template -static __device__ T block_reduce(T val, T * shared_vals) { - val = block_reduce_policy::reduce(val); - const unsigned int block_size = block_size_template == 0 ? blockDim.x : block_size_template; - if (block_size > WARP_SIZE) { - assert((block_size <= 1024) && (block_size % WARP_SIZE) == 0); - const int warp_id = threadIdx.x / WARP_SIZE; - const int lane_id = threadIdx.x % WARP_SIZE; - if (lane_id == 0) { - shared_vals[warp_id] = val; - } - __syncthreads(); - val = block_reduce_policy::sentinel(); - if (lane_id < (static_cast(block_size) / WARP_SIZE)) { - val = shared_vals[lane_id]; - } - return block_reduce_policy::reduce(val); - } - - return val; -} - static __device__ __forceinline__ half ggml_cuda_hmax(const half a, const half b) { #ifdef FP16_AVAILABLE @@ -798,28 +701,6 @@ static __device__ __forceinline__ float ggml_cuda_e8m0_to_fp32(uint8_t x) { #endif // CUDART_VERSION >= 12050 } -__device__ __forceinline__ uint8_t ggml_cuda_float_to_fp4_e2m1(float x, float e) { - const uint8_t sign_bit = (x < 0.0f) << 3; - float ax = fabsf(x) * e; - - // Positive LUT - static constexpr float pos_lut[8] = { 0.0f, 0.5f, 1.0f, 1.5f, 2.0f, 3.0f, 4.0f, 6.0f }; - - int best_i = 0; - float best_err = fabsf(ax - pos_lut[0]); - -#pragma unroll - for (int i = 1; i < 8; ++i) { - const float err = fabsf(ax - pos_lut[i]); - if (err < best_err) { - best_err = err; - best_i = i; - } - } - - return static_cast(best_i | sign_bit); -} - // See https://gmplib.org/~tege/divcnst-pldi94.pdf figure 4.1. // Precompute mp (m' in the paper) and L such that division // can be computed using a multiply (high 32b of 64b result) @@ -1034,16 +915,15 @@ struct ggml_cuda_device_info { int device_count; struct cuda_device_info { - int cc; // compute capability - int nsm; // number of streaming multiprocessors - size_t smpb; // max. shared memory per block - size_t smpbo; // max. shared memory per block (with opt-in) - bool integrated; // Device is integrated as opposed to discrete - bool vmm; // virtual memory support - size_t vmm_granularity; // granularity of virtual memory + int cc; // compute capability + int nsm; // number of streaming multiprocessors + size_t smpb; // max. shared memory per block + size_t smpbo; // max. shared memory per block (with opt-in) + bool integrated; // Device is integrated as opposed to discrete + bool vmm; // virtual memory support + size_t vmm_granularity; // granularity of virtual memory size_t total_vram; - int warp_size; // Number of threads in a dispatch - bool supports_cooperative_launch; // whether cooperative launch is supported + int warp_size; // Number of threads in a dispatch }; cuda_device_info devices[GGML_CUDA_MAX_DEVICES] = {}; @@ -1120,7 +1000,7 @@ struct ggml_tensor_extra_gpu { #define USE_CUDA_GRAPH #endif -struct ggml_cuda_graph_node_properties { +struct ggml_graph_node_properties { void * node_address; ggml_op node_op; int64_t ne[GGML_MAX_DIMS]; @@ -1143,27 +1023,12 @@ struct ggml_cuda_graph { cudaGraphExec_t instance = nullptr; size_t num_nodes = 0; std::vector nodes; + std::vector params; bool disable_due_to_gpu_arch = false; bool disable_due_to_too_many_updates = false; + bool disable_due_to_failed_graph_capture = false; int number_consecutive_updates = 0; - std::vector props; - - void record_update(bool use_graph, bool update_required) { - if (use_graph && update_required) { - number_consecutive_updates++; - } else { - number_consecutive_updates = 0; - } - if (number_consecutive_updates >= 4) { - GGML_LOG_DEBUG("%s: disabling CUDA graphs due to too many consecutive updates\n", __func__); - disable_due_to_too_many_updates = true; - } - } - - bool is_enabled() const { - static const bool disable_cuda_graphs_due_to_env = (getenv("GGML_CUDA_DISABLE_GRAPHS") != nullptr); - return !(disable_due_to_gpu_arch || disable_cuda_graphs_due_to_env || disable_due_to_too_many_updates); - } + std::vector ggml_graph_properties; #endif }; diff --git a/ggml/src/ggml-cuda/cpy.cu b/ggml/src/ggml-cuda/cpy.cu index ee84303..c4ceb4f 100644 --- a/ggml/src/ggml-cuda/cpy.cu +++ b/ggml/src/ggml-cuda/cpy.cu @@ -12,11 +12,11 @@ const int CUDA_CPY_BLOCK_NM = 8; // block size of 3rd dimension if available const int CUDA_CPY_BLOCK_ROWS = 8; // block dimension for marching through rows template -static __global__ void cpy_scalar(const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, const int64_t nb10, const int64_t nb11, - const int64_t nb12, const int64_t nb13) { - const int64_t i = (int64_t)blockDim.x*blockIdx.x + threadIdx.x; +static __global__ void cpy_scalar(const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, const int nb10, const int nb11, + const int nb12, const int nb13) { + const int64_t i = blockDim.x*blockIdx.x + threadIdx.x; if (i >= ne) { return; @@ -40,10 +40,10 @@ static __global__ void cpy_scalar(const char * cx, char * cdst, const int64_t ne } template -static __global__ void cpy_scalar_transpose(const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, const int64_t nb10, const int64_t nb11, - const int64_t nb12, const int64_t nb13) { +static __global__ void cpy_scalar_transpose(const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, const int nb10, const int nb11, + const int nb12, const int nb13) { const T* src = reinterpret_cast(cx); T* dst = reinterpret_cast(cdst); @@ -117,60 +117,60 @@ static __device__ void cpy_blck_q_f32(const char * cxi, char * cdsti) { } template -static __global__ void cpy_f32_q(const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, const int64_t nb10, const int64_t nb11, - const int64_t nb12, const int64_t nb13) { - const int64_t i = ((int64_t)blockDim.x*blockIdx.x + threadIdx.x)*qk; +static __global__ void cpy_f32_q(const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, const int nb10, const int nb11, + const int nb12, const int nb13) { + const int i = (blockDim.x*blockIdx.x + threadIdx.x)*qk; if (i >= ne) { return; } - const int64_t i03 = i/(ne00 * ne01 * ne02); - const int64_t i02 = (i - i03*ne00*ne01*ne02 )/ (ne00*ne01); - const int64_t i01 = (i - i03*ne00*ne01*ne02 - i02*ne01*ne00) / ne00; - const int64_t i00 = i - i03*ne00*ne01*ne02 - i02*ne01*ne00 - i01*ne00; - const int64_t x_offset = i00*nb00 + i01*nb01 + i02*nb02 + i03 * nb03; + const int i03 = i/(ne00 * ne01 * ne02); + const int i02 = (i - i03*ne00*ne01*ne02 )/ (ne00*ne01); + const int i01 = (i - i03*ne00*ne01*ne02 - i02*ne01*ne00) / ne00; + const int i00 = i - i03*ne00*ne01*ne02 - i02*ne01*ne00 - i01*ne00; + const int x_offset = i00*nb00 + i01*nb01 + i02*nb02 + i03 * nb03; - const int64_t i13 = i/(ne10 * ne11 * ne12); - const int64_t i12 = (i - i13*ne10*ne11*ne12) / (ne10*ne11); - const int64_t i11 = (i - i13*ne10*ne11*ne12 - i12*ne10*ne11) / ne10; - const int64_t i10 = i - i13*ne10*ne11*ne12 - i12*ne10*ne11 - i11*ne10; - const int64_t dst_offset = (i10/qk)*nb10 + i11*nb11 + i12*nb12 + i13*nb13; + const int i13 = i/(ne10 * ne11 * ne12); + const int i12 = (i - i13*ne10*ne11*ne12) / (ne10*ne11); + const int i11 = (i - i13*ne10*ne11*ne12 - i12*ne10*ne11) / ne10; + const int i10 = i - i13*ne10*ne11*ne12 - i12*ne10*ne11 - i11*ne10; + const int dst_offset = (i10/qk)*nb10 + i11*nb11 + i12*nb12 + i13*nb13; cpy_blck(cx + x_offset, cdst + dst_offset); } template -static __global__ void cpy_q_f32(const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, const int64_t nb10, const int64_t nb11, - const int64_t nb12, const int64_t nb13) { - const int64_t i = ((int64_t)blockDim.x*blockIdx.x + threadIdx.x)*qk; +static __global__ void cpy_q_f32(const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, const int nb10, const int nb11, + const int nb12, const int nb13) { + const int i = (blockDim.x*blockIdx.x + threadIdx.x)*qk; if (i >= ne) { return; } - const int64_t i03 = i/(ne00 * ne01 * ne02); - const int64_t i02 = (i - i03*ne00*ne01*ne02 )/ (ne00*ne01); - const int64_t i01 = (i - i03*ne00*ne01*ne02 - i02*ne01*ne00) / ne00; - const int64_t i00 = i - i03*ne00*ne01*ne02 - i02*ne01*ne00 - i01*ne00; - const int64_t x_offset = (i00/qk)*nb00 + i01*nb01 + i02*nb02 + i03 * nb03; + const int i03 = i/(ne00 * ne01 * ne02); + const int i02 = (i - i03*ne00*ne01*ne02 )/ (ne00*ne01); + const int i01 = (i - i03*ne00*ne01*ne02 - i02*ne01*ne00) / ne00; + const int i00 = i - i03*ne00*ne01*ne02 - i02*ne01*ne00 - i01*ne00; + const int x_offset = (i00/qk)*nb00 + i01*nb01 + i02*nb02 + i03 * nb03; - const int64_t i13 = i/(ne10 * ne11 * ne12); - const int64_t i12 = (i - i13*ne10*ne11*ne12) / (ne10*ne11); - const int64_t i11 = (i - i13*ne10*ne11*ne12 - i12*ne10*ne11) / ne10; - const int64_t i10 = i - i13*ne10*ne11*ne12 - i12*ne10*ne11 - i11*ne10; - const int64_t dst_offset = i10*nb10 + i11*nb11 + i12*nb12 + i13*nb13; + const int i13 = i/(ne10 * ne11 * ne12); + const int i12 = (i - i13*ne10*ne11*ne12) / (ne10*ne11); + const int i11 = (i - i13*ne10*ne11*ne12 - i12*ne10*ne11) / ne10; + const int i10 = i - i13*ne10*ne11*ne12 - i12*ne10*ne11 - i11*ne10; + const int dst_offset = i10*nb10 + i11*nb11 + i12*nb12 + i13*nb13; cpy_blck(cx + x_offset, cdst + dst_offset); } template static __global__ void cpy_scalar_contiguous(const char * cx, char * cdst, const int64_t ne) { - const int64_t i = (int64_t)blockDim.x*blockIdx.x + threadIdx.x; + const int64_t i = blockDim.x*blockIdx.x + threadIdx.x; if (i >= ne) { return; @@ -188,20 +188,19 @@ static void ggml_cpy_scalar_contiguous_cuda( cudaStream_t stream) { const int64_t num_blocks = (ne + CUDA_CPY_BLOCK_SIZE - 1) / CUDA_CPY_BLOCK_SIZE; - GGML_ASSERT(num_blocks < UINT_MAX); cpy_scalar_contiguous<<>> (cx, cdst, ne); } template static void ggml_cpy_scalar_cuda( - const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, const int64_t nb10, const int64_t nb11, const int64_t nb12, const int64_t nb13, cudaStream_t stream) { + const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, const int nb10, const int nb11, const int nb12, const int nb13, cudaStream_t stream) { if (transposed) { GGML_ASSERT(ne == ne00*ne01*ne02); // ne[3] is 1 assumed - int64_t ne00n, ne01n, ne02n; + int ne00n, ne01n, ne02n; if (nb00 <= nb02) { // most likely safe to handle nb00 = nb02 case here ne00n = ne00; ne01n = ne01; @@ -212,159 +211,143 @@ static void ggml_cpy_scalar_cuda( ne02n = 1; } - int64_t grid_x = (ne01n + CUDA_CPY_TILE_DIM_2D - 1) / CUDA_CPY_TILE_DIM_2D; - int64_t grid_y = (ne00n + CUDA_CPY_TILE_DIM_2D - 1) / CUDA_CPY_TILE_DIM_2D; - int64_t grid_z = (ne/(ne01n*ne00n) + CUDA_CPY_BLOCK_NM - 1) / CUDA_CPY_BLOCK_NM; - GGML_ASSERT(grid_x < UINT_MAX); - GGML_ASSERT(grid_y < USHRT_MAX); - GGML_ASSERT(grid_z < USHRT_MAX); - dim3 dimGrid(grid_x, grid_y, grid_z); + dim3 dimGrid( (ne01n + CUDA_CPY_TILE_DIM_2D - 1) / CUDA_CPY_TILE_DIM_2D, + (ne00n + CUDA_CPY_TILE_DIM_2D - 1) / CUDA_CPY_TILE_DIM_2D, + (ne/(ne01n*ne00n) + CUDA_CPY_BLOCK_NM - 1) / CUDA_CPY_BLOCK_NM); dim3 dimBlock(CUDA_CPY_TILE_DIM_2D, CUDA_CPY_BLOCK_ROWS, 1); cpy_scalar_transpose<<>> (cx, cdst, ne, ne00n, ne01n, ne02n, nb00, nb01, nb02, nb03, ne10, ne11, ne12, nb10, nb11, nb12, nb13); } else { - const int64_t num_blocks = (ne + CUDA_CPY_BLOCK_SIZE - 1) / CUDA_CPY_BLOCK_SIZE; - GGML_ASSERT(num_blocks < UINT_MAX); + const int num_blocks = (ne + CUDA_CPY_BLOCK_SIZE - 1) / CUDA_CPY_BLOCK_SIZE; cpy_scalar><<>> (cx, cdst, ne, ne00, ne01, ne02, nb00, nb01, nb02, nb03, ne10, ne11, ne12, nb10, nb11, nb12, nb13); } } static void ggml_cpy_f32_q8_0_cuda( - const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, const int64_t nb10, const int64_t nb11, const int64_t nb12, const int64_t nb13, cudaStream_t stream) { + const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, const int nb10, const int nb11, const int nb12, const int nb13, cudaStream_t stream) { GGML_ASSERT(ne % QK8_0 == 0); - const int64_t num_blocks = ne / QK8_0; - GGML_ASSERT(num_blocks < UINT_MAX); + const int num_blocks = ne / QK8_0; cpy_f32_q<<>> (cx, cdst, ne, ne00, ne01, ne02, nb00, nb01, nb02, nb03, ne10, ne11, ne12, nb10, nb11, nb12, nb13); } static void ggml_cpy_q8_0_f32_cuda( - const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, const int64_t nb10, const int64_t nb11, const int64_t nb12, const int64_t nb13, cudaStream_t stream) { + const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, const int nb10, const int nb11, const int nb12, const int nb13, cudaStream_t stream) { - const int64_t num_blocks = ne; - GGML_ASSERT(num_blocks < UINT_MAX); + const int num_blocks = ne; cpy_q_f32<<>> (cx, cdst, ne, ne00, ne01, ne02, nb00, nb01, nb02, nb03, ne10, ne11, ne12, nb10, nb11, nb12, nb13); } static void ggml_cpy_f32_q4_0_cuda( - const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, const int64_t nb10, const int64_t nb11, const int64_t nb12, const int64_t nb13, cudaStream_t stream) { + const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, const int nb10, const int nb11, const int nb12, const int nb13, cudaStream_t stream) { GGML_ASSERT(ne % QK4_0 == 0); - const int64_t num_blocks = ne / QK4_0; - GGML_ASSERT(num_blocks < UINT_MAX); + const int num_blocks = ne / QK4_0; cpy_f32_q<<>> (cx, cdst, ne, ne00, ne01, ne02, nb00, nb01, nb02, nb03, ne10, ne11, ne12, nb10, nb11, nb12, nb13); } static void ggml_cpy_q4_0_f32_cuda( - const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, - const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, - const int64_t nb10, const int64_t nb11, const int64_t nb12, const int64_t nb13, + const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, + const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, + const int nb10, const int nb11, const int nb12, const int nb13, cudaStream_t stream) { - const int64_t num_blocks = ne; - GGML_ASSERT(num_blocks < UINT_MAX); + const int num_blocks = ne; cpy_q_f32, QK4_0><<>>( cx, cdst, ne, ne00, ne01, ne02, nb00, nb01, nb02, nb03, ne10, ne11, ne12, nb10, nb11, nb12, nb13); } static void ggml_cpy_f32_q4_1_cuda( - const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, const int64_t nb10, const int64_t nb11, const int64_t nb12, const int64_t nb13, cudaStream_t stream) { + const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, const int nb10, const int nb11, const int nb12, const int nb13, cudaStream_t stream) { GGML_ASSERT(ne % QK4_1 == 0); - const int64_t num_blocks = ne / QK4_1; - GGML_ASSERT(num_blocks < UINT_MAX); + const int num_blocks = ne / QK4_1; cpy_f32_q<<>> (cx, cdst, ne, ne00, ne01, ne02, nb00, nb01, nb02, nb03, ne10, ne11, ne12, nb10, nb11, nb12, nb13); } static void ggml_cpy_q4_1_f32_cuda( - const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, - const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, - const int64_t nb10, const int64_t nb11, const int64_t nb12, const int64_t nb13, + const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, + const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, + const int nb10, const int nb11, const int nb12, const int nb13, cudaStream_t stream) { - const int64_t num_blocks = ne; - GGML_ASSERT(num_blocks < UINT_MAX); + const int num_blocks = ne; cpy_q_f32, QK4_1><<>>( cx, cdst, ne, ne00, ne01, ne02, nb00, nb01, nb02, nb03, ne10, ne11, ne12, nb10, nb11, nb12, nb13); } static void ggml_cpy_f32_q5_0_cuda( - const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, const int64_t nb10, const int64_t nb11, const int64_t nb12, const int64_t nb13, cudaStream_t stream) { + const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, const int nb10, const int nb11, const int nb12, const int nb13, cudaStream_t stream) { GGML_ASSERT(ne % QK5_0 == 0); - const int64_t num_blocks = ne / QK5_0; - GGML_ASSERT(num_blocks < UINT_MAX); + const int num_blocks = ne / QK5_0; cpy_f32_q<<>> (cx, cdst, ne, ne00, ne01, ne02, nb00, nb01, nb02, nb03, ne10, ne11, ne12, nb10, nb11, nb12, nb13); } static void ggml_cpy_q5_0_f32_cuda( - const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, - const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, - const int64_t nb10, const int64_t nb11, const int64_t nb12, const int64_t nb13, + const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, + const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, + const int nb10, const int nb11, const int nb12, const int nb13, cudaStream_t stream) { - const int64_t num_blocks = ne; - GGML_ASSERT(num_blocks < UINT_MAX); + const int num_blocks = ne; cpy_q_f32, QK5_0><<>>( cx, cdst, ne, ne00, ne01, ne02, nb00, nb01, nb02, nb03, ne10, ne11, ne12, nb10, nb11, nb12, nb13); } static void ggml_cpy_f32_q5_1_cuda( - const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, const int64_t nb10, const int64_t nb11, const int64_t nb12, const int64_t nb13, cudaStream_t stream) { + const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, const int nb10, const int nb11, const int nb12, const int nb13, cudaStream_t stream) { GGML_ASSERT(ne % QK5_1 == 0); - const int64_t num_blocks = ne / QK5_1; - GGML_ASSERT(num_blocks < UINT_MAX); + const int num_blocks = ne / QK5_1; cpy_f32_q<<>> (cx, cdst, ne, ne00, ne01, ne02, nb00, nb01, nb02, nb03, ne10, ne11, ne12, nb10, nb11, nb12, nb13); } static void ggml_cpy_q5_1_f32_cuda( - const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, - const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, - const int64_t nb10, const int64_t nb11, const int64_t nb12, const int64_t nb13, + const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, + const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, + const int nb10, const int nb11, const int nb12, const int nb13, cudaStream_t stream) { - const int64_t num_blocks = ne; - GGML_ASSERT(num_blocks < UINT_MAX); + const int num_blocks = ne; cpy_q_f32, QK5_1><<>>( cx, cdst, ne, ne00, ne01, ne02, nb00, nb01, nb02, nb03, ne10, ne11, ne12, nb10, nb11, nb12, nb13); } static void ggml_cpy_f32_iq4_nl_cuda( - const char * cx, char * cdst, const int64_t ne, - const int64_t ne00, const int64_t ne01, const int64_t ne02, const int64_t nb00, const int64_t nb01, const int64_t nb02, - const int64_t nb03, const int64_t ne10, const int64_t ne11, const int64_t ne12, const int64_t nb10, const int64_t nb11, const int64_t nb12, const int64_t nb13, cudaStream_t stream) { + const char * cx, char * cdst, const int ne, + const int ne00, const int ne01, const int ne02, const int nb00, const int nb01, const int nb02, + const int nb03, const int ne10, const int ne11, const int ne12, const int nb10, const int nb11, const int nb12, const int nb13, cudaStream_t stream) { GGML_ASSERT(ne % QK4_NL == 0); - const int64_t num_blocks = ne / QK4_NL; - GGML_ASSERT(num_blocks < UINT_MAX); + const int num_blocks = ne / QK4_NL; cpy_f32_q<<>> (cx, cdst, ne, ne00, ne01, ne02, nb00, nb01, nb02, nb03, ne10, ne11, ne12, nb10, nb11, nb12, nb13); } @@ -373,6 +356,9 @@ void ggml_cuda_cpy(ggml_backend_cuda_context & ctx, const ggml_tensor * src0, gg const int64_t ne = ggml_nelements(src0); GGML_ASSERT(ne == ggml_nelements(src1)); + GGML_ASSERT(ggml_nbytes(src0) <= INT_MAX); + GGML_ASSERT(ggml_nbytes(src1) <= INT_MAX); + const int64_t ne00 = src0->ne[0]; const int64_t ne01 = src0->ne[1]; const int64_t ne02 = src0->ne[2]; diff --git a/ggml/src/ggml-cuda/cumsum.cu b/ggml/src/ggml-cuda/cumsum.cu index def9c32..d2f2def 100644 --- a/ggml/src/ggml-cuda/cumsum.cu +++ b/ggml/src/ggml-cuda/cumsum.cu @@ -5,7 +5,7 @@ #include "ggml.h" #ifdef GGML_CUDA_USE_CUB -# include +# include #endif // GGML_CUDA_USE_CUB template @@ -16,14 +16,12 @@ static __global__ void cumsum_cub_kernel( const int64_t s01, const int64_t s02, const int64_t s03, const int64_t s1, const int64_t s2, const int64_t s3) { #ifdef GGML_CUDA_USE_CUB - using BlockScanT = cub::BlockScan; + using BlockScan = cub::BlockScan; - __shared__ typename BlockScanT::TempStorage temp_storage; - __shared__ T block_carry; + __shared__ typename BlockScan::TempStorage temp_storage; + __shared__ T block_carry; // carry from previous tile const int tid = threadIdx.x; - constexpr int UNROLL_FACTOR = 4; - constexpr int TILE_SIZE = BLOCK_SIZE * UNROLL_FACTOR; const int64_t i1 = blockIdx.x; const int64_t i2 = blockIdx.y; @@ -41,47 +39,37 @@ static __global__ void cumsum_cub_kernel( } __syncthreads(); - for (int64_t start = 0; start < ne00; start += TILE_SIZE) { - T items[UNROLL_FACTOR]; - T thread_sum = T(0); + for (int64_t start = 0; start < ne00; start += BLOCK_SIZE) { + int64_t idx = start + tid; + T x = (idx < ne00) ? src_row[idx] : T(0); -#pragma unroll - for (int i = 0; i < UNROLL_FACTOR; i++) { - int64_t idx = start + tid * UNROLL_FACTOR + i; - T val = (idx < ne00) ? src_row[idx] : T(0); - thread_sum += val; - items[i] = thread_sum; - } - - // Block-wide scan on thread sums - T thread_prefix; + T inclusive; T block_total; - BlockScanT(temp_storage).InclusiveSum(thread_sum, thread_prefix, block_total); + BlockScan(temp_storage).InclusiveSum(x, inclusive, block_total); + __syncthreads(); - // Add offset to each item and store - T thread_offset = thread_prefix - thread_sum + block_carry; -#pragma unroll - for (int i = 0; i < UNROLL_FACTOR; i++) { - int64_t idx = start + tid * UNROLL_FACTOR + i; - if (idx < ne00) { - dst_row[idx] = items[i] + thread_offset; - } + T final_val = inclusive + block_carry; + + // store result + if (idx < ne00) { + dst_row[idx] = final_val; } __syncthreads(); - // Update carry for next tile if (tid == 0) { block_carry += block_total; } + + __syncthreads(); } #else NO_DEVICE_CODE; #endif // GGML_CUDA_USE_CUB } -// Fallback kernel implementation +// Fallback kernel implementation (original) template static __global__ void cumsum_kernel( const T * src, T * dst, @@ -98,10 +86,10 @@ static __global__ void cumsum_kernel( const int warps_per_block = blockDim.x / warp_size; extern __shared__ float smem[]; - float * s_vals = smem; - float * s_warp_sums = smem + blockDim.x; - float * s_carry = smem + blockDim.x + warps_per_block; - float * s_chunk_total = s_carry + 1; + float * s_vals = smem; + float * s_warp_sums = smem + blockDim.x; + float * s_carry = smem + blockDim.x + warps_per_block; + float * s_chunk_total = s_carry + 1; // Initialize carry if (tid == 0) { @@ -119,39 +107,21 @@ static __global__ void cumsum_kernel( const T * src_row = src + i1 * s01 + i2 * s02 + i3 * s03; T * dst_row = dst + i1 * s1 + i2 * s2 + i3 * s3; - // register blocking: process 4 elements per thread to hide latency - // and reduce synchronization overhead - constexpr int num_unroll = 4; - T temp[num_unroll]; + for (int64_t start = 0; start < ne00; start += blockDim.x) { + int64_t idx = start + tid; + float val = (idx < ne00) ? ggml_cuda_cast(src_row[idx]) : 0.0f; - for (int64_t i = 0; i < ne00; i += num_unroll * blockDim.x) { - int64_t idx = i + tid * num_unroll; - - // thread local sequential scan - temp[0] = (idx < ne00 ? src_row[idx] : T(0)); -#pragma unroll - for (int64_t j = 1; j < num_unroll; j++) { - temp[j] = temp[j - 1]; - if (idx + j < ne00) { - temp[j] += src_row[idx + j]; - } else { - temp[j] += 0; - } - } - - // last emenent is sum of all values assigned to thread - float val = (idx < ne00) ? ggml_cuda_cast(temp[num_unroll - 1]) : 0.0f; - - // Warp inclusive scan + // 1. Warp inclusive scan val = warp_prefix_inclusive_sum(val); s_vals[tid] = val; + // Store warp total if (lane == warp_size - 1) { s_warp_sums[warp] = val; } __syncthreads(); - // Exclusive scan of warp sums (warp 0 only) + // 2. Exclusive scan of warp sums (warp 0 only) if (warp == 0) { float w = (tid < warps_per_block) ? s_warp_sums[tid] : 0.0f; float inc = warp_prefix_inclusive_sum(w); @@ -164,55 +134,24 @@ static __global__ void cumsum_kernel( } __syncthreads(); - // write back results float carry = *s_carry; - // calculate sum offset for this thread - float final_val_offset = s_vals[tid] + s_warp_sums[warp] + carry - temp[num_unroll - 1]; - -#pragma unroll - for (int32_t j = 0; j < num_unroll; j++) { - if (idx + j < ne00) { - dst_row[idx + j] = temp[j] + ggml_cuda_cast(final_val_offset); - } + float final_val = s_vals[tid] + s_warp_sums[warp] + carry; + if (idx < ne00) { + dst_row[idx] = ggml_cuda_cast(final_val); } - __syncthreads(); // Update carry for next chunk if (tid == 0) { *s_carry += *s_chunk_total; } + __syncthreads(); } } -#ifdef GGML_CUDA_USE_CUB -template -static void cumsum_cub(ggml_cuda_pool & pool, - const T * src, - T * dst, - int64_t ne, - cudaStream_t stream) { - size_t tmp_size = 0; - - // Query how much temp storage CUDA UnBound (CUB) needs - cub::DeviceScan::InclusiveSum(nullptr, // d_temp_storage (null = just query size) - tmp_size, // reference to size (will be set by CUB) - src, // input pointer - dst, // output pointer - ne, // number of elements - stream // CUDA stream to use - ); - - ggml_cuda_pool_alloc tmp_alloc(pool, tmp_size); - - // Perform the inclusive scan - cub::DeviceScan::InclusiveSum((void *) tmp_alloc.get(), tmp_size, src, dst, ne, stream); -} -#endif // GGML_CUDA_USE_CUB - template static void cumsum_cuda( - [[maybe_unused]] ggml_backend_cuda_context & ctx, const T * src, T * dst, + const T * src, T * dst, const int64_t ne00, const int64_t ne01, const int64_t ne02, const int64_t ne03, const int64_t nb00, const int64_t nb01, const int64_t nb02, const int64_t nb03, const int64_t nb0, const int64_t nb1, const int64_t nb2, const int64_t nb3, @@ -226,15 +165,6 @@ static void cumsum_cuda( if (is_contiguous) { use_cub = true; - const int64_t nrows = ne01 * ne02 * ne03; - // TODO: Compare with DeviceSegmentedScan::InclusiveSegmentedSum for nrows > 1 once InclusiveSegmentedSum is released - // Heuristics were determined as part of https://github.com/ggml-org/llama.cpp/pull/17004 - if (((nrows == 1) && (ne00 > 1024)) || (ne00 / nrows > 4096)) { - for (int i=0; i= 1024) { + if (use_cub) { cumsum_cub_kernel<<>>( src, dst, ne00, ne01, ne02, ne03, @@ -273,7 +203,7 @@ void ggml_cuda_op_cumsum(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { case GGML_TYPE_F32: { cumsum_cuda( - ctx, (const float *)src0->data, (float *)dst->data, + (const float *)src0->data, (float *)dst->data, src0->ne[0], src0->ne[1], src0->ne[2], src0->ne[3], src0->nb[0], src0->nb[1], src0->nb[2], src0->nb[3], dst->nb[0], dst->nb[1], dst->nb[2], dst->nb[3], diff --git a/ggml/src/ggml-cuda/fattn-common.cuh b/ggml/src/ggml-cuda/fattn-common.cuh index 8468ba8..8dc82a9 100644 --- a/ggml/src/ggml-cuda/fattn-common.cuh +++ b/ggml/src/ggml-cuda/fattn-common.cuh @@ -11,12 +11,10 @@ #define SOFTMAX_FTZ_THRESHOLD -20.0f // Softmax exp. of values smaller than this are flushed to zero to avoid NaNs. // log(2) = 0.6931, by adding this to the KQ maximum used for the softmax the numerical range representable -// by the VKQ accumulators is effectively being shifted up by a factor of 2. +// by the VKQ accumulators is effectively being shifted up by a factor of 8. // This reduces issues with numerical overflow but also causes larger values to be flushed to zero. // However, as the output from FlashAttention will usually be used as an input for a matrix multiplication this should be negligible. -// Still, the value range should be shifted as much as necessary but as little as possible. -// The macro on the following line shifts it by a factor of 2**3=8, as was needed to fix https://github.com/ggml-org/llama.cpp/issues/18606 . -#define FATTN_KQ_MAX_OFFSET (3.0f*0.6931f) +#define FATTN_KQ_MAX_OFFSET 0.6931f typedef void (* fattn_kernel_t)( const char * __restrict__ Q, @@ -59,7 +57,7 @@ static __device__ __forceinline__ float vec_dot_fattn_vec_KQ_f16( #pragma unroll for (int k_KQ_0 = 0; k_KQ_0 < D/2; k_KQ_0 += nthreads*cpy_ne) { - __align__(16) half2 tmp[cpy_ne]; + half2 tmp[cpy_ne]; ggml_cuda_memcpy_1(tmp, K_h2 + k_KQ_0 + (threadIdx.x % nthreads)*cpy_ne); #pragma unroll for (int k_KQ_1 = 0; k_KQ_1 < cpy_ne; ++k_KQ_1) { @@ -309,7 +307,7 @@ static __device__ __forceinline__ void dequantize_V_f16(const void * __restrict_ ggml_cuda_memcpy_1(dst, (const half *) vx + i0); } else if constexpr (std::is_same_v) { static_assert(ne % 2 == 0, "bad ne"); - __align__(16) half2 tmp[ne/2]; + half2 tmp[ne/2]; ggml_cuda_memcpy_1(tmp, (const half *) vx + i0); float2 * dst_f2 = (float2 *) dst; #pragma unroll @@ -914,15 +912,13 @@ void launch_fattn( const int nblocks_stream_k = max_blocks; - const bool use_stream_k = cc >= GGML_CUDA_CC_ADA_LOVELACE || amd_wmma_available(cc) || tiles_efficiency_percent < 75; + const bool use_stream_k = cc >= GGML_CUDA_CC_ADA_LOVELACE || tiles_efficiency_percent < 75; blocks_num.x = use_stream_k ? nblocks_stream_k : ntiles_total; blocks_num.y = 1; blocks_num.z = 1; - if (ntiles_total % blocks_num.x != 0) { // Fixup is only needed if the SMs work on fractional tiles. - dst_tmp_meta.alloc((size_t(blocks_num.x) * ncols * (2 + DV/2))); - } + dst_tmp_meta.alloc(blocks_num.x*ncols * (2*2 + DV) * sizeof(float)); } else { const int ntiles_KQ = (K->ne[1] + nbatch_fa - 1) / nbatch_fa; // Max. number of parallel blocks limited by tensor size. diff --git a/ggml/src/ggml-cuda/fattn-mma-f16.cuh b/ggml/src/ggml-cuda/fattn-mma-f16.cuh index e53bbc0..7bd1044 100644 --- a/ggml/src/ggml-cuda/fattn-mma-f16.cuh +++ b/ggml/src/ggml-cuda/fattn-mma-f16.cuh @@ -98,19 +98,6 @@ static constexpr __host__ __device__ fattn_mma_config ggml_cuda_fattn_mma_get_co return ggml_cuda_fattn_mma_get_config_ampere(DKQ, DV, ncols); } -static constexpr __host__ __device__ fattn_mma_config ggml_cuda_fattn_mma_get_config_rdna(const int DKQ, const int DV, const int ncols) { - GGML_CUDA_FATTN_MMA_CONFIG_CASE(256, 256, 16, 128, 2, 64, 128, 128, 128, 2, true); - GGML_CUDA_FATTN_MMA_CONFIG_CASE(256, 256, 32, 128, 2, 64, 128, 128, 64, 2, true); - GGML_CUDA_FATTN_MMA_CONFIG_CASE(256, 256, 64, 128, 2, 64, 128, 128, 64, 2, true); - - GGML_CUDA_FATTN_MMA_CONFIG_CASE(576, 512, 16, 64, 4, 32, 96, 64, 128, 1, false); - GGML_CUDA_FATTN_MMA_CONFIG_CASE(576, 512, 32, 128, 2, 32, 160, 128, 128, 1, false); - GGML_CUDA_FATTN_MMA_CONFIG_CASE(576, 512, 64, 256, 1, 32, 160, 128, 128, 1, false); - - // TODO tune specifically for RDNA - return ggml_cuda_fattn_mma_get_config_ampere(DKQ, DV, ncols); -} - static __host__ fattn_mma_config ggml_cuda_fattn_mma_get_config(const int DKQ, const int DV, const int ncols, const int cc) { if (ampere_mma_available(cc)) { return ggml_cuda_fattn_mma_get_config_ampere(DKQ, DV, ncols); @@ -118,9 +105,6 @@ static __host__ fattn_mma_config ggml_cuda_fattn_mma_get_config(const int DKQ, c if (turing_mma_available(cc)) { return ggml_cuda_fattn_mma_get_config_turing(DKQ, DV, ncols); } - if (amd_wmma_available(cc)) { - return ggml_cuda_fattn_mma_get_config_rdna(DKQ, DV, ncols); - } GGML_ASSERT(volta_mma_available(cc)); return ggml_cuda_fattn_mma_get_config_volta(DKQ, DV, ncols); } @@ -132,8 +116,6 @@ static constexpr __device__ fattn_mma_config ggml_cuda_fattn_mma_get_config(cons return ggml_cuda_fattn_mma_get_config_turing(DKQ, DV, ncols); #elif defined(VOLTA_MMA_AVAILABLE) return ggml_cuda_fattn_mma_get_config_volta(DKQ, DV, ncols); -#elif defined(AMD_WMMA_AVAILABLE) - return ggml_cuda_fattn_mma_get_config_rdna(DKQ, DV, ncols); #else GGML_UNUSED_VARS(DKQ, DV, ncols); return fattn_mma_config(32, 1, 0, 0, 0, 0, 0, false); @@ -204,23 +186,6 @@ static constexpr __device__ bool ggml_cuda_fattn_mma_get_Q_in_reg(const int DKQ, return ggml_cuda_fattn_mma_get_config(DKQ, DV, ncols).Q_in_reg; } -static constexpr __device__ int get_cols_per_thread() { -#if defined(AMD_WMMA_AVAILABLE) - return 1; // RDNA has a single column. -#else - return 2; // This is specifically KQ columns, Volta only has a single VKQ column. -#endif // defined(AMD_WMMA_AVAILABLE) -} - -static __host__ int get_cols_per_warp(const int cc) { - if (turing_mma_available(cc) || amd_wmma_available(cc)) { - return 16; - } else { - // Volta - return 32; - } -} - // ------------------------------------------------------------------------------------------------------------------ static __host__ int ggml_cuda_fattn_mma_get_nstages(const int DKQ, const int DV, const int ncols1, const int ncols2, const int cc) { @@ -428,10 +393,10 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( const int jt, const int kb0, const int k_VKQ_sup) { -#if defined(VOLTA_MMA_AVAILABLE) || defined(TURING_MMA_AVAILABLE) || (defined(AMD_WMMA_AVAILABLE) && defined(RDNA4)) +#if defined(VOLTA_MMA_AVAILABLE) || defined(TURING_MMA_AVAILABLE) constexpr int ncols = ncols1 * ncols2; constexpr int cols_per_warp = T_B_KQ::I; - constexpr int cols_per_thread = get_cols_per_thread(); + constexpr int cols_per_thread = 2; // This is specifically KQ columns, Volta only has a single VKQ column. constexpr int np = nwarps * (cols_per_warp/ncols2) / ncols1; // Number of parallel CUDA warps per Q column. constexpr int nbatch_fa = ggml_cuda_fattn_mma_get_nbatch_fa(DKQ, DV, ncols); constexpr int nbatch_K2 = ggml_cuda_fattn_mma_get_nbatch_K2(DKQ, DV, ncols); @@ -448,8 +413,6 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( const int k_VKQ_0 = kb0 * nbatch_fa; #if defined(TURING_MMA_AVAILABLE) T_C_KQ KQ_C[nbatch_fa/(np*(cols_per_warp == 8 ? T_C_KQ::I : T_C_KQ::J))]; -#elif defined(AMD_WMMA_AVAILABLE) - T_C_KQ KQ_C[nbatch_fa/(np*T_C_KQ::J)]; #else // Volta T_C_KQ KQ_C[nbatch_fa/(np*T_C_KQ::J)]; #endif // defined(TURING_MMA_AVAILABLE) @@ -498,14 +461,8 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( if constexpr (cols_per_warp == 8) { mma(KQ_C[i_KQ_00/(np*T_A_KQ::I)], K_A, Q_B[k_KQ_0/T_A_KQ::J]); } else { - // Wide version of KQ_C is column-major -#if defined(AMD_WMMA_AVAILABLE) - // RDNA matrix C is column-major. - mma(KQ_C[i_KQ_00/(np*T_A_KQ::I)], K_A, Q_B[k_KQ_0/T_A_KQ::J]); -#else - // swap A and B for CUDA. + // Wide version of KQ_C is column-major => swap A and B. mma(KQ_C[i_KQ_00/(np*T_A_KQ::I)], Q_B[k_KQ_0/T_A_KQ::J], K_A); -#endif // defined(AMD_WMMA_AVAILABLE) } } } @@ -522,14 +479,8 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( T_A_KQ K_A; load_ldmatrix(K_A, tile_K + i_KQ_0*stride_tile_K + (k_KQ_0 - k0_start), stride_tile_K); - // Wide version of KQ_C is column-major -#if defined(AMD_WMMA_AVAILABLE) - // RDNA matrix C is column-major. - mma(KQ_C[i_KQ_00/(np*T_A_KQ::I)], K_A, Q_B[0]); -#else - // swap A and B for CUDA. + // Wide version of KQ_C is column-major => swap A and B. mma(KQ_C[i_KQ_00/(np*T_A_KQ::I)], Q_B[0], K_A); -#endif // defined(AMD_WMMA_AVAILABLE) } } } @@ -580,14 +531,8 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( for (int k0 = 0; k0 < nbatch_fa; k0 += np*T_C_KQ::I) { #pragma unroll for (int l = 0; l < T_C_KQ::ne; ++l) { - if (!oob_check || k0 + (threadIdx.y % np)*T_C_KQ::I + T_C_KQ::get_i(l) < k_VKQ_sup) { -#if defined(AMD_WMMA_AVAILABLE) - constexpr int KQ_idx = 0; -#else - // Turing + Volta: - const int KQ_idx = l % 2; -#endif // defined(AMD_WMMA_AVAILABLE) - KQ_max_new[KQ_idx] = fmaxf(KQ_max_new[KQ_idx], KQ_C[k0/(np*T_C_KQ::I)].x[l] + FATTN_KQ_MAX_OFFSET); + if (!oob_check || k0 + T_C_KQ::get_i(l) < k_VKQ_sup) { + KQ_max_new[l % 2] = fmaxf(KQ_max_new[l % 2], KQ_C[k0/(np*T_C_KQ::I)].x[l] + FATTN_KQ_MAX_OFFSET); } } } @@ -607,14 +552,8 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( #pragma unroll for (int l = 0; l < T_C_KQ::ne; ++l) { if (!oob_check || k0 + (threadIdx.y % np)*T_C_KQ::I + T_C_KQ::get_i(l) < k_VKQ_sup) { -#if defined(AMD_WMMA_AVAILABLE) - constexpr int KQ_idx = 0; -#else - // Turing + Volta: - const int KQ_idx = l % 2; -#endif // defined(AMD_WMMA_AVAILABLE) - KQ_C[k0/(np*T_C_KQ::I)].x[l] = expf(KQ_C[k0/(np*T_C_KQ::I)].x[l] - KQ_max_new[KQ_idx]); - KQ_rowsum_add[KQ_idx] += KQ_C[k0/(np*T_C_KQ::I)].x[l]; + KQ_C[k0/(np*T_C_KQ::I)].x[l] = expf(KQ_C[k0/(np*T_C_KQ::I)].x[l] - KQ_max_new[l % 2]); + KQ_rowsum_add[l % 2] += KQ_C[k0/(np*T_C_KQ::I)].x[l]; } else { KQ_C[k0/(np*T_C_KQ::I)].x[l] = 0.0f; } @@ -644,14 +583,9 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( for (int k0 = 0; k0 < nbatch_fa; k0 += np*T_C_KQ::J) { #pragma unroll for (int l = 0; l < T_C_KQ::ne; ++l) { - if (!oob_check || k0 + (threadIdx.y % np)*T_C_KQ::J + T_C_KQ::get_j(l) < k_VKQ_sup) { -#if defined(AMD_WMMA_AVAILABLE) - constexpr int KQ_idx = 0; -#else + if (!oob_check || k0 + T_C_KQ::get_j(l) < k_VKQ_sup) { // Turing + Volta: - const int KQ_idx = (l/2) % 2; -#endif // defined(AMD_WMMA_AVAILABLE) - KQ_max_new[KQ_idx] = fmaxf(KQ_max_new[KQ_idx], KQ_C[(k0/(np*T_C_KQ::J))].x[l] + FATTN_KQ_MAX_OFFSET); + KQ_max_new[(l/2) % 2] = fmaxf(KQ_max_new[(l/2) % 2], KQ_C[(k0/(np*T_C_KQ::J))].x[l] + FATTN_KQ_MAX_OFFSET); } } } @@ -662,11 +596,7 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( // Values per KQ column are spread across 4 threads: constexpr int offset_first = 2; constexpr int offset_last = 1; -#elif defined(AMD_WMMA_AVAILABLE) - // Values per KQ column are spread across 2 threads: - constexpr int offset_first = 16; - constexpr int offset_last = 16; -#else // Volta +#else // Values per KQ column are spread across 2 threads: constexpr int offset_first = 2; constexpr int offset_last = 2; @@ -682,15 +612,10 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( for (int k0 = 0; k0 < nbatch_fa; k0 += np*T_C_KQ::J) { #pragma unroll for (int l = 0; l < T_C_KQ::ne; ++l) { + // Turing + Volta: if (!oob_check || k0 + (threadIdx.y % np)*T_C_KQ::J + T_C_KQ::get_j(l) < k_VKQ_sup) { -#if defined(AMD_WMMA_AVAILABLE) - constexpr int KQ_idx = 0; -#else - // Turing + Volta: - const int KQ_idx = (l/2) % 2; -#endif // defined(AMD_WMMA_AVAILABLE) - KQ_C[(k0/(np*T_C_KQ::J))].x[l] = expf(KQ_C[(k0/(np*T_C_KQ::J))].x[l] - KQ_max_new[KQ_idx]); - KQ_rowsum_add[KQ_idx] += KQ_C[(k0/(np*T_C_KQ::J))].x[l]; + KQ_C[(k0/(np*T_C_KQ::J))].x[l] = expf(KQ_C[(k0/(np*T_C_KQ::J))].x[l] - KQ_max_new[(l/2) % 2]); + KQ_rowsum_add[(l/2) % 2] += KQ_C[(k0/(np*T_C_KQ::J))].x[l]; } else { KQ_C[(k0/(np*T_C_KQ::J))].x[l] = 0.0f; } @@ -714,7 +639,7 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( #if defined(TURING_MMA_AVAILABLE) if constexpr (cols_per_warp == 8) { - const half2 KQ_max_scale_h2 = make_half2(KQ_max_scale[0], KQ_max_scale[cols_per_thread - 1]); + const half2 KQ_max_scale_h2 = make_half2(KQ_max_scale[0], KQ_max_scale[1]); #pragma unroll for (int i = 0; i < DV/T_C_VKQ::I; ++i) { #pragma unroll @@ -735,16 +660,6 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( } } } -#elif defined(AMD_WMMA_AVAILABLE) - const half2 KQ_max_scale_h2 = make_half2( - KQ_max_scale[0], KQ_max_scale[0]); -#pragma unroll - for (int i = 0; i < (DV/2)/T_C_VKQ::J; ++i) { -#pragma unroll - for (int l = 0; l < T_C_VKQ::ne; ++l) { - VKQ_C[i].x[l] *= KQ_max_scale_h2; - } - } #else // Volta const half2 KQ_max_scale_h2 = make_half2( KQ_max_scale[(threadIdx.x / 2) % 2], KQ_max_scale[(threadIdx.x / 2) % 2]); @@ -792,10 +707,6 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( // Therefore, iterate over V in reverse and re-use the data if possible. static_assert(!mla || nstages <= 1, "combination of MLA and multi-stage loading not implemented"); constexpr int reusable_cutoff = mla ? (DKQ - 1) - (DKQ - 1) % (2*nbatch_K2) - (DKQ - DV) : DV; -#if defined(AMD_WMMA_AVAILABLE) && !defined(LDMATRIX_TRANS_AVAILABLE) - T_A_VKQ A_identity; - make_identity_mat(A_identity); -#endif // defined(AMD_WMMA_AVAILABLE) && !defined(LDMATRIX_TRANS_AVAILABLE) // Calculate VKQ tile, need to use logical rather than physical elements for i0 due to transposition of V: #pragma unroll @@ -816,7 +727,7 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( } const half2 * tile_V_i = i0_start < reusable_cutoff ? tile_V : tile_V + (i0_start - reusable_cutoff)/2; -#if defined(TURING_MMA_AVAILABLE) || defined(AMD_WMMA_AVAILABLE) +#if defined(TURING_MMA_AVAILABLE) constexpr int i0_stride = cols_per_warp == 8 ? T_C_VKQ::I : 2*T_C_VKQ::J; #pragma unroll for (int i_VKQ_0 = i0_start; i_VKQ_0 < i0_stop; i_VKQ_0 += i0_stride) { @@ -826,26 +737,12 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( const int k0 = k00 + (threadIdx.y % np)*T_A_VKQ::J; T_A_VKQ A; // Transposed in SRAM but not in registers, gets transposed on load. -#if defined(LDMATRIX_TRANS_AVAILABLE) load_ldmatrix_trans(A, tile_V_i + 2*k0*stride_tile_V + (i_VKQ_0 - i0_start)/2, stride_tile_V); -#else - // TODO: Try to transpose tile_V when loading gmem to smem. - // Use mma to transpose T_A_VKQ for RDNA. - T_A_VKQ A_trans; - load_ldmatrix(A_trans, tile_V_i + 2*k0*stride_tile_V + (i_VKQ_0 - i0_start)/2, stride_tile_V); - mma(A, A_trans, A_identity); -#endif // defined(TURING_MMA_AVAILABLE) if constexpr (T_B_KQ::I == 8) { mma(VKQ_C[i_VKQ_0/i0_stride], A, B[k00/(np*T_A_VKQ::J)]); } else { - // Wide version of VKQ_C is column-major. -#if defined(AMD_WMMA_AVAILABLE) - // RDNA matrix C is column-major. - mma(VKQ_C[i_VKQ_0/i0_stride], A, B[k00/(np*T_A_VKQ::J)]); -#else - // swap A and B for CUDA. + // Wide version of VKQ_C is column-major => swap A and B. mma(VKQ_C[i_VKQ_0/i0_stride], B[k00/(np*T_A_VKQ::J)], A); -#endif // defined(AMD_WMMA_AVAILABLE) } } } @@ -864,7 +761,7 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( mma(VKQ_C[i_VKQ_0/i0_stride], B[k00/(np*T_A_VKQ::I)], A); } } -#endif // defined(TURING_MMA_AVAILABLE) || defined(AMD_WMMA_AVAILABLE) +#endif // defined(TURING_MMA_AVAILABLE) if constexpr (nstages <= 1) { __syncthreads(); // Only needed if tile_K == tile_V. @@ -877,7 +774,7 @@ static __device__ __forceinline__ void flash_attn_ext_f16_iter( tile_Q, tile_K, tile_V, tile_mask, Q_B, VKQ_C, KQ_max, KQ_rowsum, kb0); NO_DEVICE_CODE; -#endif // defined(VOLTA_MMA_AVAILABLE) || defined(TURING_MMA_AVAILABLE) || (defined(AMD_WMMA_AVAILABLE) && defined(RDNA4)) +#endif // defined(VOLTA_MMA_AVAILABLE) || defined(TURING_MMA_AVAILABLE) } #if defined(TURING_MMA_AVAILABLE) @@ -897,15 +794,6 @@ template<> struct mma_tile_sizes<8> { using T_B_VKQ = tile< 8, 8, half2>; // column-major using T_C_VKQ = tile<16, 4, half2>; // row-major }; -#elif defined(AMD_WMMA_AVAILABLE) -template struct mma_tile_sizes { - using T_A_KQ = tile<16, 8, half2>; // row-major - using T_B_KQ = tile<16, 8, half2>; // column-major - using T_C_KQ = tile<16, 16, float>; // column-major - using T_A_VKQ = tile<16, 8, half2>; // row-major - using T_B_VKQ = tile<16, 8, half2>; // column-major - using T_C_VKQ = tile<16, 8, half2>; // column-major -}; #else // Volta template struct mma_tile_sizes { using T_A_KQ = tile< 8, 4, half2, DATA_LAYOUT_I_MAJOR_MIRRORED>; // row-major @@ -940,7 +828,7 @@ static __device__ __forceinline__ void flash_attn_ext_f16_process_tile( const int jt, const int kb0_start, const int kb0_stop) { -#if defined(VOLTA_MMA_AVAILABLE) || defined(TURING_MMA_AVAILABLE) || (defined(AMD_WMMA_AVAILABLE) && defined(RDNA4)) +#if defined(VOLTA_MMA_AVAILABLE) || defined(TURING_MMA_AVAILABLE) //In this kernel Q, K, V are matrices while i, j, k are matrix indices. constexpr int ncols = ncols1 * ncols2; @@ -952,7 +840,7 @@ static __device__ __forceinline__ void flash_attn_ext_f16_process_tile( using T_C_VKQ = typename mma_tile_sizes::T_C_VKQ; constexpr int cols_per_warp = T_B_KQ::I; - constexpr int cols_per_thread = get_cols_per_thread(); + constexpr int cols_per_thread = 2; // This is specifically KQ columns, Volta only has a single VKQ column. constexpr int np = nwarps * (cols_per_warp/ncols2) / ncols1; // Number of parallel CUDA warps per Q column. constexpr int nbatch_fa = ggml_cuda_fattn_mma_get_nbatch_fa (DKQ, DV, ncols); constexpr int nbatch_K2 = ggml_cuda_fattn_mma_get_nbatch_K2 (DKQ, DV, ncols); @@ -983,8 +871,6 @@ static __device__ __forceinline__ void flash_attn_ext_f16_process_tile( T_B_KQ Q_B[(Q_in_reg ? DKQ/(2*T_B_KQ::J) : 1)]; #if defined(TURING_MMA_AVAILABLE) T_C_VKQ VKQ_C[cols_per_warp == 8 ? DV/T_C_VKQ::I : DV/(2*T_C_VKQ::J)]; -#elif defined(AMD_WMMA_AVAILABLE) - T_C_VKQ VKQ_C[ DV/(2*T_C_VKQ::J)]; #else // Volta T_C_VKQ VKQ_C[ DV/(2*T_C_VKQ::J)]; #endif // defined(TURING_MMA_AVAILABLE) @@ -1124,10 +1010,6 @@ static __device__ __forceinline__ void flash_attn_ext_f16_process_tile( // The partial sums are spread across 8/4 threads. constexpr int offset_first = cols_per_warp == 8 ? 16 : 2; constexpr int offset_last = cols_per_warp == 8 ? 4 : 1; -#elif defined(AMD_WMMA_AVAILABLE) - // The partial sums are spread across 2 threads. - constexpr int offset_first = 16; - constexpr int offset_last = 16; #else // Volta // The partial sums are spread across 2 threads. constexpr int offset_first = 2; @@ -1165,7 +1047,7 @@ static __device__ __forceinline__ void flash_attn_ext_f16_process_tile( #if defined(TURING_MMA_AVAILABLE) if constexpr (cols_per_warp == 8) { - const half2 KQ_max_scale_h2 = make_half2(KQ_max_scale[0], KQ_max_scale[cols_per_thread - 1]); + const half2 KQ_max_scale_h2 = make_half2(KQ_max_scale[0], KQ_max_scale[1]); #pragma unroll for (int i = 0; i < DV/T_C_VKQ::I; ++i) { #pragma unroll @@ -1186,15 +1068,6 @@ static __device__ __forceinline__ void flash_attn_ext_f16_process_tile( } } } -#elif defined(AMD_WMMA_AVAILABLE) - const half2 KQ_max_scale_h2 = make_half2(KQ_max_scale[0], KQ_max_scale[0]); -#pragma unroll - for (int i = 0; i < (DV/2)/T_C_VKQ::J; ++i) { -#pragma unroll - for (int l = 0; l < T_C_VKQ::ne; ++l) { - VKQ_C[i].x[l] *= KQ_max_scale_h2; - } - } #else // Volta const int col = (threadIdx.x / 2) % 2; const half2 KQ_max_scale_h2 = make_half2(KQ_max_scale[col], KQ_max_scale[col]); @@ -1246,10 +1119,6 @@ static __device__ __forceinline__ void flash_attn_ext_f16_process_tile( const int jc_cwm = threadIdx.y*cols_per_warp + T_C_VKQ::get_i(threadIdx.x % 4); const float2 KQ_cmr = make_float2(KQ_max[threadIdx.x % cols_per_thread], KQ_rowsum[threadIdx.x % cols_per_thread]); const bool thread_should_write = threadIdx.x % 4 < cols_per_thread; -#elif defined(AMD_WMMA_AVAILABLE) - const int jc_cwm = threadIdx.y*cols_per_warp + T_C_VKQ::get_i(0); - const float2 KQ_cmr = make_float2(KQ_max[0], KQ_rowsum[0]); - const bool thread_should_write = threadIdx.x / 16 < cols_per_thread; #else // Volta const int jc_cwm = threadIdx.y*cols_per_warp + T_C_KQ::get_i(threadIdx.x & 2); const float2 KQ_cmr = make_float2(KQ_max[(threadIdx.x & 2) / 2], KQ_rowsum[(threadIdx.x & 2) / 2]); @@ -1450,7 +1319,7 @@ static __device__ __forceinline__ void flash_attn_ext_f16_process_tile( stride_Q1, stride_Q2, stride_K, stride_V, stride_mask, jt, kb0_start, kb0_stop); NO_DEVICE_CODE; -#endif // defined(VOLTA_MMA_AVAILABLE) || defined(TURING_MMA_AVAILABLE) || (defined(AMD_WMMA_AVAILABLE) && defined(RDNA4)) +#endif // defined(VOLTA_MMA_AVAILABLE) || defined(TURING_MMA_AVAILABLE) } template @@ -1477,7 +1346,7 @@ static __global__ void flash_attn_ext_f16( const int32_t nb21, const int32_t nb22, const int64_t nb23, const int32_t ne31, const int32_t ne32, const int32_t ne33, const int32_t nb31, const int32_t nb32, const int64_t nb33) { -#if defined(FLASH_ATTN_AVAILABLE) && (defined(VOLTA_MMA_AVAILABLE) || defined(TURING_MMA_AVAILABLE) || (defined(AMD_WMMA_AVAILABLE) && defined(RDNA4))) +#if defined(FLASH_ATTN_AVAILABLE) && (defined(VOLTA_MMA_AVAILABLE) || defined(TURING_MMA_AVAILABLE)) // Skip unused kernel variants for faster compilation: if (use_logit_softcap && !(DKQ == 128 || DKQ == 256)) { @@ -1491,13 +1360,6 @@ static __global__ void flash_attn_ext_f16( } #endif // __CUDA_ARCH__ == GGML_CUDA_CC_TURING -#if defined(AMD_WMMA_AVAILABLE) - if (ncols1*ncols2 > 32 || ncols1*ncols2 < 16 || DKQ > 128 || ncols2 == 1) { - NO_DEVICE_CODE; - return; - } -#endif // defined(AMD_WMMA_AVAILABLE) - static_assert(!mla || DKQ >= DV, "MLA needs DKQ >= DV"); constexpr int ncols = ncols1 * ncols2; @@ -1611,7 +1473,7 @@ static __global__ void flash_attn_ext_f16( ne31, ne32, ne33, nb31, nb32, nb33); NO_DEVICE_CODE; -#endif // defined(FLASH_ATTN_AVAILABLE) && (defined(VOLTA_MMA_AVAILABLE) || defined(TURING_MMA_AVAILABLE) || (defined(AMD_WMMA_AVAILABLE) && defined(RDNA4))) +#endif // defined(FLASH_ATTN_AVAILABLE) && (defined(VOLTA_MMA_AVAILABLE) || defined(TURING_MMA_AVAILABLE)) } template @@ -1630,7 +1492,7 @@ void ggml_cuda_flash_attn_ext_mma_f16_case(ggml_backend_cuda_context & ctx, ggml const bool Q_in_reg = ggml_cuda_fattn_mma_get_Q_in_reg (DKQ, DV, ncols, cc); const int nstages = ggml_cuda_fattn_mma_get_nstages (DKQ, DV, ncols1, ncols2, cc); - const int cols_per_warp = std::min(ncols, get_cols_per_warp(cc)); + const int cols_per_warp = std::min(ncols, turing_mma_available(cc) ? 16 : 32); const int nwarps = nthreads / WARP_SIZE; constexpr bool mla = DKQ == 576; @@ -1650,34 +1512,29 @@ void ggml_cuda_flash_attn_ext_mma_f16_case(ggml_backend_cuda_context & ctx, ggml float logit_softcap; memcpy(&logit_softcap, (const float *) KQV->op_params + 2, sizeof(float)); -#if defined(GGML_USE_HIP) - using fattn_kernel_ptr_t = const void*; -#else - using fattn_kernel_ptr_t = fattn_kernel_t; -#endif // defined(GGML_USE_HIP) fattn_kernel_t fattn_kernel; if (logit_softcap == 0.0f) { constexpr bool use_logit_softcap = false; fattn_kernel = flash_attn_ext_f16; -#if !defined(GGML_USE_MUSA) +#if !defined(GGML_USE_HIP) && !defined(GGML_USE_MUSA) static bool shared_memory_limit_raised[GGML_CUDA_MAX_DEVICES] = {false}; if (!shared_memory_limit_raised[id]) { - CUDA_CHECK(cudaFuncSetAttribute(reinterpret_cast(fattn_kernel), cudaFuncAttributeMaxDynamicSharedMemorySize, nbytes_shared_total)); + CUDA_CHECK(cudaFuncSetAttribute(fattn_kernel, cudaFuncAttributeMaxDynamicSharedMemorySize, nbytes_shared_total)); shared_memory_limit_raised[id] = true; } -#endif // !defined(GGML_USE_MUSA) +#endif // !defined(GGML_USE_HIP) && !defined(GGML_USE_MUSA) } else { constexpr bool use_logit_softcap = true; fattn_kernel = flash_attn_ext_f16; -#if !defined(GGML_USE_MUSA) +#if !defined(GGML_USE_HIP) && !defined(GGML_USE_MUSA) static bool shared_memory_limit_raised[GGML_CUDA_MAX_DEVICES] = {false}; if (!shared_memory_limit_raised[id]) { - CUDA_CHECK(cudaFuncSetAttribute(reinterpret_cast(fattn_kernel), cudaFuncAttributeMaxDynamicSharedMemorySize, nbytes_shared_total)); + CUDA_CHECK(cudaFuncSetAttribute(fattn_kernel, cudaFuncAttributeMaxDynamicSharedMemorySize, nbytes_shared_total)); shared_memory_limit_raised[id] = true; } -#endif // !defined(GGML_USE_MUSA) +#endif // !defined(GGML_USE_HIP) && !defined(GGML_USE_MUSA) } launch_fattn diff --git a/ggml/src/ggml-cuda/fattn-tile.cuh b/ggml/src/ggml-cuda/fattn-tile.cuh index f055da8..7c4d6fe 100644 --- a/ggml/src/ggml-cuda/fattn-tile.cuh +++ b/ggml/src/ggml-cuda/fattn-tile.cuh @@ -343,7 +343,7 @@ static __device__ __forceinline__ void flash_attn_tile_load_tile( for (int j0 = j0_start; j0 < j0_stop; j0 += stride_j) { const int j = j0*cpy_ne + (stride_j == warp_size ? threadIdx.x : threadIdx.x % stride_j)*cpy_ne; - const __align__(16) half2 zero[cpy_ne] = {{0.0f, 0.0f}}; + const half2 zero[cpy_ne] = {{0.0f, 0.0f}}; ggml_cuda_memcpy_1( tile_KV + i*(J/2 + J_padding) + j, !oob_check || i < i_sup ? KV + i*stride_KV + j : zero); @@ -394,11 +394,11 @@ static __device__ __forceinline__ void flash_attn_tile_load_tile( const int j = j0*(cpy_ne/2) + (stride_j == warp_size ? threadIdx.x : threadIdx.x % stride_j)*(cpy_ne/2); const half2 zero[cpy_ne/2] = {{0.0f, 0.0f}}; - __align__(16) half2 tmp_h2[cpy_ne/2]; + half2 tmp_h2[cpy_ne/2]; ggml_cuda_memcpy_1( tmp_h2, !oob_check || i < i_sup ? KV + i*stride_KV + j : zero); - __align__(16) float2 tmp_f2[cpy_ne/2]; + float2 tmp_f2[cpy_ne/2]; #pragma unroll for (int l = 0; l < cpy_ne/2; ++l) { tmp_f2[l] = __half22float2(tmp_h2[l]); @@ -445,14 +445,14 @@ static __device__ __forceinline__ void flash_attn_tile_iter_KQ( static_assert((nbatch_K/2) % cpy_ne == 0, "bad nbatch_K"); #pragma unroll for (int k_KQ_1 = 0; k_KQ_1 < nbatch_K/2; k_KQ_1 += cpy_ne) { - __align__(16) half2 K_k[nbatch_fa/(np*warp_size)][cpy_ne]; - __align__(16) half2 Q_k[cpw][cpy_ne]; + half2 K_k[nbatch_fa/(np*warp_size)][cpy_ne]; + half2 Q_k[cpw][cpy_ne]; #else static_assert(nbatch_K % cpy_ne == 0, "bad nbatch_K"); #pragma unroll for (int k_KQ_1 = 0; k_KQ_1 < nbatch_K; k_KQ_1 += cpy_ne) { - __align__(16) float K_k[nbatch_fa/(np*warp_size)][cpy_ne]; - __align__(16) float Q_k[cpw][cpy_ne]; + float K_k[nbatch_fa/(np*warp_size)][cpy_ne]; + float Q_k[cpw][cpy_ne]; #endif // FAST_FP16_AVAILABLE #pragma unroll @@ -602,9 +602,9 @@ static __device__ __forceinline__ void flash_attn_tile_iter( #pragma unroll for (int jc0 = 0; jc0 < cpw; jc0 += KQ_cs) { #ifdef FAST_FP16_AVAILABLE - __align__(16) half tmp[nbatch_fa/(np*warp_size)][KQ_cs]; + half tmp[nbatch_fa/(np*warp_size)][KQ_cs]; #else - __align__(16) float tmp[nbatch_fa/(np*warp_size)][KQ_cs]; + float tmp[nbatch_fa/(np*warp_size)][KQ_cs]; #endif // FAST_FP16_AVAILABLE #pragma unroll @@ -664,8 +664,8 @@ static __device__ __forceinline__ void flash_attn_tile_iter( #ifdef FAST_FP16_AVAILABLE #pragma unroll for (int k1 = 0; k1 < nbatch_V; k1 += np) { - __align__(16) half2 V_k[(DVp/2)/warp_size]; - __align__(16) half2 KQ_k[cpw]; + half2 V_k[(DVp/2)/warp_size]; + half2 KQ_k[cpw]; constexpr int cpy_ne_D = cpy_ne/2 < (DVp/2)/warp_size ? cpy_ne/2 : (DVp/2)/warp_size; #pragma unroll @@ -676,7 +676,7 @@ static __device__ __forceinline__ void flash_attn_tile_iter( for (int jc_VKQ_0 = 0; jc_VKQ_0 < cpw; jc_VKQ_0 += KQ_cs) { const int jc_KQ = jc_VKQ_0/KQ_cs + (threadIdx.y / np)*(cpw/KQ_cs); - __align__(16) half tmp[KQ_cs]; + half tmp[KQ_cs]; ggml_cuda_memcpy_1( &tmp, KQ + jc_KQ*(nbatch_fa*KQ_cs) + (k0 + k1 + threadIdx.y % np)*KQ_cs); #pragma unroll @@ -696,8 +696,8 @@ static __device__ __forceinline__ void flash_attn_tile_iter( #else #pragma unroll for (int k1 = 0; k1 < nbatch_V; k1 += np) { - __align__(16) float2 V_k[(DVp/2)/warp_size]; - __align__(16) float KQ_k[cpw]; + float2 V_k[(DVp/2)/warp_size]; + float KQ_k[cpw]; constexpr int cpy_ne_D = cpy_ne < DVp/warp_size ? cpy_ne : DVp/warp_size; #pragma unroll @@ -821,12 +821,12 @@ static __global__ void flash_attn_tile( __shared__ half2 Q_tmp[ncols * DKQ/2]; __shared__ half2 KV_tmp[nbatch_fa * (nbatch_K/2 + cpy_ne) + DVp-DV]; __shared__ half KQ[ncols * nbatch_fa]; - __align__(16) half2 VKQ[cpw * ((DVp/2)/warp_size)] = {{0.0f, 0.0f}}; + half2 VKQ[cpw * ((DVp/2)/warp_size)] = {{0.0f, 0.0f}}; #else __shared__ float Q_tmp[ncols * DKQ]; __shared__ float KV_tmp[nbatch_fa * (nbatch_K + cpy_ne) + DVp-DV]; __shared__ float KQ[ncols * nbatch_fa]; - __align__(16) float2 VKQ[cpw * ((DVp/2)/warp_size)] = {{0.0f, 0.0f}}; + float2 VKQ[cpw * ((DVp/2)/warp_size)] = {{0.0f, 0.0f}}; #endif // FAST_FP16_AVAILABLE float KQ_max[cpw]; @@ -849,7 +849,7 @@ static __global__ void flash_attn_tile( #pragma unroll for (int i0 = 0; i0 < DKQp; i0 += np*warp_size*cpy_ne_D) { if (i0 + np*warp_size*cpy_ne_D <= DKQ || i0 + (threadIdx.y % np)*(warp_size*cpy_ne_D) + threadIdx.x*cpy_ne_D < DKQ) { - __align__(16) float tmp_f[cpy_ne_D] = {0.0f}; + float tmp_f[cpy_ne_D] = {0.0f}; ggml_cuda_memcpy_1 (tmp_f, &Q_f[c*(nb02/sizeof(float)) + fastmodulo(col_Q_0 + j, ne01)*(nb01/sizeof(float)) + i0 + (threadIdx.y % np)*(warp_size*cpy_ne_D) + threadIdx.x*cpy_ne_D]); @@ -860,7 +860,7 @@ static __global__ void flash_attn_tile( } #ifdef FAST_FP16_AVAILABLE - __align__(16) half2 tmp_h2[cpy_ne_D/2]; + half2 tmp_h2[cpy_ne_D/2]; #pragma unroll for (int i1 = 0; i1 < cpy_ne_D; i1 += 2) { tmp_h2[i1/2] = make_half2(tmp_f[i1 + 0], tmp_f[i1 + 1]); @@ -959,7 +959,7 @@ static __global__ void flash_attn_tile( constexpr int cpy_ne_D = cpy_ne < (DVp/2)/warp_size ? cpy_ne : (DVp/2)/warp_size; #pragma unroll for (int i0 = 0; i0 < DVp/2; i0 += warp_size*cpy_ne_D) { - __align__(16) half2 tmp[cpy_ne_D]; + half2 tmp[cpy_ne_D]; ggml_cuda_memcpy_1(tmp, &VKQ_combine[(threadIdx.y + ip)*(DVp/2) + i0 + threadIdx.x*cpy_ne_D]); #pragma unroll for (int i1 = 0; i1 < cpy_ne_D; ++i1) { @@ -970,7 +970,7 @@ static __global__ void flash_attn_tile( constexpr int cpy_ne_D = cpy_ne < DVp/warp_size ? cpy_ne : DVp/warp_size; #pragma unroll for (int i0 = 0; i0 < DVp; i0 += warp_size*cpy_ne_D) { - __align__(16) float tmp[cpy_ne_D]; + float tmp[cpy_ne_D]; ggml_cuda_memcpy_1(tmp, &VKQ_combine[(threadIdx.y + ip)*DVp + i0 + threadIdx.x*cpy_ne_D]); #pragma unroll for (int i1 = 0; i1 < cpy_ne_D; ++i1) { @@ -1033,7 +1033,7 @@ static __global__ void flash_attn_tile( constexpr int cpy_ne_D = cpy_ne/2 < (DVp/2)/warp_size ? cpy_ne/2 : (DVp/2)/warp_size; #pragma unroll for (int i0 = 0; i0 < DVp/2; i0 += warp_size*cpy_ne_D) { - __align__(16) float2 tmp[cpy_ne_D]; + float2 tmp[cpy_ne_D]; #pragma unroll for (int i1 = 0; i1 < cpy_ne_D; ++i1) { tmp[i1] = __half22float2(VKQ[jc0*((DVp/2)/warp_size) + i0/warp_size + i1]); diff --git a/ggml/src/ggml-cuda/fattn-vec.cuh b/ggml/src/ggml-cuda/fattn-vec.cuh index 3f4a78c..4d167b9 100644 --- a/ggml/src/ggml-cuda/fattn-vec.cuh +++ b/ggml/src/ggml-cuda/fattn-vec.cuh @@ -10,7 +10,7 @@ static constexpr __device__ int ggml_cuda_fattn_vec_get_nthreads_device() { return 128; } -// Currenlty llvm with the amdgcn target does not support unrolling loops +// Currenlty llvm with the amdgcn target dose not support unrolling loops // that contain a break that can not be resolved at compile time. #ifdef __clang__ #pragma clang diagnostic push @@ -132,7 +132,7 @@ static __global__ void flash_attn_ext_vec( #ifdef V_DOT2_F32_F16_AVAILABLE half2 Q_reg[ncols][(D/2)/nthreads_KQ]; // Will be initialized completely. #else - __align__(16) float2 Q_reg[ncols][(D/2)/nthreads_KQ] = {{{0.0f, 0.0f}}}; // May be only partially initialized. + float2 Q_reg[ncols][(D/2)/nthreads_KQ] = {{{0.0f, 0.0f}}}; // May be only partially initialized. #endif // V_DOT2_F32_F16_AVAILABLE int Q_i32[ncols][1 > D/(sizeof(int)*nthreads_KQ) ? 1 : D/(sizeof(int)*nthreads_KQ)]; float2 Q_ds[ncols][1 > D/(sizeof(int)*nthreads_KQ) ? 1 : D/(sizeof(int)*nthreads_KQ)]; @@ -200,7 +200,7 @@ static __global__ void flash_attn_ext_vec( for (int i0 = 0; i0 < D/2; i0 += nthreads_KQ*cpy_ne) { const int i = i0 + (nthreads_KQ == WARP_SIZE ? threadIdx.x : threadIdx.x % nthreads_KQ)*cpy_ne; - __align__(16) float2 tmp[cpy_ne] = {{0.0f, 0.0f}}; + float2 tmp[cpy_ne] = {{0.0f, 0.0f}}; if (ncols == 1 || ic0 + j < int(ne01.z)) { ggml_cuda_memcpy_1(tmp, &Q_j[i]); ggml_cuda_memcpy_1(tmp + cpy_ne/2, &Q_j[i + cpy_ne/2]); diff --git a/ggml/src/ggml-cuda/fattn.cu b/ggml/src/ggml-cuda/fattn.cu index 598cda7..0155406 100644 --- a/ggml/src/ggml-cuda/fattn.cu +++ b/ggml/src/ggml-cuda/fattn.cu @@ -18,12 +18,12 @@ static void ggml_cuda_flash_attn_ext_mma_f16_switch_ncols1(ggml_backend_cuda_con } } - if ((turing_mma_available(cc) || amd_wmma_available(cc)) && Q->ne[1] <= 16/ncols2) { + if (turing_mma_available(cc) && Q->ne[1] <= 16/ncols2) { ggml_cuda_flash_attn_ext_mma_f16_case(ctx, dst); return; } - if (ggml_cuda_highest_compiled_arch(cc) == GGML_CUDA_CC_TURING || amd_wmma_available(cc) || Q->ne[1] <= 32/ncols2) { + if (ggml_cuda_highest_compiled_arch(cc) == GGML_CUDA_CC_TURING || Q->ne[1] <= 32/ncols2) { ggml_cuda_flash_attn_ext_mma_f16_case(ctx, dst); return; } @@ -230,18 +230,7 @@ static best_fattn_kernel ggml_cuda_get_best_fattn_kernel(const int device, const // The effective batch size for the kernel can be increased by gqa_ratio. // The kernel versions without this optimization are also used for ALiBi, if there is no mask, or if the KV cache is not padded, - bool gqa_opt_applies = gqa_ratio % 2 == 0 && mask && max_bias == 0.0f && K->ne[1] % FATTN_KQ_STRIDE == 0; - for (const ggml_tensor * t : {Q, K, V, mask}) { - if (t == nullptr) { - continue; - } - for (size_t i = 1; i < GGML_MAX_DIMS; ++i) { - if (t->nb[i] % 16 != 0) { - gqa_opt_applies = false; - break; - } - } - } + const bool gqa_opt_applies = gqa_ratio % 2 == 0 && mask && max_bias == 0.0f && K->ne[1] % FATTN_KQ_STRIDE == 0; const int cc = ggml_cuda_info().devices[device].cc; @@ -348,31 +337,6 @@ static best_fattn_kernel ggml_cuda_get_best_fattn_kernel(const int device, const return BEST_FATTN_KERNEL_WMMA_F16; } - if (amd_wmma_available(cc) && GGML_CUDA_CC_IS_RDNA4(cc) && gqa_opt_applies && Q->ne[0] <= 128 && Q->ne[0] != 40 && Q->ne[0] != 72) { - if (can_use_vector_kernel) { - if (!ggml_is_quantized(K->type) && !ggml_is_quantized(V->type)) { - if (Q->ne[1] == 1) { - if (!gqa_opt_applies) { - return BEST_FATTN_KERNEL_VEC; - } - } - } else { - if (Q->ne[1] <= 2) { - return BEST_FATTN_KERNEL_VEC; - } - } - } - int gqa_ratio_eff = 1; - const int ncols2_max = Q->ne[0] == 576 ? 16 : 8; - while (gqa_ratio % (2*gqa_ratio_eff) == 0 && gqa_ratio_eff < ncols2_max) { - gqa_ratio_eff *= 2; - } - if (Q->ne[1] * gqa_ratio_eff <= 8) { - return BEST_FATTN_KERNEL_TILE; // AMD WMMA is only faster if the full tile width of 16 can be utilized. - } - return BEST_FATTN_KERNEL_MMA_F16; - } - // If there are no tensor cores available, use the generic tile kernel: if (can_use_vector_kernel) { if (!ggml_is_quantized(K->type) && !ggml_is_quantized(V->type)) { diff --git a/ggml/src/ggml-cuda/ggml-cuda.cu b/ggml/src/ggml-cuda/ggml-cuda.cu index ed10214..55fa2e6 100644 --- a/ggml/src/ggml-cuda/ggml-cuda.cu +++ b/ggml/src/ggml-cuda/ggml-cuda.cu @@ -19,7 +19,6 @@ #include "ggml-cuda/count-equal.cuh" #include "ggml-cuda/cpy.cuh" #include "ggml-cuda/cross-entropy-loss.cuh" -#include "ggml-cuda/cumsum.cuh" #include "ggml-cuda/diagmask.cuh" #include "ggml-cuda/diag.cuh" #include "ggml-cuda/fattn.cuh" @@ -45,7 +44,6 @@ #include "ggml-cuda/ssm-scan.cuh" #include "ggml-cuda/sum.cuh" #include "ggml-cuda/sumrows.cuh" -#include "ggml-cuda/top-k.cuh" #include "ggml-cuda/mean.cuh" #include "ggml-cuda/tsembd.cuh" #include "ggml-cuda/topk-moe.cuh" @@ -203,6 +201,16 @@ static ggml_cuda_device_info ggml_cuda_init() { GGML_ASSERT(info.device_count <= GGML_CUDA_MAX_DEVICES); int64_t total_vram = 0; +#ifdef GGML_CUDA_FORCE_MMQ + GGML_LOG_INFO("%s: GGML_CUDA_FORCE_MMQ: yes\n", __func__); +#else + GGML_LOG_INFO("%s: GGML_CUDA_FORCE_MMQ: no\n", __func__); +#endif // GGML_CUDA_FORCE_MMQ +#ifdef GGML_CUDA_FORCE_CUBLAS + GGML_LOG_INFO("%s: GGML_CUDA_FORCE_CUBLAS: yes\n", __func__); +#else + GGML_LOG_INFO("%s: GGML_CUDA_FORCE_CUBLAS: no\n", __func__); +#endif // GGML_CUDA_FORCE_CUBLAS GGML_LOG_INFO("%s: found %d " GGML_CUDA_NAME " devices:\n", __func__, info.device_count); std::vector> turing_devices_without_mma; @@ -233,14 +241,6 @@ static ggml_cuda_device_info ggml_cuda_init() { info.devices[id].nsm = prop.multiProcessorCount; info.devices[id].smpb = prop.sharedMemPerBlock; info.devices[id].warp_size = prop.warpSize; - -#ifndef GGML_USE_MUSA - int supports_coop_launch = 0; - CUDA_CHECK(cudaDeviceGetAttribute(&supports_coop_launch, cudaDevAttrCooperativeLaunch, id)); - info.devices[id].supports_cooperative_launch = !!supports_coop_launch; -#else - info.devices[id].supports_cooperative_launch = false; -#endif // !(GGML_USE_MUSA) #if defined(GGML_USE_HIP) info.devices[id].smpbo = prop.sharedMemPerBlock; @@ -2211,7 +2211,7 @@ static void ggml_cuda_mul_mat(ggml_backend_cuda_context & ctx, const ggml_tensor const int cc = ggml_cuda_info().devices[id].cc; const int warp_size = ggml_cuda_info().devices[id].warp_size; - use_mul_mat_q = use_mul_mat_q && ggml_cuda_should_use_mmq(src0->type, cc, src1->ne[1], /*n_experts=*/0); + use_mul_mat_q = use_mul_mat_q && ggml_cuda_should_use_mmq(src0->type, cc, src1->ne[1]); use_mul_mat_f = use_mul_mat_f && ggml_cuda_should_use_mmf(src0->type, cc, warp_size, src0->ne, src0->nb, src1->ne[1], /*mul_mat_id=*/false); use_mul_mat_vec_f = use_mul_mat_vec_f && ggml_cuda_should_use_mmvf(src0->type, cc, src0->ne, src0->nb, src1->ne[1]); any_gpus_with_slow_fp16 = any_gpus_with_slow_fp16 || !fast_fp16_hardware_available(cc); @@ -2219,7 +2219,7 @@ static void ggml_cuda_mul_mat(ggml_backend_cuda_context & ctx, const ggml_tensor } else { const int cc = ggml_cuda_info().devices[ctx.device].cc; const int warp_size = ggml_cuda_info().devices[ctx.device].warp_size; - use_mul_mat_q = use_mul_mat_q && ggml_cuda_should_use_mmq(src0->type, cc, src1->ne[1], /*n_experts=*/0); + use_mul_mat_q = use_mul_mat_q && ggml_cuda_should_use_mmq(src0->type, cc, src1->ne[1]); use_mul_mat_f = use_mul_mat_f && ggml_cuda_should_use_mmf(src0->type, cc, warp_size, src0->ne, src0->nb, src1->ne[1], /*mul_mat_id=*/false); use_mul_mat_vec_f = use_mul_mat_vec_f && ggml_cuda_should_use_mmvf(src0->type, cc, src0->ne, src0->nb, src1->ne[1]); any_gpus_with_slow_fp16 = any_gpus_with_slow_fp16 || !fast_fp16_hardware_available(cc); @@ -2287,7 +2287,7 @@ static void ggml_cuda_mul_mat_id(ggml_backend_cuda_context & ctx, ggml_tensor * return; } - if (ggml_cuda_should_use_mmq(src0->type, cc, ne12, /*n_experts=*/ne02)) { + if (ggml_cuda_should_use_mmq(src0->type, cc, ne12)) { ggml_cuda_mul_mat_q(ctx, src0, src1, ids, dst); return; } @@ -2687,9 +2687,6 @@ static bool ggml_cuda_compute_forward(ggml_backend_cuda_context & ctx, struct gg case GGML_OP_SUM: ggml_cuda_op_sum(ctx, dst); break; - case GGML_OP_CUMSUM: - ggml_cuda_op_cumsum(ctx, dst); - break; case GGML_OP_SUM_ROWS: ggml_cuda_op_sum_rows(ctx, dst); break; @@ -2702,9 +2699,6 @@ static bool ggml_cuda_compute_forward(ggml_backend_cuda_context & ctx, struct gg case GGML_OP_SSM_SCAN: ggml_cuda_op_ssm_scan(ctx, dst); break; - case GGML_OP_TOP_K: - ggml_cuda_op_top_k(ctx, dst); - break; case GGML_OP_ARGSORT: ggml_cuda_op_argsort(ctx, dst); break; @@ -2714,6 +2708,9 @@ static bool ggml_cuda_compute_forward(ggml_backend_cuda_context & ctx, struct gg case GGML_OP_CROSS_ENTROPY_LOSS: ggml_cuda_cross_entropy_loss(ctx, dst); break; + case GGML_OP_CUMSUM: + ggml_cuda_op_cumsum(ctx, dst); + break; case GGML_OP_TRI: ggml_cuda_op_tri(ctx, dst); break; @@ -2853,9 +2850,9 @@ static void ggml_backend_cuda_synchronize(ggml_backend_t backend) { } #ifdef USE_CUDA_GRAPH -static bool ggml_cuda_graph_check_compability(ggml_cgraph * cgraph) { +static bool check_node_graph_compatibility(ggml_cgraph * cgraph, + bool use_cuda_graph) { - bool use_cuda_graph = true; // Loop over nodes in GGML graph to obtain info needed for CUDA graph const std::string gemma3n_per_layer_proj_src0_name = "inp_per_layer_selected"; @@ -2915,41 +2912,41 @@ static bool ggml_cuda_graph_check_compability(ggml_cgraph * cgraph) { return use_cuda_graph; } -static void ggml_cuda_graph_node_set_properties(ggml_cuda_graph_node_properties * props, ggml_tensor * node) { - props->node_address = node->data; - props->node_op = node->op; +static void set_ggml_graph_node_properties(ggml_tensor * node, ggml_graph_node_properties * graph_node_properties) { + graph_node_properties->node_address = node->data; + graph_node_properties->node_op = node->op; for (int i = 0; i < GGML_MAX_DIMS; i++) { - props->ne[i] = node->ne[i]; - props->nb[i] = node->nb[i]; + graph_node_properties->ne[i] = node->ne[i]; + graph_node_properties->nb[i] = node->nb[i]; } for (int i = 0; i < GGML_MAX_SRC; i++) { - props->src_address[i] = node->src[i] ? node->src[i]->data : nullptr; + graph_node_properties->src_address[i] = node->src[i] ? node->src[i]->data : nullptr; } - memcpy(props->op_params, node->op_params, GGML_MAX_OP_PARAMS); + memcpy(graph_node_properties->op_params, node->op_params, GGML_MAX_OP_PARAMS); } -static bool ggml_cuda_graph_node_properties_match(ggml_tensor * node, ggml_cuda_graph_node_properties * props) { - if (node->data != props->node_address && +static bool ggml_graph_node_has_matching_properties(ggml_tensor * node, ggml_graph_node_properties * graph_node_properties) { + if (node->data != graph_node_properties->node_address && node->op != GGML_OP_VIEW) { return false; } - if (node->op != props->node_op) { + if (node->op != graph_node_properties->node_op) { return false; } for (int i = 0; i < GGML_MAX_DIMS; i++) { - if (node->ne[i] != props->ne[i]) { + if (node->ne[i] != graph_node_properties->ne[i]) { return false; } - if (node->nb[i] != props->nb[i]) { + if (node->nb[i] != graph_node_properties->nb[i]) { return false; } } for (int i = 0; i < GGML_MAX_SRC; i++) { if (node->src[i] && - node->src[i]->data != props->src_address[i] && + node->src[i]->data != graph_node_properties->src_address[i] && node->op != GGML_OP_VIEW ) { return false; @@ -2957,55 +2954,44 @@ static bool ggml_cuda_graph_node_properties_match(ggml_tensor * node, ggml_cuda_ } if ((node->op == GGML_OP_SCALE || node->op == GGML_OP_GLU) && - memcmp(props->op_params, node->op_params, GGML_MAX_OP_PARAMS) != 0) { + memcmp(graph_node_properties->op_params, node->op_params, GGML_MAX_OP_PARAMS) != 0) { return false; } return true; } -static bool ggml_cuda_graph_update_required(ggml_backend_cuda_context * cuda_ctx, ggml_cgraph * cgraph) { +static bool is_cuda_graph_update_required(ggml_backend_cuda_context * cuda_ctx, ggml_cgraph * cgraph) { - bool res = false; + bool cuda_graph_update_required = false; if (cuda_ctx->cuda_graph->instance == nullptr) { - res = true; + cuda_graph_update_required = true; } // Check if the graph size has changed - if (cuda_ctx->cuda_graph->props.size() != (size_t)cgraph->n_nodes + cgraph->n_leafs) { - res = true; - cuda_ctx->cuda_graph->props.resize(cgraph->n_nodes + cgraph->n_leafs); + if (cuda_ctx->cuda_graph->ggml_graph_properties.size() != (size_t)cgraph->n_nodes) { + cuda_graph_update_required = true; + cuda_ctx->cuda_graph->ggml_graph_properties.resize(cgraph->n_nodes); } // Loop over nodes in GGML graph to determine if CUDA graph update is required // and store properties to allow this comparison for the next token for (int i = 0; i < cgraph->n_nodes; i++) { - bool props_match = true; - if (!res) { - props_match = ggml_cuda_graph_node_properties_match(cgraph->nodes[i], &cuda_ctx->cuda_graph->props[i]); + bool has_matching_properties = true; + if (!cuda_graph_update_required) { + has_matching_properties = ggml_graph_node_has_matching_properties(cgraph->nodes[i], &cuda_ctx->cuda_graph->ggml_graph_properties[i]); } - if (!props_match) { - res = true; + if (!has_matching_properties) { + cuda_graph_update_required = true; } - ggml_cuda_graph_node_set_properties(&cuda_ctx->cuda_graph->props[i], cgraph->nodes[i]); + set_ggml_graph_node_properties(cgraph->nodes[i], &cuda_ctx->cuda_graph->ggml_graph_properties[i]); } - for (int i = 0; i < cgraph->n_leafs; i++) { - bool props_match= true; - if (!res) { - props_match = ggml_cuda_graph_node_properties_match(cgraph->leafs[i], &cuda_ctx->cuda_graph->props[cgraph->n_nodes + i]); - } - if (!props_match) { - res = true; - } - ggml_cuda_graph_node_set_properties(&cuda_ctx->cuda_graph->props[cgraph->n_nodes + i], cgraph->leafs[i]); - } - - return res; + return cuda_graph_update_required; } -static void ggml_cuda_graph_update_executable(ggml_backend_cuda_context * cuda_ctx) { +static void update_cuda_graph_executable(ggml_backend_cuda_context * cuda_ctx) { #if CUDART_VERSION >= 12000 cudaGraphExecUpdateResultInfo result_info; @@ -3236,11 +3222,10 @@ static bool ggml_cuda_can_fuse(const struct ggml_cgraph * cgraph, int node_idx, return false; } -static void ggml_cuda_graph_evaluate_and_capture(ggml_backend_cuda_context * cuda_ctx, ggml_cgraph * cgraph, const bool use_cuda_graph, const bool cuda_graph_update_required) { - bool graph_evaluated_or_captured = false; - +static void evaluate_and_capture_cuda_graph(ggml_backend_cuda_context * cuda_ctx, ggml_cgraph * cgraph, + bool & graph_evaluated_or_captured, bool & use_cuda_graph, bool & cuda_graph_update_required) { // flag used to determine whether it is an integrated_gpu - const bool integrated = ggml_cuda_info().devices[cuda_ctx->device].integrated; + const bool integrated = ggml_cuda_info().devices[cuda_ctx->device].integrated; ggml_cuda_stream_context & stream_ctx = cuda_ctx->stream_context(); bool is_concurrent_event_active = false; @@ -3278,7 +3263,6 @@ static void ggml_cuda_graph_evaluate_and_capture(ggml_backend_cuda_context * cud should_launch_concurrent_events = should_launch_concurrent_events && event.is_valid(); } } - if (should_launch_concurrent_events) { // Restore original node order within each concurrent region to enable fusion within streams @@ -3330,8 +3314,6 @@ static void ggml_cuda_graph_evaluate_and_capture(ggml_backend_cuda_context * cud cgraph->nodes[start_pos + i] = const_cast(event.original_order[i]); } } - } else { - stream_ctx.concurrent_events.clear(); } for (int i = 0; i < cgraph->n_nodes; i++) { @@ -3710,7 +3692,7 @@ static void ggml_cuda_graph_evaluate_and_capture(ggml_backend_cuda_context * cud CUDA_CHECK(cudaGraphInstantiate(&cuda_ctx->cuda_graph->instance, cuda_ctx->cuda_graph->graph, NULL, NULL, 0)); } if (cuda_graph_update_required) { // Update graph executable - ggml_cuda_graph_update_executable(cuda_ctx); + update_cuda_graph_executable(cuda_ctx); } // Launch graph CUDA_CHECK(cudaGraphLaunch(cuda_ctx->cuda_graph->instance, cuda_ctx->stream())); @@ -3720,48 +3702,60 @@ static void ggml_cuda_graph_evaluate_and_capture(ggml_backend_cuda_context * cud } } -static bool ggml_cuda_graph_set_enabled(ggml_backend_cuda_context * cuda_ctx) { +static enum ggml_status ggml_backend_cuda_graph_compute(ggml_backend_t backend, ggml_cgraph * cgraph) { + ggml_backend_cuda_context * cuda_ctx = (ggml_backend_cuda_context *)backend->context; + + ggml_cuda_set_device(cuda_ctx->device); #ifdef USE_CUDA_GRAPH + static const bool disable_cuda_graphs_due_to_env = (getenv("GGML_CUDA_DISABLE_GRAPHS") != nullptr); + // Objects required for CUDA Graph if (cuda_ctx->cuda_graph == nullptr) { cuda_ctx->cuda_graph.reset(new ggml_cuda_graph()); } + bool use_cuda_graph = true; + bool cuda_graph_update_required = false; + if (cuda_ctx->cuda_graph->graph == nullptr) { if (ggml_cuda_info().devices[cuda_ctx->device].cc < GGML_CUDA_CC_AMPERE) { - if (!cuda_ctx->cuda_graph->disable_due_to_gpu_arch) { - GGML_LOG_DEBUG("%s: disabling CUDA graphs due to GPU architecture\n", __func__); - } cuda_ctx->cuda_graph->disable_due_to_gpu_arch = true; +#ifndef NDEBUG + GGML_LOG_DEBUG("%s: disabling CUDA graphs due to GPU architecture\n", __func__); +#endif } } - return cuda_ctx->cuda_graph->is_enabled(); -#else - GGML_UNUSED(cuda_ctx); - return false; -#endif // USE_CUDA_GRAPH -} - -static enum ggml_status ggml_backend_cuda_graph_compute(ggml_backend_t backend, ggml_cgraph * cgraph) { - ggml_backend_cuda_context * cuda_ctx = (ggml_backend_cuda_context *) backend->context; - - ggml_cuda_set_device(cuda_ctx->device); - - bool use_cuda_graph = false; - bool cuda_graph_update_required = false; - -#ifdef USE_CUDA_GRAPH - use_cuda_graph = ggml_cuda_graph_set_enabled(cuda_ctx); - - if (cuda_ctx->cuda_graph->is_enabled()) { - cuda_graph_update_required = ggml_cuda_graph_update_required(cuda_ctx, cgraph); - use_cuda_graph = ggml_cuda_graph_check_compability(cgraph); - - cuda_ctx->cuda_graph->record_update(use_cuda_graph, cuda_graph_update_required); + // Disable CUDA graphs in presence of env var, old GPU, use-case which is changing too rapidly, + // or previous graph capture failure. + // Also disable for multi-gpu for now. TO DO investigate + if (disable_cuda_graphs_due_to_env + || cuda_ctx->cuda_graph->disable_due_to_gpu_arch + || cuda_ctx->cuda_graph->disable_due_to_too_many_updates + || cuda_ctx->cuda_graph->disable_due_to_failed_graph_capture) { + use_cuda_graph = false; + } + + if (use_cuda_graph) { + cuda_graph_update_required = is_cuda_graph_update_required(cuda_ctx, cgraph); + + use_cuda_graph = check_node_graph_compatibility(cgraph, use_cuda_graph); + + // Disable CUDA graphs (from the next token) if the use-case is demanding too many consecutive graph updates. + if (use_cuda_graph && cuda_graph_update_required) { + cuda_ctx->cuda_graph->number_consecutive_updates++; + } else { + cuda_ctx->cuda_graph->number_consecutive_updates = 0; + } + + if (cuda_ctx->cuda_graph->number_consecutive_updates >= 4) { + cuda_ctx->cuda_graph->disable_due_to_too_many_updates = true; +#ifndef NDEBUG + GGML_LOG_DEBUG("%s: disabling CUDA graphs due to too many consecutive updates\n", __func__); +#endif + } } -#endif // USE_CUDA_GRAPH if (use_cuda_graph && cuda_graph_update_required) { // Start CUDA graph capture @@ -3773,7 +3767,14 @@ static enum ggml_status ggml_backend_cuda_graph_compute(ggml_backend_t backend, CUDA_CHECK(cudaStreamBeginCapture(cuda_ctx->stream(), cudaStreamCaptureModeRelaxed)); } - ggml_cuda_graph_evaluate_and_capture(cuda_ctx, cgraph, use_cuda_graph, cuda_graph_update_required); +#else + bool use_cuda_graph = false; + bool cuda_graph_update_required = false; +#endif // USE_CUDA_GRAPH + + bool graph_evaluated_or_captured = false; + + evaluate_and_capture_cuda_graph(cuda_ctx, cgraph, graph_evaluated_or_captured, use_cuda_graph, cuda_graph_update_required); return GGML_STATUS_SUCCESS; } @@ -3806,10 +3807,8 @@ static void ggml_backend_cuda_event_wait(ggml_backend_t backend, ggml_backend_ev static void ggml_backend_cuda_graph_optimize(ggml_backend_t backend, ggml_cgraph * cgraph) { ggml_backend_cuda_context * cuda_ctx = (ggml_backend_cuda_context *) backend->context; - const bool use_cuda_graph = ggml_cuda_graph_set_enabled(cuda_ctx); - static bool enable_graph_optimization = [] { - const char * env = getenv("GGML_CUDA_GRAPH_OPT"); + const char * env = getenv("GGML_CUDA_GRAPH_OPT"); return env != nullptr && atoi(env) == 1; }(); @@ -3817,13 +3816,12 @@ static void ggml_backend_cuda_graph_optimize(ggml_backend_t backend, ggml_cgraph return; } + GGML_ASSERT(ggml_backend_cuda_get_device_count() == 1 && "compute graph optimization is only supported on single GPU in the CUDA backend"); + GGML_LOG_DEBUG("Optimizing CUDA graph %p with %d nodes\n", cgraph->nodes, cgraph->n_nodes); + ggml_cuda_stream_context & stream_context = cuda_ctx->stream_context(); stream_context.reset(); - if (!use_cuda_graph || ggml_backend_cuda_get_device_count() != 1) { - return; - } - // number of out-degrees for a particular node std::unordered_map fan_out; // reverse mapping of node to index in the cgraph @@ -3884,12 +3882,6 @@ static void ggml_backend_cuda_graph_optimize(ggml_backend_t backend, ggml_cgraph if (count >= min_fan_out && count <= max_fan_out) { const int root_node_idx = node_indices[root_node]; - // only optimize for attn_norm - // TODO: make this more generic - if (!strstr(root_node->name, "attn_norm")) { - continue; - } - bool is_part_of_event = false; for (const auto & [start, end] : concurrent_node_ranges) { if (root_node_idx >= start && root_node_idx <= end) { @@ -4125,7 +4117,6 @@ struct ggml_backend_cuda_device_context { std::string name; std::string description; std::string pci_bus_id; - int op_offload_min_batch_size; }; static const char * ggml_backend_cuda_device_get_name(ggml_backend_dev_t dev) { @@ -4553,7 +4544,7 @@ static bool ggml_backend_cuda_device_supports_op(ggml_backend_dev_t dev, const g case GGML_OP_L2_NORM: return true; case GGML_OP_RMS_NORM_BACK: - return ggml_is_contiguous(op->src[0]); + return ggml_is_contiguous(op->src[0]) && op->ne[0] % WARP_SIZE == 0; break; case GGML_OP_NONE: case GGML_OP_RESHAPE: @@ -4619,7 +4610,6 @@ static bool ggml_backend_cuda_device_supports_op(ggml_backend_dev_t dev, const g return true; case GGML_OP_SUM: return ggml_is_contiguous_rows(op->src[0]); - case GGML_OP_TOP_K: case GGML_OP_ARGSORT: #ifndef GGML_CUDA_USE_CUB return op->src[0]->ne[0] <= 1024; @@ -4680,9 +4670,11 @@ static int64_t get_op_batch_size(const ggml_tensor * op) { } static bool ggml_backend_cuda_device_offload_op(ggml_backend_dev_t dev, const ggml_tensor * op) { - ggml_backend_cuda_device_context * dev_ctx = (ggml_backend_cuda_device_context *) dev->context; + const int min_batch_size = 32; - return get_op_batch_size(op) >= dev_ctx->op_offload_min_batch_size; + return get_op_batch_size(op) >= min_batch_size; + + GGML_UNUSED(dev); } static ggml_backend_event_t ggml_backend_cuda_device_event_new(ggml_backend_dev_t dev) { @@ -4793,16 +4785,6 @@ static ggml_backend_feature * ggml_backend_cuda_get_features(ggml_backend_reg_t features.push_back({ "FA_ALL_QUANTS", "1" }); #endif - { - const auto & info = ggml_cuda_info(); - for (int id = 0; id < info.device_count; ++id) { - if (blackwell_mma_available(info.devices[id].cc)) { - features.push_back({ "BLACKWELL_NATIVE_FP4", "1"}); - break; - } - } - } - #undef _STRINGIFY #undef STRINGIFY @@ -4850,7 +4832,6 @@ ggml_backend_reg_t ggml_backend_cuda_reg() { std::lock_guard lock(mutex); if (!initialized) { ggml_backend_cuda_reg_context * ctx = new ggml_backend_cuda_reg_context; - const int min_batch_size = getenv("GGML_OP_OFFLOAD_MIN_BATCH") ? atoi(getenv("GGML_OP_OFFLOAD_MIN_BATCH")) : 32; for (int i = 0; i < ggml_cuda_info().device_count; i++) { ggml_backend_cuda_device_context * dev_ctx = new ggml_backend_cuda_device_context; @@ -4864,7 +4845,6 @@ ggml_backend_reg_t ggml_backend_cuda_reg() { char pci_bus_id[16] = {}; snprintf(pci_bus_id, sizeof(pci_bus_id), "%04x:%02x:%02x.0", prop.pciDomainID, prop.pciBusID, prop.pciDeviceID); dev_ctx->pci_bus_id = pci_bus_id; - dev_ctx->op_offload_min_batch_size = min_batch_size; ggml_backend_dev_t dev = new ggml_backend_device { /* .iface = */ ggml_backend_cuda_device_interface, diff --git a/ggml/src/ggml-cuda/mean.cu b/ggml/src/ggml-cuda/mean.cu index 60542fc..691d8dc 100644 --- a/ggml/src/ggml-cuda/mean.cu +++ b/ggml/src/ggml-cuda/mean.cu @@ -34,11 +34,13 @@ void ggml_cuda_op_mean(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { // CUDA_GRAPHS_DISABLED ((ncols > 65536) && ((ctx.cuda_graph->instance == nullptr) && (iscapturing == cudaStreamCaptureStatusNone) || - ctx.cuda_graph->is_enabled())) || + 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->is_enabled()))) { + 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))) { #else (ncols > 65536)) { #endif // USE_CUDA_GRAPH diff --git a/ggml/src/ggml-cuda/mma.cuh b/ggml/src/ggml-cuda/mma.cuh index 42085d1..3268dad 100644 --- a/ggml/src/ggml-cuda/mma.cuh +++ b/ggml/src/ggml-cuda/mma.cuh @@ -206,16 +206,10 @@ namespace ggml_cuda_mma { static __device__ __forceinline__ int get_j(const int l) { if constexpr (I == 16 && J == 16) { + // matrix C #if defined(RDNA3) - if constexpr (std::is_same_v || std::is_same_v) { - // matrix C - return 2 * l + (threadIdx.x / 16); - } else { - // matrix A&B - return l; - } + return 2 * l + (threadIdx.x / 16); #else - // matrix C is the transposed matrix A&B on RDNA4 return ne * (threadIdx.x / 16) + l; #endif // defined(RDNA3) } else if constexpr (I == 16 && J == 8) { @@ -627,21 +621,6 @@ namespace ggml_cuda_mma { return ret; } -#elif defined(AMD_WMMA_AVAILABLE) - template - static __device__ __forceinline__ tile get_half2(const tile & tile_float) { - tile ret; -#pragma unroll - for (int l0 = 0; l0 < tile_float.ne; l0 += 2) { - ret.x[l0/2] = make_half2(tile_float.x[l0 + 0], tile_float.x[l0 + 1]); - } - return ret; - } - - static __device__ __forceinline__ tile<8, 8, half2> get_transposed(const tile<16, 4, half2> & t) { - NO_DEVICE_CODE; - return tile<8, 8, half2>{}; - } #else // Volta template static __device__ __forceinline__ tile get_half2(const tile & tile_float) { @@ -660,19 +639,6 @@ namespace ggml_cuda_mma { } #endif // defined(TURING_MMA_AVAILABLE) - static __device__ __forceinline__ void make_identity_mat(tile<16, 8, half2> & t) { -#if defined(RDNA4) - const int row = t.get_i(0); - const int left_right = t.get_j(0) / 4; - const int up_down = row / 8; - const int idx = row % 8; - reinterpret_cast(t.x)[idx] = left_right == up_down ? 1.0f : 0.0f; -#else - GGML_UNUSED_VARS(t); - NO_DEVICE_CODE; -#endif // defined(RDNA4) - } - template static __device__ __forceinline__ void load_generic(tile & t, const T * __restrict__ xs0, const int stride) { #if defined(AMD_MFMA_AVAILABLE) @@ -912,17 +878,6 @@ namespace ggml_cuda_mma { : "+r"(Dxi[2]), "+r"(Dxi[3]) : "r"(Axi[2]), "r"(Axi[3]), "r"(Bxi[3])); #endif // __CUDA_ARCH__ >= GGML_CUDA_CC_AMPERE -#elif defined(AMD_WMMA_AVAILABLE) -#if defined(RDNA4) - using halfx8_t = __attribute__((ext_vector_type(8))) _Float16; - halfx8_t& acc_frag = reinterpret_cast(D.x[0]); - const halfx8_t& a_frag = reinterpret_cast(A.x[0]); - const halfx8_t& b_frag = reinterpret_cast(B.x[0]); - acc_frag = __builtin_amdgcn_wmma_f16_16x16x16_f16_w32_gfx12(a_frag, b_frag, acc_frag); -#else - GGML_UNUSED_VARS(D, A, B); - NO_DEVICE_CODE; -#endif // defined(RDNA4) #else GGML_UNUSED_VARS(D, A, B); NO_DEVICE_CODE; @@ -945,27 +900,6 @@ namespace ggml_cuda_mma { #endif // AMPERE_MMA_AVAILABLE } - static __device__ __forceinline__ void mma_block_scaled(tile<16, 8, float> & D, - const tile<16, 8, int> & A, - const tile<8, 8, int> & B, - uint32_t a_scale, - uint32_t b_scale) { -#ifdef BLACKWELL_MMA_AVAILABLE - const int * Axi = (const int *) A.x; - const int * Bxi = (const int *) B.x; - float * Dxi = (float *) D.x; - - asm volatile( - "mma.sync.aligned.kind::mxf4.block_scale.scale_vec::2X.m16n8k64.row.col.f32.e2m1.e2m1.f32.ue8m0 " - "{%0, %1, %2, %3}, {%4, %5, %6, %7}, {%8, %9}, {%0, %1, %2, %3}, " - "%10, {0, 0}, %11, {0, 0};" - : "+f"(Dxi[0]), "+f"(Dxi[1]), "+f"(Dxi[2]), "+f"(Dxi[3]) - : "r"(Axi[0]), "r"(Axi[1]), "r"(Axi[2]), "r"(Axi[3]), "r"(Bxi[0]), "r"(Bxi[1]), "r"(a_scale), "r"(b_scale)); -#else - GGML_UNUSED_VARS(D, A, B, a_scale, b_scale); -#endif // BLACKWELL_MMA_AVAILABLE - } - static __device__ __forceinline__ void mma( tile<16, 8, float> & D, const tile<16, 8, half2> & A, const tile<8, 8, half2> & B) { #ifdef TURING_MMA_AVAILABLE diff --git a/ggml/src/ggml-cuda/mmq.cu b/ggml/src/ggml-cuda/mmq.cu index 9a69f41..f7a2cbc 100644 --- a/ggml/src/ggml-cuda/mmq.cu +++ b/ggml/src/ggml-cuda/mmq.cu @@ -1,4 +1,3 @@ -#include "common.cuh" #include "mmq.cuh" #include "quantize.cuh" #include "mmid.cuh" @@ -115,9 +114,6 @@ void ggml_cuda_mul_mat_q( const bool use_stream_k = (GGML_CUDA_CC_IS_NVIDIA(cc) && ggml_cuda_highest_compiled_arch(cc) >= GGML_CUDA_CC_VOLTA) || GGML_CUDA_CC_IS_CDNA(cc); - // TODO: tighter pool buffer size vs q8 path - const bool use_native_mxfp4 = blackwell_mma_available(cc) && src0->type == GGML_TYPE_MXFP4; - if (!ids) { const size_t nbytes_src1_q8_1 = ne13*ne12 * ne11*ne10_padded * sizeof(block_q8_1)/QK8_1 + get_mmq_x_max_host(cc)*sizeof(block_q8_1_mmq); @@ -127,24 +123,12 @@ void ggml_cuda_mul_mat_q( const int64_t s11 = src1->nb[1] / ts_src1; const int64_t s12 = src1->nb[2] / ts_src1; const int64_t s13 = src1->nb[3] / ts_src1; - if (use_native_mxfp4) { - static_assert(sizeof(block_fp4_mmq) == 4 * sizeof(block_q8_1)); - quantize_mmq_mxfp4_cuda(src1_d, nullptr, src1_q8_1.get(), src0->type, ne10, s11, s12, s13, ne10_padded, - ne11, ne12, ne13, stream); - - } else { - quantize_mmq_q8_1_cuda(src1_d, nullptr, src1_q8_1.get(), src0->type, ne10, s11, s12, s13, ne10_padded, - ne11, ne12, ne13, stream); - } + quantize_mmq_q8_1_cuda(src1_d, nullptr, src1_q8_1.get(), src0->type, + ne10, s11, s12, s13, ne10_padded, ne11, ne12, ne13, stream); CUDA_CHECK(cudaGetLastError()); } - // Stride depends on quantization format - const int64_t s12 = use_native_mxfp4 ? - ne11 * ne10_padded * sizeof(block_fp4_mmq) / - (8 * QK_MXFP4 * sizeof(int)) // block_fp4_mmq holds 256 values (8 blocks of 32) - : - ne11 * ne10_padded * sizeof(block_q8_1) / (QK8_1 * sizeof(int)); + const int64_t s12 = ne11*ne10_padded * sizeof(block_q8_1)/(QK8_1*sizeof(int)); const int64_t s13 = ne12*s12; const mmq_args args = { @@ -190,20 +174,13 @@ void ggml_cuda_mul_mat_q( { const int64_t s11 = src1->nb[1] / ts_src1; const int64_t s12 = src1->nb[2] / ts_src1; - const int64_t s13 = src1->nb[3] / ts_src1; - - if (use_native_mxfp4) { - quantize_mmq_mxfp4_cuda(src1_d, ids_src1.get(), src1_q8_1.get(), src0->type, ne10, s11, s12, s13, - ne10_padded, ne11_flat, ne12_flat, ne13_flat, stream); - } else { - quantize_mmq_q8_1_cuda(src1_d, ids_src1.get(), src1_q8_1.get(), src0->type, ne10, s11, s12, s13, - ne10_padded, ne11_flat, ne12_flat, ne13_flat, stream); - } + const int64_t s13 = src1->nb[2] / ts_src1; + quantize_mmq_q8_1_cuda(src1_d, ids_src1.get(), src1_q8_1.get(), src0->type, + ne10, s11, s12, s13, ne10_padded, ne11_flat, ne12_flat, ne13_flat, stream); CUDA_CHECK(cudaGetLastError()); } - const int64_t s12 = use_native_mxfp4 ? ne11 * ne10_padded * sizeof(block_fp4_mmq) / (8 * QK_MXFP4 * sizeof(int)) : - ne11 * ne10_padded * sizeof(block_q8_1) / (QK8_1 * sizeof(int)); + const int64_t s12 = ne11*ne10_padded * sizeof(block_q8_1)/(QK8_1*sizeof(int)); const int64_t s13 = ne12*s12; // Note that ne02 is used instead of ne12 because the number of y channels determines the z dimension of the CUDA grid. @@ -259,7 +236,7 @@ void ggml_cuda_op_mul_mat_q( GGML_UNUSED_VARS(src1, dst, src1_ddf_i, src1_padded_row_size); } -bool ggml_cuda_should_use_mmq(enum ggml_type type, int cc, int64_t ne11, int64_t n_experts) { +bool ggml_cuda_should_use_mmq(enum ggml_type type, int cc, int64_t ne11) { #ifdef GGML_CUDA_FORCE_CUBLAS return false; #endif // GGML_CUDA_FORCE_CUBLAS @@ -320,10 +297,7 @@ bool ggml_cuda_should_use_mmq(enum ggml_type type, int cc, int64_t ne11, int64_t if (GGML_CUDA_CC_IS_CDNA3(cc)) { return true; } - if (n_experts > 64 || ne11 <= 128) { - return true; - } - if (type == GGML_TYPE_Q4_0 || type == GGML_TYPE_Q4_1 || type == GGML_TYPE_Q5_0 || type == GGML_TYPE_Q5_1) { + if (ne11 <= 128 || type == GGML_TYPE_Q4_0 || type == GGML_TYPE_Q4_1 || type == GGML_TYPE_Q5_0 || type == GGML_TYPE_Q5_1) { return true; } if (ne11 <= 256 && (type == GGML_TYPE_Q4_K || type == GGML_TYPE_Q5_K)) { @@ -333,31 +307,6 @@ bool ggml_cuda_should_use_mmq(enum ggml_type type, int cc, int64_t ne11, int64_t } if (amd_wmma_available(cc)) { - if (GGML_CUDA_CC_IS_RDNA3(cc)) { - // High expert counts are almost always better on MMQ due to - // the synchronization overhead in the cuBLAS/hipBLAS path: - // https://github.com/ggml-org/llama.cpp/pull/18202 - if (n_experts >= 64) { - return true; - } - - // For some quantization types MMQ can have lower peak TOPS than hipBLAS - // so it's only faster for sufficiently small batch sizes: - switch (type) { - case GGML_TYPE_Q2_K: - return ne11 <= 128; - case GGML_TYPE_Q6_K: - return ne11 <= (GGML_CUDA_CC_IS_RDNA3_0(cc) ? 128 : 256); - case GGML_TYPE_IQ2_XS: - case GGML_TYPE_IQ2_S: - return GGML_CUDA_CC_IS_RDNA3_5(cc) || ne11 <= 128; - default: - return true; - } - } - - // For RDNA4 MMQ is consistently faster than dequantization + hipBLAS: - // https://github.com/ggml-org/llama.cpp/pull/18537#issuecomment-3706422301 return true; } diff --git a/ggml/src/ggml-cuda/mmq.cuh b/ggml/src/ggml-cuda/mmq.cuh index a382e6a..fa8a72c 100644 --- a/ggml/src/ggml-cuda/mmq.cuh +++ b/ggml/src/ggml-cuda/mmq.cuh @@ -11,7 +11,6 @@ using namespace ggml_cuda_mma; #define MMQ_DP4A_MAX_BATCH_SIZE 64 // Max. batch size to use for dp4a MMQ kernels when FP16 tensor cores are available. #define MMQ_ITER_K 256 -#define MMQ_ITER_K_MXFP4_FP4 512 #define MMQ_NWARPS 8 typedef void (*load_tiles_mmq_t)(const char * __restrict__ x, int * x_tile, const int kbx0, const int i_max, const int stride); @@ -45,15 +44,8 @@ struct block_q8_1_mmq { }; int8_t qs[4*QK8_1]; // 128 values quantized to 8 bit each }; - -struct block_fp4_mmq { - uint32_t d4[4]; // 8 E8M0 scales (1 per 32 values), 2 packed per uint32: d4[0]={s0,s1}, d4[1]={s2,s3}, etc. - int8_t qs[4 * 32]; // 256 FP4 values packed as 4-bit pairs (2 per byte), 8 blocks of 32 values -}; - static_assert(sizeof(block_q8_1_mmq) == 4*QK8_1 + 4*sizeof(half2), "Unexpected block_q8_1_mmq size"); static_assert(sizeof(block_q8_1_mmq) == 4*sizeof(block_q8_1), "Unexpected block_q8_1_mmq size"); -static_assert(sizeof(block_fp4_mmq) == sizeof(block_q8_1_mmq), "Unexpected block_fp4_mmq size"); static mmq_q8_1_ds_layout mmq_get_q8_1_ds_layout(const ggml_type type_x) { switch (type_x) { @@ -137,14 +129,6 @@ static int get_mmq_y_host(const int cc) { ((GGML_CUDA_CC_IS_NVIDIA(cc) && ggml_cuda_highest_compiled_arch(cc) >= GGML_CUDA_CC_VOLTA) ? 128 : 64); } -static constexpr __device__ int get_iter_k([[maybe_unused]] const ggml_type type) { -#if defined(BLACKWELL_MMA_AVAILABLE) - return type == GGML_TYPE_MXFP4 ? MMQ_ITER_K_MXFP4_FP4 : MMQ_ITER_K; -#else - return MMQ_ITER_K; -#endif // defined(BLACKWELL_MMA_AVAILABLE) -} - static constexpr __device__ int get_mmq_y_device() { #if defined(GGML_USE_HIP) #if defined(RDNA1) @@ -207,7 +191,6 @@ static constexpr __host__ __device__ tile_x_sizes mmq_get_dp4a_tile_x_sizes(ggml } #define MMQ_MMA_TILE_X_K_Q8_0 (2*MMQ_TILE_NE_K + 2*MMQ_TILE_NE_K/QI8_0 + 4) -#define MMQ_MMA_TILE_X_K_FP4 (2*MMQ_TILE_NE_K + 8 + 4) #define MMQ_MMA_TILE_X_K_Q8_1 (2*MMQ_TILE_NE_K + 2*MMQ_TILE_NE_K/QI8_0 + 4) #define MMQ_MMA_TILE_X_K_Q2_K (2*MMQ_TILE_NE_K + MMQ_TILE_NE_K + 4) #define MMQ_MMA_TILE_X_K_Q3_K (2*MMQ_TILE_NE_K + MMQ_TILE_NE_K/2 + 4) @@ -218,8 +201,6 @@ static_assert(MMQ_MMA_TILE_X_K_Q8_1 % 8 == 4, "Wrong padding."); static_assert(MMQ_MMA_TILE_X_K_Q2_K % 8 == 4, "Wrong padding."); static_assert(MMQ_MMA_TILE_X_K_Q3_K % 8 == 4, "Wrong padding."); static_assert(MMQ_MMA_TILE_X_K_Q6_K % 8 == 4, "Wrong padding."); -static_assert(MMQ_MMA_TILE_X_K_FP4 % 8 == 4, "Wrong padding."); -static_assert(MMQ_MMA_TILE_X_K_FP4 == MMQ_MMA_TILE_X_K_Q8_1, "Wrong tile size for MXFP4"); static constexpr __host__ __device__ int mmq_get_mma_tile_x_k(ggml_type type) { switch (type) { @@ -228,7 +209,6 @@ static constexpr __host__ __device__ int mmq_get_mma_tile_x_k(ggml_type type) { case GGML_TYPE_Q5_0: return MMQ_MMA_TILE_X_K_Q8_0; case GGML_TYPE_Q5_1: return MMQ_MMA_TILE_X_K_Q8_1; case GGML_TYPE_Q8_0: return MMQ_MMA_TILE_X_K_Q8_0; - // tile sizes are the same for Q8_1 and FP4 for blackwell case GGML_TYPE_MXFP4: return MMQ_MMA_TILE_X_K_Q8_1; case GGML_TYPE_Q2_K: return MMQ_MMA_TILE_X_K_Q2_K; case GGML_TYPE_Q3_K: return MMQ_MMA_TILE_X_K_Q3_K; @@ -248,8 +228,7 @@ static constexpr __host__ __device__ int mmq_get_mma_tile_x_k(ggml_type type) { } // block_q8_1_mmq has (128 8-bit ints == 32 32-bit ints + 4 32-bit scales) -#define MMQ_TILE_Y_K (MMQ_TILE_NE_K + MMQ_TILE_NE_K / QI8_1) -#define MMQ_TILE_Y_FP4_K MMQ_TILE_Y_K +#define MMQ_TILE_Y_K (MMQ_TILE_NE_K + MMQ_TILE_NE_K/QI8_1) static int mmq_get_granularity_host(const int mmq_x, const int cc) { if (amd_mfma_available(cc) || amd_wmma_available(cc)) { @@ -782,50 +761,6 @@ template static __device__ __forceinline__ void loa } } -template -static __device__ __forceinline__ void load_tiles_mxfp4_fp4(const char * __restrict__ x, - int * __restrict__ x_tile, - const int kbx0, - const int i_max, - const int stride) { - constexpr int nwarps = mmq_get_nwarps_device(); - constexpr int warp_size = ggml_cuda_get_physical_warp_size(); - - int * x_qs = (int *) x_tile; - uint32_t * x_sc = (uint32_t *) (x_qs + 2 * MMQ_TILE_NE_K); - - const int txi = threadIdx.x; - - constexpr int iter_k = get_iter_k(GGML_TYPE_MXFP4); - - constexpr int threads_per_row = iter_k / QK_MXFP4; // each thread processes 1 block - constexpr int rows_per_warp = warp_size / threads_per_row; - const int kbx = txi % threads_per_row; - const int row_in_warp = txi / threads_per_row; - -#pragma unroll - for (int i0 = 0; i0 < mmq_y; i0 += rows_per_warp * nwarps) { - int i = i0 + threadIdx.y * rows_per_warp + row_in_warp; - - if constexpr (need_check) { - i = min(i, i_max); - } - - const block_mxfp4 * bxi = (const block_mxfp4 *) x + kbx0 + i * stride + kbx; - - // quantize_mxfp4_mmq permutes nibbles to match the quantized format - const int k0 = kbx * 4; - memcpy(x_qs + i * MMQ_MMA_TILE_X_K_FP4 + k0, bxi->qs, 16); - - // Load E8M0 scales: pack 2 consecutive scales into one uint32 - if (kbx % 2 == 0) { - uint32_t e = bxi->e; - e |= ((bxi + 1)->e << 8); - x_sc[i * MMQ_MMA_TILE_X_K_FP4 + kbx / 2] = e; - } - } -} - template static __device__ __forceinline__ void vec_dot_q8_0_q8_1_dp4a( const int * __restrict__ x, const int * __restrict__ y, float * __restrict__ sum, const int k00) { @@ -996,78 +931,6 @@ static __device__ __forceinline__ void vec_dot_q8_0_q8_1_mma( #endif // defined(AMD_MFMA_AVAILABLE) || defined(AMD_WMMA_AVAILABLE) } -template -static __device__ __forceinline__ void vec_dot_mxfp4_mxfp4_mma(const int * __restrict__ x, - const int * __restrict__ y, - float * __restrict__ sum, - const int k00) { - typedef tile<16, 8, int> tile_A; - typedef tile<8, 8, int> tile_B; - typedef tile<16, 8, float> tile_C; // Output is float for native scaled MMA - - constexpr int granularity = mmq_get_granularity_device(mmq_x); - constexpr int rows_per_warp = 2 * granularity; - constexpr int ntx = rows_per_warp / tile_C::I; // Number of x minitiles per warp. - - y += (threadIdx.y % ntx) * (tile_C::J * MMQ_TILE_Y_FP4_K); - - // Match layout from load_tiles_mxfp4_fp4 - const int * x_qs = (const int *) x; - const uint32_t * x_sc = (const uint32_t *) (x_qs + 2 * MMQ_TILE_NE_K); - const int * y_qs = (const int *) y + 4; - const uint32_t * y_sc = (const uint32_t *) y; - - // tile_A has a length of 64 logical values vs. 32 values in block_mxfp4 - tile_A A[ntx][MMQ_TILE_NE_K / (2 * QI_MXFP4)]; - uint32_t scaleA[ntx][MMQ_TILE_NE_K / (2 * QI_MXFP4)]; - - // Block scale - // Each thread has to point to a 4 byte scale value - // https://docs.nvidia.com/cuda/parallel-thread-execution/#warp-level-block-scaling - - const int i0 = (threadIdx.y / ntx) * rows_per_warp; - -#pragma unroll - for (int n = 0; n < ntx; ++n) { -#pragma unroll - for (int k01 = 0; k01 < MMQ_TILE_NE_K; k01 += 2 * QI_MXFP4) { - const int k0 = k00 + k01; - - load_ldmatrix(A[n][k01 / (2 * QI_MXFP4)], x_qs + (i0 + n * tile_A::I) * MMQ_MMA_TILE_X_K_FP4 + k0, - MMQ_MMA_TILE_X_K_FP4); - - // based on block-scaling document, 2 threads in each quad need to supply to the scale value - const int tidx = threadIdx.x / 4 + (threadIdx.x % 2) * 8; - scaleA[n][k01 / (2 * QI_MXFP4)] = - *(x_sc + (i0 + n * tile_A::I + tidx) * MMQ_MMA_TILE_X_K_FP4 + k0 / (2 * QI_MXFP4)); - } - } - -#pragma unroll - for (int j0 = 0; j0 < mmq_x; j0 += ntx * tile_C::J) { -#pragma unroll - for (int k01 = 0; k01 < MMQ_TILE_NE_K; k01 += 2 * QI_MXFP4) { - tile_B B; - uint32_t scaleB; // 2xN scales - - load_generic(B, y_qs + j0 * MMQ_TILE_Y_FP4_K + k01, MMQ_TILE_Y_FP4_K); - - scaleB = y_sc[(j0 + threadIdx.x / 4) * MMQ_TILE_Y_FP4_K + k01 / (2 * QI_MXFP4)]; - -#pragma unroll - for (int n = 0; n < ntx; ++n) { - tile_C C; - - mma_block_scaled(C, A[n][k01 / (2 * QI_MXFP4)], B, scaleA[n][k01 / (2 * QI_MXFP4)], scaleB); -#pragma unroll - for (int l = 0; l < tile_C::ne; ++l) { - sum[(j0 / tile_C::J + n) * tile_C::ne + l] += C.x[l]; - } - } - } - } -} - template static __device__ __forceinline__ void vec_dot_q8_1_q8_1_dp4a( const int * __restrict__ x, const int * __restrict__ y, float * __restrict__ sum, const int k00) { @@ -3246,13 +3109,8 @@ struct mmq_type_traits { template struct mmq_type_traits { static constexpr int vdr = VDR_MXFP4_Q8_1_MMQ; -#ifdef BLACKWELL_MMA_AVAILABLE - static constexpr load_tiles_mmq_t load_tiles = load_tiles_mxfp4_fp4; - static constexpr vec_dot_mmq_t vec_dot_mma = vec_dot_mxfp4_mxfp4_mma; -#else static constexpr load_tiles_mmq_t load_tiles = load_tiles_mxfp4; static constexpr vec_dot_mmq_t vec_dot_mma = vec_dot_q8_0_q8_1_mma; -#endif // BLACKWELL_MMA_AVAILABLE static constexpr vec_dot_mmq_t vec_dot_dp4a = vec_dot_q8_0_q8_1_dp4a; }; @@ -3385,26 +3243,17 @@ static __device__ __forceinline__ void mul_mat_q_process_tile( constexpr mmq_write_back_t write_back = mmq_write_back_dp4a; #endif // defined(AMD_MFMA_AVAILABLE) || defined(TURING_MMA_AVAILABLE) || defined(AMD_WMMA_AVAILABLE) -#if defined(BLACKWELL_MMA_AVAILABLE) - // FP4 tile stores 8 blocks - constexpr int ne_block = (type == GGML_TYPE_MXFP4) ? 8 * QK_MXFP4 : 4 * QK8_1; -#else - constexpr int ne_block = 4 * QK8_1; -#endif // defined(BLACKWELL_MMA_AVAILABLE) - - constexpr int ITER_K = get_iter_k(type); - constexpr int blocks_per_iter = ITER_K / qk; + constexpr int blocks_per_iter = MMQ_ITER_K / qk; float sum[mmq_x*mmq_y / (nwarps*warp_size)] = {0.0f}; - constexpr int sz = sizeof(block_q8_1_mmq) / sizeof(int); - for (int kb0 = kb0_start; kb0 < kb0_stop; kb0 += blocks_per_iter) { load_tiles(x, tile_x, offset_x + kb0, tile_x_max_i, stride_row_x); + { - const int * by0 = y + ncols_y * (kb0 * qk / ne_block) * sz; + const int * by0 = y + ncols_y*(kb0*(qk*sizeof(block_q8_1_mmq) / (4*QK8_1*sizeof(int))) + 0*sizeof(block_q8_1_mmq)/sizeof(int)); #pragma unroll - for (int l0 = 0; l0 < mmq_x * MMQ_TILE_Y_K; l0 += nwarps * warp_size) { + for (int l0 = 0; l0 < mmq_x*MMQ_TILE_Y_K; l0 += nwarps*warp_size) { int l = l0 + threadIdx.y*warp_size + threadIdx.x; tile_y[l] = by0[l]; @@ -3418,9 +3267,9 @@ static __device__ __forceinline__ void mul_mat_q_process_tile( __syncthreads(); { - const int * by0 = y + ncols_y * ((kb0 * qk / ne_block) * sz + sz); + const int * by0 = y + ncols_y*(kb0*(qk*sizeof(block_q8_1_mmq) / (4*QK8_1*sizeof(int))) + 1*sizeof(block_q8_1_mmq)/sizeof(int)); #pragma unroll - for (int l0 = 0; l0 < mmq_x * MMQ_TILE_Y_K; l0 += nwarps * warp_size) { + for (int l0 = 0; l0 < mmq_x*MMQ_TILE_Y_K; l0 += nwarps*warp_size) { int l = l0 + threadIdx.y*warp_size + threadIdx.x; tile_y[l] = by0[l]; @@ -3552,10 +3401,8 @@ static __global__ void mul_mat_q( } #endif // (defined(GGML_USE_HIP) && !defined(CDNA3)) || __CUDA_ARCH__ < GGML_CUDA_CC_VOLTA - constexpr int ITER_K = get_iter_k(type); - const int64_t blocks_per_ne00 = ncols_x / qk; - constexpr int blocks_per_iter = ITER_K / qk; + constexpr int blocks_per_iter = MMQ_ITER_K / qk; // kbc == k block continuous, current index in continuous ijk space. int64_t kbc = (int64_t) blockIdx.x *nsamples_y*nchannels_y*ntx*nty*blocks_per_ne00 / gridDim.x; @@ -3616,7 +3463,7 @@ static __global__ void mul_mat_q( __syncthreads(); } - offset_y += (col_low + jt * mmq_x) * (sizeof(block_q8_1_mmq) / sizeof(int)); + offset_y += (col_low + jt*mmq_x)*(sizeof(block_q8_1_mmq)/sizeof(int)); offset_dst += it*mmq_y; const int tile_x_max_i = nrows_x - it*mmq_y - 1; @@ -3683,7 +3530,7 @@ static __global__ void mul_mat_q( __syncthreads(); } - offset_y += (col_low + jt * mmq_x) * (sizeof(block_q8_1_mmq) / sizeof(int)); + offset_y += (col_low + jt*mmq_x)*(sizeof(block_q8_1_mmq)/sizeof(int)); offset_dst += it*mmq_y; const int tile_x_max_i = nrows_x - it*mmq_y - 1; @@ -3706,9 +3553,7 @@ static __global__ void mul_mat_q_stream_k_fixup( const int ncols_max) { constexpr int mmq_y = get_mmq_y_device(); constexpr int qk = ggml_cuda_type_traits::qk; - constexpr int ITER_K = get_iter_k(type); - - constexpr int blocks_per_iter = ITER_K / qk; + constexpr int blocks_per_iter = MMQ_ITER_K / qk; const int64_t blocks_per_ne00 = ncols_x / qk; constexpr int nwarps = mmq_get_nwarps_device(); @@ -3866,7 +3711,7 @@ static size_t mmq_get_nbytes_shared(const int mmq_x, const int mmq_y, const int const int mmq_tile_x_k = mmq_get_mma_tile_x_k(type); const size_t nbs_ids = mmq_x*sizeof(int); const size_t nbs_x = (turing_mma_available(cc) || amd_mfma_available(cc) || amd_wmma_available(cc)) ? mmq_y*mmq_tile_x_k*sizeof(int) : txs.qs*sizeof(int) + txs.dm*sizeof(half2) + txs.sc*sizeof(int); - const size_t nbs_y = mmq_x * (sizeof(block_q8_1_mmq)); + const size_t nbs_y = mmq_x*sizeof(block_q8_1_mmq); return nbs_ids + nbs_x + GGML_PAD(nbs_y, nwarps*warp_size*sizeof(int)); } @@ -4082,4 +3927,4 @@ void ggml_cuda_op_mul_mat_q( const char * src1_ddq_i, float * dst_dd_i, const int64_t row_low, const int64_t row_high, const int64_t src1_ncols, const int64_t src1_padded_row_size, cudaStream_t stream); -bool ggml_cuda_should_use_mmq(enum ggml_type type, int cc, int64_t ne11, int64_t n_experts); +bool ggml_cuda_should_use_mmq(enum ggml_type type, int cc, int64_t ne11); diff --git a/ggml/src/ggml-cuda/norm.cu b/ggml/src/ggml-cuda/norm.cu index ef98f67..4f153c5 100644 --- a/ggml/src/ggml-cuda/norm.cu +++ b/ggml/src/ggml-cuda/norm.cu @@ -25,8 +25,19 @@ static __global__ void norm_f32( } // sum up partial sums - extern __shared__ float2 s_sum2[]; - mean_var = block_reduce(mean_var, s_sum2); + mean_var = warp_reduce_sum(mean_var); + if constexpr (block_size > WARP_SIZE) { + static_assert(block_size == 1024, "unexpected block_size"); + __shared__ float2 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] = mean_var; + } + __syncthreads(); + mean_var = s_sum[lane_id]; + mean_var = warp_reduce_sum(mean_var); + } const float mean = mean_var.x / ncols; const float var = mean_var.y / ncols - mean * mean; @@ -50,8 +61,19 @@ static __global__ void group_norm_f32(const float * x, float * dst, const int gr tmp += x[j]; } - extern __shared__ float s_sum[]; - tmp = block_reduce(tmp, s_sum); + tmp = warp_reduce_sum(tmp); + if constexpr (block_size > WARP_SIZE) { + static_assert(block_size == 1024, "unexpected block_size"); + __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] = tmp; + } + __syncthreads(); + tmp = s_sum[lane_id]; + tmp = warp_reduce_sum(tmp); + } const float mean = tmp / group_size; tmp = 0.0f; @@ -62,7 +84,18 @@ static __global__ void group_norm_f32(const float * x, float * dst, const int gr tmp += xi * xi; } - tmp = block_reduce(tmp, s_sum); + tmp = warp_reduce_sum(tmp); + if (block_size > WARP_SIZE) { + __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] = tmp; + } + __syncthreads(); + tmp = s_sum[lane_id]; + tmp = warp_reduce_sum(tmp); + } const float variance = tmp / group_size; const float scale = rsqrtf(variance + eps); @@ -130,8 +163,22 @@ static __global__ void rms_norm_f32(const float * x, } // sum up partial sums - extern __shared__ float s_sum[]; - tmp = block_reduce(tmp, s_sum); + tmp = warp_reduce_sum(tmp); + if constexpr (block_size > WARP_SIZE) { + static_assert((block_size <= 1024) && (block_size % 32 == 0), "unexpected block_size"); + __shared__ float s_sum[32]; + const int warp_id = tid / WARP_SIZE; + const int lane_id = tid % WARP_SIZE; + if (lane_id == 0) { + s_sum[warp_id] = tmp; + } + __syncthreads(); + tmp = 0.0f; + if (lane_id < (block_size / WARP_SIZE)) { + tmp = s_sum[lane_id]; + } + tmp = warp_reduce_sum(tmp); + } const float mean = tmp / ncols; const float scale = rsqrtf(mean + eps); @@ -259,8 +306,19 @@ static __global__ void l2_norm_f32( } // sum up partial sums - extern __shared__ float s_sum[]; - tmp = block_reduce(tmp, s_sum); + tmp = warp_reduce_sum(tmp); + if constexpr (block_size > WARP_SIZE) { + static_assert(block_size == 1024, "unexpected block_size"); + __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] = tmp; + } + __syncthreads(); + tmp = s_sum[lane_id]; + tmp = warp_reduce_sum(tmp); + } // from https://pytorch.org/docs/stable/generated/torch.nn.functional.normalize.html const float scale = rsqrtf(fmaxf(tmp, eps * eps)); @@ -279,7 +337,7 @@ static void norm_f32_cuda( norm_f32<<>>(x, dst, ncols, stride_row, stride_channel, stride_sample, eps); } else { const dim3 block_dims(1024, 1, 1); - norm_f32<1024><< WARP_SIZE ? 32 * sizeof(float2): 0, stream>>>(x, dst, ncols, stride_row, stride_channel, stride_sample, eps); + norm_f32<1024><<>>(x, dst, ncols, stride_row, stride_channel, stride_sample, eps); } } @@ -290,7 +348,7 @@ static void group_norm_f32_cuda( group_norm_f32<<>>(x, dst, group_size, ne_elements, eps); } else { const dim3 block_dims(1024, 1, 1); - group_norm_f32<1024><< WARP_SIZE ? 32 * sizeof(float): 0, stream>>>(x, dst, group_size, ne_elements, eps); + group_norm_f32<1024><<>>(x, dst, group_size, ne_elements, eps); } } @@ -300,10 +358,10 @@ static void rms_norm_f32_cuda( const dim3 blocks_num(nrows, nchannels, nsamples); if (ncols < 1024) { const dim3 block_dims(256, 1, 1); - rms_norm_f32<256, false><< WARP_SIZE ? 32 * sizeof(float): 0, stream>>>(x, dst, ncols, stride_row, stride_channel, stride_sample, eps); + rms_norm_f32<256, false><<>>(x, dst, ncols, stride_row, stride_channel, stride_sample, eps); } else { const dim3 block_dims(1024, 1, 1); - rms_norm_f32<1024, false><< WARP_SIZE ? 32 * sizeof(float): 0, stream>>>(x, dst, ncols, stride_row, stride_channel, stride_sample, eps); + rms_norm_f32<1024, false><<>>(x, dst, ncols, stride_row, stride_channel, stride_sample, eps); } } @@ -346,12 +404,12 @@ static void rms_norm_mul_f32_cuda(const float * x, const uint3 mul_nsamples_packed = init_fastdiv_values(mul_nsamples); if (ncols < 1024) { const dim3 block_dims(256, 1, 1); - rms_norm_f32<256, true><< WARP_SIZE ? 32 * sizeof(float): 0, stream>>>( + rms_norm_f32<256, true><<>>( x, dst, ncols, stride_row, stride_channel, stride_sample, eps, mul, mul_stride_row, mul_stride_channel, mul_stride_sample, mul_ncols_packed, mul_nrows_packed, mul_nchannels_packed, mul_nsamples_packed); } else { const dim3 block_dims(1024, 1, 1); - rms_norm_f32<1024, true><< WARP_SIZE ? 32 * sizeof(float): 0, stream>>>( + rms_norm_f32<1024, true><<>>( x, dst, ncols, stride_row, stride_channel, stride_sample, eps, mul, mul_stride_row, mul_stride_channel, mul_stride_sample, mul_ncols_packed, mul_nrows_packed, mul_nchannels_packed, mul_nsamples_packed); } @@ -367,14 +425,14 @@ static void rms_norm_mul_f32_cuda(const float * x, const uint3 add_nsamples_packed = init_fastdiv_values(add_nsamples); if (ncols < 1024) { const dim3 block_dims(256, 1, 1); - rms_norm_f32<256, true, true><< WARP_SIZE ? 32 * sizeof(float): 0, stream>>>( + rms_norm_f32<256, true, true><<>>( x, dst, ncols, stride_row, stride_channel, stride_sample, eps, mul, mul_stride_row, mul_stride_channel, mul_stride_sample, mul_ncols_packed, mul_nrows_packed, mul_nchannels_packed, mul_nsamples_packed, add, add_stride_row, add_stride_channel, add_stride_sample, add_ncols_packed, add_nrows_packed, add_nchannels_packed, add_nsamples_packed); } else { const dim3 block_dims(1024, 1, 1); - rms_norm_f32<1024, true, true><< WARP_SIZE ? 32 * sizeof(float): 0, stream>>>( + rms_norm_f32<1024, true, true><<>>( x, dst, ncols, stride_row, stride_channel, stride_sample, eps, mul, mul_stride_row, mul_stride_channel, mul_stride_sample, mul_ncols_packed, mul_nrows_packed, mul_nchannels_packed, mul_nsamples_packed, add, add_stride_row, add_stride_channel, add_stride_sample, add_ncols_packed, add_nrows_packed, @@ -402,7 +460,7 @@ static void l2_norm_f32_cuda( l2_norm_f32<<>>(x, dst, ncols, stride_row, stride_channel, stride_sample, eps); } else { const dim3 block_dims(1024, 1, 1); - l2_norm_f32<1024><< WARP_SIZE ? 32 * sizeof(float): 0, stream>>>(x, dst, ncols, stride_row, stride_channel, stride_sample, eps); + l2_norm_f32<1024><<>>(x, dst, ncols, stride_row, stride_channel, stride_sample, eps); } } diff --git a/ggml/src/ggml-cuda/quantize.cu b/ggml/src/ggml-cuda/quantize.cu index a8c68e4..5117f9f 100644 --- a/ggml/src/ggml-cuda/quantize.cu +++ b/ggml/src/ggml-cuda/quantize.cu @@ -47,131 +47,6 @@ static __global__ void quantize_q8_1( y[ib].ds = make_half2(d, sum); } -__device__ __forceinline__ uint8_t compute_e8m0_scale(float amax) { - if (!(amax > 0.0f)) { - return 0; - } - - // FP4 E2M1: max exponent (unbiased) is 2. - constexpr int FP4_E2M1_EMAX = 2; - - const float e = log2f(amax); - - // "even" -> round-to-nearest integer, ties-to-even - const int e_int = __float2int_rn(e); - - const int shared_exp = e_int - FP4_E2M1_EMAX; - - int biased = shared_exp + 127; - - biased = max(biased, 0); - biased = min(biased, 254); - - return static_cast(biased); -} - -// quantize values in the format mxfp4 is stored which is interleaved nibbles -// i.e. a block a0-a31 is represented as a0a16,a1a17 ...a15a31 -static __global__ void quantize_mmq_mxfp4(const float * __restrict__ x, - const int32_t * __restrict__ ids, - void * __restrict__ vy, - const int64_t ne00, - const int64_t s01, - const int64_t s02, - const int64_t s03, - const int64_t ne0, - const int ne1, - const int ne2) { - constexpr int vals_per_scale = 32; - constexpr int vals_per_warp = 2 * vals_per_scale; // Each warp processes 2 blocks of 32 = 64 values - - const int warp_id = threadIdx.y; - const int lane_id_32 = threadIdx.x; - - const int nwarps = blockDim.y; - - const int64_t warp_start_offset = (blockIdx.y * nwarps + warp_id) * vals_per_warp; - - if (warp_start_offset >= ne0) { - return; - } - - const int64_t i1 = blockIdx.x; - const int64_t i2 = blockIdx.z % ne2; - const int64_t i3 = blockIdx.z / ne2; - - const int64_t i01 = ids ? ids[i1] : i1; - const int64_t i02 = i2; - const int64_t i03 = i3; - - block_fp4_mmq * y = (block_fp4_mmq *) vy; - - const int64_t block_fp4_mmq_size = 8 * QK_MXFP4; // 256 values - const int64_t ib0 = blockIdx.z * ((int64_t) ne1 * (ne0 / block_fp4_mmq_size)); - const int64_t ib = ib0 + (warp_start_offset / block_fp4_mmq_size) * ne1 + blockIdx.x; - const int64_t quad_idx_in_block = (warp_start_offset % block_fp4_mmq_size) / vals_per_warp; - - const int group_id = lane_id_32 / 4; - const int lane_in_group = lane_id_32 % 4; - const int base = group_id * 2; - char2 * yqs2 = (char2 *) y[ib].qs; - - const int64_t base_pos = i03 * s03 + i02 * s02 + i01 * s01; - - uint8_t scales[2]; - -#pragma unroll - for (int b = 0; b < 2; ++b) { - const int64_t i0 = warp_start_offset + b * vals_per_scale + lane_id_32; - const float xi = (i0 < ne00) ? x[base_pos + i0] : 0.0f; - - float amax = fabsf(xi); -#pragma unroll - for (int mask = 16; mask > 0; mask >>= 1) { - amax = fmaxf(amax, __shfl_xor_sync(0xFFFFFFFF, amax, mask, WARP_SIZE)); - } - - const uint8_t e = compute_e8m0_scale(amax); - scales[b] = e; - const float inv_s = (amax == 0.0f) ? 0.0f : __frcp_rn(ggml_cuda_e8m0_to_fp32(e)); - -#if CUDART_VERSION >= 12080 - const float scaled_val = xi * inv_s; - - const float val0 = __shfl_sync(0xFFFFFFFF, scaled_val, base, WARP_SIZE); - const float val1 = __shfl_sync(0xFFFFFFFF, scaled_val, base + 16, WARP_SIZE); - const float val2 = __shfl_sync(0xFFFFFFFF, scaled_val, base + 1, WARP_SIZE); - const float val3 = __shfl_sync(0xFFFFFFFF, scaled_val, base + 17, WARP_SIZE); - - if (lane_in_group == 0) { - __nv_fp4x4_e2m1 fp4_packed(make_float4(val0, val1, val2, val3)); - - yqs2[quad_idx_in_block * 16 + b * 8 + group_id] = *(char2 *) &fp4_packed; - } -#else - // Fallback: manual FP4 conversion using LUT - const uint8_t q_val = ggml_cuda_float_to_fp4_e2m1(xi, inv_s); - - const uint8_t q_lo_0 = __shfl_sync(0xFFFFFFFF, q_val, base, WARP_SIZE); - const uint8_t q_lo_1 = __shfl_sync(0xFFFFFFFF, q_val, base + 1, WARP_SIZE); - const uint8_t q_hi_0 = __shfl_sync(0xFFFFFFFF, q_val, base + 16, WARP_SIZE); - const uint8_t q_hi_1 = __shfl_sync(0xFFFFFFFF, q_val, base + 17, WARP_SIZE); - - if (lane_in_group == 0) { - char2 q; - q.x = (q_hi_0 << 4) | q_lo_0; - q.y = (q_hi_1 << 4) | q_lo_1; - yqs2[quad_idx_in_block * 16 + b * 8 + group_id] = q; - } -#endif // CUDART_VERSION >= 12080 - } - - if (lane_id_32 == 0) { - // Store 2 scales packed into 1 uint32 - y[ib].d4[quad_idx_in_block] = (scales[1] << 8) | scales[0]; - } -} - template static __global__ void quantize_mmq_q8_1( const float * __restrict__ x, const int32_t * __restrict__ ids, void * __restrict__ vy, @@ -315,29 +190,3 @@ void quantize_mmq_q8_1_cuda( break; } } - -void quantize_mmq_mxfp4_cuda(const float * x, - const int32_t * ids, - void * vy, - [[maybe_unused]] const ggml_type type_src0, - const int64_t ne00, - const int64_t s01, - const int64_t s02, - const int64_t s03, - const int64_t ne0, - const int64_t ne1, - const int64_t ne2, - const int64_t ne3, - cudaStream_t stream) { - GGML_ASSERT(ne0 % (2 * QK_MXFP4) == 0); - - constexpr int nwarps = 8; - constexpr int vals_per_warp = 2 * QK_MXFP4; - constexpr int vals_per_block = nwarps * vals_per_warp; - - const int64_t block_num_y = (ne0 + vals_per_block - 1) / vals_per_block; - const dim3 num_blocks(ne1, block_num_y, ne2 * ne3); - const dim3 block_size(WARP_SIZE, nwarps, 1); - - quantize_mmq_mxfp4<<>>(x, ids, vy, ne00, s01, s02, s03, ne0, ne1, ne2); -} diff --git a/ggml/src/ggml-cuda/quantize.cuh b/ggml/src/ggml-cuda/quantize.cuh index 6a91df6..725ab52 100644 --- a/ggml/src/ggml-cuda/quantize.cuh +++ b/ggml/src/ggml-cuda/quantize.cuh @@ -25,17 +25,3 @@ void quantize_mmq_q8_1_cuda( const float * x, const int32_t * ids, void * vy, ggml_type type_src0, int64_t ne00, int64_t s01, int64_t s02, int64_t s03, int64_t ne0, int64_t ne1, int64_t ne2, int64_t ne3, cudaStream_t stream); - -void quantize_mmq_mxfp4_cuda(const float * x, - const int32_t * ids, - void * vy, - ggml_type type_src0, - int64_t ne00, - int64_t s01, - int64_t s02, - int64_t s03, - int64_t ne0, - int64_t ne1, - int64_t ne2, - int64_t ne3, - cudaStream_t stream); diff --git a/ggml/src/ggml-cuda/reduce_rows.cuh b/ggml/src/ggml-cuda/reduce_rows.cuh index de240fd..6bcae9e 100644 --- a/ggml/src/ggml-cuda/reduce_rows.cuh +++ b/ggml/src/ggml-cuda/reduce_rows.cuh @@ -28,8 +28,22 @@ static __global__ void reduce_rows_f32(const float * __restrict__ x, float * __r } // sum up partial sums - __shared__ float shared_vals[32]; - sum = block_reduce(sum, shared_vals); + 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 < (static_cast(blockDim.x) / WARP_SIZE)) { + sum = s_sum[lane_id]; + } + sum = warp_reduce_sum(sum); + } if (col != 0) { return; diff --git a/ggml/src/ggml-cuda/softmax.cu b/ggml/src/ggml-cuda/softmax.cu index dc06d06..eeacde0 100644 --- a/ggml/src/ggml-cuda/softmax.cu +++ b/ggml/src/ggml-cuda/softmax.cu @@ -1,14 +1,6 @@ #include "common.cuh" #include "ggml.h" #include "softmax.cuh" - -#ifdef GGML_USE_HIP -#include -#else -#include -#include -#endif // GGML_USE_HIP - #include #include @@ -75,6 +67,9 @@ static __global__ void soft_max_f32( const int block_size = block_size_template == 0 ? blockDim.x : block_size_template; + const int warp_id = threadIdx.x / WARP_SIZE; + const int lane_id = threadIdx.x % WARP_SIZE; + const float slope = get_alibi_slope(p.max_bias, i02, p.n_head_log2, p.m0, p.m1); extern __shared__ float data_soft_max_f32[]; @@ -99,7 +94,21 @@ static __global__ void soft_max_f32( } // find the max value in the block - max_val = block_reduce(max_val, buf_iw); + max_val = warp_reduce_max(max_val); + if (block_size > WARP_SIZE) { + if (warp_id == 0) { + buf_iw[lane_id] = -INFINITY; + } + __syncthreads(); + + if (lane_id == 0) { + buf_iw[warp_id] = max_val; + } + __syncthreads(); + + max_val = buf_iw[lane_id]; + max_val = warp_reduce_max(max_val); + } float tmp = 0.0f; // partial sum @@ -117,7 +126,22 @@ static __global__ void soft_max_f32( } // find the sum of exps in the block - tmp = block_reduce(tmp, buf_iw); + tmp = warp_reduce_sum(tmp); + if (block_size > WARP_SIZE) { + __syncthreads(); + if (warp_id == 0) { + buf_iw[lane_id] = 0.0f; + } + __syncthreads(); + + if (lane_id == 0) { + buf_iw[warp_id] = tmp; + } + __syncthreads(); + + tmp = buf_iw[lane_id]; + tmp = warp_reduce_sum(tmp); + } if (sinks) { tmp += expf(sinks[i02] - max_val); @@ -136,113 +160,6 @@ static __global__ void soft_max_f32( dst[col] = vals[col] * inv_sum; } } - -// TODO: Template to allow keeping ncols in registers if they fit -static __device__ void soft_max_f32_parallelize_cols_single_row(const float * __restrict__ x, - float * __restrict__ dst, - float * __restrict__ tmp_maxs, - float * __restrict__ tmp_sums, - const soft_max_params p) { - namespace cg = cooperative_groups; - - const cg::grid_group g = cg::this_grid(); - - const int tid = threadIdx.x; - const int col_start = blockIdx.x * blockDim.x + tid; - const int n_elem_per_thread = 4; - - float local_vals[n_elem_per_thread] = { -INFINITY, -INFINITY, -INFINITY, -INFINITY }; - float local_max = -INFINITY; - const int step_size = gridDim.x * blockDim.x; - __shared__ float shared_vals[32]; - - // Compute thread-local max - for (int col = col_start; col < p.ncols;) { -#pragma unroll - for (int i = 0; i < n_elem_per_thread; i++) { - const int idx = col + i * step_size; - local_vals[i] = idx < p.ncols ? x[idx] : -INFINITY; - } -#pragma unroll - for (int i = 0; i < n_elem_per_thread; i++) { - local_max = fmaxf(local_max, local_vals[i]); - } - col += step_size * n_elem_per_thread; - } - - // Compute CTA-level max - local_max = block_reduce(local_max, shared_vals); - - // Store CTA-level max to GMEM - if (tid == 0) { - tmp_maxs[blockIdx.x] = local_max; - } - g.sync(); - - // Compute compute global max from CTA-level maxs - assert(gridDim.x < blockDim.x); // currently we only support this case - if (tid < gridDim.x) { - local_max = tmp_maxs[tid]; - } else { - local_max = -INFINITY; - } - local_max = block_reduce(local_max, shared_vals); - - // Compute softmax dividends, accumulate divisor - float tmp_expf = 0.0f; - for (int col = col_start; col < p.ncols;) { -#pragma unroll - for (int i = 0; i < n_elem_per_thread; i++) { - const int idx = col + i * step_size; - local_vals[i] = idx < p.ncols ? x[idx] : -INFINITY; - } -#pragma unroll - for (int i = 0; i < n_elem_per_thread; i++) { - const int idx = col + i * step_size; - if (idx < p.ncols) { - const float tmp = expf(local_vals[i] - local_max); - tmp_expf += tmp; - dst[idx] = tmp; - } - } - col += step_size * n_elem_per_thread; - } - - // Reduce divisor within CTA - tmp_expf = block_reduce(tmp_expf, shared_vals); - - // Store CTA-level sum to GMEM - if (tid == 0) { - tmp_sums[blockIdx.x] = tmp_expf; - } - g.sync(); - - // Compute global sum from CTA-level sums - if (tid < gridDim.x) { - tmp_expf = tmp_sums[tid]; - } else { - tmp_expf = 0.0f; - } - tmp_expf = block_reduce(tmp_expf, shared_vals); - - // Divide dividend by global sum + store data - for (int col = col_start; col < p.ncols;) { -#pragma unroll - for (int i = 0; i < n_elem_per_thread; i++) { - const int idx = col + i * step_size; - local_vals[i] = idx < p.ncols ? dst[idx] : -INFINITY; - } -#pragma unroll - for (int i = 0; i < n_elem_per_thread; i++) { - const int idx = col + i * step_size; - if (idx < p.ncols) { - dst[idx] = local_vals[i] / tmp_expf; - } - } - col += step_size * n_elem_per_thread; - } -} - #ifdef __clang__ #pragma clang diagnostic pop #endif // __clang__ @@ -299,31 +216,9 @@ static void launch_soft_max_kernels(const float * x, const T * mask, const float soft_max_f32<<>>(x, mask, sinks, dst, p); } -__launch_bounds__(8*WARP_SIZE, 1) static __global__ void soft_max_f32_parallelize_cols(const float * __restrict__ x, - float * __restrict__ dst, - float * __restrict__ tmp_maxs, - float * __restrict__ tmp_sums, - const soft_max_params p) -// We loop over all instead of parallelizing across gridDim.y as cooperative groups -// currently only support synchronizing the complete grid if not launched as a cluster group -// (which requires CC > 9.0) -// https://docs.nvidia.com/cuda/cuda-programming-guide/05-appendices/device-callable-apis.html#grid-synchronization -// https://docs.nvidia.com/cuda/cuda-programming-guide/05-appendices/device-callable-apis.html#class-cluster-group -{ - for (int rowx = 0; rowx < p.ne01 * p.ne02 * p.ne03; rowx++) { - soft_max_f32_parallelize_cols_single_row(x + int64_t(rowx) * p.ncols, dst + int64_t(rowx) * p.ncols, tmp_maxs, - tmp_sums, p); - } -} -template -static void soft_max_f32_cuda(const float * x, - const T * mask, - const float * sinks, - float * dst, - const soft_max_params & params, - cudaStream_t stream, - [[maybe_unused]] ggml_backend_cuda_context & ctx) { +template +static void soft_max_f32_cuda(const float * x, const T * mask, const float * sinks, float * dst, const soft_max_params & params, cudaStream_t stream) { int nth = WARP_SIZE; const int64_t ncols_x = params.ncols; @@ -341,25 +236,8 @@ static void soft_max_f32_cuda(const float * x, if (nbytes_shared <= smpbo) { launch_soft_max_kernels<32, 64, 128, 256, 512, 1024, 2048, 4096>(x, mask, sinks, dst, params, stream, block_dims, block_nums, nbytes_shared); } else { - // Parallelize across SMs for top-p/dist-sampling - // The heuristic for parallelizing rows across SMs vs parallelizing single row & looping over all rows was done on the basis of a B6000 GPU and - // Can be adapted further for lower-SM-count GPUs, though keeping data in registers should be implemented first as that is the optimal solution. - if (ggml_cuda_info().devices[id].supports_cooperative_launch && - ncols_x / (params.ne01 * params.ne02 * params.ne03) > 8192 && mask == nullptr && sinks == nullptr && - params.scale == 1.0f && params.max_bias == 0.0f) { - ggml_cuda_pool_alloc tmp_maxs_alloc(ctx.pool(), ggml_cuda_info().devices[id].nsm * sizeof(float)); - ggml_cuda_pool_alloc tmp_sums_alloc(ctx.pool(), ggml_cuda_info().devices[id].nsm * sizeof(float)); - - void * kernel_args[] = { (void *) &x, (void *) &dst, (void *) &tmp_maxs_alloc.ptr, - (void *) &tmp_sums_alloc.ptr, (void *) const_cast(¶ms) }; - CUDA_CHECK(cudaLaunchCooperativeKernel((void *) soft_max_f32_parallelize_cols, - dim3(ggml_cuda_info().devices[id].nsm, 1, 1), - dim3(WARP_SIZE * 8, 1, 1), kernel_args, 0, stream)); - } else { - const size_t nbytes_shared_low = WARP_SIZE * sizeof(float); - soft_max_f32 - <<>>(x, mask, sinks, dst, params); - } + const size_t nbytes_shared_low = WARP_SIZE*sizeof(float); + soft_max_f32<<>>(x, mask, sinks, dst, params); } } @@ -437,9 +315,9 @@ void ggml_cuda_op_soft_max(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { params.m1 = m1; if (use_f16) { - soft_max_f32_cuda(src0_d, (const half *) src1_d, (const float *) src2_d, dst_d, params, stream, ctx); + soft_max_f32_cuda(src0_d, (const half *) src1_d, (const float *) src2_d, dst_d, params, stream); } else { - soft_max_f32_cuda(src0_d, (const float *) src1_d, (const float *) src2_d, dst_d, params, stream, ctx); + soft_max_f32_cuda(src0_d, (const float *) src1_d, (const float *) src2_d, dst_d, params, stream); } } diff --git a/ggml/src/ggml-cuda/ssm-scan.cu b/ggml/src/ggml-cuda/ssm-scan.cu index c1d4e2b..6b42438 100644 --- a/ggml/src/ggml-cuda/ssm-scan.cu +++ b/ggml/src/ggml-cuda/ssm-scan.cu @@ -114,7 +114,7 @@ __global__ void __launch_bounds__(splitD, 1) #endif // __clang__ // assumes as many threads as d_state -template +template __global__ void __launch_bounds__(d_state, 1) ssm_scan_f32_group( const float * __restrict__ src0, const float * __restrict__ src1, const float * __restrict__ src2, @@ -125,25 +125,20 @@ __global__ void __launch_bounds__(d_state, 1) const int src4_nb2, const int src4_nb3, const int src5_nb2, const int src5_nb3, const int64_t s_off, const int64_t n_head, const int64_t d_head, const int64_t n_group, const int64_t n_tok) { - const int warp = threadIdx.x / WARP_SIZE; - const int lane = threadIdx.x % WARP_SIZE; - const int warp_idx = blockIdx.x * c_factor + warp; - - const int head_idx = warp_idx / d_head; - const int head_off = (warp_idx % d_head) * sizeof(float); - const int seq_idx = blockIdx.y; + const int head_idx = (blockIdx.x * splitH) / d_head; + const int head_off = ((blockIdx.x * splitH) % d_head) * sizeof(float); + const int seq_idx = blockIdx.y; const int group_off = (head_idx / (n_head / n_group)) * d_state * sizeof(float); - // TODO: refactor strides to be in elements/floats instead of bytes to be cleaner and consistent with the rest of the codebase - const float * s0_warp = (const float *) ((const char *) src0 + src6[seq_idx] * src0_nb3 + head_idx * src0_nb2 + head_off * d_state); - const float * x_warp = (const float *) ((const char *) src1 + (seq_idx * src1_nb3) + (warp_idx * sizeof(float))); - const float * dt_warp = (const float *) ((const char *) src2 + (seq_idx * src2_nb2) + head_idx * sizeof(float)); - const float * A_warp = (const float *) ((const char *) src3 + head_idx * src3_nb1); - const float * B_warp = (const float *) ((const char *) src4 + (seq_idx * src4_nb3) + (group_off)); - const float * C_warp = (const float *) ((const char *) src5 + (seq_idx * src5_nb3) + (group_off)); - float * y_warp = dst + (seq_idx * n_tok * n_head * d_head) + warp_idx; - float * s_warp = (float *) ((char *) dst + s_off + seq_idx * src0_nb3 + head_idx * src0_nb2 + head_off * d_state); + const float * s0_block = (const float *) ((const char *) src0 + src6[seq_idx] * src0_nb3 + head_idx * src0_nb2 + head_off * d_state); + const float * x_block = (const float *) ((const char *) src1 + (seq_idx * src1_nb3) + blockIdx.x * splitH * sizeof(float)); + const float * dt_block = (const float *) ((const char *) src2 + (seq_idx * src2_nb2) + head_idx * sizeof(float)); + const float * A_block = (const float *) ((const char *) src3 + head_idx * src3_nb1); + const float * B_block = (const float *) ((const char *) src4 + (seq_idx * src4_nb3) + (group_off)); + const float * C_block = (const float *) ((const char *) src5 + (seq_idx * src5_nb3) + (group_off)); + float * y_block = dst + (seq_idx * n_tok * n_head * d_head) + blockIdx.x * splitH; + float * s_block = (float *) ((char *) dst + s_off + seq_idx * src0_nb3 + head_idx * src0_nb2 + head_off * d_state); // strides across n_seq_tokens const int stride_x = src1_nb2 / sizeof(float); @@ -152,42 +147,80 @@ __global__ void __launch_bounds__(d_state, 1) const int stride_C = src5_nb2 / sizeof(float); const int stride_y = n_head * d_head; - float state[c_factor]; - float state_sum = 0.0f; + float state[splitH]; + // for the parallel accumulation + __shared__ float stateC[splitH * d_state]; #pragma unroll - for (int j = 0; j < c_factor; j++) { - state[j] = s0_warp[WARP_SIZE * j + lane]; + for (int j = 0; j < splitH; j++) { + state[j] = s0_block[j * d_state + threadIdx.x]; } for (int64_t i = 0; i < n_tok; i++) { - // NOTE: dt_soft_plus, dA and x_dt have the same value for a warp here. - // Recalculation is intentional; sharing via shuffles/smem proved slower due to sync overhead. - const float dt_soft_plus = (dt_warp[i * stride_dt] <= 20.0f ? log1pf(expf(dt_warp[i * stride_dt])) : dt_warp[i * stride_dt]); + // TODO: only calculate dA and dt_soft_plus once per head instead of every splitH head elements + // TODO: only calculate B and C once per head group + // NOTE: dt_soft_plus, dA and x_dt have the same value across threads here. + float dt_soft_plus = dt_block[i * stride_dt]; + if (dt_soft_plus <= 20.0f) { + dt_soft_plus = log1pf(expf(dt_soft_plus)); + } + const float dA = expf(dt_soft_plus * A_block[0]); + const float B = B_block[i * stride_B + threadIdx.x]; + const float C = C_block[i * stride_C + threadIdx.x]; - state_sum = 0.0f; - const float dA = expf(dt_soft_plus * A_warp[0]); - const float x_dt = x_warp[i * stride_x] * dt_soft_plus; + // across d_head #pragma unroll - for (int j = 0; j < c_factor; j++) { - const float B_val = B_warp[i * stride_B + WARP_SIZE * j + lane]; - const float C_val = C_warp[i * stride_C + WARP_SIZE * j + lane]; - state[j] = (state[j] * dA) + (B_val * x_dt); - state_sum += state[j] * C_val; + for (int j = 0; j < splitH; j++) { + const float x_dt = x_block[i * stride_x + j] * dt_soft_plus; + + state[j] = (state[j] * dA) + (B * x_dt); + + stateC[j * d_state + threadIdx.x] = state[j] * C; } - // parallel accumulation for output - state_sum = warp_reduce_sum(state_sum); + __syncthreads(); - if (lane == 0) { - y_warp[i * stride_y] = state_sum; + // parallel accumulation for stateC + // TODO: simplify + { + static_assert((d_state & -d_state) == d_state, "the state size has to be a power of 2"); + static_assert((splitH & -splitH) == splitH, "splitH has to be a power of 2"); + + // reduce until w matches the warp size + // TODO: does this work even when the physical warp size is 64? +#pragma unroll + for (int w = d_state; w > WARP_SIZE; w >>= 1) { + // (assuming there are d_state threads) +#pragma unroll + for (int j = 0; j < ((w >> 1) * splitH + d_state - 1) / d_state; j++) { + // TODO: check for bank conflicts + const int k = (threadIdx.x % (w >> 1)) + (d_state * (threadIdx.x / (w >> 1))) + j * d_state * (d_state / (w >> 1)); + stateC[k] += stateC[k + (w >> 1)]; + + } + __syncthreads(); + } + + static_assert(splitH >= d_state / WARP_SIZE); + +#pragma unroll + for (int j = 0; j < splitH / (d_state / WARP_SIZE); j++) { + float y = stateC[(threadIdx.x % WARP_SIZE) + d_state * (threadIdx.x / WARP_SIZE) + j * d_state * (d_state / WARP_SIZE)]; + y = warp_reduce_sum(y); + + // store the above accumulations + if (threadIdx.x % WARP_SIZE == 0) { + const int k = threadIdx.x / WARP_SIZE + j * (d_state / WARP_SIZE); + y_block[i * stride_y + k] = y; + } + } } } // write back the state #pragma unroll - for (int j = 0; j < c_factor; j++) { - s_warp[WARP_SIZE * j + lane] = state[j]; + for (int j = 0; j < splitH; j++) { + s_block[j * d_state + threadIdx.x] = state[j]; } } @@ -198,24 +231,27 @@ static void ssm_scan_f32_cuda(const float * src0, const float * src1, const floa const int src5_nb3, const int64_t s_off, const int64_t d_state, const int64_t head_dim, const int64_t n_head, const int64_t n_group, const int64_t n_tok, const int64_t n_seq, cudaStream_t stream) { + const int threads = 128; // NOTE: if you change conditions here, be sure to update the corresponding supports_op condition! if (src3_nb1 == sizeof(float)) { // Mamba-2 if (d_state == 128) { - constexpr int threads = 128; - constexpr int num_warps = threads/WARP_SIZE; - - const dim3 blocks((n_head * head_dim + (num_warps - 1)) / num_warps, n_seq, 1); - ssm_scan_f32_group<128/WARP_SIZE, 128><<>>( + GGML_ASSERT(d_state % threads == 0); + // NOTE: can be any power of two between 4 and 64 + const int splitH = 16; + GGML_ASSERT(head_dim % splitH == 0); + const dim3 blocks((n_head * head_dim + (splitH - 1)) / splitH, n_seq, 1); + ssm_scan_f32_group<16, 128><<>>( src0, src1, src2, src3, src4, src5, src6, dst, src0_nb2, src0_nb3, src1_nb2, src1_nb3, src2_nb1, src2_nb2, src3_nb1, src4_nb2, src4_nb3, src5_nb2, src5_nb3, s_off, n_head, head_dim, n_group, n_tok); } else if (d_state == 256) { // Falcon-H1 - constexpr int threads = 256; - constexpr int num_warps = threads/WARP_SIZE; - - const dim3 blocks((n_head * head_dim + (num_warps - 1)) / num_warps, n_seq, 1); - ssm_scan_f32_group<256/WARP_SIZE, 256><<>>( + const int threads = 256; + // NOTE: can be any power of two between 8 and 64 + const int splitH = 16; + GGML_ASSERT(head_dim % splitH == 0); + const dim3 blocks((n_head * head_dim + (splitH - 1)) / splitH, n_seq, 1); + ssm_scan_f32_group<16, 256><<>>( src0, src1, src2, src3, src4, src5, src6, dst, src0_nb2, src0_nb3, src1_nb2, src1_nb3, src2_nb1, src2_nb2, src3_nb1, src4_nb2, src4_nb3, src5_nb2, src5_nb3, s_off, n_head, head_dim, n_group, n_tok); @@ -224,7 +260,6 @@ static void ssm_scan_f32_cuda(const float * src0, const float * src1, const floa } } else { // Mamba-1 - constexpr int threads = 128; GGML_ASSERT(n_head % threads == 0); GGML_ASSERT(head_dim == 1); GGML_ASSERT(n_group == 1); diff --git a/ggml/src/ggml-cuda/top-k.cu b/ggml/src/ggml-cuda/top-k.cu deleted file mode 100644 index 318ac38..0000000 --- a/ggml/src/ggml-cuda/top-k.cu +++ /dev/null @@ -1,96 +0,0 @@ -#include "argsort.cuh" -#include "top-k.cuh" - -#ifdef GGML_CUDA_USE_CUB -# include -# if (CCCL_MAJOR_VERSION >= 3 && CCCL_MINOR_VERSION >= 2) -# include -# define CUB_TOP_K_AVAILABLE -using namespace cub; -# endif // CCCL_MAJOR_VERSION >= 3 && CCCL_MINOR_VERSION >= 2 -#endif // GGML_CUDA_USE_CUB - -#ifdef CUB_TOP_K_AVAILABLE - -static void top_k_cub(ggml_cuda_pool & pool, - const float * src, - int * dst, - const int ncols, - const int k, - cudaStream_t stream) { - auto requirements = cuda::execution::require(cuda::execution::determinism::not_guaranteed, - cuda::execution::output_ordering::unsorted); - auto stream_env = cuda::stream_ref{ stream }; - auto env = cuda::std::execution::env{ stream_env, requirements }; - - auto indexes_in = cuda::make_counting_iterator(0); - - size_t temp_storage_bytes = 0; - DeviceTopK::MaxPairs(nullptr, temp_storage_bytes, src, cuda::discard_iterator(), indexes_in, dst, ncols, k, - env); - - ggml_cuda_pool_alloc temp_storage_alloc(pool, temp_storage_bytes); - void * d_temp_storage = temp_storage_alloc.get(); - - DeviceTopK::MaxPairs(d_temp_storage, temp_storage_bytes, src, cuda::discard_iterator(), indexes_in, dst, - ncols, k, env); -} - -#elif defined(GGML_CUDA_USE_CUB) // CUB_TOP_K_AVAILABLE - -static int next_power_of_2(int x) { - int n = 1; - while (n < x) { - n *= 2; - } - return n; -} - -#endif // CUB_TOP_K_AVAILABLE - -void ggml_cuda_op_top_k(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { - const ggml_tensor * src0 = dst->src[0]; - const float * src0_d = (const float *) src0->data; - int * dst_d = (int *) dst->data; - cudaStream_t stream = ctx.stream(); - - // are these asserts truly necessary? - GGML_ASSERT(src0->type == GGML_TYPE_F32); - GGML_ASSERT(dst->type == GGML_TYPE_I32); - GGML_ASSERT(ggml_is_contiguous(src0)); - - const int64_t ncols = src0->ne[0]; - const int64_t nrows = ggml_nrows(src0); - const int64_t k = dst->ne[0]; - ggml_cuda_pool & pool = ctx.pool(); -#ifdef CUB_TOP_K_AVAILABLE - // TODO: Switch to `DeviceSegmentedTopK` for multi-row TopK once implemented - // https://github.com/NVIDIA/cccl/issues/6391 - // TODO: investigate if there exists a point where parallelized argsort is faster than sequential top-k - for (int i = 0; i < nrows; i++) { - top_k_cub(pool, src0_d + i * ncols, dst_d + i * k, ncols, k, stream); - } -#elif defined(GGML_CUDA_USE_CUB) // CUB_TOP_K_AVAILABLE - // Fall back to argsort + copy - const int ncols_pad = next_power_of_2(ncols); - const size_t shared_mem = ncols_pad * sizeof(int); - const size_t max_shared_mem = ggml_cuda_info().devices[ggml_cuda_get_device()].smpb; - - ggml_cuda_pool_alloc temp_dst_alloc(pool, ncols * nrows); - int * tmp_dst = temp_dst_alloc.get(); - - if (shared_mem > max_shared_mem || ncols > 1024) { - argsort_f32_i32_cuda_cub(pool, src0_d, tmp_dst, ncols, nrows, GGML_SORT_ORDER_DESC, stream); - } else { - argsort_f32_i32_cuda_bitonic(src0_d, tmp_dst, ncols, nrows, GGML_SORT_ORDER_DESC, stream); - } - CUDA_CHECK(cudaMemcpy2DAsync(dst_d, k * sizeof(int), tmp_dst, ncols * sizeof(int), k * sizeof(int), nrows, - cudaMemcpyDeviceToDevice, stream)); -#else // GGML_CUDA_USE_CUB - ggml_cuda_pool_alloc temp_dst_alloc(pool, ncols * nrows); - int * tmp_dst = temp_dst_alloc.get(); - argsort_f32_i32_cuda_bitonic(src0_d, tmp_dst, ncols, nrows, GGML_SORT_ORDER_DESC, stream); - CUDA_CHECK(cudaMemcpy2DAsync(dst_d, k * sizeof(int), tmp_dst, ncols * sizeof(int), k * sizeof(int), nrows, - cudaMemcpyDeviceToDevice, stream)); -#endif -} diff --git a/ggml/src/ggml-cuda/top-k.cuh b/ggml/src/ggml-cuda/top-k.cuh deleted file mode 100644 index f4d8f61..0000000 --- a/ggml/src/ggml-cuda/top-k.cuh +++ /dev/null @@ -1,3 +0,0 @@ -#include "common.cuh" - -void ggml_cuda_op_top_k(ggml_backend_cuda_context & ctx, ggml_tensor * dst); diff --git a/ggml/src/ggml-cuda/vendors/cuda.h b/ggml/src/ggml-cuda/vendors/cuda.h index ba032cf..3b30867 100644 --- a/ggml/src/ggml-cuda/vendors/cuda.h +++ b/ggml/src/ggml-cuda/vendors/cuda.h @@ -10,10 +10,6 @@ #include #endif // CUDART_VERSION >= 12050 -#if CUDART_VERSION >= 12080 -#include -#endif // CUDART_VERSION >= 12080 - #if CUDART_VERSION < 11020 #define CU_DEVICE_ATTRIBUTE_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED CU_DEVICE_ATTRIBUTE_VIRTUAL_ADDRESS_MANAGEMENT_SUPPORTED #define CUBLAS_TF32_TENSOR_OP_MATH CUBLAS_TENSOR_OP_MATH diff --git a/ggml/src/ggml-cuda/vendors/hip.h b/ggml/src/ggml-cuda/vendors/hip.h index e30d202..ea832f3 100644 --- a/ggml/src/ggml-cuda/vendors/hip.h +++ b/ggml/src/ggml-cuda/vendors/hip.h @@ -45,11 +45,9 @@ #define cublasSgemm hipblasSgemm #define cublasStatus_t hipblasStatus_t #define cublasOperation_t hipblasOperation_t -#define cudaDevAttrCooperativeLaunch hipDeviceAttributeCooperativeLaunch #define cudaDeviceCanAccessPeer hipDeviceCanAccessPeer #define cudaDeviceDisablePeerAccess hipDeviceDisablePeerAccess #define cudaDeviceEnablePeerAccess hipDeviceEnablePeerAccess -#define cudaDeviceGetAttribute hipDeviceGetAttribute #define cudaDeviceProp hipDeviceProp_t #define cudaDeviceSynchronize hipDeviceSynchronize #define cudaError_t hipError_t @@ -72,7 +70,6 @@ #define cudaHostRegisterPortable hipHostRegisterPortable #define cudaHostRegisterReadOnly hipHostRegisterReadOnly #define cudaHostUnregister hipHostUnregister -#define cudaLaunchCooperativeKernel hipLaunchCooperativeKernel #define cudaLaunchHostFunc hipLaunchHostFunc #define cudaMalloc hipMalloc #define cudaMallocHost(ptr, size) hipHostMalloc(ptr, size, hipHostMallocDefault) @@ -138,8 +135,6 @@ #define cudaStream_t hipStream_t #define cudaSuccess hipSuccess #define cudaOccupancyMaxActiveBlocksPerMultiprocessor hipOccupancyMaxActiveBlocksPerMultiprocessor -#define cudaFuncSetAttribute hipFuncSetAttribute -#define cudaFuncAttributeMaxDynamicSharedMemorySize hipFuncAttributeMaxDynamicSharedMemorySize #define __trap() do { abort(); __builtin_unreachable(); } while(0) #define CUBLAS_STATUS_SUCCESS HIPBLAS_STATUS_SUCCESS #define CUBLAS_STATUS_NOT_INITIALIZED HIPBLAS_STATUS_NOT_INITIALIZED diff --git a/ggml/src/ggml-cuda/vendors/musa.h b/ggml/src/ggml-cuda/vendors/musa.h index 1abb8ac..221e67f 100644 --- a/ggml/src/ggml-cuda/vendors/musa.h +++ b/ggml/src/ggml-cuda/vendors/musa.h @@ -61,7 +61,6 @@ #define cudaHostRegisterPortable musaHostRegisterPortable #define cudaHostRegisterReadOnly musaHostRegisterReadOnly #define cudaHostUnregister musaHostUnregister -#define cudaLaunchCooperativeKernel musaLaunchCooperativeKernel #define cudaLaunchHostFunc musaLaunchHostFunc #define cudaMalloc musaMalloc #define cudaMallocHost musaMallocHost diff --git a/ggml/src/ggml-hexagon/ggml-hexagon.cpp b/ggml/src/ggml-hexagon/ggml-hexagon.cpp index cf1eb99..853a5bd 100644 --- a/ggml/src/ggml-hexagon/ggml-hexagon.cpp +++ b/ggml/src/ggml-hexagon/ggml-hexagon.cpp @@ -7,10 +7,9 @@ #include #include -#include #include -#include #include +#include #ifdef _WIN32 # include @@ -37,17 +36,16 @@ #include "ggml-hexagon.h" #include "ggml-impl.h" #include "ggml-quants.h" -#include "op-desc.h" #include "htp-msg.h" #include "htp_iface.h" static size_t opt_ndev = 1; -static size_t opt_nhvx = 0; // use all -static int opt_arch = 0; // autodetect +static size_t opt_nhvx = 0; // use all +static int opt_arch = 0; // autodetect static int opt_etm = 0; static int opt_verbose = 0; static int opt_profile = 0; -static int opt_hostbuf = 1; // hostbuf ON by default +static int opt_hostbuf = 1; static int opt_experimental = 0; // Enable all stages by default @@ -57,6 +55,9 @@ static int opt_opsync = 0; // synchronous ops #define HEX_VERBOSE(...) \ if (opt_verbose) GGML_LOG_DEBUG(__VA_ARGS__) +#define HEX_PROFILE(...) \ + if (opt_profile) GGML_LOG_INFO(__VA_ARGS__) + static inline uint64_t hex_is_aligned(void * addr, uint32_t align) { return ((size_t) addr & (align - 1)) == 0; } @@ -84,30 +85,128 @@ static const char * status_to_str(uint32_t status) { // ** debug helpers -static void ggml_hexagon_dump_op_exec(const std::string &sess_name, const ggml_tensor * op, const uint32_t req_flags) { - if (!opt_verbose) return; - - op_desc desc(op); - GGML_LOG_DEBUG("ggml-hex: %s execute-op %s: %s : %s : %s : %s : %s : flags 0x%x\n", sess_name.c_str(), - ggml_op_name(op->op), desc.names, desc.dims, desc.types, desc.strides, desc.buffs, req_flags); +static inline int hex_format_tensor_dims(char * str, const struct ggml_tensor * t) { + if (t->ne[2] == 1 && t->ne[3] == 1) { + return sprintf(str, "%d:%d", (int) t->ne[0], (int) t->ne[1]); + } else { + return sprintf(str, "%d:%d:%d:%d", (int) t->ne[0], (int) t->ne[1], (int) t->ne[2], (int) t->ne[3]); + } } -static void ggml_hexagon_dump_op_supp(const std::string &sess_name, const struct ggml_tensor * op, bool supp) { - if (!opt_verbose) return; +static inline void hex_format_op_dims(char * str, const struct ggml_tensor * t) { + char * p = str; - op_desc desc(op); - GGML_LOG_DEBUG("ggml-hex: %s supports-op %s : %s : %s : %s : %s : %s : %s\n", sess_name.c_str(), - ggml_op_name(op->op), desc.names, desc.dims, desc.types, desc.strides, desc.buffs, supp ? "yes" : "no"); + // append src0 and src1 (if any) + if (t->src[0]) { + p += hex_format_tensor_dims(p, t->src[0]); + + for (int i = 1; i < GGML_MAX_SRC && t->src[i]; i++) { + p += sprintf(p, " x "); + p += hex_format_tensor_dims(p, t->src[i]); + } + + p += sprintf(p, " -> "); + } + + // format self dims separately for better visual alignment + char self[64]; + hex_format_tensor_dims(self, t); + + p += sprintf(p, "%s", self); } -static void ggml_hexagon_dump_op_prof(const std::string &sess_name, const ggml_tensor * op, - uint32_t op_usec, uint32_t op_cycles, uint32_t op_pkts, uint64_t call_usec) { - if (!opt_profile) return; +static inline int hex_format_tensor_strides(char * str, const struct ggml_tensor * t) { + const char * c = ggml_is_contiguous(t) ? "" : "!"; - op_desc desc(op); - GGML_LOG_DEBUG("ggml-hex: %s profile-op %s: %s : %s : %s : %s : %s : op-usec %u op-cycles %u op-pkts %u (%f) call-usec %llu\n", sess_name.c_str(), - ggml_op_name(op->op), desc.names, desc.dims, desc.types, desc.strides, desc.buffs, - op_usec, op_cycles, op_pkts, (float) op_cycles / op_pkts, (unsigned long long) call_usec); + if (t->ne[2] == 1 && t->ne[3] == 1) { + return sprintf(str, "%zu:%zu%s", (size_t) t->nb[0], (size_t) t->nb[1], c); + } else { + return sprintf(str, "%zu:%zu:%zu:%zu%s", (size_t) t->nb[0], (size_t) t->nb[1], (size_t) t->nb[2], + (size_t) t->nb[3], c); + } +} + +static inline void hex_format_op_strides(char * str, const struct ggml_tensor * t) { + char * p = str; + + // append src0 and src1 (if any) + if (t->src[0]) { + p += hex_format_tensor_strides(p, t->src[0]); + + for (int i = 1; i < GGML_MAX_SRC && t->src[i]; i++) { + p += sprintf(p, " x "); + p += hex_format_tensor_strides(p, t->src[i]); + } + + p += sprintf(p, " -> "); + } + + // format self dims separately for better visual alignment + char self[64]; + hex_format_tensor_strides(self, t); + + p += sprintf(p, "%s", self); +} + +static inline void hex_format_op_types(char * str, const struct ggml_tensor * t) { + char * p = str; + + // append src0 and src1 (if any) + if (t->src[0]) { + p += sprintf(p, "%s", ggml_type_name(t->src[0]->type)); + + for (int i = 1; i < GGML_MAX_SRC && t->src[i]; i++) { + p += sprintf(p, " x "); + p += sprintf(p, "%s", ggml_type_name(t->src[i]->type)); + } + + p += sprintf(p, " -> "); + } + + p += sprintf(p, "%s", ggml_type_name(t->type)); +} + +static inline const char * hex_tensor_buff_name(const struct ggml_tensor * t) { + if (t->buffer) { + return ggml_backend_buffer_name(t->buffer); + } + return "NONE"; +} + +static inline void hex_format_op_buffs(char * str, const struct ggml_tensor * t) { + char * p = str; + + // append src0 and src1 (if any) + if (t->src[0]) { + p += sprintf(p, "%s", hex_tensor_buff_name(t->src[0])); + + for (int i = 1; i < GGML_MAX_SRC && t->src[i]; i++) { + p += sprintf(p, " x "); + p += sprintf(p, "%s", hex_tensor_buff_name(t->src[i])); + } + + p += sprintf(p, " -> "); + } + + p += sprintf(p, "%s", hex_tensor_buff_name(t)); +} + +static inline void hex_format_op_names(char * str, const struct ggml_tensor * t) { + char * p = str; + + // append src0 and src1 (if any) + if (t->src[0]) { + p += sprintf(p, "%s", t->src[0]->name); + + for (int i = 1; i < GGML_MAX_SRC && t->src[i]; i++) { + p += sprintf(p, " x "); + p += sprintf(p, "%s", t->src[i]->name); + } + + p += sprintf(p, " -> "); + } + + p += sprintf(p, "%s", t->name); } // ** backend sessions @@ -122,8 +221,8 @@ struct ggml_hexagon_session { void enqueue(struct htp_general_req &req, struct dspqueue_buffer *bufs, uint32_t n_bufs, bool sync = false); void flush(); - ggml_backend_buffer_type buffer_type = {}; - ggml_backend_buffer_type repack_buffer_type = {}; + ggml_backend_buffer_type buffer_type; + ggml_backend_buffer_type repack_buffer_type; std::string name; remote_handle64 handle; @@ -142,6 +241,23 @@ struct ggml_hexagon_session { uint32_t prof_pkts; }; +static inline void hex_print_op_info(const ggml_tensor * op, ggml_hexagon_session * sess, const uint32_t req_flags) { + char dims[64 * GGML_MAX_SRC]; + char strides[64 * GGML_MAX_SRC]; + char types[16 * GGML_MAX_SRC]; + char buffs[64 * GGML_MAX_SRC]; + char names[64 * GGML_MAX_SRC]; + + hex_format_op_dims(dims, op); + hex_format_op_strides(strides, op); + hex_format_op_types(types, op); + hex_format_op_buffs(buffs, op); + hex_format_op_names(names, op); + + HEX_VERBOSE("ggml-hex: %s %s: %s : %s : %s : %s : %s: flags 0x%x\n", sess->name.c_str(), ggml_op_name(op->op), + names, dims, types, strides, buffs, req_flags); +} + void ggml_hexagon_session::enqueue(struct htp_general_req &req, struct dspqueue_buffer *bufs, uint32_t n_bufs, bool sync) { // Bump pending flag (cleared in the session::flush once we get the responce) this->op_pending++; // atomic inc @@ -1482,7 +1598,7 @@ static ggml_backend_buffer_t ggml_backend_hexagon_buffer_type_alloc_buffer( try { ggml_backend_hexagon_buffer_context * ctx = new ggml_backend_hexagon_buffer_context(sess, size, false /*repack*/); return ggml_backend_buffer_init(buffer_type, ggml_backend_hexagon_buffer_interface, ctx, size); - } catch (const std::exception & exc) { + } catch (std::exception const &exc) { GGML_LOG_ERROR("ggml-hex: %s failed to allocate buffer context: %s\n", sess->name.c_str(), exc.what()); return nullptr; } @@ -1494,7 +1610,7 @@ static ggml_backend_buffer_t ggml_backend_hexagon_repack_buffer_type_alloc_buffe try { ggml_backend_hexagon_buffer_context * ctx = new ggml_backend_hexagon_buffer_context(sess, size, true /*repack*/); return ggml_backend_buffer_init(buffer_type, ggml_backend_hexagon_buffer_interface, ctx, size); - } catch (const std::exception & exc) { + } catch (std::exception const &exc) { GGML_LOG_ERROR("ggml-hex: %s failed to allocate buffer context: %s\n", sess->name.c_str(), exc.what()); return nullptr; } @@ -1581,8 +1697,8 @@ void ggml_hexagon_session::allocate(int dev_id) noexcept(false) { } // Save the IDs - this->session_id = n.session_id; - this->domain_id = n.effective_domain_id; + this->session_id = n.session_id; + this->domain_id = n.effective_domain_id; this->valid_session = true; } @@ -1635,7 +1751,7 @@ void ggml_hexagon_session::allocate(int dev_id) noexcept(false) { this->valid_handle = true; GGML_LOG_INFO("ggml-hex: new session: %s : session-id %d domain-id %d uri %s handle 0x%lx\n", this->name.c_str(), - this->session_id, this->domain_id, session_uri, (unsigned long) this->handle); + this->session_id, this->domain_id, session_uri, (unsigned long) this->handle); // Enable FastRPC QoS mode { @@ -1722,8 +1838,11 @@ void ggml_hexagon_session::release() noexcept(true) { } ggml_hexagon_session::ggml_hexagon_session(int dev_id, ggml_backend_dev_t dev) noexcept(false) { - buffer_type.device = dev; - repack_buffer_type.device = dev; + buffer_type.context = nullptr; + repack_buffer_type.context = nullptr; + + buffer_type.device = dev; + repack_buffer_type.device = dev; try { allocate(dev_id); @@ -1733,7 +1852,7 @@ ggml_hexagon_session::ggml_hexagon_session(int dev_id, ggml_backend_dev_t dev) n repack_buffer_type.iface = ggml_backend_hexagon_repack_buffer_type_interface; repack_buffer_type.context = new ggml_backend_hexagon_buffer_type_context(this->name + "-REPACK", this); - } catch (const std::exception & exc) { + } catch (std::exception const &exc) { release(); throw; } @@ -1742,8 +1861,8 @@ ggml_hexagon_session::ggml_hexagon_session(int dev_id, ggml_backend_dev_t dev) n ggml_hexagon_session::~ggml_hexagon_session() noexcept(true) { release(); - delete static_cast(buffer_type.context); - delete static_cast(repack_buffer_type.context); + delete static_cast(buffer_type.context); + delete static_cast(repack_buffer_type.context); } // ** backend interface @@ -1753,9 +1872,6 @@ static bool ggml_backend_buffer_is_hexagon(const struct ggml_backend_buffer * b) } static inline bool ggml_backend_buffer_is_hexagon_repack(const struct ggml_backend_buffer * b) { - if (!opt_hostbuf) { - return ggml_backend_buffer_is_hexagon(b); - } return b->buft->iface.alloc_buffer == ggml_backend_hexagon_repack_buffer_type_alloc_buffer; } @@ -1776,37 +1892,6 @@ static bool hex_supported_dims2(const struct ggml_tensor * x, const struct ggml_ return true; } -static bool ggml_hexagon_supported_flash_attn_ext(const struct ggml_hexagon_session * sess, const struct ggml_tensor * op) { - const struct ggml_tensor * src0 = op->src[0]; - const struct ggml_tensor * src1 = op->src[1]; - const struct ggml_tensor * src2 = op->src[2]; - const struct ggml_tensor * src3 = op->src[3]; - const struct ggml_tensor * src4 = op->src[4]; - const struct ggml_tensor * dst = op; - - // Check for F16 support only as requested - if ((src0->type != GGML_TYPE_F16 && src0->type != GGML_TYPE_F32) || src1->type != GGML_TYPE_F16 || src2->type != GGML_TYPE_F16) { - return false; - } - - if (src3 && src3->type != GGML_TYPE_F16) { // mask - return false; - } - - if (src4 && src4->type != GGML_TYPE_F32) { // sinks - return false; - } - - // For now we support F32 or F16 output as htp backend often converts output on the fly if needed, - // but the op implementation writes to F16 or F32. - // Let's assume dst can be F32 or F16. - if (dst->type != GGML_TYPE_F32 && dst->type != GGML_TYPE_F16) { - return false; - } - - return opt_experimental; -} - static bool hex_supported_src0_type(ggml_type t) { return t == GGML_TYPE_F32; } @@ -1845,15 +1930,25 @@ static bool hex_supported_dims(const struct ggml_tensor * x, const struct ggml_t return true; } +template +static inline bool hex_supported_buffer(const struct ggml_hexagon_session * sess, _TTensor... tensors) { + return ([&]() -> bool { + return !tensors || !tensors->buffer || + (ggml_backend_buffer_is_hexagon(tensors->buffer) && + ggml_backend_hexagon_buffer_get_sess(tensors->buffer) == sess); + }() && ...); +} + static bool ggml_hexagon_supported_mul_mat(const struct ggml_hexagon_session * sess, const struct ggml_tensor * dst) { const struct ggml_tensor * src0 = dst->src[0]; const struct ggml_tensor * src1 = dst->src[1]; - if (dst->type != GGML_TYPE_F32) { + if (src1->type != GGML_TYPE_F32 || dst->type != GGML_TYPE_F32) { return false; } - if (src1->type != GGML_TYPE_F32 && src1->type != GGML_TYPE_F16) { + // TODO: add support for non-cont tensors + if (!ggml_is_contiguous(src1) || !ggml_is_contiguous(dst)) { return false; } @@ -1869,6 +1964,7 @@ static bool ggml_hexagon_supported_mul_mat(const struct ggml_hexagon_session * s return false; // typically the lm-head which would be too large for VTCM } + // if ((src0->ne[2] != src1->ne[2] || src0->ne[3] != src1->ne[3])) return false; if ((src1->ne[2] != 1 || src1->ne[3] != 1)) { return false; } @@ -1880,16 +1976,17 @@ static bool ggml_hexagon_supported_mul_mat(const struct ggml_hexagon_session * s break; case GGML_TYPE_F16: - if (src0->nb[1] < src0->nb[0]) { - GGML_LOG_DEBUG("ggml_hexagon_supported_mul_mat: permuted F16 src0 not supported\n"); - return false; - } break; default: return false; } + // src0 & src1 & dst must be mapped to the same session + if (!hex_supported_buffer(sess, src0, src1, dst)) { + return false; + } + return true; } @@ -1917,10 +2014,27 @@ static bool ggml_hexagon_supported_mul_mat_id(const struct ggml_hexagon_session } break; + case GGML_TYPE_F16: + if (!opt_experimental) { + return false; + } + break; + default: return false; } + // TODO: add support for non-cont tensors + if (!ggml_is_contiguous(src1) || !ggml_is_contiguous(dst)) { + return false; + } + + // src0 (weights) must be repacked and mapped to the same session + // src1 & sr2 & dst must be mapped to the same session + if (!hex_supported_buffer(sess, src0, src1, src2, dst)) { + return false; + } + return true; } @@ -1950,12 +2064,18 @@ static bool ggml_hexagon_supported_binary(const struct ggml_hexagon_session * se return false; } + // src0, src1 & dst must be mapped to the same session + if (!hex_supported_buffer(sess, src0, src1, dst)) { + return false; + } + return true; } static bool ggml_hexagon_supported_add_id(const struct ggml_hexagon_session * sess, const struct ggml_tensor * op) { const struct ggml_tensor * src0 = op->src[0]; const struct ggml_tensor * src1 = op->src[1]; + const struct ggml_tensor * src2 = op->src[2]; const struct ggml_tensor * dst = op; if (!hex_supported_src0_type(src0->type)) { @@ -1976,6 +2096,11 @@ static bool ggml_hexagon_supported_add_id(const struct ggml_hexagon_session * se return false; } + // src0, src1 & dst must be mapped to the same session + if (!hex_supported_buffer(sess, src0, src1, src2, dst)) { + return false; + } + return true; } @@ -1998,6 +2123,11 @@ static bool ggml_hexagon_supported_unary(const struct ggml_hexagon_session * ses return false; } + // src0 & dst must be mapped to the same session + if (!hex_supported_buffer(sess, src0, dst)) { + return false; + } + return true; } @@ -2030,6 +2160,17 @@ static bool ggml_hexagon_supported_activations(const struct ggml_hexagon_session } } + // src0, src1 & dst must be mapped to the same session + if(src1){ + if (!hex_supported_buffer(sess, src0, src1, dst)) { + return false; + } + }else{ + if (!hex_supported_buffer(sess, src0, dst)) { + return false; + } + } + return true; } @@ -2078,43 +2219,8 @@ static bool ggml_hexagon_supported_softmax(const struct ggml_hexagon_session * s } } - return true; -} - -static bool ggml_hexagon_supported_set_rows(const struct ggml_hexagon_session * sess, const struct ggml_tensor * op) { - const struct ggml_tensor * src0 = op->src[0]; // values - const struct ggml_tensor * src1 = op->src[1]; // indices - const struct ggml_tensor * dst = op; - - if (src0->type != GGML_TYPE_F32) { - return false; - } - - if (src1->type != GGML_TYPE_I32 && src1->type != GGML_TYPE_I64) { - return false; - } - - if (dst->type != GGML_TYPE_F16) { - return false; - } - - return true; -} - -static bool ggml_hexagon_supported_get_rows(const struct ggml_hexagon_session * sess, const struct ggml_tensor * op) { - const struct ggml_tensor * src0 = op->src[0]; // values - const struct ggml_tensor * src1 = op->src[1]; // indices - const struct ggml_tensor * dst = op; - - if (src0->type != GGML_TYPE_F32) { - return false; - } - - if (src1->type != GGML_TYPE_I32 && src1->type != GGML_TYPE_I64) { - return false; - } - - if (dst->type != GGML_TYPE_F32) { + // src0, src1 & dst must be mapped to the same session + if (!hex_supported_buffer(sess, src0, src1, dst)) { return false; } @@ -2168,28 +2274,16 @@ static bool ggml_hexagon_supported_rope(const struct ggml_hexagon_session * sess } } + // src0, src1, src2 & dst must be mapped to the same session + if (!hex_supported_buffer(sess, src0, src1, src2, dst)) { + return false; + } + return true; } -enum dspqbuf_type { - DSPQBUF_TYPE_DSP_WRITE_CPU_READ = 0, - DSPQBUF_TYPE_CPU_WRITE_DSP_READ, - DSPQBUF_TYPE_CONSTANT, -}; - -static void dspqbuf_dump(dspqueue_buffer * d, const struct ggml_tensor * t, dspqbuf_type type) { - if (opt_verbose < 2) return; - - auto buf = static_cast(t->buffer->context); - auto sess = buf->sess; - - GGML_LOG_DEBUG("ggml-hex: %s dspqbuf : %s base-addr %p base-size %zu data %p offset %u size %u\n", sess->name.c_str(), - t->name, (void *) buf->base, buf->size, (void *) d->ptr, (unsigned int) d->offset, - (unsigned int) d->size); -} - // Init hexagon tensor from GGML tensor and Hexagon buffer -static void htp_req_tensor_init(htp_tensor * h, const ggml_tensor * t) { +static void init_htp_tensor(htp_tensor * h, const ggml_tensor * t) { h->data = 0; // updated by the receiver h->type = t->type; h->ne[0] = t->ne[0]; @@ -2202,57 +2296,53 @@ static void htp_req_tensor_init(htp_tensor * h, const ggml_tensor * t) { h->nb[3] = t->nb[3]; } -static size_t htp_req_buff_init(htp_tensor *h, dspqueue_buffer * d, const ggml_tensor * t, dspqbuf_type type) { +static size_t dspqueue_buffers_init(dspqueue_buffer * buf, const ggml_tensor * t, bool flush_host, bool flush_htp) { if (!t) { return 0; } - auto buf = static_cast(t->buffer->context); - - memset(d, 0, sizeof(*d)); - d->fd = buf->fd; - d->ptr = t->data; - d->offset = (uint8_t *) t->data - buf->base; - d->size = ggml_nbytes(t); - - if (!d->size) { - // Some requests contain srcs where ggml_nbytes() returns 0 but the rest of the op is non-empty - d->size = 64; - } - - switch (type) { - case DSPQBUF_TYPE_DSP_WRITE_CPU_READ: - // Flush CPU - d->flags = DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER; - break; - case DSPQBUF_TYPE_CPU_WRITE_DSP_READ: - // Flush CPU, Invalidate DSP - d->flags = DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT; - break; - default: - // Constant buffer, no cache maintenance - d->flags = 0; - break; - } - - htp_req_tensor_init(h, t); - - dspqbuf_dump(d, t, type); - + memset(buf, 0, sizeof(*buf)); + auto tensor_buf = static_cast(t->buffer->context); + buf->fd = tensor_buf->fd; + buf->ptr = t->data; + buf->offset = (uint8_t *) t->data - tensor_buf->base; + buf->size = ggml_nbytes(t); + buf->flags = (flush_host ? DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER : 0); // Flush CPU + buf->flags |= (flush_htp ? DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT : 0); // Invalidate DSP return 1; } -typedef size_t (*htp_req_init_func_t)(htp_general_req * req, dspqueue_buffer * bufs, const ggml_tensor * op); +static ggml_hexagon_session * get_session_from_tensor(const ggml_tensor * t) { + return static_cast(t->buffer->context)->sess; +} -template -static inline void ggml_hexagon_dispatch_op(ggml_hexagon_session *sess, const struct ggml_tensor * op, uint32_t flags) { - uint64_t t = ggml_time_us(); +static void hex_dump_dspbuf(const struct ggml_tensor * t, const dspqueue_buffer * d) { + auto buf = static_cast(t->buffer->context); + auto sess = buf->sess; - // Construct HTP request + HEX_VERBOSE("ggml-hex: %s dspqbuf : %s base-addr %p base-size %zu data %p offset %u size %u\n", sess->name.c_str(), + t->name, (void *) buf->base, buf->size, (void *) d->ptr, (unsigned int) d->offset, + (unsigned int) d->size); +} + +static void ggml_hexagon_mul_mat(const struct ggml_tensor * op, uint32_t flags) { + const struct ggml_tensor * src0 = op->src[0]; + const struct ggml_tensor * src1 = op->src[1]; + const struct ggml_tensor * dst = op; + + uint64_t t1, t2; + t1 = ggml_time_us(); + + // Construct HTP message htp_general_req req; - memset(&req, 0, sizeof(req)); - + req.op = HTP_OP_MUL_MAT; req.flags = flags; + + init_htp_tensor(&req.src0, src0); + init_htp_tensor(&req.src1, src1); + init_htp_tensor(&req.dst, dst); + + // Use opmask to override flags if (!(opt_opmask & HTP_OPMASK_QUANTIZE)) { req.flags |= HTP_OPFLAGS_SKIP_QUANTIZE; } @@ -2260,148 +2350,342 @@ static inline void ggml_hexagon_dispatch_op(ggml_hexagon_session *sess, const st req.flags |= HTP_OPFLAGS_SKIP_COMPUTE; } - ggml_hexagon_dump_op_exec(sess->name, op, req.flags); + dspqueue_buffer bufs[3]; + + // First buffer Weights. + // The content is static, there is no need to do any cache management + dspqueue_buffers_init(bufs, src0, false, false); + + // Second buffer Input Activations. This is a buffer that the CPU + // writes and the DSP reads, so we'll need to flush CPU caches and + // invalidate DSP ones. On platforms with I/O coherency support the + // framework will automatically skip cache operations where possible. + dspqueue_buffers_init(&bufs[1], src1, true, true); + + // Third buffer Output Activations. We'll handle DSP + // cache maintenance in the response message but need to flush + // CPU caches to ensure any previously written dirty lines are + // written out before writes from the DSP start. + dspqueue_buffers_init(&bufs[2], dst, true, false); + + auto * sess = get_session_from_tensor(src0); + + if (opt_verbose) { + hex_print_op_info(op, sess, req.flags); + if (opt_verbose > 1) { + hex_dump_dspbuf(src0, &bufs[0]); + hex_dump_dspbuf(src1, &bufs[1]); + hex_dump_dspbuf(dst, &bufs[2]); + } + } if ((opt_opmask & HTP_OPMASK_QUEUE)) { - dspqueue_buffer bufs[HTP_MAX_PACKET_BUFFERS]; - size_t n_bufs = _init_req_func(&req, bufs, op); - sess->enqueue(req, bufs, n_bufs, opt_opsync); + sess->enqueue(req, bufs, 3, opt_opsync); } - t = ggml_time_us() - t; + t2 = ggml_time_us(); - ggml_hexagon_dump_op_prof(sess->name, op, sess->prof_usecs, sess->prof_cycles, sess->prof_pkts, t); + HEX_PROFILE( + "ggml-hex: %s %s %s %u:%u:%u:%u x %s %u:%u:%u:%u -> %s %u:%u:%u:%u : op-usec %u op-cycles %u op-pkts %u (%f) " + "call-usec %llu\n", + sess->name.c_str(), ggml_op_name(op->op), src0->name, (uint32_t) src0->ne[0], (uint32_t) src0->ne[1], + (uint32_t) src0->ne[2], (uint32_t) src0->ne[3], src1->name, (uint32_t) src1->ne[0], (uint32_t) src1->ne[1], + (uint32_t) src1->ne[2], (uint32_t) src1->ne[3], dst->name, (uint32_t) dst->ne[0], (uint32_t) dst->ne[1], + (uint32_t) dst->ne[2], (uint32_t) dst->ne[3], sess->prof_usecs, sess->prof_cycles, sess->prof_pkts, + (float) sess->prof_cycles / sess->prof_pkts, (unsigned long long) t2 - t1); } -template -static inline size_t init_binary_req(htp_general_req * req, dspqueue_buffer * bufs, const ggml_tensor * t) { - switch (t->op) { - case GGML_OP_MUL_MAT: - req->op = HTP_OP_MUL_MAT; - break; +static void ggml_hexagon_mul_mat_id(const struct ggml_tensor * op, uint32_t flags) { + const struct ggml_tensor * src0 = op->src[0]; + const struct ggml_tensor * src1 = op->src[1]; + const struct ggml_tensor * src2 = op->src[2]; + const struct ggml_tensor * dst = op; + + uint64_t t1, t2; + t1 = ggml_time_us(); + + // Construct HTP message + htp_general_req req; + req.op = HTP_OP_MUL_MAT_ID; + req.flags = flags; + + init_htp_tensor(&req.src0, src0); + init_htp_tensor(&req.src1, src1); + init_htp_tensor(&req.src2, src2); + init_htp_tensor(&req.dst, dst); + + // Use opmask to override flags + if (!(opt_opmask & HTP_OPMASK_QUANTIZE)) { + req.flags |= HTP_OPFLAGS_SKIP_QUANTIZE; + } + if (!(opt_opmask & HTP_OPMASK_COMPUTE)) { + req.flags |= HTP_OPFLAGS_SKIP_COMPUTE; + } + + dspqueue_buffer bufs[4]; + // First buffer Weights. + // The content is static, there is no need to do any cache management + dspqueue_buffers_init(bufs, src0, false, false); + + // Second buffer Input Activations. This is a buffer that the CPU + // writes and the DSP reads, so we'll need to flush CPU caches and + // invalidate DSP ones. On platforms with I/O coherency support the + // framework will automatically skip cache operations where possible. + dspqueue_buffers_init(&bufs[1], src1, true, true); + + // Third buffer expert IDs. This is a buffer that the CPU + // writes and the DSP reads, so we'll need to flush CPU caches and + // invalidate DSP ones. On platforms with I/O coherency support the + // framework will automatically skip cache operations where possible. + dspqueue_buffers_init(&bufs[2], src2, true, true); + + // Forth buffer Output Activations. We'll handle DSP + // cache maintenance in the response message but need to flush + // CPU caches to ensure any previously written dirty lines are + // written out before writes from the DSP start. + dspqueue_buffers_init(&bufs[3], dst, true, false); + + auto * sess = get_session_from_tensor(src0); + + if (opt_verbose) { + hex_print_op_info(op, sess, req.flags); + if (opt_verbose > 1) { + hex_dump_dspbuf(src0, &bufs[0]); + hex_dump_dspbuf(src1, &bufs[1]); + hex_dump_dspbuf(src2, &bufs[2]); + hex_dump_dspbuf(dst, &bufs[3]); + } + } + + if ((opt_opmask & HTP_OPMASK_QUEUE)) { + sess->enqueue(req, bufs, 4, opt_opsync); + } + + t2 = ggml_time_us(); + + HEX_PROFILE( + "ggml-hex: %s matmul-id %s %u:%u:%u:%u x %s %u:%u:%u:%u (%s %u:%u:%u:%u) -> %s %u:%u:%u:%u : op-usec %u " + "op-cycles %u op-pkts %u (%f) call-usec %llu\n", + sess->name.c_str(), src0->name, (uint32_t) src0->ne[0], (uint32_t) src0->ne[1], (uint32_t) src0->ne[2], + (uint32_t) src0->ne[3], src1->name, (uint32_t) src1->ne[0], (uint32_t) src1->ne[1], (uint32_t) src1->ne[2], + (uint32_t) src1->ne[3], src2->name, (uint32_t) src2->ne[0], (uint32_t) src2->ne[1], (uint32_t) src2->ne[2], + (uint32_t) src2->ne[3], dst->name, (uint32_t) dst->ne[0], (uint32_t) dst->ne[1], (uint32_t) dst->ne[2], + (uint32_t) dst->ne[3], sess->prof_usecs, sess->prof_cycles, sess->prof_pkts, + (float) sess->prof_cycles / sess->prof_pkts, (unsigned long long) t2 - t1); +} + +static void ggml_hexagon_binary(const struct ggml_tensor * op, uint32_t flags) { + const struct ggml_tensor * node = op; + const struct ggml_tensor * src0 = node->src[0]; + const struct ggml_tensor * src1 = node->src[1]; + const struct ggml_tensor * dst = node; + + uint64_t t1 = 0; + uint64_t t2 = 0; + + t1 = ggml_time_us(); + + // Construct HTP message + htp_general_req req; + req.flags = flags; + + // Use opmask to override flags + if (!(opt_opmask & HTP_OPMASK_QUANTIZE)) { + req.flags |= HTP_OPFLAGS_SKIP_QUANTIZE; + } + if (!(opt_opmask & HTP_OPMASK_COMPUTE)) { + req.flags |= HTP_OPFLAGS_SKIP_COMPUTE; + } + + switch (node->op) { case GGML_OP_MUL: - req->op = HTP_OP_MUL; + req.op = HTP_OP_MUL; break; case GGML_OP_ADD: - req->op = HTP_OP_ADD; + req.op = HTP_OP_ADD; break; case GGML_OP_SUB: - req->op = HTP_OP_SUB; + req.op = HTP_OP_SUB; break; default: - GGML_ABORT("ggml-hex: binary : unsupported op: %d\n", t->op); - break; + GGML_ABORT("ggml-hex: binary : unsupported op:%d\n", node->op); } - // src0: Weights (mulmat) or First Operand (binary op). - // If constant (e.g. weights), no cache management is needed. - // src1: Input Activations (mulmat) or Second Operand (binary op). + init_htp_tensor(&req.src0, src0); + init_htp_tensor(&req.src1, src1); + init_htp_tensor(&req.dst, dst); - size_t n_bufs = 0; - n_bufs += htp_req_buff_init(&req->src0, &bufs[n_bufs], t->src[0], _is_src0_constant ? DSPQBUF_TYPE_CONSTANT : DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->src1, &bufs[n_bufs], t->src[1], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->dst, &bufs[n_bufs], t, DSPQBUF_TYPE_DSP_WRITE_CPU_READ); + dspqueue_buffer bufs[3]; + // First buffer = First Operand of Binary op + // This is a buffer that the CPU writes and the DSP reads, so we'll + // need to flush CPU caches and invalidate DSP ones. On platforms + // with I/O coherency support the framework will automatically skip + // cache operations where possible. + dspqueue_buffers_init(bufs, src0, true, true); - return n_bufs; + // Second buffer = Second Operand of Binary op + // This is a buffer that the CPU writes and the DSP reads, so we'll + // need to flush CPU caches and invalidate DSP ones. On platforms + // with I/O coherency support the framework will automatically skip + // cache operations where possible. + dspqueue_buffers_init(&bufs[1], src1, true, true); + + // Third buffer = Output Activations. We'll handle DSP + // cache maintenance in the response message but need to flush + // CPU caches to ensure any previously written dirty lines are + // written out before writes from the DSP start. + dspqueue_buffers_init(&bufs[2], dst, true, false); + + auto * sess = get_session_from_tensor(src0); + + if (opt_verbose) { + hex_print_op_info(op, sess, req.flags); + if (opt_verbose > 1) { + hex_dump_dspbuf(src0, &bufs[0]); + hex_dump_dspbuf(src1, &bufs[1]); + hex_dump_dspbuf(dst, &bufs[2]); + } + } + + if ((opt_opmask & HTP_OPMASK_QUEUE)) { + sess->enqueue(req, bufs, 3, opt_opsync); + } + + t2 = ggml_time_us(); + + HEX_PROFILE( + "ggml-hex: %s %s %s %u:%u:%u:%u x %s %u:%u:%u:%u -> %s %u:%u:%u:%u : op-usec %u op-cycles %u op-pkts %u (%f) " + "call-usec %llu\n", + sess->name.c_str(), ggml_op_name(node->op), src0->name, (uint32_t) src0->ne[0], (uint32_t) src0->ne[1], + (uint32_t) src0->ne[2], (uint32_t) src0->ne[3], src1->name, (uint32_t) src1->ne[0], (uint32_t) src1->ne[1], + (uint32_t) src1->ne[2], (uint32_t) src1->ne[3], dst->name, (uint32_t) dst->ne[0], (uint32_t) dst->ne[1], + (uint32_t) dst->ne[2], (uint32_t) dst->ne[3], sess->prof_usecs, sess->prof_cycles, sess->prof_pkts, + (float) sess->prof_cycles / sess->prof_pkts, (unsigned long long) t2 - t1); } -static inline size_t init_cpy_req(htp_general_req * req, dspqueue_buffer * bufs, const ggml_tensor * t) { - req->op = HTP_OP_CPY; +static void ggml_hexagon_add_id(const struct ggml_tensor * op, uint32_t flags) { + const struct ggml_tensor * node = op; + const struct ggml_tensor * src0 = node->src[0]; + const struct ggml_tensor * src1 = node->src[1]; + const struct ggml_tensor * src2 = node->src[2]; + const struct ggml_tensor * dst = node; - size_t n_bufs = 0; - n_bufs += htp_req_buff_init(&req->src0, &bufs[n_bufs], t->src[0], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->dst, &bufs[n_bufs], t, DSPQBUF_TYPE_DSP_WRITE_CPU_READ); + uint64_t t1 = 0; + uint64_t t2 = 0; - return n_bufs; -} + t1 = ggml_time_us(); -static inline size_t init_get_rows_req(htp_general_req * req, dspqueue_buffer * bufs, const ggml_tensor * t) { - req->op = HTP_OP_GET_ROWS; + // Construct HTP message + htp_general_req req; + req.flags = flags; - size_t n_bufs = 0; - n_bufs += htp_req_buff_init(&req->src0, &bufs[n_bufs], t->src[0], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->src1, &bufs[n_bufs], t->src[1], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->dst, &bufs[n_bufs], t, DSPQBUF_TYPE_DSP_WRITE_CPU_READ); + // Use opmask to override flags + if (!(opt_opmask & HTP_OPMASK_QUANTIZE)) { + req.flags |= HTP_OPFLAGS_SKIP_QUANTIZE; + } + if (!(opt_opmask & HTP_OPMASK_COMPUTE)) { + req.flags |= HTP_OPFLAGS_SKIP_COMPUTE; + } - return n_bufs; -} - -template -static inline size_t init_binary_id_req(htp_general_req * req, dspqueue_buffer * bufs, const ggml_tensor * t) { - switch (t->op) { - case GGML_OP_MUL_MAT_ID: - req->op = HTP_OP_MUL_MAT_ID; - break; + switch (node->op) { case GGML_OP_ADD_ID: - req->op = HTP_OP_ADD_ID; + req.op = HTP_OP_ADD_ID; break; default: - GGML_ABORT("ggml-hex: unsupported op: %d\n", t->op); + GGML_ABORT("ggml-hex: unsupported op:%d\n", node->op); } - // src0: Weights (mulmat) or Input Activations (other op). - // If constant, no cache management is needed. - // src1: Input Activations (mulmat) or Second Operand (binary op). - // src2: Expert IDs (mulmat) or Activated Experts (other op). + init_htp_tensor(&req.src0, src0); + init_htp_tensor(&req.src1, src1); + init_htp_tensor(&req.src2, src2); + init_htp_tensor(&req.dst, dst); - size_t n_bufs = 0; - n_bufs += htp_req_buff_init(&req->src0, &bufs[n_bufs], t->src[0], _is_src0_constant ? DSPQBUF_TYPE_CONSTANT : DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->src1, &bufs[n_bufs], t->src[1], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->src2, &bufs[n_bufs], t->src[2], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->dst, &bufs[n_bufs], t, DSPQBUF_TYPE_DSP_WRITE_CPU_READ); + dspqueue_buffer bufs[4]; + // First buffer = input activations + dspqueue_buffers_init(bufs, src0, true, true); + // Second buffer = experts bias + dspqueue_buffers_init(&bufs[1], src1, true, true); + // Third buffer = activated experts + dspqueue_buffers_init(&bufs[2], src2, true, true); + // Forth buffer = output activations + dspqueue_buffers_init(&bufs[3], dst, true, true); - return n_bufs; + auto * sess = get_session_from_tensor(src0); + + if (opt_verbose) { + hex_print_op_info(op, sess, req.flags); + if (opt_verbose > 1) { + hex_dump_dspbuf(src0, &bufs[0]); + hex_dump_dspbuf(src1, &bufs[1]); + hex_dump_dspbuf(src2, &bufs[2]); + hex_dump_dspbuf(dst, &bufs[3]); + } + } + + if ((opt_opmask & HTP_OPMASK_QUEUE)) { + sess->enqueue(req, bufs, 4, opt_opsync); + } + + t2 = ggml_time_us(); + + HEX_PROFILE( + "ggml-hex: %s %s %s %u:%u:%u:%u x %s %u:%u:%u:%u -> %s %u:%u:%u:%u : op-usec %u op-cycles %u op-pkts %u (%f) " + "call-usec %llu\n", + sess->name.c_str(), ggml_op_name(node->op), src0->name, (uint32_t) src0->ne[0], (uint32_t) src0->ne[1], + (uint32_t) src0->ne[2], (uint32_t) src0->ne[3], src1->name, (uint32_t) src1->ne[0], (uint32_t) src1->ne[1], + (uint32_t) src1->ne[2], (uint32_t) src1->ne[3], dst->name, (uint32_t) dst->ne[0], (uint32_t) dst->ne[1], + (uint32_t) dst->ne[2], (uint32_t) dst->ne[3], sess->prof_usecs, sess->prof_cycles, sess->prof_pkts, + (float) sess->prof_cycles / sess->prof_pkts, (unsigned long long) t2 - t1); } -static inline size_t init_set_rows_req(htp_general_req * req, dspqueue_buffer * bufs, const ggml_tensor * t) { - req->op = HTP_OP_SET_ROWS; +static void ggml_hexagon_unary(const struct ggml_tensor * op, uint32_t flags) { + const struct ggml_tensor * src0 = op->src[0]; + const struct ggml_tensor * src1 = op->src[1]; + const struct ggml_tensor * dst = op; - size_t n_bufs = 0; - n_bufs += htp_req_buff_init(&req->src0, &bufs[n_bufs], t->src[0], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->src1, &bufs[n_bufs], t->src[1], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->dst, &bufs[n_bufs], t, DSPQBUF_TYPE_DSP_WRITE_CPU_READ); + uint64_t t1 = 0; + uint64_t t2 = 0; - return n_bufs; -} + t1 = ggml_time_us(); -static inline size_t init_unary_req(htp_general_req * req, dspqueue_buffer * bufs, const ggml_tensor * t) { - memcpy(&req->op_params, &t->op_params, sizeof(t->op_params)); + // Construct HTP message + htp_general_req req; + + memset(&req, 0, sizeof(htp_general_req)); + memcpy(&req.op_params, &op->op_params, sizeof(op->op_params)); + req.flags = flags; bool supported = false; - switch (t->op) { + switch (op->op) { case GGML_OP_RMS_NORM: - req->op = HTP_OP_RMS_NORM; - supported = true; - break; - - case GGML_OP_SCALE: - req->op = HTP_OP_SCALE; + req.op = HTP_OP_RMS_NORM; supported = true; break; case GGML_OP_UNARY: - if (ggml_get_unary_op(t) == GGML_UNARY_OP_SILU) { - req->op = HTP_OP_UNARY_SILU; + if (ggml_get_unary_op(dst) == GGML_UNARY_OP_SILU) { + req.op = HTP_OP_UNARY_SILU; supported = true; - } else if (ggml_get_unary_op(t) == GGML_UNARY_OP_GELU) { - req->op = HTP_OP_UNARY_GELU; + } + else if (ggml_get_unary_op(dst) == GGML_UNARY_OP_GELU) { + req.op = HTP_OP_UNARY_GELU; supported = true; } break; case GGML_OP_GLU: - if (ggml_get_glu_op(t) == GGML_GLU_OP_SWIGLU) { - req->op = HTP_OP_GLU_SWIGLU; + if (ggml_get_glu_op(dst) == GGML_GLU_OP_SWIGLU) { + req.op = HTP_OP_GLU_SWIGLU; supported = true; - } else if (ggml_get_glu_op(t) == GGML_GLU_OP_SWIGLU_OAI) { - req->op = HTP_OP_GLU_SWIGLU_OAI; + } else if (ggml_get_glu_op(dst) == GGML_GLU_OP_SWIGLU_OAI) { + req.op = HTP_OP_GLU_SWIGLU_OAI; supported = true; } break; case GGML_OP_SOFT_MAX: - req->op = HTP_OP_SOFTMAX; + req.op = HTP_OP_SOFTMAX; supported = true; break; @@ -2410,43 +2694,194 @@ static inline size_t init_unary_req(htp_general_req * req, dspqueue_buffer * buf } if (!supported) { - GGML_ABORT("ggml-hex: unary : unsupported op: %d\n", t->op); + GGML_ABORT("ggml-hex: unary : unsupported op:%d\n", op->op); } - size_t n_bufs = 0; - n_bufs += htp_req_buff_init(&req->src0, &bufs[n_bufs], t->src[0], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->src1, &bufs[n_bufs], t->src[1], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->dst, &bufs[n_bufs], t, DSPQBUF_TYPE_DSP_WRITE_CPU_READ); + init_htp_tensor(&req.dst, dst); + init_htp_tensor(&req.src0, src0); + if (src1) { + init_htp_tensor(&req.src1, src1); + } - return n_bufs; + // Use opmask to override flags + if (!(opt_opmask & HTP_OPMASK_QUANTIZE)) { + req.flags |= HTP_OPFLAGS_SKIP_QUANTIZE; + } + if (!(opt_opmask & HTP_OPMASK_COMPUTE)) { + req.flags |= HTP_OPFLAGS_SKIP_COMPUTE; + } + + dspqueue_buffer bufs[3]; + + // First buffer = Only Operand of Unary op + // This is a buffer that the CPU writes and the DSP reads, so we'll + // need to flush CPU caches and invalidate DSP ones. On platforms + // with I/O coherency support the framework will automatically skip + // cache operations where possible. + size_t n_bufs = dspqueue_buffers_init(bufs, src0, true, true); + + // Second buffer(nullable) = Second Operand of Binary op + // This is a buffer that the CPU writes and the DSP reads, so we'll + // need to flush CPU caches and invalidate DSP ones. On platforms + // with I/O coherency support the framework will automatically skip + // cache operations where possible. + n_bufs += dspqueue_buffers_init(&bufs[n_bufs], src1, true, true); + + // Second or third buffer = Output Activations. We'll handle DSP + // Second buffer = Output Activations. We'll handle DSP + // cache maintenance in the response message but need to flush + // CPU caches to ensure any previously written dirty lines are + // written out before writes from the DSP start. + n_bufs += dspqueue_buffers_init(&bufs[n_bufs], dst, true, false); + + // Primary DSP session from the src0 tensor + auto * sess = get_session_from_tensor(src0); + + if (opt_verbose) { + hex_print_op_info(op, sess, req.flags); + if (opt_verbose > 1) { + hex_dump_dspbuf(src0, &bufs[0]); + if (src1) { + hex_dump_dspbuf(src1, &bufs[1]); + hex_dump_dspbuf(dst, &bufs[2]); + } else { + hex_dump_dspbuf(dst, &bufs[1]); + } + } + } + + if ((opt_opmask & HTP_OPMASK_QUEUE)) { + sess->enqueue(req, bufs, n_bufs, opt_opsync); + } + + t2 = ggml_time_us(); + + if (src1) { + HEX_PROFILE( + "ggml-hex: %s %s %s %u:%u:%u:%u x %s %u:%u:%u:%u -> %s %u:%u:%u:%u : op-usec %u op-cycles %u op-pkts %u " + "(%f) call-usec %llu\n", + sess->name.c_str(), ggml_op_name(op->op), src0->name, (uint32_t) src0->ne[0], (uint32_t) src0->ne[1], + (uint32_t) src0->ne[2], (uint32_t) src0->ne[3], src1->name, (uint32_t) src1->ne[0], (uint32_t) src1->ne[1], + (uint32_t) src1->ne[2], (uint32_t) src1->ne[3], dst->name, (uint32_t) dst->ne[0], (uint32_t) dst->ne[1], + (uint32_t) dst->ne[2], (uint32_t) dst->ne[3], sess->prof_usecs, sess->prof_cycles, sess->prof_pkts, + (float) sess->prof_cycles / sess->prof_pkts, (unsigned long long) t2 - t1); + } else { + HEX_PROFILE( + "ggml-hex: %s %s %s %u:%u:%u:%u -> %s %u:%u:%u:%u : op-usec %u op-cycles %u op-pkts %u (%f) call-usec " + "%llu\n", + sess->name.c_str(), ggml_op_name(op->op), src0->name, (uint32_t) src0->ne[0], (uint32_t) src0->ne[1], + (uint32_t) src0->ne[2], (uint32_t) src0->ne[3], dst->name, (uint32_t) dst->ne[0], (uint32_t) dst->ne[1], + (uint32_t) dst->ne[2], (uint32_t) dst->ne[3], sess->prof_usecs, sess->prof_cycles, sess->prof_pkts, + (float) sess->prof_cycles / sess->prof_pkts, (unsigned long long) t2 - t1); + } } -static inline size_t init_rope_req(htp_general_req * req, dspqueue_buffer * bufs, const ggml_tensor * t) { - memcpy(&req->op_params, &t->op_params, sizeof(t->op_params)); - req->op = HTP_OP_ROPE; +static void ggml_hexagon_rope(const struct ggml_tensor * op, uint32_t flags) { + const struct ggml_tensor * src0 = op->src[0]; + const struct ggml_tensor * src1 = op->src[1]; + const struct ggml_tensor * src2 = op->src[2]; + const struct ggml_tensor * dst = op; - size_t n_bufs = 0; - n_bufs += htp_req_buff_init(&req->src0, &bufs[n_bufs], t->src[0], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->src1, &bufs[n_bufs], t->src[1], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->src2, &bufs[n_bufs], t->src[2], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->dst, &bufs[n_bufs], t, DSPQBUF_TYPE_DSP_WRITE_CPU_READ); + uint64_t t1 = 0; + uint64_t t2 = 0; - return n_bufs; -} + t1 = ggml_time_us(); -static inline size_t init_flash_attn_ext_req(htp_general_req * req, dspqueue_buffer * bufs, const ggml_tensor * t) { - memcpy(&req->op_params, &t->op_params, sizeof(t->op_params)); - req->op = HTP_OP_FLASH_ATTN_EXT; + // Construct HTP message + htp_general_req req; - size_t n_bufs = 0; - n_bufs += htp_req_buff_init(&req->src0, &bufs[n_bufs], t->src[0], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->src1, &bufs[n_bufs], t->src[1], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->src2, &bufs[n_bufs], t->src[2], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->src3, &bufs[n_bufs], t->src[3], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->src4, &bufs[n_bufs], t->src[4], DSPQBUF_TYPE_CPU_WRITE_DSP_READ); - n_bufs += htp_req_buff_init(&req->dst, &bufs[n_bufs], t, DSPQBUF_TYPE_DSP_WRITE_CPU_READ); + memset(&req, 0, sizeof(htp_general_req)); + memcpy(&req.op_params, &op->op_params, sizeof(op->op_params)); + req.flags = flags; + req.op = HTP_OP_ROPE; - return n_bufs; + init_htp_tensor(&req.dst, dst); + init_htp_tensor(&req.src0, src0); + init_htp_tensor(&req.src1, src1); + if (src2) { + init_htp_tensor(&req.src2, src2); + } + + // Use opmask to override flags + if (!(opt_opmask & HTP_OPMASK_QUANTIZE)) { + req.flags |= HTP_OPFLAGS_SKIP_QUANTIZE; + } + if (!(opt_opmask & HTP_OPMASK_COMPUTE)) { + req.flags |= HTP_OPFLAGS_SKIP_COMPUTE; + } + + dspqueue_buffer bufs[4]; + + // First buffer + // This is a buffer that the CPU writes and the DSP reads, so we'll + // need to flush CPU caches and invalidate DSP ones. On platforms + // with I/O coherency support the framework will automatically skip + // cache operations where possible. + size_t n_bufs = dspqueue_buffers_init(bufs, src0, true, true); + + // Second buffer + // This is a buffer that the CPU writes and the DSP reads, so we'll + // need to flush CPU caches and invalidate DSP ones. On platforms + // with I/O coherency support the framework will automatically skip + // cache operations where possible. + n_bufs += dspqueue_buffers_init(&bufs[n_bufs], src1, true, true); + + // Third buffer(nullable) + // This is a buffer that the CPU writes and the DSP reads, so we'll + // need to flush CPU caches and invalidate DSP ones. On platforms + // with I/O coherency support the framework will automatically skip + // cache operations where possible. + n_bufs += dspqueue_buffers_init(&bufs[n_bufs], src2, true, true); + + // Final buffer = Output Activations. We'll handle DSP + // Second buffer = Output Activations. We'll handle DSP + // cache maintenance in the response message but need to flush + // CPU caches to ensure any previously written dirty lines are + // written out before writes from the DSP start. + n_bufs += dspqueue_buffers_init(&bufs[n_bufs], dst, true, false); + + // Primary DSP session from the src0 tensor + auto * sess = get_session_from_tensor(src0); + + if (opt_verbose) { + hex_print_op_info(op, sess, req.flags); + if (opt_verbose > 1) { + hex_dump_dspbuf(src0, &bufs[0]); + if (src1) { + hex_dump_dspbuf(src1, &bufs[1]); + hex_dump_dspbuf(dst, &bufs[2]); + } else { + hex_dump_dspbuf(dst, &bufs[1]); + } + } + } + + if ((opt_opmask & HTP_OPMASK_QUEUE)) { + sess->enqueue(req, bufs, n_bufs, opt_opsync); + } + + t2 = ggml_time_us(); + + if (src2) { + HEX_PROFILE( + "ggml-hex: %s %s %s %u:%u:%u:%u x %s %u:%u:%u:%u x %s %u:%u:%u:%u -> %s %u:%u:%u:%u : op-usec %u op-cycles " + "%u op-pkts %u (%f) call-usec %llu\n", + sess->name.c_str(), ggml_op_name(op->op), src0->name, (uint32_t) src0->ne[0], (uint32_t) src0->ne[1], + (uint32_t) src0->ne[2], (uint32_t) src0->ne[3], src1->name, (uint32_t) src1->ne[0], (uint32_t) src1->ne[1], + (uint32_t) src1->ne[2], (uint32_t) src1->ne[3], src2->name, (uint32_t) src2->ne[0], (uint32_t) src2->ne[1], + (uint32_t) src2->ne[2], (uint32_t) src2->ne[3], dst->name, (uint32_t) dst->ne[0], (uint32_t) dst->ne[1], + (uint32_t) dst->ne[2], (uint32_t) dst->ne[3], sess->prof_usecs, sess->prof_cycles, sess->prof_pkts, + (float) sess->prof_cycles / sess->prof_pkts, (unsigned long long) t2 - t1); + } else { + HEX_PROFILE( + "ggml-hex: %s %s %s %u:%u:%u:%u x %s %u:%u:%u:%u -> %s %u:%u:%u:%u : op-usec %u op-cycles %u op-pkts %u " + "(%f) call-usec %llu\n", + sess->name.c_str(), ggml_op_name(op->op), src0->name, (uint32_t) src0->ne[0], (uint32_t) src0->ne[1], + (uint32_t) src0->ne[2], (uint32_t) src0->ne[3], src1->name, (uint32_t) src1->ne[0], (uint32_t) src1->ne[1], + (uint32_t) src1->ne[2], (uint32_t) src1->ne[3], dst->name, (uint32_t) dst->ne[0], (uint32_t) dst->ne[1], + (uint32_t) dst->ne[2], (uint32_t) dst->ne[3], sess->prof_usecs, sess->prof_cycles, sess->prof_pkts, + (float) sess->prof_cycles / sess->prof_pkts, (unsigned long long) t2 - t1); + } } static const char * ggml_backend_hexagon_name(ggml_backend_t backend) { @@ -2461,7 +2896,7 @@ static void ggml_backend_hexagon_free(ggml_backend_t backend) { } static inline bool op_reuse_src1(const ggml_tensor * op1, const ggml_tensor * op0) { - return (op0 && op0->src[1] == op1->src[1] && ggml_is_quantized(op0->src[0]->type) && ggml_is_quantized(op1->src[1]->type)); + return (op0 && op0->src[1] == op1->src[1]); } static inline bool is_compute_op(ggml_tensor *node) @@ -2511,67 +2946,43 @@ static ggml_status ggml_backend_hexagon_graph_compute(ggml_backend_t backend, gg switch (node->op) { case GGML_OP_MUL_MAT: - if (ggml_is_quantized(node->src[0]->type)) { - ggml_hexagon_dispatch_op>(sess, node, flags); - } else { - ggml_hexagon_dispatch_op>(sess, node, flags); - } + ggml_hexagon_mul_mat(node, flags); prev_quant_op = node; break; case GGML_OP_MUL_MAT_ID: - if (ggml_is_quantized(node->src[0]->type)) { - ggml_hexagon_dispatch_op>(sess, node, flags); - } else { - ggml_hexagon_dispatch_op>(sess, node, flags); - } + ggml_hexagon_mul_mat_id(node, flags); prev_quant_op = node; break; case GGML_OP_MUL: case GGML_OP_ADD: case GGML_OP_SUB: - ggml_hexagon_dispatch_op>(sess, node, flags); + ggml_hexagon_binary(node, flags); break; case GGML_OP_ADD_ID: - ggml_hexagon_dispatch_op>(sess, node, flags); + ggml_hexagon_add_id(node, flags); break; case GGML_OP_RMS_NORM: - case GGML_OP_SCALE: - ggml_hexagon_dispatch_op(sess, node, flags); + ggml_hexagon_unary(node, flags); break; case GGML_OP_UNARY: - if ((ggml_get_unary_op(node) == GGML_UNARY_OP_SILU) || - (ggml_get_unary_op(node) == GGML_UNARY_OP_GELU)) { - ggml_hexagon_dispatch_op(sess, node, flags); + if (ggml_get_unary_op(node) == GGML_UNARY_OP_SILU) { + ggml_hexagon_unary(node, flags); + } else if (ggml_get_unary_op(node) == GGML_UNARY_OP_GELU) { + ggml_hexagon_unary(node, flags); } break; case GGML_OP_GLU: if ((ggml_get_glu_op(node) == GGML_GLU_OP_SWIGLU) || - (ggml_get_glu_op(node) == GGML_GLU_OP_SWIGLU_OAI)) { - ggml_hexagon_dispatch_op(sess, node, flags); + (ggml_get_glu_op(node) == GGML_GLU_OP_SWIGLU_OAI)) { + ggml_hexagon_unary(node, flags); } break; case GGML_OP_SOFT_MAX: - ggml_hexagon_dispatch_op(sess, node, flags); + ggml_hexagon_unary(node, flags); break; case GGML_OP_ROPE: - ggml_hexagon_dispatch_op(sess, node, flags); - break; - - case GGML_OP_FLASH_ATTN_EXT: - ggml_hexagon_dispatch_op(sess, node, flags); - break; - - case GGML_OP_SET_ROWS: - ggml_hexagon_dispatch_op(sess, node, flags); - break; - - case GGML_OP_GET_ROWS: - ggml_hexagon_dispatch_op(sess, node, flags); - break; - - case GGML_OP_CPY: - ggml_hexagon_dispatch_op(sess, node, flags); + ggml_hexagon_rope(node, flags); break; default: @@ -2700,8 +3111,8 @@ static void ggml_backend_hexagon_graph_optimize(ggml_backend_t backend, ggml_cgr // and perform the reorder over the fused nodes. after the reorder is done, we unfuse for (int i = 0; i < n; i++) { node_info node = { - /*.node =*/gf->nodes[i], - /*.fused =*/{}, + /*.node =*/ gf->nodes[i], + /*.fused =*/ {}, }; // fuse only ops that start with these operations @@ -2852,59 +3263,9 @@ static ggml_backend_buffer_type_t ggml_backend_hexagon_device_get_repack_buffer_ return &sess->repack_buffer_type; } -static bool ggml_hexagon_supported_buffer(ggml_hexagon_session *sess, const struct ggml_tensor * t) { - if (t && t->buffer) { - if (ggml_backend_buffer_is_hexagon(t->buffer) == false) return false; // not our buffer - if (ggml_backend_hexagon_buffer_get_sess(t->buffer) != sess) return false; // wrong session - } - return true; -} - -static bool ggml_hexagon_supported_buffers(ggml_hexagon_session *sess, const struct ggml_tensor * t) { - // all srcs & dsts must be mapped to the same session - if (!ggml_hexagon_supported_buffer(sess, t)) { - return false; - } - - for (int i = 0; i < GGML_MAX_SRC; i++) { - if (!ggml_hexagon_supported_buffer(sess, t->src[i])) { - return false; - } - } - - return true; -} - -static bool ggml_hexagon_supported_cpy(const struct ggml_hexagon_session * sess, const struct ggml_tensor * op) { - const struct ggml_tensor * src0 = op->src[0]; - const struct ggml_tensor * dst = op; - - // for now we can do f32 -> f16 and f16 -> f32 (without reshaping) - if (src0->type != GGML_TYPE_F32 && src0->type != GGML_TYPE_F16) return false; - if ( dst->type != GGML_TYPE_F32 && dst->type != GGML_TYPE_F16) return false; - - const bool sametype = (src0->type == dst->type); - const bool transposed = ggml_is_transposed(src0) || ggml_is_transposed(dst); - const bool sameshape = !transposed && ggml_are_same_shape(src0, dst); - - // can handle any shape and any same-type (pretty slow if reshaping is required) - if (sametype) return true; - - // cannot handle re-shaping and type conversion at the same time - if (!sameshape) return false; - - return true; -} - static bool ggml_backend_hexagon_device_supports_op(ggml_backend_dev_t dev, const struct ggml_tensor * op) { auto sess = static_cast(dev->context); - // all srcs & dsts must be mapped to the same session - if (!ggml_hexagon_supported_buffers(sess, op)) { - ggml_hexagon_dump_op_supp(sess->name, op, false); - return false; - } - bool supp = false; switch (op->op) { case GGML_OP_NONE: @@ -2934,7 +3295,6 @@ static bool ggml_backend_hexagon_device_supports_op(ggml_backend_dev_t dev, cons break; case GGML_OP_RMS_NORM: - case GGML_OP_SCALE: supp = ggml_hexagon_supported_unary(sess, op); break; @@ -2943,47 +3303,48 @@ static bool ggml_backend_hexagon_device_supports_op(ggml_backend_dev_t dev, cons break; case GGML_OP_UNARY: - { - const auto unary_op = ggml_get_unary_op(op); - if (unary_op == GGML_UNARY_OP_SILU || unary_op == GGML_UNARY_OP_GELU) { - supp = ggml_hexagon_supported_activations(sess, op); - } - break; + if (ggml_get_unary_op(op) == GGML_UNARY_OP_SILU) { + supp = ggml_hexagon_supported_activations(sess, op); } + else if (ggml_get_unary_op(op) == GGML_UNARY_OP_GELU){ + supp = ggml_hexagon_supported_activations(sess, op); + } + break; + case GGML_OP_GLU: - { - const auto glu_op = ggml_get_glu_op(op); - if ((glu_op == GGML_GLU_OP_SWIGLU) || (glu_op == GGML_GLU_OP_SWIGLU_OAI)) { - supp = ggml_hexagon_supported_activations(sess, op); - } - break; + if ((ggml_get_glu_op(op) == GGML_GLU_OP_SWIGLU) || (ggml_get_glu_op(op) == GGML_GLU_OP_SWIGLU_OAI) ) { + supp = ggml_hexagon_supported_activations(sess, op); } + break; + case GGML_OP_ROPE: supp = ggml_hexagon_supported_rope(sess, op); break; - case GGML_OP_FLASH_ATTN_EXT: - supp = ggml_hexagon_supported_flash_attn_ext(sess, op); - break; - - case GGML_OP_SET_ROWS: - supp = ggml_hexagon_supported_set_rows(sess, op); - break; - - case GGML_OP_GET_ROWS: - supp = ggml_hexagon_supported_get_rows(sess, op); - break; - - case GGML_OP_CPY: - supp = ggml_hexagon_supported_cpy(sess, op); - break; - default: break; } - ggml_hexagon_dump_op_supp(sess->name, op, supp); + if (opt_verbose) { + char dims[64 * GGML_MAX_SRC]; + char strides[64 * GGML_MAX_SRC]; + char types[16 * GGML_MAX_SRC]; + char buffs[64 * GGML_MAX_SRC]; + char names[64 * GGML_MAX_SRC]; + + hex_format_op_dims(dims, op); + hex_format_op_strides(strides, op); + hex_format_op_types(types, op); + hex_format_op_buffs(buffs, op); + hex_format_op_names(names, op); + + HEX_VERBOSE("ggml-hex: %s device-supports-op %s : %s : %s : %s : %s : %s : (%d)\n", sess->name.c_str(), + ggml_op_name(op->op), names, dims, types, strides, buffs, (int) supp); + } + return supp; + + GGML_UNUSED(dev); } static bool ggml_backend_hexagon_device_supports_buft(ggml_backend_dev_t dev, ggml_backend_buffer_type_t buft) { @@ -3052,7 +3413,7 @@ ggml_hexagon_registry::ggml_hexagon_registry(ggml_backend_reg_t reg) { } } - if (opt_arch < 75) { + if(opt_arch < 75) { opt_ndev = 1; GGML_LOG_WARN("ggml-hex: forcing ndev to 1 for SoCs archs lower than v75.\n"); } @@ -3061,11 +3422,11 @@ ggml_hexagon_registry::ggml_hexagon_registry(ggml_backend_reg_t reg) { // Create devices / sessions for (size_t i = 0; i < opt_ndev; i++) { - devices[i].iface = ggml_backend_hexagon_device_i; - devices[i].reg = reg; + devices[i].iface = ggml_backend_hexagon_device_i; + devices[i].reg = reg; try { devices[i].context = new ggml_hexagon_session(i, &devices[i]); - } catch (const std::exception & exc) { + } catch (std::exception const &exc) { GGML_LOG_ERROR("ggml-hex: failed to create device/session %zu\n", i); devices[i].context = nullptr; } @@ -3103,7 +3464,7 @@ static ggml_backend_dev_t ggml_backend_hexagon_reg_get_device(ggml_backend_reg_t } static void * ggml_backend_hexagon_get_proc_address(ggml_backend_reg_t reg, const char * name) { - if (strcmp(name, "ggml_backend_dev_get_extra_bufts") == 0 && opt_hostbuf) { + if (strcmp(name, "ggml_backend_dev_get_extra_bufts") == 0) { ggml_backend_dev_get_extra_bufts_t fct = ggml_backend_hexagon_device_get_extra_buffers_type; return (void *) fct; } @@ -3120,31 +3481,34 @@ static void ggml_hexagon_init(ggml_backend_reg * reg) { static_assert((unsigned int) HTP_TYPE_MXFP4 == (unsigned int) GGML_TYPE_MXFP4, "please update hexagon_type to match ggml_type"); - const char * str_experimental = getenv("GGML_HEXAGON_EXPERIMENTAL"); const char * str_verbose = getenv("GGML_HEXAGON_VERBOSE"); const char * str_hostbuf = getenv("GGML_HEXAGON_HOSTBUF"); - const char * str_opmask = getenv("GGML_HEXAGON_OPMASK"); - const char * str_opsync = getenv("GGML_HEXAGON_OPSYNC"); - const char * str_profile = getenv("GGML_HEXAGON_PROFILE"); - const char * str_etm = getenv("GGML_HEXAGON_ETM"); - const char * str_nhvx = getenv("GGML_HEXAGON_NHVX"); - const char * str_ndev = getenv("GGML_HEXAGON_NDEV"); - const char * str_arch = getenv("GGML_HEXAGON_ARCH"); - opt_experimental = str_experimental ? atoi(str_experimental) : 0; opt_verbose = str_verbose ? atoi(str_verbose) : 0; - opt_hostbuf = str_hostbuf ? atoi(str_hostbuf) : opt_hostbuf; - opt_opmask = str_opmask ? strtoul(str_opmask, NULL, 0) : opt_opmask; - opt_opsync = str_opsync ? atoi(str_opsync) : 0; - opt_profile = str_profile ? atoi(str_profile) : 0; - opt_etm = str_etm ? atoi(str_etm) : 0; - opt_nhvx = str_nhvx ? strtoul(str_nhvx, NULL, 0) : opt_nhvx; - opt_ndev = str_ndev ? strtoul(str_ndev, NULL, 0) : opt_ndev; + opt_profile = getenv("GGML_HEXAGON_PROFILE") != nullptr; + opt_etm = getenv("GGML_HEXAGON_ETM") != nullptr; + opt_experimental = getenv("GGML_HEXAGON_EXPERIMENTAL") != nullptr; - if (opt_ndev > GGML_HEXAGON_MAX_SESSIONS) { - opt_ndev = GGML_HEXAGON_MAX_SESSIONS; + const char * str_opmask = getenv("GGML_HEXAGON_OPMASK"); + if (str_opmask != nullptr) { + opt_opmask = strtoul(str_opmask, NULL, 0); + } + opt_opsync = getenv("GGML_HEXAGON_OPSYNC") != nullptr; + + const char * str_ndev = getenv("GGML_HEXAGON_NDEV"); + if (str_ndev) { + opt_ndev = strtoul(str_ndev, NULL, 0); + if (opt_ndev > GGML_HEXAGON_MAX_SESSIONS) { + opt_ndev = GGML_HEXAGON_MAX_SESSIONS; + } } + const char * str_nhvx = getenv("GGML_HEXAGON_NHVX"); + if (str_nhvx) { + opt_nhvx = strtoul(str_nhvx, NULL, 0); + } + + const char * str_arch = getenv("GGML_HEXAGON_ARCH"); if (str_arch) { if (str_arch[0] == 'v') { str_arch++; @@ -3152,6 +3516,8 @@ static void ggml_hexagon_init(ggml_backend_reg * reg) { opt_arch = strtoul(str_arch, NULL, 0); } + opt_hostbuf = str_hostbuf ? atoi(str_hostbuf) : 1; + reg->context = new ggml_hexagon_registry(reg); HEX_VERBOSE("ggml-hex: size-of-general-req %zu size-of-general-rsp %zu\n", sizeof(struct htp_general_req), diff --git a/ggml/src/ggml-hexagon/htp-utils.h b/ggml/src/ggml-hexagon/htp-utils.h index 7bbae3a..1a48f5d 100644 --- a/ggml/src/ggml-hexagon/htp-utils.h +++ b/ggml/src/ggml-hexagon/htp-utils.h @@ -8,7 +8,6 @@ extern "C" { #include #include #include -#include #include /* Offset to differentiate HLOS and Hexagon error codes. diff --git a/ggml/src/ggml-hexagon/htp/CMakeLists.txt b/ggml/src/ggml-hexagon/htp/CMakeLists.txt index e8ef203..2cf8aaa 100644 --- a/ggml/src/ggml-hexagon/htp/CMakeLists.txt +++ b/ggml/src/ggml-hexagon/htp/CMakeLists.txt @@ -17,22 +17,21 @@ add_library(${HTP_LIB} SHARED main.c htp_iface_skel.c worker-pool.c - hex-dma.c + htp-dma.c + hvx-sigmoid.c + hvx-inverse.c + hvx-exp.c + hvx-utils.c matmul-ops.c binary-ops.c unary-ops.c softmax-ops.c act-ops.c rope-ops.c - flash-attn-ops.c - set-rows-ops.c - get-rows-ops.c - cpy-ops.c ) target_compile_definitions(${HTP_LIB} PRIVATE $,HTP_DEBUG=1,NDEBUG=1> - $,FARF_HIGH=1,> FP32_QUANTIZE_GROUP_SIZE=${GGML_HEXAGON_FP32_QUANTIZE_GROUP_SIZE}) build_idl(htp_iface.idl ${HTP_LIB}) diff --git a/ggml/src/ggml-hexagon/htp/act-ops.c b/ggml/src/ggml-hexagon/htp/act-ops.c index c3daf5a..7e48845 100644 --- a/ggml/src/ggml-hexagon/htp/act-ops.c +++ b/ggml/src/ggml-hexagon/htp/act-ops.c @@ -2,20 +2,27 @@ #pragma clang diagnostic ignored "-Wunused-function" #pragma clang diagnostic ignored "-Wunused-but-set-variable" +#ifdef HTP_DEBUG +# define FARF_HIGH 1 +#endif #include +#include #include - +#include +#include +#include #include +#include #include -#include "hex-dma.h" -#include "hvx-utils.h" - #define GGML_COMMON_DECL_C #include "ggml-common.h" #include "htp-ctx.h" +#include "htp-dma.h" #include "htp-msg.h" #include "htp-ops.h" +#include "hvx-utils.h" +#include "ops-utils.h" #define htp_act_preamble3 \ const uint32_t ne00 = src0->ne[0]; \ @@ -69,7 +76,7 @@ const uint32_t nb2 = dst->nb[2]; \ const uint32_t nb3 = dst->nb[3]; -static void glu_swiglu_f32_per_thread(const struct htp_tensor * src0, +static void glu_swiglu_fp32_per_thread(const struct htp_tensor * src0, const struct htp_tensor * src1, struct htp_tensor * dst, const int32_t * op_params, @@ -78,16 +85,13 @@ static void glu_swiglu_f32_per_thread(const struct htp_tensor * src0, struct htp_spad * dst_spad, uint32_t nth, uint32_t ith, - uint32_t src0_nrows_per_thread, - dma_queue * dma_queue) { + uint32_t src0_nrows_per_thread) { htp_act_preamble3; size_t src0_row_size = nb01; size_t src1_row_size = nb11; size_t dst_row_size = nb1; - - const uint32_t src0_nrows = ne01 * ne02 * ne03; // src0 rows const uint32_t src0_start_row = src0_nrows_per_thread * ith; @@ -101,6 +105,12 @@ static void glu_swiglu_f32_per_thread(const struct htp_tensor * src0, uint64_t t1, t2; t1 = HAP_perf_get_qtimer_count(); + int is_aligned = 1; + if (!htp_is_aligned((void *) src0->data, VLEN) || !htp_is_aligned((void *) dst->data, VLEN)) { + is_aligned = 0; + FARF(HIGH, "swiglu-f32: unaligned addresses in elementwise op, possibly slower execution\n"); + } + const uint8_t * restrict data_src0 = (const uint8_t *) src0->data; const uint8_t * restrict data_src1 = (const uint8_t *) src1->data; uint8_t * restrict data_dst = (uint8_t *) dst->data; @@ -117,86 +127,42 @@ static void glu_swiglu_f32_per_thread(const struct htp_tensor * src0, data_src1 += swapped ? 0 : nc_in_bytes; } - const size_t src0_row_size_aligned = hex_round_up(src0_row_size, VLEN); - const size_t src1_row_size_aligned = hex_round_up(src1_row_size, VLEN); - const size_t dst_row_size_aligned = hex_round_up(dst_row_size, VLEN); + uint8_t * restrict src0_spad_data = src0_spad->data + (ith * src0_row_size); + uint8_t * restrict src1_spad_data = src1_spad->data + (ith * src1_row_size); + uint8_t * restrict dst_spad_data = dst_spad->data + (ith * dst_row_size); - uint8_t * restrict src0_spad_data = src0_spad->data + (ith * src0_spad->size_per_thread); - uint8_t * restrict src1_spad_data = src1_spad->data + (ith * src1_spad->size_per_thread); - uint8_t * restrict dst_spad_data = dst_spad->data + (ith * dst_spad->size_per_thread); + const bool opt_path = ((1 == is_aligned) && !(nb01 & (VLEN - 1))); + for (uint32_t ir = src0_start_row; ir < src0_end_row; ir++) { + const float * restrict src0 = (float *) (data_src0 + (ir * src0_row_size)); + const float * restrict src1 = (float *) (data_src1 + (ir * src1_row_size)); + float * restrict dst = (float *) (data_dst + (ir * dst_row_size)); - // While given src0_spad->size_per_thread, divide it to two ping-pong buffer for src0 - size_t src0_spad_half_size = src0_spad->size_per_thread / 2; - size_t src1_spad_half_size = src1_spad->size_per_thread / 2; - size_t dst_spad_half_size = dst_spad->size_per_thread / 2; - - const int BLOCK = src0_spad_half_size / src0_row_size_aligned; // How many rows can we process in one block - if (BLOCK == 0) { - FARF(ERROR, - "swiglu-f32 : current VTCM reservation %zu is too small for even 1 row per thread, needed at least %zu\n", - src0_spad->size_per_thread, src0_row_size_aligned); - return; - } - - // See discussion: https://github.com/ggml-org/llama.cpp/pull/18151#issuecomment-3678235379 - for (uint32_t ir = src0_start_row, spad_idx = 0; ir < src0_end_row && spad_idx < 2; ir += BLOCK, spad_idx++) { - const uint32_t block_size = MIN(BLOCK, src0_end_row - ir); - - // Dummy DMA transation for sequencing (interleaving dst,src,dst,...) - dma_queue_push_vtcm_to_ddr(dma_queue, - dma_make_ptr(data_dst, dst_spad_data + (spad_idx * dst_spad_half_size)), - dst_row_size, dst_row_size_aligned, 0); - - dma_queue_push_ddr_to_vtcm(dma_queue, - dma_make_ptr(src0_spad_data + (spad_idx * src0_spad_half_size), data_src0 + (ir * src0_row_size)), - src0_row_size_aligned, src0_row_size, block_size); - dma_queue_push_ddr_to_vtcm(dma_queue, - dma_make_ptr(src1_spad_data + (spad_idx * src1_spad_half_size), data_src1 + (ir * src1_row_size)), - src1_row_size_aligned, src1_row_size, block_size); - } - - for (uint32_t ir = src0_start_row; ir < src0_end_row; ir += BLOCK) { - const uint32_t block_size = MIN(BLOCK, src0_end_row - ir); - - float * dst_spad = (float *) dma_queue_pop(dma_queue).src; - float * src0_spad = (float *) dma_queue_pop(dma_queue).dst; - float * src1_spad = (float *) dma_queue_pop(dma_queue).dst; - - for (uint32_t ib = 0; ib < block_size; ib++) { - const float * src0_spad_ptr = src0_spad + ib * (src0_row_size_aligned / sizeof(float)); - const float * src1_spad_ptr = src1_spad + ib * (src1_row_size_aligned / sizeof(float)); - float * dst_spad_ptr = dst_spad + ib * (dst_row_size_aligned / sizeof(float)); - - //swiglu(x) = x1 * sigmoid(x0) - hvx_sigmoid_f32_aa((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, nc); - hvx_mul_mul_f32_aa((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, (const uint8_t *) dst_spad_ptr, - (const uint8_t *) src1_spad_ptr, nc); + if (ir + 1 < src0_end_row) { + htp_l2fetch(src0 + src0_row_size, 1, src0_row_size, src0_row_size); } - dma_queue_push_vtcm_to_ddr(dma_queue, dma_make_ptr(data_dst + (ir * dst_row_size), dst_spad), dst_row_size, - dst_row_size_aligned, block_size); + if (opt_path) { + hvx_fast_sigmoid_f32((const uint8_t *) src0, (uint8_t *) src0_spad_data, nc); + hvx_mul_mul_f32_opt((const uint8_t *) src0, (const uint8_t *) src0_spad_data, (const uint8_t *) src1, + (uint8_t *) dst, nc); + } else { + hvx_exp_f32((const uint8_t *) src0, src0_spad_data, nc, true); + hvx_add_scalar_f32(src0_spad_data, 1.0, src1_spad_data, nc); + hvx_inverse_f32(src1_spad_data, src0_spad_data, nc); - // prefetch N+2 loop iteration if any - const uint32_t pref_block = (ir + BLOCK * 2); - if (pref_block < src0_end_row) { - const uint32_t pref_block_size = MIN(BLOCK, src0_end_row - pref_block); - dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(src0_spad, data_src0 + (pref_block * src0_row_size)), - src0_row_size_aligned, src0_row_size, pref_block_size); - dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(src1_spad, data_src1 + (pref_block * src1_row_size)), - src1_row_size_aligned, src1_row_size, pref_block_size); + hvx_mul_f32((const uint8_t *) src0, src0_spad_data, dst_spad_data, nc); + hvx_mul_f32(dst_spad_data, (const uint8_t *) src1, (uint8_t *) dst, nc); } } - dma_queue_flush(dma_queue); - t2 = HAP_perf_get_qtimer_count(); - FARF(HIGH, "swiglu-f32 %d/%d: %ux%ux%ux%u (%u:%u) x %ux%ux%ux%u -> %ux%ux%ux%u usec %u\n", ith, nth, + FARF(HIGH, "swiglu-f32 %d/%d/%d: %ux%ux%ux%u (%u:%u) x %ux%ux%ux%u -> %ux%ux%ux%u usec %u\n", ith, nth, opt_path, ne00, ne01, ne02, ne03, src0_start_row, src0_end_row, ne10, ne11, ne12, ne13, ne0, ne1, ne2, ne3, (unsigned) HAP_perf_qtimer_count_to_us(t2 - t1)); } -static void glu_swiglu_oai_f32_per_thread(const struct htp_tensor * src0, +static void glu_swiglu_oai_fp32_per_thread(const struct htp_tensor * src0, const struct htp_tensor * src1, struct htp_tensor * dst, const int32_t * op_params, @@ -205,16 +171,15 @@ static void glu_swiglu_oai_f32_per_thread(const struct htp_tensor * src0, struct htp_spad * dst_spad, uint32_t nth, uint32_t ith, - uint32_t src0_nrows_per_thread, - dma_queue * dma_queue) { + uint32_t src0_nrows_per_thread) { htp_act_preamble3; uint64_t t1, t2; t1 = HAP_perf_get_qtimer_count(); - size_t src0_row_size = nb01; - size_t src1_row_size = nb11; - size_t dst_row_size = nb1; + const size_t src0_row_size = nb01; + const size_t src1_row_size = nb11; + const size_t dst_row_size = nb1; const uint32_t src0_nrows = ne01 * ne02 * ne03; // src0 rows @@ -226,116 +191,72 @@ static void glu_swiglu_oai_f32_per_thread(const struct htp_tensor * src0, return; } + if (!htp_is_aligned((void *) src0->data, VLEN) || !htp_is_aligned((void *) dst->data, VLEN)) { + FARF(HIGH, "act-f32: unaligned addresses in activations op, possibly slower execution\n"); + } + const uint8_t * restrict data_src0 = (const uint8_t *) src0->data; const uint8_t * restrict data_src1 = (const uint8_t *) src1->data; uint8_t * restrict data_dst = (uint8_t *) dst->data; - const bool src1_valid = src1->ne[0]; - const int nc = (src1_valid) ? ne00 : ne00 / 2; + bool src1_valid = src1->ne[0]; if (!src1_valid) { - const int32_t swapped = op_params[1]; - data_src1 = data_src0; - src1_row_size = src0_row_size; - - const size_t nc_in_bytes = nc * SIZEOF_FP32; - data_src0 += swapped ? nc_in_bytes : 0; - data_src1 += swapped ? 0 : nc_in_bytes; + data_src1 = data_src0; } - const size_t src0_row_size_aligned = hex_round_up(src0_row_size, VLEN); - const size_t src1_row_size_aligned = hex_round_up(src1_row_size, VLEN); - const size_t dst_row_size_aligned = hex_round_up(dst_row_size, VLEN); + uint8_t * restrict src0_spad_data = src0_spad->data + (ith * src0_row_size); + uint8_t * restrict src1_spad_data = src1_spad->data + (ith * src1_row_size); + uint8_t * restrict dst_spad_data = dst_spad->data + (ith * dst_row_size); - uint8_t * restrict src0_spad_data = src0_spad->data + (ith * src0_spad->size_per_thread); - uint8_t * restrict src1_spad_data = src1_spad->data + (ith * src1_spad->size_per_thread); - uint8_t * restrict dst_spad_data = dst_spad->data + (ith * dst_spad->size_per_thread); + const int32_t swapped = op_params[1]; + const float alpha = ((const float *) (op_params))[2]; + const float limit = ((const float *) (op_params))[3]; - // While given src0_spad->size_per_thread, divide it to two ping-pong buffer for src0 - size_t src0_spad_half_size = src0_spad->size_per_thread / 2; - size_t src1_spad_half_size = src1_spad->size_per_thread / 2; - size_t dst_spad_half_size = dst_spad->size_per_thread / 2; + const int nc = (src1_valid) ? ne00 : ne00 / 2; - const int BLOCK = src0_spad_half_size / src0_row_size_aligned; // How many rows can we process in one block - if (BLOCK == 0) { - FARF(ERROR, - "swiglu-oai-f32 : current VTCM reservation %zu is too small for even 1 row per thread, needed at least " - "%zu\n", - src0_spad->size_per_thread, src0_row_size_aligned); - return; - } - const float alpha = ((const float *) (op_params))[2]; - const float limit = ((const float *) (op_params))[3]; + for (uint32_t ir = src0_start_row; ir < src0_end_row; ir++) { + const float * restrict src0 = (float *) (data_src0 + (ir * src0_row_size)); + const float * restrict src1 = (float *) (data_src1 + (ir * src1_row_size)); + float * restrict dst = (float *) (data_dst + (ir * dst_row_size)); - // See discussion: https://github.com/ggml-org/llama.cpp/pull/18151#issuecomment-3678235379 - for (uint32_t ir = src0_start_row, spad_idx = 0; ir < src0_end_row && spad_idx < 2; ir += BLOCK, spad_idx++) { - const uint32_t block_size = MIN(BLOCK, src0_end_row - ir); - - // Dummy DMA transation for sequencing (interleaving dst,src,dst,...) - dma_queue_push_vtcm_to_ddr(dma_queue, dma_make_ptr(data_dst, dst_spad_data + (spad_idx * dst_spad_half_size)), - dst_row_size, dst_row_size_aligned, 0); - - dma_queue_push_ddr_to_vtcm( - dma_queue, - dma_make_ptr(src0_spad_data + (spad_idx * src0_spad_half_size), data_src0 + (ir * src0_row_size)), - src0_row_size_aligned, src0_row_size, block_size); - dma_queue_push_ddr_to_vtcm( - dma_queue, - dma_make_ptr(src1_spad_data + (spad_idx * src1_spad_half_size), data_src1 + (ir * src1_row_size)), - src1_row_size_aligned, src1_row_size, block_size); - } - - for (uint32_t ir = src0_start_row; ir < src0_end_row; ir += BLOCK) { - const uint32_t block_size = MIN(BLOCK, src0_end_row - ir); - - float * dst_spad = (float *) dma_queue_pop(dma_queue).src; - float * src0_spad = (float *) dma_queue_pop(dma_queue).dst; - float * src1_spad = (float *) dma_queue_pop(dma_queue).dst; - - for (uint32_t ib = 0; ib < block_size; ib++) { - const float * src0_spad_ptr = src0_spad + ib * (src0_row_size_aligned / sizeof(float)); - const float * src1_spad_ptr = src1_spad + ib * (src1_row_size_aligned / sizeof(float)); - float * dst_spad_ptr = dst_spad + ib * (dst_row_size_aligned / sizeof(float)); - - // x (src0_spad_data) = std::min(src0_p[k], limit); - hvx_min_scalar_f32((uint8_t *) src0_spad_ptr, (const uint8_t *) src0_spad_ptr, limit, nc); - // y1 (src1_spad_data) = std::clamp(src1_p[k], -limit, limit); - hvx_clamp_scalar_f32((uint8_t *) src1_spad_ptr, (const uint8_t *) src1_spad_ptr, -limit, limit, nc); - // y (src1_spad_data) = y1 + 1.f - hvx_add_scalar_f32((uint8_t *) src1_spad_ptr, (const uint8_t *) src1_spad_ptr, 1.0, nc); - // x1 (dst_spad_data) = alpha * (x) - hvx_mul_scalar_f32((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, alpha, nc); - // x2 (dst_spad_data) = sigmoid(x1) = 1/(1+exp(-x1)) - hvx_sigmoid_f32_aa((uint8_t *) dst_spad_ptr, (const uint8_t *) dst_spad_ptr, nc); - // out = x * sigmoid(alpha * x) * (y + 1.f) - hvx_mul_mul_f32_aa((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, (const uint8_t *) dst_spad_ptr, - (const uint8_t *) src1_spad_ptr, nc); + if (ir + 1 < src0_end_row) { + htp_l2fetch(src0 + src0_row_size, 1, src0_row_size, src0_row_size); } - dma_queue_push_vtcm_to_ddr(dma_queue, dma_make_ptr(data_dst + (ir * dst_row_size), dst_spad), dst_row_size, - dst_row_size_aligned, block_size); - - // prefetch N+2 loop iteration if any - const uint32_t pref_block = (ir + BLOCK * 2); - if (pref_block < src0_end_row) { - const uint32_t pref_block_size = MIN(BLOCK, src0_end_row - pref_block); - dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(src0_spad, data_src0 + (pref_block * src0_row_size)), - src0_row_size_aligned, src0_row_size, pref_block_size); - dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(src1_spad, data_src1 + (pref_block * src1_row_size)), - src1_row_size_aligned, src1_row_size, pref_block_size); + if (!src1) { + src0 += swapped ? nc : 0; + src1 += swapped ? 0 : nc; } - } - dma_queue_flush(dma_queue); + // x (src0_spad_data) = std::min(src0_p[k], limit); + hvx_min_scalar_f32((const uint8_t *) src0, limit, src0_spad_data, nc); + // y1 (src1_spad_data) = std::clamp(src1_p[k], -limit, limit); + hvx_clamp_scalar_f32((const uint8_t *) src1, -limit, limit, src1_spad_data, nc); + // y (src1_spad_data) = y1 + 1.f + hvx_add_scalar_f32(src1_spad_data, 1.0, src1_spad_data, nc); + // x1 (dst_spad_data) = alpha * (x) + hvx_mul_scalar_f32(src0_spad_data, alpha, dst_spad_data, nc); + // x2 (dst_spad_data) = expf(-x1) + hvx_exp_f32(dst_spad_data, dst_spad_data, nc, true); + // x3 (dst_spad_data) = x2 + 1.f + hvx_add_scalar_f32(dst_spad_data, 1.0, dst_spad_data, nc); + // x4 (dst_spad_data) = 1 / x3 + hvx_inverse_f32(dst_spad_data, dst_spad_data, nc); + // out_glu(dst_spad_data) = x * x4 + hvx_mul_f32(src0_spad_data, dst_spad_data, dst_spad_data, nc); + // out = out_glu * (y + 1.f); + hvx_mul_f32(dst_spad_data, src1_spad_data, (uint8_t *) dst, nc); + } t2 = HAP_perf_get_qtimer_count(); - FARF(HIGH, "swiglu-oai-f32 %d/%d: %ux%ux%ux%u (%u:%u) x %ux%ux%ux%u -> %ux%ux%ux%u usec %u\n", ith, nth, src0->ne[0], + FARF(HIGH, "swiglu-f32 %d/%d: %ux%ux%ux%u (%u:%u) x %ux%ux%ux%u -> %ux%ux%ux%u usec %u\n", ith, nth, src0->ne[0], src0->ne[1], src0->ne[2], src0->ne[3], src0_start_row, src0_end_row, src1->ne[0], src1->ne[1], src1->ne[2], src1->ne[3], dst->ne[0], dst->ne[1], dst->ne[2], dst->ne[3], (unsigned) HAP_perf_qtimer_count_to_us(t2 - t1)); } -static void unary_gelu_f32_per_thread(const struct htp_tensor * src0, +static void unary_gelu_fp32_per_thread(const struct htp_tensor * src0, struct htp_tensor * dst, const int32_t * op_params, struct htp_spad * src0_spad, @@ -351,8 +272,8 @@ static void unary_gelu_f32_per_thread(const struct htp_tensor * src0, const size_t src0_row_size = nb01; const size_t dst_row_size = nb1; - const size_t src0_row_size_aligned = hex_round_up(src0_row_size, VLEN); - const size_t dst_row_size_aligned = hex_round_up(dst_row_size, VLEN); + const size_t src0_row_size_aligned = htp_round_up(src0_row_size, VLEN); + const size_t dst_row_size_aligned = htp_round_up(dst_row_size, VLEN); const uint32_t src0_nrows = ne01 * ne02 * ne03; @@ -408,9 +329,9 @@ static void unary_gelu_f32_per_thread(const struct htp_tensor * src0, float* dst_spad_ptr = dst_spad + ib * (dst_row_size_aligned / sizeof(float)); // gelu = x * sigmoid(1.702 * x) // current implementation - hvx_mul_scalar_f32((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, (float) 1.702, ne0); - hvx_sigmoid_f32_aa((uint8_t *) dst_spad_ptr, (const uint8_t *) dst_spad_ptr, ne0); - hvx_mul_f32_aa((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, (const uint8_t *) dst_spad_ptr, ne0); + hvx_mul_scalar_f32((const uint8_t *) src0_spad_ptr, (float) 1.702, (uint8_t *) dst_spad_ptr, ne0); + hvx_fast_sigmoid_f32((const uint8_t *) dst_spad_ptr, (uint8_t *) dst_spad_ptr, ne0); + hvx_mul_f32_opt((const uint8_t *) src0_spad_ptr, (uint8_t *) dst_spad_ptr, (uint8_t *) dst_spad_ptr, ne0); } dma_queue_push_vtcm_to_ddr(dma_queue, @@ -435,23 +356,22 @@ static void unary_gelu_f32_per_thread(const struct htp_tensor * src0, ne03, src0_start_row, src0_end_row, ne0, ne1, ne2, ne3, (unsigned) HAP_perf_qtimer_count_to_us(t2 - t1)); } -static void unary_gelu_f32(unsigned int n, unsigned int i, void * data) { +static void unary_gelu_fp32(unsigned int n, unsigned int i, void * data) { struct htp_ops_context * octx = (struct htp_ops_context *) data; - unary_gelu_f32_per_thread(&octx->src0, &octx->dst, octx->op_params, &octx->src0_spad, &octx->dst_spad, n, i, + unary_gelu_fp32_per_thread(&octx->src0, &octx->dst, octx->op_params, &octx->src0_spad, &octx->dst_spad, n, i, octx->src0_nrows_per_thread, octx->ctx->dma[i]); } -static void unary_silu_f32_per_thread(const struct htp_tensor * src0, +static void unary_silu_fp32_per_thread(const struct htp_tensor * src0, struct htp_tensor * dst, const int32_t * op_params, struct htp_spad * src0_spad, struct htp_spad * dst_spad, uint32_t nth, uint32_t ith, - uint32_t src0_nrows_per_thread, - dma_queue * dma_queue) { + uint32_t src0_nrows_per_thread) { htp_act_preamble2; uint64_t t1, t2; @@ -459,8 +379,6 @@ static void unary_silu_f32_per_thread(const struct htp_tensor * src0, const size_t src0_row_size = nb01; const size_t dst_row_size = nb1; - const size_t src0_row_size_aligned = hex_round_up(src0_row_size, VLEN); - const size_t dst_row_size_aligned = hex_round_up(dst_row_size, VLEN); const uint32_t src0_nrows = ne01 * ne02 * ne03; @@ -472,94 +390,67 @@ static void unary_silu_f32_per_thread(const struct htp_tensor * src0, return; } - const uint8_t * data_src0 = (const uint8_t *) src0->data; - uint8_t * data_dst = (uint8_t *) dst->data; - - uint8_t * src0_spad_data = src0_spad->data + (ith * src0_spad->size_per_thread); - uint8_t * dst_spad_data = dst_spad->data + (ith * dst_spad->size_per_thread); - - // While given src0_spad->size_per_thread, divide it to two ping-pong buffer for src0 - size_t src0_spad_half_size = src0_spad->size_per_thread / 2; - size_t dst_spad_half_size = dst_spad->size_per_thread / 2; - - const int BLOCK = src0_spad_half_size / src0_row_size_aligned; // How many rows can we process in one block - - if (BLOCK == 0) { - FARF(ERROR, "silu-f32 : current VTCM reservation %zu is too small for even 1 row per thread, needed at least %zu\n", - src0_spad->size_per_thread, src0_row_size_aligned); - return; + int is_aligned = 1; + int opt_path = 0; + if (!htp_is_aligned((void *) src0->data, VLEN) || !htp_is_aligned((void *) dst->data, VLEN)) { + is_aligned = 0; + FARF(HIGH, "silu-f32: unaligned addresses in elementwise op, possibly slower execution\n"); + } + if ((1 == is_aligned) && !(nb01 & (VLEN - 1))) { + opt_path = 1; } - // See discussion: https://github.com/ggml-org/llama.cpp/pull/18151#issuecomment-3678235379 - for (uint32_t ir = src0_start_row, spad_idx = 0; ir < src0_end_row && spad_idx < 2; ir += BLOCK, spad_idx++) { - const uint32_t block_size = MIN(BLOCK, src0_end_row - ir); + const uint8_t * restrict data_src0 = (const uint8_t *) src0->data; + uint8_t * restrict data_dst = (uint8_t *) dst->data; - // Dummy DMA transation for sequencing (interleaving dst,src,dst,...) - dma_queue_push_vtcm_to_ddr(dma_queue, - dma_make_ptr(data_dst, dst_spad_data + (spad_idx * dst_spad_half_size)), - dst_row_size, dst_row_size_aligned, 0); + uint8_t * restrict src0_spad_data = src0_spad->data + (ith * src0_row_size); + uint8_t * restrict dst_spad_data = dst_spad->data + (ith * dst_row_size); - dma_queue_push_ddr_to_vtcm(dma_queue, - dma_make_ptr(src0_spad_data + (spad_idx * src0_spad_half_size), data_src0 + (ir * src0_row_size)), - src0_row_size_aligned, src0_row_size, block_size); - } + for (uint32_t ir = src0_start_row; ir < src0_end_row; ir++) { + const float * restrict src0 = (float *) (data_src0 + (ir * src0_row_size)); + float * restrict dst = (float *) (data_dst + (ir * dst_row_size)); - for (uint32_t ir = src0_start_row; ir < src0_end_row; ir += BLOCK) { - const uint32_t block_size = MIN(BLOCK, src0_end_row - ir); - - float* dst_spad = (float *) dma_queue_pop(dma_queue).src; - float* src0_spad = (float *) dma_queue_pop(dma_queue).dst; - - for (uint32_t ib = 0; ib < block_size; ib++) { - const float* src0_spad_ptr = src0_spad + ib * (src0_row_size_aligned / sizeof(float)); - float* dst_spad_ptr = dst_spad + ib * (dst_row_size_aligned / sizeof(float)); - - // silu = x * sigmoid(x) - hvx_sigmoid_f32_aa((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, ne0); - hvx_mul_f32_aa((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, (const uint8_t *) dst_spad_ptr, ne0); + if (ir + 1 < src0_end_row) { + htp_l2fetch(src0 + src0_row_size, 1, src0_row_size, src0_row_size); } - dma_queue_push_vtcm_to_ddr(dma_queue, - dma_make_ptr(data_dst + (ir * dst_row_size), dst_spad), - dst_row_size, dst_row_size_aligned, block_size); + if (1 == opt_path) { + hvx_fast_sigmoid_f32((const uint8_t *) src0, (uint8_t *) src0_spad_data, ne0); + hvx_mul_f32_opt((const uint8_t *) src0, src0_spad_data, (uint8_t *) dst, ne0); + } else { + hvx_exp_f32((const uint8_t *) src0, src0_spad_data, ne0, true); + hvx_add_scalar_f32(src0_spad_data, 1.0, dst_spad_data, ne0); + hvx_inverse_f32(dst_spad_data, src0_spad_data, ne0); - // prefetch N+2 loop iteration if any - const uint32_t pref_block = (ir + BLOCK * 2); - if (pref_block < src0_end_row) { - const uint32_t pref_block_size = MIN(BLOCK, src0_end_row - pref_block); - dma_queue_push_ddr_to_vtcm(dma_queue, - dma_make_ptr(src0_spad, data_src0 + (pref_block * src0_row_size)), - src0_row_size_aligned, src0_row_size, pref_block_size); + hvx_mul_f32((const uint8_t *) src0, src0_spad_data, (uint8_t *) dst, ne0); } } - dma_queue_flush(dma_queue); - t2 = HAP_perf_get_qtimer_count(); - FARF(HIGH, "silu-f32 %d/%d: %ux%ux%ux%u (%u:%u) -> %ux%ux%ux%u usec %u\n", ith, nth, ne00, ne01, ne02, + FARF(HIGH, "silu-f32 %d/%d/%d: %ux%ux%ux%u (%u:%u) -> %ux%ux%ux%u usec %u\n", ith, nth, opt_path, ne00, ne01, ne02, ne03, src0_start_row, src0_end_row, ne0, ne1, ne2, ne3, (unsigned) HAP_perf_qtimer_count_to_us(t2 - t1)); } -static void unary_silu_f32(unsigned int n, unsigned int i, void * data) { +static void unary_silu_fp32(unsigned int n, unsigned int i, void * data) { struct htp_ops_context * octx = (struct htp_ops_context *) data; - unary_silu_f32_per_thread(&octx->src0, &octx->dst, octx->op_params, &octx->src0_spad, &octx->dst_spad, n, i, - octx->src0_nrows_per_thread, octx->ctx->dma[i]); + unary_silu_fp32_per_thread(&octx->src0, &octx->dst, octx->op_params, &octx->src0_spad, &octx->dst_spad, n, i, + octx->src0_nrows_per_thread); } -static void glu_swiglu_f32(unsigned int n, unsigned int i, void * data) { +static void glu_swiglu_fp32(unsigned int n, unsigned int i, void * data) { struct htp_ops_context * octx = (struct htp_ops_context *) data; - glu_swiglu_f32_per_thread(&octx->src0, &octx->src1, &octx->dst, octx->op_params, &octx->src0_spad, - &octx->src1_spad, &octx->dst_spad, n, i, octx->src0_nrows_per_thread, octx->ctx->dma[i]); + glu_swiglu_fp32_per_thread(&octx->src0, &octx->src1, &octx->dst, octx->op_params, &octx->src0_spad, + &octx->src1_spad, &octx->dst_spad, n, i, octx->src0_nrows_per_thread); } -static void glu_swiglu_oai_f32(unsigned int n, unsigned int i, void * data) { +static void glu_swiglu_oai_fp32(unsigned int n, unsigned int i, void * data) { struct htp_ops_context * octx = (struct htp_ops_context *) data; - glu_swiglu_oai_f32_per_thread(&octx->src0, &octx->src1, &octx->dst, octx->op_params, &octx->src0_spad, - &octx->src1_spad, &octx->dst_spad, n, i, octx->src0_nrows_per_thread, octx->ctx->dma[i]); + glu_swiglu_oai_fp32_per_thread(&octx->src0, &octx->src1, &octx->dst, octx->op_params, &octx->src0_spad, + &octx->src1_spad, &octx->dst_spad, n, i, octx->src0_nrows_per_thread); } -static int execute_op_activations_f32(struct htp_ops_context * octx) { +static int execute_op_activations_fp32(struct htp_ops_context * octx) { int err = HTP_STATUS_OK; const struct htp_tensor * src0 = &octx->src0; @@ -576,21 +467,21 @@ static int execute_op_activations_f32(struct htp_ops_context * octx) { switch (octx->op) { case HTP_OP_UNARY_SILU: - act_op_func = unary_silu_f32; + act_op_func = unary_silu_fp32; op_type = "silu-f32"; break; case HTP_OP_GLU_SWIGLU: - act_op_func = glu_swiglu_f32; + act_op_func = glu_swiglu_fp32; op_type = "swiglu-f32"; break; case HTP_OP_GLU_SWIGLU_OAI: - act_op_func = glu_swiglu_oai_f32; + act_op_func = glu_swiglu_oai_fp32; op_type = "swiglu-oai-f32"; break; case HTP_OP_UNARY_GELU: - act_op_func = unary_gelu_f32; + act_op_func = unary_gelu_fp32; op_type = "gelu-f32"; break; default: @@ -610,9 +501,9 @@ static int execute_op_activations_f32(struct htp_ops_context * octx) { src1_row_size = src0_row_size; } - const size_t src0_row_size_aligned = hex_round_up(src0_row_size, VLEN); - const size_t src1_row_size_aligned = hex_round_up(src1_row_size, VLEN); - const size_t dst_row_size_aligned = hex_round_up(dst_row_size, VLEN); + const size_t src0_row_size_aligned = htp_round_up(src0_row_size, VLEN); + const size_t src1_row_size_aligned = htp_round_up(src1_row_size, VLEN); + const size_t dst_row_size_aligned = htp_round_up(dst_row_size, VLEN); // VTCM scratchpads for all tensors // N rows per thread, padded to HVX vector size @@ -663,7 +554,7 @@ int op_activations(struct htp_ops_context * octx) { switch (octx->src0.type) { case HTP_TYPE_F32: - err = execute_op_activations_f32(octx); + err = execute_op_activations_fp32(octx); break; default: diff --git a/ggml/src/ggml-hexagon/htp/binary-ops.c b/ggml/src/ggml-hexagon/htp/binary-ops.c index de22afe..8ed7f67 100644 --- a/ggml/src/ggml-hexagon/htp/binary-ops.c +++ b/ggml/src/ggml-hexagon/htp/binary-ops.c @@ -2,25 +2,36 @@ #pragma clang diagnostic ignored "-Wunused-function" #pragma clang diagnostic ignored "-Wunused-but-set-variable" +#ifdef HTP_DEBUG +# define FARF_HIGH 1 +#endif + #include +#include #include - +#include +#include +#include #include +#include #include -#include "hex-dma.h" -#include "hvx-utils.h" - #define GGML_COMMON_DECL_C #include "ggml-common.h" #include "htp-ctx.h" +#include "htp-dma.h" #include "htp-msg.h" #include "htp-ops.h" +#include "hvx-utils.h" +#include "ops-utils.h" -typedef void (*hvx_elemwise_f32_func)(uint8_t * data_dst, const uint8_t * src0, const uint8_t * src1, const uint32_t num_elems); +typedef void (*hvx_elemwise_f32_func)(const uint8_t * src0, + const uint8_t * src1, + uint8_t * data_dst, + const int num_elems); static hvx_elemwise_f32_func func_table_HVX[] = { hvx_mul_f32, hvx_add_f32, hvx_sub_f32 }; -static hvx_elemwise_f32_func func_table_HVX_opt[] = { hvx_mul_f32_aa, hvx_add_f32_aa, hvx_sub_f32_aa }; +static hvx_elemwise_f32_func func_table_HVX_opt[] = { hvx_mul_f32_opt, hvx_add_f32_opt, hvx_sub_f32_opt }; #define htp_binary_preamble \ const struct htp_tensor * src0 = &octx->src0; \ @@ -87,8 +98,9 @@ static void binary_job_f32_per_thread(struct htp_ops_context * octx, int is_aligned = 1; int opt_path = 0; - if ((0 == hex_is_aligned((void *) src0->data, VLEN)) || (0 == hex_is_aligned((void *) src1->data, VLEN)) || - (0 == hex_is_aligned((void *) dst->data, VLEN))) { + if ((0 == htp_is_aligned((void *) src0->data, VLEN)) || (0 == htp_is_aligned((void *) src1->data, VLEN)) || + (0 == htp_is_aligned((void *) dst->data, VLEN))) { + FARF(HIGH, "binary-f32: unaligned addresses in elementwise op, possibly slower execution\n"); is_aligned = 0; } if ((1 == is_aligned) && !(nb01 & (VLEN - 1))) { @@ -118,24 +130,24 @@ static void binary_job_f32_per_thread(struct htp_ops_context * octx, const uint8_t * restrict src1_ptr = data_src1 + i13 * nb13 + i12 * nb12 + i11 * src1_row_size; if (ir + 1 < src0_end_row) { - hex_l2fetch(src0_ptr + ne00, src0_row_size, src0_row_size, 1); + htp_l2fetch(src0_ptr + ne00, 1, src0_row_size, src0_row_size); if (src1_row_size == src0_row_size) { - hex_l2fetch(src1_ptr, src1_row_size, src1_row_size, 1); + htp_l2fetch(src1_ptr, 1, src1_row_size, src1_row_size); } } const uint32_t nr0 = ne00 / ne10; if (nr0 > 1) { if ((1 == is_aligned) && (nr0 == ne00)) { - hvx_splat_f32_a(spad_data_th, *(float *) src1_ptr, nr0); + hvx_bcast_fp32_a(spad_data_th, *(float *) src1_ptr, nr0); } else { for (uint32_t r = 0; r < nr0; r++) { memcpy(spad_data_th + r * nb11, (const uint8_t *) src1_ptr, nb11); } } - func_HVX((uint8_t *) dst_ptr, (const uint8_t *) src0_ptr, (const uint8_t *) spad_data_th, ne00); + func_HVX((const uint8_t *) src0_ptr, (const uint8_t *) spad_data_th, (uint8_t *) dst_ptr, ne00); } else { - func_HVX((uint8_t *) dst_ptr, (const uint8_t *) src0_ptr, (const uint8_t *) src1_ptr, ne00); + func_HVX((const uint8_t *) src0_ptr, (const uint8_t *) src1_ptr, (uint8_t *) dst_ptr, ne00); } src0_ptr += src0_row_size; @@ -173,6 +185,11 @@ static void binary_add_id_job_f32_per_thread(struct htp_ops_context * octx, uint64_t t1, t2; t1 = HAP_perf_get_qtimer_count(); + if ((0 == htp_is_aligned((void *) src0->data, VLEN)) || (0 == htp_is_aligned((void *) src1->data, VLEN)) || + (0 == htp_is_aligned((void *) dst->data, VLEN))) { + FARF(HIGH, "add-id-f32: unaligned addresses, possibly slower execution\n"); + } + const uint8_t * restrict data_src0 = (const uint8_t *) src0->data; const uint8_t * restrict data_src1 = (const uint8_t *) src1->data; uint8_t * restrict data_dst = (uint8_t *) dst->data; @@ -193,9 +210,9 @@ static void binary_add_id_job_f32_per_thread(struct htp_ops_context * octx, const float * restrict src1_ptr = (const float *) (data_src1 + 0 + 0 + i11 * nb11); if (ir + 1 < src0_end_row) { - hex_l2fetch(src0_ptr + ne00, src0_row_size, src0_row_size, 1); + htp_l2fetch(src0_ptr + ne00, 1, src0_row_size, src0_row_size); if (src1_row_size == src0_row_size) { - hex_l2fetch(src1_ptr + ne10, src1_row_size, src1_row_size, 1); + htp_l2fetch(src1_ptr + ne10, 1, src1_row_size, src1_row_size); } } @@ -204,9 +221,9 @@ static void binary_add_id_job_f32_per_thread(struct htp_ops_context * octx, for (uint32_t r = 0; r < nr0; r++) { memcpy(spad_data + r * nb10, (const uint8_t *) src1_ptr, nb10); } - func_HVX((uint8_t *) dst_ptr, (const uint8_t *) src0_ptr, (const uint8_t *) spad_data, ne00); + func_HVX((const uint8_t *) src0_ptr, (const uint8_t *) spad_data, (uint8_t *) dst_ptr, ne00); } else { - func_HVX((uint8_t *) dst_ptr, (const uint8_t *) src0_ptr, (const uint8_t *) src1_ptr, ne00); + func_HVX((const uint8_t *) src0_ptr, (const uint8_t *) src1_ptr, (uint8_t *) dst_ptr, ne00); } } @@ -282,9 +299,9 @@ static int execute_op_binary_f32(struct htp_ops_context * octx) { const size_t dst_row_size = dst->nb[1]; // VTCM scratchpads for all tensors - octx->dst_spad.size = hex_round_up(dst_row_size, 128) * n_threads; - octx->src0_spad.size = hex_round_up(src0_row_size, 128) * n_threads; - octx->src1_spad.size = hex_round_up(src1_row_size, 128) * n_threads; + octx->dst_spad.size = htp_round_up(dst_row_size, 128) * n_threads; + octx->src0_spad.size = htp_round_up(src0_row_size, 128) * n_threads; + octx->src1_spad.size = htp_round_up(src1_row_size, 128) * n_threads; size_t spad_size = octx->src0_spad.size + octx->src1_spad.size + octx->dst_spad.size; diff --git a/ggml/src/ggml-hexagon/htp/cpy-ops.c b/ggml/src/ggml-hexagon/htp/cpy-ops.c deleted file mode 100644 index 559ca18..0000000 --- a/ggml/src/ggml-hexagon/htp/cpy-ops.c +++ /dev/null @@ -1,251 +0,0 @@ -#pragma clang diagnostic ignored "-Wunused-variable" -#pragma clang diagnostic ignored "-Wunused-function" -#pragma clang diagnostic ignored "-Wunused-but-set-variable" - -#include -#include - -#include -#include - -#define GGML_COMMON_DECL_C -#include "ggml-common.h" -#include "htp-ctx.h" -#include "htp-msg.h" -#include "htp-ops.h" -#include "hvx-utils.h" - -struct htp_copy_context { - struct htp_ops_context * octx; - - uint32_t src0_type_size; - uint32_t src0_block_size; - - uint32_t dst_type_size; - uint32_t dst_block_size; - - uint32_t src0_blocks_per_row; - uint32_t dst_blocks_per_row; - - uint32_t src0_nrows_per_thread; - - void (*copy)(struct htp_copy_context * ct, struct htp_ops_context * octx, int nth, int ith); -}; - -#define cpy_preamble \ - struct htp_tensor *src0 = &octx->src0; \ - struct htp_tensor *dst = &octx->dst; \ - \ - const uint32_t ne00 = src0->ne[0]; \ - const uint32_t ne01 = src0->ne[1]; \ - const uint32_t ne02 = src0->ne[2]; \ - const uint32_t ne03 = src0->ne[3]; \ - \ - const uint32_t nb00 = src0->nb[0]; \ - const uint32_t nb01 = src0->nb[1]; \ - const uint32_t nb02 = src0->nb[2]; \ - const uint32_t nb03 = src0->nb[3]; \ - \ - const uint32_t ne0 = dst->ne[0]; \ - const uint32_t ne1 = dst->ne[1]; \ - const uint32_t ne2 = dst->ne[2]; \ - const uint32_t ne3 = dst->ne[3]; \ - \ - const uint32_t nb0 = dst->nb[0]; \ - const uint32_t nb1 = dst->nb[1]; \ - const uint32_t nb2 = dst->nb[2]; \ - const uint32_t nb3 = dst->nb[3]; \ - \ - const uint32_t nr = ne01; - -static void cpy_thread_sametype_sameshape(struct htp_copy_context * ct, struct htp_ops_context * octx, const int nth, const int ith) { - cpy_preamble; - - // parallelize by src0 rows - const uint32_t dr = ct->src0_nrows_per_thread; - const uint32_t ir0 = dr * ith; - const uint32_t ir1 = (ir0 + dr) < nr ? (ir0 + dr) : nr; - - // copy by rows - for (uint32_t i03 = 0; i03 < ne03; i03++) { - for (uint32_t i02 = 0; i02 < ne02; i02++) { - #pragma unroll(2) - for (uint32_t i01 = ir0; i01 < ir1; i01++) { - uint8_t* dst_ptr = (uint8_t*) dst->data + i01*nb1 + i02*nb2 + i03*nb3; - uint8_t* src0_ptr = (uint8_t*) src0->data + i01*nb01 + i02*nb02 + i03*nb03; - hex_l2fetch(src0_ptr, ne00 * ct->src0_type_size, nb01, 2); - hvx_copy_uu(dst_ptr, src0_ptr, ne00, ct->src0_type_size); - } - } - } -} - -static void cpy_thread_sametype_reshape(struct htp_copy_context * ct, struct htp_ops_context * octx, int nth, int ith) { - cpy_preamble; - - // parallelize by src0 rows - const uint32_t dr = ct->src0_nrows_per_thread; - const uint32_t ir0 = dr * ith; - const uint32_t ir1 = (ir0 + dr) < nr ? (ir0 + dr) : nr; - - // dst counters - int64_t k10 = 0; - int64_t i11 = 0; - int64_t i12 = 0; - int64_t i13 = 0; - - // number of blocks in a row - const int64_t nk00 = ct->src0_blocks_per_row; - const int64_t nk0 = ct->dst_blocks_per_row; - - for (int64_t i03 = 0; i03 < ne03; i03++) { - for (int64_t i02 = 0; i02 < ne02; i02++) { - k10 += nk00 * ir0; - while (k10 >= nk0) { - k10 -= nk0; - if (++i11 == ne1) { - i11 = 0; - if (++i12 == ne2) { - i12 = 0; - if (++i13 == ne3) { - i13 = 0; - } - } - } - } - for (int64_t i01 = ir0; i01 < ir1; i01++) { - for (int64_t k00 = 0; k00 < nk00; k00++) { - const char * src0_ptr = ((char *) src0->data + k00*nb00 + i01*nb01 + i02*nb02 + i03*nb03); - char * dst_ptr = ((char *) dst->data + k10*nb0 + i11*nb1 + i12*nb2 + i13*nb3); - memcpy(dst_ptr, src0_ptr, ct->dst_type_size); - - if (++k10 == nk0) { - k10 = 0; - if (++i11 == ne1) { - i11 = 0; - if (++i12 == ne2) { - i12 = 0; - if (++i13 == ne3) { - i13 = 0; - } - } - } - } - } - } - k10 += nk00 * (ne01 - ir1); - while (k10 >= nk0) { - k10 -= nk0; - if (++i11 == ne1) { - i11 = 0; - if (++i12 == ne2) { - i12 = 0; - if (++i13 == ne3) { - i13 = 0; - } - } - } - } - } - } -} - -static void cpy_thread_f16_f32_sameshape(struct htp_copy_context * ct, struct htp_ops_context * octx, const int nth, const int ith) { - cpy_preamble; - - // parallelize by src0 rows - const uint32_t dr = ct->src0_nrows_per_thread; - const uint32_t ir0 = dr * ith; - const uint32_t ir1 = (ir0 + dr) < nr ? (ir0 + dr) : nr; - - // copy by rows - for (uint32_t i03 = 0; i03 < ne03; i03++) { - for (uint32_t i02 = 0; i02 < ne02; i02++) { - #pragma unroll(2) - for (uint32_t i01 = ir0; i01 < ir1; i01++) { - uint8_t* dst_ptr = (uint8_t*) dst->data + i01*nb1 + i02*nb2 + i03*nb3; - uint8_t* src0_ptr = (uint8_t*) src0->data + i01*nb01 + i02*nb02 + i03*nb03; - hex_l2fetch(src0_ptr, ne00 * sizeof(float), nb01, 2); - hvx_copy_f16_f32_uu(dst_ptr, src0_ptr, ne00); - } - } - } -} - -static void cpy_thread_f32_f16_sameshape(struct htp_copy_context * ct, struct htp_ops_context * octx, const int nth, const int ith) { - cpy_preamble; - - // parallelize by src0 rows - const uint32_t dr = ct->src0_nrows_per_thread; - const uint32_t ir0 = dr * ith; - const uint32_t ir1 = (ir0 + dr) < nr ? (ir0 + dr) : nr; - - // copy by rows - for (uint32_t i03 = 0; i03 < ne03; i03++) { - for (uint32_t i02 = 0; i02 < ne02; i02++) { - #pragma unroll(2) - for (uint32_t i01 = ir0; i01 < ir1; i01++) { - uint8_t* dst_ptr = (uint8_t*) dst->data + i01*nb1 + i02*nb2 + i03*nb3; - uint8_t* src0_ptr = (uint8_t*) src0->data + i01*nb01 + i02*nb02 + i03*nb03; - hex_l2fetch(src0_ptr, ne00 * sizeof(__fp16), nb01, 2); - hvx_copy_f32_f16_uu(dst_ptr, src0_ptr, ne00); - } - } - } -} - -static void cpy_work_func(unsigned int n, unsigned int i, void *data) { - struct htp_copy_context *ct = (struct htp_copy_context *) data; - ct->copy(ct, ct->octx, n, i); -} - -int op_cpy(struct htp_ops_context * octx) { - cpy_preamble; - - struct htp_copy_context ct; - ct.octx = octx; - - switch (src0->type) { - case HTP_TYPE_F32: ct.src0_type_size = 4; ct.src0_block_size = 1; ct.src0_blocks_per_row = ne00 / 1; break; - case HTP_TYPE_F16: ct.src0_type_size = 2; ct.src0_block_size = 1; ct.src0_blocks_per_row = ne00 / 1; break; - default: - return HTP_STATUS_NO_SUPPORT; - } - - switch (dst->type) { - case HTP_TYPE_F32: ct.dst_type_size = 4; ct.dst_block_size = 1; ct.dst_blocks_per_row = ne0 / 1; break; - case HTP_TYPE_F16: ct.dst_type_size = 2; ct.dst_block_size = 1; ct.dst_blocks_per_row = ne0 / 1; break; - default: - return HTP_STATUS_NO_SUPPORT; - } - - if (octx->flags & HTP_OPFLAGS_SKIP_COMPUTE) { - return HTP_STATUS_OK; - } - - const bool sametype = (src0->type == dst->type); - const bool transposed = (nb00 > nb01) || (nb0 > nb1); - const bool sameshape = !transposed && (ne00 == ne0 && ne01 == ne1 && ne02 == ne2 && ne03 == ne3); - - const uint32_t n_jobs = MIN(nr, octx->n_threads); - ct.src0_nrows_per_thread = (nr + n_jobs - 1) / n_jobs; - - if (sametype && sameshape) { - ct.copy = cpy_thread_sametype_sameshape; - } else if (sameshape) { - /**/ if (dst->type == HTP_TYPE_F16 && src0->type == HTP_TYPE_F32) - ct.copy = cpy_thread_f16_f32_sameshape; - else if (dst->type == HTP_TYPE_F32 && src0->type == HTP_TYPE_F16) - ct.copy = cpy_thread_f32_f16_sameshape; - else - return HTP_STATUS_NO_SUPPORT; - } else if (sametype) { - ct.copy = cpy_thread_sametype_reshape; - } else { - return HTP_STATUS_NO_SUPPORT; - } - - worker_pool_run_func(octx->ctx->worker_pool, cpy_work_func, &ct, n_jobs); - - return HTP_STATUS_OK; -} diff --git a/ggml/src/ggml-hexagon/htp/flash-attn-ops.c b/ggml/src/ggml-hexagon/htp/flash-attn-ops.c deleted file mode 100644 index 1de47d0..0000000 --- a/ggml/src/ggml-hexagon/htp/flash-attn-ops.c +++ /dev/null @@ -1,561 +0,0 @@ -#pragma clang diagnostic ignored "-Wunused-variable" -#pragma clang diagnostic ignored "-Wunused-function" -#pragma clang diagnostic ignored "-Wunused-but-set-variable" - -#include -#include - -#include -#include - -#include "hex-dma.h" -#include "hvx-utils.h" - -#define GGML_COMMON_DECL_C -#include "ggml-common.h" -#include "htp-ctx.h" -#include "htp-msg.h" -#include "htp-ops.h" - -// Dot product of FP32 and FP16 vectors, accumulating to float -static inline void hvx_dot_f32_f16_aa(float * restrict r, const void * restrict y, const void * restrict x, unsigned int n, float s) { - const HVX_Vector * restrict vy = (const HVX_Vector * restrict) y; // fp32 - const HVX_Vector * restrict vx = (const HVX_Vector * restrict) x; // fp16 - - uint32_t nvec = n / VLEN_FP16; // num full fp16 hvx vectors - uint32_t nloe = n % VLEN_FP16; // leftover elements - - const HVX_Vector zero = Q6_V_vsplat_R(0); - HVX_Vector rsum = Q6_V_vsplat_R(0); - - uint32_t i = 0; - - #pragma unroll(4) - for (i = 0; i < nvec; i++) { - // Load y (fp32) and convert into fp16 - HVX_Vector y0_qf = Q6_Vqf32_vsub_VsfVsf(vy[i*2+0], zero); // 32 elements - HVX_Vector y1_qf = Q6_Vqf32_vsub_VsfVsf(vy[i*2+1], zero); // 32 elements - HVX_Vector y_hf = Q6_Vh_vdeal_Vh(Q6_Vhf_equals_Wqf32(Q6_W_vcombine_VV(y1_qf, y0_qf))); - - // Load x (fp16) - HVX_Vector x_hf = vx[i]; - - HVX_VectorPair xy_qf = Q6_Wqf32_vmpy_VhfVhf(x_hf, y_hf); - - rsum = Q6_Vqf32_vadd_Vqf32Vqf32(rsum, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(xy_qf), Q6_V_hi_W(xy_qf))); - } - - if (nloe) { - // Load y (fp32) and convert into fp16 - HVX_Vector y0_qf = Q6_Vqf32_vsub_VsfVsf(vy[i*2+0], zero); // 32 elements - HVX_Vector y1_qf = Q6_Vqf32_vsub_VsfVsf(vy[i*2+1], zero); // 32 elements - HVX_Vector y_hf = Q6_Vh_vdeal_Vh(Q6_Vhf_equals_Wqf32(Q6_W_vcombine_VV(y1_qf, y0_qf))); - - // Load x (fp16) - HVX_Vector x_hf = vx[i]; - - // Zero-out unused elements - // Note that we need to clear both x and y because they may contain NANs - HVX_VectorPred bmask = Q6_Q_vsetq_R(nloe * 2); - x_hf = Q6_V_vand_QV(bmask, x_hf); - y_hf = Q6_V_vand_QV(bmask, y_hf); - - HVX_VectorPair xy_qf = Q6_Wqf32_vmpy_VhfVhf(x_hf, y_hf); - - rsum = Q6_Vqf32_vadd_Vqf32Vqf32(rsum, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(xy_qf), Q6_V_hi_W(xy_qf))); - } - - rsum = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(rsum), hvx_vec_splat_f32(s)); - rsum = Q6_Vsf_equals_Vqf32(hvx_vec_reduce_sum_qf32(rsum)); - - hvx_vec_store_u(r, 4, rsum); -} - -// Dot product of two F16 vectors, accumulating to float -static inline void hvx_dot_f16_f16_aa(float * restrict r, const void * restrict x, const void * restrict y, unsigned int n, float s) { - const HVX_Vector * restrict vx = (const HVX_Vector * restrict) x; // fp16 - const HVX_Vector * restrict vy = (const HVX_Vector * restrict) y; // fp16 - - uint32_t nvec = n / VLEN_FP16; // num full fp16 hvx vectors - uint32_t nloe = n % VLEN_FP16; // leftover elements - - const HVX_Vector zero = Q6_V_vsplat_R(0); - HVX_Vector rsum = Q6_V_vsplat_R(0); - - uint32_t i = 0; - - #pragma unroll(4) - for (i = 0; i < nvec; i++) { - HVX_Vector y_hf = vy[i]; - HVX_Vector x_hf = vx[i]; - - HVX_VectorPair xy_qf = Q6_Wqf32_vmpy_VhfVhf(x_hf, y_hf); - - rsum = Q6_Vqf32_vadd_Vqf32Vqf32(rsum, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(xy_qf), Q6_V_hi_W(xy_qf))); - } - - if (nloe) { - HVX_Vector y_hf = vy[i]; - - // Load x (fp16) and zero-out unused elements - HVX_VectorPred bmask = Q6_Q_vsetq_R(nloe * 2); - HVX_Vector x_hf = Q6_V_vand_QV(bmask, vx[i]); - - HVX_VectorPair xy_qf = Q6_Wqf32_vmpy_VhfVhf(x_hf, y_hf); - - rsum = Q6_Vqf32_vadd_Vqf32Vqf32(rsum, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(xy_qf), Q6_V_hi_W(xy_qf))); - } - - rsum = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(rsum), hvx_vec_splat_f32(s)); - rsum = Q6_Vsf_equals_Vqf32(hvx_vec_reduce_sum_qf32(rsum)); - hvx_vec_store_u(r, 4, rsum); -} - -// MAD: y (F32) += x (F16) * v (float) -static inline void hvx_mad_f32_f16_aa(float * restrict y, const void * restrict x, int n, float s) { - const HVX_Vector * restrict ptr_x = (const HVX_Vector *) x; - HVX_Vector * restrict ptr_y = (HVX_Vector *) y; - - uint32_t nvec = n / VLEN_FP16; // num full fp16 hvx vectors - uint32_t nloe = n % VLEN_FP16; // leftover elements - - HVX_Vector S = hvx_vec_splat_f16(s); - - uint32_t i = 0; - #pragma unroll(4) - for (i = 0; i < nvec; ++i) { - // Multiply x * s -> pair of F32 vectors - HVX_VectorPair xs_p = Q6_Wqf32_vmpy_VhfVhf(Q6_Vh_vshuff_Vh(ptr_x[i]), S); - ptr_y[i*2] = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_Vqf32Vsf(Q6_V_lo_W(xs_p), ptr_y[i*2])); - ptr_y[i*2+1] = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_Vqf32Vsf(Q6_V_hi_W(xs_p), ptr_y[i*2+1])); - } - - if (nloe) { - HVX_VectorPair xs_p = Q6_Wqf32_vmpy_VhfVhf(Q6_Vh_vshuff_Vh(ptr_x[i]), S); - - HVX_Vector xs = Q6_V_lo_W(xs_p); - i = 2 * i; // index for ptr_y - - if (nloe >= 32) { - ptr_y[i] = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_Vqf32Vsf(xs, ptr_y[i])); - nloe -= 32; ++i; xs = Q6_V_hi_W(xs_p); - } - - if (nloe) { - HVX_Vector xy = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_Vqf32Vsf(xs, ptr_y[i])); - hvx_vec_store_a(&ptr_y[i], nloe * 4, xy); - } - } -} - -#define FLASH_ATTN_BLOCK_SIZE 128 - -static void flash_attn_ext_f16_thread(struct htp_ops_context * octx, int ith, int nth) { - const struct htp_tensor * q = &octx->src0; - const struct htp_tensor * k = &octx->src1; - const struct htp_tensor * v = &octx->src2; - const struct htp_tensor * mask = (octx->src3.data) ? &octx->src3 : NULL; - const struct htp_tensor * sinks = (octx->src4.data) ? &octx->src4 : NULL; - struct htp_tensor * dst = &octx->dst; - - const uint32_t neq0 = q->ne[0]; - const uint32_t neq1 = q->ne[1]; - const uint32_t neq2 = q->ne[2]; - const uint32_t neq3 = q->ne[3]; - - const uint32_t nek0 = k->ne[0]; - const uint32_t nek1 = k->ne[1]; - const uint32_t nek2 = k->ne[2]; - const uint32_t nek3 = k->ne[3]; - - const uint32_t nev0 = v->ne[0]; - const uint32_t nev1 = v->ne[1]; - const uint32_t nev2 = v->ne[2]; - const uint32_t nev3 = v->ne[3]; - - const uint32_t nbq1 = q->nb[1]; - const uint32_t nbq2 = q->nb[2]; - const uint32_t nbq3 = q->nb[3]; - - const uint32_t nbk1 = k->nb[1]; - const uint32_t nbk2 = k->nb[2]; - const uint32_t nbk3 = k->nb[3]; - - const uint32_t nbv1 = v->nb[1]; - const uint32_t nbv2 = v->nb[2]; - const uint32_t nbv3 = v->nb[3]; - - const uint32_t ne1 = dst->ne[1]; - const uint32_t ne2 = dst->ne[2]; - const uint32_t ne3 = dst->ne[3]; - - const uint32_t nb1 = dst->nb[1]; - const uint32_t nb2 = dst->nb[2]; - const uint32_t nb3 = dst->nb[3]; - - float scale = 1.0f; - float max_bias = 0.0f; - float logit_softcap = 0.0f; - - memcpy(&scale, (float *) octx->op_params + 0, sizeof(float)); - memcpy(&max_bias, (float *) octx->op_params + 1, sizeof(float)); - memcpy(&logit_softcap, (float *) octx->op_params + 2, sizeof(float)); - - if (logit_softcap != 0) { - scale /= logit_softcap; - } - - // total rows in q - const uint32_t nr = neq1*neq2*neq3; - - const uint32_t dr = (nr + nth - 1) / nth; - const uint32_t ir0 = dr * ith; - const uint32_t ir1 = MIN(ir0 + dr, nr); - - if (ir0 >= ir1) return; - - dma_queue * dma = octx->ctx->dma[ith]; - - const uint32_t DK = nek0; - const uint32_t DV = nev0; - - const size_t size_q_row = DK * ((q->type == HTP_TYPE_F32) ? 4 : 2); - const size_t size_q_row_padded = hex_round_up(size_q_row, 128); - - const size_t size_k_row = DK * sizeof(__fp16); - const size_t size_v_row = DV * sizeof(__fp16); - const size_t size_m_row = FLASH_ATTN_BLOCK_SIZE * sizeof(__fp16); // Treat block as one row for mask - - const size_t size_k_row_padded = hex_round_up(size_k_row, 128); - const size_t size_v_row_padded = hex_round_up(size_v_row, 128); - - const size_t size_k_block = size_k_row_padded * FLASH_ATTN_BLOCK_SIZE; - const size_t size_v_block = size_v_row_padded * FLASH_ATTN_BLOCK_SIZE; - const size_t size_m_block = hex_round_up(FLASH_ATTN_BLOCK_SIZE * sizeof(__fp16), 128); - - // Scratchpad buffers for Q, K, V, Mask, and VKQ32 accumulator - uint8_t * spad_q = octx->src0_spad.data + octx->src0_spad.size_per_thread * ith; - uint8_t * spad_k = octx->src1_spad.data + octx->src1_spad.size_per_thread * ith; - uint8_t * spad_v = octx->src2_spad.data + octx->src2_spad.size_per_thread * ith; - uint8_t * spad_m = octx->src3_spad.data + octx->src3_spad.size_per_thread * ith; - uint8_t * spad_a = octx->dst_spad.data + octx->dst_spad.size_per_thread * ith; - - const uint32_t n_head = neq2; - const uint32_t n_head_log2 = 1u << (uint32_t) floor(log2(n_head)); - const float m0 = powf(2.0f, -(max_bias ) / n_head_log2); - const float m1 = powf(2.0f, -(max_bias / 2.0f) / n_head_log2); - - for (uint32_t ir = ir0; ir < ir1; ++ir) { - const uint32_t iq3 = fastdiv(ir, &octx->src0_div21); - const uint32_t iq2 = fastdiv(ir - iq3*neq2*neq1, &octx->src0_div1); - const uint32_t iq1 = (ir - iq3*neq2*neq1 - iq2 * neq1); - - const uint32_t ik3 = fastdiv(iq3, &octx->broadcast_rk3); - const uint32_t ik2 = fastdiv(iq2, &octx->broadcast_rk2); - - const uint32_t iv3 = fastdiv(iq3, &octx->broadcast_rv3); - const uint32_t iv2 = fastdiv(iq2, &octx->broadcast_rv2); - - // Fetch Q row - const uint8_t * q_row_ptr = (const uint8_t *) q->data + (iq1*nbq1 + iq2*nbq2 + iq3*nbq3); - dma_queue_push(dma, dma_make_ptr(spad_q, q_row_ptr), size_q_row_padded, nbq1, size_q_row, 1); - - const uint32_t h = iq2; // head index - const float slope = (max_bias > 0.0f) ? (h < n_head_log2 ? powf(m0, h + 1) : powf(m1, 2*(h - n_head_log2) + 1)) : 1.0f; - - float S = 0.0f; // sum - float M = -INFINITY; // maximum KQ value - - // Clear accumulator - hvx_splat_f32_a(spad_a, 0, DV); - float * VKQ32 = (float *) spad_a; - - const __fp16 * mp_base = NULL; - if (mask) { - const uint32_t im2 = fastmodulo(iq2, mask->ne[2], &octx->src3_div2); - const uint32_t im3 = fastmodulo(iq3, mask->ne[3], &octx->src3_div3); - mp_base = (const __fp16 *) ((const uint8_t *) mask->data + iq1*mask->nb[1] + im2*mask->nb[2] + im3*mask->nb[3]); - } - - const uint32_t n_blocks = (nek1 + FLASH_ATTN_BLOCK_SIZE - 1) / FLASH_ATTN_BLOCK_SIZE; - - // Prefetch first two blocks - for (uint32_t ib = 0; ib < MIN(n_blocks, 2); ++ib) { - const uint32_t ic_start = ib * FLASH_ATTN_BLOCK_SIZE; - const uint32_t current_block_size = MIN(FLASH_ATTN_BLOCK_SIZE, nek1 - ic_start); - - // K - const uint8_t * k_src = (const uint8_t *) k->data + (ic_start*nbk1 + ik2*nbk2 + ik3*nbk3); - uint8_t * k_dst = spad_k + (ib % 2) * size_k_block; - dma_queue_push(dma, dma_make_ptr(k_dst, k_src), size_k_row_padded, nbk1, size_k_row, current_block_size); - - // V - const uint8_t * v_src = (const uint8_t *) v->data + (ic_start*nbv1 + iv2*nbv2 + iv3*nbv3); - uint8_t * v_dst = spad_v + (ib % 2) * size_v_block; - dma_queue_push(dma, dma_make_ptr(v_dst, v_src), size_v_row_padded, nbv1, size_v_row, current_block_size); - - // Mask - if (mask) { - const uint8_t * m_src = (const uint8_t *) (mp_base + ic_start); - uint8_t * m_dst = spad_m + (ib % 2) * size_m_block; - // Mask is 1D contiguous for this row - dma_queue_push(dma, dma_make_ptr(m_dst, m_src), current_block_size * 2, current_block_size * 2, current_block_size * 2, 1); - } - } - - const uint8_t * q_ptr_vtcm = dma_queue_pop(dma).dst; - - for (uint32_t ib = 0; ib < n_blocks; ++ib) { - const uint32_t ic_start = ib * FLASH_ATTN_BLOCK_SIZE; - const uint32_t current_block_size = MIN(FLASH_ATTN_BLOCK_SIZE, nek1 - ic_start); - - // Wait for DMA - uint8_t * k_base = dma_queue_pop(dma).dst; // K - uint8_t * v_base = dma_queue_pop(dma).dst; // V - __fp16 * m_base = mask ? dma_queue_pop(dma).dst : NULL; // M - - // Inner loop processing the block from VTCM - uint32_t ic = 0; - - // Process in blocks of 32 (VLEN_FP32) - for (; ic + VLEN_FP32 <= current_block_size; ic += VLEN_FP32) { - // 1. Compute scores - float __attribute__((aligned(VLEN))) scores_arr[VLEN_FP32]; - for (int j = 0; j < VLEN_FP32; ++j) { - const uint32_t cur_ic = ic + j; - const uint8_t * k_ptr = k_base + cur_ic * size_k_row_padded; - if (q->type == HTP_TYPE_F32) { - hvx_dot_f32_f16_aa(&scores_arr[j], q_ptr_vtcm, k_ptr, DK, scale); - } else { - hvx_dot_f16_f16_aa(&scores_arr[j], q_ptr_vtcm, k_ptr, DK, scale); - } - } - - HVX_Vector scores = *(HVX_Vector *) scores_arr; - - // 2. Softcap - if (logit_softcap != 0.0f) { - scores = hvx_vec_tanh_f32(scores); - scores = Q6_Vqf32_vmpy_VsfVsf(scores, hvx_vec_splat_f32(logit_softcap)); - scores = Q6_Vsf_equals_Vqf32(scores); - } - - // 3. Mask - if (mask) { - const __fp16 * mp = m_base + ic; - HVX_Vector m_vals_f16 = *(const HVX_UVector *) mp; - - HVX_Vector one_f16 = Q6_Vh_vsplat_R(0x3c00); - HVX_VectorPair m_vals_f32_pair = Q6_Wqf32_vmpy_VhfVhf(Q6_Vh_vshuff_Vh(m_vals_f16), one_f16); - - HVX_Vector m_vals_f32 = Q6_Vsf_equals_Vqf32(Q6_V_lo_W(m_vals_f32_pair)); - - HVX_Vector slope_vec = hvx_vec_splat_f32(slope); - HVX_Vector add_val = Q6_Vqf32_vmpy_VsfVsf(m_vals_f32, slope_vec); - scores = Q6_Vqf32_vadd_VsfVsf(scores, Q6_Vsf_equals_Vqf32(add_val)); - scores = Q6_Vsf_equals_Vqf32(scores); - } - - // 4. Online Softmax Update - HVX_Vector v_max = hvx_vec_reduce_max_f32(scores); - float m_block = hvx_vec_get_f32(v_max); - - float M_old = M; - float M_new = (m_block > M) ? m_block : M; - M = M_new; - - float ms = expf(M_old - M_new); - - hvx_scale_f32_aa((uint8_t *) VKQ32, (const uint8_t *) VKQ32, DV, ms); - S = S * ms; - - HVX_Vector M_new_vec = hvx_vec_splat_f32(M_new); - HVX_Vector scores_shifted = Q6_Vqf32_vsub_VsfVsf(scores, M_new_vec); - HVX_Vector P = hvx_vec_exp_f32(Q6_Vsf_equals_Vqf32(scores_shifted)); - - HVX_Vector p_sum_vec = hvx_vec_reduce_sum_f32(P); - float p_sum = hvx_vec_get_f32(p_sum_vec); - S += p_sum; - - // 5. Accumulate V - float __attribute__((aligned(VLEN))) p_arr[VLEN_FP32]; - *(HVX_Vector*)p_arr = P; - - for (int j = 0; j < VLEN_FP32; ++j) { - const uint32_t cur_ic = ic + j; - const uint8_t * v_ptr = v_base + cur_ic * size_v_row_padded; - hvx_mad_f32_f16_aa(VKQ32, v_ptr, DV, p_arr[j]); - } - } - - // Leftover - for (; ic < current_block_size; ++ic) { - float s_val; - const uint8_t * k_ptr = k_base + ic * size_k_row_padded; - - if (q->type == HTP_TYPE_F32) { - hvx_dot_f32_f16_aa(&s_val, q_ptr_vtcm, k_ptr, DK, scale); - } else { - hvx_dot_f16_f16_aa(&s_val, q_ptr_vtcm, k_ptr, DK, scale); - } - - if (logit_softcap != 0.0f) { - s_val = logit_softcap * tanhf(s_val); - } - - if (mask) { - const float m_val = m_base[ic]; - s_val += slope * m_val; - } - - const float Mold = M; - float ms = 1.0f; - float vs = 1.0f; - - if (s_val > M) { - M = s_val; - ms = expf(Mold - M); - hvx_scale_f32_aa((uint8_t *) VKQ32, (const uint8_t *) VKQ32, DV, ms); - } else { - vs = expf(s_val - M); - } - - const uint8_t * v_ptr = v_base + ic * size_v_row_padded; - - hvx_mad_f32_f16_aa(VKQ32, v_ptr, DV, vs); - - S = S * ms + vs; - } - - // Issue DMA for next+1 block (if exists) - if (ib + 2 < n_blocks) { - const uint32_t next_ib = ib + 2; - const uint32_t next_ic_start = next_ib * FLASH_ATTN_BLOCK_SIZE; - const uint32_t next_block_size = MIN(FLASH_ATTN_BLOCK_SIZE, nek1 - next_ic_start); - - // K - const uint8_t * k_src = (const uint8_t *) k->data + (next_ic_start*nbk1 + ik2*nbk2 + ik3*nbk3); - dma_queue_push(dma, dma_make_ptr(k_base, k_src), size_k_row_padded, nbk1, size_k_row, next_block_size); - - // V - const uint8_t * v_src = (const uint8_t *) v->data + (next_ic_start*nbv1 + iv2*nbv2 + iv3*nbv3); - dma_queue_push(dma, dma_make_ptr(v_base, v_src), size_v_row_padded, nbv1, size_v_row, next_block_size); - - // Mask - if (mask) { - const uint8_t * m_src = (const uint8_t *) (mp_base + next_ic_start); - dma_queue_push(dma, dma_make_ptr(m_base, m_src), next_block_size * 2, next_block_size * 2, next_block_size * 2, 1); - } - } - } - - // sinks - if (sinks) { - const float s = ((float *)((char *) sinks->data))[h]; - - float ms = 1.0f; - float vs = 1.0f; - - if (s > M) { - ms = expf(M - s); - hvx_scale_f32_aa((uint8_t *) VKQ32, (const uint8_t *) VKQ32, DV, ms); - } else { - vs = expf(s - M); - } - - S = S * ms + vs; - } - - const float S_inv = S == 0.0f ? 0.0f : 1.0f/S; - hvx_scale_f32_aa((uint8_t *) VKQ32, (const uint8_t *) VKQ32, DV, S_inv); - - // Store result - // dst indices - const int i1 = iq1; - const int i2 = iq2; - const int i3 = iq3; - - // dst is permuted - uint8_t * dst_ptr = (uint8_t *) dst->data + (i3*ne2*ne1 + i2 + i1*ne1) * nb1; - - if (dst->type == HTP_TYPE_F32) { - hvx_copy_f32_ua(dst_ptr, (uint8_t *) VKQ32, DV); - } else if (dst->type == HTP_TYPE_F16) { - hvx_copy_f16_f32_ua(dst_ptr, (uint8_t *) VKQ32, DV); - } - } -} - -static void htp_flash_attn_ext_job(unsigned int n, unsigned int i, void * data) { - struct htp_ops_context * octx = data; - flash_attn_ext_f16_thread(octx, i, n); -} - -int op_flash_attn_ext(struct htp_ops_context * octx) { - const struct htp_tensor * q = &octx->src0; - const struct htp_tensor * k = &octx->src1; - const struct htp_tensor * v = &octx->src2; - const struct htp_tensor * mask = (octx->src3.type != HTP_TYPE_COUNT) ? &octx->src3 : NULL; - struct htp_tensor * dst = &octx->dst; - - // Check support - if ((q->type != HTP_TYPE_F16 && q->type != HTP_TYPE_F32) || - k->type != HTP_TYPE_F16 || - v->type != HTP_TYPE_F16) { - return HTP_STATUS_NO_SUPPORT; - } - - octx->src0_div21 = init_fastdiv_values(q->ne[2] * q->ne[1]); - octx->src0_div1 = init_fastdiv_values(q->ne[1]); - - octx->broadcast_rk2 = init_fastdiv_values(q->ne[2]/k->ne[2]); - octx->broadcast_rk3 = init_fastdiv_values(q->ne[3]/k->ne[3]); - octx->broadcast_rv2 = init_fastdiv_values(q->ne[2]/v->ne[2]); - octx->broadcast_rv3 = init_fastdiv_values(q->ne[3]/v->ne[3]); - - if (mask) { - octx->src3_div2 = init_fastdiv_values(mask->ne[2]); - octx->src3_div3 = init_fastdiv_values(mask->ne[3]); - } - - size_t size_q_row_padded = hex_round_up(q->ne[0] * (q->type == HTP_TYPE_F32 ? 4 : 2), 128); - size_t size_k_row_padded = hex_round_up(k->ne[0] * sizeof(__fp16), 128); - size_t size_v_row_padded = hex_round_up(v->ne[0] * sizeof(__fp16), 128); - - size_t size_q_block = size_q_row_padded * 1; // single row for now - size_t size_k_block = size_k_row_padded * FLASH_ATTN_BLOCK_SIZE; - size_t size_v_block = size_v_row_padded * FLASH_ATTN_BLOCK_SIZE; - size_t size_m_block = hex_round_up(FLASH_ATTN_BLOCK_SIZE * sizeof(__fp16), 128); - - size_t size_vkq_acc = hex_round_up(v->ne[0] * sizeof(float), 128); // VKQ32 - - octx->src0_spad.size_per_thread = size_q_block * 1; - octx->src1_spad.size_per_thread = size_k_block * 2; - octx->src2_spad.size_per_thread = size_v_block * 2; - octx->src3_spad.size_per_thread = mask ? size_m_block * 2 : 0; - octx->dst_spad.size_per_thread = size_vkq_acc; - - octx->src0_spad.size = octx->src0_spad.size_per_thread * octx->n_threads; - octx->src1_spad.size = octx->src1_spad.size_per_thread * octx->n_threads; - octx->src2_spad.size = octx->src2_spad.size_per_thread * octx->n_threads; - octx->src3_spad.size = octx->src3_spad.size_per_thread * octx->n_threads; - octx->dst_spad.size = octx->dst_spad.size_per_thread * octx->n_threads; - - size_t total_spad = octx->src0_spad.size + octx->src1_spad.size + octx->src2_spad.size + octx->src3_spad.size + octx->dst_spad.size; - - if (octx->ctx->vtcm_size < total_spad) { - return HTP_STATUS_VTCM_TOO_SMALL; - } - - octx->src0_spad.data = octx->ctx->vtcm_base; - octx->src1_spad.data = octx->src0_spad.data + octx->src0_spad.size; - octx->src2_spad.data = octx->src1_spad.data + octx->src1_spad.size; - octx->src3_spad.data = octx->src2_spad.data + octx->src2_spad.size; - octx->dst_spad.data = octx->src3_spad.data + octx->src3_spad.size; - - if (!(octx->flags & HTP_OPFLAGS_SKIP_COMPUTE)) { - worker_pool_run_func(octx->ctx->worker_pool, htp_flash_attn_ext_job, octx, octx->n_threads); - } - - return HTP_STATUS_OK; -} diff --git a/ggml/src/ggml-hexagon/htp/get-rows-ops.c b/ggml/src/ggml-hexagon/htp/get-rows-ops.c deleted file mode 100644 index a657cd2..0000000 --- a/ggml/src/ggml-hexagon/htp/get-rows-ops.c +++ /dev/null @@ -1,106 +0,0 @@ -#pragma clang diagnostic ignored "-Wunused-variable" -#pragma clang diagnostic ignored "-Wunused-function" -#pragma clang diagnostic ignored "-Wunused-but-set-variable" - -#include -#include - -#include -#include - -#define GGML_COMMON_DECL_C -#include "ggml-common.h" -#include "htp-ctx.h" -#include "htp-msg.h" -#include "htp-ops.h" -#include "hvx-utils.h" - -#define get_rows_preamble \ - const uint32_t ne00 = octx->src0.ne[0]; \ - const uint32_t ne01 = octx->src0.ne[1]; \ - const uint32_t ne02 = octx->src0.ne[2]; \ - const uint32_t ne03 = octx->src0.ne[3]; \ - \ - const uint32_t ne10 = octx->src1.ne[0]; \ - const uint32_t ne11 = octx->src1.ne[1]; \ - const uint32_t ne12 = octx->src1.ne[2]; \ - \ - const uint32_t nb01 = octx->src0.nb[1]; \ - const uint32_t nb02 = octx->src0.nb[2]; \ - const uint32_t nb03 = octx->src0.nb[3]; \ - \ - const uint32_t nb10 = octx->src1.nb[0]; \ - const uint32_t nb11 = octx->src1.nb[1]; \ - const uint32_t nb12 = octx->src1.nb[2]; \ - \ - const uint32_t nb1 = octx->dst.nb[1]; \ - const uint32_t nb2 = octx->dst.nb[2]; \ - const uint32_t nb3 = octx->dst.nb[3]; \ - \ - const uint32_t nr = ne10 * ne11 * ne12; - -static int get_rows_thread_f32_f32(struct htp_ops_context * octx, const int nth, const int ith) { - get_rows_preamble; - - // parallelize by src1 elements (which correspond to dst rows) - const uint32_t dr = octx->src1_nrows_per_thread; - const uint32_t ir0 = dr * ith; - const uint32_t ir1 = (ir0 + dr < nr) ? (ir0 + dr) : nr; - - const bool is_i32 = (octx->src1.type == HTP_TYPE_I32); - - for (uint32_t i = ir0; i < ir1; ++i) { - const uint32_t i12 = fastdiv(i, &octx->get_rows_div_ne10_ne11); - const uint32_t rem = i - i12 * ne11 * ne10; - const uint32_t i11 = fastdiv(rem, &octx->get_rows_div_ne10); - const uint32_t i10 = rem - i11 * ne10; - - const uintptr_t src1_addr = octx->src1.data + i10*nb10 + i11*nb11 + i12*nb12; - - uint32_t i01 = is_i32 ? *(int32_t *)src1_addr : *(int64_t *)src1_addr; - - if (i01 >= ne01) { - // invalid index, skip for now to avoid crash - continue; - } - - const uintptr_t src0_ptr = octx->src0.data + i01*nb01 + i11*nb02 + i12*nb03; - const uintptr_t dst_ptr = octx->dst.data + i10*nb1 + i11*nb2 + i12*nb3; - hvx_copy_f32_uu((uint8_t *)dst_ptr, (const uint8_t *)src0_ptr, ne00); - } - - return HTP_STATUS_OK; -} - -static void get_rows_work_f32_f32(unsigned int n, unsigned int i, void *data) { - get_rows_thread_f32_f32((struct htp_ops_context *) data, n, i); -} - -int op_get_rows(struct htp_ops_context * octx) { - get_rows_preamble; - - if (octx->src0.type != HTP_TYPE_F32) { - return HTP_STATUS_NO_SUPPORT; - } - - if (octx->dst.type != HTP_TYPE_F32) { - return HTP_STATUS_NO_SUPPORT; - } - - if (octx->src1.type != HTP_TYPE_I32 && octx->src1.type != HTP_TYPE_I64) { - return HTP_STATUS_NO_SUPPORT; - } - - if (octx->flags & HTP_OPFLAGS_SKIP_COMPUTE) { - return HTP_STATUS_OK; - } - - octx->get_rows_div_ne10 = init_fastdiv_values(octx->src1.ne[0]); - octx->get_rows_div_ne10_ne11 = init_fastdiv_values(octx->src1.ne[0] * octx->src1.ne[1]); - - const uint32_t n_jobs = MIN(nr, octx->n_threads); - octx->src1_nrows_per_thread = (nr + n_jobs - 1) / n_jobs; - - worker_pool_run_func(octx->ctx->worker_pool, get_rows_work_f32_f32, octx, n_jobs); - return HTP_STATUS_OK; -} diff --git a/ggml/src/ggml-hexagon/htp/hex-dump.h b/ggml/src/ggml-hexagon/htp/hex-dump.h deleted file mode 100644 index e3badb5..0000000 --- a/ggml/src/ggml-hexagon/htp/hex-dump.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef HEX_DUMP_H -#define HEX_DUMP_H - -#include - -static inline void hex_dump_int8_line(char * pref, const int8_t * x, int n) { - char str[1024], *p = str, *p_end = str + sizeof(str); - p += snprintf(p, p_end - p, "%s: ", pref); - for (int i = 0; i < n && p < p_end; i++) { - p += snprintf(p, p_end - p, "%d, ", x[i]); - } - FARF(HIGH, "%s\n", str); -} - -static inline void hex_dump_uint8_line(char * pref, const uint8_t * x, uint32_t n) { - char str[1024], *p = str, *p_end = str + sizeof(str); - p += snprintf(p, p_end - p, "%s: ", pref); - for (int i = 0; i < n && p < p_end; i++) { - p += snprintf(p, p_end - p, "%d, ", x[i]); - } - FARF(HIGH, "%s\n", str); -} - -static inline void hex_dump_int32_line(char * pref, const int32_t * x, uint32_t n) { - char str[1024], *p = str, *p_end = str + sizeof(str); - p += snprintf(p, p_end - p, "%s: ", pref); - for (int i = 0; i < n; i++) { - p += snprintf(p, p_end - p, "%d, ", (int) x[i]); - } - FARF(HIGH, "%s\n", str); -} - -static inline void hex_dump_f16_line(char * pref, const __fp16 * x, uint32_t n) { - char str[1024], *p = str, *p_end = str + sizeof(str); - p += snprintf(p, p_end - p, "%s: ", pref); - for (int i = 0; i < n; i++) { - p += snprintf(p, p_end - p, "%.6f, ", (float) x[i]); - } - FARF(HIGH, "%s\n", str); -} - -static inline void hex_dump_f32_line(char * pref, const float * x, uint32_t n) { - char str[1024], *p = str, *p_end = str + sizeof(str); - p += snprintf(p, p_end - p, "%s: ", pref); - for (int i = 0; i < n; i++) { - p += snprintf(p, p_end - p, "%.6f, ", x[i]); - } - FARF(HIGH, "%s\n", str); -} - -static inline void hex_dump_f32(char * pref, const float * x, uint32_t n) { - uint32_t n0 = n / 16; - uint32_t n1 = n % 16; - - uint32_t i = 0; - for (; i < n0; i++) { - hex_dump_f32_line(pref, x + (16 * i), 16); - } - if (n1) { - hex_dump_f32_line(pref, x + (16 * i), n1); - } -} - -static inline void hex_dump_f16(char * pref, const __fp16 * x, uint32_t n) { - uint32_t n0 = n / 16; - uint32_t n1 = n % 16; - - uint32_t i = 0; - for (; i < n0; i++) { - hex_dump_f16_line(pref, x + (16 * i), 16); - } - if (n1) { - hex_dump_f16_line(pref, x + (16 * i), n1); - } -} - -#endif /* HEX_DUMP_H */ diff --git a/ggml/src/ggml-hexagon/htp/hex-fastdiv.h b/ggml/src/ggml-hexagon/htp/hex-fastdiv.h deleted file mode 100644 index b7b5867..0000000 --- a/ggml/src/ggml-hexagon/htp/hex-fastdiv.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef HEX_FASTDIV_H -#define HEX_FASTDIV_H - -// See https://gmplib.org/~tege/divcnst-pldi94.pdf figure 4.1. -// Precompute mp (m' in the paper) and L such that division -// can be computed using a multiply (high 32b of 64b result) -// and a shift: -// -// n/d = (mulhi(n, mp) + n) >> L; -struct fastdiv_values { - uint32_t mp; - uint32_t l; -}; - -static inline struct fastdiv_values init_fastdiv_values(uint32_t d) { - struct fastdiv_values result = { 0, 0 }; - // compute L = ceil(log2(d)); - while (result.l < 32 && ((uint32_t) 1 << result.l) < d) { - ++(result.l); - } - - result.mp = (uint32_t) (((uint64_t) 1 << 32) * (((uint64_t) 1 << result.l) - d) / d + 1); - return result; -} - -static inline uint32_t fastdiv(uint32_t n, const struct fastdiv_values * vals) { - // Compute high 32 bits of n * mp - const uint32_t hi = (uint32_t) (((uint64_t) n * vals->mp) >> 32); // mulhi(n, mp) - // add n, apply bit shift - return (hi + n) >> vals->l; -} - -static inline uint32_t fastmodulo(uint32_t n, uint32_t d, const struct fastdiv_values * vals) { - return n - fastdiv(n, vals) * d; -} - -#endif /* HEX_FASTDIV_H */ diff --git a/ggml/src/ggml-hexagon/htp/hex-utils.h b/ggml/src/ggml-hexagon/htp/hex-utils.h deleted file mode 100644 index fb8a25a..0000000 --- a/ggml/src/ggml-hexagon/htp/hex-utils.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef HEX_UTILS_H -#define HEX_UTILS_H - -#include -#include - -#include "hexagon_types.h" - -#include "hex-fastdiv.h" -#include "hex-dump.h" - -#ifndef MAX -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#endif - -#ifndef MIN -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif - -static inline uint64_t hex_get_cycles() { - uint64_t cycles = 0; - asm volatile(" %0 = c15:14\n" : "=r"(cycles)); - return cycles; -} - -static inline uint64_t hex_get_pktcnt() { - uint64_t pktcnt; - asm volatile(" %0 = c19:18\n" : "=r"(pktcnt)); - return pktcnt; -} - -static inline int32_t hex_is_aligned(void * addr, uint32_t align) { - return ((size_t) addr & (align - 1)) == 0; -} - -static inline int32_t hex_is_one_chunk(void * addr, uint32_t n, uint32_t chunk_size) { - uint32_t left_off = (size_t) addr & (chunk_size - 1); - uint32_t right_off = left_off + n; - return right_off <= chunk_size; -} - -static inline uint32_t hex_round_up(uint32_t n, uint32_t m) { - return m * ((n + m - 1) / m); -} - -static inline void hex_l2fetch(const void * p, uint32_t width, uint32_t stride, uint32_t height) { - const uint64_t control = Q6_P_combine_RR(stride, Q6_R_combine_RlRl(width, height)); - Q6_l2fetch_AP((void *) p, control); -} - -#endif /* HEX_UTILS_H */ diff --git a/ggml/src/ggml-hexagon/htp/htp-ctx.h b/ggml/src/ggml-hexagon/htp/htp-ctx.h index a707d98..5c3d217 100644 --- a/ggml/src/ggml-hexagon/htp/htp-ctx.h +++ b/ggml/src/ggml-hexagon/htp/htp-ctx.h @@ -1,7 +1,7 @@ #ifndef HTP_CTX_H #define HTP_CTX_H -#include "hex-dma.h" +#include "htp-dma.h" #include "worker-pool.h" #include @@ -11,6 +11,11 @@ #define HTP_MAX_NTHREADS 10 +// FIXME: move these into matmul-ops +#define HTP_SPAD_SRC0_NROWS 16 +#define HTP_SPAD_SRC1_NROWS 16 +#define HTP_SPAD_DST_NROWS 2 + // Main context for htp DSP backend struct htp_context { dspqueue_t queue; diff --git a/ggml/src/ggml-hexagon/htp/hex-dma.c b/ggml/src/ggml-hexagon/htp/htp-dma.c similarity index 98% rename from ggml/src/ggml-hexagon/htp/hex-dma.c rename to ggml/src/ggml-hexagon/htp/htp-dma.c index 44e1be4..880c454 100644 --- a/ggml/src/ggml-hexagon/htp/hex-dma.c +++ b/ggml/src/ggml-hexagon/htp/htp-dma.c @@ -1,4 +1,4 @@ -#include "hex-dma.h" +#include "htp-dma.h" #include #include diff --git a/ggml/src/ggml-hexagon/htp/hex-dma.h b/ggml/src/ggml-hexagon/htp/htp-dma.h similarity index 99% rename from ggml/src/ggml-hexagon/htp/hex-dma.h rename to ggml/src/ggml-hexagon/htp/htp-dma.h index d1ddb0e..32fd06e 100644 --- a/ggml/src/ggml-hexagon/htp/hex-dma.h +++ b/ggml/src/ggml-hexagon/htp/htp-dma.h @@ -2,6 +2,7 @@ #define HTP_DMA_H #include +#include #include #include #include diff --git a/ggml/src/ggml-hexagon/htp/htp-msg.h b/ggml/src/ggml-hexagon/htp/htp-msg.h index f49e8ee..a616523 100644 --- a/ggml/src/ggml-hexagon/htp/htp-msg.h +++ b/ggml/src/ggml-hexagon/htp/htp-msg.h @@ -36,8 +36,6 @@ enum htp_data_type { HTP_TYPE_F16 = 1, HTP_TYPE_Q4_0 = 2, HTP_TYPE_Q8_0 = 8, - HTP_TYPE_I32 = 26, - HTP_TYPE_I64 = 27, HTP_TYPE_MXFP4 = 39, HTP_TYPE_COUNT }; @@ -59,11 +57,6 @@ enum htp_op { HTP_OP_SOFTMAX = 11, HTP_OP_ADD_ID = 12, HTP_OP_ROPE = 13, - HTP_OP_FLASH_ATTN_EXT = 14, - HTP_OP_SET_ROWS = 15, - HTP_OP_SCALE = 16, - HTP_OP_GET_ROWS = 17, - HTP_OP_CPY = 18, INVALID }; @@ -144,8 +137,6 @@ struct htp_general_req { struct htp_tensor src0; // Input0 tensor struct htp_tensor src1; // Input1 tensor struct htp_tensor src2; // Input2 tensor - struct htp_tensor src3; // Input3 tensor - struct htp_tensor src4; // Input4 tensor struct htp_tensor dst; // Output tensor // should be multiple of 64 bytes (cacheline) @@ -161,6 +152,6 @@ struct htp_general_rsp { }; #define HTP_MAX_MESSAGE_SIZE sizeof(struct htp_general_req) -#define HTP_MAX_PACKET_BUFFERS 8 +#define HTP_MAX_PACKET_BUFFERS 4 #endif /* HTP_MSG_H */ diff --git a/ggml/src/ggml-hexagon/htp/htp-ops.h b/ggml/src/ggml-hexagon/htp/htp-ops.h index 602a277..e876574 100644 --- a/ggml/src/ggml-hexagon/htp/htp-ops.h +++ b/ggml/src/ggml-hexagon/htp/htp-ops.h @@ -4,17 +4,15 @@ #include "htp-ctx.h" #include "htp-msg.h" #include "worker-pool.h" +#include "ops-utils.h" #include #include -#include - // ggml-common.h must be included prior to this header struct htp_spad { uint8_t * data; - size_t stride; size_t size; size_t size_per_thread; }; @@ -28,14 +26,11 @@ struct htp_ops_context { struct htp_tensor src0; struct htp_tensor src1; struct htp_tensor src2; - struct htp_tensor src3; - struct htp_tensor src4; struct htp_tensor dst; struct htp_spad src0_spad; struct htp_spad src1_spad; struct htp_spad src2_spad; - struct htp_spad src3_spad; struct htp_spad dst_spad; worker_pool_context_t * wpool; // worker pool @@ -54,35 +49,6 @@ struct htp_ops_context { struct fastdiv_values src1_div3; // fastdiv values for ne3 struct fastdiv_values src1_div21; // fastdiv values for ne2 * ne1 - struct fastdiv_values src3_div1; // fastdiv values for ne1 - struct fastdiv_values src3_div2; // fastdiv values for ne2 - struct fastdiv_values src3_div3; // fastdiv values for ne3 - struct fastdiv_values src3_div21; // fastdiv values for ne2 * ne1 - - struct fastdiv_values broadcast_rk2; - struct fastdiv_values broadcast_rk3; - struct fastdiv_values broadcast_rv2; - struct fastdiv_values broadcast_rv3; - - struct fastdiv_values mm_div_ne12_ne1; // fastdiv values for ne12 * ne1 - struct fastdiv_values mm_div_ne1; // fastdiv values for ne1 - struct fastdiv_values mm_div_r2; // fastdiv values for ne12 / ne02 - struct fastdiv_values mm_div_r3; // fastdiv values for ne13 / ne03 - - struct fastdiv_values set_rows_div_ne12; // fastdiv values for ne12 - struct fastdiv_values set_rows_div_ne11; // fastdiv values for ne11 - - struct fastdiv_values get_rows_div_ne10; // fastdiv values for ne10 - struct fastdiv_values get_rows_div_ne10_ne11; // fastdiv values for ne10 * ne11 - - struct fastdiv_values cpy_div_ne01; // fastdiv values for ne01 - struct fastdiv_values cpy_div_ne02; // fastdiv values for ne02 - struct fastdiv_values cpy_div_ne03; // fastdiv values for ne03 - - struct fastdiv_values cpy_rshp_div_n0; // fastdiv values for ne00 - struct fastdiv_values cpy_rshp_div_n1n0; // fastdiv values for ne00*ne01 - struct fastdiv_values cpy_rshp_div_n2n1n0; // fastdiv values for ne00*ne01*ne02 - uint32_t flags; }; @@ -94,9 +60,5 @@ int op_activations(struct htp_ops_context * octx); int op_softmax(struct htp_ops_context * octx); int op_add_id(struct htp_ops_context * octx); int op_rope(struct htp_ops_context * octx); -int op_flash_attn_ext(struct htp_ops_context * octx); -int op_set_rows(struct htp_ops_context * octx); -int op_get_rows(struct htp_ops_context * octx); -int op_cpy(struct htp_ops_context * octx); #endif /* HTP_OPS_H */ diff --git a/ggml/src/ggml-hexagon/htp/hvx-arith.h b/ggml/src/ggml-hexagon/htp/hvx-arith.h deleted file mode 100644 index 3449739..0000000 --- a/ggml/src/ggml-hexagon/htp/hvx-arith.h +++ /dev/null @@ -1,457 +0,0 @@ -#ifndef HVX_ARITH_H -#define HVX_ARITH_H - -#include -#include -#include -#include - -#include "hvx-base.h" -#include "hex-utils.h" - -// -// Binary operations (add, mul, sub) -// - -#define hvx_arith_loop_body(dst_type, src0_type, src1_type, vec_store, vec_op) \ - do { \ - dst_type * restrict vdst = (dst_type *) dst; \ - src0_type * restrict vsrc0 = (src0_type *) src0; \ - src1_type * restrict vsrc1 = (src1_type *) src1; \ - \ - const uint32_t elem_size = sizeof(float); \ - const uint32_t epv = 128 / elem_size; \ - const uint32_t nvec = n / epv; \ - const uint32_t nloe = n % epv; \ - \ - uint32_t i = 0; \ - \ - _Pragma("unroll(4)") \ - for (; i < nvec; i++) { \ - vdst[i] = vec_op(vsrc0[i], vsrc1[i]); \ - } \ - if (nloe) { \ - HVX_Vector v = vec_op(vsrc0[i], vsrc1[i]); \ - vec_store((void *) &vdst[i], nloe * elem_size, v); \ - } \ - } while(0) - -#if __HVX_ARCH__ < 79 -#define HVX_OP_ADD(a, b) Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(a, b)) -#define HVX_OP_SUB(a, b) Q6_Vsf_equals_Vqf32(Q6_Vqf32_vsub_VsfVsf(a, b)) -#define HVX_OP_MUL(a, b) Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(a, b)) -#else -#define HVX_OP_ADD(a, b) Q6_Vsf_vadd_VsfVsf(a, b) -#define HVX_OP_SUB(a, b) Q6_Vsf_vsub_VsfVsf(a, b) -#define HVX_OP_MUL(a, b) Q6_Vsf_vmpy_VsfVsf(a, b) -#endif - -// ADD variants - -static inline void hvx_add_f32_aa(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, uint32_t n) { - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src0 % 128 == 0); - assert((unsigned long) src1 % 128 == 0); - hvx_arith_loop_body(HVX_Vector, HVX_Vector, HVX_Vector, hvx_vec_store_a, HVX_OP_ADD); -} - -static inline void hvx_add_f32_au(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, uint32_t n) { - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src0 % 128 == 0); - hvx_arith_loop_body(HVX_Vector, HVX_Vector, HVX_UVector, hvx_vec_store_a, HVX_OP_ADD); -} - -static inline void hvx_add_f32_ua(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, uint32_t n) { - assert((unsigned long) src0 % 128 == 0); - assert((unsigned long) src1 % 128 == 0); - hvx_arith_loop_body(HVX_UVector, HVX_Vector, HVX_Vector, hvx_vec_store_u, HVX_OP_ADD); -} - -static inline void hvx_add_f32_uu(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, uint32_t n) { - hvx_arith_loop_body(HVX_UVector, HVX_UVector, HVX_UVector, hvx_vec_store_u, HVX_OP_ADD); -} - -// SUB variants - -static inline void hvx_sub_f32_aa(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, uint32_t n) { - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src0 % 128 == 0); - assert((unsigned long) src1 % 128 == 0); - hvx_arith_loop_body(HVX_Vector, HVX_Vector, HVX_Vector, hvx_vec_store_a, HVX_OP_SUB); -} - -static inline void hvx_sub_f32_au(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, uint32_t n) { - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src0 % 128 == 0); - hvx_arith_loop_body(HVX_Vector, HVX_Vector, HVX_UVector, hvx_vec_store_a, HVX_OP_SUB); -} - -static inline void hvx_sub_f32_ua(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, uint32_t n) { - assert((unsigned long) src0 % 128 == 0); - assert((unsigned long) src1 % 128 == 0); - hvx_arith_loop_body(HVX_UVector, HVX_Vector, HVX_Vector, hvx_vec_store_u, HVX_OP_SUB); -} - -static inline void hvx_sub_f32_uu(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, uint32_t n) { - hvx_arith_loop_body(HVX_UVector, HVX_UVector, HVX_UVector, hvx_vec_store_u, HVX_OP_SUB); -} - -// MUL variants - -static inline void hvx_mul_f32_aa(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, uint32_t n) { - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src0 % 128 == 0); - assert((unsigned long) src1 % 128 == 0); - hvx_arith_loop_body(HVX_Vector, HVX_Vector, HVX_Vector, hvx_vec_store_a, HVX_OP_MUL); -} - -static inline void hvx_mul_f32_au(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, uint32_t n) { - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src0 % 128 == 0); - hvx_arith_loop_body(HVX_Vector, HVX_Vector, HVX_UVector, hvx_vec_store_a, HVX_OP_MUL); -} - -static inline void hvx_mul_f32_ua(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, uint32_t n) { - assert((unsigned long) src0 % 128 == 0); - assert((unsigned long) src1 % 128 == 0); - hvx_arith_loop_body(HVX_UVector, HVX_Vector, HVX_Vector, hvx_vec_store_u, HVX_OP_MUL); -} - -static inline void hvx_mul_f32_uu(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, uint32_t n) { - hvx_arith_loop_body(HVX_UVector, HVX_UVector, HVX_UVector, hvx_vec_store_u, HVX_OP_MUL); -} - -// Dispatchers - -static inline void hvx_add_f32(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, const uint32_t num_elems) { - if (hex_is_aligned((void *) dst, 128) && hex_is_aligned((void *) src0, 128)) { - if (hex_is_aligned((void *) src1, 128)) { - hvx_add_f32_aa(dst, src0, src1, num_elems); - } else { - hvx_add_f32_au(dst, src0, src1, num_elems); - } - } else if (hex_is_aligned((void *) src0, 128) && hex_is_aligned((void *) src1, 128)) { - hvx_add_f32_ua(dst, src0, src1, num_elems); - } else { - hvx_add_f32_uu(dst, src0, src1, num_elems); - } -} - -static inline void hvx_sub_f32(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, const uint32_t num_elems) { - if (hex_is_aligned((void *) dst, 128) && hex_is_aligned((void *) src0, 128)) { - if (hex_is_aligned((void *) src1, 128)) { - hvx_sub_f32_aa(dst, src0, src1, num_elems); - } else { - hvx_sub_f32_au(dst, src0, src1, num_elems); - } - } else if (hex_is_aligned((void *) src0, 128) && hex_is_aligned((void *) src1, 128)) { - hvx_sub_f32_ua(dst, src0, src1, num_elems); - } else { - hvx_sub_f32_uu(dst, src0, src1, num_elems); - } -} - -static inline void hvx_mul_f32(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, const uint32_t num_elems) { - if (hex_is_aligned((void *) dst, 128) && hex_is_aligned((void *) src0, 128)) { - if (hex_is_aligned((void *) src1, 128)) { - hvx_mul_f32_aa(dst, src0, src1, num_elems); - } else { - hvx_mul_f32_au(dst, src0, src1, num_elems); - } - } else if (hex_is_aligned((void *) src0, 128) && hex_is_aligned((void *) src1, 128)) { - hvx_mul_f32_ua(dst, src0, src1, num_elems); - } else { - hvx_mul_f32_uu(dst, src0, src1, num_elems); - } -} - -// Mul-Mul Optimized - -static inline void hvx_mul_mul_f32_aa(uint8_t * restrict dst, const uint8_t * restrict src0, const uint8_t * restrict src1, const uint8_t * restrict src2, const uint32_t num_elems) { - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src0 % 128 == 0); - assert((unsigned long) src1 % 128 == 0); - assert((unsigned long) src2 % 128 == 0); - - HVX_Vector * restrict vdst = (HVX_Vector *) dst; - HVX_Vector * restrict vsrc0 = (HVX_Vector *) src0; - HVX_Vector * restrict vsrc1 = (HVX_Vector *) src1; - HVX_Vector * restrict vsrc2 = (HVX_Vector *) src2; - - const uint32_t elem_size = sizeof(float); - const uint32_t epv = 128 / elem_size; - const uint32_t nvec = num_elems / epv; - const uint32_t nloe = num_elems % epv; - - uint32_t i = 0; - - _Pragma("unroll(4)") - for (; i < nvec; i++) { - HVX_Vector v1 = HVX_OP_MUL(vsrc0[i], vsrc1[i]); - vdst[i] = HVX_OP_MUL(v1, vsrc2[i]); - } - - if (nloe) { - HVX_Vector v1 = HVX_OP_MUL(vsrc0[i], vsrc1[i]); - HVX_Vector v2 = HVX_OP_MUL(v1, vsrc2[i]); - hvx_vec_store_a((void *) &vdst[i], nloe * elem_size, v2); - } -} - -// Scalar Operations - -#define hvx_scalar_loop_body(dst_type, src_type, vec_store, scalar_op_macro) \ - do { \ - dst_type * restrict vdst = (dst_type *) dst; \ - src_type * restrict vsrc = (src_type *) src; \ - \ - const uint32_t elem_size = sizeof(float); \ - const uint32_t epv = 128 / elem_size; \ - const uint32_t nvec = n / epv; \ - const uint32_t nloe = n % epv; \ - \ - uint32_t i = 0; \ - \ - _Pragma("unroll(4)") \ - for (; i < nvec; i++) { \ - HVX_Vector v = vsrc[i]; \ - vdst[i] = scalar_op_macro(v); \ - } \ - if (nloe) { \ - HVX_Vector v = vsrc[i]; \ - v = scalar_op_macro(v); \ - vec_store((void *) &vdst[i], nloe * elem_size, v); \ - } \ - } while(0) - -#define HVX_OP_ADD_SCALAR(v) \ - ({ \ - const HVX_VectorPred pred_inf = Q6_Q_vcmp_eq_VwVw(inf, v); \ - HVX_Vector out = HVX_OP_ADD(v, val_vec); \ - Q6_V_vmux_QVV(pred_inf, inf, out); \ - }) - -#define HVX_OP_MUL_SCALAR(v) HVX_OP_MUL(v, val_vec) -#define HVX_OP_SUB_SCALAR(v) HVX_OP_SUB(v, val_vec) - -// Add Scalar Variants - -static inline void hvx_add_scalar_f32_aa(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - const HVX_Vector inf = hvx_vec_splat_f32(INFINITY); - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src % 128 == 0); - hvx_scalar_loop_body(HVX_Vector, HVX_Vector, hvx_vec_store_a, HVX_OP_ADD_SCALAR); -} - -static inline void hvx_add_scalar_f32_au(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - const HVX_Vector inf = hvx_vec_splat_f32(INFINITY); - assert((unsigned long) dst % 128 == 0); - hvx_scalar_loop_body(HVX_Vector, HVX_UVector, hvx_vec_store_a, HVX_OP_ADD_SCALAR); -} - -static inline void hvx_add_scalar_f32_ua(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - const HVX_Vector inf = hvx_vec_splat_f32(INFINITY); - assert((unsigned long) src % 128 == 0); - hvx_scalar_loop_body(HVX_UVector, HVX_Vector, hvx_vec_store_u, HVX_OP_ADD_SCALAR); -} - -static inline void hvx_add_scalar_f32_uu(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - static const float kInf = INFINITY; - const HVX_Vector inf = hvx_vec_splat_f32(kInf); - hvx_scalar_loop_body(HVX_UVector, HVX_UVector, hvx_vec_store_u, HVX_OP_ADD_SCALAR); -} - -// Sub Scalar Variants - -static inline void hvx_sub_scalar_f32_aa(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src % 128 == 0); - hvx_scalar_loop_body(HVX_Vector, HVX_Vector, hvx_vec_store_a, HVX_OP_SUB_SCALAR); -} - -static inline void hvx_sub_scalar_f32_au(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - assert((unsigned long) dst % 128 == 0); - hvx_scalar_loop_body(HVX_Vector, HVX_UVector, hvx_vec_store_a, HVX_OP_SUB_SCALAR); -} - -static inline void hvx_sub_scalar_f32_ua(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - assert((unsigned long) src % 128 == 0); - hvx_scalar_loop_body(HVX_UVector, HVX_Vector, hvx_vec_store_u, HVX_OP_SUB_SCALAR); -} - -static inline void hvx_sub_scalar_f32_uu(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - hvx_scalar_loop_body(HVX_UVector, HVX_UVector, hvx_vec_store_u, HVX_OP_SUB_SCALAR); -} - -// Mul Scalar Variants - -static inline void hvx_mul_scalar_f32_aa(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src % 128 == 0); - hvx_scalar_loop_body(HVX_Vector, HVX_Vector, hvx_vec_store_a, HVX_OP_MUL_SCALAR); -} - -static inline void hvx_mul_scalar_f32_au(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - assert((unsigned long) dst % 128 == 0); - hvx_scalar_loop_body(HVX_Vector, HVX_UVector, hvx_vec_store_a, HVX_OP_MUL_SCALAR); -} - -static inline void hvx_mul_scalar_f32_ua(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - assert((unsigned long) src % 128 == 0); - hvx_scalar_loop_body(HVX_UVector, HVX_Vector, hvx_vec_store_u, HVX_OP_MUL_SCALAR); -} - -static inline void hvx_mul_scalar_f32_uu(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - hvx_scalar_loop_body(HVX_UVector, HVX_UVector, hvx_vec_store_u, HVX_OP_MUL_SCALAR); -} - -static inline void hvx_add_scalar_f32(uint8_t * restrict dst, const uint8_t * restrict src, const float val, const int num_elems) { - if (hex_is_aligned((void *) dst, 128) && hex_is_aligned((void *) src, 128)) { - hvx_add_scalar_f32_aa(dst, src, val, num_elems); - } else if (hex_is_aligned((void *) dst, 128)) { - hvx_add_scalar_f32_au(dst, src, val, num_elems); - } else if (hex_is_aligned((void *) src, 128)) { - hvx_add_scalar_f32_ua(dst, src, val, num_elems); - } else { - hvx_add_scalar_f32_uu(dst, src, val, num_elems); - } -} - -static inline void hvx_mul_scalar_f32(uint8_t * restrict dst, const uint8_t * restrict src, const float val, const int num_elems) { - if (hex_is_aligned((void *) dst, 128) && hex_is_aligned((void *) src, 128)) { - hvx_mul_scalar_f32_aa(dst, src, val, num_elems); - } else if (hex_is_aligned((void *) dst, 128)) { - hvx_mul_scalar_f32_au(dst, src, val, num_elems); - } else if (hex_is_aligned((void *) src, 128)) { - hvx_mul_scalar_f32_ua(dst, src, val, num_elems); - } else { - hvx_mul_scalar_f32_uu(dst, src, val, num_elems); - } -} - -static inline void hvx_sub_scalar_f32(uint8_t * restrict dst, const uint8_t * restrict src, const float val, const int num_elems) { - if (hex_is_aligned((void *) dst, 128) && hex_is_aligned((void *) src, 128)) { - hvx_sub_scalar_f32_aa(dst, src, val, num_elems); - } else if (hex_is_aligned((void *) dst, 128)) { - hvx_sub_scalar_f32_au(dst, src, val, num_elems); - } else if (hex_is_aligned((void *) src, 128)) { - hvx_sub_scalar_f32_ua(dst, src, val, num_elems); - } else { - hvx_sub_scalar_f32_uu(dst, src, val, num_elems); - } -} - -// MIN Scalar variants - -#define HVX_OP_MIN_SCALAR(v) Q6_Vsf_vmin_VsfVsf(val_vec, v) - -static inline void hvx_min_scalar_f32_aa(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src % 128 == 0); - hvx_scalar_loop_body(HVX_Vector, HVX_Vector, hvx_vec_store_a, HVX_OP_MIN_SCALAR); -} - -static inline void hvx_min_scalar_f32_au(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - assert((unsigned long) dst % 128 == 0); - hvx_scalar_loop_body(HVX_Vector, HVX_UVector, hvx_vec_store_a, HVX_OP_MIN_SCALAR); -} - -static inline void hvx_min_scalar_f32_ua(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - assert((unsigned long) src % 128 == 0); - hvx_scalar_loop_body(HVX_UVector, HVX_Vector, hvx_vec_store_u, HVX_OP_MIN_SCALAR); -} - -static inline void hvx_min_scalar_f32_uu(uint8_t * restrict dst, const uint8_t * restrict src, const float val, uint32_t n) { - const HVX_Vector val_vec = hvx_vec_splat_f32(val); - hvx_scalar_loop_body(HVX_UVector, HVX_UVector, hvx_vec_store_u, HVX_OP_MIN_SCALAR); -} - -static inline void hvx_min_scalar_f32(uint8_t * restrict dst, const uint8_t * restrict src, const float val, const int num_elems) { - if (hex_is_aligned((void *) dst, 128) && hex_is_aligned((void *) src, 128)) { - hvx_min_scalar_f32_aa(dst, src, val, num_elems); - } else if (hex_is_aligned((void *) dst, 128)) { - hvx_min_scalar_f32_au(dst, src, val, num_elems); - } else if (hex_is_aligned((void *) src, 128)) { - hvx_min_scalar_f32_ua(dst, src, val, num_elems); - } else { - hvx_min_scalar_f32_uu(dst, src, val, num_elems); - } -} - -// CLAMP Scalar variants - -#define HVX_OP_CLAMP_SCALAR(v) \ - ({ \ - HVX_VectorPred pred_cap_right = Q6_Q_vcmp_gt_VsfVsf(v, max_vec); \ - HVX_VectorPred pred_cap_left = Q6_Q_vcmp_gt_VsfVsf(min_vec, v); \ - HVX_Vector tmp = Q6_V_vmux_QVV(pred_cap_right, max_vec, v); \ - Q6_V_vmux_QVV(pred_cap_left, min_vec, tmp); \ - }) - -static inline void hvx_clamp_scalar_f32_aa(uint8_t * restrict dst, const uint8_t * restrict src, const float min, const float max, uint32_t n) { - const HVX_Vector min_vec = hvx_vec_splat_f32(min); - const HVX_Vector max_vec = hvx_vec_splat_f32(max); - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src % 128 == 0); - hvx_scalar_loop_body(HVX_Vector, HVX_Vector, hvx_vec_store_a, HVX_OP_CLAMP_SCALAR); -} - -static inline void hvx_clamp_scalar_f32_au(uint8_t * restrict dst, const uint8_t * restrict src, const float min, const float max, uint32_t n) { - const HVX_Vector min_vec = hvx_vec_splat_f32(min); - const HVX_Vector max_vec = hvx_vec_splat_f32(max); - assert((unsigned long) dst % 128 == 0); - hvx_scalar_loop_body(HVX_Vector, HVX_UVector, hvx_vec_store_a, HVX_OP_CLAMP_SCALAR); -} - -static inline void hvx_clamp_scalar_f32_ua(uint8_t * restrict dst, const uint8_t * restrict src, const float min, const float max, uint32_t n) { - const HVX_Vector min_vec = hvx_vec_splat_f32(min); - const HVX_Vector max_vec = hvx_vec_splat_f32(max); - assert((unsigned long) src % 128 == 0); - hvx_scalar_loop_body(HVX_UVector, HVX_Vector, hvx_vec_store_u, HVX_OP_CLAMP_SCALAR); -} - -static inline void hvx_clamp_scalar_f32_uu(uint8_t * restrict dst, const uint8_t * restrict src, const float min, const float max, uint32_t n) { - const HVX_Vector min_vec = hvx_vec_splat_f32(min); - const HVX_Vector max_vec = hvx_vec_splat_f32(max); - hvx_scalar_loop_body(HVX_UVector, HVX_UVector, hvx_vec_store_u, HVX_OP_CLAMP_SCALAR); -} - -static inline void hvx_clamp_scalar_f32(uint8_t * restrict dst, const uint8_t * restrict src, const float min, const float max, const int num_elems) { - if (hex_is_aligned((void *) dst, 128) && hex_is_aligned((void *) src, 128)) { - hvx_clamp_scalar_f32_aa(dst, src, min, max, num_elems); - } else if (hex_is_aligned((void *) dst, 128)) { - hvx_clamp_scalar_f32_au(dst, src, min, max, num_elems); - } else if (hex_is_aligned((void *) src, 128)) { - hvx_clamp_scalar_f32_ua(dst, src, min, max, num_elems); - } else { - hvx_clamp_scalar_f32_uu(dst, src, min, max, num_elems); - } -} - -#undef HVX_OP_ADD -#undef HVX_OP_SUB -#undef HVX_OP_MUL -#undef hvx_arith_loop_body -#undef HVX_OP_ADD_SCALAR -#undef HVX_OP_SUB_SCALAR -#undef HVX_OP_MUL_SCALAR -#undef hvx_scalar_loop_body -#undef HVX_OP_MIN_SCALAR -#undef HVX_OP_CLAMP_SCALAR - -#endif // HVX_ARITH_H diff --git a/ggml/src/ggml-hexagon/htp/hvx-base.h b/ggml/src/ggml-hexagon/htp/hvx-base.h deleted file mode 100644 index ffa6e18..0000000 --- a/ggml/src/ggml-hexagon/htp/hvx-base.h +++ /dev/null @@ -1,167 +0,0 @@ -#ifndef HVX_BASE_H -#define HVX_BASE_H - -#include -#include - -#include "hex-utils.h" -#include "hvx-types.h" - -static inline void hvx_vec_store_u(void * restrict dst, uint32_t n, HVX_Vector v) { - // Rotate as needed. - v = Q6_V_vlalign_VVR(v, v, (size_t) dst); - - uint32_t left_off = (size_t) dst & 127; - uint32_t right_off = left_off + n; - - HVX_VectorPred ql_not = Q6_Q_vsetq_R((size_t) dst); - HVX_VectorPred qr = Q6_Q_vsetq2_R(right_off); - - if (right_off > 128) { - Q6_vmem_QRIV(qr, (HVX_Vector *) dst + 1, v); - // all 1's - qr = Q6_Q_vcmp_eq_VbVb(v, v); - } - - ql_not = Q6_Q_or_QQn(ql_not, qr); - Q6_vmem_QnRIV(ql_not, (HVX_Vector *) dst, v); -} - -static inline void hvx_vec_store_a(void * restrict dst, uint32_t n, HVX_Vector v) { - assert((unsigned long) dst % 128 == 0); - HVX_VectorPred m = Q6_Q_or_QQn(Q6_Q_vsetq_R((unsigned long) dst), Q6_Q_vsetq2_R(n)); - Q6_vmem_QnRIV(m, (HVX_Vector *) dst, v); -} - -static inline HVX_Vector hvx_vec_splat_f32(float v) { - union { float f; uint32_t i; } u = { .f = v }; - return Q6_V_vsplat_R(u.i); -} - -static inline HVX_Vector hvx_vec_splat_f16(float v) { - union { __fp16 f; uint16_t i; } u = { .f = v }; - return Q6_Vh_vsplat_R(u.i); -} - -static inline HVX_Vector hvx_vec_repl4(HVX_Vector v) { - // vdelta control to replicate first 4 bytes across all elements - static const uint8_t __attribute__((aligned(128))) repl[128] = { - 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, - 0x10, 0x10, 0x10, 0x10, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, - 0x20, 0x20, 0x20, 0x20, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, - 0x10, 0x10, 0x10, 0x10, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, - 0x40, 0x40, 0x40, 0x40, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, - 0x10, 0x10, 0x10, 0x10, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, - 0x20, 0x20, 0x20, 0x20, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, - 0x10, 0x10, 0x10, 0x10, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, - }; - - HVX_Vector ctrl = *(HVX_Vector *) repl; - return Q6_V_vdelta_VV(v, ctrl); -} - -static inline float hvx_vec_get_f32(HVX_Vector v) { - float __attribute__((aligned(128))) x; - hvx_vec_store_a(&x, 4, v); - return x; -} - -static inline HVX_Vector hvx_vec_abs_f16(HVX_Vector v) { - // abs by clearing the fp16 sign bit - HVX_Vector mask = Q6_Vh_vsplat_R(0x7fff); - return Q6_V_vand_VV(v, mask); -} - -static inline HVX_Vector hvx_vec_neg_f16(HVX_Vector v) { - // neg by setting the fp16 sign bit - HVX_Vector mask = Q6_Vh_vsplat_R(0x8000); - return Q6_V_vxor_VV(v, mask); -} - -static inline HVX_Vector hvx_vec_abs_f32(HVX_Vector v) { - // abs by clearing the fp32 sign bit - HVX_Vector mask = Q6_V_vsplat_R(0x7fffffff); - return Q6_V_vand_VV(v, mask); -} - -static inline HVX_Vector hvx_vec_neg_f32(HVX_Vector v) { -#if __HVX_ARCH__ > 75 - return Q6_Vsf_vfneg_Vsf(v); -#else - // neg by setting the fp32 sign bit - HVX_Vector mask = Q6_V_vsplat_R(0x80000000); - return Q6_V_vxor_VV(v, mask); -#endif // __HVX_ARCH__ > 75 -} - -static inline HVX_VectorPred hvx_vec_is_nan_f16(HVX_Vector v) { - const HVX_Vector vnan_exp = Q6_Vh_vsplat_R(0x7C00); - const HVX_Vector vnan_frac = Q6_Vh_vsplat_R(0x7FFF); - - // get pred of which are NaN, i.e., exponent bits all 1s and fraction bits non 0s - HVX_VectorPred p_exp = Q6_Q_vcmp_eq_VhVh(Q6_V_vand_VV(v, vnan_exp), vnan_exp); - HVX_VectorPred p_frac = Q6_Q_not_Q(Q6_Q_vcmp_eq_VhVh(Q6_V_vand_VV(v, vnan_frac), vnan_exp)); - return Q6_Q_and_QQ(p_exp, p_frac); -} - -static inline HVX_Vector hvx_vec_f32_to_f16(HVX_Vector v0, HVX_Vector v1) { - const HVX_Vector zero = Q6_V_vsplat_R(0); - HVX_Vector q0 = Q6_Vqf32_vadd_VsfVsf(v0, zero); - HVX_Vector q1 = Q6_Vqf32_vadd_VsfVsf(v1, zero); - HVX_Vector v = Q6_Vh_vdeal_Vh(Q6_Vhf_equals_Wqf32(Q6_W_vcombine_VV(q1, q0))); - -#if __HVX_ARCH__ < 79 - // replace NaNs with -INF, older arches produce NaNs for (-INF + 0.0) - const HVX_Vector neg_inf = hvx_vec_splat_f16(-INFINITY); - HVX_VectorPred nan = hvx_vec_is_nan_f16(v); - v = Q6_V_vmux_QVV(nan, neg_inf, v); -#endif - - return v; -} - -/* Q6_Vsf_equals_Vw is only available on v73+.*/ -#if __HVX_ARCH__ < 73 -static inline HVX_Vector hvx_vec_i32_to_qf32(HVX_Vector const in) -{ - HVX_Vector const vzero = Q6_V_vzero(); - HVX_VectorPred is_zero = Q6_Q_vcmp_eq_VwVw(in, vzero); - HVX_Vector lshift = Q6_Vw_vnormamt_Vw(in); - HVX_Vector normalized = Q6_Vw_vasl_VwVw(in, lshift); - HVX_Vector vexp = Q6_Vw_vsub_VwVw(Q6_V_vsplat_R(0x7f + 30), lshift); - HVX_Vector mant = Q6_V_vand_VV(Q6_V_vsplat_R(0xFFFFFF00), normalized); - HVX_Vector ret = Q6_V_vmux_QVV(is_zero, vzero, Q6_Vw_vadd_VwVw(mant, vexp)); - return ret; -} - -static inline HVX_Vector Q6_Vsf_equals_Vw(HVX_Vector const in) -{ - return Q6_Vsf_equals_Vqf32(hvx_vec_i32_to_qf32(in)); -} -#endif - -static inline HVX_Vector hvx_vec_i16_from_hf_rnd_sat(HVX_Vector vin) { - // This looks complicated. - // Ideally should just be Q6_Vh_equals_Vhf(vin) - // but that instruction does not do proper rounding. - - // convert to qf32, multiplying by 1.0 in the process. - HVX_VectorPair v32 = Q6_Wqf32_vmpy_VhfVhf(vin, Q6_Vh_vsplat_R(0x3C00)); - - // 'in-range' values are +/32752. - // add 192K to it, convert to sf - HVX_Vector v192K = Q6_V_vsplat_R(0x48400000); - HVX_Vector vsf_0 = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_Vqf32Vsf(Q6_V_lo_W(v32), v192K)); - HVX_Vector vsf_1 = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_Vqf32Vsf(Q6_V_hi_W(v32), v192K)); - - // for in-range cases, result is {163858... 229360} so the exponent is always 144. - // if we extract bits 21..0 as a signed quantity, and round 6 bits off, that will be the answer. - // Start by <<10 to get the final 'sign' bit in bit 15... - vsf_0 = Q6_Vw_vasl_VwR(vsf_0, 10); - vsf_1 = Q6_Vw_vasl_VwR(vsf_1, 10); - - // now round down to 16 - return Q6_Vh_vround_VwVw_sat(vsf_1, vsf_0); -} - -#endif /* HVX_BASE_H */ diff --git a/ggml/src/ggml-hexagon/htp/hvx-copy.h b/ggml/src/ggml-hexagon/htp/hvx-copy.h deleted file mode 100644 index 6b617b7..0000000 --- a/ggml/src/ggml-hexagon/htp/hvx-copy.h +++ /dev/null @@ -1,247 +0,0 @@ -#ifndef HVX_COPY_H -#define HVX_COPY_H - -#include -#include -#include - -#include "hvx-base.h" - -#define hvx_splat_loop_body(dst_type, vec_store) \ - do { \ - dst_type * restrict vdst = (dst_type *) dst; \ - \ - uint32_t nvec = n / (128 / elem_size); \ - uint32_t nloe = n % (128 / elem_size); \ - \ - uint32_t i = 0; \ - \ - _Pragma("unroll(4)") \ - for (; i < nvec; i++) { \ - vdst[i] = src; \ - } \ - if (nloe) { \ - vec_store((void *) &vdst[i], nloe * elem_size, src); \ - } \ - } while(0) - -static inline void hvx_splat_a(uint8_t * restrict dst, HVX_Vector src, uint32_t n, uint32_t elem_size) { - assert((unsigned long) dst % 128 == 0); - hvx_splat_loop_body(HVX_Vector, hvx_vec_store_a); -} - -static inline void hvx_splat_u(uint8_t * restrict dst, HVX_Vector src, uint32_t n, uint32_t elem_size) { - hvx_splat_loop_body(HVX_UVector, hvx_vec_store_u); -} - -static inline void hvx_splat_f32_a(uint8_t * restrict dst, float v, uint32_t n) { - hvx_splat_a(dst, hvx_vec_splat_f32(v), n, sizeof(float)); -} - -static inline void hvx_splat_f32_u(uint8_t * restrict dst, float v, uint32_t n) { - hvx_splat_u(dst, hvx_vec_splat_f32(v), n, sizeof(float)); -} - -static inline void hvx_splat_f16_a(uint8_t * restrict dst, float v, uint32_t n) { - hvx_splat_u(dst, hvx_vec_splat_f16(v), n, sizeof(__fp16)); -} - -static inline void hvx_splat_f16_u(uint8_t * restrict dst, float v, uint32_t n) { - hvx_splat_u(dst, hvx_vec_splat_f16(v), n, sizeof(__fp16)); -} - -#define hvx_copy_loop_body(dst_type, src_type, vec_store) \ - do { \ - dst_type * restrict vdst = (dst_type *) dst; \ - src_type * restrict vsrc = (src_type *) src; \ - \ - const uint32_t epv = 128 / elem_size; \ - const uint32_t nvec = n / epv; \ - const uint32_t nloe = n % epv; \ - \ - uint32_t i = 0; \ - \ - _Pragma("unroll(4)") \ - for (; i < nvec; i++) { vdst[i] = vsrc[i]; } \ - if (nloe) { \ - vec_store((void *) &vdst[i], nloe * elem_size, vsrc[i]); \ - } \ - } while(0) - -// Generic copy routines -static inline void hvx_copy_aa(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n, uint32_t elem_size) { - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src % 128 == 0); - hvx_copy_loop_body(HVX_Vector, HVX_Vector, hvx_vec_store_a); -} - -static inline void hvx_copy_au(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n, uint32_t elem_size) { - assert((unsigned long) dst % 128 == 0); - hvx_copy_loop_body(HVX_Vector, HVX_UVector, hvx_vec_store_a); -} - -static inline void hvx_copy_ua(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n, uint32_t elem_size) { - assert((unsigned long) src % 128 == 0); - hvx_copy_loop_body(HVX_UVector, HVX_Vector, hvx_vec_store_u); -} - -static inline void hvx_copy_uu(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n, uint32_t elem_size) { - hvx_copy_loop_body(HVX_UVector, HVX_UVector, hvx_vec_store_u); -} - -// copy n fp16 elements : source and destination are aligned to HVX Vector (128) -static inline void hvx_copy_f16_aa(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - hvx_copy_aa(dst, src, n, sizeof(__fp16)); -} - -// copy n fp16 elements : source is aligned, destination is potentially unaligned -static inline void hvx_copy_f16_au(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - hvx_copy_au(dst, src, n, sizeof(__fp16)); -} - -// copy n fp16 elements : source is aligned, destination is potentially unaligned -static inline void hvx_copy_f16_ua(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - hvx_copy_ua(dst, src, n, sizeof(__fp16)); -} - -// copy n fp16 elements : source is aligned, destination is potentially unaligned -static inline void hvx_copy_f16_uu(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - hvx_copy_uu(dst, src, n, sizeof(__fp16)); -} - -// copy n fp32 elements : source and destination are aligned to HVX Vector (128) -static inline void hvx_copy_f32_aa(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - hvx_copy_aa(dst, src, n, sizeof(float)); -} - -// copy n fp32 elements : source is aligned, destination is unaligned -static inline void hvx_copy_f32_ua(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - hvx_copy_ua(dst, src, n, sizeof(float)); -} - -// copy n fp32 elements : source is unaligned, destination is aligned -static inline void hvx_copy_f32_au(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - hvx_copy_au(dst, src, n, sizeof(float)); -} - -// copy n fp32 elements : source is unaligned, destination unaligned -static inline void hvx_copy_f32_uu(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - hvx_copy_uu(dst, src, n, sizeof(float)); -} - -//// fp32 -> fp16 - -#define hvx_copy_f16_f32_loop_body(dst_type, src_type, vec_store) \ - do { \ - dst_type * restrict vdst = (dst_type *) dst; \ - src_type * restrict vsrc = (src_type *) src; \ - \ - const HVX_Vector zero = Q6_V_vsplat_R(0); \ - \ - const uint32_t elem_size = sizeof(__fp16); \ - const uint32_t epv = 128 / elem_size; \ - const uint32_t nvec = n / epv; \ - const uint32_t nloe = n % epv; \ - \ - uint32_t i = 0; \ - \ - _Pragma("unroll(4)") \ - for (; i < nvec; i++) { \ - vdst[i] = hvx_vec_f32_to_f16(vsrc[i*2+0], vsrc[i*2+1]); \ - } \ - if (nloe) { \ - HVX_Vector v = hvx_vec_f32_to_f16(vsrc[i*2+0], vsrc[i*2+1]); \ - vec_store((void *) &vdst[i], nloe * elem_size, v); \ - } \ - } while(0) - -// copy/convert n fp32 elements into n fp16 elements : source is aligned, destination is aligned -static inline void hvx_copy_f16_f32_aa(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src % 128 == 0); - hvx_copy_f16_f32_loop_body(HVX_Vector, HVX_Vector, hvx_vec_store_a); -} - -// copy/convert n fp32 elements into n fp16 elements : source is unaligned, destination is aligned -static inline void hvx_copy_f16_f32_au(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - assert((unsigned long) dst % 128 == 0); - hvx_copy_f16_f32_loop_body(HVX_Vector, HVX_UVector, hvx_vec_store_a); -} - -// copy/convert n fp32 elements into n fp16 elements : source is aligned, destination is unaligned -static inline void hvx_copy_f16_f32_ua(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - assert((unsigned long) src % 128 == 0); - hvx_copy_f16_f32_loop_body(HVX_UVector, HVX_Vector, hvx_vec_store_u); -} - -// copy/convert n fp32 elements into n fp16 elements : source is unaligned, destination is unaligned -static inline void hvx_copy_f16_f32_uu(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - hvx_copy_f16_f32_loop_body(HVX_UVector, HVX_UVector, hvx_vec_store_u); -} - -//// fp16 -> fp32 - -#define hvx_copy_f32_f16_loop_body(dst_type, src_type, vec_store) \ - do { \ - dst_type * restrict vdst = (dst_type *) dst; \ - src_type * restrict vsrc = (src_type *) src; \ - \ - const HVX_Vector one = hvx_vec_splat_f16(1.0); \ - \ - const uint32_t elem_size = sizeof(__fp16); \ - const uint32_t epv = 128 / elem_size; \ - const uint32_t nvec = n / epv; \ - uint32_t nloe = n % epv; \ - \ - uint32_t i = 0; \ - \ - _Pragma("unroll(4)") \ - for (i = 0; i < nvec; ++i) { \ - HVX_VectorPair p = Q6_Wqf32_vmpy_VhfVhf(Q6_Vh_vshuff_Vh(vsrc[i]), one); \ - vdst[i*2] = Q6_Vsf_equals_Vqf32(Q6_V_lo_W(p)); \ - vdst[i*2+1] = Q6_Vsf_equals_Vqf32(Q6_V_hi_W(p)); \ - } \ - \ - if (nloe) { \ - HVX_VectorPair p = Q6_Wqf32_vmpy_VhfVhf(Q6_Vh_vshuff_Vh(vsrc[i]), one); \ - \ - HVX_Vector vd = Q6_V_lo_W(p); \ - i = 2 * i; \ - \ - if (nloe >= 32) { \ - vdst[i] = Q6_Vsf_equals_Vqf32(vd); \ - nloe -= 32; ++i; vd = Q6_V_hi_W(p); \ - } \ - \ - if (nloe) { \ - vd = Q6_Vsf_equals_Vqf32(vd); \ - hvx_vec_store_u(&vdst[i], nloe * sizeof(float), vd); \ - } \ - } \ - } while(0) - -// copy/convert n fp16 elements into n fp32 elements : source is aligned, destination is aligned -static inline void hvx_copy_f32_f16_aa(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src % 128 == 0); - hvx_copy_f32_f16_loop_body(HVX_Vector, HVX_Vector, hvx_vec_store_a); -} - -// copy/convert n fp16 elements into n fp32 elements : source is unaligned, destination is aligned -static inline void hvx_copy_f32_f16_au(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - assert((unsigned long) dst % 128 == 0); - hvx_copy_f32_f16_loop_body(HVX_Vector, HVX_UVector, hvx_vec_store_a); -} - -// copy/convert n fp16 elements into n fp32 elements : source is aligned, destination is unaligned -static inline void hvx_copy_f32_f16_ua(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - assert((unsigned long) src % 128 == 0); - hvx_copy_f32_f16_loop_body(HVX_UVector, HVX_Vector, hvx_vec_store_u); -} - -// copy/convert n fp16 elements into n fp32 elements : source is unaligned, destination is unaligned -static inline void hvx_copy_f32_f16_uu(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - hvx_copy_f32_f16_loop_body(HVX_UVector, HVX_UVector, hvx_vec_store_u); -} - -#endif // HVX_COPY_H diff --git a/ggml/src/ggml-hexagon/htp/hvx-dump.h b/ggml/src/ggml-hexagon/htp/hvx-dump.h deleted file mode 100644 index e882227..0000000 --- a/ggml/src/ggml-hexagon/htp/hvx-dump.h +++ /dev/null @@ -1,132 +0,0 @@ -#ifndef HVX_DUMP_H -#define HVX_DUMP_H - -#include - -#include -#include - -#include "hex-utils.h" -#include "hvx-types.h" - -static void hvx_vec_dump_f16_n(char * pref, HVX_Vector v, uint32_t n) { - HVX_VectorAlias u = { .v = v }; - - const uint32_t n0 = n / 16; - const uint32_t n1 = n % 16; - int i = 0; - for (; i < n0; i++) { - hex_dump_f16_line(pref, u.fp16 + (16 * i), 16); - } - if (n1) { - hex_dump_f16_line(pref, u.fp16 + (16 * i), n1); - } -} - -static void hvx_vec_dump_f16(char * pref, HVX_Vector v) { - hvx_vec_dump_f16_n(pref, v, 64); -} - -static void hvx_vec_dump_f32_n(char * pref, HVX_Vector v, uint32_t n) { - union { - HVX_Vector v; - float d[32]; - } u = { .v = v }; - - const uint32_t n0 = n / 16; - const uint32_t n1 = n % 16; - int i = 0; - for (; i < n0; i++) { - hex_dump_f32_line(pref, u.d + (16 * i), 16); - } - if (n1) { - hex_dump_f32_line(pref, u.d + (16 * i), n1); - } -} - -static void hvx_vec_dump_f32_hmt(char * pref, HVX_Vector v) { - union { - HVX_Vector v; - float d[32]; - } u = { .v = v }; - - FARF(HIGH, "%s: %.6f %.6f %.6f %.6f ... %.6f %.6f %.6f %.6f ... %.6f %.6f %.6f %.6f\n", pref, u.d[0], u.d[1], - u.d[2], u.d[3], u.d[12], u.d[13], u.d[14], u.d[15], u.d[28], u.d[29], u.d[30], u.d[31]); -} - -static void hvx_vec_dump_f32(char * pref, HVX_Vector v) { - hvx_vec_dump_f32_n(pref, v, 32); -} - -static void hvx_vec_dump_int32(char * pref, HVX_Vector v) { - union { - HVX_Vector v; - int32_t d[32]; - } u = { .v = v }; - - for (int i = 0; i < 32 / 16; i++) { - hex_dump_int32_line(pref, u.d + (16 * i), 16); - } -} - -static void hvx_vec_dump_int32_hmt(char * pref, HVX_Vector v) { - union { - HVX_Vector v; - int32_t d[32]; - } u = { .v = v }; - - FARF(HIGH, "%s: %d %d %d %d ... %d %d %d %d ... %d %d %d %d\n", pref, u.d[0], u.d[1], u.d[2], u.d[3], u.d[12], - u.d[13], u.d[14], u.d[15], u.d[28], u.d[29], u.d[30], u.d[31]); -} - -static void hvx_vec_dump_int8_hmt(char * pref, HVX_Vector v) { - union { - HVX_Vector v; - int8_t d[128]; - } u = { .v = v }; - - FARF(HIGH, "%s: %d %d %d %d ... %d %d %d %d ... %d %d %d %d\n", pref, u.d[0], u.d[1], u.d[2], u.d[3], u.d[60], - u.d[61], u.d[62], u.d[63], u.d[124], u.d[125], u.d[126], u.d[127]); -} - -static void hvx_vec_dump_int8(char * pref, HVX_Vector v) { - union { - HVX_Vector v; - int8_t d[128]; - } u = { .v = v }; - - for (int i = 0; i < 128 / 16; i++) { - hex_dump_int8_line(pref, u.d + (16 * i), 16); - } -} - -static void hvx_vec_dump_uint8(char * pref, HVX_Vector v) { - union { - HVX_Vector v; - uint8_t d[128]; - } u = { .v = v }; - - for (int i = 0; i < 128 / 16; i++) { - hex_dump_uint8_line(pref, u.d + (16 * i), 16); - } -} - -static bool hvx_vec_eq(HVX_Vector v0, HVX_Vector v1, size_t n) { - typedef union { - HVX_Vector v; - int8_t d[128]; - } U; - - U u0 = { .v = v0 }; - U u1 = { .v = v1 }; - - for (int i = 0; i < n; i++) { - if (u0.d[i] != u1.d[i]) { - return false; - } - } - - return true; -} - -#endif /* HVX_DUMP_H */ diff --git a/ggml/src/ggml-hexagon/htp/hvx-exp.c b/ggml/src/ggml-hexagon/htp/hvx-exp.c new file mode 100644 index 0000000..21bf46a --- /dev/null +++ b/ggml/src/ggml-hexagon/htp/hvx-exp.c @@ -0,0 +1,94 @@ +#pragma clang diagnostic ignored "-Wunused-variable" +#pragma clang diagnostic ignored "-Wunused-function" +#pragma clang diagnostic ignored "-Wunused-but-set-variable" + +#include +#include +#include +#include + +#define GGML_COMMON_DECL_C +#include "ggml-common.h" +#include "htp-ctx.h" +#include "htp-dma.h" +#include "htp-msg.h" +#include "htp-ops.h" +#include "hvx-utils.h" +#include "ops-utils.h" + +static inline HVX_Vector hvx_vec_exp_fp32_guard(HVX_Vector in_vec, HVX_Vector max_exp, HVX_Vector inf) { + const HVX_VectorPred pred0 = Q6_Q_vcmp_gt_VsfVsf(in_vec, max_exp); + + HVX_Vector out = hvx_vec_exp_fp32(in_vec); + + return Q6_V_vmux_QVV(pred0, inf, out); +} + +void hvx_exp_f32(const uint8_t * restrict src, uint8_t * restrict dst, const int num_elems, bool negate) { + int left_over = num_elems & (VLEN_FP32 - 1); + int num_elems_whole = num_elems - left_over; + + int unaligned_addr = 0; + int unaligned_loop = 0; + if ((0 == htp_is_aligned((void *) src, VLEN)) || (0 == htp_is_aligned((void *) dst, VLEN))) { + FARF(HIGH, "hvx_exp_f32: unaligned address in hvx op, possibly slower execution\n"); + unaligned_addr = 1; + } + // assert((0 == unaligned_addr) || (0 == num_elems_whole)); + if ((1 == unaligned_addr) && (num_elems_whole != 0)) { + unaligned_loop = 1; + FARF(HIGH, "hvx_exp_f32: unaligned loop in hvx op, possibly slower execution\n"); + } + + HVX_Vector vec_out = Q6_V_vzero(); + + static const float kInf = INFINITY; + static const float kMaxExp = 88.02f; // log(INF) + + const HVX_Vector max_exp = hvx_vec_splat_fp32(kMaxExp); + const HVX_Vector inf = hvx_vec_splat_fp32(kInf); + + if (0 == unaligned_loop) { + HVX_Vector * p_vec_in1 = (HVX_Vector *) src; + HVX_Vector * p_vec_out = (HVX_Vector *) dst; + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + if (true == negate) { + HVX_Vector neg_vec_in = hvx_vec_neg_fp32(*p_vec_in1++); + *p_vec_out++ = hvx_vec_exp_fp32_guard(neg_vec_in, max_exp, inf); + } else { + *p_vec_out++ = hvx_vec_exp_fp32_guard(*p_vec_in1++, max_exp, inf); + } + } + } else { + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector in = *(HVX_UVector *) (src + i * SIZEOF_FP32); + + if (true == negate) { + HVX_Vector neg_vec_in = hvx_vec_neg_fp32(in); + *(HVX_UVector *) (dst + i * SIZEOF_FP32) = hvx_vec_exp_fp32_guard(neg_vec_in, max_exp, inf); + } else { + *(HVX_UVector *) (dst + i * SIZEOF_FP32) = hvx_vec_exp_fp32_guard(in, max_exp, inf); + } + } + } + + if (left_over > 0) { + const float * srcf = (float *) src + num_elems_whole; + float * dstf = (float *) dst + num_elems_whole; + + HVX_Vector in = *(HVX_UVector *) srcf; + + if (true == negate) { + HVX_Vector neg_vec_in = hvx_vec_neg_fp32(in); + + vec_out = hvx_vec_exp_fp32_guard(neg_vec_in, max_exp, inf); + } else { + vec_out = hvx_vec_exp_fp32_guard(in, max_exp, inf); + } + + hvx_vec_store_u((void *) dstf, left_over * SIZEOF_FP32, vec_out); + } +} diff --git a/ggml/src/ggml-hexagon/htp/hvx-exp.h b/ggml/src/ggml-hexagon/htp/hvx-exp.h deleted file mode 100644 index 44dfe23..0000000 --- a/ggml/src/ggml-hexagon/htp/hvx-exp.h +++ /dev/null @@ -1,215 +0,0 @@ -#ifndef HVX_EXP_H -#define HVX_EXP_H - -#include -#include - -#include "hvx-base.h" -#include "hvx-floor.h" - -#define EXP_COEFF_5 (0x39506967) // 0.000198757 = 1/(7!) -#define EXP_COEFF_4 (0x3AB743CE) // 0.0013982 = 1/(6!) -#define EXP_COEFF_3 (0x3C088908) // 0.00833345 = 1/(5!) -#define EXP_COEFF_2 (0x3D2AA9C1) // 0.416658 = 1/(4!) -#define EXP_COEFF_1 (0x3E2AAAAA) // 0.16666667 = 1/(3!) -#define EXP_COEFF_0 (0x3F000000) // 0.5 = 1/(2!) -#define EXP_LOGN2 (0x3F317218) // ln(2) = 0.6931471805 -#define EXP_LOG2E (0x3FB8AA3B) // log2(e) = 1/ln(2) = 1.4426950408 -#define EXP_ONE (0x3f800000) // 1.0 -#define EXP_RANGE_R (0x41a00000) // 20.0 -#define EXP_RANGE_L (0xc1a00000) // -20.0 - -static inline HVX_Vector hvx_vec_exp_f32(HVX_Vector in_vec) { - HVX_Vector z_qf32_v; - HVX_Vector x_v; - HVX_Vector x_qf32_v; - HVX_Vector y_v; - HVX_Vector k_v; - HVX_Vector f_v; - HVX_Vector epsilon_v; - HVX_Vector log2e = Q6_V_vsplat_R(EXP_LOG2E); - HVX_Vector logn2 = Q6_V_vsplat_R(EXP_LOGN2); - HVX_Vector E_const; - HVX_Vector zero_v = Q6_V_vzero(); - - // exp(x) is approximated as follows: - // f = floor(x/ln(2)) = floor(x*log2(e)) - // epsilon = x - f*ln(2) - // exp(x) = exp(epsilon+f*ln(2)) - // = exp(epsilon)*exp(f*ln(2)) - // = exp(epsilon)*2^f - // - // Since epsilon is close to zero, it can be approximated with its Taylor series: - // exp(x) ~= 1+x+x^2/2!+x^3/3!+...+x^n/n!+... - // Preserving the first eight elements, we get: - // exp(x) ~= 1+x+e0*x^2+e1*x^3+e2*x^4+e3*x^5+e4*x^6+e5*x^7 - // = 1+x+(E0+(E1+(E2+(E3+(E4+E5*x)*x)*x)*x)*x)*x^2 - - HVX_Vector temp_v = in_vec; - - // Clamp inputs to (-20.0, 20.0) - HVX_VectorPred pred_cap_right = Q6_Q_vcmp_gt_VsfVsf(in_vec, Q6_V_vsplat_R(EXP_RANGE_R)); - HVX_VectorPred pred_cap_left = Q6_Q_vcmp_gt_VsfVsf(Q6_V_vsplat_R(EXP_RANGE_L), in_vec); - - in_vec = Q6_V_vmux_QVV(pred_cap_right, Q6_V_vsplat_R(EXP_RANGE_R), temp_v); - in_vec = Q6_V_vmux_QVV(pred_cap_left, Q6_V_vsplat_R(EXP_RANGE_L), temp_v); - - epsilon_v = Q6_Vqf32_vmpy_VsfVsf(log2e, in_vec); - epsilon_v = Q6_Vsf_equals_Vqf32(epsilon_v); - - // f_v is the floating point result and k_v is the integer result - f_v = hvx_vec_floor_f32(epsilon_v); - k_v = hvx_vec_truncate_f32(f_v); - - x_qf32_v = Q6_Vqf32_vadd_VsfVsf(in_vec, zero_v); - - // x = x - f_v * logn2; - epsilon_v = Q6_Vqf32_vmpy_VsfVsf(f_v, logn2); - x_qf32_v = Q6_Vqf32_vsub_Vqf32Vqf32(x_qf32_v, epsilon_v); - // normalize before every QFloat's vmpy - x_qf32_v = Q6_Vqf32_vadd_Vqf32Vsf(x_qf32_v, zero_v); - - // z = x * x; - z_qf32_v = Q6_Vqf32_vmpy_Vqf32Vqf32(x_qf32_v, x_qf32_v); - z_qf32_v = Q6_Vqf32_vadd_Vqf32Vsf(z_qf32_v, zero_v); - - x_v = Q6_Vsf_equals_Vqf32(x_qf32_v); - - // y = E4 + E5 * x; - E_const = Q6_V_vsplat_R(EXP_COEFF_5); - y_v = Q6_Vqf32_vmpy_VsfVsf(E_const, x_v); - E_const = Q6_V_vsplat_R(EXP_COEFF_4); - y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, E_const); - y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, zero_v); - - // y = E3 + y * x; - E_const = Q6_V_vsplat_R(EXP_COEFF_3); - y_v = Q6_Vqf32_vmpy_Vqf32Vqf32(y_v, x_qf32_v); - y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, E_const); - y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, zero_v); - - // y = E2 + y * x; - E_const = Q6_V_vsplat_R(EXP_COEFF_2); - y_v = Q6_Vqf32_vmpy_Vqf32Vqf32(y_v, x_qf32_v); - y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, E_const); - y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, zero_v); - - // y = E1 + y * x; - E_const = Q6_V_vsplat_R(EXP_COEFF_1); - y_v = Q6_Vqf32_vmpy_Vqf32Vqf32(y_v, x_qf32_v); - y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, E_const); - y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, zero_v); - - // y = E0 + y * x; - E_const = Q6_V_vsplat_R(EXP_COEFF_0); - y_v = Q6_Vqf32_vmpy_Vqf32Vqf32(y_v, x_qf32_v); - y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, E_const); - y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, zero_v); - - // y = x + y * z; - y_v = Q6_Vqf32_vmpy_Vqf32Vqf32(y_v, z_qf32_v); - y_v = Q6_Vqf32_vadd_Vqf32Vqf32(y_v, x_qf32_v); - y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, zero_v); - - // y = y + 1.0; - y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, Q6_V_vsplat_R(EXP_ONE)); - - // insert exponents - // y = ldexpf(y, k); - // y_v += k_v; // qf32 - // modify exponent - - y_v = Q6_Vsf_equals_Vqf32(y_v); - - // add k_v to the exponent of y_v - HVX_Vector y_v_exponent = Q6_Vw_vasl_VwR(y_v, 1); - - y_v_exponent = Q6_Vuw_vlsr_VuwR(y_v_exponent, IEEE_VSF_MANTLEN + 1); - y_v_exponent = Q6_Vw_vadd_VwVw(k_v, y_v_exponent); - - // exponent cannot be negative; if overflow is detected, result is set to zero - HVX_VectorPred qy_v_negative_exponent = Q6_Q_vcmp_gt_VwVw(zero_v, y_v_exponent); - - y_v = Q6_Vw_vaslacc_VwVwR(y_v, k_v, IEEE_VSF_MANTLEN); - - y_v = Q6_V_vmux_QVV(qy_v_negative_exponent, zero_v, y_v); - - return y_v; -} - -static inline HVX_Vector hvx_vec_exp_f32_guard(HVX_Vector in_vec, HVX_Vector max_exp, HVX_Vector inf) { - const HVX_VectorPred pred0 = Q6_Q_vcmp_gt_VsfVsf(in_vec, max_exp); - - HVX_Vector out = hvx_vec_exp_f32(in_vec); - - return Q6_V_vmux_QVV(pred0, inf, out); -} - -static inline void hvx_exp_f32(const uint8_t * restrict src, uint8_t * restrict dst, const int num_elems, bool negate) { - int left_over = num_elems & (VLEN_FP32 - 1); - int num_elems_whole = num_elems - left_over; - - int unaligned_addr = 0; - int unaligned_loop = 0; - if ((0 == hex_is_aligned((void *) src, VLEN)) || (0 == hex_is_aligned((void *) dst, VLEN))) { - unaligned_addr = 1; - } - // assert((0 == unaligned_addr) || (0 == num_elems_whole)); - if ((1 == unaligned_addr) && (num_elems_whole != 0)) { - unaligned_loop = 1; - } - - HVX_Vector vec_out = Q6_V_vzero(); - - static const float kInf = INFINITY; - static const float kMaxExp = 88.02f; // log(INF) - - const HVX_Vector max_exp = hvx_vec_splat_f32(kMaxExp); - const HVX_Vector inf = hvx_vec_splat_f32(kInf); - - if (0 == unaligned_loop) { - HVX_Vector * p_vec_in1 = (HVX_Vector *) src; - HVX_Vector * p_vec_out = (HVX_Vector *) dst; - - #pragma unroll(4) - for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { - if (true == negate) { - HVX_Vector neg_vec_in = hvx_vec_neg_f32(*p_vec_in1++); - *p_vec_out++ = hvx_vec_exp_f32_guard(neg_vec_in, max_exp, inf); - } else { - *p_vec_out++ = hvx_vec_exp_f32_guard(*p_vec_in1++, max_exp, inf); - } - } - } else { - #pragma unroll(4) - for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { - HVX_Vector in = *(HVX_UVector *) (src + i * SIZEOF_FP32); - - if (true == negate) { - HVX_Vector neg_vec_in = hvx_vec_neg_f32(in); - *(HVX_UVector *) (dst + i * SIZEOF_FP32) = hvx_vec_exp_f32_guard(neg_vec_in, max_exp, inf); - } else { - *(HVX_UVector *) (dst + i * SIZEOF_FP32) = hvx_vec_exp_f32_guard(in, max_exp, inf); - } - } - } - - if (left_over > 0) { - const float * srcf = (float *) src + num_elems_whole; - float * dstf = (float *) dst + num_elems_whole; - - HVX_Vector in = *(HVX_UVector *) srcf; - - if (true == negate) { - HVX_Vector neg_vec_in = hvx_vec_neg_f32(in); - - vec_out = hvx_vec_exp_f32_guard(neg_vec_in, max_exp, inf); - } else { - vec_out = hvx_vec_exp_f32_guard(in, max_exp, inf); - } - - hvx_vec_store_u((void *) dstf, left_over * SIZEOF_FP32, vec_out); - } -} - -#endif /* HVX_EXP_H */ diff --git a/ggml/src/ggml-hexagon/htp/hvx-floor.h b/ggml/src/ggml-hexagon/htp/hvx-floor.h deleted file mode 100644 index 6a1bfde..0000000 --- a/ggml/src/ggml-hexagon/htp/hvx-floor.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef HVX_FLOOR_H -#define HVX_FLOOR_H - -#include -#include - -#include "hvx-base.h" - -#define IEEE_VSF_EXPLEN (8) -#define IEEE_VSF_EXPBIAS (127) -#define IEEE_VSF_EXPMASK (0xFF) -#define IEEE_VSF_MANTLEN (23) -#define IEEE_VSF_MANTMASK (0x7FFFFF) -#define IEEE_VSF_MIMPMASK (0x800000) - -static inline HVX_Vector hvx_vec_truncate_f32(HVX_Vector in_vec) { - HVX_Vector mask_mant_v = Q6_V_vsplat_R(IEEE_VSF_MANTMASK); - HVX_Vector mask_impl_v = Q6_V_vsplat_R(IEEE_VSF_MIMPMASK); - HVX_Vector const_zero_v = Q6_V_vzero(); - - HVX_VectorPred q_negative = Q6_Q_vcmp_gt_VwVw(const_zero_v, in_vec); - - HVX_Vector expval_v = in_vec >> IEEE_VSF_MANTLEN; - expval_v &= IEEE_VSF_EXPMASK; - expval_v -= IEEE_VSF_EXPBIAS; - - // negative exp == fractional value - HVX_VectorPred q_negexp = Q6_Q_vcmp_gt_VwVw(const_zero_v, expval_v); - - HVX_Vector rshift_v = IEEE_VSF_MANTLEN - expval_v; // fractional bits - exp shift - - HVX_Vector mant_v = in_vec & mask_mant_v; // obtain mantissa - HVX_Vector vout = Q6_Vw_vadd_VwVw(mant_v, mask_impl_v); // add implicit 1.0 - - vout = Q6_Vw_vasr_VwVw(vout, rshift_v); // shift to obtain truncated integer - vout = Q6_V_vmux_QVV(q_negexp, const_zero_v, vout); // expval<0 -> 0 - - HVX_Vector neg_vout = -vout; - - vout = Q6_V_vmux_QVV(q_negative, neg_vout, vout); // handle negatives - - return (vout); -} - -static inline HVX_Vector hvx_vec_floor_f32(HVX_Vector in_vec) { - HVX_Vector mask_mant_v = Q6_V_vsplat_R(IEEE_VSF_MANTMASK); - HVX_Vector mask_impl_v = Q6_V_vsplat_R(IEEE_VSF_MIMPMASK); - HVX_Vector const_mnlen_v = Q6_V_vsplat_R(IEEE_VSF_MANTLEN); - HVX_Vector const_zero_v = Q6_V_vzero(); - HVX_Vector const_negone_v = Q6_V_vsplat_R(0xbf800000); // -1 IEEE vsf - - HVX_VectorPred q_negative = Q6_Q_vcmp_gt_VwVw(const_zero_v, in_vec); - - HVX_Vector expval_v = in_vec >> IEEE_VSF_MANTLEN; - expval_v &= IEEE_VSF_EXPMASK; - expval_v -= IEEE_VSF_EXPBIAS; - - HVX_VectorPred q_negexp = Q6_Q_vcmp_gt_VwVw(const_zero_v, expval_v); - HVX_VectorPred q_expltmn = Q6_Q_vcmp_gt_VwVw(const_mnlen_v, expval_v); - HVX_VectorPred q_negexp_pos = Q6_Q_vcmp_gtand_QVwVw(q_negexp, in_vec, const_zero_v); - HVX_VectorPred q_negexp_neg = Q6_Q_vcmp_gtand_QVwVw(q_negexp, const_zero_v, in_vec); - - // if expval < 0 (q_negexp) // <0, floor is 0 - // if vin > 0 - // floor = 0 - // if vin < 0 - // floor = -1 - // if expval < mant_len (q_expltmn) // >0, but fraction may exist - // get sign (q_negative) - // mask >> expval // fraction bits to mask off - // vout = ~(mask) // apply mask to remove fraction - // if (qneg) // negative floor is one less (more, sign bit for neg) - // vout += ((impl_mask) >> expval) - // if (mask && vin) - // vout = vin - // else // already an integer - // ; // no change - - // compute floor - mask_mant_v >>= expval_v; - HVX_Vector neg_addin_v = mask_impl_v >> expval_v; - HVX_Vector vout_neg_addin = Q6_Vw_vadd_VwVw(in_vec, neg_addin_v); - HVX_Vector vout = Q6_V_vmux_QVV(q_negative, vout_neg_addin, in_vec); - - HVX_Vector mask_chk_v = Q6_V_vand_VV(in_vec, mask_mant_v); // chk if bits set - HVX_VectorPred q_integral = Q6_Q_vcmp_eq_VwVw(const_zero_v, mask_chk_v); - - HVX_Vector not_mask_v = Q6_V_vnot_V(mask_mant_v); // frac bits to clear - HVX_Vector vfrfloor_v = Q6_V_vand_VV(vout, not_mask_v); // clear frac bits - - vout = in_vec; - vout = Q6_V_vmux_QVV(q_expltmn, vfrfloor_v, vout); // expval0 -> 0 - vout = Q6_V_vmux_QVV(q_negexp_neg, const_negone_v, vout); // expval<0 x<0 -> -1 - - return vout; -} - -#endif /* HVX_FLOOR_H */ diff --git a/ggml/src/ggml-hexagon/htp/hvx-inverse.c b/ggml/src/ggml-hexagon/htp/hvx-inverse.c new file mode 100644 index 0000000..4d70634 --- /dev/null +++ b/ggml/src/ggml-hexagon/htp/hvx-inverse.c @@ -0,0 +1,72 @@ +#pragma clang diagnostic ignored "-Wunused-variable" +#pragma clang diagnostic ignored "-Wunused-function" +#pragma clang diagnostic ignored "-Wunused-but-set-variable" + +#include +#include +#include +#include + +#define GGML_COMMON_DECL_C +#include "ggml-common.h" +#include "htp-ctx.h" +#include "htp-dma.h" +#include "htp-msg.h" +#include "htp-ops.h" +#include "hvx-utils.h" +#include "ops-utils.h" + +static inline HVX_Vector hvx_vec_inverse_fp32_guard(HVX_Vector v_sf, HVX_Vector nan_inf_mask) { + HVX_Vector out = hvx_vec_inverse_fp32(v_sf); + + HVX_Vector masked_out = Q6_V_vand_VV(out, nan_inf_mask); + const HVX_VectorPred pred = Q6_Q_vcmp_eq_VwVw(nan_inf_mask, masked_out); + + return Q6_V_vmux_QVV(pred, Q6_V_vzero(), out); +} + +void hvx_inverse_f32(const uint8_t * restrict src, uint8_t * restrict dst, const int num_elems) { + int left_over = num_elems & (VLEN_FP32 - 1); + int num_elems_whole = num_elems - left_over; + + int unaligned_addr = 0; + int unaligned_loop = 0; + if ((0 == htp_is_aligned((void *) src, VLEN)) || (0 == htp_is_aligned((void *) dst, VLEN))) { + FARF(HIGH, "hvx_inverse_f32: unaligned address in hvx op, possibly slower execution\n"); + unaligned_addr = 1; + } + // assert((0 == unaligned_addr) || (0 == num_elems_whole)); + if ((1 == unaligned_addr) && (num_elems_whole != 0)) { + unaligned_loop = 1; + FARF(HIGH, "hvx_inverse_f32: unaligned loop in hvx op, possibly slower execution\n"); + } + + static const uint32_t kNanInfMask = 0x7f800000; + const HVX_Vector nan_inf_mask = Q6_V_vsplat_R(kNanInfMask); + + if (0 == unaligned_loop) { + HVX_Vector * p_vec_in = (HVX_Vector *) src; + HVX_Vector * p_vec_out = (HVX_Vector *) dst; + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + *p_vec_out++ = hvx_vec_inverse_fp32_guard(*p_vec_in++, nan_inf_mask); + } + } else { + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector in = *(HVX_UVector *) (src + i * SIZEOF_FP32); + *(HVX_UVector *) (dst + i * SIZEOF_FP32) = hvx_vec_inverse_fp32_guard(in, nan_inf_mask); + } + } + + if (left_over > 0) { + const float * srcf = (float *) src + num_elems_whole; + float * dstf = (float *) dst + num_elems_whole; + + HVX_Vector in = *(HVX_UVector *) srcf; + HVX_Vector out = hvx_vec_inverse_fp32_guard(in, nan_inf_mask); + + hvx_vec_store_u((void *) dstf, left_over * SIZEOF_FP32, out); + } +} diff --git a/ggml/src/ggml-hexagon/htp/hvx-inverse.h b/ggml/src/ggml-hexagon/htp/hvx-inverse.h deleted file mode 100644 index 49f3efa..0000000 --- a/ggml/src/ggml-hexagon/htp/hvx-inverse.h +++ /dev/null @@ -1,176 +0,0 @@ -#ifndef HVX_INVERSE_H -#define HVX_INVERSE_H - -#include - -#include -#include -#include -#include -#include - -#include "hvx-base.h" - -// ==================================================== -// FUNCTION: 1/(x+1) y(0) = 1, y(0.5) = 0.6667, y(1) = 0.5 -// Order:3; continuity: True; Ends forced: True -// Mode: unsigned; Result fractional bits: 14 -// Peak Error: 1.1295e-04 Rms Error: 2.8410e-05 Mean Error: 1.1370e-05 -// 32769 -32706 31252 -10589 -// 32590 -30635 22793 -4493 -// 32066 -27505 16481 -2348 -// 31205 -24054 11849 -1306 - -static inline HVX_Vector hvx_vec_recip_xp1_O3_unsigned(HVX_Vector vx) { - // input is 0..0xffff representing 0.0 .. 1.0 - HVX_Vector p; - p = Q6_Vh_vlut4_VuhPh(vx, 0xFAE6F6D4EE73D6A3ull); - p = Q6_Vh_vmpa_VhVhVuhPuh_sat(p, vx, 0x2E49406159097A14ull); - p = Q6_Vh_vmps_VhVhVuhPuh_sat(p, vx, 0x5DF66B7177AB7FC2ull); - p = Q6_Vh_vmpa_VhVhVuhPuh_sat(p, vx, 0x79E57D427F4E8001ull); - return p; // signed result, 14 fractional bits -} - -// Find reciprocal of fp16. -// (1) first, convert to fp32, multiplying by 1.0; this is done to -// handle denormals. Ignoring sign and zero, result should be at -// least 5.9604645e-08 (32-bit code 0x33800000) and at most 131008 (0x47ffe000) -// (exponent in range [103,143]) -// (2) extract the mantissa into 16-bit unsigned; find reciprocal using a fitted poly -// (3) put this, along with '253-exp' (exp from (1)) together to make an qf32 -// (4) convert that to fp16 -// (5) put sign back in. Also, if the original value (w/o sign) was <0x81, replace -// the result with the max value. -static inline HVX_Vector hvx_vec_inverse_f16(HVX_Vector vals) { - HVX_Vector em_mask = Q6_Vh_vsplat_R(0x7FFF); - HVX_Vector avals = Q6_V_vand_VV(vals, em_mask); - HVX_VectorPred is_neg = Q6_Q_vcmp_gt_VhVh(avals, vals); - // is too small to 1/x ? for 'standard' fp16, this would be 0x101 - HVX_VectorPred is_small = Q6_Q_vcmp_gt_VhVh(Q6_Vh_vsplat_R(0x101), avals); - - HVX_VectorPair to_qf32 = Q6_Wqf32_vmpy_VhfVhf(avals, Q6_Vh_vsplat_R(0x3C00)); // *1.0 - HVX_Vector to_f32_0 = Q6_Vsf_equals_Vqf32(Q6_V_lo_W(to_qf32)); - HVX_Vector to_f32_1 = Q6_Vsf_equals_Vqf32(Q6_V_hi_W(to_qf32)); - - // bits 22..13 contain the mantissa now (w/o hidden bit); move to bit 14..5 of a 16-bit vector - HVX_Vector mant_u16 = Q6_Vh_vshuffo_VhVh(Q6_Vw_vasl_VwR(to_f32_1, 9), Q6_Vw_vasl_VwR(to_f32_0, 9)); - // likewise extract the upper 16 from each, containing the exponents in range 103..142 - HVX_Vector exp_u16 = Q6_Vh_vshuffo_VhVh(to_f32_1, to_f32_0); - //Get exponent in IEEE 32-bit representation - exp_u16 = Q6_Vuh_vlsr_VuhR(exp_u16, 7); - - // so, mant_u16 contains an unbiased mantissa in upper 10 bits of each u16 lane - // We can consider it to be x-1.0, with 16 fractional bits, where 'x' is in range [1.0,2.0) - // Use poly to transform to 1/x, with 14 fractional bits - // - HVX_Vector rm = hvx_vec_recip_xp1_O3_unsigned(mant_u16); - - HVX_Vector vcl0 = Q6_Vuh_vcl0_Vuh(rm); //count leading zeros - - // Get mantissa for 16-bit represenation - HVX_Vector mant_recip = Q6_V_vand_VV(Q6_Vh_vasr_VhR(Q6_Vh_vasl_VhVh(rm, vcl0), 5), Q6_Vh_vsplat_R(0x03FF)); - - //Compute Reciprocal Exponent - HVX_Vector exp_recip = - Q6_Vh_vsub_VhVh(Q6_Vh_vsub_VhVh(Q6_Vh_vsplat_R(254), exp_u16), Q6_Vh_vsub_VhVh(vcl0, Q6_Vh_vsplat_R(1))); - //Convert it for 16-bit representation - exp_recip = Q6_Vh_vadd_VhVh_sat(Q6_Vh_vsub_VhVh(exp_recip, Q6_Vh_vsplat_R(127)), Q6_Vh_vsplat_R(15)); - exp_recip = Q6_Vh_vasl_VhR(exp_recip, 10); - - //Merge exponent and mantissa for reciprocal - HVX_Vector recip = Q6_V_vor_VV(exp_recip, mant_recip); - // map 'small' inputs to standard largest value 0x7bff - recip = Q6_V_vmux_QVV(is_small, Q6_Vh_vsplat_R(0x7bff), recip); - // add sign back - recip = Q6_V_vandor_VQR(recip, is_neg, 0x80008000); - return recip; -} - -static inline HVX_Vector hvx_vec_inverse_f32(HVX_Vector v_sf) { - HVX_Vector inv_aprox_sf = Q6_V_vsplat_R(0x7EEEEBB3); - HVX_Vector two_sf = hvx_vec_splat_f32(2.0); - - // First approximation - HVX_Vector i_sf = Q6_Vw_vsub_VwVw(inv_aprox_sf, v_sf); - - HVX_Vector r_qf; - - // Refine - r_qf = Q6_Vqf32_vmpy_VsfVsf( - i_sf, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vsub_VsfVsf(two_sf, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(i_sf, v_sf))))); - r_qf = Q6_Vqf32_vmpy_Vqf32Vqf32( - r_qf, Q6_Vqf32_vsub_VsfVsf(two_sf, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(r_qf), v_sf)))); - r_qf = Q6_Vqf32_vmpy_Vqf32Vqf32( - r_qf, Q6_Vqf32_vsub_VsfVsf(two_sf, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(r_qf), v_sf)))); - - return Q6_Vsf_equals_Vqf32(r_qf); -} - -static inline HVX_Vector hvx_vec_inverse_f32_guard(HVX_Vector v_sf, HVX_Vector nan_inf_mask) { - HVX_Vector out = hvx_vec_inverse_f32(v_sf); - - HVX_Vector masked_out = Q6_V_vand_VV(out, nan_inf_mask); - const HVX_VectorPred pred = Q6_Q_vcmp_eq_VwVw(nan_inf_mask, masked_out); - - return Q6_V_vmux_QVV(pred, Q6_V_vzero(), out); -} - -#define hvx_inverse_f32_loop_body(dst_type, src_type, vec_store) \ - do { \ - dst_type * restrict vdst = (dst_type *) dst; \ - src_type * restrict vsrc = (src_type *) src; \ - \ - const HVX_Vector nan_inf_mask = Q6_V_vsplat_R(0x7f800000); \ - \ - const uint32_t nvec = n / VLEN_FP32; \ - const uint32_t nloe = n % VLEN_FP32; \ - \ - uint32_t i = 0; \ - \ - _Pragma("unroll(4)") \ - for (; i < nvec; i++) { \ - vdst[i] = hvx_vec_inverse_f32_guard(vsrc[i], nan_inf_mask); \ - } \ - if (nloe) { \ - HVX_Vector v = hvx_vec_inverse_f32_guard(vsrc[i], nan_inf_mask); \ - vec_store((void *) &vdst[i], nloe * SIZEOF_FP32, v); \ - } \ - } while(0) - -static inline void hvx_inverse_f32_aa(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src % 128 == 0); - hvx_inverse_f32_loop_body(HVX_Vector, HVX_Vector, hvx_vec_store_a); -} - -static inline void hvx_inverse_f32_au(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - assert((unsigned long) dst % 128 == 0); - hvx_inverse_f32_loop_body(HVX_Vector, HVX_UVector, hvx_vec_store_a); -} - -static inline void hvx_inverse_f32_ua(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - assert((unsigned long) src % 128 == 0); - hvx_inverse_f32_loop_body(HVX_UVector, HVX_Vector, hvx_vec_store_u); -} - -static inline void hvx_inverse_f32_uu(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - hvx_inverse_f32_loop_body(HVX_UVector, HVX_UVector, hvx_vec_store_u); -} - -static inline void hvx_inverse_f32(uint8_t * restrict dst, uint8_t * restrict src, const int num_elems) { - if ((unsigned long) dst % 128 == 0) { - if ((unsigned long) src % 128 == 0) { - hvx_inverse_f32_aa(dst, src, num_elems); - } else { - hvx_inverse_f32_au(dst, src, num_elems); - } - } else { - if ((unsigned long) src % 128 == 0) { - hvx_inverse_f32_ua(dst, src, num_elems); - } else { - hvx_inverse_f32_uu(dst, src, num_elems); - } - } -} - -#endif // HVX_INVERSE_H diff --git a/ggml/src/ggml-hexagon/htp/hvx-reduce.h b/ggml/src/ggml-hexagon/htp/hvx-reduce.h deleted file mode 100644 index 8845fe7..0000000 --- a/ggml/src/ggml-hexagon/htp/hvx-reduce.h +++ /dev/null @@ -1,225 +0,0 @@ -#ifndef HVX_REDUCE_H -#define HVX_REDUCE_H - -#include -#include -#include -#include - -#include "hex-utils.h" -#include "hvx-base.h" -#include "hvx-types.h" - -static inline HVX_Vector hvx_vec_reduce_sum_n_i32(HVX_Vector in, unsigned int n) { - unsigned int total = n * 4; // total vec nbytes - unsigned int width = 4; // int32 - - HVX_Vector sum = in, sum_t; - while (width < total) { - sum_t = Q6_V_vror_VR(sum, width); // rotate right - sum = Q6_Vw_vadd_VwVw(sum_t, sum); // elementwise sum - width = width << 1; - } - return sum; -} - -static inline HVX_Vector hvx_vec_reduce_sum_i32(HVX_Vector in) { - return hvx_vec_reduce_sum_n_i32(in, 32); -} - -static inline HVX_Vector hvx_vec_reduce_sum_n_qf32(HVX_Vector in, unsigned int n) { - unsigned int total = n * 4; // total vec nbytes - unsigned int width = 4; // fp32 nbytes - - HVX_Vector sum = in, sum_t; - while (width < total) { - sum_t = Q6_V_vror_VR(Q6_Vsf_equals_Vqf32(sum), width); // rotate right - sum = Q6_Vqf32_vadd_Vqf32Vsf(sum, sum_t); // elementwise sum - width = width << 1; - } - return sum; -} - -static inline HVX_Vector hvx_vec_reduce_sum_qf32(HVX_Vector in) { - return hvx_vec_reduce_sum_n_qf32(in, 32); -} - -static inline HVX_Vector hvx_vec_reduce_sum_n_f32(HVX_Vector in, unsigned int n) { - unsigned int total = n * 4; // total vec nbytes - unsigned int width = 4; // fp32 nbytes - - HVX_Vector sum = in, sum_t; - while (width < total) { - sum_t = Q6_V_vror_VR(sum, width); // rotate right - sum = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(sum, sum_t)); // elementwise sum - width = width << 1; - } - return sum; -} - -static inline HVX_Vector hvx_vec_reduce_sum_f32(HVX_Vector in) { - return hvx_vec_reduce_sum_n_f32(in, 32); -} - -static inline HVX_Vector hvx_vec_reduce_max_f16(HVX_Vector in) { - unsigned total = 128; // total vec nbytes - unsigned width = 2; // fp16 nbytes - - HVX_Vector _max = in, _max_t; - while (width < total) { - _max_t = Q6_V_vror_VR(_max, width); // rotate right - _max = Q6_Vhf_vmax_VhfVhf(_max_t, _max); // elementwise max - width = width << 1; - } - - return _max; -} - -static inline HVX_Vector hvx_vec_reduce_max2_f16(HVX_Vector in, HVX_Vector _max) { - unsigned total = 128; // total vec nbytes - unsigned width = 2; // fp32 nbytes - - HVX_Vector _max_t; - - _max = Q6_Vhf_vmax_VhfVhf(in, _max); - while (width < total) { - _max_t = Q6_V_vror_VR(_max, width); // rotate right - _max = Q6_Vhf_vmax_VhfVhf(_max_t, _max); // elementwise max - width = width << 1; - } - - return _max; -} - -static inline HVX_Vector hvx_vec_reduce_max_f32(HVX_Vector in) { - unsigned total = 128; // total vec nbytes - unsigned width = 4; // fp32 nbytes - - HVX_Vector _max = in, _max_t; - while (width < total) { - _max_t = Q6_V_vror_VR(_max, width); // rotate right - _max = Q6_Vsf_vmax_VsfVsf(_max_t, _max); // elementwise max - width = width << 1; - } - - return _max; -} - -static inline HVX_Vector hvx_vec_reduce_max2_f32(HVX_Vector in, HVX_Vector _max) { - unsigned total = 128; // total vec nbytes - unsigned width = 4; // fp32 nbytes - - HVX_Vector _max_t; - - _max = Q6_Vsf_vmax_VsfVsf(in, _max); - while (width < total) { - _max_t = Q6_V_vror_VR(_max, width); // rotate right - _max = Q6_Vsf_vmax_VsfVsf(_max_t, _max); // elementwise max - width = width << 1; - } - - return _max; -} - -#define hvx_reduce_loop_body(src_type, init_vec, pad_vec, vec_op, reduce_op, scalar_reduce) \ - do { \ - src_type * restrict vsrc = (src_type *) src; \ - HVX_Vector acc = init_vec; \ - \ - const uint32_t elem_size = sizeof(float); \ - const uint32_t epv = 128 / elem_size; \ - const uint32_t nvec = num_elems / epv; \ - const uint32_t nloe = num_elems % epv; \ - \ - uint32_t i = 0; \ - _Pragma("unroll(4)") \ - for (; i < nvec; i++) { \ - acc = vec_op(acc, vsrc[i]); \ - } \ - if (nloe) { \ - const float * srcf = (const float *) src + i * epv; \ - HVX_Vector in = *(HVX_UVector *) srcf; \ - HVX_Vector temp = Q6_V_valign_VVR(in, pad_vec, nloe * elem_size); \ - acc = vec_op(acc, temp); \ - } \ - HVX_Vector v = reduce_op(acc); \ - return scalar_reduce(v); \ - } while(0) - -#define HVX_REDUCE_MAX_OP(acc, val) Q6_Vsf_vmax_VsfVsf(acc, val) -#define HVX_REDUCE_SUM_OP(acc, val) Q6_Vqf32_vadd_VsfVsf(Q6_Vsf_equals_Vqf32(acc), val) -#define HVX_SUM_SQ_OP(acc, val) Q6_Vqf32_vadd_Vqf32Vqf32(acc, Q6_Vqf32_vmpy_VsfVsf(val, val)) -#define HVX_REDUCE_MAX_SCALAR(v) hvx_vec_get_f32(v) -#define HVX_REDUCE_SUM_SCALAR(v) hvx_vec_get_f32(Q6_Vsf_equals_Vqf32(v)) - -// Max variants - -static inline float hvx_reduce_max_f32_a(const uint8_t * restrict src, const int num_elems) { - HVX_Vector init_vec = hvx_vec_splat_f32(((const float *) src)[0]); - assert((unsigned long) src % 128 == 0); - hvx_reduce_loop_body(HVX_Vector, init_vec, init_vec, HVX_REDUCE_MAX_OP, hvx_vec_reduce_max_f32, HVX_REDUCE_MAX_SCALAR); -} - -static inline float hvx_reduce_max_f32_u(const uint8_t * restrict src, const int num_elems) { - HVX_Vector init_vec = hvx_vec_splat_f32(((const float *) src)[0]); - hvx_reduce_loop_body(HVX_UVector, init_vec, init_vec, HVX_REDUCE_MAX_OP, hvx_vec_reduce_max_f32, HVX_REDUCE_MAX_SCALAR); -} - -static inline float hvx_reduce_max_f32(const uint8_t * restrict src, const int num_elems) { - if (hex_is_aligned((void *) src, 128)) { - return hvx_reduce_max_f32_a(src, num_elems); - } else { - return hvx_reduce_max_f32_u(src, num_elems); - } -} - -// Sum variants - -static inline float hvx_reduce_sum_f32_a(const uint8_t * restrict src, const int num_elems) { - HVX_Vector init_vec = Q6_V_vsplat_R(0); - assert((unsigned long) src % 128 == 0); - hvx_reduce_loop_body(HVX_Vector, init_vec, init_vec, HVX_REDUCE_SUM_OP, hvx_vec_reduce_sum_qf32, HVX_REDUCE_SUM_SCALAR); -} - -static inline float hvx_reduce_sum_f32_u(const uint8_t * restrict src, const int num_elems) { - HVX_Vector init_vec = Q6_V_vsplat_R(0); - hvx_reduce_loop_body(HVX_UVector, init_vec, init_vec, HVX_REDUCE_SUM_OP, hvx_vec_reduce_sum_qf32, HVX_REDUCE_SUM_SCALAR); -} - -static inline float hvx_reduce_sum_f32(const uint8_t * restrict src, const int num_elems) { - if (hex_is_aligned((void *) src, 128)) { - return hvx_reduce_sum_f32_a(src, num_elems); - } else { - return hvx_reduce_sum_f32_u(src, num_elems); - } -} - -// Sum of squares variants - -static inline float hvx_sum_of_squares_f32_a(const uint8_t * restrict src, const int num_elems) { - HVX_Vector init_vec = Q6_V_vsplat_R(0); - assert((uintptr_t) src % 128 == 0); - hvx_reduce_loop_body(HVX_Vector, init_vec, init_vec, HVX_SUM_SQ_OP, hvx_vec_reduce_sum_qf32, HVX_REDUCE_SUM_SCALAR); -} - -static inline float hvx_sum_of_squares_f32_u(const uint8_t * restrict src, const int num_elems) { - HVX_Vector init_vec = Q6_V_vsplat_R(0); - hvx_reduce_loop_body(HVX_UVector, init_vec, init_vec, HVX_SUM_SQ_OP, hvx_vec_reduce_sum_qf32, HVX_REDUCE_SUM_SCALAR); -} - -static inline float hvx_sum_of_squares_f32(const uint8_t * restrict src, const int num_elems) { - if (hex_is_aligned((void *) src, 128)) { - return hvx_sum_of_squares_f32_a(src, num_elems); - } else { - return hvx_sum_of_squares_f32_u(src, num_elems); - } -} - -#undef hvx_reduce_loop_body -#undef HVX_REDUCE_MAX_OP -#undef HVX_REDUCE_SUM_OP -#undef HVX_REDUCE_MAX_SCALAR -#undef HVX_REDUCE_SUM_SCALAR -#undef HVX_SUM_SQ_OP - -#endif /* HVX_REDUCE_H */ diff --git a/ggml/src/ggml-hexagon/htp/hvx-scale.h b/ggml/src/ggml-hexagon/htp/hvx-scale.h deleted file mode 100644 index c65c986..0000000 --- a/ggml/src/ggml-hexagon/htp/hvx-scale.h +++ /dev/null @@ -1,133 +0,0 @@ -#ifndef HVX_SCALE_H -#define HVX_SCALE_H - -#include -#include -#include - -#include "hvx-base.h" - -#define hvx_scale_f32_loop_body(dst_type, src_type, vec_store) \ - do { \ - dst_type * restrict vdst = (dst_type *) dst; \ - src_type * restrict vsrc = (src_type *) src; \ - \ - HVX_Vector vs = hvx_vec_splat_f32(scale); \ - \ - const uint32_t elem_size = sizeof(float); \ - const uint32_t epv = 128 / elem_size; \ - const uint32_t nvec = n / epv; \ - const uint32_t nloe = n % epv; \ - \ - uint32_t i = 0; \ - \ - _Pragma("unroll(4)") \ - for (; i < nvec; ++i) { \ - HVX_Vector v = Q6_Vqf32_vmpy_VsfVsf(vsrc[i], vs); \ - vdst[i] = Q6_Vsf_equals_Vqf32(v); \ - } \ - if (nloe) { \ - HVX_Vector v = Q6_Vqf32_vmpy_VsfVsf(vsrc[i], vs); \ - vec_store((void *) &vdst[i], nloe * elem_size, Q6_Vsf_equals_Vqf32(v)); \ - } \ - } while(0) - -static inline void hvx_scale_f32_aa(uint8_t * restrict dst, const uint8_t * restrict src, const int n, const float scale) { - assert((size_t) dst % 128 == 0); - assert((size_t) src % 128 == 0); - hvx_scale_f32_loop_body(HVX_Vector, HVX_Vector, hvx_vec_store_a); -} - -static inline void hvx_scale_f32_au(uint8_t * restrict dst, const uint8_t * restrict src, const int n, const float scale) { - assert((size_t) dst % 128 == 0); - hvx_scale_f32_loop_body(HVX_Vector, HVX_UVector, hvx_vec_store_a); -} - -static inline void hvx_scale_f32_ua(uint8_t * restrict dst, const uint8_t * restrict src, const int n, const float scale) { - assert((size_t) src % 128 == 0); - hvx_scale_f32_loop_body(HVX_UVector, HVX_Vector, hvx_vec_store_u); -} - -static inline void hvx_scale_f32_uu(uint8_t * restrict dst, const uint8_t * restrict src, const int n, const float scale) { - hvx_scale_f32_loop_body(HVX_UVector, HVX_UVector, hvx_vec_store_u); -} - -static inline void hvx_scale_f32(uint8_t * restrict dst, const uint8_t * restrict src, const int n, const float scale) { - if (((size_t) dst & 127) == 0) { - if (((size_t) src & 127) == 0) { - hvx_scale_f32_aa(dst, src, n, scale); - } else { - hvx_scale_f32_au(dst, src, n, scale); - } - } else { - if (((size_t) src & 127) == 0) { - hvx_scale_f32_ua(dst, src, n, scale); - } else { - hvx_scale_f32_uu(dst, src, n, scale); - } - } -} - -#define hvx_scale_offset_f32_loop_body(dst_type, src_type, vec_store) \ - do { \ - dst_type * restrict vdst = (dst_type *) dst; \ - src_type * restrict vsrc = (src_type *) src; \ - \ - HVX_Vector vs = hvx_vec_splat_f32(scale); \ - HVX_Vector vo = hvx_vec_splat_f32(offset); \ - \ - const uint32_t elem_size = sizeof(float); \ - const uint32_t epv = 128 / elem_size; \ - const uint32_t nvec = n / epv; \ - const uint32_t nloe = n % epv; \ - \ - uint32_t i = 0; \ - \ - _Pragma("unroll(4)") \ - for (; i < nvec; ++i) { \ - HVX_Vector v = Q6_Vqf32_vadd_Vqf32Vsf(Q6_Vqf32_vmpy_VsfVsf(vsrc[i], vs), vo); \ - vdst[i] = Q6_Vsf_equals_Vqf32(v); \ - } \ - if (nloe) { \ - HVX_Vector v = Q6_Vqf32_vadd_Vqf32Vsf(Q6_Vqf32_vmpy_VsfVsf(vsrc[i], vs), vo); \ - vec_store((void *) &vdst[i], nloe * elem_size, Q6_Vsf_equals_Vqf32(v)); \ - } \ - } while(0) - -static inline void hvx_scale_offset_f32_aa(uint8_t * restrict dst, const uint8_t * restrict src, const int n, const float scale, const float offset) { - assert((size_t) dst % 128 == 0); - assert((size_t) src % 128 == 0); - hvx_scale_offset_f32_loop_body(HVX_Vector, HVX_Vector, hvx_vec_store_a); -} - -static inline void hvx_scale_offset_f32_au(uint8_t * restrict dst, const uint8_t * restrict src, const int n, const float scale, const float offset) { - assert((size_t) dst % 128 == 0); - hvx_scale_offset_f32_loop_body(HVX_Vector, HVX_UVector, hvx_vec_store_a); -} - -static inline void hvx_scale_offset_f32_ua(uint8_t * restrict dst, const uint8_t * restrict src, const int n, const float scale, const float offset) { - assert((size_t) src % 128 == 0); - hvx_scale_offset_f32_loop_body(HVX_UVector, HVX_Vector, hvx_vec_store_u); -} - -static inline void hvx_scale_offset_f32_uu(uint8_t * restrict dst, const uint8_t * restrict src, const int n, const float scale, const float offset) { - hvx_scale_offset_f32_loop_body(HVX_UVector, HVX_UVector, hvx_vec_store_u); -} - -static inline void hvx_scale_offset_f32(uint8_t * restrict dst, const uint8_t * restrict src, const int n, const float scale, const float offset) { - if (((size_t) dst & 127) == 0) { - if (((size_t) src & 127) == 0) { - hvx_scale_offset_f32_aa(dst, src, n, scale, offset); - } else { - hvx_scale_offset_f32_au(dst, src, n, scale, offset); - } - } else { - if (((size_t) src & 127) == 0) { - hvx_scale_offset_f32_ua(dst, src, n, scale, offset); - } else { - hvx_scale_offset_f32_uu(dst, src, n, scale, offset); - } - } -} - -#endif // HVX_SCALE_H diff --git a/ggml/src/ggml-hexagon/htp/hvx-sigmoid.c b/ggml/src/ggml-hexagon/htp/hvx-sigmoid.c new file mode 100644 index 0000000..15ac646 --- /dev/null +++ b/ggml/src/ggml-hexagon/htp/hvx-sigmoid.c @@ -0,0 +1,49 @@ +#pragma clang diagnostic ignored "-Wunused-variable" +#pragma clang diagnostic ignored "-Wunused-function" +#pragma clang diagnostic ignored "-Wunused-but-set-variable" + +#include +#include +#include +#include + +#define GGML_COMMON_DECL_C +#include "ggml-common.h" +#include "htp-ctx.h" +#include "htp-dma.h" +#include "htp-msg.h" +#include "htp-ops.h" +#include "hvx-utils.h" +#include "ops-utils.h" + +#if 0 +// Reference algo used in hvx-utils +static void fast_sigmoid_f32(const float* restrict src, float* restrict dst, const int num_elems) +{ + const float c1 = 0.03138777; + const float c2 = 0.276281267; + const float c_log2f = 1.442695022; + + int32_t store_ints[32]; + float store_floats[3][32]; + + for (int i = 0; i < num_elems; i++) + { + float v = src0[i]; + + v *= c_log2f*0.5; + int intPart = (int)v; + float x = (v - intPart); + float xx = x * x; + float v1 = c_log2f + c2 * xx; + float v2 = x + xx * c1 * x; + float v3 = (v2 + v1); + *((int*)&v3) += intPart << 24; + float v4 = v2 - v1; + float v5 = v3 - v4; + float res = v3 / v5; + + dst[i] = res; + } +} +#endif diff --git a/ggml/src/ggml-hexagon/htp/hvx-sigmoid.h b/ggml/src/ggml-hexagon/htp/hvx-sigmoid.h deleted file mode 100644 index 1b4aaff..0000000 --- a/ggml/src/ggml-hexagon/htp/hvx-sigmoid.h +++ /dev/null @@ -1,114 +0,0 @@ -#ifndef HVX_SIGMOID_H -#define HVX_SIGMOID_H - -#include "hvx-base.h" - -#define FAST_SIGMOID_LOG2F (0x3fb8aa3b) // 1.442695022 -#define FAST_SIGMOID_C1 (0x3d009076) // 0.03138777 -#define FAST_SIGMOID_C2 (0x3e8d74bd) // 0.276281267 -#define FAST_SIGMOID_C3 (0x3f000000) // 0.5 - -static inline HVX_Vector hvx_vec_fast_sigmoid_f32(HVX_Vector v) { - v = Q6_Vqf32_vmpy_VsfVsf(v, Q6_V_vsplat_R(FAST_SIGMOID_LOG2F)); - v = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(v), Q6_V_vsplat_R(FAST_SIGMOID_C3)); - - HVX_Vector in_int = hvx_vec_truncate_f32(Q6_Vsf_equals_Vqf32(v)); - HVX_Vector x = Q6_Vqf32_vsub_Vqf32Vsf(v, Q6_Vsf_equals_Vw(in_int)); - HVX_Vector xx = Q6_Vqf32_vmpy_Vqf32Vqf32(x, x); - - HVX_Vector v1 = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(xx), Q6_V_vsplat_R(FAST_SIGMOID_C2)); - v1 = Q6_Vqf32_vadd_Vqf32Vsf(v1, Q6_V_vsplat_R(FAST_SIGMOID_LOG2F)); - - HVX_Vector v2 = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(x), Q6_V_vsplat_R(FAST_SIGMOID_C1)); - v2 = Q6_Vqf32_vmpy_Vqf32Vqf32(v2, xx); - v2 = Q6_Vqf32_vadd_Vqf32Vqf32(v2, x); - - HVX_Vector v3 = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_Vqf32Vqf32(v2, v1)); - HVX_Vector v3_exponent = Q6_Vw_vasl_VwR(v3, 1); - v3_exponent = Q6_Vuw_vlsr_VuwR(v3_exponent, 24); - v3_exponent = Q6_Vw_vadd_VwVw(in_int, v3_exponent); - v3 = Q6_Vw_vaslacc_VwVwR(v3, in_int, 24); - - HVX_Vector v4 = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vsub_Vqf32Vqf32(v2, v1)); - HVX_Vector v5 = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vsub_VsfVsf(v3, v4)); - - HVX_Vector res = hvx_vec_inverse_f32(v5); - res = Q6_Vqf32_vmpy_VsfVsf(v3, res); - - return Q6_Vsf_equals_Vqf32(res); -} - -static inline HVX_Vector hvx_vec_fast_sigmoid_f32_guard(HVX_Vector v, - HVX_Vector one, - HVX_Vector max_exp, - HVX_Vector min_exp) { - const HVX_VectorPred pred_max = Q6_Q_vcmp_gt_VsfVsf(max_exp, v); - const HVX_VectorPred pred_min = Q6_Q_vcmp_gt_VsfVsf(v, min_exp); - - HVX_Vector out = hvx_vec_fast_sigmoid_f32(v); - out = Q6_V_vmux_QVV(pred_max, out, one); - return Q6_V_vmux_QVV(pred_min, out, Q6_V_vzero()); -} - -static inline HVX_Vector hvx_vec_tanh_f32(HVX_Vector x) { - // tanh(x) = 2 * sigmoid(2x) - 1 - HVX_Vector two = hvx_vec_splat_f32(2.0f); - HVX_Vector one = hvx_vec_splat_f32(1.0f); - HVX_Vector x2 = Q6_Vqf32_vmpy_VsfVsf(x, two); - - HVX_Vector max_exp = hvx_vec_splat_f32(87.f); - HVX_Vector min_exp = hvx_vec_splat_f32(-87.f); - - HVX_Vector sig2x = hvx_vec_fast_sigmoid_f32_guard(Q6_Vsf_equals_Vqf32(x2), one, max_exp, min_exp); - - HVX_Vector res = Q6_Vqf32_vmpy_VsfVsf(sig2x, two); - res = Q6_Vqf32_vsub_Vqf32Vsf(res, one); - return Q6_Vsf_equals_Vqf32(res); -} - -#define hvx_sigmoid_loop_body(dst_type, src_type, vec_store) \ - do { \ - dst_type * restrict vdst = (dst_type *) dst; \ - src_type * restrict vsrc = (src_type *) src; \ - \ - const HVX_Vector one = hvx_vec_splat_f32(1.f); \ - const HVX_Vector max_exp = hvx_vec_splat_f32(87.f); \ - const HVX_Vector min_exp = hvx_vec_splat_f32(-87.f); \ - \ - const uint32_t epv = 128 / sizeof(float); \ - const uint32_t nvec = n / epv; \ - const uint32_t nloe = n % epv; \ - \ - uint32_t i = 0; \ - \ - _Pragma("unroll(4)") \ - for (; i < nvec; i++) { \ - vdst[i] = hvx_vec_fast_sigmoid_f32_guard(vsrc[i], one, max_exp, min_exp); \ - } \ - if (nloe) { \ - HVX_Vector tmp = hvx_vec_fast_sigmoid_f32_guard(vsrc[i], one, max_exp, min_exp); \ - vec_store((void *) &vdst[i], nloe * sizeof(float), tmp); \ - } \ - } while(0) - -static inline void hvx_sigmoid_f32_aa(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - assert((unsigned long) dst % 128 == 0); - assert((unsigned long) src % 128 == 0); - hvx_sigmoid_loop_body(HVX_Vector, HVX_Vector, hvx_vec_store_a); -} - -static inline void hvx_sigmoid_f32_au(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - assert((unsigned long) dst % 128 == 0); - hvx_sigmoid_loop_body(HVX_Vector, HVX_UVector, hvx_vec_store_a); -} - -static inline void hvx_sigmoid_f32_ua(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - assert((unsigned long) src % 128 == 0); - hvx_sigmoid_loop_body(HVX_UVector, HVX_Vector, hvx_vec_store_u); -} - -static inline void hvx_sigmoid_f32_uu(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { - hvx_sigmoid_loop_body(HVX_UVector, HVX_UVector, hvx_vec_store_u); -} - -#endif /* HVX_SIGMOID_H */ diff --git a/ggml/src/ggml-hexagon/htp/hvx-sqrt.h b/ggml/src/ggml-hexagon/htp/hvx-sqrt.h deleted file mode 100644 index 28ee9f6..0000000 --- a/ggml/src/ggml-hexagon/htp/hvx-sqrt.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef HVX_SQRT_H -#define HVX_SQRT_H - -#include -#include - -#include "hex-utils.h" - -#include "hvx-base.h" - -#define RSQRT_CONST 0x5f3759df // Constant for fast inverse square root calculation -#define RSQRT_ONE_HALF 0x3f000000 // 0.5 -#define RSQRT_THREE_HALVES 0x3fc00000 // 1.5 - -static inline HVX_Vector hvx_vec_rsqrt_f32(HVX_Vector in_vec) { - //Algorithm : - // x2 = input*0.5 - // y = * (long *) &input - // y = 0x5f3759df - (y>>2) - // y = y*(threehalfs - x2*y*y) - - HVX_Vector rsqrtconst = Q6_V_vsplat_R(RSQRT_CONST); - HVX_Vector onehalf = Q6_V_vsplat_R(RSQRT_ONE_HALF); - HVX_Vector threehalfs = Q6_V_vsplat_R(RSQRT_THREE_HALVES); - - HVX_Vector x2, y, ypower2, temp; - - x2 = Q6_Vqf32_vmpy_VsfVsf(in_vec, onehalf); - x2 = Q6_Vqf32_vadd_Vqf32Vsf(x2, Q6_V_vzero()); - - y = Q6_Vw_vasr_VwR(in_vec, 1); - y = Q6_Vw_vsub_VwVw(rsqrtconst, y); - - // 1st iteration - ypower2 = Q6_Vqf32_vmpy_VsfVsf(y, y); - ypower2 = Q6_Vqf32_vadd_Vqf32Vsf(ypower2, Q6_V_vzero()); - temp = Q6_Vqf32_vmpy_Vqf32Vqf32(x2, ypower2); - temp = Q6_Vqf32_vsub_VsfVsf(threehalfs, Q6_Vsf_equals_Vqf32(temp)); - temp = Q6_Vqf32_vmpy_VsfVsf(y, Q6_Vsf_equals_Vqf32(temp)); - - // 2nd iteration - y = Q6_Vqf32_vadd_Vqf32Vsf(temp, Q6_V_vzero()); - ypower2 = Q6_Vqf32_vmpy_Vqf32Vqf32(y, y); - ypower2 = Q6_Vqf32_vadd_Vqf32Vsf(ypower2, Q6_V_vzero()); - temp = Q6_Vqf32_vmpy_Vqf32Vqf32(x2, ypower2); - temp = Q6_Vqf32_vsub_VsfVsf(threehalfs, Q6_Vsf_equals_Vqf32(temp)); - temp = Q6_Vqf32_vmpy_Vqf32Vqf32(y, temp); - - // 3rd iteration - y = Q6_Vqf32_vadd_Vqf32Vsf(temp, Q6_V_vzero()); - ypower2 = Q6_Vqf32_vmpy_Vqf32Vqf32(y, y); - ypower2 = Q6_Vqf32_vadd_Vqf32Vsf(ypower2, Q6_V_vzero()); - temp = Q6_Vqf32_vmpy_Vqf32Vqf32(x2, ypower2); - temp = Q6_Vqf32_vsub_VsfVsf(threehalfs, Q6_Vsf_equals_Vqf32(temp)); - temp = Q6_Vqf32_vmpy_Vqf32Vqf32(y, temp); - - return Q6_Vsf_equals_Vqf32(temp); -} - -#endif /* HVX_SQRT_H */ diff --git a/ggml/src/ggml-hexagon/htp/hvx-types.h b/ggml/src/ggml-hexagon/htp/hvx-types.h deleted file mode 100644 index d495a59..0000000 --- a/ggml/src/ggml-hexagon/htp/hvx-types.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef HVX_TYPES_H -#define HVX_TYPES_H - -#include -#include - -#include - -#define SIZEOF_FP32 (4) -#define SIZEOF_FP16 (2) -#define VLEN (128) -#define VLEN_FP32 (VLEN / SIZEOF_FP32) -#define VLEN_FP16 (VLEN / SIZEOF_FP16) - -typedef union { - HVX_Vector v; - uint8_t b[VLEN]; - uint16_t h[VLEN_FP16]; - uint32_t w[VLEN_FP32]; - __fp16 fp16[VLEN_FP16]; - float fp32[VLEN_FP32]; -} __attribute__((aligned(VLEN), packed)) HVX_VectorAlias; - -typedef struct { - HVX_Vector v[2]; -} HVX_Vector_x2; - -typedef struct { - HVX_Vector v[4]; -} HVX_Vector_x4; - -typedef struct { - HVX_Vector v[8]; -} HVX_Vector_x8; - -#endif /* HVX_TYPES_H */ diff --git a/ggml/src/ggml-hexagon/htp/hvx-utils.c b/ggml/src/ggml-hexagon/htp/hvx-utils.c new file mode 100644 index 0000000..f9e02ab --- /dev/null +++ b/ggml/src/ggml-hexagon/htp/hvx-utils.c @@ -0,0 +1,1067 @@ +#pragma clang diagnostic ignored "-Wunused-variable" +#pragma clang diagnostic ignored "-Wunused-function" +#pragma clang diagnostic ignored "-Wunused-but-set-variable" + +#ifdef HTP_DEBUG +# define FARF_HIGH 1 +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#define GGML_COMMON_DECL_C +#include "ggml-common.h" +#include "hvx-utils.h" + +#define htp_binary_ops_preamble \ + int step_of_4 = num_elems >> 7; \ + int step_of_2 = (num_elems - step_of_4 * VLEN_FP32 * 4) >> 6; \ + int step_of_1 = (num_elems - step_of_4 * VLEN_FP32 * 4 - step_of_2 * VLEN_FP32 * 2) >> 5; \ + int remaining = num_elems - step_of_4 * VLEN_FP32 * 4 - step_of_2 * VLEN_FP32 * 2 - step_of_1 * VLEN_FP32; \ + \ + const uint8_t * restrict src0_curr = src0; \ + const uint8_t * restrict src1_curr = src1; \ + uint8_t * restrict dst_curr = dst; + +void hvx_mul_f32(const uint8_t * restrict src0, + const uint8_t * restrict src1, + uint8_t * restrict dst, + const int num_elems) { + int left_over = num_elems & (VLEN_FP32 - 1); + int num_elems_whole = num_elems - left_over; + + int unaligned_addr = 0; + int unaligned_loop = 0; + if ((0 == htp_is_aligned((void *) src0, VLEN)) || (0 == htp_is_aligned((void *) src1, VLEN)) || + (0 == htp_is_aligned((void *) dst, VLEN))) { + FARF(HIGH, "hvx_mul_f32: unaligned address in hvx op, possibly slower execution\n"); + unaligned_addr = 1; + } + + if ((1 == unaligned_addr) && (num_elems_whole != 0)) { + unaligned_loop = 1; + FARF(HIGH, "hvx_mul_f32: unaligned loop in hvx op, possibly slower execution\n"); + } + + + bool handled_leftover = false; + if (0 == unaligned_loop) { + HVX_Vector * restrict vec_in1 = (HVX_Vector *) src0; + HVX_Vector * restrict vec_in2 = (HVX_Vector *) src1; + HVX_Vector * restrict vec_out = (HVX_Vector *) dst; + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector v = Q6_Vqf32_vmpy_VsfVsf(*vec_in1++, *vec_in2++); + *vec_out++ = Q6_Vsf_equals_Vqf32(v); + } + } else { + int step_of_1 = num_elems_whole >> 5; // divby 32, because 32 float = 128 bytes per HVX vector + int leftover_size = left_over * sizeof(float); + + + HVX_Vector * restrict vec_in1 = (HVX_Vector *) src0; + HVX_Vector * restrict vec_in2 = (HVX_Vector *) src1; + HVX_UVector * restrict vec_out = (HVX_UVector *) dst; + + HVX_Vector slinep; + HVX_Vector slinec; + HVX_Vector sline; + HVX_Vector sline2p; + HVX_Vector sline2c; + HVX_Vector sline2; + + slinep = *vec_in1++; + sline2p = *vec_in2++; + #pragma unroll(4) + for (int i = step_of_1 - 1; i > 0; i--) { + slinec = *vec_in1++; + sline2c = *vec_in2++; + sline = Q6_V_valign_VVR(slinec, slinep, (size_t) src0); + sline2 = Q6_V_valign_VVR(sline2c, sline2p, (size_t) src1); + + *((HVX_UVector *) (vec_out++)) = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(sline, sline2)); + slinep = slinec; + sline2p = sline2c; + } + if (step_of_1 > 1) { + slinec = htp_is_aligned(vec_in1, VLEN) && left_over == 0 ? slinep : *vec_in1++; + sline2c = htp_is_aligned(vec_in2, VLEN) && left_over == 0 ? sline2p : *vec_in2++; + + sline = Q6_V_valign_VVR(slinec, slinep, (size_t) src0); + sline2 = Q6_V_valign_VVR(sline2c, sline2p, (size_t) src1); + *((HVX_UVector *) (vec_out++)) = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(sline, sline2)); + slinep = slinec; + sline2p = sline2c; + } + if (left_over > 0) { + slinec = (is_in_one_chunk(vec_in1, leftover_size, VLEN) ? slinep : *vec_in1++); + + sline = Q6_V_valign_VVR(slinec, slinep, (size_t) src0); + sline2c = (is_in_one_chunk(vec_in2, leftover_size, VLEN) ? sline2p : *vec_in2++); + sline2 = Q6_V_valign_VVR(sline2c, sline2p, (size_t) src1); + + HVX_Vector out = Q6_Vqf32_vmpy_VsfVsf(sline, sline2); + hvx_vec_store_u(vec_out, leftover_size, Q6_Vsf_equals_Vqf32(out)); + handled_leftover = true; + } + } + + + if (left_over > 0 && !handled_leftover) { + const float * src0f = (const float *) src0 + num_elems_whole; + const float * src1f = (const float *) src1 + num_elems_whole; + float * dstf = (float *) dst + num_elems_whole; + + HVX_Vector in1 = *(HVX_UVector *) src0f; + HVX_Vector in2 = *(HVX_UVector *) src1f; + + HVX_Vector out = Q6_Vqf32_vmpy_VsfVsf(in1, in2); + hvx_vec_store_u((void *) dstf, left_over * SIZEOF_FP32, Q6_Vsf_equals_Vqf32(out)); + } +} + +void hvx_mul_f32_opt(const uint8_t * restrict src0, + const uint8_t * restrict src1, + uint8_t * restrict dst, + const int num_elems) { + htp_binary_ops_preamble; + + for (int i = 0; i < step_of_4; i++) { + HVX_Vector v1a = *(HVX_Vector *) src0_curr; + + HVX_Vector v1b = *(HVX_Vector *) src1_curr; + + HVX_Vector v2a = *(HVX_Vector *) (src0_curr + VLEN); + + HVX_Vector v1 = Q6_Vqf32_vmpy_VsfVsf(v1a, v1b); + + HVX_Vector v2b = *(HVX_Vector *) (src1_curr + VLEN); + + HVX_Vector v3a = *(HVX_Vector *) (src0_curr + 2 * VLEN); + + HVX_Vector v2 = Q6_Vqf32_vmpy_VsfVsf(v2a, v2b); + + *(HVX_Vector *) dst_curr = Q6_Vsf_equals_Vqf32(v1); + + HVX_Vector v3b = *(HVX_Vector *) (src1_curr + 2 * VLEN); + + HVX_Vector v4a = *(HVX_Vector *) (src0_curr + 3 * VLEN); + + src0_curr += 4 * VLEN; + + HVX_Vector v3 = Q6_Vqf32_vmpy_VsfVsf(v3a, v3b); + + *(HVX_Vector *) (dst_curr + VLEN) = Q6_Vsf_equals_Vqf32(v2); + + HVX_Vector v4b = *(HVX_Vector *) (src1_curr + 3 * VLEN); + + *(HVX_Vector *) (dst_curr + 2 * VLEN) = Q6_Vsf_equals_Vqf32(v3); + + HVX_Vector v4 = Q6_Vqf32_vmpy_VsfVsf(v4a, v4b); + + src1_curr += 4 * VLEN; + + *(HVX_Vector *) (dst_curr + 3 * VLEN) = Q6_Vsf_equals_Vqf32(v4); + + dst_curr += 4 * VLEN; + } + + for (int i = 0; i < step_of_2; i++) { + HVX_Vector v1a = *(HVX_Vector *) src0_curr; + + HVX_Vector v1b = *(HVX_Vector *) src1_curr; + + HVX_Vector v2a = *(HVX_Vector *) (src0_curr + VLEN); + + HVX_Vector v1 = Q6_Vqf32_vmpy_VsfVsf(v1a, v1b); + + HVX_Vector v2b = *(HVX_Vector *) (src1_curr + VLEN); + + *(HVX_Vector *) dst_curr = Q6_Vsf_equals_Vqf32(v1); + + src0_curr += 2 * VLEN; + + HVX_Vector v2 = Q6_Vqf32_vmpy_VsfVsf(v2a, v2b); + + src1_curr += 2 * VLEN; + + *(HVX_Vector *) (dst_curr + VLEN) = Q6_Vsf_equals_Vqf32(v2); + + dst_curr += 2 * VLEN; + } + + for (int i = 0; i < step_of_1; i++) { + HVX_Vector va = *(HVX_Vector *) src0_curr; + + src0_curr += VLEN; + + HVX_Vector vb = *(HVX_Vector *) src1_curr; + + src1_curr += VLEN; + + HVX_Vector v = Q6_Vqf32_vmpy_VsfVsf(va, vb); + + *(HVX_Vector *) dst_curr = Q6_Vsf_equals_Vqf32(v); + + dst_curr += VLEN; + } + + if (remaining > 0) { + HVX_Vector v = Q6_Vqf32_vmpy_VsfVsf(*(HVX_Vector *) src0_curr, *(HVX_Vector *) src1_curr); + hvx_vec_store_u((void *) dst_curr, remaining * SIZEOF_FP32, Q6_Vsf_equals_Vqf32(v)); + } +} + +void hvx_mul_mul_f32_opt(const uint8_t * restrict src0, + const uint8_t * restrict src1, + const uint8_t * restrict src2, + uint8_t * restrict dst, + const int num_elems) { + const uint8_t * restrict src0_curr = src0; + const uint8_t * restrict src1_curr = src1; + const uint8_t * restrict src2_curr = src2; + uint8_t * restrict dst_curr = dst; + + int step_of_2 = num_elems >> 6; + int step_of_1 = (num_elems - step_of_2 * VLEN_FP32 * 2) >> 5; + int remaining = num_elems - step_of_2 * VLEN_FP32 * 2 - step_of_1 * VLEN_FP32; + + for (int i = 0; i < step_of_2; i++) { + HVX_Vector v1a = *(HVX_Vector *) src0_curr; + HVX_Vector v1b = *(HVX_Vector *) src1_curr; + HVX_Vector v1c = *(HVX_Vector *) src2_curr; + + HVX_Vector v2a = *(HVX_Vector *) (src0_curr + VLEN); + + HVX_Vector v1_ = Q6_Vqf32_vmpy_VsfVsf(v1a, v1b); + HVX_Vector v1 = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(v1_), v1c); + + HVX_Vector v2b = *(HVX_Vector *) (src1_curr + VLEN); + + *(HVX_Vector *) dst_curr = Q6_Vsf_equals_Vqf32(v1); + + HVX_Vector v2c = *(HVX_Vector *) (src2_curr + VLEN); + + src0_curr += 2 * VLEN; + + HVX_Vector v2_ = Q6_Vqf32_vmpy_VsfVsf(v2a, v2b); + HVX_Vector v2 = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(v2_), v2c); + + src1_curr += 2 * VLEN; + src2_curr += 2 * VLEN; + + *(HVX_Vector *) (dst_curr + VLEN) = Q6_Vsf_equals_Vqf32(v2); + + dst_curr += 2 * VLEN; + } + for (int i = 0; i < step_of_1; i++) { + HVX_Vector va = *(HVX_Vector *) src0_curr; + src0_curr += VLEN; + + HVX_Vector vb = *(HVX_Vector *) src1_curr; + src1_curr += VLEN; + + HVX_Vector vc = *(HVX_Vector *) src2_curr; + src2_curr += VLEN; + + HVX_Vector v1 = Q6_Vqf32_vmpy_VsfVsf(va, vb); + HVX_Vector v2 = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(v1), vc); + + *(HVX_Vector *) dst_curr = Q6_Vsf_equals_Vqf32(v2); + dst_curr += VLEN; + } + if (remaining > 0) { + HVX_Vector v1 = Q6_Vqf32_vmpy_VsfVsf(*(HVX_Vector *) src0_curr, *(HVX_Vector *) src1_curr); + HVX_Vector v2 = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(v1), *(HVX_Vector *) src2_curr); + hvx_vec_store_u((void *) dst_curr, remaining * SIZEOF_FP32, Q6_Vsf_equals_Vqf32(v2)); + } +} + +void hvx_add_f32(const uint8_t * restrict src0, + const uint8_t * restrict src1, + uint8_t * restrict dst, + const int num_elems) { + int left_over = num_elems & (VLEN_FP32 - 1); + int num_elems_whole = num_elems - left_over; + + int unaligned_addr = 0; + int unaligned_loop = 0; + if ((0 == htp_is_aligned((void *) src0, VLEN)) || (0 == htp_is_aligned((void *) src1, VLEN)) || + (0 == htp_is_aligned((void *) dst, VLEN))) { + FARF(HIGH, "hvx_add_f32: unaligned address in hvx op, possibly slower execution\n"); + unaligned_addr = 1; + } + + if ((1 == unaligned_addr) && (num_elems_whole != 0)) { + unaligned_loop = 1; + FARF(HIGH, "hvx_add_f32: unaligned loop in hvx op, possibly slower execution\n"); + } + + if (0 == unaligned_loop) { + HVX_Vector * restrict vec_in1 = (HVX_Vector *) src0; + HVX_Vector * restrict vec_in2 = (HVX_Vector *) src1; + HVX_Vector * restrict vec_out = (HVX_Vector *) dst; + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector v = Q6_Vqf32_vadd_VsfVsf(*vec_in1++, *vec_in2++); + *vec_out++ = Q6_Vsf_equals_Vqf32(v); + } + } else { + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector in1 = *(HVX_UVector *) (src0 + i * SIZEOF_FP32); + HVX_Vector in2 = *(HVX_UVector *) (src1 + i * SIZEOF_FP32); + + HVX_Vector out = Q6_Vqf32_vadd_VsfVsf(in1, in2); + + *(HVX_UVector *) (dst + i * SIZEOF_FP32) = Q6_Vsf_equals_Vqf32(out); + } + } + + if (left_over > 0) { + const float * src0f = (const float *) src0 + num_elems_whole; + const float * src1f = (const float *) src1 + num_elems_whole; + float * dstf = (float *) dst + num_elems_whole; + + HVX_Vector in1 = *(HVX_UVector *) src0f; + HVX_Vector in2 = *(HVX_UVector *) src1f; + + HVX_Vector out = Q6_Vqf32_vadd_VsfVsf(in1, in2); + hvx_vec_store_u((void *) dstf, left_over * SIZEOF_FP32, Q6_Vsf_equals_Vqf32(out)); + } +} + +void hvx_add_f32_opt(const uint8_t * restrict src0, + const uint8_t * restrict src1, + uint8_t * restrict dst, + const int num_elems) { + htp_binary_ops_preamble; + + for (int i = 0; i < step_of_4; i++) { + HVX_Vector v1a = *(HVX_Vector *) src0_curr; + + HVX_Vector v1b = *(HVX_Vector *) src1_curr; + + HVX_Vector v2a = *(HVX_Vector *) (src0_curr + VLEN); + + HVX_Vector v1 = Q6_Vqf32_vadd_VsfVsf(v1a, v1b); + + HVX_Vector v2b = *(HVX_Vector *) (src1_curr + VLEN); + + HVX_Vector v3a = *(HVX_Vector *) (src0_curr + 2 * VLEN); + + HVX_Vector v2 = Q6_Vqf32_vadd_VsfVsf(v2a, v2b); + + *(HVX_Vector *) dst_curr = Q6_Vsf_equals_Vqf32(v1); + + HVX_Vector v3b = *(HVX_Vector *) (src1_curr + 2 * VLEN); + + HVX_Vector v4a = *(HVX_Vector *) (src0_curr + 3 * VLEN); + + src0_curr += 4 * VLEN; + + HVX_Vector v3 = Q6_Vqf32_vadd_VsfVsf(v3a, v3b); + + *(HVX_Vector *) (dst_curr + VLEN) = Q6_Vsf_equals_Vqf32(v2); + + HVX_Vector v4b = *(HVX_Vector *) (src1_curr + 3 * VLEN); + + *(HVX_Vector *) (dst_curr + 2 * VLEN) = Q6_Vsf_equals_Vqf32(v3); + + HVX_Vector v4 = Q6_Vqf32_vadd_VsfVsf(v4a, v4b); + + src1_curr += 4 * VLEN; + + *(HVX_Vector *) (dst_curr + 3 * VLEN) = Q6_Vsf_equals_Vqf32(v4); + + dst_curr += 4 * VLEN; + } + for (int i = 0; i < step_of_2; i++) { + HVX_Vector v1a = *(HVX_Vector *) src0_curr; + + HVX_Vector v1b = *(HVX_Vector *) src1_curr; + + HVX_Vector v2a = *(HVX_Vector *) (src0_curr + VLEN); + + HVX_Vector v1 = Q6_Vqf32_vadd_VsfVsf(v1a, v1b); + + HVX_Vector v2b = *(HVX_Vector *) (src1_curr + VLEN); + + *(HVX_Vector *) dst_curr = Q6_Vsf_equals_Vqf32(v1); + + src0_curr += 2 * VLEN; + + HVX_Vector v2 = Q6_Vqf32_vadd_VsfVsf(v2a, v2b); + + src1_curr += 2 * VLEN; + + *(HVX_Vector *) (dst_curr + VLEN) = Q6_Vsf_equals_Vqf32(v2); + + dst_curr += 2 * VLEN; + } + for (int i = 0; i < step_of_1; i++) { + HVX_Vector va = *(HVX_Vector *) src0_curr; + + src0_curr += VLEN; + + HVX_Vector vb = *(HVX_Vector *) src1_curr; + + src1_curr += VLEN; + + HVX_Vector v = Q6_Vqf32_vadd_VsfVsf(va, vb); + + *(HVX_Vector *) dst_curr = Q6_Vsf_equals_Vqf32(v); + + dst_curr += VLEN; + } + if (remaining > 0) { + HVX_Vector v = Q6_Vqf32_vadd_VsfVsf(*(HVX_Vector *) src0_curr, *(HVX_Vector *) src1_curr); + hvx_vec_store_u((void *) dst_curr, remaining * SIZEOF_FP32, Q6_Vsf_equals_Vqf32(v)); + } +} + +void hvx_add_scalar_f32(const uint8_t * restrict src, const float val, uint8_t * restrict dst, const int num_elems) { + size_t left_over = num_elems & (VLEN_FP32 - 1); + size_t num_elems_whole = num_elems - left_over; + + int unaligned_addr = 0; + int unaligned_loop = 0; + if ((0 == htp_is_aligned((void *) src, VLEN)) || (0 == htp_is_aligned((void *) dst, VLEN))) { + FARF(HIGH, "hvx_add_scalar_f32: unaligned address in hvx op, possibly slower execution\n"); + unaligned_addr = 1; + } + + if ((1 == unaligned_addr) && (num_elems_whole != 0)) { + unaligned_loop = 1; + FARF(HIGH, "hvx_add_scalar_f32: unaligned loop in hvx op, possibly slower execution\n"); + } + + static const float kInf = INFINITY; + const HVX_Vector inf = hvx_vec_splat_fp32(kInf); + HVX_Vector val_vec = hvx_vec_splat_fp32(val); + + if (0 == unaligned_loop) { + HVX_Vector * restrict vec_in1 = (HVX_Vector *) src; + HVX_Vector * restrict vec_out = (HVX_Vector *) dst; + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector in = *vec_in1++; + const HVX_VectorPred pred_inf = Q6_Q_vcmp_eq_VwVw(inf, in); + HVX_Vector v = Q6_Vqf32_vadd_VsfVsf(in, val_vec); + v = Q6_Vsf_equals_Vqf32(v); + v = Q6_V_vmux_QVV(pred_inf, inf, v); + *vec_out++ = v; + } + } else { + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector in = *(HVX_UVector *) (src + i * SIZEOF_FP32); + + const HVX_VectorPred pred_inf = Q6_Q_vcmp_eq_VwVw(inf, in); + HVX_Vector out = Q6_Vqf32_vadd_VsfVsf(in, val_vec); + out = Q6_Vsf_equals_Vqf32(out); + out = Q6_V_vmux_QVV(pred_inf, inf, out); + + *(HVX_UVector *) (dst + i * SIZEOF_FP32) = out; + } + } + + if (left_over > 0) { + const float * srcf = (const float *) src + num_elems_whole; + float * dstf = (float *) dst + num_elems_whole; + + HVX_Vector in = *(HVX_UVector *) srcf; + + const HVX_VectorPred pred_inf = Q6_Q_vcmp_eq_VwVw(inf, in); + HVX_Vector out = Q6_Vqf32_vadd_VsfVsf(in, val_vec); + out = Q6_Vsf_equals_Vqf32(out); + out = Q6_V_vmux_QVV(pred_inf, inf, out); + + hvx_vec_store_u((void *) dstf, left_over * SIZEOF_FP32, out); + } +} + +void hvx_mul_scalar_f32(const uint8_t * restrict src, const float val, uint8_t * restrict dst, const int num_elems) { + size_t left_over = num_elems & (VLEN_FP32 - 1); + size_t num_elems_whole = num_elems - left_over; + + int unaligned_addr = 0; + int unaligned_loop = 0; + if ((0 == htp_is_aligned((void *) src, VLEN)) || (0 == htp_is_aligned((void *) dst, VLEN))) { + FARF(HIGH, "hvx_mul_scalar_f32: unaligned address in hvx op, possibly slower execution\n"); + unaligned_addr = 1; + } + + if ((1 == unaligned_addr) && (num_elems_whole != 0)) { + unaligned_loop = 1; + FARF(HIGH, "hvx_mul_scalar_f32: unaligned loop in hvx op, possibly slower execution\n"); + } + + HVX_Vector val_vec = hvx_vec_splat_fp32(val); + bool handled_leftover = false; + if (0 == unaligned_loop) { + HVX_Vector * restrict vec_in1 = (HVX_Vector *) src; + HVX_Vector * restrict vec_out = (HVX_Vector *) dst; + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector v = Q6_Vqf32_vmpy_VsfVsf(*vec_in1++, val_vec); + *vec_out++ = Q6_Vsf_equals_Vqf32(v); + } + } else { + int step_of_1 = num_elems >> 5; // divby 32, because 32 float = 128 bytes per HVX vector + int leftover_size = left_over * sizeof(float); + + HVX_Vector * input_v_ptr = (HVX_Vector *) src; + HVX_UVector * output_v_ptr = (HVX_UVector *) dst; + + HVX_Vector slinep; + HVX_Vector slinec; + HVX_Vector sline; + + slinep = *input_v_ptr++; + + #pragma unroll(4) + for (int i = step_of_1 - 1; i > 0; i--) { + slinec = *input_v_ptr++; + sline = Q6_V_valign_VVR(slinec, slinep, (size_t) src); + *((HVX_UVector *) (output_v_ptr++)) = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(sline, val_vec)); + /* Prepare slinep for next iteration */ + slinep = slinec; + } + + if (step_of_1 > 0) { + slinec = htp_is_aligned(input_v_ptr, VLEN) && left_over == 0 ? slinep : *input_v_ptr++; + sline = Q6_V_valign_VVR(slinec, slinep, (size_t) src); + *((HVX_UVector *) (output_v_ptr++)) = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(sline, val_vec)); + + slinep = slinec; + } + + if (leftover_size > 0) { + slinec = (is_in_one_chunk(input_v_ptr, leftover_size, VLEN) ? slinep : *input_v_ptr++); + + sline = Q6_V_valign_VVR(slinec, slinep, (size_t) src); + + HVX_Vector sout = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(sline, val_vec)); + hvx_vec_store_u(output_v_ptr, leftover_size, sout); + handled_leftover = true; + } + } + + if (left_over > 0 && !handled_leftover) { + const float * srcf = (const float *) src + num_elems_whole; + float * dstf = (float *) dst + num_elems_whole; + + HVX_Vector in = *(HVX_UVector *) srcf; + + HVX_Vector out = Q6_Vqf32_vmpy_VsfVsf(in, val_vec); + hvx_vec_store_u((void *) dstf, left_over * SIZEOF_FP32, Q6_Vsf_equals_Vqf32(out)); + } +} + +void hvx_sub_f32(const uint8_t * restrict src0, + const uint8_t * restrict src1, + uint8_t * restrict dst, + const int num_elems) { + size_t left_over = num_elems & (VLEN_FP32 - 1); + size_t num_elems_whole = num_elems - left_over; + + int unaligned_addr = 0; + int unaligned_loop = 0; + if ((0 == htp_is_aligned((void *) src0, VLEN)) || (0 == htp_is_aligned((void *) src1, VLEN)) || + (0 == htp_is_aligned((void *) dst, VLEN))) { + FARF(HIGH, "hvx_sub_f32: unaligned address in hvx op, possibly slower execution\n"); + unaligned_addr = 1; + } + + if ((1 == unaligned_addr) && (num_elems_whole != 0)) { + unaligned_loop = 1; + FARF(HIGH, "hvx_sub_f32: unaligned loop in hvx op, possibly slower execution\n"); + } + + if (0 == unaligned_loop) { + HVX_Vector * restrict vec_in1 = (HVX_Vector *) src0; + HVX_Vector * restrict vec_in2 = (HVX_Vector *) src1; + HVX_Vector * restrict vec_out = (HVX_Vector *) dst; + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector v = Q6_Vqf32_vsub_VsfVsf(*vec_in1++, *vec_in2++); + *vec_out++ = Q6_Vsf_equals_Vqf32(v); + } + } else { + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector in1 = *(HVX_UVector *) (src0 + i * SIZEOF_FP32); + HVX_Vector in2 = *(HVX_UVector *) (src1 + i * SIZEOF_FP32); + + HVX_Vector out = Q6_Vqf32_vsub_VsfVsf(in1, in2); + + *(HVX_UVector *) (dst + i * SIZEOF_FP32) = Q6_Vsf_equals_Vqf32(out); + } + } + + if (left_over > 0) { + const float * src0f = (const float *) src0 + num_elems_whole; + const float * src1f = (const float *) src1 + num_elems_whole; + float * dstf = (float *) dst + num_elems_whole; + + HVX_Vector in1 = *(HVX_UVector *) src0f; + HVX_Vector in2 = *(HVX_UVector *) src1f; + + HVX_Vector out = Q6_Vqf32_vsub_VsfVsf(in1, in2); + hvx_vec_store_u((void *) dstf, left_over * SIZEOF_FP32, Q6_Vsf_equals_Vqf32(out)); + } +} + +void hvx_sub_f32_opt(const uint8_t * restrict src0, + const uint8_t * restrict src1, + uint8_t * restrict dst, + const int num_elems) { + htp_binary_ops_preamble; + + for (int i = 0; i < step_of_4; i++) { + HVX_Vector v1a = *(HVX_Vector *) src0_curr; + + HVX_Vector v1b = *(HVX_Vector *) src1_curr; + + HVX_Vector v2a = *(HVX_Vector *) (src0_curr + VLEN); + + HVX_Vector v1 = Q6_Vqf32_vsub_VsfVsf(v1a, v1b); + + HVX_Vector v2b = *(HVX_Vector *) (src1_curr + VLEN); + + HVX_Vector v3a = *(HVX_Vector *) (src0_curr + 2 * VLEN); + + HVX_Vector v2 = Q6_Vqf32_vsub_VsfVsf(v2a, v2b); + + *(HVX_Vector *) dst_curr = Q6_Vsf_equals_Vqf32(v1); + + HVX_Vector v3b = *(HVX_Vector *) (src1_curr + 2 * VLEN); + + HVX_Vector v4a = *(HVX_Vector *) (src0_curr + 3 * VLEN); + + src0_curr += 4 * VLEN; + + HVX_Vector v3 = Q6_Vqf32_vsub_VsfVsf(v3a, v3b); + + *(HVX_Vector *) (dst_curr + VLEN) = Q6_Vsf_equals_Vqf32(v2); + + HVX_Vector v4b = *(HVX_Vector *) (src1_curr + 3 * VLEN); + + *(HVX_Vector *) (dst_curr + 2 * VLEN) = Q6_Vsf_equals_Vqf32(v3); + + HVX_Vector v4 = Q6_Vqf32_vsub_VsfVsf(v4a, v4b); + + src1_curr += 4 * VLEN; + + *(HVX_Vector *) (dst_curr + 3 * VLEN) = Q6_Vsf_equals_Vqf32(v4); + + dst_curr += 4 * VLEN; + } + for (int i = 0; i < step_of_2; i++) { + HVX_Vector v1a = *(HVX_Vector *) src0_curr; + + HVX_Vector v1b = *(HVX_Vector *) src1_curr; + + HVX_Vector v2a = *(HVX_Vector *) (src0_curr + VLEN); + + HVX_Vector v1 = Q6_Vqf32_vsub_VsfVsf(v1a, v1b); + + HVX_Vector v2b = *(HVX_Vector *) (src1_curr + VLEN); + + *(HVX_Vector *) dst_curr = Q6_Vsf_equals_Vqf32(v1); + + src0_curr += 2 * VLEN; + + HVX_Vector v2 = Q6_Vqf32_vsub_VsfVsf(v2a, v2b); + + src1_curr += 2 * VLEN; + + *(HVX_Vector *) (dst_curr + VLEN) = Q6_Vsf_equals_Vqf32(v2); + + dst_curr += 2 * VLEN; + } + for (int i = 0; i < step_of_1; i++) { + HVX_Vector va = *(HVX_Vector *) src0_curr; + + src0_curr += VLEN; + + HVX_Vector vb = *(HVX_Vector *) src1_curr; + + src1_curr += VLEN; + + HVX_Vector v = Q6_Vqf32_vsub_VsfVsf(va, vb); + + *(HVX_Vector *) dst_curr = Q6_Vsf_equals_Vqf32(v); + + dst_curr += VLEN; + } + if (remaining > 0) { + HVX_Vector v = Q6_Vqf32_vsub_VsfVsf(*(HVX_Vector *) src0_curr, *(HVX_Vector *) src1_curr); + hvx_vec_store_u((void *) dst_curr, remaining * SIZEOF_FP32, Q6_Vsf_equals_Vqf32(v)); + } +} + +void hvx_sub_scalar_f32(const uint8_t * restrict src, const float val, uint8_t * restrict dst, const int num_elems) { + size_t left_over = num_elems & (VLEN_FP32 - 1); + size_t num_elems_whole = num_elems - left_over; + + int unaligned_addr = 0; + int unaligned_loop = 0; + if ((0 == htp_is_aligned((void *) src, VLEN)) || (0 == htp_is_aligned((void *) dst, VLEN))) { + FARF(HIGH, "hvx_sub_scalar_f32: unaligned address in hvx op, possibly slower execution\n"); + unaligned_addr = 1; + } + + if ((1 == unaligned_addr) && (num_elems_whole != 0)) { + unaligned_loop = 1; + FARF(HIGH, "hvx_sub_scalar_f32: unaligned loop in hvx op, possibly slower execution\n"); + } + + HVX_Vector val_vec = hvx_vec_splat_fp32(val); + + if (0 == unaligned_loop) { + HVX_Vector * restrict vec_in1 = (HVX_Vector *) src; + HVX_Vector * restrict vec_out = (HVX_Vector *) dst; + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector v = Q6_Vqf32_vsub_VsfVsf(*vec_in1++, val_vec); + *vec_out++ = Q6_Vsf_equals_Vqf32(v); + } + } else { + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector in = *(HVX_UVector *) (src + i * SIZEOF_FP32); + + HVX_Vector out = Q6_Vqf32_vsub_VsfVsf(in, val_vec); + + *(HVX_UVector *) (dst + i * SIZEOF_FP32) = Q6_Vsf_equals_Vqf32(out); + } + } + + if (left_over > 0) { + const float * srcf = (const float *) src + num_elems_whole; + float * dstf = (float *) dst + num_elems_whole; + + HVX_Vector in = *(HVX_UVector *) srcf; + + HVX_Vector out = Q6_Vqf32_vsub_VsfVsf(in, val_vec); + hvx_vec_store_u((void *) dstf, left_over * SIZEOF_FP32, Q6_Vsf_equals_Vqf32(out)); + } +} + +float hvx_sum_of_squares_f32(const uint8_t * restrict src, const int num_elems) { + int left_over = num_elems & (VLEN_FP32 - 1); + int num_elems_whole = num_elems - left_over; + + if (0 == htp_is_aligned((void *) src, VLEN)) { + FARF(HIGH, "hvx_sum_of_squares_f32: unaligned address in hvx op, possibly slower execution\n"); + } + + assert((1 == htp_is_aligned((void *) src, VLEN)) || (0 == num_elems_whole)); + + HVX_Vector * restrict vec_in1 = (HVX_Vector *) src; + + HVX_Vector sum_vec_acc = Q6_V_vsplat_R(0x00000000); + HVX_Vector zero_vec = Q6_V_vsplat_R(0x00000000); + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector v = Q6_Vqf32_vmpy_VsfVsf(*vec_in1, *vec_in1); + sum_vec_acc = Q6_Vqf32_vadd_Vqf32Vqf32(sum_vec_acc, v); + vec_in1++; + } + + if (left_over > 0) { + const float * srcf = (const float *) src + num_elems_whole; + + HVX_Vector vec_left = *(HVX_UVector *) srcf; + + HVX_Vector vec_left_sq = Q6_Vqf32_vmpy_VsfVsf(vec_left, vec_left); + HVX_Vector vec_tmp = Q6_V_valign_VVR(vec_left_sq, zero_vec, left_over * SIZEOF_FP32); + + sum_vec_acc = Q6_Vqf32_vadd_Vqf32Vqf32(sum_vec_acc, vec_tmp); + } + + HVX_Vector v = hvx_vec_qf32_reduce_sum(sum_vec_acc); + return hvx_vec_get_fp32(Q6_Vsf_equals_Vqf32(v)); +} + +float hvx_self_sum_f32(const uint8_t * restrict src, const int num_elems) { + int left_over = num_elems & (VLEN_FP32 - 1); + int num_elems_whole = num_elems - left_over; + + int unaligned_addr = 0; + int unaligned_loop = 0; + if (0 == htp_is_aligned((void *) src, VLEN)) { + FARF(HIGH, "hvx_self_sum_f32: unaligned address in hvx op, possibly slower execution\n"); + unaligned_addr = 1; + } + + if ((1 == unaligned_addr) && (num_elems_whole != 0)) { + unaligned_loop = 1; + FARF(HIGH, "hvx_self_sum_f32: unaligned loop in hvx op, possibly slower execution\n"); + } + + HVX_Vector sum_vec = Q6_V_vsplat_R(0x00000000); + HVX_Vector zero_vec = Q6_V_vsplat_R(0x00000000); + + if (0 == unaligned_loop) { + HVX_Vector * vec_in = (HVX_Vector *) src; + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + // sum_vec = Q6_Vqf32_vadd_Vqf32Vsf(sum_vec, *vec_in++); + sum_vec = Q6_Vqf32_vadd_VsfVsf(Q6_Vsf_equals_Vqf32(sum_vec), *vec_in++); + } + } else { + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector in = *(HVX_UVector *) (src + i * SIZEOF_FP32); + + sum_vec = Q6_Vqf32_vadd_VsfVsf(Q6_Vsf_equals_Vqf32(sum_vec), in); + } + } + + if (left_over > 0) { + const float * srcf = (const float *) src + num_elems_whole; + + HVX_Vector vec_left = *(HVX_UVector *) srcf; + HVX_Vector vec_tmp = Q6_V_valign_VVR(vec_left, zero_vec, left_over * SIZEOF_FP32); + // sum_vec = Q6_Vqf32_vadd_Vqf32Vsf(sum_vec, vec_tmp); + sum_vec = Q6_Vqf32_vadd_VsfVsf(Q6_Vsf_equals_Vqf32(sum_vec), vec_tmp); + } + + HVX_Vector v = hvx_vec_qf32_reduce_sum(sum_vec); + return hvx_vec_get_fp32(Q6_Vsf_equals_Vqf32(v)); +} + +void hvx_scale_f32(const uint8_t * restrict src, uint8_t * restrict dst, const int num_elems, const float scale) { + int left_over = num_elems & (VLEN_FP32 - 1); + int num_elems_whole = num_elems - left_over; + + int unaligned_addr = 0; + int unaligned_loop = 0; + if ((0 == htp_is_aligned((void *) src, VLEN)) || (0 == htp_is_aligned((void *) dst, VLEN))) { + FARF(HIGH, "hvx_scale_f32: unaligned address in hvx op, possibly slower execution\n"); + unaligned_addr = 1; + } + + if ((1 == unaligned_addr) && (num_elems_whole != 0)) { + unaligned_loop = 1; + FARF(HIGH, "hvx_scale_f32: unaligned loop in hvx op, possibly slower execution\n"); + } + + HVX_Vector scale_vec = hvx_vec_splat_fp32(scale); + + if (0 == unaligned_loop) { + HVX_Vector * vec_in1 = (HVX_Vector *) src; + HVX_Vector * vec_out = (HVX_Vector *) dst; + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector v = Q6_Vqf32_vmpy_VsfVsf(*vec_in1++, scale_vec); + *vec_out++ = Q6_Vsf_equals_Vqf32(v); + } + } else { + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector in = *(HVX_UVector *) (src + i * SIZEOF_FP32); + + HVX_Vector out = Q6_Vqf32_vmpy_VsfVsf(in, scale_vec); + + *(HVX_UVector *) (dst + i * SIZEOF_FP32) = Q6_Vsf_equals_Vqf32(out); + } + } + + if (left_over > 0) { + const float * srcf = (const float *) src + num_elems_whole; + float * dstf = (float *) dst + num_elems_whole; + + HVX_Vector in = *(HVX_UVector *) srcf; + + HVX_Vector out = Q6_Vqf32_vmpy_VsfVsf(in, scale_vec); + hvx_vec_store_u((void *) dstf, left_over * SIZEOF_FP32, Q6_Vsf_equals_Vqf32(out)); + } +} + +float hvx_self_max_f32(const uint8_t * restrict src, const int num_elems) { + int left_over = num_elems & (VLEN_FP32 - 1); + int num_elems_whole = num_elems - left_over; + + int unaligned_addr = 0; + int unaligned_loop = 0; + if (0 == htp_is_aligned((void *) src, VLEN)) { + FARF(HIGH, "hvx_self_max_f32: unaligned address in hvx op, possibly slower execution\n"); + unaligned_addr = 1; + } + + if ((1 == unaligned_addr) && (num_elems_whole != 0)) { + unaligned_loop = 1; + FARF(HIGH, "hvx_self_max_f32: unaligned loop in hvx op, possibly slower execution\n"); + } + + HVX_Vector vec_max = hvx_vec_splat_fp32(((const float *) src)[0]); + HVX_Vector vec_first = hvx_vec_splat_fp32(((const float *) src)[0]); + + if (0 == unaligned_loop) { + HVX_Vector * restrict vec_in = (HVX_Vector *) src; + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + vec_max = Q6_Vsf_vmax_VsfVsf(vec_max, *vec_in++); + } + } else { + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector in = *(HVX_UVector *) (src + i * SIZEOF_FP32); + + vec_max = Q6_Vsf_vmax_VsfVsf(vec_max, in); + } + } + + if (left_over > 0) { + const float * srcf = (const float *) src + num_elems_whole; + + HVX_Vector in = *(HVX_UVector *) srcf; + + HVX_Vector temp = Q6_V_valign_VVR(in, vec_first, left_over * SIZEOF_FP32); + vec_max = Q6_Vsf_vmax_VsfVsf(vec_max, temp); + } + + HVX_Vector v = hvx_vec_reduce_max_fp32(vec_max); + return hvx_vec_get_fp32(v); +} + +void hvx_min_scalar_f32(const uint8_t * restrict src, const float val, uint8_t * restrict dst, const int num_elems) { + size_t left_over = num_elems & (VLEN_FP32 - 1); + size_t num_elems_whole = num_elems - left_over; + int unalign_address = 0; + if ((0 == htp_is_aligned((void *) src, VLEN)) || (0 == htp_is_aligned((void *) dst, VLEN))) { + FARF(HIGH, "hvx_min_scalar_f32: unaligned address in hvx op, possibly slower execution\n"); + unalign_address = 1; + } + + const float * src_f = (const float *) src; + + HVX_Vector vec_min = hvx_vec_splat_fp32(val); + + if(unalign_address == 0){ + HVX_Vector * restrict vec_in = (HVX_Vector *) src; + HVX_Vector * restrict vec_out = (HVX_Vector *) dst; + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector min_clamp = Q6_Vsf_vmin_VsfVsf(vec_min, *vec_in++); + *vec_out++ = (min_clamp); + } + }else{ + HVX_UVector * restrict vec_in = (HVX_Vector *) src; + HVX_UVector * restrict vec_out = (HVX_Vector *) dst; + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector min_clamp = Q6_Vsf_vmin_VsfVsf(vec_min, *vec_in++); + *vec_out++ = (min_clamp); + } + } + + if (left_over > 0 ) { + const float * srcf = (const float *) src + num_elems_whole; + float * dstf = (float *) dst + num_elems_whole; + + HVX_UVector in = *(HVX_UVector *) srcf; + + HVX_UVector min_clamp = Q6_Vsf_vmin_VsfVsf(vec_min, in); + + hvx_vec_store_u((void *) dstf, left_over * SIZEOF_FP32, (min_clamp)); + } +} + +void hvx_clamp_scalar_f32(const uint8_t * restrict src, + const float limit_left, + const float limit_right, + uint8_t * restrict dst, + const int num_elems) { + size_t left_over = num_elems & (VLEN_FP32 - 1); + size_t num_elems_whole = num_elems - left_over; + + int unalign_address = 0; + if ((0 == htp_is_aligned((void *) src, VLEN)) || (0 == htp_is_aligned((void *) dst, VLEN))) { + FARF(HIGH, "hvx_clamp_scalar_f32: unaligned address in hvx op, possibly slower execution\n"); + unalign_address = 1; + } + + HVX_Vector range_left = hvx_vec_splat_fp32(limit_left); + HVX_Vector range_right = hvx_vec_splat_fp32(limit_right); + + if(unalign_address == 0){ + HVX_Vector * restrict vec_in = (HVX_Vector *) src; + HVX_Vector * restrict vec_out = (HVX_Vector *) dst; + + + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector in_vec = *vec_in++; + HVX_Vector temp_v = in_vec; + + HVX_VectorPred pred_cap_right = Q6_Q_vcmp_gt_VsfVsf(in_vec, range_right); + HVX_VectorPred pred_cap_left = Q6_Q_vcmp_gt_VsfVsf(range_left, in_vec); + + in_vec = Q6_V_vmux_QVV(pred_cap_right, range_right, temp_v); + in_vec = Q6_V_vmux_QVV(pred_cap_left, range_left, in_vec); + + *vec_out++ = in_vec; + } + + }else{ + + HVX_UVector * restrict vec_in = (HVX_UVector *) src; + HVX_UVector * restrict vec_out = (HVX_UVector *) dst; + + #pragma unroll(4) + for (int i = 0; i < num_elems_whole; i += VLEN_FP32) { + HVX_Vector in_vec = *vec_in++; + HVX_Vector temp_v = in_vec; + + HVX_VectorPred pred_cap_right = Q6_Q_vcmp_gt_VsfVsf(in_vec, range_right); + HVX_VectorPred pred_cap_left = Q6_Q_vcmp_gt_VsfVsf(range_left, in_vec); + + in_vec = Q6_V_vmux_QVV(pred_cap_right, range_right, temp_v); + in_vec = Q6_V_vmux_QVV(pred_cap_left, range_left, in_vec); + + *vec_out++ = in_vec; + } + + } + + if (left_over > 0) { + const float * srcf = (const float *) src + num_elems_whole; + float * dstf = (float *) dst + num_elems_whole; + + HVX_Vector in_vec = *(HVX_UVector *) srcf; + + HVX_Vector temp_v = in_vec; + + HVX_VectorPred pred_cap_right = Q6_Q_vcmp_gt_VsfVsf(in_vec, range_right); + HVX_VectorPred pred_cap_left = Q6_Q_vcmp_gt_VsfVsf(range_left, in_vec); + + in_vec = Q6_V_vmux_QVV(pred_cap_right, range_right, temp_v); + in_vec = Q6_V_vmux_QVV(pred_cap_left, range_left, in_vec); + + hvx_vec_store_u((void *) dstf, left_over * SIZEOF_FP32, in_vec); + } +} diff --git a/ggml/src/ggml-hexagon/htp/hvx-utils.h b/ggml/src/ggml-hexagon/htp/hvx-utils.h index 7b79a5e..d2d5d23 100644 --- a/ggml/src/ggml-hexagon/htp/hvx-utils.h +++ b/ggml/src/ggml-hexagon/htp/hvx-utils.h @@ -1,17 +1,1106 @@ #ifndef HVX_UTILS_H #define HVX_UTILS_H -#include "hex-utils.h" +#include "ops-utils.h" -#include "hvx-types.h" -#include "hvx-copy.h" -#include "hvx-scale.h" -#include "hvx-exp.h" -#include "hvx-inverse.h" -#include "hvx-reduce.h" -#include "hvx-sigmoid.h" -#include "hvx-sqrt.h" -#include "hvx-arith.h" -#include "hvx-base.h" +#include +#include + +#define SIZEOF_FP32 (4) +#define SIZEOF_FP16 (2) +#define VLEN (128) +#define VLEN_FP32 (VLEN / SIZEOF_FP32) +#define VLEN_FP16 (VLEN / SIZEOF_FP16) + +typedef union { + HVX_Vector v; + uint8_t b[VLEN]; + uint16_t h[VLEN_FP16]; + uint32_t w[VLEN_FP32]; + __fp16 fp16[VLEN_FP16]; + float fp32[VLEN_FP32]; +} __attribute__((aligned(VLEN), packed)) HVX_VectorAlias; + +/* Q6_Vsf_equals_Vw is only available on v73+.*/ +#if __HVX_ARCH__ < 73 +static inline HVX_Vector int32_to_qfloat(HVX_Vector const in) +{ + HVX_Vector const vzero = Q6_V_vzero(); + HVX_VectorPred is_zero = Q6_Q_vcmp_eq_VwVw(in, vzero); + HVX_Vector lshift = Q6_Vw_vnormamt_Vw(in); + HVX_Vector normalized = Q6_Vw_vasl_VwVw(in, lshift); + HVX_Vector vexp = Q6_Vw_vsub_VwVw(Q6_V_vsplat_R(0x7f + 30), lshift); + HVX_Vector mant = Q6_V_vand_VV(Q6_V_vsplat_R(0xFFFFFF00), normalized); + HVX_Vector ret = Q6_V_vmux_QVV(is_zero, vzero, Q6_Vw_vadd_VwVw(mant, vexp)); + return ret; +} + +static inline HVX_Vector Q6_Vsf_equals_Vw(HVX_Vector const in) +{ + return Q6_Vsf_equals_Vqf32(int32_to_qfloat(in)); +} +#endif + +static inline HVX_Vector hvx_vec_splat_fp32(float i) { + union { + float f; + int32_t i; + } fp32 = { .f = i }; + + return Q6_V_vsplat_R(fp32.i); +} + +static inline void hvx_vec_store_u(void * addr, uint32_t n, HVX_Vector v) { + // Rotate as needed. + v = Q6_V_vlalign_VVR(v, v, (size_t) addr); + + uint32_t left_off = (size_t) addr & 127; + uint32_t right_off = left_off + n; + + HVX_VectorPred ql_not = Q6_Q_vsetq_R((size_t) addr); + HVX_VectorPred qr = Q6_Q_vsetq2_R(right_off); + + if (right_off > 128) { + Q6_vmem_QRIV(qr, (HVX_Vector *) addr + 1, v); + // all 1's + qr = Q6_Q_vcmp_eq_VbVb(v, v); + } + + ql_not = Q6_Q_or_QQn(ql_not, qr); + Q6_vmem_QnRIV(ql_not, (HVX_Vector *) addr, v); +} + +static inline void hvx_vec_store_a(void * ptr, size_t n, HVX_Vector v) { + assert((unsigned long) ptr % 128 == 0); + + HVX_VectorPred ql_not = Q6_Q_vsetq_R((size_t) ptr); + HVX_VectorPred qr = Q6_Q_vsetq2_R(n); + ql_not = Q6_Q_or_QQn(ql_not, qr); + Q6_vmem_QnRIV(ql_not, (HVX_Vector *) ptr, v); +} + +static inline HVX_Vector hvx_vec_repl4(HVX_Vector v) { + // vdelta control to replicate first 4 bytes across all elements + static const uint8_t __attribute__((aligned(128))) repl[128] = { + 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, + 0x10, 0x10, 0x10, 0x10, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, + 0x20, 0x20, 0x20, 0x20, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, + 0x10, 0x10, 0x10, 0x10, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, + 0x40, 0x40, 0x40, 0x40, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, + 0x10, 0x10, 0x10, 0x10, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, + 0x20, 0x20, 0x20, 0x20, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, + 0x10, 0x10, 0x10, 0x10, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, + }; + + HVX_Vector ctrl = *(HVX_Vector *) repl; + return Q6_V_vdelta_VV(v, ctrl); +} + +// copy n fp16 elements : source and destination are aligned to HVX Vector (128) +static inline void hvx_copy_fp16_aa(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { + HVX_Vector * restrict vdst = (HVX_Vector *) dst; + HVX_Vector * restrict vsrc = (HVX_Vector *) src; + + assert((unsigned long) dst % 128 == 0); + assert((unsigned long) src % 128 == 0); + + uint32_t nvec = n / 64; + uint32_t nloe = n % 64; + + uint32_t i = 0; + + #pragma unroll(4) + for (; i < nvec; i++) { + HVX_Vector v = vsrc[i]; + vdst[i] = v; + } + + if (nloe) { + HVX_Vector v = vsrc[i]; + hvx_vec_store_u((void *) &vdst[i], nloe * sizeof(__fp16), v); + } +} + +// copy n fp16 elements : source is aligned, destination is potentially unaligned +static inline void hvx_copy_fp16_ua(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { + HVX_UVector * restrict vdst = (HVX_UVector *) dst; + HVX_Vector * restrict vsrc = (HVX_Vector *) src; + + assert((unsigned long) src % 128 == 0); + + uint32_t nvec = n / 64; + uint32_t nloe = n % 64; + + uint32_t i = 0; + + #pragma unroll(4) + for (; i < nvec; i++) { + HVX_Vector v = vsrc[i]; + vdst[i] = v; + } + + if (nloe) { + HVX_Vector v = vsrc[i]; + hvx_vec_store_u((void *) &vdst[i], nloe * sizeof(__fp16), v); + } +} + +// copy n fp16 elements : source is aligned, destination is potentially unaligned +static inline void hvx_copy_fp16_au(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { + HVX_Vector * restrict vdst = (HVX_Vector *) dst; + HVX_UVector * restrict vsrc = (HVX_UVector *) src; + + assert((unsigned long) dst % 128 == 0); + + uint32_t nvec = n / 64; + uint32_t nloe = n % 64; + + uint32_t i = 0; + + #pragma unroll(4) + for (; i < nvec; i++) { + HVX_Vector v = vsrc[i]; + vdst[i] = v; + } + + if (nloe) { + HVX_Vector v = vsrc[i]; + hvx_vec_store_u((void *) &vdst[i], nloe * sizeof(__fp16), v); + } +} + +// copy n fp32 elements : source and destination are aligned to HVX Vector (128) +static inline void hvx_copy_fp32_aa(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { + HVX_Vector * restrict vdst = (HVX_Vector *) dst; + HVX_Vector * restrict vsrc = (HVX_Vector *) src; + + assert((unsigned long) dst % 128 == 0); + assert((unsigned long) src % 128 == 0); + + uint32_t nvec = n / 32; + uint32_t nloe = n % 32; + + uint32_t i = 0; + + #pragma unroll(4) + for (; i < nvec; i++) { + HVX_Vector v = vsrc[i]; + vdst[i] = v; + } + + if (nloe) { + HVX_Vector v = vsrc[i]; + hvx_vec_store_u((void *) &vdst[i], nloe * sizeof(float), v); + } +} + +// copy n fp32 elements : source is aligned, destination is unaligned +static inline void hvx_copy_fp32_ua(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { + HVX_UVector * restrict vdst = (HVX_UVector *) dst; + HVX_Vector * restrict vsrc = (HVX_Vector *) src; + + assert((unsigned long) src % 128 == 0); + + uint32_t nvec = n / 32; + uint32_t nloe = n % 32; + + uint32_t i = 0; + + #pragma unroll(4) + for (; i < nvec; i++) { + HVX_Vector v = vsrc[i]; + vdst[i] = v; + } + + if (nloe) { + HVX_Vector v = vsrc[i]; + hvx_vec_store_u((void *) &vdst[i], nloe * sizeof(float), v); + } +} + +// copy n fp32 elements : source is unaligned, destination is aligned +static inline void hvx_copy_fp32_au(uint8_t * restrict dst, const uint8_t * restrict src, uint32_t n) { + HVX_Vector * restrict vdst = (HVX_Vector *) dst; + HVX_UVector * restrict vsrc = (HVX_UVector *) src; + + assert((unsigned long) dst % 128 == 0); + + uint32_t nvec = n / 32; + uint32_t nloe = n % 32; + + uint32_t i = 0; + + #pragma unroll(4) + for (; i < nvec; i++) { + HVX_Vector v = vsrc[i]; + vdst[i] = v; + } + + if (nloe) { + HVX_Vector v = vsrc[i]; + hvx_vec_store_u((void *) &vdst[i], nloe * sizeof(float), v); + } +} + +// bcast 1 fp32 element from source to n fp32 elements in destination : destination is aligned +static inline void hvx_bcast_fp32_a(uint8_t * restrict dst, float elem, uint32_t n) { + HVX_Vector * restrict vdst = (HVX_Vector *) dst; + + HVX_Vector velem = hvx_vec_splat_fp32(elem); + + assert((unsigned long) dst % 128 == 0); + + uint32_t nvec = n / 32; + uint32_t nloe = n % 32; + + uint32_t i = 0; + + #pragma unroll(4) + for (; i < nvec; i++) { + vdst[i] = velem; + } + + if (nloe) { + hvx_vec_store_u((void *) &vdst[i], nloe * sizeof(float), velem); + } +} + + +/* Return whether 'n' elements from vector are in the one chunk of 'chunk_size'. */ +static __attribute__((always_inline)) int32_t is_in_one_chunk(void * addr, uint32_t n, uint32_t chunk_size) { + uint32_t left_off = (size_t) addr & (chunk_size - 1); + uint32_t right_off = left_off + n; + return right_off <= chunk_size; +} + + + +static void hvx_vec_dump_fp16_n(char * pref, HVX_Vector v, uint32_t n) { + HVX_VectorAlias u = { .v = v }; + + const uint32_t n0 = n / 16; + const uint32_t n1 = n % 16; + int i = 0; + for (; i < n0; i++) { + htp_dump_fp16_line(pref, u.fp16 + (16 * i), 16); + } + if (n1) { + htp_dump_fp16_line(pref, u.fp16 + (16 * i), n1); + } +} + +static void hvx_vec_dump_fp16(char * pref, HVX_Vector v) { + hvx_vec_dump_fp16_n(pref, v, 64); +} + +static void hvx_vec_dump_fp32_n(char * pref, HVX_Vector v, uint32_t n) { + union { + HVX_Vector v; + float d[32]; + } u = { .v = v }; + + const uint32_t n0 = n / 16; + const uint32_t n1 = n % 16; + int i = 0; + for (; i < n0; i++) { + htp_dump_fp32_line(pref, u.d + (16 * i), 16); + } + if (n1) { + htp_dump_fp32_line(pref, u.d + (16 * i), n1); + } +} + +static void hvx_vec_dump_fp32_hmt(char * pref, HVX_Vector v) { + union { + HVX_Vector v; + float d[32]; + } u = { .v = v }; + + FARF(HIGH, "%s: %.6f %.6f %.6f %.6f ... %.6f %.6f %.6f %.6f ... %.6f %.6f %.6f %.6f\n", pref, u.d[0], u.d[1], + u.d[2], u.d[3], u.d[12], u.d[13], u.d[14], u.d[15], u.d[28], u.d[29], u.d[30], u.d[31]); +} + +static void hvx_vec_dump_fp32(char * pref, HVX_Vector v) { + hvx_vec_dump_fp32_n(pref, v, 32); +} + +static void hvx_vec_dump_int32(char * pref, HVX_Vector v) { + union { + HVX_Vector v; + int32_t d[32]; + } u = { .v = v }; + + for (int i = 0; i < 32 / 16; i++) { + htp_dump_int32_line(pref, u.d + (16 * i), 16); + } +} + +static void hvx_vec_dump_int32_hmt(char * pref, HVX_Vector v) { + union { + HVX_Vector v; + int32_t d[32]; + } u = { .v = v }; + + FARF(HIGH, "%s: %d %d %d %d ... %d %d %d %d ... %d %d %d %d\n", pref, u.d[0], u.d[1], u.d[2], u.d[3], u.d[12], + u.d[13], u.d[14], u.d[15], u.d[28], u.d[29], u.d[30], u.d[31]); +} + +static void hvx_vec_dump_int8_hmt(char * pref, HVX_Vector v) { + union { + HVX_Vector v; + int8_t d[128]; + } u = { .v = v }; + + FARF(HIGH, "%s: %d %d %d %d ... %d %d %d %d ... %d %d %d %d\n", pref, u.d[0], u.d[1], u.d[2], u.d[3], u.d[60], + u.d[61], u.d[62], u.d[63], u.d[124], u.d[125], u.d[126], u.d[127]); +} + +static void hvx_vec_dump_int8(char * pref, HVX_Vector v) { + union { + HVX_Vector v; + int8_t d[128]; + } u = { .v = v }; + + for (int i = 0; i < 128 / 16; i++) { + htp_dump_int8_line(pref, u.d + (16 * i), 16); + } +} + +static void hvx_vec_dump_uint8(char * pref, HVX_Vector v) { + union { + HVX_Vector v; + uint8_t d[128]; + } u = { .v = v }; + + for (int i = 0; i < 128 / 16; i++) { + htp_dump_uint8_line(pref, u.d + (16 * i), 16); + } +} + +static bool hvx_vec_eq(HVX_Vector v0, HVX_Vector v1, size_t n) { + typedef union { + HVX_Vector v; + int8_t d[128]; + } U; + + U u0 = { .v = v0 }; + U u1 = { .v = v1 }; + + for (int i = 0; i < n; i++) { + if (u0.d[i] != u1.d[i]) { + return false; + } + } + + return true; +} + +static inline float hvx_vec_get_fp32(HVX_Vector v) { + float __attribute__((aligned(128))) x; + hvx_vec_store_a(&x, 4, v); + return x; +} + +static inline HVX_Vector hvx_vec_int32_reduce_sum_n(HVX_Vector in, unsigned int n) { + unsigned int total = n * 4; // total vec nbytes + unsigned int width = 4; // int32 + + HVX_Vector sum = in, sum_t; + while (width < total) { + sum_t = Q6_V_vror_VR(sum, width); // rotate right + sum = Q6_Vw_vadd_VwVw(sum_t, sum); // elementwise sum + width = width << 1; + } + return sum; +} + +static inline HVX_Vector hvx_vec_int32_reduce_sum(HVX_Vector in) { + return hvx_vec_int32_reduce_sum_n(in, 32); +} + +static inline HVX_Vector hvx_vec_qf32_reduce_sum_n(HVX_Vector in, unsigned int n) { + unsigned int total = n * 4; // total vec nbytes + unsigned int width = 4; // fp32 nbytes + + HVX_Vector sum = in, sum_t; + while (width < total) { + sum_t = Q6_V_vror_VR(Q6_Vsf_equals_Vqf32(sum), width); // rotate right + sum = Q6_Vqf32_vadd_Vqf32Vsf(sum, sum_t); // elementwise sum + width = width << 1; + } + return sum; +} + +static inline HVX_Vector hvx_vec_qf32_reduce_sum(HVX_Vector in) { + return hvx_vec_qf32_reduce_sum_n(in, 32); +} + +static inline HVX_Vector hvx_vec_fp32_reduce_sum_n(HVX_Vector in, unsigned int n) { + unsigned int total = n * 4; // total vec nbytes + unsigned int width = 4; // fp32 nbytes + + HVX_Vector sum = in, sum_t; + while (width < total) { + sum_t = Q6_V_vror_VR(sum, width); // rotate right + sum = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(sum, sum_t)); // elementwise sum + width = width << 1; + } + return sum; +} + +static inline HVX_Vector hvx_vec_fp32_reduce_sum(HVX_Vector in) { + return hvx_vec_fp32_reduce_sum_n(in, 32); +} + +static inline HVX_Vector hvx_vec_reduce_max_fp16(HVX_Vector in) { + unsigned total = 128; // total vec nbytes + unsigned width = 2; // fp16 nbytes + + HVX_Vector _max = in, _max_t; + while (width < total) { + _max_t = Q6_V_vror_VR(_max, width); // rotate right + _max = Q6_Vhf_vmax_VhfVhf(_max_t, _max); // elementwise max + width = width << 1; + } + + return _max; +} + +static inline HVX_Vector hvx_vec_reduce_max2_fp16(HVX_Vector in, HVX_Vector _max) { + unsigned total = 128; // total vec nbytes + unsigned width = 2; // fp32 nbytes + + HVX_Vector _max_t; + + _max = Q6_Vhf_vmax_VhfVhf(in, _max); + while (width < total) { + _max_t = Q6_V_vror_VR(_max, width); // rotate right + _max = Q6_Vhf_vmax_VhfVhf(_max_t, _max); // elementwise max + width = width << 1; + } + + return _max; +} + +static inline HVX_Vector hvx_vec_reduce_max_fp32(HVX_Vector in) { + unsigned total = 128; // total vec nbytes + unsigned width = 4; // fp32 nbytes + + HVX_Vector _max = in, _max_t; + while (width < total) { + _max_t = Q6_V_vror_VR(_max, width); // rotate right + _max = Q6_Vsf_vmax_VsfVsf(_max_t, _max); // elementwise max + width = width << 1; + } + + return _max; +} + +static inline HVX_Vector hvx_vec_reduce_max2_fp32(HVX_Vector in, HVX_Vector _max) { + unsigned total = 128; // total vec nbytes + unsigned width = 4; // fp32 nbytes + + HVX_Vector _max_t; + + _max = Q6_Vsf_vmax_VsfVsf(in, _max); + while (width < total) { + _max_t = Q6_V_vror_VR(_max, width); // rotate right + _max = Q6_Vsf_vmax_VsfVsf(_max_t, _max); // elementwise max + width = width << 1; + } + + return _max; +} + +static inline HVX_Vector hvx_vec_abs_fp16(HVX_Vector v) { + // abs by clearing the fp16 sign bit + HVX_Vector mask = Q6_Vh_vsplat_R(0x7fff); + return Q6_V_vand_VV(v, mask); +} + +static inline HVX_Vector hvx_vec_neg_fp16(HVX_Vector v) { + // neg by setting the fp16 sign bit + HVX_Vector mask = Q6_Vh_vsplat_R(0x8000); + return Q6_V_vxor_VV(v, mask); +} + +static inline HVX_Vector hvx_vec_abs_fp32(HVX_Vector v) { + // abs by clearing the fp32 sign bit + HVX_Vector mask = Q6_V_vsplat_R(0x7fffffff); + return Q6_V_vand_VV(v, mask); +} + +static inline HVX_Vector hvx_vec_neg_fp32(HVX_Vector v) { +#if __HTP_ARCH__ > 75 + return Q6_Vsf_vfneg_Vsf(v); +#else + // neg by setting the fp32 sign bit + HVX_Vector mask = Q6_V_vsplat_R(0x80000000); + return Q6_V_vxor_VV(v, mask); +#endif // __HTP_ARCH__ > 75 +} + +// ==================================================== +// FUNCTION: 1/(x+1) y(0) = 1, y(0.5) = 0.6667, y(1) = 0.5 +// Order:3; continuity: True; Ends forced: True +// Mode: unsigned; Result fractional bits: 14 +// Peak Error: 1.1295e-04 Rms Error: 2.8410e-05 Mean Error: 1.1370e-05 +// 32769 -32706 31252 -10589 +// 32590 -30635 22793 -4493 +// 32066 -27505 16481 -2348 +// 31205 -24054 11849 -1306 + +static inline HVX_Vector hvx_vec_recip_xp1_O3_unsigned(HVX_Vector vx) { + // input is 0..0xffff representing 0.0 .. 1.0 + HVX_Vector p; + p = Q6_Vh_vlut4_VuhPh(vx, 0xFAE6F6D4EE73D6A3ull); + p = Q6_Vh_vmpa_VhVhVuhPuh_sat(p, vx, 0x2E49406159097A14ull); + p = Q6_Vh_vmps_VhVhVuhPuh_sat(p, vx, 0x5DF66B7177AB7FC2ull); + p = Q6_Vh_vmpa_VhVhVuhPuh_sat(p, vx, 0x79E57D427F4E8001ull); + return p; // signed result, 14 fractional bits +} + +// Find reciprocal of fp16. +// (1) first, convert to fp32, multiplying by 1.0; this is done to +// handle denormals. Ignoring sign and zero, result should be at +// least 5.9604645e-08 (32-bit code 0x33800000) and at most 131008 (0x47ffe000) +// (exponent in range [103,143]) +// (2) extract the mantissa into 16-bit unsigned; find reciprocal using a fitted poly +// (3) put this, along with '253-exp' (exp from (1)) together to make an qf32 +// (4) convert that to fp16 +// (5) put sign back in. Also, if the original value (w/o sign) was <0x81, replace +// the result with the max value. +static inline HVX_Vector hvx_vec_inverse_fp16(HVX_Vector vals) { + HVX_Vector em_mask = Q6_Vh_vsplat_R(0x7FFF); + HVX_Vector avals = Q6_V_vand_VV(vals, em_mask); + HVX_VectorPred is_neg = Q6_Q_vcmp_gt_VhVh(avals, vals); + // is too small to 1/x ? for 'standard' fp16, this would be 0x101 + HVX_VectorPred is_small = Q6_Q_vcmp_gt_VhVh(Q6_Vh_vsplat_R(0x101), avals); + + HVX_VectorPair to_qf32 = Q6_Wqf32_vmpy_VhfVhf(avals, Q6_Vh_vsplat_R(0x3C00)); // *1.0 + HVX_Vector to_f32_0 = Q6_Vsf_equals_Vqf32(Q6_V_lo_W(to_qf32)); + HVX_Vector to_f32_1 = Q6_Vsf_equals_Vqf32(Q6_V_hi_W(to_qf32)); + + // bits 22..13 contain the mantissa now (w/o hidden bit); move to bit 14..5 of a 16-bit vector + HVX_Vector mant_u16 = Q6_Vh_vshuffo_VhVh(Q6_Vw_vasl_VwR(to_f32_1, 9), Q6_Vw_vasl_VwR(to_f32_0, 9)); + // likewise extract the upper 16 from each, containing the exponents in range 103..142 + HVX_Vector exp_u16 = Q6_Vh_vshuffo_VhVh(to_f32_1, to_f32_0); + //Get exponent in IEEE 32-bit representation + exp_u16 = Q6_Vuh_vlsr_VuhR(exp_u16, 7); + + // so, mant_u16 contains an unbiased mantissa in upper 10 bits of each u16 lane + // We can consider it to be x-1.0, with 16 fractional bits, where 'x' is in range [1.0,2.0) + // Use poly to transform to 1/x, with 14 fractional bits + // + HVX_Vector rm = hvx_vec_recip_xp1_O3_unsigned(mant_u16); + + HVX_Vector vcl0 = Q6_Vuh_vcl0_Vuh(rm); //count leading zeros + + // Get mantissa for 16-bit represenation + HVX_Vector mant_recip = Q6_V_vand_VV(Q6_Vh_vasr_VhR(Q6_Vh_vasl_VhVh(rm, vcl0), 5), Q6_Vh_vsplat_R(0x03FF)); + + //Compute Reciprocal Exponent + HVX_Vector exp_recip = + Q6_Vh_vsub_VhVh(Q6_Vh_vsub_VhVh(Q6_Vh_vsplat_R(254), exp_u16), Q6_Vh_vsub_VhVh(vcl0, Q6_Vh_vsplat_R(1))); + //Convert it for 16-bit representation + exp_recip = Q6_Vh_vadd_VhVh_sat(Q6_Vh_vsub_VhVh(exp_recip, Q6_Vh_vsplat_R(127)), Q6_Vh_vsplat_R(15)); + exp_recip = Q6_Vh_vasl_VhR(exp_recip, 10); + + //Merge exponent and mantissa for reciprocal + HVX_Vector recip = Q6_V_vor_VV(exp_recip, mant_recip); + // map 'small' inputs to standard largest value 0x7bff + recip = Q6_V_vmux_QVV(is_small, Q6_Vh_vsplat_R(0x7bff), recip); + // add sign back + recip = Q6_V_vandor_VQR(recip, is_neg, 0x80008000); + return recip; +} + +#define IEEE_VSF_EXPLEN (8) +#define IEEE_VSF_EXPBIAS (127) +#define IEEE_VSF_EXPMASK (0xFF) +#define IEEE_VSF_MANTLEN (23) +#define IEEE_VSF_MANTMASK (0x7FFFFF) +#define IEEE_VSF_MIMPMASK (0x800000) + +static inline HVX_Vector hvx_vec_truncate_fp32(HVX_Vector in_vec) { + HVX_Vector mask_mant_v = Q6_V_vsplat_R(IEEE_VSF_MANTMASK); + HVX_Vector mask_impl_v = Q6_V_vsplat_R(IEEE_VSF_MIMPMASK); + HVX_Vector const_zero_v = Q6_V_vzero(); + + HVX_VectorPred q_negative = Q6_Q_vcmp_gt_VwVw(const_zero_v, in_vec); + + HVX_Vector expval_v = in_vec >> IEEE_VSF_MANTLEN; + expval_v &= IEEE_VSF_EXPMASK; + expval_v -= IEEE_VSF_EXPBIAS; + + // negative exp == fractional value + HVX_VectorPred q_negexp = Q6_Q_vcmp_gt_VwVw(const_zero_v, expval_v); + + HVX_Vector rshift_v = IEEE_VSF_MANTLEN - expval_v; // fractional bits - exp shift + + HVX_Vector mant_v = in_vec & mask_mant_v; // obtain mantissa + HVX_Vector vout = Q6_Vw_vadd_VwVw(mant_v, mask_impl_v); // add implicit 1.0 + + vout = Q6_Vw_vasr_VwVw(vout, rshift_v); // shift to obtain truncated integer + vout = Q6_V_vmux_QVV(q_negexp, const_zero_v, vout); // expval<0 -> 0 + + HVX_Vector neg_vout = -vout; + + vout = Q6_V_vmux_QVV(q_negative, neg_vout, vout); // handle negatives + + return (vout); +} + +static inline HVX_Vector hvx_vec_floor_fp32(HVX_Vector in_vec) { + HVX_Vector mask_mant_v = Q6_V_vsplat_R(IEEE_VSF_MANTMASK); + HVX_Vector mask_impl_v = Q6_V_vsplat_R(IEEE_VSF_MIMPMASK); + HVX_Vector const_mnlen_v = Q6_V_vsplat_R(IEEE_VSF_MANTLEN); + HVX_Vector const_zero_v = Q6_V_vzero(); + HVX_Vector const_negone_v = Q6_V_vsplat_R(0xbf800000); // -1 IEEE vsf + + HVX_VectorPred q_negative = Q6_Q_vcmp_gt_VwVw(const_zero_v, in_vec); + + HVX_Vector expval_v = in_vec >> IEEE_VSF_MANTLEN; + expval_v &= IEEE_VSF_EXPMASK; + expval_v -= IEEE_VSF_EXPBIAS; + + HVX_VectorPred q_negexp = Q6_Q_vcmp_gt_VwVw(const_zero_v, expval_v); + HVX_VectorPred q_expltmn = Q6_Q_vcmp_gt_VwVw(const_mnlen_v, expval_v); + HVX_VectorPred q_negexp_pos = Q6_Q_vcmp_gtand_QVwVw(q_negexp, in_vec, const_zero_v); + HVX_VectorPred q_negexp_neg = Q6_Q_vcmp_gtand_QVwVw(q_negexp, const_zero_v, in_vec); + + // if expval < 0 (q_negexp) // <0, floor is 0 + // if vin > 0 + // floor = 0 + // if vin < 0 + // floor = -1 + // if expval < mant_len (q_expltmn) // >0, but fraction may exist + // get sign (q_negative) + // mask >> expval // fraction bits to mask off + // vout = ~(mask) // apply mask to remove fraction + // if (qneg) // negative floor is one less (more, sign bit for neg) + // vout += ((impl_mask) >> expval) + // if (mask && vin) + // vout = vin + // else // already an integer + // ; // no change + + // compute floor + mask_mant_v >>= expval_v; + HVX_Vector neg_addin_v = mask_impl_v >> expval_v; + HVX_Vector vout_neg_addin = Q6_Vw_vadd_VwVw(in_vec, neg_addin_v); + HVX_Vector vout = Q6_V_vmux_QVV(q_negative, vout_neg_addin, in_vec); + + HVX_Vector mask_chk_v = Q6_V_vand_VV(in_vec, mask_mant_v); // chk if bits set + HVX_VectorPred q_integral = Q6_Q_vcmp_eq_VwVw(const_zero_v, mask_chk_v); + + HVX_Vector not_mask_v = Q6_V_vnot_V(mask_mant_v); // frac bits to clear + HVX_Vector vfrfloor_v = Q6_V_vand_VV(vout, not_mask_v); // clear frac bits + + vout = in_vec; + vout = Q6_V_vmux_QVV(q_expltmn, vfrfloor_v, vout); // expval0 -> 0 + vout = Q6_V_vmux_QVV(q_negexp_neg, const_negone_v, vout); // expval<0 x<0 -> -1 + + return vout; +} + +static inline HVX_Vector hvx_vec_i16_from_hf_rnd_sat(HVX_Vector vin) { + // This looks complicated. + // Ideally should just be Q6_Vh_equals_Vhf(vin) + // but that instruction does not do proper rounding. + + // convert to qf32, multiplying by 1.0 in the process. + HVX_VectorPair v32 = Q6_Wqf32_vmpy_VhfVhf(vin, Q6_Vh_vsplat_R(0x3C00)); + + // 'in-range' values are +/32752. + // add 192K to it, convert to sf + HVX_Vector v192K = Q6_V_vsplat_R(0x48400000); + HVX_Vector vsf_0 = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_Vqf32Vsf(Q6_V_lo_W(v32), v192K)); + HVX_Vector vsf_1 = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_Vqf32Vsf(Q6_V_hi_W(v32), v192K)); + + // for in-range cases, result is {163858... 229360} so the exponent is always 144. + // if we extract bits 21..0 as a signed quantity, and round 6 bits off, that will be the answer. + // Start by <<10 to get the final 'sign' bit in bit 15... + vsf_0 = Q6_Vw_vasl_VwR(vsf_0, 10); + vsf_1 = Q6_Vw_vasl_VwR(vsf_1, 10); + + // now round down to 16 + return Q6_Vh_vround_VwVw_sat(vsf_1, vsf_0); +} + +static inline HVX_Vector hvx_vec_inverse_fp32(HVX_Vector v_sf) { + HVX_Vector inv_aprox_sf = Q6_V_vsplat_R(0x7EEEEBB3); + HVX_Vector two_sf = hvx_vec_splat_fp32(2.0); + + // First approximation + HVX_Vector i_sf = Q6_Vw_vsub_VwVw(inv_aprox_sf, v_sf); + + HVX_Vector r_qf; + + // Refine + r_qf = Q6_Vqf32_vmpy_VsfVsf( + i_sf, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vsub_VsfVsf(two_sf, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(i_sf, v_sf))))); + r_qf = Q6_Vqf32_vmpy_Vqf32Vqf32( + r_qf, Q6_Vqf32_vsub_VsfVsf(two_sf, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(r_qf), v_sf)))); + r_qf = Q6_Vqf32_vmpy_Vqf32Vqf32( + r_qf, Q6_Vqf32_vsub_VsfVsf(two_sf, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(r_qf), v_sf)))); + + return Q6_Vsf_equals_Vqf32(r_qf); +} + +#define FAST_SIGMOID_LOG2F (0x3fb8aa3b) // 1.442695022 +#define FAST_SIGMOID_C1 (0x3d009076) // 0.03138777 +#define FAST_SIGMOID_C2 (0x3e8d74bd) // 0.276281267 +#define FAST_SIGMOID_C3 (0x3f000000) // 0.5 + +static inline HVX_Vector hvx_vec_fast_sigmoid_fp32(HVX_Vector v) { + v = Q6_Vqf32_vmpy_VsfVsf(v, Q6_V_vsplat_R(FAST_SIGMOID_LOG2F)); + v = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(v), Q6_V_vsplat_R(FAST_SIGMOID_C3)); + + HVX_Vector in_int = hvx_vec_truncate_fp32(Q6_Vsf_equals_Vqf32(v)); + HVX_Vector x = Q6_Vqf32_vsub_Vqf32Vsf(v, Q6_Vsf_equals_Vw(in_int)); + HVX_Vector xx = Q6_Vqf32_vmpy_Vqf32Vqf32(x, x); + + HVX_Vector v1 = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(xx), Q6_V_vsplat_R(FAST_SIGMOID_C2)); + v1 = Q6_Vqf32_vadd_Vqf32Vsf(v1, Q6_V_vsplat_R(FAST_SIGMOID_LOG2F)); + + HVX_Vector v2 = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(x), Q6_V_vsplat_R(FAST_SIGMOID_C1)); + v2 = Q6_Vqf32_vmpy_Vqf32Vqf32(v2, xx); + v2 = Q6_Vqf32_vadd_Vqf32Vqf32(v2, x); + + HVX_Vector v3 = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_Vqf32Vqf32(v2, v1)); + HVX_Vector v3_exponent = Q6_Vw_vasl_VwR(v3, 1); + v3_exponent = Q6_Vuw_vlsr_VuwR(v3_exponent, 24); + v3_exponent = Q6_Vw_vadd_VwVw(in_int, v3_exponent); + v3 = Q6_Vw_vaslacc_VwVwR(v3, in_int, 24); + + HVX_Vector v4 = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vsub_Vqf32Vqf32(v2, v1)); + HVX_Vector v5 = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vsub_VsfVsf(v3, v4)); + + HVX_Vector res = hvx_vec_inverse_fp32(v5); + res = Q6_Vqf32_vmpy_VsfVsf(v3, res); + + return Q6_Vsf_equals_Vqf32(res); +} + +#define EXP_COEFF_5 (0x39506967) // 0.000198757 = 1/(7!) +#define EXP_COEFF_4 (0x3AB743CE) // 0.0013982 = 1/(6!) +#define EXP_COEFF_3 (0x3C088908) // 0.00833345 = 1/(5!) +#define EXP_COEFF_2 (0x3D2AA9C1) // 0.416658 = 1/(4!) +#define EXP_COEFF_1 (0x3E2AAAAA) // 0.16666667 = 1/(3!) +#define EXP_COEFF_0 (0x3F000000) // 0.5 = 1/(2!) +#define EXP_LOGN2 (0x3F317218) // ln(2) = 0.6931471805 +#define EXP_LOG2E (0x3FB8AA3B) // log2(e) = 1/ln(2) = 1.4426950408 +#define EXP_ONE (0x3f800000) // 1.0 +#define EXP_RANGE_R (0x41a00000) // 20.0 +#define EXP_RANGE_L (0xc1a00000) // -20.0 + +static inline HVX_Vector hvx_vec_exp_fp32(HVX_Vector in_vec) { + HVX_Vector z_qf32_v; + HVX_Vector x_v; + HVX_Vector x_qf32_v; + HVX_Vector y_v; + HVX_Vector k_v; + HVX_Vector f_v; + HVX_Vector epsilon_v; + HVX_Vector log2e = Q6_V_vsplat_R(EXP_LOG2E); + HVX_Vector logn2 = Q6_V_vsplat_R(EXP_LOGN2); + HVX_Vector E_const; + HVX_Vector zero_v = Q6_V_vzero(); + + // exp(x) is approximated as follows: + // f = floor(x/ln(2)) = floor(x*log2(e)) + // epsilon = x - f*ln(2) + // exp(x) = exp(epsilon+f*ln(2)) + // = exp(epsilon)*exp(f*ln(2)) + // = exp(epsilon)*2^f + // + // Since epsilon is close to zero, it can be approximated with its Taylor series: + // exp(x) ~= 1+x+x^2/2!+x^3/3!+...+x^n/n!+... + // Preserving the first eight elements, we get: + // exp(x) ~= 1+x+e0*x^2+e1*x^3+e2*x^4+e3*x^5+e4*x^6+e5*x^7 + // = 1+x+(E0+(E1+(E2+(E3+(E4+E5*x)*x)*x)*x)*x)*x^2 + + HVX_Vector temp_v = in_vec; + + // Clamp inputs to (-20.0, 20.0) + HVX_VectorPred pred_cap_right = Q6_Q_vcmp_gt_VsfVsf(in_vec, Q6_V_vsplat_R(EXP_RANGE_R)); + HVX_VectorPred pred_cap_left = Q6_Q_vcmp_gt_VsfVsf(Q6_V_vsplat_R(EXP_RANGE_L), in_vec); + + in_vec = Q6_V_vmux_QVV(pred_cap_right, Q6_V_vsplat_R(EXP_RANGE_R), temp_v); + in_vec = Q6_V_vmux_QVV(pred_cap_left, Q6_V_vsplat_R(EXP_RANGE_L), temp_v); + + epsilon_v = Q6_Vqf32_vmpy_VsfVsf(log2e, in_vec); + epsilon_v = Q6_Vsf_equals_Vqf32(epsilon_v); + + // f_v is the floating point result and k_v is the integer result + f_v = hvx_vec_floor_fp32(epsilon_v); + k_v = hvx_vec_truncate_fp32(f_v); + + x_qf32_v = Q6_Vqf32_vadd_VsfVsf(in_vec, zero_v); + + // x = x - f_v * logn2; + epsilon_v = Q6_Vqf32_vmpy_VsfVsf(f_v, logn2); + x_qf32_v = Q6_Vqf32_vsub_Vqf32Vqf32(x_qf32_v, epsilon_v); + // normalize before every QFloat's vmpy + x_qf32_v = Q6_Vqf32_vadd_Vqf32Vsf(x_qf32_v, zero_v); + + // z = x * x; + z_qf32_v = Q6_Vqf32_vmpy_Vqf32Vqf32(x_qf32_v, x_qf32_v); + z_qf32_v = Q6_Vqf32_vadd_Vqf32Vsf(z_qf32_v, zero_v); + + x_v = Q6_Vsf_equals_Vqf32(x_qf32_v); + + // y = E4 + E5 * x; + E_const = Q6_V_vsplat_R(EXP_COEFF_5); + y_v = Q6_Vqf32_vmpy_VsfVsf(E_const, x_v); + E_const = Q6_V_vsplat_R(EXP_COEFF_4); + y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, E_const); + y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, zero_v); + + // y = E3 + y * x; + E_const = Q6_V_vsplat_R(EXP_COEFF_3); + y_v = Q6_Vqf32_vmpy_Vqf32Vqf32(y_v, x_qf32_v); + y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, E_const); + y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, zero_v); + + // y = E2 + y * x; + E_const = Q6_V_vsplat_R(EXP_COEFF_2); + y_v = Q6_Vqf32_vmpy_Vqf32Vqf32(y_v, x_qf32_v); + y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, E_const); + y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, zero_v); + + // y = E1 + y * x; + E_const = Q6_V_vsplat_R(EXP_COEFF_1); + y_v = Q6_Vqf32_vmpy_Vqf32Vqf32(y_v, x_qf32_v); + y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, E_const); + y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, zero_v); + + // y = E0 + y * x; + E_const = Q6_V_vsplat_R(EXP_COEFF_0); + y_v = Q6_Vqf32_vmpy_Vqf32Vqf32(y_v, x_qf32_v); + y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, E_const); + y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, zero_v); + + // y = x + y * z; + y_v = Q6_Vqf32_vmpy_Vqf32Vqf32(y_v, z_qf32_v); + y_v = Q6_Vqf32_vadd_Vqf32Vqf32(y_v, x_qf32_v); + y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, zero_v); + + // y = y + 1.0; + y_v = Q6_Vqf32_vadd_Vqf32Vsf(y_v, Q6_V_vsplat_R(EXP_ONE)); + + // insert exponents + // y = ldexpf(y, k); + // y_v += k_v; // qf32 + // modify exponent + + y_v = Q6_Vsf_equals_Vqf32(y_v); + + // add k_v to the exponent of y_v + HVX_Vector y_v_exponent = Q6_Vw_vasl_VwR(y_v, 1); + + y_v_exponent = Q6_Vuw_vlsr_VuwR(y_v_exponent, IEEE_VSF_MANTLEN + 1); + y_v_exponent = Q6_Vw_vadd_VwVw(k_v, y_v_exponent); + + // exponent cannot be negative; if overflow is detected, result is set to zero + HVX_VectorPred qy_v_negative_exponent = Q6_Q_vcmp_gt_VwVw(zero_v, y_v_exponent); + + y_v = Q6_Vw_vaslacc_VwVwR(y_v, k_v, IEEE_VSF_MANTLEN); + + y_v = Q6_V_vmux_QVV(qy_v_negative_exponent, zero_v, y_v); + + return y_v; +} + +#define RSQRT_CONST 0x5f3759df // Constant for fast inverse square root calculation +#define RSQRT_ONE_HALF 0x3f000000 // 0.5 +#define RSQRT_THREE_HALVES 0x3fc00000 // 1.5 + +static inline HVX_Vector hvx_vec_rsqrt_fp32(HVX_Vector in_vec) { + //Algorithm : + // x2 = input*0.5 + // y = * (long *) &input + // y = 0x5f3759df - (y>>2) + // y = y*(threehalfs - x2*y*y) + + HVX_Vector rsqrtconst = Q6_V_vsplat_R(RSQRT_CONST); + HVX_Vector onehalf = Q6_V_vsplat_R(RSQRT_ONE_HALF); + HVX_Vector threehalfs = Q6_V_vsplat_R(RSQRT_THREE_HALVES); + + HVX_Vector x2, y, ypower2, temp; + + x2 = Q6_Vqf32_vmpy_VsfVsf(in_vec, onehalf); + x2 = Q6_Vqf32_vadd_Vqf32Vsf(x2, Q6_V_vzero()); + + y = Q6_Vw_vasr_VwR(in_vec, 1); + y = Q6_Vw_vsub_VwVw(rsqrtconst, y); + + // 1st iteration + ypower2 = Q6_Vqf32_vmpy_VsfVsf(y, y); + ypower2 = Q6_Vqf32_vadd_Vqf32Vsf(ypower2, Q6_V_vzero()); + temp = Q6_Vqf32_vmpy_Vqf32Vqf32(x2, ypower2); + temp = Q6_Vqf32_vsub_VsfVsf(threehalfs, Q6_Vsf_equals_Vqf32(temp)); + temp = Q6_Vqf32_vmpy_VsfVsf(y, Q6_Vsf_equals_Vqf32(temp)); + + // 2nd iteration + y = Q6_Vqf32_vadd_Vqf32Vsf(temp, Q6_V_vzero()); + ypower2 = Q6_Vqf32_vmpy_Vqf32Vqf32(y, y); + ypower2 = Q6_Vqf32_vadd_Vqf32Vsf(ypower2, Q6_V_vzero()); + temp = Q6_Vqf32_vmpy_Vqf32Vqf32(x2, ypower2); + temp = Q6_Vqf32_vsub_VsfVsf(threehalfs, Q6_Vsf_equals_Vqf32(temp)); + temp = Q6_Vqf32_vmpy_Vqf32Vqf32(y, temp); + + // 3rd iteration + y = Q6_Vqf32_vadd_Vqf32Vsf(temp, Q6_V_vzero()); + ypower2 = Q6_Vqf32_vmpy_Vqf32Vqf32(y, y); + ypower2 = Q6_Vqf32_vadd_Vqf32Vsf(ypower2, Q6_V_vzero()); + temp = Q6_Vqf32_vmpy_Vqf32Vqf32(x2, ypower2); + temp = Q6_Vqf32_vsub_VsfVsf(threehalfs, Q6_Vsf_equals_Vqf32(temp)); + temp = Q6_Vqf32_vmpy_Vqf32Vqf32(y, temp); + + return Q6_Vsf_equals_Vqf32(temp); +} + +static inline HVX_Vector hvx_vec_fast_sigmoid_fp32_guard(HVX_Vector v, + HVX_Vector one, + HVX_Vector max_exp, + HVX_Vector min_exp) { + const HVX_VectorPred pred_max = Q6_Q_vcmp_gt_VsfVsf(max_exp, v); + const HVX_VectorPred pred_min = Q6_Q_vcmp_gt_VsfVsf(v, min_exp); + + HVX_Vector out = hvx_vec_fast_sigmoid_fp32(v); + out = Q6_V_vmux_QVV(pred_max, out, one); + return Q6_V_vmux_QVV(pred_min, out, Q6_V_vzero()); +} + +static inline void hvx_fast_sigmoid_f32(const uint8_t * restrict src, uint8_t * restrict dst, const int num_elems) { + int step_of_1 = num_elems >> 5; + int remaining = num_elems - step_of_1 * VLEN_FP32; + + const HVX_Vector * restrict v_src = (HVX_Vector *) src; + HVX_Vector * restrict v_dst = (HVX_Vector *) dst; + + static const float kMinExp = -87.f; // 0 + static const float kMaxExp = 87.f; // 1 + + const HVX_Vector one = hvx_vec_splat_fp32(1.f); + const HVX_Vector max_exp = hvx_vec_splat_fp32(kMaxExp); + const HVX_Vector min_exp = hvx_vec_splat_fp32(kMinExp); + + #pragma unroll(4) + for (int i = 0; i < step_of_1; i++) { + v_dst[i] = hvx_vec_fast_sigmoid_fp32_guard(v_src[i], one, max_exp, min_exp); + } + + if (remaining > 0) { + const float * srcf = ((const float *) src) + step_of_1* VLEN_FP32; + float * dstf = (float *) dst + step_of_1*VLEN_FP32; + + HVX_Vector in = *(HVX_UVector *) srcf; + HVX_Vector out = hvx_vec_fast_sigmoid_fp32_guard(in, one, max_exp, min_exp); + hvx_vec_store_u((void *) dstf, remaining * SIZEOF_FP32, out); + } +} + +static inline void hvx_sigmoid_f32(const uint8_t * restrict src, uint8_t * restrict dst, const int num_elems){ + int step_of_1 = num_elems >> 5; // divby 32, because 32 float = 128 bytes per HVX vector + int leftover = num_elems - (step_of_1 * VLEN_FP32); + + int32_t leftover_size = leftover * sizeof(float); + + static const float kMinExp = -87.f; // 0 + static const float kMaxExp = 87.f; // 1 + + const HVX_Vector one = hvx_vec_splat_fp32(1.f); + const HVX_Vector max_exp = hvx_vec_splat_fp32(kMaxExp); + const HVX_Vector min_exp = hvx_vec_splat_fp32(kMinExp); + + const float *input = (float *)src; + float *output = (float *)dst; + + HVX_Vector * input_v_ptr = (HVX_Vector *) input; + HVX_UVector * output_v_ptr = (HVX_UVector *) output; + + HVX_Vector slinep; + HVX_Vector slinec; + HVX_Vector sline; + + slinep = *input_v_ptr++; + #pragma unroll(4) + for (int i = step_of_1 - 1; i > 0; i--) { + slinec = *input_v_ptr++; + sline = Q6_V_valign_VVR(slinec, slinep, (size_t) input); + *((HVX_UVector *) (output_v_ptr++)) = hvx_vec_fast_sigmoid_fp32_guard(sline, one, max_exp, min_exp); + /* Prepare slinep for next iteration */ + slinep = slinec; + } + + if (step_of_1 > 0) { + slinec = htp_is_aligned(input_v_ptr, 128) && leftover == 0 ? slinep : *input_v_ptr++; + sline = Q6_V_valign_VVR(slinec, slinep, (size_t) input); + *((HVX_UVector *) (output_v_ptr++)) = hvx_vec_fast_sigmoid_fp32_guard(sline, one, max_exp, min_exp); + ; + + slinep = slinec; + } + if (leftover > 0) { + slinec = (is_in_one_chunk(input_v_ptr, leftover_size, 128) ? slinep : *input_v_ptr++); + + sline = Q6_V_valign_VVR(slinec, slinep, (size_t) input); + + HVX_Vector sout = hvx_vec_fast_sigmoid_fp32_guard(sline, one, max_exp, min_exp); + hvx_vec_store_u(output_v_ptr, leftover_size, sout); + } +} + + +float hvx_sum_of_squares_f32(const uint8_t * restrict src, const int num_elems); +void hvx_mul_f32(const uint8_t * restrict src0, + const uint8_t * restrict src1, + uint8_t * restrict dst, + const int num_elems); +void hvx_mul_f32_opt(const uint8_t * restrict src0, + const uint8_t * restrict src1, + uint8_t * restrict dst, + const int num_elems); +void hvx_mul_mul_f32_opt(const uint8_t * restrict src0, + const uint8_t * restrict src1, + const uint8_t * restrict src2, + uint8_t * restrict dst, + const int num_elems); +void hvx_mul_scalar_f32(const uint8_t * restrict src, const float val, uint8_t * restrict dst, const int num_elems); +void hvx_add_f32(const uint8_t * restrict src0, + const uint8_t * restrict src1, + uint8_t * restrict dst, + const int num_elems); +void hvx_add_f32_opt(const uint8_t * restrict src0, + const uint8_t * restrict src1, + uint8_t * restrict dst, + const int num_elems); +void hvx_add_scalar_f32(const uint8_t * restrict src, const float val, uint8_t * restrict dst, const int num_elems); +void hvx_sub_f32(const uint8_t * restrict src0, + const uint8_t * restrict src1, + uint8_t * restrict dst, + const int num_elems); +void hvx_sub_f32_opt(const uint8_t * restrict src0, + const uint8_t * restrict src1, + uint8_t * restrict dst, + const int num_elems); +void hvx_sub_scalar_f32(const uint8_t * restrict src, const float val, uint8_t * restrict dst, const int num_elems); +void hvx_scale_f32(const uint8_t * restrict src, uint8_t * restrict dst, const int num_elems, const float scale); +void hvx_inverse_f32(const uint8_t * restrict src, uint8_t * restrict dst, const int num_elems); +void hvx_sigmoid_f32(const uint8_t * restrict src, uint8_t * restrict dst, const int num_elems); +void hvx_exp_f32(const uint8_t * restrict src, uint8_t * restrict dst, const int num_elems, bool negate); +float hvx_self_max_f32(const uint8_t * restrict src, const int num_elems); +float hvx_self_sum_f32(const uint8_t * restrict src, const int num_elems); +void hvx_min_scalar_f32(const uint8_t * restrict src, const float val, uint8_t * restrict dst, const int num_elems); +void hvx_clamp_scalar_f32(const uint8_t * restrict src, + const float limit_left, + const float limit_right, + uint8_t * restrict dst, + const int num_elems); #endif /* HVX_UTILS_H */ diff --git a/ggml/src/ggml-hexagon/htp/main.c b/ggml/src/ggml-hexagon/htp/main.c index e28a67a..fb5508a 100644 --- a/ggml/src/ggml-hexagon/htp/main.c +++ b/ggml/src/ggml-hexagon/htp/main.c @@ -1,13 +1,17 @@ #pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" #pragma clang diagnostic ignored "-Wunused-function" -#include -#include +#define FARF_ERROR 1 +#define FARF_HIGH 1 +#define FARF_MEDIUM 0 +#define FARF_LOW 0 #include #include #include #include +#include #include +#include #include #include #include @@ -15,14 +19,13 @@ #include #include -#include "hex-dma.h" -#include "hex-utils.h" - #define GGML_COMMON_DECL_C #include "ggml-common.h" #include "htp-ctx.h" +#include "htp-dma.h" #include "htp-msg.h" #include "htp-ops.h" +#include "ops-utils.h" #include "worker-pool.h" AEEResult htp_iface_open(const char * uri, remote_handle64 * handle) { @@ -359,14 +362,14 @@ struct profile_data { static inline void profile_start(struct profile_data * d) { d->usecs = HAP_perf_get_qtimer_count(); - d->cycles = hex_get_cycles(); - d->pkts = hex_get_pktcnt(); + d->cycles = htp_get_cycles(); + d->pkts = htp_get_pktcnt(); } static inline void profile_stop(struct profile_data * d) { d->usecs = HAP_perf_qtimer_count_to_us(HAP_perf_get_qtimer_count() - d->usecs); - d->cycles = hex_get_cycles() - d->cycles; - d->pkts = hex_get_pktcnt() - d->pkts; + d->cycles = htp_get_cycles() - d->cycles; + d->pkts = htp_get_pktcnt() - d->pkts; } static int send_htp_rsp(struct htp_context * c, @@ -440,82 +443,6 @@ static void proc_matmul_req(struct htp_context * ctx, send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 1, &prof); } -static void proc_cpy_req(struct htp_context * ctx, struct htp_general_req * req, struct dspqueue_buffer * bufs) { - struct dspqueue_buffer rsp_bufs[1]; - - // We had written to the output buffer, we'd also need to flush it - rsp_bufs[0].fd = bufs[1].fd; - rsp_bufs[0].ptr = bufs[1].ptr; - rsp_bufs[0].offset = bufs[1].offset; - rsp_bufs[0].size = bufs[1].size; - rsp_bufs[0].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush HTP - DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate CPU - - // Setup Op context - struct htp_ops_context octx = { 0 }; - octx.ctx = ctx; - octx.src0 = req->src0; - octx.dst = req->dst; - octx.flags = req->flags; - octx.op = req->op; - - // Update data pointers - octx.src0.data = (uint32_t) bufs[0].ptr; - octx.dst.data = (uint32_t) bufs[1].ptr; - octx.n_threads = ctx->n_threads; - - struct profile_data prof; - profile_start(&prof); - - uint32_t rsp_status = HTP_STATUS_INTERNAL_ERR; - if (vtcm_acquire(ctx) == AEE_SUCCESS) { - rsp_status = op_cpy(&octx); - vtcm_release(ctx); - } - - profile_stop(&prof); - send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 1, &prof); -} - -static void proc_get_rows_req(struct htp_context * ctx, struct htp_general_req * req, struct dspqueue_buffer * bufs) { - struct dspqueue_buffer rsp_bufs[1]; - - // We had written to the output buffer, we'd also need to flush it - rsp_bufs[0].fd = bufs[2].fd; - rsp_bufs[0].ptr = bufs[2].ptr; - rsp_bufs[0].offset = bufs[2].offset; - rsp_bufs[0].size = bufs[2].size; - rsp_bufs[0].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush HTP - DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate CPU - - // Setup Op context - struct htp_ops_context octx = { 0 }; - octx.ctx = ctx; - octx.src0 = req->src0; - octx.src1 = req->src1; - octx.dst = req->dst; - octx.flags = req->flags; - octx.op = req->op; - - // Update data pointers - octx.src0.data = (uint32_t) bufs[0].ptr; - octx.src1.data = (uint32_t) bufs[1].ptr; - octx.dst.data = (uint32_t) bufs[2].ptr; - octx.n_threads = ctx->n_threads; - - struct profile_data prof; - profile_start(&prof); - - uint32_t rsp_status = HTP_STATUS_INTERNAL_ERR; - if (vtcm_acquire(ctx) == AEE_SUCCESS) { - rsp_status = op_get_rows(&octx); - vtcm_release(ctx); - } - - profile_stop(&prof); - send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 1, &prof); -} - static void proc_matmul_id_req(struct htp_context * ctx, struct htp_general_req * req, struct dspqueue_buffer * bufs, @@ -741,7 +668,7 @@ static void proc_rope_req(struct htp_context * ctx, uint32_t n_bufs) { struct dspqueue_buffer rsp_bufs[HTP_MAX_PACKET_BUFFERS]; - int write_idx = n_bufs - 1; + int write_idx = (n_bufs == 4) ? 3 : 2; // We had written to the output buffer, we'd also need to flush it rsp_bufs[0].fd = bufs[write_idx].fd; @@ -789,102 +716,6 @@ static void proc_rope_req(struct htp_context * ctx, send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 1, &prof); } -static void proc_set_rows_req(struct htp_context * ctx, struct htp_general_req * req, struct dspqueue_buffer * bufs) { - struct dspqueue_buffer rsp_bufs[1]; - - // We had written to the output buffer, we'd also need to flush it - rsp_bufs[0].fd = bufs[2].fd; - rsp_bufs[0].ptr = bufs[2].ptr; - rsp_bufs[0].offset = bufs[2].offset; - rsp_bufs[0].size = bufs[2].size; - rsp_bufs[0].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush HTP - DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate CPU - - // Setup Op context - struct htp_ops_context octx = { 0 }; - octx.ctx = ctx; - octx.src0 = req->src0; - octx.src1 = req->src1; - octx.dst = req->dst; - octx.flags = req->flags; - octx.op = req->op; - - // Update data pointers - octx.src0.data = (uint32_t) bufs[0].ptr; - octx.src1.data = (uint32_t) bufs[1].ptr; - octx.dst.data = (uint32_t) bufs[2].ptr; - octx.n_threads = ctx->n_threads; - - struct profile_data prof; - profile_start(&prof); - - uint32_t rsp_status = HTP_STATUS_INTERNAL_ERR; - if (vtcm_acquire(ctx) == AEE_SUCCESS) { - rsp_status = op_set_rows(&octx); - vtcm_release(ctx); - } - - profile_stop(&prof); - send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 1, &prof); -} - -static void proc_flash_attn_ext_req(struct htp_context * ctx, - struct htp_general_req * req, - struct dspqueue_buffer * bufs, - uint32_t n_bufs) { - // Setup Op context - struct htp_ops_context octx; - memset(&octx, 0, sizeof(octx)); - - octx.ctx = ctx; - octx.n_threads = ctx->n_threads; - - octx.src0 = req->src0; - octx.src1 = req->src1; - octx.src2 = req->src2; - octx.src3 = req->src3; - octx.src4 = req->src4; - octx.dst = req->dst; - octx.flags = req->flags; - octx.op = req->op; - - memcpy(octx.op_params, req->op_params, sizeof(octx.op_params)); - - // Update data pointers - octx.src0.data = (uint32_t) bufs[0].ptr; - octx.src1.data = (uint32_t) bufs[1].ptr; - octx.src2.data = (uint32_t) bufs[2].ptr; - - int last_buf = 3; - - if (octx.src3.ne[0]) { - octx.src3.data = (uint32_t) bufs[last_buf++].ptr; // mask is valid - } - - if (octx.src4.ne[0]) { - octx.src4.data = (uint32_t) bufs[last_buf++].ptr; // sinks is valid - } - - octx.dst.data = (uint32_t) bufs[last_buf].ptr; - - struct profile_data prof; - profile_start(&prof); - - uint32_t rsp_status = HTP_STATUS_INTERNAL_ERR; - if (vtcm_acquire(ctx) == AEE_SUCCESS) { - rsp_status = op_flash_attn_ext(&octx); - vtcm_release(ctx); - } - - profile_stop(&prof); - - struct dspqueue_buffer rsp_buf = bufs[last_buf]; - rsp_buf.flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush HTP - DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate CPU - - send_htp_rsp(ctx, req->op, rsp_status, &bufs[last_buf], 1, &prof); -} - static void htp_packet_callback(dspqueue_t queue, int error, void * context) { struct htp_context * ctx = (struct htp_context *) context; @@ -959,7 +790,6 @@ static void htp_packet_callback(dspqueue_t queue, int error, void * context) { break; case HTP_OP_RMS_NORM: - case HTP_OP_SCALE: if (n_bufs != 2) { FARF(ERROR, "Bad unary-req buffer list"); continue; @@ -1003,38 +833,6 @@ static void htp_packet_callback(dspqueue_t queue, int error, void * context) { proc_rope_req(ctx, &req, bufs, n_bufs); break; - case HTP_OP_FLASH_ATTN_EXT: - if (!(n_bufs >= 4 && n_bufs <= 6)) { - FARF(ERROR, "Bad flash-attn-ext-req buffer list"); - continue; - } - proc_flash_attn_ext_req(ctx, &req, bufs, n_bufs); - break; - - case HTP_OP_SET_ROWS: - if (n_bufs != 3) { - FARF(ERROR, "Bad set-rows-req buffer list"); - continue; - } - proc_set_rows_req(ctx, &req, bufs); - break; - - case HTP_OP_GET_ROWS: - if (n_bufs != 3) { - FARF(ERROR, "Bad get-rows-req buffer list"); - continue; - } - proc_get_rows_req(ctx, &req, bufs); - break; - - case HTP_OP_CPY: - if (n_bufs != 2) { - FARF(ERROR, "Bad cpy-req buffer list"); - continue; - } - proc_cpy_req(ctx, &req, bufs); - break; - default: FARF(ERROR, "Unknown Op %u", req.op); break; diff --git a/ggml/src/ggml-hexagon/htp/matmul-ops.c b/ggml/src/ggml-hexagon/htp/matmul-ops.c index 1603ff2..f14523d 100644 --- a/ggml/src/ggml-hexagon/htp/matmul-ops.c +++ b/ggml/src/ggml-hexagon/htp/matmul-ops.c @@ -3,33 +3,53 @@ #pragma clang diagnostic ignored "-Wunused-variable" #pragma clang diagnostic ignored "-Wunused-but-set-variable" +#ifdef HTP_DEBUG +# define FARF_HIGH 1 +#endif + #include +#include #include - +#include +#include +#include #include +#include #include -#include "hex-dma.h" -#include "hvx-utils.h" - #define GGML_COMMON_DECL_C #include "ggml-common.h" #include "htp-ctx.h" +#include "htp-dma.h" #include "htp-msg.h" #include "htp-ops.h" - -#define MM_SPAD_SRC0_NROWS 16 -#define MM_SPAD_SRC1_NROWS 16 -#define MM_SPAD_DST_NROWS 2 +#include "hvx-utils.h" +#include "ops-utils.h" struct htp_matmul_type { const char * type; void (*vec_dot)(const int n, float * restrict s, const void * restrict vx, const void * restrict vy); - void (*vec_dot_rx2)(const int n, float * restrict s, const void * restrict vx, uint32_t vx_row_size, const void * restrict vy); + void (*vec_dot_rx2)(const int n, + float * restrict s, + const void * restrict vx, + uint32_t vx_row_size, + const void * restrict vy); }; +typedef struct { + HVX_Vector v[2]; +} HVX_Vector_x2; + +typedef struct { + HVX_Vector v[4]; +} HVX_Vector_x4; + +typedef struct { + HVX_Vector v[8]; +} HVX_Vector_x8; + // vdelta control to replicate first 4x fp32 values across lanes -static const uint8_t __attribute__((aligned(128))) repl_4x_f32[128] = { +static const uint8_t __attribute__((aligned(128))) repl_4x_fp32[128] = { 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x10, 0x10, 0x10, 0x10, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x20, 0x20, 0x20, 0x20, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x10, 0x10, 0x10, 0x10, 0x04, @@ -40,7 +60,7 @@ static const uint8_t __attribute__((aligned(128))) repl_4x_f32[128] = { }; // vdelta control to replicate and interleave first 8x fp32 values across lanes -static const uint8_t __attribute__((aligned(128))) repl_interleave_8x_f32[128] = { +static const uint8_t __attribute__((aligned(128))) repl_interleave_8x_fp32[128] = { 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x20, 0x20, 0x20, 0x20, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x20, 0x20, 0x20, 0x20, 0x04, @@ -51,7 +71,7 @@ static const uint8_t __attribute__((aligned(128))) repl_interleave_8x_f32[128] = }; // vdelta control to replicate first fp32 value across all elements -static const uint8_t __attribute__((aligned(128))) repl_1x_f32[128] = { +static const uint8_t __attribute__((aligned(128))) repl_1x_fp32[128] = { 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x10, 0x10, 0x10, 0x10, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x20, 0x20, 0x20, 0x20, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x10, 0x10, 0x10, 0x10, 0x04, 0x04, 0x04, 0x04, 0x08, @@ -62,7 +82,7 @@ static const uint8_t __attribute__((aligned(128))) repl_1x_f32[128] = { }; // vdelta control to replicate first fp16 value across all elements -static const uint8_t __attribute__((aligned(128))) repl_1x_f16[128] = { +static const uint8_t __attribute__((aligned(128))) repl_1x_fp16[128] = { 0x00, 0x00, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x08, 0x08, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x10, 0x10, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x08, 0x08, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x20, 0x20, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x08, 0x08, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x10, 0x10, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x08, @@ -73,7 +93,7 @@ static const uint8_t __attribute__((aligned(128))) repl_1x_f16[128] = { }; // vdelta control to replicate first fp16 value across all elements -static const uint8_t __attribute__((aligned(128))) repl_2x_f16[128] = { +static const uint8_t __attribute__((aligned(128))) repl_2x_fp16[128] = { 0x00, 0x00, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x08, 0x08, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x10, 0x10, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x08, 0x08, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x20, 0x20, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x08, 0x08, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, @@ -109,7 +129,7 @@ static inline size_t q8x4x2_row_size(uint32_t ne) { // ensures perfect alignment of quants and full row const uint32_t qk = QK_Q8_0x4x2; const uint32_t nb = (ne + qk - 1) / qk; - return hex_round_up(ne + nb * 8 * sizeof(__fp16), 128); + return htp_round_up(ne + nb * 8 * sizeof(__fp16), 128); } static inline HVX_Vector_x8 hvx_vec_load_q4x4x8(const uint8_t * restrict ptr) { @@ -369,7 +389,7 @@ static void vec_dot_q4x4x2_q8x4x2(const int n, float * restrict s, const void * } // Reduce and convert into fp32 - r0_sum = hvx_vec_reduce_sum_f32(Q6_Vsf_equals_Vqf32(r0_sum)); + r0_sum = hvx_vec_fp32_reduce_sum(Q6_Vsf_equals_Vqf32(r0_sum)); hvx_vec_store_u(&s[0], 4, r0_sum); } @@ -465,8 +485,8 @@ static void vec_dot_q4x4x2_q8x4x2_rx2(const int n, } // Convert into fp32 and reduce - r0_sum = hvx_vec_reduce_sum_f32(Q6_Vsf_equals_Vqf32(r0_sum)); - r1_sum = hvx_vec_reduce_sum_f32(Q6_Vsf_equals_Vqf32(r1_sum)); + r0_sum = hvx_vec_fp32_reduce_sum(Q6_Vsf_equals_Vqf32(r0_sum)); + r1_sum = hvx_vec_fp32_reduce_sum(Q6_Vsf_equals_Vqf32(r1_sum)); HVX_VectorPair p0 = Q6_W_vshuff_VVR(r1_sum, r0_sum, 4); hvx_vec_store_u(&s[0], 8, Q6_V_lo_W(p0)); @@ -542,7 +562,7 @@ static void vec_dot_q8x4x2_q8x4x2(const int n, float * restrict s, const void * } // Reduce and convert into fp32 - r0_sum = hvx_vec_reduce_sum_f32(Q6_Vsf_equals_Vqf32(r0_sum)); + r0_sum = hvx_vec_fp32_reduce_sum(Q6_Vsf_equals_Vqf32(r0_sum)); hvx_vec_store_u(&s[0], 4, r0_sum); } @@ -638,8 +658,8 @@ static void vec_dot_q8x4x2_q8x4x2_rx2(const int n, } // Convert into fp32 and reduce - r0_sum = hvx_vec_reduce_sum_f32(Q6_Vsf_equals_Vqf32(r0_sum)); - r1_sum = hvx_vec_reduce_sum_f32(Q6_Vsf_equals_Vqf32(r1_sum)); + r0_sum = hvx_vec_fp32_reduce_sum(Q6_Vsf_equals_Vqf32(r0_sum)); + r1_sum = hvx_vec_fp32_reduce_sum(Q6_Vsf_equals_Vqf32(r1_sum)); HVX_VectorPair p0 = Q6_W_vshuff_VVR(r1_sum, r0_sum, 4); hvx_vec_store_u(&s[0], 8, Q6_V_lo_W(p0)); @@ -748,7 +768,7 @@ static void vec_dot_mxfp4x4x2_q8x4x2(const int n, } // Reduce and convert into fp32 - r0_sum = hvx_vec_reduce_sum_f32(Q6_Vsf_equals_Vqf32(r0_sum)); + r0_sum = hvx_vec_fp32_reduce_sum(Q6_Vsf_equals_Vqf32(r0_sum)); hvx_vec_store_u(&s[0], 4, r0_sum); } @@ -880,181 +900,152 @@ static void vec_dot_mxfp4x4x2_q8x4x2_rx2(const int n, } // Convert into fp32 and reduce - r0_sum = hvx_vec_reduce_sum_f32(Q6_Vsf_equals_Vqf32(r0_sum)); - r1_sum = hvx_vec_reduce_sum_f32(Q6_Vsf_equals_Vqf32(r1_sum)); + r0_sum = hvx_vec_fp32_reduce_sum(Q6_Vsf_equals_Vqf32(r0_sum)); + r1_sum = hvx_vec_fp32_reduce_sum(Q6_Vsf_equals_Vqf32(r1_sum)); HVX_VectorPair p0 = Q6_W_vshuff_VVR(r1_sum, r0_sum, 4); hvx_vec_store_u(&s[0], 8, Q6_V_lo_W(p0)); } -static void vec_dot_f16_f16_aa(const int n, float * restrict s, const void * restrict vx, const void * restrict vy) { - const HVX_Vector * restrict x = (const HVX_Vector *) vx; - const HVX_Vector * restrict y = (const HVX_Vector *) vy; +#if 1 +static void vec_dot_f16_f32(const int n, float * restrict s, const void * restrict x, const void * restrict y) { + if (0) { + float rsum = 0; + const __fp16 * restrict vx = (const __fp16 * restrict) x; + const float * restrict vy = (const float * restrict) y; - uint32_t nvec = n / VLEN_FP16; // num full fp16 hvx vectors - uint32_t nloe = n % VLEN_FP16; // leftover elements + for (uint32_t i = 0; i < n; i++) { + rsum += (float)vx[i] * vy[i]; + } + *s = rsum; + return; + } - HVX_Vector rsum = Q6_V_vsplat_R(0); + const HVX_UVector * restrict vx = (const HVX_UVector * restrict) x; + const HVX_UVectorPair * restrict vy = (const HVX_UVectorPair * restrict) y; + uint32_t nv0 = n / 64; // num full fp16 hvx vectors + uint32_t nv1 = n % 64; // leftover elements + + // for some reason we need volatile here so that the compiler doesn't try anything funky + volatile HVX_Vector rsum = Q6_V_vsplat_R(0); + float r_sum_scalar = 0.0f; uint32_t i = 0; - #pragma unroll(4) - for (i = 0; i < nvec; i++) { - HVX_VectorPair xy_qf = Q6_Wqf32_vmpy_VhfVhf(x[i], y[i]); - rsum = Q6_Vqf32_vadd_Vqf32Vqf32(rsum, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(xy_qf), Q6_V_hi_W(xy_qf))); + for (i = 0; i < nv0; i++) { + HVX_VectorPair yp = vy[i]; + + HVX_Vector x = vx[i]; + HVX_VectorPair xp = Q6_Wqf32_vmpy_VhfVhf(Q6_Vh_vshuff_Vh(x), Q6_Vh_vsplat_R(0x3C00)); // mul by 1.0 + + //NOTE: need volatile here to prevent compiler optimization + // Seem compiler cannot guarantee read-after-write?? + volatile HVX_Vector hi = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(Q6_V_hi_W(xp)), Q6_V_hi_W(yp)); + volatile HVX_Vector lo = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(Q6_V_lo_W(xp)), Q6_V_lo_W(yp)); + + HVX_Vector sum = Q6_Vqf32_vadd_Vqf32Vqf32(hi, lo); + rsum = Q6_Vqf32_vadd_Vqf32Vqf32(rsum, sum); } - if (nloe) { - HVX_VectorPred bmask = Q6_Q_vsetq_R(nloe * 2); - HVX_Vector x_hf = Q6_V_vand_QV(bmask, x[i]); - HVX_Vector y_hf = Q6_V_vand_QV(bmask, y[i]); + if (nv1) { + // HVX_VectorPair yp = vy[i]; - HVX_VectorPair xy_qf = Q6_Wqf32_vmpy_VhfVhf(x_hf, y_hf); - rsum = Q6_Vqf32_vadd_Vqf32Vqf32(rsum, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(xy_qf), Q6_V_hi_W(xy_qf))); + // HVX_Vector x = vx[i]; + // HVX_VectorPair xp = Q6_Wqf32_vmpy_VhfVhf(Q6_Vh_vshuff_Vh(x), Q6_Vh_vsplat_R(0x3C00)); // mul by 1.0 + + // if (nv1 >= 32) { + // volatile HVX_Vector hi = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(Q6_V_hi_W(xp)), Q6_V_hi_W(yp)); + // rsum = Q6_Vqf32_vadd_Vqf32Vqf32(rsum, hi); + // nv1 -= 32; + // } + + // rsum = hvx_vec_qf32_reduce_sum(rsum); + + // if (nv1) { + // volatile HVX_Vector lo = Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(Q6_V_lo_W(xp)), Q6_V_lo_W(yp)); + // HVX_Vector sum = hvx_vec_qf32_reduce_sum_n(lo, nv1); + // rsum = Q6_Vqf32_vadd_Vqf32Vqf32(rsum, sum); + // } + + //process the remainder using scalar loop + rsum = hvx_vec_qf32_reduce_sum(rsum); + const __fp16 * restrict sx = (const __fp16 * restrict) x; + const float * restrict sy = (const float * restrict) y; + + for (uint32_t i = nv0 * 64; i < n; i++) { + r_sum_scalar += (float) sx[i] * sy[i]; + } + + // hvx_vec_dump_fp16("X", x); + // hvx_vec_dump_fp16("Y", y); + // hvx_vec_dump_fp32("SUM", Q6_Vsf_equals_Vqf32(sum)); + // hvx_vec_dump_fp32("RSUM", Q6_Vsf_equals_Vqf32(rsum)); + } else { + rsum = hvx_vec_qf32_reduce_sum(rsum); } - rsum = Q6_Vsf_equals_Vqf32(hvx_vec_reduce_sum_qf32(rsum)); - hvx_vec_store_u(&s[0], 4, rsum); + *s = hvx_vec_get_fp32(Q6_Vsf_equals_Vqf32(rsum)) + r_sum_scalar; + +# ifdef HTP_DEBUG + { + float rsum = 0; + const __fp16 * restrict vx = (const __fp16 * restrict) x; + const float * restrict vy = (const float * restrict) y; + + for (uint32_t i = 0; i < n; i++) { + rsum += vx[i] * vy[i]; + } + + float diff = fabs(*s - rsum); + if (diff > 0.001) { + FARF(HIGH, "vec-dot-f16-missmatch: %u (%u:%u) expected %.6f got %.6f\n", n, nv0, nv1, rsum, *s); + // htp_dump_f16("x", vx, n); + // htp_dump_f32("y", vy, n); + } + } +# endif } +#else +static void vec_dot_f16_f32(const int n, float * restrict s, const void * restrict x, const void * restrict y) { + const uint32_t fk = 64; + const uint32_t nb = n / fk; -static void vec_dot_f16_f16_aa_rx2(const int n, - float * restrict s, - const void * restrict vx, - uint32_t vx_row_size, - const void * restrict vy) { - const HVX_Vector * restrict x0 = (const HVX_Vector *) vx; - const HVX_Vector * restrict x1 = (const HVX_Vector *) ((const uint8_t *) vx + vx_row_size); - const HVX_Vector * restrict y = (const HVX_Vector *) vy; + assert(n % fk == 0); + assert(nb % 4 == 0); - uint32_t nvec = n / VLEN_FP16; - uint32_t nloe = n % VLEN_FP16; + const uint32_t x_blk_size = 2 * fk; // fp16 + const uint32_t y_blk_size = 4 * fk; // fp32 + // Row sum (qf32) HVX_Vector rsum0 = Q6_V_vsplat_R(0); HVX_Vector rsum1 = Q6_V_vsplat_R(0); + HVX_Vector rsum2 = Q6_V_vsplat_R(0); + HVX_Vector rsum3 = Q6_V_vsplat_R(0); - uint32_t i = 0; + for (uint32_t i = 0; i < nb; i += 4) { + HVX_Vector_x4 vx = hvx_vec_load_x4_f16(x + (i * x_blk_size)); + HVX_Vector_x4 vy = hvx_vec_load_x4_f32_as_f16(y + (i * y_blk_size)); - #pragma unroll(2) - for (i = 0; i < nvec; i++) { - HVX_Vector y_hf = y[i]; - HVX_VectorPair xy0_qf = Q6_Wqf32_vmpy_VhfVhf(x0[i], y_hf); - HVX_VectorPair xy1_qf = Q6_Wqf32_vmpy_VhfVhf(x1[i], y_hf); + HVX_VectorPair fa0 = Q6_Wqf32_vmpy_VhfVhf(vx.v[0], vy.v[0]); + HVX_VectorPair fa1 = Q6_Wqf32_vmpy_VhfVhf(vx.v[1], vy.v[1]); + HVX_VectorPair fa2 = Q6_Wqf32_vmpy_VhfVhf(vx.v[2], vy.v[2]); + HVX_VectorPair fa3 = Q6_Wqf32_vmpy_VhfVhf(vx.v[3], vy.v[3]); - rsum0 = Q6_Vqf32_vadd_Vqf32Vqf32(rsum0, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(xy0_qf), Q6_V_hi_W(xy0_qf))); - rsum1 = Q6_Vqf32_vadd_Vqf32Vqf32(rsum1, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(xy1_qf), Q6_V_hi_W(xy1_qf))); + rsum0 = Q6_Vqf32_vadd_Vqf32Vqf32(rsum0, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(fa0), Q6_V_hi_W(fa0))); + rsum1 = Q6_Vqf32_vadd_Vqf32Vqf32(rsum1, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(fa1), Q6_V_hi_W(fa1))); + rsum2 = Q6_Vqf32_vadd_Vqf32Vqf32(rsum2, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(fa2), Q6_V_hi_W(fa2))); + rsum3 = Q6_Vqf32_vadd_Vqf32Vqf32(rsum3, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(fa3), Q6_V_hi_W(fa3))); } - if (nloe) { - HVX_VectorPred bmask = Q6_Q_vsetq_R(nloe * 2); - HVX_Vector x0_hf = Q6_V_vand_QV(bmask, x0[i]); - HVX_Vector x1_hf = Q6_V_vand_QV(bmask, x1[i]); - HVX_Vector y_hf = Q6_V_vand_QV(bmask, y[i]); - - HVX_VectorPair xy0_qf = Q6_Wqf32_vmpy_VhfVhf(x0_hf, y_hf); - HVX_VectorPair xy1_qf = Q6_Wqf32_vmpy_VhfVhf(x1_hf, y_hf); - - rsum0 = Q6_Vqf32_vadd_Vqf32Vqf32(rsum0, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(xy0_qf), Q6_V_hi_W(xy0_qf))); - rsum1 = Q6_Vqf32_vadd_Vqf32Vqf32(rsum1, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(xy1_qf), Q6_V_hi_W(xy1_qf))); - } - - rsum0 = Q6_Vsf_equals_Vqf32(hvx_vec_reduce_sum_qf32(rsum0)); - rsum1 = Q6_Vsf_equals_Vqf32(hvx_vec_reduce_sum_qf32(rsum1)); - HVX_VectorPair p0 = Q6_W_vshuff_VVR(rsum1, rsum0, 4); - - hvx_vec_store_u(&s[0], 8, Q6_V_lo_W(p0)); + // Reduce and convert into fp32 + rsum0 = Q6_Vqf32_vadd_Vqf32Vqf32(rsum0, rsum1); + rsum2 = Q6_Vqf32_vadd_Vqf32Vqf32(rsum2, rsum3); + HVX_Vector rsum = hvx_vec_qf32_reduce_sum(Q6_Vqf32_vadd_Vqf32Vqf32(rsum0, rsum2)); + hvx_vec_store_u(s, 4, Q6_Vsf_equals_Vqf32(rsum)); } +#endif -static void vec_dot_f16_f16_uu(const int n, float * restrict s, const void * restrict vx, const void * restrict vy) { - const HVX_UVector * restrict x = (const HVX_UVector *) vx; - const HVX_UVector * restrict y = (const HVX_UVector *) vy; - - uint32_t nvec = n / VLEN_FP16; // num full fp16 hvx vectors - uint32_t nloe = n % VLEN_FP16; // leftover elements - - HVX_Vector rsum = Q6_V_vsplat_R(0); - - uint32_t i = 0; - - #pragma unroll(4) - for (i = 0; i < nvec; i++) { - HVX_VectorPair xy_qf = Q6_Wqf32_vmpy_VhfVhf(x[i], y[i]); - rsum = Q6_Vqf32_vadd_Vqf32Vqf32(rsum, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(xy_qf), Q6_V_hi_W(xy_qf))); - } - - if (nloe) { - HVX_VectorPred bmask = Q6_Q_vsetq_R(nloe * 2); - HVX_Vector x_hf = Q6_V_vand_QV(bmask, x[i]); - HVX_Vector y_hf = Q6_V_vand_QV(bmask, y[i]); - - HVX_VectorPair xy_qf = Q6_Wqf32_vmpy_VhfVhf(x_hf, y_hf); - rsum = Q6_Vqf32_vadd_Vqf32Vqf32(rsum, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(xy_qf), Q6_V_hi_W(xy_qf))); - } - - rsum = Q6_Vsf_equals_Vqf32(hvx_vec_reduce_sum_qf32(rsum)); - hvx_vec_store_u(&s[0], 4, rsum); -} - -static void vec_dot_f16_f32_uu(const int n, float * restrict s, const void * restrict x, const void * restrict y) { - const HVX_UVector * restrict vx = (const HVX_UVector * restrict) x; - const HVX_UVector * restrict vy = (const HVX_UVector * restrict) y; - - uint32_t nvec = n / VLEN_FP16; // num full fp16 hvx vectors - uint32_t nloe = n % VLEN_FP16; // leftover elements - - const HVX_Vector zero = Q6_V_vsplat_R(0); - - HVX_Vector rsum = Q6_V_vsplat_R(0); - - uint32_t i = 0; - - #pragma unroll(2) - for (i = 0; i < nvec; i++) { - // Load y (fp32) and convert into fp16 - HVX_Vector y0_qf = Q6_Vqf32_vsub_VsfVsf(vy[i*2+0], zero); // 32 elements - HVX_Vector y1_qf = Q6_Vqf32_vsub_VsfVsf(vy[i*2+1], zero); // 32 elements - HVX_Vector y_hf = Q6_Vh_vdeal_Vh(Q6_Vhf_equals_Wqf32(Q6_W_vcombine_VV(y1_qf, y0_qf))); - - // Load x (fp16) - HVX_Vector x_hf = vx[i]; - - HVX_VectorPair xy_qf = Q6_Wqf32_vmpy_VhfVhf(x_hf, y_hf); - - rsum = Q6_Vqf32_vadd_Vqf32Vqf32(rsum, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(xy_qf), Q6_V_hi_W(xy_qf))); - } - - if (nloe) { - // Load y (fp32) and convert into fp16 - HVX_Vector y0_qf = Q6_Vqf32_vsub_VsfVsf(vy[i*2+0], zero); // 32 elements - HVX_Vector y1_qf = Q6_Vqf32_vsub_VsfVsf(vy[i*2+1], zero); // 32 elements - HVX_Vector y_hf = Q6_Vh_vdeal_Vh(Q6_Vhf_equals_Wqf32(Q6_W_vcombine_VV(y1_qf, y0_qf))); - - // Load x (fp16) - HVX_Vector x_hf = vx[i]; - - // Zero-out unused elements - // Note that we need to clear both x and y because they may contain NANs - HVX_VectorPred bmask = Q6_Q_vsetq_R(nloe * 2); - x_hf = Q6_V_vand_QV(bmask, x_hf); - y_hf = Q6_V_vand_QV(bmask, y_hf); - - HVX_VectorPair xy_qf = Q6_Wqf32_vmpy_VhfVhf(x_hf, y_hf); - - rsum = Q6_Vqf32_vadd_Vqf32Vqf32(rsum, Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_lo_W(xy_qf), Q6_V_hi_W(xy_qf))); - } - - rsum = Q6_Vsf_equals_Vqf32(hvx_vec_reduce_sum_qf32(rsum)); - hvx_vec_store_u(&s[0], 4, rsum); -} - -#define htp_matmul_tensors_preamble \ - struct htp_tensor * restrict src0 = &octx->src0; \ - struct htp_tensor * restrict src1 = &octx->src1; \ - struct htp_tensor * restrict src2 = &octx->src2; \ - struct htp_tensor * restrict dst = &octx->dst; \ - struct htp_spad * restrict src0_spad = &octx->src0_spad; \ - struct htp_spad * restrict src1_spad = &octx->src1_spad; \ - struct htp_spad * restrict dst_spad = &octx->dst_spad; \ - \ +#define htp_matmul_preamble \ const uint32_t ne00 = src0->ne[0]; \ const uint32_t ne01 = src0->ne[1]; \ const uint32_t ne02 = src0->ne[2]; \ @@ -1065,11 +1056,6 @@ static void vec_dot_f16_f32_uu(const int n, float * restrict s, const void * res const uint32_t ne12 = src1->ne[2]; \ const uint32_t ne13 = src1->ne[3]; \ \ - const uint32_t ne20 = src2->ne[0]; \ - const uint32_t ne21 = src2->ne[1]; \ - const uint32_t ne22 = src2->ne[2]; \ - const uint32_t ne23 = src2->ne[3]; \ - \ const uint32_t ne0 = dst->ne[0]; \ const uint32_t ne1 = dst->ne[1]; \ const uint32_t ne2 = dst->ne[2]; \ @@ -1090,94 +1076,18 @@ static void vec_dot_f16_f32_uu(const int n, float * restrict s, const void * res const uint32_t nb2 = dst->nb[2]; \ const uint32_t nb3 = dst->nb[3]; -#define htp_matmul_preamble \ - htp_matmul_tensors_preamble; \ - dma_queue *dma_queue = octx->ctx->dma[ith]; \ - uint32_t src0_nrows_per_thread = octx->src0_nrows_per_thread; - -// *** matmul with support for 4d tensors and full broadcasting - -static void matmul_4d(struct htp_matmul_type * mt, struct htp_ops_context * octx, uint32_t nth, uint32_t ith) { - htp_matmul_preamble; - - uint64_t t1, t2; - t1 = HAP_perf_get_qtimer_count(); - - assert(ne12 % ne02 == 0); - assert(ne13 % ne03 == 0); - - // This is the size of the first dimension of the result, so we can iterate that way. (see the ASSERT above, these are the same numbers) - const uint32_t nr0 = ne0; - - // This is the size of the rest of the dimensions of the result - const uint32_t nr1 = ne1 * ne2 * ne3; - - // distribute the thread work across the inner or outer loop based on which one is larger - uint32_t nchunk0 = nr0 > nr1 ? nth : 1; // parallelize by src0 rows - uint32_t nchunk1 = nr0 > nr1 ? 1 : nth; // parallelize by src1 rows - - // The number of elements in each chunk - const uint32_t dr0 = (nr0 + nchunk0 - 1) / nchunk0; - const uint32_t dr1 = (nr1 + nchunk1 - 1) / nchunk1; - - uint32_t current_chunk = ith; - - const uint32_t ith0 = current_chunk % nchunk0; - const uint32_t ith1 = current_chunk / nchunk0; - - const uint32_t ir0_start = dr0 * ith0; - const uint32_t ir0_end = MIN(ir0_start + dr0, nr0); - - const uint32_t ir1_start = dr1 * ith1; - const uint32_t ir1_end = MIN(ir1_start + dr1, nr1); - - // no work for this thread - if (ir0_start >= ir0_end || ir1_start >= ir1_end) { - return; - } - - // block-tiling attempt - const uint32_t blck_0 = 64; - const uint32_t blck_1 = 64; - - for (uint32_t iir1 = ir1_start; iir1 < ir1_end; iir1 += blck_1) { - for (uint32_t iir0 = ir0_start; iir0 < ir0_end; iir0 += blck_0) { - for (uint32_t ir1 = iir1; ir1 < MIN(iir1 + blck_1, ir1_end); ir1++) { - const uint32_t i13 = fastdiv(ir1, &octx->mm_div_ne12_ne1); - const uint32_t i12 = fastdiv(ir1 - i13 * ne12 * ne1, &octx->mm_div_ne1); - const uint32_t i11 = (ir1 - i13 * ne12 * ne1 - i12 * ne1); - - // broadcast src0 into src1 - const uint32_t i03 = fastdiv(i13, &octx->mm_div_r3); - const uint32_t i02 = fastdiv(i12, &octx->mm_div_r2); - - const uint32_t i1 = i11; - const uint32_t i2 = i12; - const uint32_t i3 = i13; - - const uint8_t * restrict src0_base = (const uint8_t *) src0->data + (0 + i02 * nb02 + i03 * nb03); - const uint8_t * restrict src1_col = (const uint8_t *) src1->data + (i11 * nb11 + i12 * nb12 + i13 * nb13); - float * dst_col = (float *) ((uint8_t * restrict) dst->data + (i1 * nb1 + i2 * nb2 + i3 * nb3)); - - const uint32_t ir0_block_end = MIN(iir0 + blck_0, ir0_end); - for (uint32_t ir0 = iir0; ir0 < ir0_block_end; ir0++) { - const uint8_t * restrict src0_row = src0_base + ir0 * nb01; - mt->vec_dot(ne00, &dst_col[ir0], src0_row, src1_col); - } - } - } - } - - t2 = HAP_perf_get_qtimer_count(); - - FARF(HIGH, "matmul-4d %d/%d: %ux%ux%ux%u (%u:%u %u:%u) * %ux%ux%ux%u -> %ux%ux%ux%u usec %u\n", ith, nth, - src0->ne[0], src0->ne[1], src0->ne[2], src0->ne[3], ir0_start, ir0_end, ir1_start, ir1_end, src1->ne[0], - src1->ne[1], src1->ne[2], src1->ne[3], dst->ne[0], dst->ne[1], dst->ne[2], dst->ne[3], - (unsigned) HAP_perf_qtimer_count_to_us(t2 - t1)); -} - -// src1 tensor is already in VTCM spad -static void matmul_2d(struct htp_matmul_type * mt, struct htp_ops_context * octx, uint32_t nth, uint32_t ith) { +// q8x4 src1 tensor is already in VTCM spad +static void matmul(struct htp_matmul_type * mt, + struct htp_tensor * restrict src0, + struct htp_tensor * restrict src1, + struct htp_tensor * restrict dst, + struct htp_spad * restrict src0_spad, + struct htp_spad * restrict src1_spad, + struct htp_spad * restrict dst_spad, + uint32_t nth, + uint32_t ith, + uint32_t src0_nrows_per_thread, + dma_queue * dma_queue) { htp_matmul_preamble; const uint32_t src0_nrows = ne01 * ne02 * ne03; // src0 rows @@ -1194,10 +1104,9 @@ static void matmul_2d(struct htp_matmul_type * mt, struct htp_ops_context * octx const size_t dst_row_size = nb1; const size_t src0_row_size = nb01; - const size_t src1_row_size = nb11; + const size_t src1_row_size = q8x4x2_row_size(ne10); - const size_t src0_stride = src0_spad->stride; - const size_t src1_stride = src1_spad->stride; + const size_t src0_row_size_padded = htp_round_up(src0_row_size, 128); // Per-thread VTCM scratchpads for all tensors // Note that the entire src1 tensor is already in VTCM @@ -1215,11 +1124,11 @@ static void matmul_2d(struct htp_matmul_type * mt, struct htp_ops_context * octx #pragma unroll(4) for (uint32_t ir0 = src0_start_row; ir0 < src0_end_row_x2; ir0 += 2) { const int is0 = (ir0 - src0_start_row); - if (is0 >= MM_SPAD_SRC0_NROWS) { + if (is0 >= HTP_SPAD_SRC0_NROWS) { break; } - dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_stride, src0_row + ir0 * src0_row_size), - src0_stride, src0_row_size, 2); + dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_row_size_padded, src0_row + ir0 * src0_row_size), + src0_row_size_padded, src0_row_size, 2); } // Process src0 rows @@ -1228,17 +1137,17 @@ static void matmul_2d(struct htp_matmul_type * mt, struct htp_ops_context * octx #pragma unroll(2) for (uint32_t ir1 = 0; ir1 < src1_nrows; ++ir1) { - const uint8_t * restrict src1_col = (const uint8_t *) (src1_data + ir1 * src1_stride); + const uint8_t * restrict src1_col = (const uint8_t *) (src1_data + ir1 * src1_row_size); float * restrict dst_row = (float *) (dst->data + (ir1 * dst_row_size)); - mt->vec_dot_rx2(ne00, &dst_row[ir0], ss0, src0_stride, src1_col); + mt->vec_dot_rx2(ne00, &dst_row[ir0], ss0, src0_row_size_padded, src1_col); } // Prefetch next (n + spad_nrows) row - const int pr0 = (ir0 + MM_SPAD_SRC0_NROWS); - const int is0 = (pr0 - src0_start_row) % MM_SPAD_SRC0_NROWS; + const int pr0 = (ir0 + HTP_SPAD_SRC0_NROWS); + const int is0 = (pr0 - src0_start_row) % HTP_SPAD_SRC0_NROWS; if (pr0 < src0_end_row_x2) { - dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_stride, src0_row + pr0 * src0_row_size), - src0_stride, src0_row_size, 2); + dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_row_size_padded, src0_row + pr0 * src0_row_size), + src0_row_size_padded, src0_row_size, 2); } } @@ -1246,13 +1155,13 @@ static void matmul_2d(struct htp_matmul_type * mt, struct htp_ops_context * octx if (src0_end_row != src0_end_row_x2) { uint32_t ir0 = src0_end_row_x2; const int is0 = (ir0 - src0_start_row); - dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_stride, src0_row + ir0 * src0_row_size), - src0_stride, src0_row_size, 1); + dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_row_size_padded, src0_row + ir0 * src0_row_size), + src0_row_size_padded, src0_row_size, 1); const uint8_t * ss0 = dma_queue_pop(dma_queue).dst; #pragma unroll(2) for (uint32_t ir1 = 0; ir1 < src1_nrows; ++ir1) { - const uint8_t * restrict src1_col = (const uint8_t *) (src1_data + ir1 * src1_stride); + const uint8_t * restrict src1_col = (const uint8_t *) (src1_data + ir1 * src1_row_size); float * restrict dst_row = (float *) (dst->data + (ir1 * dst_row_size)); mt->vec_dot(ne00, &dst_row[ir0], ss0, src1_col); } @@ -1267,7 +1176,17 @@ static void matmul_2d(struct htp_matmul_type * mt, struct htp_ops_context * octx } // q8x4x2 src1 tensor is already in VTCM spad -static void matvec_2d(struct htp_matmul_type * mt, struct htp_ops_context * octx, uint32_t nth, uint32_t ith) { +static void matvec(struct htp_matmul_type * mt, + struct htp_tensor * restrict src0, + struct htp_tensor * restrict src1, + struct htp_tensor * restrict dst, + struct htp_spad * restrict src0_spad, + struct htp_spad * restrict src1_spad, + struct htp_spad * restrict dst_spad, + uint32_t nth, + uint32_t ith, + uint32_t src0_nrows_per_thread, + dma_queue * dma_queue) { htp_matmul_preamble; const uint32_t src0_nrows = ne01; @@ -1283,10 +1202,9 @@ static void matvec_2d(struct htp_matmul_type * mt, struct htp_ops_context * octx const size_t dst_row_size = nb1; const size_t src0_row_size = nb01; - const size_t src1_row_size = nb11; + const size_t src1_row_size = q8x4x2_row_size(ne10); - const size_t src0_stride = src0_spad->stride; - const size_t src1_stride = src1_spad->stride; + const size_t src0_row_size_padded = htp_round_up(src0_row_size, 128); // Per-thread VTCM scratchpads for all tensors // Note that the entire src1 tensor is already in VTCM @@ -1308,24 +1226,24 @@ static void matvec_2d(struct htp_matmul_type * mt, struct htp_ops_context * octx #pragma unroll(2) for (uint32_t ir0 = src0_start_row; ir0 < src0_end_row_x2; ir0 += 2) { const uint32_t is0 = (ir0 - src0_start_row); - if (is0 >= MM_SPAD_SRC0_NROWS) { + if (is0 >= HTP_SPAD_SRC0_NROWS) { break; } - dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_stride, src0_row + ir0 * src0_row_size), - src0_stride, src0_row_size, 2); + dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_row_size_padded, src0_row + ir0 * src0_row_size), + src0_row_size_padded, src0_row_size, 2); } // Process src0 rows for (uint32_t ir0 = src0_start_row; ir0 < src0_end_row_x2; ir0 += 2) { const uint8_t * ss0 = dma_queue_pop(dma_queue).dst; - mt->vec_dot_rx2(ne00, &tmp[ir0 - src0_start_row], ss0, src0_stride, src1_col); + mt->vec_dot_rx2(ne00, &tmp[ir0 - src0_start_row], ss0, src0_row_size_padded, src1_col); // Prefetch next (n + spad_nrows) row - const uint32_t pr0 = (ir0 + MM_SPAD_SRC0_NROWS); - const uint32_t is0 = (pr0 - src0_start_row) % MM_SPAD_SRC0_NROWS; + const uint32_t pr0 = (ir0 + HTP_SPAD_SRC0_NROWS); + const uint32_t is0 = (pr0 - src0_start_row) % HTP_SPAD_SRC0_NROWS; if (pr0 < src0_end_row_x2) { - dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_stride, src0_row + pr0 * src0_row_size), - src0_stride, src0_row_size, 2); + dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_row_size_padded, src0_row + pr0 * src0_row_size), + src0_row_size_padded, src0_row_size, 2); } } @@ -1333,13 +1251,13 @@ static void matvec_2d(struct htp_matmul_type * mt, struct htp_ops_context * octx if (src0_end_row != src0_end_row_x2) { const uint32_t ir0 = src0_end_row_x2; const uint32_t is0 = (ir0 - src0_start_row); - dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_stride, src0_row + ir0 * src0_row_size), - src0_stride, src0_row_size, 1); + dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_row_size_padded, src0_row + ir0 * src0_row_size), + src0_row_size_padded, src0_row_size, 1); const uint8_t * ss0 = dma_queue_pop(dma_queue).dst; mt->vec_dot(ne00, &tmp[ir0 - src0_start_row], ss0, src1_col); } - hvx_copy_f32_ua((uint8_t *) &dst_col[src0_start_row], (uint8_t *) tmp, src0_end_row - src0_start_row); + hvx_copy_fp32_ua((uint8_t *) &dst_col[src0_start_row], (uint8_t *) tmp, src0_end_row - src0_start_row); t2 = HAP_perf_get_qtimer_count(); @@ -1356,13 +1274,22 @@ struct mmid_row_mapping { uint32_t i2; }; -// src1 tensor is already in VTCM spad -static void matmul_id(struct htp_matmul_type * mt, struct htp_ops_context * octx, uint32_t nth, uint32_t ith) { +// q8x4 src1 tensor is already in VTCM spad +static void matmul_id(struct htp_matmul_type * mt, + struct htp_tensor * restrict src0, + struct htp_tensor * restrict src1, + struct htp_tensor * restrict ids, + struct htp_tensor * restrict dst, + struct htp_spad * restrict src0_spad, + struct htp_spad * restrict src1_spad, + struct htp_spad * restrict src2_spad, + struct htp_spad * restrict dst_spad, + uint32_t nth, + uint32_t ith, + uint32_t src0_nrows_per_thread, + dma_queue * dma_queue) { htp_matmul_preamble; - struct htp_tensor * restrict ids = &octx->src2; - struct htp_spad * restrict src2_spad = &octx->src2_spad; - uint64_t t1, t2; t1 = HAP_perf_get_qtimer_count(); @@ -1391,7 +1318,7 @@ static void matmul_id(struct htp_matmul_type * mt, struct htp_ops_context * octx const size_t src0_row_size = nb01; const size_t src1_row_size = q8x4x2_row_size(ne10); - const size_t src0_row_size_padded = hex_round_up(src0_row_size, 128); + const size_t src0_row_size_padded = htp_round_up(src0_row_size, 128); // Per-thread VTCM scratchpads for all tensors // Note that the entire src1 tensor is already in VTCM @@ -1413,7 +1340,7 @@ static void matmul_id(struct htp_matmul_type * mt, struct htp_ops_context * octx #pragma unroll(4) for (uint32_t ir0 = src0_start_row; ir0 < src0_end_row_x2; ir0 += 2) { const int is0 = (ir0 - src0_start_row); - if (is0 >= MM_SPAD_SRC0_NROWS) { + if (is0 >= HTP_SPAD_SRC0_NROWS) { break; } dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_row_size_padded, src0_row + ir0 * src0_row_size), @@ -1438,8 +1365,8 @@ static void matmul_id(struct htp_matmul_type * mt, struct htp_ops_context * octx } // Prefetch next (n + spad_nrows) row - const int pr0 = (ir0 + MM_SPAD_SRC0_NROWS); - const int is0 = (pr0 - src0_start_row) % MM_SPAD_SRC0_NROWS; + const int pr0 = (ir0 + HTP_SPAD_SRC0_NROWS); + const int is0 = (pr0 - src0_start_row) % HTP_SPAD_SRC0_NROWS; if (pr0 < src0_end_row_x2) { dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_row_size_padded, src0_row + pr0 * src0_row_size), src0_row_size_padded, src0_row_size, 2); @@ -1477,13 +1404,22 @@ static void matmul_id(struct htp_matmul_type * mt, struct htp_ops_context * octx dst->ne[2], dst->ne[3], (unsigned) HAP_perf_qtimer_count_to_us(t2 - t1)); } -// src1 tensor is already in VTCM spad -static void matvec_id(struct htp_matmul_type * mt, struct htp_ops_context * octx, uint32_t nth, uint32_t ith) { +// q8x4 src1 tensor is already in VTCM spad +static void matvec_id(struct htp_matmul_type * mt, + struct htp_tensor * restrict src0, + struct htp_tensor * restrict src1, + struct htp_tensor * restrict src2, + struct htp_tensor * restrict dst, + struct htp_spad * restrict src0_spad, + struct htp_spad * restrict src1_spad, + struct htp_spad * restrict src2_spad, + struct htp_spad * restrict dst_spad, + uint32_t nth, + uint32_t ith, + uint32_t src0_nrows_per_thread, + dma_queue * dma_queue) { htp_matmul_preamble; - struct htp_tensor * restrict ids = &octx->src2; - struct htp_spad * restrict src2_spad = &octx->src2_spad; - uint64_t t1, t2; t1 = HAP_perf_get_qtimer_count(); @@ -1504,7 +1440,7 @@ static void matvec_id(struct htp_matmul_type * mt, struct htp_ops_context * octx const size_t src0_row_size = nb01; const size_t src1_row_size = q8x4x2_row_size(ne10); - const size_t src0_row_size_padded = hex_round_up(src0_row_size, 128); + const size_t src0_row_size_padded = htp_round_up(src0_row_size, 128); const uint32_t n_aids = src2->ne[0]; // num activated experts const uint32_t n_ids = ne02; // num experts @@ -1528,7 +1464,7 @@ static void matvec_id(struct htp_matmul_type * mt, struct htp_ops_context * octx #pragma unroll(4) for (uint32_t ir0 = src0_start_row; ir0 < src0_end_row_x2; ir0 += 2) { const int is0 = (ir0 - src0_start_row); - if (is0 >= MM_SPAD_SRC0_NROWS) { + if (is0 >= HTP_SPAD_SRC0_NROWS) { break; } dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_row_size_padded, src0_row + ir0 * src0_row_size), @@ -1541,8 +1477,8 @@ static void matvec_id(struct htp_matmul_type * mt, struct htp_ops_context * octx mt->vec_dot_rx2(ne00, &dst_row[ir0], ss0, src0_row_size_padded, src1_col); // Prefetch next (n + spad_nrows) row - const int pr0 = (ir0 + MM_SPAD_SRC0_NROWS); - const int is0 = (pr0 - src0_start_row) % MM_SPAD_SRC0_NROWS; + const int pr0 = (ir0 + HTP_SPAD_SRC0_NROWS); + const int is0 = (pr0 - src0_start_row) % HTP_SPAD_SRC0_NROWS; if (pr0 < src0_end_row_x2) { dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(spad_src0 + is0 * src0_row_size_padded, src0_row + pr0 * src0_row_size), src0_row_size_padded, src0_row_size, 2); @@ -1568,9 +1504,109 @@ static void matvec_id(struct htp_matmul_type * mt, struct htp_ops_context * octx dst->ne[1], dst->ne[2], dst->ne[3], (unsigned) HAP_perf_qtimer_count_to_us(t2 - t1)); } +// *** matmul in fp16 + +static void matmul_f16_f32(struct htp_tensor * restrict src0, + struct htp_tensor * restrict src1, + struct htp_tensor * restrict dst, + struct htp_spad * restrict src0_spad, + struct htp_spad * restrict src1_spad, + struct htp_spad * restrict dst_spad, + uint32_t nth, + uint32_t ith, + uint32_t src0_nrows_per_thread, + dma_queue * dma_queue) { + htp_matmul_preamble; + + uint64_t t1, t2; + t1 = HAP_perf_get_qtimer_count(); + + assert(ne12 % ne02 == 0); + assert(ne13 % ne03 == 0); + + // This is the size of the first dimension of the result, so we can iterate that way. (see the ASSERT above, these are the same numbers) + const uint32_t nr0 = ne0; + + // This is the size of the rest of the dimensions of the result + const uint32_t nr1 = ne1 * ne2 * ne3; + + // distribute the thread work across the inner or outer loop based on which one is larger + uint32_t nchunk0 = nr0 > nr1 ? nth : 1; // parallelize by src0 rows + uint32_t nchunk1 = nr0 > nr1 ? 1 : nth; // parallelize by src1 rows + + // The number of elements in each chunk + const uint32_t dr0 = (nr0 + nchunk0 - 1) / nchunk0; + const uint32_t dr1 = (nr1 + nchunk1 - 1) / nchunk1; + + uint32_t current_chunk = ith; + + const uint32_t ith0 = current_chunk % nchunk0; + const uint32_t ith1 = current_chunk / nchunk0; + + const uint32_t ir0_start = dr0 * ith0; + const uint32_t ir0_end = MIN(ir0_start + dr0, nr0); + + const uint32_t ir1_start = dr1 * ith1; + const uint32_t ir1_end = MIN(ir1_start + dr1, nr1); + + // broadcast factors + const uint32_t r2 = ne12 / ne02; + const uint32_t r3 = ne13 / ne03; + + // no work for this thread + if (ir0_start >= ir0_end || ir1_start >= ir1_end) { + return; + } + + // block-tiling attempt + const uint32_t blck_0 = 64; + const uint32_t blck_1 = 64; + + __attribute__((aligned(128))) float tmp[64]; + + for (uint32_t iir1 = ir1_start; iir1 < ir1_end; iir1 += blck_1) { + for (uint32_t iir0 = ir0_start; iir0 < ir0_end; iir0 += blck_0) { + for (uint32_t ir1 = iir1; ir1 < MIN(iir1 + blck_1, ir1_end); ir1++) { + const uint32_t i13 = (ir1 / (ne12 * ne1)); + const uint32_t i12 = (ir1 - i13 * ne12 * ne1) / ne1; + const uint32_t i11 = (ir1 - i13 * ne12 * ne1 - i12 * ne1); + + // broadcast src0 into src1 + const uint32_t i03 = i13 / r3; + const uint32_t i02 = i12 / r2; + + const uint32_t i1 = i11; + const uint32_t i2 = i12; + const uint32_t i3 = i13; + + const uint8_t * restrict src0_base = (const uint8_t *) src0->data + (0 + i02 * nb02 + i03 * nb03); + const uint8_t * restrict src1_col = + (const uint8_t *) src1->data + (i11 * nb11 + i12 * nb12 + i13 * nb13); + float * dst_col = (float *) ((uint8_t * restrict) dst->data + (i1 * nb1 + i2 * nb2 + i3 * nb3)); + + const uint32_t ir0_block_end = MIN(iir0 + blck_0, ir0_end); + for (uint32_t ir0 = iir0; ir0 < ir0_block_end; ir0++) { + // Use nb01 stride for non-contiguous src0 support + const uint8_t * restrict src0_row = src0_base + ir0 * nb01; + vec_dot_f16_f32(ne00, &tmp[ir0 - iir0], src0_row, src1_col); + } + + hvx_copy_fp32_ua((uint8_t *) &dst_col[iir0], (uint8_t *) tmp, MIN(iir0 + blck_0, ir0_end) - iir0); + } + } + } + + t2 = HAP_perf_get_qtimer_count(); + + FARF(HIGH, "matmul-f16-f32 %d/%d: %ux%ux%ux%u (%u:%u %u:%u) * %ux%ux%ux%u -> %ux%ux%ux%u usec %u\n", ith, nth, + src0->ne[0], src0->ne[1], src0->ne[2], src0->ne[3], ir0_start, ir0_end, ir1_start, ir1_end, src1->ne[0], + src1->ne[1], src1->ne[2], src1->ne[3], dst->ne[0], dst->ne[1], dst->ne[2], dst->ne[3], + (unsigned) HAP_perf_qtimer_count_to_us(t2 - t1)); +} + // *** dynamic quant -static inline void quantize_block_f32_q8x1(float * restrict x, uint8_t * restrict y_q, uint8_t * restrict y_d) { +static inline void quantize_block_fp32_q8x1(float * restrict x, uint8_t * restrict y_q, uint8_t * restrict y_d) { assert((unsigned long) x % 128 == 0); assert((unsigned long) y_q % 128 == 0); @@ -1578,10 +1614,10 @@ static inline void quantize_block_f32_q8x1(float * restrict x, uint8_t * restric HVX_Vector zero = Q6_V_vsplat_R(0); // Use reduce max fp32 to find max(abs(e)) first - HVX_Vector vmax0_sf = hvx_vec_reduce_max_f32(hvx_vec_abs_f32(vx[0])); - HVX_Vector vmax1_sf = hvx_vec_reduce_max_f32(hvx_vec_abs_f32(vx[1])); - HVX_Vector vmax2_sf = hvx_vec_reduce_max_f32(hvx_vec_abs_f32(vx[2])); - HVX_Vector vmax3_sf = hvx_vec_reduce_max_f32(hvx_vec_abs_f32(vx[3])); + HVX_Vector vmax0_sf = hvx_vec_reduce_max_fp32(hvx_vec_abs_fp32(vx[0])); + HVX_Vector vmax1_sf = hvx_vec_reduce_max_fp32(hvx_vec_abs_fp32(vx[1])); + HVX_Vector vmax2_sf = hvx_vec_reduce_max_fp32(hvx_vec_abs_fp32(vx[2])); + HVX_Vector vmax3_sf = hvx_vec_reduce_max_fp32(hvx_vec_abs_fp32(vx[3])); // Load and convert into QF32 HVX_Vector vx0_qf = Q6_Vqf32_vsub_VsfVsf(vx[0], zero); // 32 elements HVX_Vector vx1_qf = Q6_Vqf32_vsub_VsfVsf(vx[1], zero); // 32 elements @@ -1603,7 +1639,7 @@ static inline void quantize_block_f32_q8x1(float * restrict x, uint8_t * restric HVX_Vector vx23_hf = Q6_Vh_vdeal_Vh(Q6_Vhf_equals_Wqf32(Q6_W_vcombine_VV(vx3_qf, vx2_qf))); // Replicate first fp16 scale across all lanes - HVX_Vector ctrl = *(const HVX_Vector *) repl_2x_f16; + HVX_Vector ctrl = *(const HVX_Vector *) repl_2x_fp16; vmax01_hf = Q6_V_vdelta_VV(vmax01_hf, ctrl); vmax23_hf = Q6_V_vdelta_VV(vmax23_hf, ctrl); @@ -1621,8 +1657,8 @@ static inline void quantize_block_f32_q8x1(float * restrict x, uint8_t * restric hvx_vec_store_u(y_d + 6, 2, rotated_vd_hf); // Divide input by the scale - HVX_Vector vd01_inv_hf = hvx_vec_inverse_f16(vd01_hf); - HVX_Vector vd23_inv_hf = hvx_vec_inverse_f16(vd23_hf); + HVX_Vector vd01_inv_hf = hvx_vec_inverse_fp16(vd01_hf); + HVX_Vector vd23_inv_hf = hvx_vec_inverse_fp16(vd23_hf); vx01_hf = Q6_Vhf_equals_Vqf16(Q6_Vqf16_vmpy_VhfVhf(vx01_hf, vd01_inv_hf)); vx23_hf = Q6_Vhf_equals_Vqf16(Q6_Vqf16_vmpy_VhfVhf(vx23_hf, vd23_inv_hf)); @@ -1634,7 +1670,7 @@ static inline void quantize_block_f32_q8x1(float * restrict x, uint8_t * restric *(HVX_Vector *) y_q = vx_i8; } -static inline void quantize_block_f32_q8x2(float * restrict x, uint8_t * restrict y_q, uint8_t * restrict y_d) { +static inline void quantize_block_fp32_q8x2(float * restrict x, uint8_t * restrict y_q, uint8_t * restrict y_d) { assert((unsigned long) x % 128 == 0); assert((unsigned long) y_q % 128 == 0); @@ -1652,11 +1688,11 @@ static inline void quantize_block_f32_q8x2(float * restrict x, uint8_t * restric HVX_Vector vx23_hf = Q6_Vh_vdeal_Vh(Q6_Vhf_equals_Wqf32(Q6_W_vcombine_VV(vx3_qf, vx2_qf))); // Compute max and scale - HVX_Vector vmax01_hf = hvx_vec_reduce_max_f16(hvx_vec_abs_f16(vx01_hf)); - HVX_Vector vmax23_hf = hvx_vec_reduce_max_f16(hvx_vec_abs_f16(vx23_hf)); + HVX_Vector vmax01_hf = hvx_vec_reduce_max_fp16(hvx_vec_abs_fp16(vx01_hf)); + HVX_Vector vmax23_hf = hvx_vec_reduce_max_fp16(hvx_vec_abs_fp16(vx23_hf)); // Replicate first fp16 scale across all lanes - HVX_Vector ctrl = *(const HVX_Vector *) repl_1x_f16; + HVX_Vector ctrl = *(const HVX_Vector *) repl_1x_fp16; vmax01_hf = Q6_V_vdelta_VV(vmax01_hf, ctrl); vmax23_hf = Q6_V_vdelta_VV(vmax23_hf, ctrl); @@ -1669,8 +1705,8 @@ static inline void quantize_block_f32_q8x2(float * restrict x, uint8_t * restric hvx_vec_store_u(y_d + 4, 4, vd23_hf); // Divide input by the scale - HVX_Vector vd01_inv_hf = hvx_vec_inverse_f16(vd01_hf); - HVX_Vector vd23_inv_hf = hvx_vec_inverse_f16(vd23_hf); + HVX_Vector vd01_inv_hf = hvx_vec_inverse_fp16(vd01_hf); + HVX_Vector vd23_inv_hf = hvx_vec_inverse_fp16(vd23_hf); vx01_hf = Q6_Vhf_equals_Vqf16(Q6_Vqf16_vmpy_VhfVhf(vx01_hf, vd01_inv_hf)); vx23_hf = Q6_Vhf_equals_Vqf16(Q6_Vqf16_vmpy_VhfVhf(vx23_hf, vd23_inv_hf)); @@ -1682,7 +1718,7 @@ static inline void quantize_block_f32_q8x2(float * restrict x, uint8_t * restric *(HVX_Vector *) y_q = vx_i8; } -static inline void quantize_block_f32_q8x4(float * restrict x, uint8_t * restrict y_q, uint8_t * restrict y_d) { +static inline void quantize_block_fp32_q8x4(float * restrict x, uint8_t * restrict y_q, uint8_t * restrict y_d) { assert((unsigned long) x % 128 == 0); assert((unsigned long) y_q % 128 == 0); @@ -1700,11 +1736,11 @@ static inline void quantize_block_f32_q8x4(float * restrict x, uint8_t * restric HVX_Vector vx23_hf = Q6_Vh_vdeal_Vh(Q6_Vhf_equals_Wqf32(Q6_W_vcombine_VV(vx3_qf, vx2_qf))); // Compute max and scale - HVX_Vector vmax_hf = hvx_vec_reduce_max_f16(hvx_vec_abs_f16(vx01_hf)); - vmax_hf = hvx_vec_reduce_max2_f16(hvx_vec_abs_f16(vx23_hf), vmax_hf); + HVX_Vector vmax_hf = hvx_vec_reduce_max_fp16(hvx_vec_abs_fp16(vx01_hf)); + vmax_hf = hvx_vec_reduce_max2_fp16(hvx_vec_abs_fp16(vx23_hf), vmax_hf); // Replicate first fp16 scale across all lanes - HVX_Vector ctrl = *(const HVX_Vector *) repl_1x_f16; + HVX_Vector ctrl = *(const HVX_Vector *) repl_1x_fp16; vmax_hf = Q6_V_vdelta_VV(vmax_hf, ctrl); HVX_Vector vd_qf16 = Q6_Vqf16_vmpy_VhfVhf(vmax_hf, Q6_Vh_vsplat_R(0x2008)); // 1.0 / 127.0 @@ -1713,7 +1749,7 @@ static inline void quantize_block_f32_q8x4(float * restrict x, uint8_t * restric *(HVX_UVector *) y_d = vd_hf; // Divide input by the scale - HVX_Vector vd_inv_hf = hvx_vec_inverse_f16(vd_hf); + HVX_Vector vd_inv_hf = hvx_vec_inverse_fp16(vd_hf); vx01_hf = Q6_Vhf_equals_Vqf16(Q6_Vqf16_vmpy_VhfVhf(vx01_hf, vd_inv_hf)); vx23_hf = Q6_Vhf_equals_Vqf16(Q6_Vqf16_vmpy_VhfVhf(vx23_hf, vd_inv_hf)); @@ -1726,7 +1762,7 @@ static inline void quantize_block_f32_q8x4(float * restrict x, uint8_t * restric } // Overrides input x -static void quantize_row_f32_q8x4x2(float * restrict x, uint8_t * restrict y, uint32_t k) { +static void quantize_row_fp32_q8x4x2(float * restrict x, uint8_t * restrict y, uint32_t k) { assert(k % 32 == 0); const uint32_t qk = QK_Q8_0x4x2; const uint32_t nb = (k + qk - 1) / qk; @@ -1744,24 +1780,30 @@ static void quantize_row_f32_q8x4x2(float * restrict x, uint8_t * restrict y, ui for (uint32_t i = 0; i < nb; i++) { #if FP32_QUANTIZE_GROUP_SIZE == 32 - quantize_block_f32_q8x1(x + (i*2 + 0) * qk/2, y_q + (i*2 + 0) * qblk_size/2, t_d + (i*2 + 0) * dblk_size/2); - quantize_block_f32_q8x1(x + (i*2 + 1) * qk/2, y_q + (i*2 + 1) * qblk_size/2, t_d + (i*2 + 1) * dblk_size/2); + quantize_block_fp32_q8x1(x + (i * 2 + 0) * qk / 2, y_q + (i * 2 + 0) * qblk_size / 2, + t_d + (i * 2 + 0) * dblk_size / 2); + quantize_block_fp32_q8x1(x + (i * 2 + 1) * qk / 2, y_q + (i * 2 + 1) * qblk_size / 2, + t_d + (i * 2 + 1) * dblk_size / 2); #elif FP32_QUANTIZE_GROUP_SIZE == 64 - quantize_block_f32_q8x2(x + (i*2 + 0) * qk/2, y_q + (i*2 + 0) * qblk_size/2, t_d + (i*2 + 0) * dblk_size/2); - quantize_block_f32_q8x2(x + (i*2 + 1) * qk/2, y_q + (i*2 + 1) * qblk_size/2, t_d + (i*2 + 1) * dblk_size/2); + quantize_block_fp32_q8x2(x + (i * 2 + 0) * qk / 2, y_q + (i * 2 + 0) * qblk_size / 2, + t_d + (i * 2 + 0) * dblk_size / 2); + quantize_block_fp32_q8x2(x + (i * 2 + 1) * qk / 2, y_q + (i * 2 + 1) * qblk_size / 2, + t_d + (i * 2 + 1) * dblk_size / 2); #elif FP32_QUANTIZE_GROUP_SIZE == 128 - quantize_block_f32_q8x4(x + (i*2 + 0) * qk/2, y_q + (i*2 + 0) * qblk_size/2, t_d + (i*2 + 0) * dblk_size/2); - quantize_block_f32_q8x4(x + (i*2 + 1) * qk/2, y_q + (i*2 + 1) * qblk_size/2, t_d + (i*2 + 1) * dblk_size/2); + quantize_block_fp32_q8x4(x + (i * 2 + 0) * qk / 2, y_q + (i * 2 + 0) * qblk_size / 2, + t_d + (i * 2 + 0) * dblk_size / 2); + quantize_block_fp32_q8x4(x + (i * 2 + 1) * qk / 2, y_q + (i * 2 + 1) * qblk_size / 2, + t_d + (i * 2 + 1) * dblk_size / 2); #else #error "FP32_QUANTIZE_GROUP_SIZE must be 32, 64, or 128" #endif } // now copy the scales into final location - hvx_copy_f16_ua(y_d, t_d, nb * 8); + hvx_copy_fp16_ua(y_d, t_d, nb * 8); } -static void quantize_f32_q8x4x2(const struct htp_tensor * src, +static void quantize_fp32_q8x4x2(const struct htp_tensor * src, uint8_t * restrict dst, struct htp_spad * spad, uint32_t nth, @@ -1787,114 +1829,33 @@ static void quantize_f32_q8x4x2(const struct htp_tensor * src, uint8_t * restrict dst_data = (uint8_t *) dst + (dst_row_size * ir_first); uint8_t * restrict tmp_data = (uint8_t *) spad->data + (spad->size_per_thread * ith); - const size_t src_row_size_padded = hex_round_up(src_row_size, QK_Q8_0x4x2 * sizeof(float)); + const size_t src_row_size_padded = htp_round_up(src_row_size, QK_Q8_0x4x2 * sizeof(float)); memset(tmp_data, 0, src_row_size_padded); // zero-out temp row data for padding for (uint32_t i = ir_first; i < ir_last; ++i) { - hex_l2fetch(src_data, src_row_size, src_row_size, 2); - hvx_copy_f32_aa(tmp_data, src_data, ne0); + htp_l2fetch(src_data, 2, src_row_size, src_row_size); + hvx_copy_fp32_aa(tmp_data, src_data, ne0); // FARF(HIGH, "quantize-q8x4-row: %u\n", i); - quantize_row_f32_q8x4x2((float *) tmp_data, dst_data, ne0); + quantize_row_fp32_q8x4x2((float *) tmp_data, dst_data, ne0); dst_data += dst_row_size; src_data += src_row_size; } uint64_t t2 = HAP_perf_get_qtimer_count(); - FARF(HIGH, "quantize-f32-q8x4: %u/%u : n-rows %u (%u:%u) row-size %u -> %u usec %u\n", ith, nth, nrows, ir_first, + FARF(HIGH, "quantize-fp32-q8x4: %u/%u : n-rows %u (%u:%u) row-size %u -> %u usec %u\n", ith, nth, nrows, ir_first, ir_last, src_row_size, dst_row_size, (unsigned) HAP_perf_qtimer_count_to_us(t2 - t1)); } -static void quantize_f32_f16(const struct htp_tensor * src, uint8_t * restrict dst, uint32_t nth, uint32_t ith, - uint32_t nrows_per_thread, uint32_t dst_stride) { - - uint64_t t1 = HAP_perf_get_qtimer_count(); - - const uint32_t ne0 = src->ne[0]; - const uint32_t ne1 = src->ne[1]; - const uint32_t ne2 = src->ne[2]; - const uint32_t ne3 = src->ne[3]; - - const uint32_t nrows = ne1 * ne2 * ne3; // total n_rows - - const uint32_t ir_first = nrows_per_thread * ith; // first row - const uint32_t ir_last = MIN(ir_first + nrows_per_thread, nrows); // last row - - const size_t src_row_size = ne0 * sizeof(float); - const size_t src_stride = src->nb[1]; - - uint8_t * restrict src_data = (uint8_t *) src->data + (src_stride * ir_first); - uint8_t * restrict dst_data = (uint8_t *) dst + (dst_stride * ir_first); - - for (uint32_t i = ir_first; i < ir_last; ++i) { - hex_l2fetch(src_data, src_row_size, src_stride, 2); - hvx_copy_f16_f32_au(dst_data, src_data, ne0); - - dst_data += dst_stride; - src_data += src_stride; - } - - uint64_t t2 = HAP_perf_get_qtimer_count(); - - FARF(HIGH, "quantize-f32-f16: %u/%u : n-rows %u (%u:%u) row-size %u (%u) -> %u usec %u\n", ith, nth, nrows, ir_first, - ir_last, src_row_size, src_stride, dst_stride, (unsigned) HAP_perf_qtimer_count_to_us(t2 - t1)); -} - -// TODO just a plain copy that should be done via the DMA during the Op setup -static void quantize_f16_f16(const struct htp_tensor * src, uint8_t * restrict dst, uint32_t nth, uint32_t ith, - uint32_t nrows_per_thread, uint32_t dst_stride) { - - uint64_t t1 = HAP_perf_get_qtimer_count(); - - const uint32_t ne0 = src->ne[0]; - const uint32_t ne1 = src->ne[1]; - const uint32_t ne2 = src->ne[2]; - const uint32_t ne3 = src->ne[3]; - - const uint32_t nrows = ne1 * ne2 * ne3; // total n_rows - - const uint32_t ir_first = nrows_per_thread * ith; // first row - const uint32_t ir_last = MIN(ir_first + nrows_per_thread, nrows); // last row - - const size_t src_row_size = ne0 * sizeof(float); - const size_t src_stride = src->nb[1]; - - uint8_t * restrict src_data = (uint8_t *) src->data + (src_stride * ir_first); - uint8_t * restrict dst_data = (uint8_t *) dst + (dst_stride * ir_first); - - for (uint32_t i = ir_first; i < ir_last; ++i) { - hex_l2fetch(src_data, src_row_size, src_stride, 2); - hvx_copy_f16_au(dst_data, src_data, ne0); - - dst_data += dst_stride; - src_data += src_stride; - } - - uint64_t t2 = HAP_perf_get_qtimer_count(); - - FARF(HIGH, "quantize-f16-f16: %u/%u : n-rows %u (%u:%u) row-size %u (%u) -> %u usec %u\n", ith, nth, nrows, ir_first, - ir_last, src_row_size, src_stride, dst_stride, (unsigned) HAP_perf_qtimer_count_to_us(t2 - t1)); -} - -static void htp_quantize_f32_q8x4x2(unsigned int n, unsigned int i, void * data) { +static void htp_quantize_fp32_q8x4x2(unsigned int n, unsigned int i, void * data) { struct htp_ops_context * octx = data; - quantize_f32_q8x4x2(&octx->src1, octx->src1_spad.data, &octx->src0_spad, n, i, octx->src1_nrows_per_thread); + quantize_fp32_q8x4x2(&octx->src1, octx->src1_spad.data, &octx->src0_spad, n, i, octx->src1_nrows_per_thread); } -static void htp_quantize_f32_f16(unsigned int n, unsigned int i, void * data) { - struct htp_ops_context * octx = data; - quantize_f32_f16(&octx->src1, octx->src1_spad.data, n, i, octx->src1_nrows_per_thread, octx->src1_spad.stride); -} +// ** matmul callbacks for worker_pool -static void htp_quantize_f16_f16(unsigned int n, unsigned int i, void * data) { - struct htp_ops_context * octx = data; - quantize_f16_f16(&octx->src1, octx->src1_spad.data, n, i, octx->src1_nrows_per_thread, octx->src1_spad.stride); -} - -// ** matmul/matvec callbacks for worker_pool - -static void htp_matvec_2d_q4x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { +static void htp_matvec_q4x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { struct htp_ops_context * octx = data; struct htp_matmul_type mt; @@ -1902,10 +1863,11 @@ static void htp_matvec_2d_q4x4x2_q8x4x2(unsigned int n, unsigned int i, void * d mt.vec_dot = vec_dot_q4x4x2_q8x4x2; mt.vec_dot_rx2 = vec_dot_q4x4x2_q8x4x2_rx2; - matvec_2d(&mt, octx, n, i); + matvec(&mt, &octx->src0, &octx->src1, &octx->dst, &octx->src0_spad, &octx->src1_spad, &octx->dst_spad, n, i, + octx->src0_nrows_per_thread, octx->ctx->dma[i]); } -static void htp_matmul_2d_q4x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { +static void htp_matmul_q4x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { struct htp_ops_context * octx = data; struct htp_matmul_type mt; @@ -1913,10 +1875,11 @@ static void htp_matmul_2d_q4x4x2_q8x4x2(unsigned int n, unsigned int i, void * d mt.vec_dot = vec_dot_q4x4x2_q8x4x2; mt.vec_dot_rx2 = vec_dot_q4x4x2_q8x4x2_rx2; - matmul_2d(&mt, octx, n, i); + matmul(&mt, &octx->src0, &octx->src1, &octx->dst, &octx->src0_spad, &octx->src1_spad, &octx->dst_spad, n, i, + octx->src0_nrows_per_thread, octx->ctx->dma[i]); } -static void htp_matvec_2d_q8x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { +static void htp_matvec_q8x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { struct htp_ops_context * octx = data; struct htp_matmul_type mt; @@ -1924,10 +1887,11 @@ static void htp_matvec_2d_q8x4x2_q8x4x2(unsigned int n, unsigned int i, void * d mt.vec_dot = vec_dot_q8x4x2_q8x4x2; mt.vec_dot_rx2 = vec_dot_q8x4x2_q8x4x2_rx2; - matvec_2d(&mt, octx, n, i); + matvec(&mt, &octx->src0, &octx->src1, &octx->dst, &octx->src0_spad, &octx->src1_spad, &octx->dst_spad, n, i, + octx->src0_nrows_per_thread, octx->ctx->dma[i]); } -static void htp_matmul_2d_q8x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { +static void htp_matmul_q8x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { struct htp_ops_context * octx = data; struct htp_matmul_type mt; @@ -1935,10 +1899,11 @@ static void htp_matmul_2d_q8x4x2_q8x4x2(unsigned int n, unsigned int i, void * d mt.vec_dot = vec_dot_q8x4x2_q8x4x2; mt.vec_dot_rx2 = vec_dot_q8x4x2_q8x4x2_rx2; - matmul_2d(&mt, octx, n, i); + matmul(&mt, &octx->src0, &octx->src1, &octx->dst, &octx->src0_spad, &octx->src1_spad, &octx->dst_spad, n, i, + octx->src0_nrows_per_thread, octx->ctx->dma[i]); } -static void htp_matvec_2d_mxfp4x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { +static void htp_matvec_mxfp4x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { struct htp_ops_context * octx = data; struct htp_matmul_type mt; @@ -1946,10 +1911,11 @@ static void htp_matvec_2d_mxfp4x4x2_q8x4x2(unsigned int n, unsigned int i, void mt.vec_dot = vec_dot_mxfp4x4x2_q8x4x2; mt.vec_dot_rx2 = vec_dot_mxfp4x4x2_q8x4x2_rx2; - matvec_2d(&mt, octx, n, i); + matvec(&mt, &octx->src0, &octx->src1, &octx->dst, &octx->src0_spad, &octx->src1_spad, &octx->dst_spad, n, i, + octx->src0_nrows_per_thread, octx->ctx->dma[i]); } -static void htp_matmul_2d_mxfp4x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { +static void htp_matmul_mxfp4x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { struct htp_ops_context * octx = data; struct htp_matmul_type mt; @@ -1957,49 +1923,14 @@ static void htp_matmul_2d_mxfp4x4x2_q8x4x2(unsigned int n, unsigned int i, void mt.vec_dot = vec_dot_mxfp4x4x2_q8x4x2; mt.vec_dot_rx2 = vec_dot_mxfp4x4x2_q8x4x2_rx2; - matmul_2d(&mt, octx, n, i); + matmul(&mt, &octx->src0, &octx->src1, &octx->dst, &octx->src0_spad, &octx->src1_spad, &octx->dst_spad, n, i, + octx->src0_nrows_per_thread, octx->ctx->dma[i]); } -static void htp_matvec_2d_f16_f16(unsigned int n, unsigned int i, void * data) { +static void htp_matmul_f16_f32(unsigned int n, unsigned int i, void * data) { struct htp_ops_context * octx = data; - - struct htp_matmul_type mt; - mt.type = "f16-f16"; - mt.vec_dot = vec_dot_f16_f16_aa; - mt.vec_dot_rx2 = vec_dot_f16_f16_aa_rx2; - - matvec_2d(&mt, octx, n, i); -} - -static void htp_matmul_2d_f16_f16(unsigned int n, unsigned int i, void * data) { - struct htp_ops_context * octx = data; - - struct htp_matmul_type mt; - mt.type = "f16-f16"; - mt.vec_dot = vec_dot_f16_f16_aa; - mt.vec_dot_rx2 = vec_dot_f16_f16_aa_rx2; - - matmul_2d(&mt, octx, n, i); -} - -static void htp_matmul_4d_f16_f32(unsigned int n, unsigned int i, void * data) { - struct htp_ops_context * octx = data; - - struct htp_matmul_type mt; - mt.type = "f16-f32"; - mt.vec_dot = vec_dot_f16_f32_uu; - - matmul_4d(&mt, octx, n, i); -} - -static void htp_matmul_4d_f16_f16(unsigned int n, unsigned int i, void * data) { - struct htp_ops_context * octx = data; - - struct htp_matmul_type mt; - mt.type = "f16-f16"; - mt.vec_dot = vec_dot_f16_f16_uu; - - matmul_4d(&mt, octx, n, i); + matmul_f16_f32(&octx->src0, &octx->src1, &octx->dst, &octx->src0_spad, &octx->src1_spad, &octx->dst_spad, n, i, + octx->src0_nrows_per_thread, octx->ctx->dma[i]); } // ** matmul-id callbacks for worker_pool @@ -2012,7 +1943,8 @@ static void htp_matvec_id_q4x4x2_q8x4x2(unsigned int n, unsigned int i, void * d mt.vec_dot = vec_dot_q4x4x2_q8x4x2; mt.vec_dot_rx2 = vec_dot_q4x4x2_q8x4x2_rx2; - matvec_id(&mt, octx, n, i); + matvec_id(&mt, &octx->src0, &octx->src1, &octx->src2, &octx->dst, &octx->src0_spad, &octx->src1_spad, + &octx->src2_spad, &octx->dst_spad, n, i, octx->src0_nrows_per_thread, octx->ctx->dma[i]); } static void htp_matmul_id_q4x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { @@ -2023,7 +1955,8 @@ static void htp_matmul_id_q4x4x2_q8x4x2(unsigned int n, unsigned int i, void * d mt.vec_dot = vec_dot_q4x4x2_q8x4x2; mt.vec_dot_rx2 = vec_dot_q4x4x2_q8x4x2_rx2; - matmul_id(&mt, octx, n, i); + matmul_id(&mt, &octx->src0, &octx->src1, &octx->src2, &octx->dst, &octx->src0_spad, &octx->src1_spad, + &octx->src2_spad, &octx->dst_spad, n, i, octx->src0_nrows_per_thread, octx->ctx->dma[i]); } static void htp_matvec_id_q8x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { @@ -2034,7 +1967,8 @@ static void htp_matvec_id_q8x4x2_q8x4x2(unsigned int n, unsigned int i, void * d mt.vec_dot = vec_dot_q8x4x2_q8x4x2; mt.vec_dot_rx2 = vec_dot_q8x4x2_q8x4x2_rx2; - matvec_id(&mt, octx, n, i); + matvec_id(&mt, &octx->src0, &octx->src1, &octx->src2, &octx->dst, &octx->src0_spad, &octx->src1_spad, + &octx->src2_spad, &octx->dst_spad, n, i, octx->src0_nrows_per_thread, octx->ctx->dma[i]); } static void htp_matmul_id_q8x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { @@ -2045,7 +1979,8 @@ static void htp_matmul_id_q8x4x2_q8x4x2(unsigned int n, unsigned int i, void * d mt.vec_dot = vec_dot_q8x4x2_q8x4x2; mt.vec_dot_rx2 = vec_dot_q8x4x2_q8x4x2_rx2; - matmul_id(&mt, octx, n, i); + matmul_id(&mt, &octx->src0, &octx->src1, &octx->src2, &octx->dst, &octx->src0_spad, &octx->src1_spad, + &octx->src2_spad, &octx->dst_spad, n, i, octx->src0_nrows_per_thread, octx->ctx->dma[i]); } static void htp_matvec_id_mxfp4x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { @@ -2056,7 +1991,8 @@ static void htp_matvec_id_mxfp4x4x2_q8x4x2(unsigned int n, unsigned int i, void mt.vec_dot = vec_dot_mxfp4x4x2_q8x4x2; mt.vec_dot_rx2 = vec_dot_mxfp4x4x2_q8x4x2_rx2; - matvec_id(&mt, octx, n, i); + matvec_id(&mt, &octx->src0, &octx->src1, &octx->src2, &octx->dst, &octx->src0_spad, &octx->src1_spad, + &octx->src2_spad, &octx->dst_spad, n, i, octx->src0_nrows_per_thread, octx->ctx->dma[i]); } static void htp_matmul_id_mxfp4x4x2_q8x4x2(unsigned int n, unsigned int i, void * data) { @@ -2067,17 +2003,18 @@ static void htp_matmul_id_mxfp4x4x2_q8x4x2(unsigned int n, unsigned int i, void mt.vec_dot = vec_dot_mxfp4x4x2_q8x4x2; mt.vec_dot_rx2 = vec_dot_mxfp4x4x2_q8x4x2_rx2; - matmul_id(&mt, octx, n, i); + matmul_id(&mt, &octx->src0, &octx->src1, &octx->src2, &octx->dst, &octx->src0_spad, &octx->src1_spad, + &octx->src2_spad, &octx->dst_spad, n, i, octx->src0_nrows_per_thread, octx->ctx->dma[i]); } // ** main matmul entry point -static inline bool htp_is_permuted(const struct htp_tensor * t) { - return t->nb[0] > t->nb[1] || t->nb[1] > t->nb[2] || t->nb[2] > t->nb[3]; -} - int op_matmul(struct htp_ops_context * octx) { - htp_matmul_tensors_preamble; + const struct htp_tensor * src0 = &octx->src0; + const struct htp_tensor * src1 = &octx->src1; + struct htp_tensor * dst = &octx->dst; + + htp_matmul_preamble; const char * op_type; @@ -2088,7 +2025,7 @@ int op_matmul(struct htp_ops_context * octx) { const size_t dst_row_size = nb1; size_t src1_row_size = nb11; - const size_t src0_row_size_padded = hex_round_up(src0_row_size, 128); + const size_t src0_row_size_padded = htp_round_up(src0_row_size, 128); size_t src1_row_size_padded; worker_callback_t quant_job_func; @@ -2098,12 +2035,12 @@ int op_matmul(struct htp_ops_context * octx) { switch (src0->type) { case HTP_TYPE_Q4_0: - op_type = "q4x4x2-f32"; - quant_job_func = htp_quantize_f32_q8x4x2; + op_type = "q4x4x2-fp32"; + quant_job_func = htp_quantize_fp32_q8x4x2; if (src1_nrows > 1) { - matmul_job_func = htp_matmul_2d_q4x4x2_q8x4x2; + matmul_job_func = htp_matmul_q4x4x2_q8x4x2; } else { - matmul_job_func = htp_matvec_2d_q4x4x2_q8x4x2; + matmul_job_func = htp_matvec_q4x4x2_q8x4x2; } src1_row_size = q8x4x2_row_size(ne10); // row size post quantization @@ -2111,12 +2048,12 @@ int op_matmul(struct htp_ops_context * octx) { // Entire src1 tensor is placed into the VTCM // For other tensors we allocate N rows per thread, padded to HVX vector size - octx->dst_spad.size_per_thread = hex_round_up(MM_SPAD_DST_NROWS * dst_row_size, 256); - octx->src0_spad.size_per_thread = hex_round_up(MM_SPAD_SRC0_NROWS * src0_row_size_padded, 256); - octx->src1_spad.size_per_thread = hex_round_up(src1_row_size * src1_nrows, 256); + octx->dst_spad.size_per_thread = htp_round_up(HTP_SPAD_DST_NROWS * dst_row_size, 256); + octx->src0_spad.size_per_thread = htp_round_up(HTP_SPAD_SRC0_NROWS * src0_row_size_padded, 256); + octx->src1_spad.size_per_thread = htp_round_up(src1_row_size * src1_nrows, 256); // src0 spad is also used in dynamic quantizer to store padded src1 rows - src1_row_size_padded = hex_round_up(src1_row_size, QK_Q8_0x4x2 * sizeof(float)); + src1_row_size_padded = htp_round_up(src1_row_size, QK_Q8_0x4x2 * sizeof(float)); if (octx->src0_spad.size_per_thread < src1_row_size_padded) { octx->src0_spad.size_per_thread = src1_row_size_padded; } @@ -2127,12 +2064,12 @@ int op_matmul(struct htp_ops_context * octx) { break; case HTP_TYPE_Q8_0: - op_type = "q8x4x2-f32"; - quant_job_func = htp_quantize_f32_q8x4x2; + op_type = "q8x4x2-fp32"; + quant_job_func = htp_quantize_fp32_q8x4x2; if (src1_nrows > 1) { - matmul_job_func = htp_matmul_2d_q8x4x2_q8x4x2; + matmul_job_func = htp_matmul_q8x4x2_q8x4x2; } else { - matmul_job_func = htp_matvec_2d_q8x4x2_q8x4x2; + matmul_job_func = htp_matvec_q8x4x2_q8x4x2; } src1_row_size = q8x4x2_row_size(ne10); // row size post quantization @@ -2140,12 +2077,12 @@ int op_matmul(struct htp_ops_context * octx) { // Entire src1 tensor is placed into the VTCM // For other tensors we allocate N rows per thread, padded to HVX vector size - octx->dst_spad.size_per_thread = hex_round_up(MM_SPAD_DST_NROWS * dst_row_size, 256); - octx->src0_spad.size_per_thread = hex_round_up(MM_SPAD_SRC0_NROWS * src0_row_size_padded, 256); - octx->src1_spad.size_per_thread = hex_round_up(src1_row_size * src1_nrows, 256); + octx->dst_spad.size_per_thread = htp_round_up(HTP_SPAD_DST_NROWS * dst_row_size, 256); + octx->src0_spad.size_per_thread = htp_round_up(HTP_SPAD_SRC0_NROWS * src0_row_size_padded, 256); + octx->src1_spad.size_per_thread = htp_round_up(src1_row_size * src1_nrows, 256); // src0 spad is also used in dynamic quantizer to store padded src1 rows - src1_row_size_padded = hex_round_up(src1_row_size, QK_Q8_0x4x2 * sizeof(float)); + src1_row_size_padded = htp_round_up(src1_row_size, QK_Q8_0x4x2 * sizeof(float)); if (octx->src0_spad.size_per_thread < src1_row_size_padded) { octx->src0_spad.size_per_thread = src1_row_size_padded; } @@ -2157,11 +2094,11 @@ int op_matmul(struct htp_ops_context * octx) { case HTP_TYPE_MXFP4: op_type = "mxfp4x4x2-f32"; - quant_job_func = htp_quantize_f32_q8x4x2; + quant_job_func = htp_quantize_fp32_q8x4x2; if (src1_nrows > 1) { - matmul_job_func = htp_matmul_2d_mxfp4x4x2_q8x4x2; + matmul_job_func = htp_matmul_mxfp4x4x2_q8x4x2; } else { - matmul_job_func = htp_matvec_2d_mxfp4x4x2_q8x4x2; + matmul_job_func = htp_matvec_mxfp4x4x2_q8x4x2; } src1_row_size = q8x4x2_row_size(ne10); // row size post quantization @@ -2169,12 +2106,12 @@ int op_matmul(struct htp_ops_context * octx) { // Entire src1 tensor is placed into the VTCM // For other tensors we allocate N rows per thread, padded to HVX vector size - octx->dst_spad.size_per_thread = hex_round_up(MM_SPAD_DST_NROWS * dst_row_size, 256); - octx->src0_spad.size_per_thread = hex_round_up(MM_SPAD_SRC0_NROWS * src0_row_size_padded, 256); - octx->src1_spad.size_per_thread = hex_round_up(src1_row_size * src1_nrows, 256); + octx->dst_spad.size_per_thread = htp_round_up(HTP_SPAD_DST_NROWS * dst_row_size, 256); + octx->src0_spad.size_per_thread = htp_round_up(HTP_SPAD_SRC0_NROWS * src0_row_size_padded, 256); + octx->src1_spad.size_per_thread = htp_round_up(src1_row_size * src1_nrows, 256); // src0 spad is also used in dynamic quantizer to store padded src1 rows - src1_row_size_padded = hex_round_up(src1_row_size, QK_Q8_0x4x2 * sizeof(float)); + src1_row_size_padded = htp_round_up(src1_row_size, QK_Q8_0x4x2 * sizeof(float)); if (octx->src0_spad.size_per_thread < src1_row_size_padded) { octx->src0_spad.size_per_thread = src1_row_size_padded; } @@ -2185,69 +2122,20 @@ int op_matmul(struct htp_ops_context * octx) { break; case HTP_TYPE_F16: - { - // Try optimized f16-f16 path first (src1 in VTCM) - const size_t f16_src1_row_size = hex_round_up(ne10 * 2, 128); - const size_t f16_src1_spad_size = hex_round_up(f16_src1_row_size * src1_nrows, 256); - const size_t f16_src0_spad_size = hex_round_up(MM_SPAD_SRC0_NROWS * src0_row_size_padded, 256) * octx->n_threads; - const size_t f16_dst_spad_size = hex_round_up(MM_SPAD_DST_NROWS * dst_row_size, 256) * octx->n_threads; + op_type = "f16-f32"; + quant_job_func = NULL; // htp_quantize_f32_f16; + matmul_job_func = htp_matmul_f16_f32; - const size_t f16_total_size = f16_src1_spad_size + f16_src0_spad_size + f16_dst_spad_size; + // For all tensors we allocate N rows per thread, padded to HVX vector size + octx->dst_spad.size_per_thread = htp_round_up(HTP_SPAD_DST_NROWS * dst_row_size, 256); + octx->src0_spad.size_per_thread = htp_round_up(HTP_SPAD_SRC0_NROWS * src0_row_size, 256); + octx->src1_spad.size_per_thread = htp_round_up(HTP_SPAD_SRC1_NROWS * src1_row_size, 256); - // Default matmul implementation does not support multi-batch src0 (N-vs-N broadcasting). - // It only supports 1-vs-N broadcasting (src0 is 2D) or standard 2D matmul. - const bool is_batched = (ne02 > 1) || (ne03 > 1); - const bool is_permuted = htp_is_permuted(&octx->src0) || htp_is_permuted(&octx->src1); + octx->src0_spad.size = octx->src0_spad.size_per_thread * octx->n_threads; + octx->src1_spad.size = octx->src1_spad.size_per_thread * octx->n_threads; + octx->dst_spad.size = octx->dst_spad.size_per_thread * octx->n_threads; - if (!is_batched && !is_permuted && f16_total_size <= octx->ctx->vtcm_size) { - // Optimized path - op_type = "f16-f16"; - quant_job_func = (src1->type == HTP_TYPE_F32) ? htp_quantize_f32_f16 : htp_quantize_f16_f16; - if (src1_nrows > 1) { - matmul_job_func = htp_matmul_2d_f16_f16; - } else { - matmul_job_func = htp_matvec_2d_f16_f16; - } - - src1_row_size = f16_src1_row_size; // row size post quantization - - octx->dst_spad.size_per_thread = hex_round_up(MM_SPAD_DST_NROWS * dst_row_size, 256); - octx->src0_spad.size_per_thread = hex_round_up(MM_SPAD_SRC0_NROWS * src0_row_size_padded, 256); - octx->src1_spad.size_per_thread = hex_round_up(src1_row_size * src1_nrows, 256); - - octx->src1_spad.size = octx->src1_spad.size_per_thread; - octx->src0_spad.size = octx->src0_spad.size_per_thread * octx->n_threads; - octx->dst_spad.size = octx->dst_spad.size_per_thread * octx->n_threads; - } else { - // Fallback to f16/f32 (DDR) if src1 doesn't fit in VTCM or broadcasting is required - quant_job_func = NULL; - if (src1->type == HTP_TYPE_F32) { - op_type = "f16-f32"; - matmul_job_func = htp_matmul_4d_f16_f32; - } else { - op_type = "f16-f16"; - matmul_job_func = htp_matmul_4d_f16_f16; - } - - src1_row_size = nb11; // original row size in DDR - - octx->dst_spad.size_per_thread = hex_round_up(MM_SPAD_DST_NROWS * dst_row_size, 256); - octx->src0_spad.size_per_thread = hex_round_up(MM_SPAD_SRC0_NROWS * src0_row_size, 256); - octx->src1_spad.size_per_thread = hex_round_up(MM_SPAD_SRC1_NROWS * src1_row_size, 256); - - octx->src0_spad.size = octx->src0_spad.size_per_thread * octx->n_threads; - octx->src1_spad.size = octx->src1_spad.size_per_thread * octx->n_threads; - octx->dst_spad.size = octx->dst_spad.size_per_thread * octx->n_threads; - - // Init fastdiv for matmul_4d (supports broadcasting) - octx->mm_div_ne12_ne1 = init_fastdiv_values(src1->ne[2] * dst->ne[1]); - octx->mm_div_ne1 = init_fastdiv_values(dst->ne[1]); - octx->mm_div_r2 = init_fastdiv_values(src1->ne[2] / src0->ne[2]); - octx->mm_div_r3 = init_fastdiv_values(src1->ne[3] / src0->ne[3]); - - need_quant = false; - } - } + need_quant = false; break; default: @@ -2278,9 +2166,6 @@ int op_matmul(struct htp_ops_context * octx) { octx->src0_nrows_per_thread = (src0_nrows + octx->n_threads - 1) / octx->n_threads; octx->src0_nrows_per_thread += (octx->src0_nrows_per_thread & 1); // round up to even - octx->src0_spad.stride = src0_row_size_padded; - octx->src1_spad.stride = src1_row_size; - if (need_quant) { // Run quant jobs const uint32_t n_quant_jobs = MIN(src1_nrows, octx->n_threads); @@ -2300,9 +2185,12 @@ int op_matmul(struct htp_ops_context * octx) { // ** main matmul-id entry point int op_matmul_id(struct htp_ops_context * octx) { - htp_matmul_tensors_preamble; + const struct htp_tensor * src0 = &octx->src0; + const struct htp_tensor * src1 = &octx->src1; + const struct htp_tensor * ids = &octx->src2; + struct htp_tensor * dst = &octx->dst; - struct htp_tensor * restrict ids = &octx->src2; + htp_matmul_preamble; const char * op_type; @@ -2312,7 +2200,7 @@ int op_matmul_id(struct htp_ops_context * octx) { const size_t src0_row_size = nb01; const size_t dst_row_size = nb1; - const size_t src0_row_size_padded = hex_round_up(src0_row_size, 128); + const size_t src0_row_size_padded = htp_round_up(src0_row_size, 128); const uint32_t src0_nrows = ne01; // per expert const uint32_t src1_nrows = ne11 * ne12 * ne13; @@ -2330,7 +2218,7 @@ int op_matmul_id(struct htp_ops_context * octx) { switch (src0->type) { case HTP_TYPE_Q4_0: op_type = "q4x2x2-f32"; - quant_job_func = htp_quantize_f32_q8x4x2; + quant_job_func = htp_quantize_fp32_q8x4x2; src1_row_size = q8x4x2_row_size(ne10); // row size post quantization if (src1_nrows > 1) { matmul_id_job_func = htp_matmul_id_q4x4x2_q8x4x2; @@ -2340,13 +2228,13 @@ int op_matmul_id(struct htp_ops_context * octx) { // Entire src1 tensor is placed into the VTCM // For other tensors we allocate N rows per thread, padded to HVX vector size - octx->dst_spad.size_per_thread = hex_round_up(MM_SPAD_DST_NROWS * dst_row_size, 256); - octx->src0_spad.size_per_thread = hex_round_up(MM_SPAD_SRC0_NROWS * src0_row_size_padded, 256); - octx->src1_spad.size_per_thread = hex_round_up(src1_row_size * src1_nrows, 256); - octx->src2_spad.size_per_thread = hex_round_up(matrix_row_counts_size + matrix_row_map_size, 256); + octx->dst_spad.size_per_thread = htp_round_up(HTP_SPAD_DST_NROWS * dst_row_size, 256); + octx->src0_spad.size_per_thread = htp_round_up(HTP_SPAD_SRC0_NROWS * src0_row_size_padded, 256); + octx->src1_spad.size_per_thread = htp_round_up(src1_row_size * src1_nrows, 256); + octx->src2_spad.size_per_thread = htp_round_up(matrix_row_counts_size + matrix_row_map_size, 256); // src0 spad is also used in dynamic quantizer to store padded src1 rows - src1_row_size_padded = hex_round_up(src1_row_size, QK_Q8_0x4x2 * sizeof(float)); + src1_row_size_padded = htp_round_up(src1_row_size, QK_Q8_0x4x2 * sizeof(float)); if (octx->src0_spad.size_per_thread < src1_row_size_padded) { octx->src0_spad.size_per_thread = src1_row_size_padded; } @@ -2359,7 +2247,7 @@ int op_matmul_id(struct htp_ops_context * octx) { case HTP_TYPE_Q8_0: op_type = "q8x2x2-f32"; - quant_job_func = htp_quantize_f32_q8x4x2; + quant_job_func = htp_quantize_fp32_q8x4x2; src1_row_size = q8x4x2_row_size(ne10); // row size post quantization if (src1_nrows > 1) { matmul_id_job_func = htp_matmul_id_q8x4x2_q8x4x2; @@ -2369,13 +2257,13 @@ int op_matmul_id(struct htp_ops_context * octx) { // Entire src1 tensor is placed into the VTCM // For other tensors we allocate N rows per thread, padded to HVX vector size - octx->dst_spad.size_per_thread = hex_round_up(MM_SPAD_DST_NROWS * dst_row_size, 256); - octx->src0_spad.size_per_thread = hex_round_up(MM_SPAD_SRC0_NROWS * src0_row_size_padded, 256); - octx->src1_spad.size_per_thread = hex_round_up(src1_row_size * src1_nrows, 256); - octx->src2_spad.size_per_thread = hex_round_up(matrix_row_counts_size + matrix_row_map_size, 256); + octx->dst_spad.size_per_thread = htp_round_up(HTP_SPAD_DST_NROWS * dst_row_size, 256); + octx->src0_spad.size_per_thread = htp_round_up(HTP_SPAD_SRC0_NROWS * src0_row_size_padded, 256); + octx->src1_spad.size_per_thread = htp_round_up(src1_row_size * src1_nrows, 256); + octx->src2_spad.size_per_thread = htp_round_up(matrix_row_counts_size + matrix_row_map_size, 256); // src0 spad is also used in dynamic quantizer to store padded src1 rows - src1_row_size_padded = hex_round_up(src1_row_size, QK_Q8_0x4x2 * sizeof(float)); + src1_row_size_padded = htp_round_up(src1_row_size, QK_Q8_0x4x2 * sizeof(float)); if (octx->src0_spad.size_per_thread < src1_row_size_padded) { octx->src0_spad.size_per_thread = src1_row_size_padded; } @@ -2388,7 +2276,7 @@ int op_matmul_id(struct htp_ops_context * octx) { case HTP_TYPE_MXFP4: op_type = "mxfp4x2x2-f32"; - quant_job_func = htp_quantize_f32_q8x4x2; + quant_job_func = htp_quantize_fp32_q8x4x2; src1_row_size = q8x4x2_row_size(ne10); // row size post quantization if (src1_nrows > 1) { matmul_id_job_func = htp_matmul_id_mxfp4x4x2_q8x4x2; @@ -2398,13 +2286,13 @@ int op_matmul_id(struct htp_ops_context * octx) { // Entire src1 tensor is placed into the VTCM // For other tensors we allocate N rows per thread, padded to HVX vector size - octx->dst_spad.size_per_thread = hex_round_up(MM_SPAD_DST_NROWS * dst_row_size, 256); - octx->src0_spad.size_per_thread = hex_round_up(MM_SPAD_SRC0_NROWS * src0_row_size_padded, 256); - octx->src1_spad.size_per_thread = hex_round_up(src1_row_size * src1_nrows, 256); - octx->src2_spad.size_per_thread = hex_round_up(matrix_row_counts_size + matrix_row_map_size, 256); + octx->dst_spad.size_per_thread = htp_round_up(HTP_SPAD_DST_NROWS * dst_row_size, 256); + octx->src0_spad.size_per_thread = htp_round_up(HTP_SPAD_SRC0_NROWS * src0_row_size_padded, 256); + octx->src1_spad.size_per_thread = htp_round_up(src1_row_size * src1_nrows, 256); + octx->src2_spad.size_per_thread = htp_round_up(matrix_row_counts_size + matrix_row_map_size, 256); // src0 spad is also used in dynamic quantizer to store padded src1 rows - src1_row_size_padded = hex_round_up(src1_row_size, QK_Q8_0x4x2 * sizeof(float)); + src1_row_size_padded = htp_round_up(src1_row_size, QK_Q8_0x4x2 * sizeof(float)); if (octx->src0_spad.size_per_thread < src1_row_size_padded) { octx->src0_spad.size_per_thread = src1_row_size_padded; } diff --git a/ggml/src/ggml-hexagon/htp/ops-utils.h b/ggml/src/ggml-hexagon/htp/ops-utils.h new file mode 100644 index 0000000..af9c330 --- /dev/null +++ b/ggml/src/ggml-hexagon/htp/ops-utils.h @@ -0,0 +1,149 @@ +#ifndef OPS_UTILS_H +#define OPS_UTILS_H + +#include "htp-msg.h" + +#ifndef MAX +# define MAX(a, b) ((a) > (b) ? (a) : (b)) +#endif + +#ifndef MIN +# define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + +static inline uint64_t htp_get_cycles() { + uint64_t cycles = 0; + asm volatile(" %0 = c15:14\n" : "=r"(cycles)); + return cycles; +} + +static inline uint64_t htp_get_pktcnt() { + uint64_t pktcnt; + asm volatile(" %0 = c19:18\n" : "=r"(pktcnt)); + return pktcnt; +} + +static inline int32_t htp_is_aligned(void * addr, uint32_t align) { + return ((size_t) addr & (align - 1)) == 0; +} + +static inline uint32_t htp_round_up(uint32_t n, uint32_t m) { + return m * ((n + m - 1) / m); +} + +// See https://gmplib.org/~tege/divcnst-pldi94.pdf figure 4.1. +// Precompute mp (m' in the paper) and L such that division +// can be computed using a multiply (high 32b of 64b result) +// and a shift: +// +// n/d = (mulhi(n, mp) + n) >> L; +struct fastdiv_values { + uint32_t mp; + uint32_t l; +}; + +static inline struct fastdiv_values init_fastdiv_values(uint32_t d) { + struct fastdiv_values result = { 0, 0 }; + // compute L = ceil(log2(d)); + while (result.l < 32 && ((uint32_t) 1 << result.l) < d) { + ++(result.l); + } + + result.mp = (uint32_t) (((uint64_t) 1 << 32) * (((uint64_t) 1 << result.l) - d) / d + 1); + return result; +} + +static inline uint32_t fastdiv(uint32_t n, const struct fastdiv_values * vals) { + // Compute high 32 bits of n * mp + const uint32_t hi = (uint32_t) (((uint64_t) n * vals->mp) >> 32); // mulhi(n, mp) + // add n, apply bit shift + return (hi + n) >> vals->l; +} + +static inline uint32_t fastmodulo(uint32_t n, uint32_t d, const struct fastdiv_values * vals) { + return n - fastdiv(n, vals) * d; +} + +static inline void htp_l2fetch(const void * p, uint32_t height, uint32_t width, uint32_t stride) { + const uint64_t control = Q6_P_combine_RR(stride, Q6_R_combine_RlRl(width, height)); + asm volatile(" l2fetch(%0,%1) " : : "r"(p), "r"(control)); +} + +static inline int32_t htp_is_one_chunk(void * addr, uint32_t n, uint32_t chunk_size) { + uint32_t left_off = (size_t) addr & (chunk_size - 1); + uint32_t right_off = left_off + n; + return right_off <= chunk_size; +} + +static inline void htp_dump_int8_line(char * pref, const int8_t * x, int n) { + char str[1024], *p = str, *p_end = str + sizeof(str); + p += snprintf(p, p_end - p, "%s: ", pref); + for (int i = 0; i < n && p < p_end; i++) { + p += snprintf(p, p_end - p, "%d, ", x[i]); + } + FARF(HIGH, "%s\n", str); +} + +static inline void htp_dump_uint8_line(char * pref, const uint8_t * x, uint32_t n) { + char str[1024], *p = str, *p_end = str + sizeof(str); + p += snprintf(p, p_end - p, "%s: ", pref); + for (int i = 0; i < n && p < p_end; i++) { + p += snprintf(p, p_end - p, "%d, ", x[i]); + } + FARF(HIGH, "%s\n", str); +} + +static inline void htp_dump_int32_line(char * pref, const int32_t * x, uint32_t n) { + char str[1024], *p = str, *p_end = str + sizeof(str); + p += snprintf(p, p_end - p, "%s: ", pref); + for (int i = 0; i < n; i++) { + p += snprintf(p, p_end - p, "%d, ", (int) x[i]); + } + FARF(HIGH, "%s\n", str); +} + +static inline void htp_dump_fp16_line(char * pref, const __fp16 * x, uint32_t n) { + char str[1024], *p = str, *p_end = str + sizeof(str); + p += snprintf(p, p_end - p, "%s: ", pref); + for (int i = 0; i < n; i++) { + p += snprintf(p, p_end - p, "%.6f, ", (float) x[i]); + } + FARF(HIGH, "%s\n", str); +} + +static inline void htp_dump_fp32_line(char * pref, const float * x, uint32_t n) { + char str[1024], *p = str, *p_end = str + sizeof(str); + p += snprintf(p, p_end - p, "%s: ", pref); + for (int i = 0; i < n; i++) { + p += snprintf(p, p_end - p, "%.6f, ", x[i]); + } + FARF(HIGH, "%s\n", str); +} + +static inline void htp_dump_f32(char * pref, const float * x, uint32_t n) { + uint32_t n0 = n / 16; + uint32_t n1 = n % 16; + + uint32_t i = 0; + for (; i < n0; i++) { + htp_dump_fp32_line(pref, x + (16 * i), 16); + } + if (n1) { + htp_dump_fp32_line(pref, x + (16 * i), n1); + } +} + +static inline void htp_dump_f16(char * pref, const __fp16 * x, uint32_t n) { + uint32_t n0 = n / 16; + uint32_t n1 = n % 16; + + uint32_t i = 0; + for (; i < n0; i++) { + htp_dump_fp16_line(pref, x + (16 * i), 16); + } + if (n1) { + htp_dump_fp16_line(pref, x + (16 * i), n1); + } +} + +#endif /* OPS_UTILS_H */ diff --git a/ggml/src/ggml-hexagon/htp/rope-ops.c b/ggml/src/ggml-hexagon/htp/rope-ops.c index 943ca5c..a439970 100644 --- a/ggml/src/ggml-hexagon/htp/rope-ops.c +++ b/ggml/src/ggml-hexagon/htp/rope-ops.c @@ -2,20 +2,27 @@ #pragma clang diagnostic ignored "-Wunused-function" #pragma clang diagnostic ignored "-Wunused-but-set-variable" +#ifdef HTP_DEBUG +# define FARF_HIGH 1 +#endif #include +#include #include - +#include +#include +#include #include +#include #include -#include "hex-dma.h" -#include "hvx-utils.h" - #define GGML_COMMON_DECL_C #include "ggml-common.h" #include "htp-ctx.h" +#include "htp-dma.h" #include "htp-msg.h" #include "htp-ops.h" +#include "hvx-utils.h" +#include "ops-utils.h" // Redefined the types GGML_ROPE_TYPE_NORMAL & GGML_ROPE_TYPE_NEOX as we cant include ggml.h #define HTP_ROPE_TYPE_NORMAL 0 @@ -363,8 +370,8 @@ static void rope_job_f32_per_thread(struct rope_th_ctx * rope_ctx, int nth, int int is_aligned = 1; int opt_path = 0; - if ((0 == hex_is_aligned((void *) src0->data, VLEN)) || (0 == hex_is_aligned((void *) src1->data, VLEN)) || - (0 == hex_is_aligned((void *) dst->data, VLEN))) { + if ((0 == htp_is_aligned((void *) src0->data, VLEN)) || (0 == htp_is_aligned((void *) src1->data, VLEN)) || + (0 == htp_is_aligned((void *) dst->data, VLEN))) { FARF(HIGH, "rope-f32: unaligned addresses in rope op, possibly slower execution\n"); is_aligned = 0; } @@ -420,9 +427,9 @@ static int execute_op_rope_f32(struct htp_ops_context * octx) { // VTCM scratchpads for all tensors // N rows per thread, padded to HVX vector size - octx->dst_spad.size = hex_round_up(dst_row_size, 128) * n_threads; - octx->src0_spad.size = hex_round_up(src0_row_size, 128) * n_threads; - octx->src1_spad.size = hex_round_up(src1_row_size, 128) * n_threads; + octx->dst_spad.size = htp_round_up(dst_row_size, 128) * n_threads; + octx->src0_spad.size = htp_round_up(src0_row_size, 128) * n_threads; + octx->src1_spad.size = htp_round_up(src1_row_size, 128) * n_threads; size_t spad_size = octx->src0_spad.size + octx->src1_spad.size + octx->dst_spad.size; diff --git a/ggml/src/ggml-hexagon/htp/set-rows-ops.c b/ggml/src/ggml-hexagon/htp/set-rows-ops.c deleted file mode 100644 index 904484d..0000000 --- a/ggml/src/ggml-hexagon/htp/set-rows-ops.c +++ /dev/null @@ -1,164 +0,0 @@ -#pragma clang diagnostic ignored "-Wunused-variable" -#pragma clang diagnostic ignored "-Wunused-function" -#pragma clang diagnostic ignored "-Wunused-but-set-variable" - -#include -#include - -#include -#include - -#include "hex-dma.h" -#include "hvx-utils.h" - -#define GGML_COMMON_DECL_C -#include "ggml-common.h" -#include "htp-ctx.h" -#include "htp-msg.h" -#include "htp-ops.h" - -#define set_rows_preamble \ - const uint32_t ne00 = octx->src0.ne[0]; \ - const uint32_t ne01 = octx->src0.ne[1]; \ - const uint32_t ne02 = octx->src0.ne[2]; \ - const uint32_t ne03 = octx->src0.ne[3]; \ - \ - const uint32_t ne10 = octx->src1.ne[0]; \ - const uint32_t ne11 = octx->src1.ne[1]; \ - const uint32_t ne12 = octx->src1.ne[2]; \ - \ - const uint32_t nb01 = octx->src0.nb[1]; \ - const uint32_t nb02 = octx->src0.nb[2]; \ - const uint32_t nb03 = octx->src0.nb[3]; \ - \ - const uint32_t nb10 = octx->src1.nb[0]; \ - const uint32_t nb11 = octx->src1.nb[1]; \ - const uint32_t nb12 = octx->src1.nb[2]; \ - \ - const uint32_t nb1 = octx->dst.nb[1]; \ - const uint32_t nb2 = octx->dst.nb[2]; \ - const uint32_t nb3 = octx->dst.nb[3]; \ - \ - const uint32_t ne1 = octx->dst.ne[1]; \ - \ - const uint32_t nr = ne01; - -static int set_rows_thread_f32_f32(struct htp_ops_context * octx, const int nth, const int ith) { - set_rows_preamble; - - // parallelize by rows of src0 - const uint32_t dr = octx->src0_nrows_per_thread; - const uint32_t ir0 = dr * ith; - const uint32_t ir1 = (ir0 + dr < nr) ? (ir0 + dr) : nr; - - const bool is_i32 = (octx->src1.type == HTP_TYPE_I32); - - for (uint32_t i03 = 0; i03 < ne03; ++i03) { - for (uint32_t i02 = 0; i02 < ne02; ++i02) { - for (uint32_t i = ir0; i < ir1; ++i) { - const uint32_t i12 = fastmodulo(i03, ne12, &octx->set_rows_div_ne12); - const uint32_t i11 = fastmodulo(i02, ne11, &octx->set_rows_div_ne11); - const uint32_t i10 = i; - - const uintptr_t src1_addr = octx->src1.data + i10*nb10 + i11*nb11 + i12*nb12; - - uint32_t i1 = is_i32 ? *(int32_t *)src1_addr : *(int64_t *)src1_addr; - if (i1 >= ne1) { - // ignore invalid indices - continue; - } - - const uintptr_t src0_ptr = octx->src0.data + i*nb01 + i02*nb02 + i03*nb03; - const uintptr_t dst_ptr = octx->dst.data + i1*nb1 + i02*nb2 + i03*nb3; - - // copy row - hvx_copy_f32_uu((uint8_t *)dst_ptr, (const uint8_t *)src0_ptr, ne00); - } - } - } - - return HTP_STATUS_OK; -} - -static int set_rows_thread_f16_f32(struct htp_ops_context * octx, const int nth, const int ith) { - set_rows_preamble; - - // parallelize by rows of src0 - const uint32_t dr = octx->src0_nrows_per_thread; - const uint32_t ir0 = dr * ith; - const uint32_t ir1 = (ir0 + dr < nr) ? (ir0 + dr) : nr; - - const bool is_i32 = (octx->src1.type == HTP_TYPE_I32); - - for (uint32_t i03 = 0; i03 < ne03; ++i03) { - for (uint32_t i02 = 0; i02 < ne02; ++i02) { - for (uint32_t i = ir0; i < ir1; ++i) { - const uint32_t i12 = fastmodulo(i03, ne12, &octx->set_rows_div_ne12); - const uint32_t i11 = fastmodulo(i02, ne11, &octx->set_rows_div_ne11); - const uint32_t i10 = i; - - const uintptr_t src1_addr = octx->src1.data + i10*nb10 + i11*nb11 + i12*nb12; - - uint32_t i1 = is_i32 ? *(int32_t *)src1_addr : *(int64_t *)src1_addr; - if (i1 >= ne1) { - // ignore invalid indices - continue; - } - - const uint8_t* src0_ptr = (const uint8_t *) octx->src0.data + i*nb01 + i02*nb02 + i03*nb03; - uint8_t* dst_ptr = (uint8_t *) octx->dst.data + i1*nb1 + i02*nb2 + i03*nb3; - - hvx_copy_f16_f32_uu(dst_ptr, src0_ptr, ne00); - } - } - } - - return HTP_STATUS_OK; -} - -static void set_rows_work_f16_f32(unsigned int n, unsigned int i, void *data) { - set_rows_thread_f16_f32((struct htp_ops_context *) data, n, i); -} - -static void set_rows_work_f32_f32(unsigned int n, unsigned int i, void *data) { - set_rows_thread_f32_f32((struct htp_ops_context *) data, n, i); -} - -int op_set_rows(struct htp_ops_context * octx) { - set_rows_preamble; - - if (octx->src0.type != HTP_TYPE_F32) { - return HTP_STATUS_NO_SUPPORT; - } - - if (octx->dst.type != HTP_TYPE_F32 && octx->dst.type != HTP_TYPE_F16) { - return HTP_STATUS_NO_SUPPORT; - } - - if (octx->src1.type != HTP_TYPE_I32 && octx->src1.type != HTP_TYPE_I64) { - return HTP_STATUS_NO_SUPPORT; - } - - if (octx->flags & HTP_OPFLAGS_SKIP_COMPUTE) { - return HTP_STATUS_OK; - } - - octx->set_rows_div_ne12 = init_fastdiv_values(ne12); - octx->set_rows_div_ne11 = init_fastdiv_values(ne11); - - const uint32_t n_jobs = MIN(nr, octx->n_threads); - octx->src0_nrows_per_thread = (nr + n_jobs - 1) / n_jobs; - - switch(octx->dst.type) { - case HTP_TYPE_F32: - worker_pool_run_func(octx->ctx->worker_pool, set_rows_work_f32_f32, octx, n_jobs); - break; - case HTP_TYPE_F16: - worker_pool_run_func(octx->ctx->worker_pool, set_rows_work_f16_f32, octx, n_jobs); - break; - default: - return HTP_STATUS_NO_SUPPORT; - } - - return HTP_STATUS_OK; -} diff --git a/ggml/src/ggml-hexagon/htp/softmax-ops.c b/ggml/src/ggml-hexagon/htp/softmax-ops.c index 1b6b2eb..5bf0cbf 100644 --- a/ggml/src/ggml-hexagon/htp/softmax-ops.c +++ b/ggml/src/ggml-hexagon/htp/softmax-ops.c @@ -2,20 +2,27 @@ #pragma clang diagnostic ignored "-Wunused-function" #pragma clang diagnostic ignored "-Wunused-but-set-variable" +#ifdef HTP_DEBUG +# define FARF_HIGH 1 +#endif #include +#include #include - +#include +#include +#include #include +#include #include -#include "hex-dma.h" -#include "hvx-utils.h" - #define GGML_COMMON_DECL_C #include "ggml-common.h" #include "htp-ctx.h" +#include "htp-dma.h" #include "htp-msg.h" #include "htp-ops.h" +#include "hvx-utils.h" +#include "ops-utils.h" #define htp_softmax_preamble3 \ const uint32_t ne00 = src0->ne[0]; \ @@ -93,8 +100,8 @@ static void hvx_fast_softmax_prep_f32(const uint8_t * restrict src, uint8_t * restrict dst_curr = dst; const uint8_t * restrict mask_curr = mask; - HVX_Vector scale_vec = hvx_vec_splat_f32(scale); - HVX_Vector slope_vec = hvx_vec_splat_f32(slope); + HVX_Vector scale_vec = hvx_vec_splat_fp32(scale); + HVX_Vector slope_vec = hvx_vec_splat_fp32(slope); int step_of_1 = num_elems >> 5; @@ -127,9 +134,9 @@ static void hvx_fast_softmax_f32(const uint8_t * restrict src, HVX_Vector * restrict v_dst = (HVX_Vector *) dst; HVX_Vector sum_vec = Q6_V_vsplat_R(0x00000000); - HVX_Vector max_vec = hvx_vec_splat_f32(((const float *) src)[0]); + HVX_Vector max_vec = hvx_vec_splat_fp32(((const float *) src)[0]); HVX_Vector zero_v = Q6_V_vzero(); - HVX_Vector one_v = hvx_vec_splat_f32(1.0); + HVX_Vector one_v = hvx_vec_splat_fp32(1.0); int step_of_1 = num_elems >> 5; @@ -139,7 +146,7 @@ static void hvx_fast_softmax_f32(const uint8_t * restrict src, max_vec = Q6_Vsf_vmax_VsfVsf(max_vec, v1); } - HVX_Vector v = hvx_vec_reduce_max_f32(max_vec); + HVX_Vector v = hvx_vec_reduce_max_fp32(max_vec); max_vec = hvx_vec_repl4(v); #pragma unroll(4) @@ -147,18 +154,18 @@ static void hvx_fast_softmax_f32(const uint8_t * restrict src, HVX_Vector v1 = v_src[i]; HVX_Vector v2 = Q6_Vqf32_vsub_VsfVsf(v1, max_vec); - HVX_Vector v3 = hvx_vec_exp_f32(Q6_Vsf_equals_Vqf32(v2)); + HVX_Vector v3 = hvx_vec_exp_fp32(Q6_Vsf_equals_Vqf32(v2)); sum_vec = Q6_Vqf32_vadd_VsfVsf(Q6_Vsf_equals_Vqf32(sum_vec), v3); v_pad[i] = v3; } - v = hvx_vec_reduce_sum_qf32(sum_vec); + v = hvx_vec_qf32_reduce_sum(sum_vec); sum_vec = hvx_vec_repl4(Q6_Vsf_equals_Vqf32(v)); HVX_VectorPred pos_sum = Q6_Q_vcmp_gt_VwVw(sum_vec, zero_v); - HVX_Vector v4 = hvx_vec_inverse_f32(sum_vec); + HVX_Vector v4 = hvx_vec_inverse_fp32(sum_vec); HVX_Vector scale_vec = Q6_V_vmux_QVV(pos_sum, v4, one_v); #pragma unroll(4) @@ -174,11 +181,11 @@ static float hvx_softmax_f32(const uint8_t * restrict src, uint8_t * restrict spad, const int num_elems, const float max) { - hvx_sub_scalar_f32(spad, src, max, num_elems); + hvx_sub_scalar_f32(src, max, spad, num_elems); hvx_exp_f32(spad, dst, num_elems, false); - float sum = hvx_reduce_sum_f32(dst, num_elems); + float sum = hvx_self_sum_f32(dst, num_elems); return sum; } @@ -231,7 +238,7 @@ static void softmax_htp_f32(int nth, int ith, struct softmax_th_ctx * softmax_ct hvx_fast_softmax_prep_f32((const uint8_t *) sp, (uint8_t *) wp0, ne00, softmax_ctx->scale, (const uint8_t *) mp_f32, slope); } else { - hvx_scale_f32((uint8_t *) wp0, (const uint8_t *) sp, ne00, softmax_ctx->scale); + hvx_scale_f32((const uint8_t *) sp, (uint8_t *) wp0, ne00, softmax_ctx->scale); if (mp_f32) { if (softmax_ctx->use_f16) { for (int i = 0; i < ne00; ++i) { @@ -248,10 +255,10 @@ static void softmax_htp_f32(int nth, int ith, struct softmax_th_ctx * softmax_ct if (1 == opt_path) { hvx_fast_softmax_f32((const uint8_t *) wp0, (uint8_t *) dp, (uint8_t *) wp1, ne00); } else { - float max = hvx_reduce_max_f32((const uint8_t *) wp0, ne00); + float max = hvx_self_max_f32((const uint8_t *) wp0, ne00); float sum = hvx_softmax_f32((const uint8_t *) wp0, (uint8_t *) wp2, (uint8_t *) wp1, ne00, max); sum = sum > 0.0 ? (1.0 / sum) : 1; - hvx_scale_f32((uint8_t *) dp, (const uint8_t *) wp2, ne00, sum); + hvx_scale_f32((const uint8_t *) wp2, (uint8_t *) dp, ne00, sum); } } } @@ -283,7 +290,7 @@ static void softmax_job_f32_per_thread(struct softmax_th_ctx * softmax_ctx, int int is_aligned = 1; int opt_path = 0; - if (!hex_is_aligned((void *) src0->data, VLEN) || !hex_is_aligned((void *) dst->data, VLEN)) { + if (!htp_is_aligned((void *) src0->data, VLEN) || !htp_is_aligned((void *) dst->data, VLEN)) { is_aligned = 0; FARF(HIGH, "softmax-f32: unaligned addresses in elementwise op, possibly slower execution\n"); } @@ -338,9 +345,9 @@ static int execute_op_softmax_f32(struct htp_ops_context * octx) { // VTCM scratchpads for all tensors // N rows per thread, padded to HVX vector size - octx->dst_spad.size = hex_round_up(dst_row_size, 128) * n_threads; - octx->src0_spad.size = hex_round_up(src0_row_size, 128) * n_threads; - octx->src1_spad.size = hex_round_up(src1_row_size, 128) * n_threads; + octx->dst_spad.size = htp_round_up(dst_row_size, 128) * n_threads; + octx->src0_spad.size = htp_round_up(src0_row_size, 128) * n_threads; + octx->src1_spad.size = htp_round_up(src1_row_size, 128) * n_threads; size_t spad_size = octx->src0_spad.size + octx->src1_spad.size + octx->dst_spad.size; diff --git a/ggml/src/ggml-hexagon/htp/unary-ops.c b/ggml/src/ggml-hexagon/htp/unary-ops.c index be8be8c..bb7557b 100644 --- a/ggml/src/ggml-hexagon/htp/unary-ops.c +++ b/ggml/src/ggml-hexagon/htp/unary-ops.c @@ -2,20 +2,28 @@ #pragma clang diagnostic ignored "-Wunused-function" #pragma clang diagnostic ignored "-Wunused-but-set-variable" +#ifdef HTP_DEBUG +# define FARF_HIGH 1 +#endif + #include +#include #include - +#include +#include +#include #include +#include #include -#include "hex-dma.h" -#include "hvx-utils.h" - #define GGML_COMMON_DECL_C #include "ggml-common.h" #include "htp-ctx.h" +#include "htp-dma.h" #include "htp-msg.h" #include "htp-ops.h" +#include "hvx-utils.h" +#include "ops-utils.h" #define htp_unary_preamble \ const uint32_t ne00 = src->ne[0]; \ @@ -47,7 +55,7 @@ static void hvx_fast_rms_norm_f32(const uint8_t * restrict src, HVX_Vector * restrict v_dst = (HVX_Vector *) dst; HVX_Vector sum_v = Q6_V_vsplat_R(0x00000000); - HVX_Vector epsilon_v = hvx_vec_splat_f32(epsilon); + HVX_Vector epsilon_v = hvx_vec_splat_fp32(epsilon); int step_of_1 = num_elems >> 5; #pragma unroll(4) @@ -57,15 +65,15 @@ static void hvx_fast_rms_norm_f32(const uint8_t * restrict src, sum_v = Q6_Vqf32_vadd_Vqf32Vqf32(sum_v, v2); } - HVX_Vector reduced_sum = hvx_vec_reduce_sum_qf32(sum_v); + HVX_Vector reduced_sum = hvx_vec_qf32_reduce_sum(sum_v); sum_v = hvx_vec_repl4(Q6_Vsf_equals_Vqf32(reduced_sum)); - HVX_Vector t_v = hvx_vec_splat_f32((float) num_elems); - HVX_Vector denom_v = hvx_vec_inverse_f32(t_v); + HVX_Vector t_v = hvx_vec_splat_fp32((float) num_elems); + HVX_Vector denom_v = hvx_vec_inverse_fp32(t_v); HVX_Vector mean_v = Q6_Vqf32_vmpy_VsfVsf(sum_v, denom_v); HVX_Vector mean_epsilon_v = Q6_Vqf32_vadd_Vqf32Vsf(mean_v, epsilon_v); - HVX_Vector scale_v = hvx_vec_rsqrt_f32(Q6_Vsf_equals_Vqf32(mean_epsilon_v)); + HVX_Vector scale_v = hvx_vec_rsqrt_fp32(Q6_Vsf_equals_Vqf32(mean_epsilon_v)); #pragma unroll(4) for (int i = 0; i < step_of_1; i++) { @@ -75,31 +83,6 @@ static void hvx_fast_rms_norm_f32(const uint8_t * restrict src, } } -static void scale_htp_f32(const float * restrict src, - float * restrict dst, - uint8_t * restrict spad, - const uint32_t num_rows, - const uint32_t row_elems, - const size_t row_size, - int32_t * op_params, - int opt_path) { - float scale = 0.f; - float bias = 0.f; - memcpy(&scale, &op_params[0], sizeof(float)); - memcpy(&bias, &op_params[1], sizeof(float)); - - for (uint32_t ir = 0; ir < num_rows; ir++) { - const float * restrict src_local = src + (ir * row_elems); - float * restrict dst_local = dst + (ir * row_elems); - - if (ir + 1 < num_rows) { - hex_l2fetch(src_local + row_elems, row_size, row_size, 1); - } - - hvx_scale_offset_f32((uint8_t *) dst_local, (const uint8_t *) src_local, row_elems, scale, bias); - } -} - static void rms_norm_htp_f32(const float * restrict src, float * restrict dst, uint8_t * restrict spad, @@ -116,7 +99,7 @@ static void rms_norm_htp_f32(const float * restrict src, float * restrict dst_local = dst + (ir * row_elems); if (ir + 1 < num_rows) { - hex_l2fetch(src_local + row_elems, row_size, row_size, 1); + htp_l2fetch(src_local + row_elems, 1, row_size, row_size); } if (1 == opt_path) { @@ -127,7 +110,7 @@ static void rms_norm_htp_f32(const float * restrict src, const float mean = sum / row_elems; const float scale = 1.0f / sqrtf(mean + epsilon); - hvx_scale_f32((uint8_t *) dst_local, (const uint8_t *) src_local, row_elems, scale); + hvx_scale_f32((const uint8_t *) src_local, (uint8_t *) dst_local, row_elems, scale); } } } @@ -160,8 +143,9 @@ static void unary_job_f32_per_thread(const struct htp_tensor * src, int is_aligned = 1; int opt_path = 0; - if ((0 == hex_is_aligned((void *) src->data, VLEN)) || (0 == hex_is_aligned((void *) dst->data, VLEN))) { + if ((0 == htp_is_aligned((void *) src->data, VLEN)) || (0 == htp_is_aligned((void *) dst->data, VLEN))) { is_aligned = 0; + FARF(HIGH, "unary-f32: unaligned addresses in unary op, possibly slower execution\n"); } if ((1 == is_aligned) && !(nb01 & (VLEN - 1))) { opt_path = 1; @@ -178,9 +162,6 @@ static void unary_job_f32_per_thread(const struct htp_tensor * src, case HTP_OP_RMS_NORM: rms_norm_htp_f32(src_th, dst_th, spad_th, src0_end_row - src0_start_row, ne0, nb1, op_params, opt_path); break; - case HTP_OP_SCALE: - scale_htp_f32(src_th, dst_th, spad_th, src0_end_row - src0_start_row, ne0, nb1, op_params, opt_path); - break; default: break; @@ -214,10 +195,6 @@ static int execute_op_unary_f32(struct htp_ops_context * octx) { unary_op_func = unary_job_dispatcher_f32; op_type = "rmsnorm-f32"; break; - case HTP_OP_SCALE: - unary_op_func = unary_job_dispatcher_f32; - op_type = "scale-f32"; - break; default: FARF(ERROR, "Unsupported unary Op %u\n", octx->op); @@ -231,8 +208,8 @@ static int execute_op_unary_f32(struct htp_ops_context * octx) { const size_t dst_row_size = dst->nb[1]; // VTCM scratchpads for all tensors - octx->dst_spad.size = hex_round_up(dst_row_size, 128) * n_threads; - octx->src0_spad.size = hex_round_up(src0_row_size, 128) * n_threads; + octx->dst_spad.size = htp_round_up(dst_row_size, 128) * n_threads; + octx->src0_spad.size = htp_round_up(src0_row_size, 128) * n_threads; size_t spad_size = octx->src0_spad.size + octx->dst_spad.size; diff --git a/ggml/src/ggml-hexagon/htp/worker-pool.c b/ggml/src/ggml-hexagon/htp/worker-pool.c index 894815f..cd38c21 100644 --- a/ggml/src/ggml-hexagon/htp/worker-pool.c +++ b/ggml/src/ggml-hexagon/htp/worker-pool.c @@ -7,6 +7,10 @@ #include #include +#ifdef HTP_DEBUG +# define FARF_HIGH 1 +#endif + #include "HAP_farf.h" #define WORKER_THREAD_STACK_SZ (2 * 16384) diff --git a/ggml/src/ggml-hexagon/op-desc.h b/ggml/src/ggml-hexagon/op-desc.h deleted file mode 100644 index a1e8ddd..0000000 --- a/ggml/src/ggml-hexagon/op-desc.h +++ /dev/null @@ -1,153 +0,0 @@ -#ifndef OP_DESC_H -#define OP_DESC_H - -#define GGML_COMMON_IMPL_CPP -#include "ggml-backend-impl.h" -#include "ggml-common.h" - -#include -#include - -struct op_desc { - char strides[64 * GGML_MAX_SRC]; - char dims[64 * GGML_MAX_SRC]; - char types[16 * GGML_MAX_SRC]; - char buffs[64 * GGML_MAX_SRC]; - char names[64 * GGML_MAX_SRC]; - - int format_tensor_dims(char * str, const struct ggml_tensor * t) { - if (t->ne[2] == 1 && t->ne[3] == 1) { - return sprintf(str, "%d:%d", (int) t->ne[0], (int) t->ne[1]); - } else { - return sprintf(str, "%d:%d:%d:%d", (int) t->ne[0], (int) t->ne[1], (int) t->ne[2], (int) t->ne[3]); - } - } - - void format_op_dims(char * str, const struct ggml_tensor * t) { - char * p = str; - - // append src0 and src1 (if any) - if (t->src[0]) { - p += format_tensor_dims(p, t->src[0]); - - for (int i = 1; i < GGML_MAX_SRC && t->src[i]; i++) { - p += sprintf(p, " x "); - p += format_tensor_dims(p, t->src[i]); - } - - p += sprintf(p, " -> "); - } - - // format self dims separately for better visual alignment - char self[64]; - format_tensor_dims(self, t); - - p += sprintf(p, "%s", self); - } - - int format_tensor_strides(char * str, const struct ggml_tensor * t) { - const char * c = ggml_is_contiguous(t) ? "" : "!"; - - if (t->ne[2] == 1 && t->ne[3] == 1) { - return sprintf(str, "%zu:%zu%s", (size_t) t->nb[0], (size_t) t->nb[1], c); - } else { - return sprintf(str, "%zu:%zu:%zu:%zu%s", (size_t) t->nb[0], (size_t) t->nb[1], (size_t) t->nb[2], (size_t) t->nb[3], c); - } - } - - void format_op_strides(char * str, const struct ggml_tensor * t) { - char * p = str; - - // append src0 and src1 (if any) - if (t->src[0]) { - p += format_tensor_strides(p, t->src[0]); - - for (int i = 1; i < GGML_MAX_SRC && t->src[i]; i++) { - p += sprintf(p, " x "); - p += format_tensor_strides(p, t->src[i]); - } - - p += sprintf(p, " -> "); - } - - // format self dims separately for better visual alignment - char self[64]; - format_tensor_strides(self, t); - - p += sprintf(p, "%s", self); - } - - void format_op_types(char * str, const struct ggml_tensor * t) { - char * p = str; - - // append src0 and src1 (if any) - if (t->src[0]) { - p += sprintf(p, "%s", ggml_type_name(t->src[0]->type)); - - for (int i = 1; i < GGML_MAX_SRC && t->src[i]; i++) { - p += sprintf(p, " x "); - p += sprintf(p, "%s", ggml_type_name(t->src[i]->type)); - } - - p += sprintf(p, " -> "); - } - - p += sprintf(p, "%s", ggml_type_name(t->type)); - } - - const char * tensor_buff_name(const struct ggml_tensor * t) { - if (t->buffer) { - return ggml_backend_buffer_name(t->buffer); - } - return "NONE"; - } - - void format_op_buffs(char * str, const struct ggml_tensor * t) { - char * p = str; - - // append src0 and src1 (if any) - if (t->src[0]) { - p += sprintf(p, "%s", tensor_buff_name(t->src[0])); - - for (int i = 1; i < GGML_MAX_SRC && t->src[i]; i++) { - p += sprintf(p, " x "); - p += sprintf(p, "%s", tensor_buff_name(t->src[i])); - } - - p += sprintf(p, " -> "); - } - - p += sprintf(p, "%s", tensor_buff_name(t)); - } - - void format_op_names(char * str, const struct ggml_tensor * t) { - char * p = str; - - // append src0 and src1 (if any) - if (t->src[0]) { - p += sprintf(p, "%s", t->src[0]->name); - - for (int i = 1; i < GGML_MAX_SRC && t->src[i]; i++) { - p += sprintf(p, " x "); - p += sprintf(p, "%s", t->src[i]->name); - } - - p += sprintf(p, " -> "); - } - - p += sprintf(p, "%s", t->name); - } - - void format(const ggml_tensor * op) { - format_op_dims(dims, op); - format_op_strides(strides, op); - format_op_types(types, op); - format_op_buffs(buffs, op); - format_op_names(names, op); - } - - op_desc() {} - op_desc(const ggml_tensor * op) { format(op); } -}; - -#endif // OP_DESC_H diff --git a/ggml/src/ggml-impl.h b/ggml/src/ggml-impl.h index 80e0fd2..fe57d4c 100644 --- a/ggml/src/ggml-impl.h +++ b/ggml/src/ggml-impl.h @@ -24,6 +24,10 @@ #include #endif +#if defined(__F16C__) +#include +#endif + #ifdef __cplusplus extern "C" { #endif diff --git a/ggml/src/ggml-metal/CMakeLists.txt b/ggml/src/ggml-metal/CMakeLists.txt index 9c0b3db..63418fe 100644 --- a/ggml/src/ggml-metal/CMakeLists.txt +++ b/ggml/src/ggml-metal/CMakeLists.txt @@ -23,6 +23,11 @@ if (GGML_METAL_NDEBUG) add_compile_definitions(GGML_METAL_NDEBUG) endif() +# copy metal files to bin directory +configure_file(../ggml-common.h ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-common.h COPYONLY) +configure_file(ggml-metal.metal ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-metal.metal COPYONLY) +configure_file(ggml-metal-impl.h ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-metal-impl.h COPYONLY) + set(METALLIB_COMMON "${CMAKE_CURRENT_SOURCE_DIR}/../ggml-common.h") if (GGML_METAL_EMBED_LIBRARY) enable_language(ASM) @@ -32,12 +37,12 @@ if (GGML_METAL_EMBED_LIBRARY) set(METALLIB_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/ggml-metal.metal") set(METALLIB_IMPL "${CMAKE_CURRENT_SOURCE_DIR}/ggml-metal-impl.h") - file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/autogenerated") + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/autogenerated") # merge ggml-common.h and ggml-metal.metal into a single file - set(METALLIB_EMBED_ASM "${CMAKE_CURRENT_BINARY_DIR}/autogenerated/ggml-metal-embed.s") - set(METALLIB_SOURCE_EMBED "${CMAKE_CURRENT_BINARY_DIR}/autogenerated/ggml-metal-embed.metal") - set(METALLIB_SOURCE_EMBED_TMP "${CMAKE_CURRENT_BINARY_DIR}/autogenerated/ggml-metal-embed.metal.tmp") + set(METALLIB_EMBED_ASM "${CMAKE_BINARY_DIR}/autogenerated/ggml-metal-embed.s") + set(METALLIB_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-metal-embed.metal") + set(METALLIB_SOURCE_EMBED_TMP "${CMAKE_BINARY_DIR}/autogenerated/ggml-metal-embed.metal.tmp") add_custom_command( OUTPUT "${METALLIB_EMBED_ASM}" @@ -57,11 +62,6 @@ if (GGML_METAL_EMBED_LIBRARY) target_sources(ggml-metal PRIVATE "${METALLIB_EMBED_ASM}") else() - # copy metal files to bin directory - configure_file(../ggml-common.h ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-common.h COPYONLY) - configure_file(ggml-metal.metal ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-metal.metal COPYONLY) - configure_file(ggml-metal-impl.h ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-metal-impl.h COPYONLY) - if (GGML_METAL_SHADER_DEBUG) # custom command to do the following: # xcrun -sdk macosx metal -fno-fast-math -c ggml-metal.metal -o ggml-metal.air diff --git a/ggml/src/ggml-metal/ggml-metal-device.cpp b/ggml/src/ggml-metal/ggml-metal-device.cpp index b073479..680904d 100644 --- a/ggml/src/ggml-metal/ggml-metal-device.cpp +++ b/ggml/src/ggml-metal/ggml-metal-device.cpp @@ -1684,60 +1684,3 @@ ggml_metal_pipeline_with_params ggml_metal_library_get_pipeline_opt_step_sgd(ggm return res; } - -ggml_metal_pipeline_with_params ggml_metal_library_get_pipeline_memset(ggml_metal_library_t lib, const ggml_tensor * op) { - GGML_ASSERT(op->type == GGML_TYPE_I64); - - char base[256]; - char name[256]; - - snprintf(base, 256, "kernel_memset_%s", ggml_type_name(op->type)); - snprintf(name, 256, "%s", base); - - ggml_metal_pipeline_with_params res = ggml_metal_library_get_pipeline(lib, name); - if (!res.pipeline) { - res = ggml_metal_library_compile_pipeline(lib, base, name, nullptr); - } - - return res; -} - -ggml_metal_pipeline_with_params ggml_metal_library_get_pipeline_count_equal(ggml_metal_library_t lib, const ggml_tensor * op) { - assert(op->op == GGML_OP_COUNT_EQUAL); - - GGML_TENSOR_LOCALS(int64_t, ne0, op->src[0], ne); - - GGML_ASSERT(op->src[0]->type == op->src[1]->type); - GGML_ASSERT(op->src[0]->type == GGML_TYPE_I32); - GGML_ASSERT(op->type == GGML_TYPE_I64); - - // note: the kernel only supports i32 output due to metal atomic add only supporting atomic_int - GGML_ASSERT(ggml_nelements(op->src[0]) < (1LL << 31)); - - char base[256]; - char name[256]; - - int nsg = 1; - while (32*nsg < ne00 && nsg < 32) { - nsg *= 2; - } - - snprintf(base, 256, "kernel_count_equal_%s", ggml_type_name(op->src[0]->type)); - snprintf(name, 256, "%s_nsg=%d", base, nsg); - - ggml_metal_pipeline_with_params res = ggml_metal_library_get_pipeline(lib, name); - if (!res.pipeline) { - ggml_metal_cv_t cv = ggml_metal_cv_init(); - - ggml_metal_cv_set_int16(cv, nsg, FC_COUNT_EQUAL + 0); - - res = ggml_metal_library_compile_pipeline(lib, base, name, cv); - - ggml_metal_cv_free(cv); - } - - res.smem = 32 * sizeof(int32_t); - res.nsg = nsg; - - return res; -} diff --git a/ggml/src/ggml-metal/ggml-metal-device.h b/ggml/src/ggml-metal/ggml-metal-device.h index 9c3b001..0a8b921 100644 --- a/ggml/src/ggml-metal/ggml-metal-device.h +++ b/ggml/src/ggml-metal/ggml-metal-device.h @@ -147,8 +147,6 @@ struct ggml_metal_pipeline_with_params ggml_metal_library_get_pipeline_arange struct ggml_metal_pipeline_with_params ggml_metal_library_get_pipeline_timestep_embedding(ggml_metal_library_t lib, const struct ggml_tensor * op); struct ggml_metal_pipeline_with_params ggml_metal_library_get_pipeline_opt_step_adamw (ggml_metal_library_t lib, const struct ggml_tensor * op); struct ggml_metal_pipeline_with_params ggml_metal_library_get_pipeline_opt_step_sgd (ggml_metal_library_t lib, const struct ggml_tensor * op); -struct ggml_metal_pipeline_with_params ggml_metal_library_get_pipeline_memset (ggml_metal_library_t lib, const struct ggml_tensor * op); -struct ggml_metal_pipeline_with_params ggml_metal_library_get_pipeline_count_equal (ggml_metal_library_t lib, const struct ggml_tensor * op); struct ggml_metal_pipeline_with_params ggml_metal_library_get_pipeline_flash_attn_ext_pad( ggml_metal_library_t lib, @@ -219,8 +217,6 @@ struct ggml_metal_device_props { bool use_shared_buffers; bool supports_gpu_family_apple7; - - int op_offload_min_batch_size; }; ggml_metal_device_t ggml_metal_device_init(void); diff --git a/ggml/src/ggml-metal/ggml-metal-device.m b/ggml/src/ggml-metal/ggml-metal-device.m index ff899a8..f24270b 100644 --- a/ggml/src/ggml-metal/ggml-metal-device.m +++ b/ggml/src/ggml-metal/ggml-metal-device.m @@ -782,8 +782,6 @@ ggml_metal_device_t ggml_metal_device_init(void) { dev->props.supports_gpu_family_apple7 = [dev->mtl_device supportsFamily:MTLGPUFamilyApple7]; - dev->props.op_offload_min_batch_size = getenv("GGML_OP_OFFLOAD_MIN_BATCH") ? atoi(getenv("GGML_OP_OFFLOAD_MIN_BATCH")) : 32; - dev->props.max_buffer_size = dev->mtl_device.maxBufferLength; dev->props.max_working_set_size = dev->mtl_device.recommendedMaxWorkingSetSize; dev->props.max_theadgroup_memory_size = dev->mtl_device.maxThreadgroupMemoryLength; @@ -1025,11 +1023,6 @@ bool ggml_metal_device_supports_op(ggml_metal_device_t dev, const struct ggml_te return has_simdgroup_reduction && ggml_is_contiguous_rows(op->src[0]); case GGML_OP_L2_NORM: return has_simdgroup_reduction && (op->ne[0] % 4 == 0 && ggml_is_contiguous_1(op->src[0])); - case GGML_OP_COUNT_EQUAL: - return has_simdgroup_reduction && - op->src[0]->type == GGML_TYPE_I32 && - op->src[1]->type == GGML_TYPE_I32 && - op->type == GGML_TYPE_I64; case GGML_OP_ARGMAX: return has_simdgroup_reduction; case GGML_OP_NORM: diff --git a/ggml/src/ggml-metal/ggml-metal-impl.h b/ggml/src/ggml-metal/ggml-metal-impl.h index d3b0e73..8944b07 100644 --- a/ggml/src/ggml-metal/ggml-metal-impl.h +++ b/ggml/src/ggml-metal/ggml-metal-impl.h @@ -78,7 +78,6 @@ #define FC_MUL_MM 700 #define FC_ROPE 800 #define FC_SSM_CONV 900 -#define FC_COUNT_EQUAL 1000 // op-specific constants #define OP_FLASH_ATTN_EXT_NQPTG 8 @@ -895,25 +894,6 @@ typedef struct { float step; } ggml_metal_kargs_arange; -typedef struct { - int64_t val; -} ggml_metal_kargs_memset; - -typedef struct { - int32_t ne00; - int32_t ne01; - int32_t ne02; - int32_t ne03; - uint64_t nb00; - uint64_t nb01; - uint64_t nb02; - uint64_t nb03; - uint64_t nb10; - uint64_t nb11; - uint64_t nb12; - uint64_t nb13; -} ggml_metal_kargs_count_equal; - typedef struct { int32_t k0; int32_t k1; diff --git a/ggml/src/ggml-metal/ggml-metal-ops.cpp b/ggml/src/ggml-metal/ggml-metal-ops.cpp index a50b12b..e99c176 100644 --- a/ggml/src/ggml-metal/ggml-metal-ops.cpp +++ b/ggml/src/ggml-metal/ggml-metal-ops.cpp @@ -448,11 +448,7 @@ static int ggml_metal_op_encode_impl(ggml_metal_op_t ctx, int idx) { { n_fuse = ggml_metal_op_opt_step_sgd(ctx, idx); } break; - case GGML_OP_COUNT_EQUAL: - { - n_fuse = ggml_metal_op_count_equal(ctx, idx); - } break; - default: + default: { GGML_LOG_ERROR("%s: error: node %3d, op = %8s not implemented\n", __func__, idx, ggml_op_name(node->op)); GGML_ABORT("fatal error"); @@ -2181,11 +2177,7 @@ size_t ggml_metal_op_flash_attn_ext_extra_pad(const ggml_tensor * op) { const bool has_mask = op->src[3] != nullptr; - // note: the non-vec kernel requires more extra memory, so always reserve for it - GGML_ASSERT(OP_FLASH_ATTN_EXT_NCPSG >= OP_FLASH_ATTN_EXT_VEC_NCPSG); - - //if (ggml_metal_op_flash_attn_ext_use_vec(op)) { - if (false) { + if (ggml_metal_op_flash_attn_ext_use_vec(op)) { // note: always reserve the padding space to avoid graph reallocations //const bool has_kvpad = ne11 % OP_FLASH_ATTN_EXT_VEC_NCPSG != 0; const bool has_kvpad = true; @@ -4098,64 +4090,3 @@ int ggml_metal_op_opt_step_sgd(ggml_metal_op_t ctx, int idx) { return 1; } - -int ggml_metal_op_count_equal(ggml_metal_op_t ctx, int idx) { - ggml_tensor * op = ctx->node(idx); - - ggml_metal_library_t lib = ctx->lib; - ggml_metal_encoder_t enc = ctx->enc; - - GGML_TENSOR_LOCALS(int32_t, ne0, op->src[0], ne); - GGML_TENSOR_LOCALS(uint64_t, nb0, op->src[0], nb); - GGML_TENSOR_LOCALS(uint64_t, nb1, op->src[1], nb); - - { - ggml_metal_kargs_memset args = { /*.val =*/ 0 }; - - auto pipeline = ggml_metal_library_get_pipeline_memset(lib, op); - - ggml_metal_encoder_set_pipeline(enc, pipeline); - ggml_metal_encoder_set_bytes(enc, &args, sizeof(args), 0); - ggml_metal_encoder_set_buffer(enc, ggml_metal_get_buffer_id(op), 1); - - ggml_metal_encoder_dispatch_threadgroups(enc, 1, 1, 1, 1, 1, 1); - } - - ggml_metal_op_concurrency_reset(ctx); - - { - ggml_metal_kargs_count_equal args = { - /*.ne00 =*/ ne00, - /*.ne01 =*/ ne01, - /*.ne02 =*/ ne02, - /*.ne03 =*/ ne03, - /*.nb00 =*/ nb00, - /*.nb01 =*/ nb01, - /*.nb02 =*/ nb02, - /*.nb03 =*/ nb03, - /*.nb10 =*/ nb10, - /*.nb11 =*/ nb11, - /*.nb12 =*/ nb12, - /*.nb13 =*/ nb13, - }; - - auto pipeline = ggml_metal_library_get_pipeline_count_equal(lib, op); - - const size_t smem = pipeline.smem; - - const int nth = 32*pipeline.nsg; - - GGML_ASSERT(nth <= ggml_metal_pipeline_max_theads_per_threadgroup(pipeline)); - - ggml_metal_encoder_set_pipeline(enc, pipeline); - ggml_metal_encoder_set_bytes(enc, &args, sizeof(args), 0); - ggml_metal_encoder_set_buffer(enc, ggml_metal_get_buffer_id(op->src[0]), 1); - ggml_metal_encoder_set_buffer(enc, ggml_metal_get_buffer_id(op->src[1]), 2); - ggml_metal_encoder_set_buffer(enc, ggml_metal_get_buffer_id(op), 3); - - ggml_metal_encoder_set_threadgroup_memory_size(enc, smem, 0); - ggml_metal_encoder_dispatch_threadgroups(enc, ne01, ne02, ne03, nth, 1, 1); - } - - return 1; -} diff --git a/ggml/src/ggml-metal/ggml-metal-ops.h b/ggml/src/ggml-metal/ggml-metal-ops.h index c1025d3..902b544 100644 --- a/ggml/src/ggml-metal/ggml-metal-ops.h +++ b/ggml/src/ggml-metal/ggml-metal-ops.h @@ -87,7 +87,6 @@ int ggml_metal_op_leaky_relu (ggml_metal_op_t ctx, int idx); int ggml_metal_op_tri (ggml_metal_op_t ctx, int idx); int ggml_metal_op_opt_step_adamw (ggml_metal_op_t ctx, int idx); int ggml_metal_op_opt_step_sgd (ggml_metal_op_t ctx, int idx); -int ggml_metal_op_count_equal (ggml_metal_op_t ctx, int idx); #ifdef __cplusplus } diff --git a/ggml/src/ggml-metal/ggml-metal.cpp b/ggml/src/ggml-metal/ggml-metal.cpp index 56b59f0..70bf6f3 100644 --- a/ggml/src/ggml-metal/ggml-metal.cpp +++ b/ggml/src/ggml-metal/ggml-metal.cpp @@ -625,11 +625,14 @@ static int64_t get_op_batch_size(const ggml_tensor * op) { } static bool ggml_backend_metal_device_offload_op(ggml_backend_dev_t dev, const ggml_tensor * op) { - ggml_metal_device_t ctx_dev = (ggml_metal_device_t)dev->context; + const int min_batch_size = 32; return (op->op == GGML_OP_MUL_MAT || op->op == GGML_OP_MUL_MAT_ID) && - get_op_batch_size(op) >= ggml_metal_device_get_props(ctx_dev)->op_offload_min_batch_size; + get_op_batch_size(op) >= min_batch_size; + + GGML_UNUSED(dev); + GGML_UNUSED(op); } static ggml_backend_device_i ggml_backend_metal_device_i = { diff --git a/ggml/src/ggml-metal/ggml-metal.metal b/ggml/src/ggml-metal/ggml-metal.metal index 16d17d2..51bcbae 100644 --- a/ggml/src/ggml-metal/ggml-metal.metal +++ b/ggml/src/ggml-metal/ggml-metal.metal @@ -1790,7 +1790,6 @@ kernel void kernel_op_sum_f32( return; } - // TODO: become function constant const uint nsg = (ntg.x + 31) / 32; float sumf = 0; @@ -9148,7 +9147,6 @@ typedef decltype(kernel_mul_mm_id_map0<1>) kernel_mul_mm_id_map0_t; template [[host_name("kernel_mul_mm_id_map0_ne20_1" )]] kernel kernel_mul_mm_id_map0_t kernel_mul_mm_id_map0<1>; template [[host_name("kernel_mul_mm_id_map0_ne20_2" )]] kernel kernel_mul_mm_id_map0_t kernel_mul_mm_id_map0<2>; template [[host_name("kernel_mul_mm_id_map0_ne20_4" )]] kernel kernel_mul_mm_id_map0_t kernel_mul_mm_id_map0<4>; -template [[host_name("kernel_mul_mm_id_map0_ne20_5" )]] kernel kernel_mul_mm_id_map0_t kernel_mul_mm_id_map0<5>; template [[host_name("kernel_mul_mm_id_map0_ne20_6" )]] kernel kernel_mul_mm_id_map0_t kernel_mul_mm_id_map0<6>; template [[host_name("kernel_mul_mm_id_map0_ne20_8" )]] kernel kernel_mul_mm_id_map0_t kernel_mul_mm_id_map0<8>; template [[host_name("kernel_mul_mm_id_map0_ne20_10")]] kernel kernel_mul_mm_id_map0_t kernel_mul_mm_id_map0<10>; @@ -9559,6 +9557,9 @@ template [[host_name("kernel_mul_mm_iq4_xs_f32")]] kernel mul_mm_t kernel_mul_m template [[host_name("kernel_mul_mm_f32_f16")]] kernel mul_mm_t kernel_mul_mm; template [[host_name("kernel_mul_mm_f16_f16")]] kernel mul_mm_t kernel_mul_mm; +#if defined(GGML_METAL_HAS_BF16) +template [[host_name("kernel_mul_mm_bf16_f16")]] kernel mul_mm_t kernel_mul_mm; +#endif template [[host_name("kernel_mul_mm_q4_0_f16")]] kernel mul_mm_t kernel_mul_mm; template [[host_name("kernel_mul_mm_q4_1_f16")]] kernel mul_mm_t kernel_mul_mm; template [[host_name("kernel_mul_mm_q5_0_f16")]] kernel mul_mm_t kernel_mul_mm; @@ -9614,6 +9615,9 @@ template [[host_name("kernel_mul_mm_id_iq4_xs_f32")]] kernel mul_mm_id kernel_m template [[host_name("kernel_mul_mm_id_f32_f16")]] kernel mul_mm_id kernel_mul_mm_id; template [[host_name("kernel_mul_mm_id_f16_f16")]] kernel mul_mm_id kernel_mul_mm_id; +#if defined(GGML_METAL_HAS_BF16) +template [[host_name("kernel_mul_mm_id_bf16_f16")]] kernel mul_mm_id kernel_mul_mm_id; +#endif template [[host_name("kernel_mul_mm_id_q4_0_f16")]] kernel mul_mm_id kernel_mul_mm_id; template [[host_name("kernel_mul_mm_id_q4_1_f16")]] kernel mul_mm_id kernel_mul_mm_id; template [[host_name("kernel_mul_mm_id_q5_0_f16")]] kernel mul_mm_id kernel_mul_mm_id; @@ -9916,75 +9920,3 @@ kernel void kernel_opt_step_sgd_f32( x[gid] = x[gid] * (1.0f - pars[0] * pars[1]) - pars[0] * g[gid]; } - -template -kernel void kernel_memset( - constant ggml_metal_kargs_fill & args, - device T * dst, - uint tpig[[thread_position_in_grid]]) { - dst[tpig] = args.val; -} - -typedef decltype(kernel_memset) kernel_memset_t; - -template [[host_name("kernel_memset_i64")]] kernel kernel_memset_t kernel_memset; - -constant short FC_count_equal_nsg [[function_constant(FC_COUNT_EQUAL + 0)]]; - -template -kernel void kernel_count_equal( - constant ggml_metal_kargs_count_equal & args, - device const char * src0, - device const char * src1, - device atomic_int * dst, - threadgroup int32_t * shmem_i32 [[threadgroup(0)]], - uint3 tgpig[[threadgroup_position_in_grid]], - ushort3 tpitg[[thread_position_in_threadgroup]], - ushort sgitg[[simdgroup_index_in_threadgroup]], - ushort tiisg[[thread_index_in_simdgroup]], - ushort3 ntg[[threads_per_threadgroup]]) { - const short NSG = FC_count_equal_nsg; - - const int i3 = tgpig.z; - const int i2 = tgpig.y; - const int i1 = tgpig.x; - - if (i3 >= args.ne03 || i2 >= args.ne02 || i1 >= args.ne01) { - return; - } - - int sum = 0; - - device const char * base0 = src0 + i1*args.nb01 + i2*args.nb02 + i3*args.nb03; - device const char * base1 = src1 + i1*args.nb11 + i2*args.nb12 + i3*args.nb13; - - for (int64_t i0 = tpitg.x; i0 < args.ne00; i0 += ntg.x) { - const T v0 = *(device const T *)(base0 + i0*args.nb00); - const T v1 = *(device const T *)(base1 + i0*args.nb10); - sum += (v0 == v1); - } - - sum = simd_sum(sum); - - if (tiisg == 0) { - shmem_i32[sgitg] = sum; - } - - threadgroup_barrier(mem_flags::mem_threadgroup); - - if (sgitg == 0) { - float v = 0.0f; - if (tpitg.x < NSG) { - v = shmem_i32[tpitg.x]; - } - - float total = simd_sum(v); - if (tpitg.x == 0) { - atomic_fetch_add_explicit(dst, (int32_t) total, memory_order_relaxed); - } - } -} - -typedef decltype(kernel_count_equal) kernel_count_equal_t; - -template [[host_name("kernel_count_equal_i32")]] kernel kernel_count_equal_t kernel_count_equal; diff --git a/ggml/src/ggml-opencl/CMakeLists.txt b/ggml/src/ggml-opencl/CMakeLists.txt index 307ec08..2a4b79e 100644 --- a/ggml/src/ggml-opencl/CMakeLists.txt +++ b/ggml/src/ggml-opencl/CMakeLists.txt @@ -57,7 +57,6 @@ set(GGML_OPENCL_KERNELS add add_id argsort - fill clamp cpy cvt @@ -69,7 +68,6 @@ set(GGML_OPENCL_KERNELS get_rows glu group_norm - solve_tri im2col_f32 im2col_f16 mean @@ -122,8 +120,6 @@ set(GGML_OPENCL_KERNELS tsembd upscale tanh - expm1 - softplus pad repeat mul_mat_f16_f32 diff --git a/ggml/src/ggml-opencl/ggml-opencl.cpp b/ggml/src/ggml-opencl/ggml-opencl.cpp index d89d5e7..6397155 100644 --- a/ggml/src/ggml-opencl/ggml-opencl.cpp +++ b/ggml/src/ggml-opencl/ggml-opencl.cpp @@ -263,32 +263,6 @@ static ggml_cl_compiler_version get_adreno_cl_compiler_version(const char *drive return { type, major, minor, patch }; } -// cl buffer wrapper -struct ggml_cl_buffer { - cl_mem buffer; - size_t size; - - ggml_cl_buffer() - : buffer(nullptr), size(0) {} - - ~ggml_cl_buffer() { - if (buffer) { - CL_CHECK(clReleaseMemObject(buffer)); - } - } - - void allocate(cl_context context, size_t new_size) { - if (new_size > size) { - size = new_size; - if (buffer) { - CL_CHECK(clReleaseMemObject(buffer)); - } - cl_int err; - CL_CHECK((buffer = clCreateBuffer(context, CL_MEM_READ_WRITE, size, NULL, &err), err)); - } - } -}; - // Profiling struct ProfilingInfo { std::string op_name; @@ -402,11 +376,6 @@ struct ggml_backend_opencl_context { cl_context context; cl_command_queue queue; - // prealloc buffers for transposing weights and activations - ggml_cl_buffer prealloc_quant_trans; - ggml_cl_buffer prealloc_scales_trans; - ggml_cl_buffer prealloc_act_trans; - cl_program program_add; cl_program program_add_id; cl_program program_clamp; @@ -489,7 +458,6 @@ struct ggml_backend_opencl_context { cl_kernel kernel_gelu_quick, kernel_gelu_quick_4; cl_kernel kernel_relu; cl_kernel kernel_sigmoid_f32, kernel_sigmoid_f16; - cl_kernel kernel_fill; cl_kernel kernel_clamp; cl_kernel kernel_geglu, kernel_reglu, kernel_swiglu, kernel_swiglu_oai, kernel_geglu_erf, kernel_geglu_quick, kernel_geglu_f16, kernel_reglu_f16, kernel_swiglu_f16, kernel_geglu_erf_f16, kernel_geglu_quick_f16; @@ -531,7 +499,6 @@ struct ggml_backend_opencl_context { cl_kernel kernel_mul_mv_q6_K_f32; cl_kernel kernel_mul_mv_mxfp4_f32, kernel_mul_mv_mxfp4_f32_flat; cl_kernel kernel_mul_mv_q8_0_f32, kernel_mul_mv_q8_0_f32_flat; - cl_kernel kernel_solve_tri_f32; cl_kernel kernel_im2col_f32, kernel_im2col_f16; cl_kernel kernel_argsort_f32_i32; cl_kernel kernel_sum_rows_f32; @@ -539,10 +506,6 @@ struct ggml_backend_opencl_context { cl_kernel kernel_pad; cl_kernel kernel_tanh_f32_nd; cl_kernel kernel_tanh_f16_nd; - cl_kernel kernel_expm1_f32_nd; - cl_kernel kernel_expm1_f16_nd; - cl_kernel kernel_softplus_f32_nd; - cl_kernel kernel_softplus_f16_nd; cl_kernel kernel_upscale; cl_kernel kernel_upscale_bilinear; cl_kernel kernel_concat_f32_contiguous; @@ -675,6 +638,10 @@ struct ggml_backend_opencl_context { cl_kernel kernel_transpose_16_buf; cl_kernel kernel_transpose_16_4x1; + cl_mem A_s_d_max; // max scale buffer size for transpose + cl_mem A_q_d_max; // max weight buffer size for transpose + cl_mem B_d_max; // max activation buffer size for transpose + // Gemm and Gemv related programs, kernels, etc cl_program program_CL_gemm; cl_program program_CL_gemv_general; @@ -793,24 +760,6 @@ static void load_cl_kernels(ggml_backend_opencl_context *backend_ctx, ggml_cl_ve GGML_LOG_CONT("."); } - // fill - { -#ifdef GGML_OPENCL_EMBED_KERNELS - const std::string kernel_src { - #include "fill.cl.h" - }; -#else - const std::string kernel_src = read_file("fill.cl"); -#endif - cl_program prog = - build_program_from_source(backend_ctx->context, backend_ctx->device, kernel_src.c_str(), compile_opts); - - CL_CHECK((backend_ctx->kernel_fill = clCreateKernel(prog, "kernel_fill_f32", &err), err)); - GGML_LOG_CONT("."); - - CL_CHECK(clReleaseProgram(prog)); - } - // clamp { #ifdef GGML_OPENCL_EMBED_KERNELS @@ -953,23 +902,6 @@ static void load_cl_kernels(ggml_backend_opencl_context *backend_ctx, ggml_cl_ve GGML_LOG_CONT("."); } - // solve_tri_f32 - { -#ifdef GGML_OPENCL_EMBED_KERNELS - const std::string kernel_src { - #include "solve_tri.cl.h" - }; -#else - const std::string kernel_src = read_file("solve_tri.cl"); -#endif - cl_program prog = - build_program_from_source(backend_ctx->context, backend_ctx->device, kernel_src.c_str(), compile_opts); - - CL_CHECK((backend_ctx->kernel_solve_tri_f32 = clCreateKernel(prog, "kernel_solve_tri_f32", &err), err)); - GGML_LOG_CONT("."); - CL_CHECK(clReleaseProgram(prog)); - } - // im2col_f32 { #ifdef GGML_OPENCL_EMBED_KERNELS @@ -1821,56 +1753,6 @@ static void load_cl_kernels(ggml_backend_opencl_context *backend_ctx, ggml_cl_ve } } - // expm1 - { -#ifdef GGML_OPENCL_EMBED_KERNELS - const std::string kernel_src { - #include "expm1.cl.h" - }; -#else - const std::string kernel_src = read_file("expm1.cl"); -#endif - cl_program prog; - if (!kernel_src.empty()) { - prog = - build_program_from_source(backend_ctx->context, backend_ctx->device, kernel_src.c_str(), compile_opts); - CL_CHECK((backend_ctx->kernel_expm1_f32_nd = clCreateKernel(prog, "kernel_expm1_f32_nd", &err), err)); - CL_CHECK((backend_ctx->kernel_expm1_f16_nd = clCreateKernel(prog, "kernel_expm1_f16_nd", &err), err)); - GGML_LOG_CONT("."); - } else { - GGML_LOG_WARN("ggml_opencl: expm1 kernel source not found or empty. Expm1 operation will not be available.\n"); - prog = nullptr; - backend_ctx->kernel_expm1_f32_nd = nullptr; - backend_ctx->kernel_expm1_f16_nd = nullptr; - } - CL_CHECK(clReleaseProgram(prog)); - } - - // softplus - { -#ifdef GGML_OPENCL_EMBED_KERNELS - const std::string kernel_src { - #include "softplus.cl.h" - }; -#else - const std::string kernel_src = read_file("softplus.cl"); -#endif - cl_program prog; - if (!kernel_src.empty()) { - prog = - build_program_from_source(backend_ctx->context, backend_ctx->device, kernel_src.c_str(), compile_opts); - CL_CHECK((backend_ctx->kernel_softplus_f32_nd = clCreateKernel(prog, "kernel_softplus_f32_nd", &err), err)); - CL_CHECK((backend_ctx->kernel_softplus_f16_nd = clCreateKernel(prog, "kernel_softplus_f16_nd", &err), err)); - GGML_LOG_CONT("."); - } else { - GGML_LOG_WARN("ggml_opencl: softplus kernel source not found or empty. Softplus operation will not be available.\n"); - prog = nullptr; - backend_ctx->kernel_softplus_f32_nd = nullptr; - backend_ctx->kernel_softplus_f16_nd = nullptr; - } - CL_CHECK(clReleaseProgram(prog)); - } - // upscale { #ifdef GGML_OPENCL_EMBED_KERNELS @@ -2718,9 +2600,9 @@ static ggml_backend_opencl_context * ggml_cl2_init(ggml_backend_dev_t dev) { required_B_d_bytes, max_B_d_bytes); } - backend_ctx->prealloc_quant_trans.allocate(context, max_A_q_d_bytes); - backend_ctx->prealloc_scales_trans.allocate(context, max_A_s_d_bytes); - backend_ctx->prealloc_act_trans.allocate(context, max_B_d_bytes); + CL_CHECK((backend_ctx->A_q_d_max = clCreateBuffer(context, 0, max_A_q_d_bytes, NULL, &err), err)); + CL_CHECK((backend_ctx->A_s_d_max = clCreateBuffer(context, 0, max_A_s_d_bytes, NULL, &err), err)); + CL_CHECK((backend_ctx->B_d_max = clCreateBuffer(context, 0, max_B_d_bytes, NULL, &err), err)); #endif // GGML_OPENCL_USE_ADRENO_KERNELS backend_ctx->disable_fusion = getenv("GGML_OPENCL_DISABLE_FUSION") != nullptr; @@ -3180,12 +3062,6 @@ static bool ggml_opencl_supports_op(ggml_backend_dev_t dev, const struct ggml_te case GGML_UNARY_OP_TANH: return (op->src[0]->type == GGML_TYPE_F32 && op->type == GGML_TYPE_F32) || (op->src[0]->type == GGML_TYPE_F16 && op->type == GGML_TYPE_F16); - case GGML_UNARY_OP_EXPM1: - return (op->src[0]->type == GGML_TYPE_F32 && op->type == GGML_TYPE_F32) || - (op->src[0]->type == GGML_TYPE_F16 && op->type == GGML_TYPE_F16); - case GGML_UNARY_OP_SOFTPLUS: - return (op->src[0]->type == GGML_TYPE_F32 && op->type == GGML_TYPE_F32) || - (op->src[0]->type == GGML_TYPE_F16 && op->type == GGML_TYPE_F16); default: return false; } @@ -3201,8 +3077,6 @@ static bool ggml_opencl_supports_op(ggml_backend_dev_t dev, const struct ggml_te default: return false; } - case GGML_OP_FILL: - return op->type == GGML_TYPE_F32 && ggml_is_contiguous(op); case GGML_OP_CLAMP: return op->src[0]->type == GGML_TYPE_F32; case GGML_OP_SOFT_MAX: @@ -3284,8 +3158,6 @@ static bool ggml_opencl_supports_op(ggml_backend_dev_t dev, const struct ggml_te } return true; } - case GGML_OP_SOLVE_TRI: - return op->src[0]->type == GGML_TYPE_F32 && ggml_is_contiguous(op->src[0]); case GGML_OP_IM2COL: return true; case GGML_OP_ARGSORT: { @@ -3735,35 +3607,32 @@ static void ggml_backend_opencl_buffer_set_tensor(ggml_backend_buffer_t buffer, // use sub_buffer of max buffer size instead size_t q_size_bytes = K * M / 8 * sizeof(float); - backend_ctx->prealloc_quant_trans.allocate(context, q_size_bytes); - cl_buffer_region region; region.origin = 0; region.size = q_size_bytes; cl_mem qT_d = clCreateSubBuffer( - backend_ctx->prealloc_quant_trans.buffer, + backend_ctx->A_q_d_max, 0, CL_BUFFER_CREATE_TYPE_REGION, ®ion, &err); + // cl_mem qT_d = clCreateBuffer(context, CL_MEM_READ_WRITE, q_size_bytes, NULL, &err); CL_CHECK(err); bool K_tile_trans = true; if ((K / 32) % 4 != 0){ K_tile_trans =false; } - size_t d_size_bytes = M * (K / 32) * 2; - backend_ctx->prealloc_scales_trans.allocate(context, d_size_bytes); - region.origin = 0; region.size = d_size_bytes; cl_mem dT_d = clCreateSubBuffer( - backend_ctx->prealloc_scales_trans.buffer, + backend_ctx->A_s_d_max, 0, CL_BUFFER_CREATE_TYPE_REGION, ®ion, &err); + // cl_mem dT_d = clCreateBuffer(context, CL_MEM_READ_WRITE, d_size_bytes, NULL, &err); CL_CHECK(err); // <----------------------------------------------------------------------------------> // @@ -4367,8 +4236,8 @@ static const char * ggml_backend_opencl_device_get_description(ggml_backend_dev_ } static void ggml_backend_opencl_device_get_memory(ggml_backend_dev_t dev, size_t * free, size_t * total) { - *free = 0; - *total = 0; + *free = 1; + *total = 1; GGML_UNUSED(dev); } @@ -5961,36 +5830,6 @@ static void ggml_cl_sigmoid(ggml_backend_t backend, const ggml_tensor * src0, co backend_ctx->enqueue_ndrange_kernel(kernel, 3, global_work_size, local_work_size_ptr, dst); } -static void ggml_cl_fill(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { - GGML_ASSERT(dst); - GGML_ASSERT(dst->extra); - - UNUSED(src0); - UNUSED(src1); - - ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; - - ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; - cl_ulong offsetd = extrad->offset + dst->view_offs; - - float v = 0.0f; - memcpy(&v, ((int32_t *) dst->op_params), sizeof(float)); - - const int64_t n = ggml_nelements(dst); - - cl_kernel kernel = backend_ctx->kernel_fill; - - CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extrad->data_device)); - CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offsetd)); - CL_CHECK(clSetKernelArg(kernel, 2, sizeof(float), &v)); - CL_CHECK(clSetKernelArg(kernel, 3, sizeof(float), &n)); - - size_t local_work_size[1] = { 256 }; - size_t global_work_size[1] = { ((size_t)n + local_work_size[0] - 1) / local_work_size[0] * local_work_size[0] }; - - backend_ctx->enqueue_ndrange_kernel(kernel, 1, global_work_size, local_work_size, dst); -} - static void ggml_cl_clamp(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { GGML_ASSERT(src0); GGML_ASSERT(src0->extra); @@ -6544,210 +6383,6 @@ static void ggml_cl_tanh(ggml_backend_t backend, const ggml_tensor * src0, const backend_ctx->enqueue_ndrange_kernel(kernel, 3, global_work_size, local_work_size_ptr, dst); } -static void ggml_cl_expm1(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { - GGML_ASSERT(src0); - GGML_ASSERT(src0->extra); - GGML_ASSERT(dst); - GGML_ASSERT(dst->extra); - - UNUSED(src1); - - ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; - - ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; - ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; - - cl_ulong offset0_abs = extra0->offset + src0->view_offs; - cl_ulong offsetd_abs = extrad->offset + dst->view_offs; - - cl_kernel kernel; - if (dst->type == GGML_TYPE_F32) { - kernel = backend_ctx->kernel_expm1_f32_nd; - } else if (dst->type == GGML_TYPE_F16) { - kernel = backend_ctx->kernel_expm1_f16_nd; - } else { - GGML_ASSERT(false && "Unsupported type for ggml_cl_expm1"); - } - GGML_ASSERT(kernel != nullptr); - - const int ne00 = src0->ne[0]; - const int ne01 = src0->ne[1]; - const int ne02 = src0->ne[2]; - const int ne03 = src0->ne[3]; - - const cl_ulong nb00 = src0->nb[0]; - const cl_ulong nb01 = src0->nb[1]; - const cl_ulong nb02 = src0->nb[2]; - const cl_ulong nb03 = src0->nb[3]; - - const int ne10 = dst->ne[0]; - const int ne11 = dst->ne[1]; - const int ne12 = dst->ne[2]; - const int ne13 = dst->ne[3]; - - const cl_ulong nb10 = dst->nb[0]; - const cl_ulong nb11 = dst->nb[1]; - const cl_ulong nb12 = dst->nb[2]; - const cl_ulong nb13 = dst->nb[3]; - - CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); - CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0_abs)); - CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extrad->data_device)); - CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offsetd_abs)); - - CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), &ne00)); - CL_CHECK(clSetKernelArg(kernel, 5, sizeof(int), &ne01)); - CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne02)); - CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), &ne03)); - CL_CHECK(clSetKernelArg(kernel, 8, sizeof(cl_ulong), &nb00)); - CL_CHECK(clSetKernelArg(kernel, 9, sizeof(cl_ulong), &nb01)); - CL_CHECK(clSetKernelArg(kernel, 10, sizeof(cl_ulong),&nb02)); - CL_CHECK(clSetKernelArg(kernel, 11, sizeof(cl_ulong),&nb03)); - - CL_CHECK(clSetKernelArg(kernel, 12, sizeof(int), &ne10)); - CL_CHECK(clSetKernelArg(kernel, 13, sizeof(int), &ne11)); - CL_CHECK(clSetKernelArg(kernel, 14, sizeof(int), &ne12)); - CL_CHECK(clSetKernelArg(kernel, 15, sizeof(int), &ne13)); - CL_CHECK(clSetKernelArg(kernel, 16, sizeof(cl_ulong),&nb10)); - CL_CHECK(clSetKernelArg(kernel, 17, sizeof(cl_ulong),&nb11)); - CL_CHECK(clSetKernelArg(kernel, 18, sizeof(cl_ulong),&nb12)); - CL_CHECK(clSetKernelArg(kernel, 19, sizeof(cl_ulong),&nb13)); - - size_t global_work_size[3]; - if (ne10 == 0 || ne11 == 0 || ne12 == 0 || ne13 == 0) { // Handle case of 0 elements - return; - } - global_work_size[0] = (size_t)ne10; - global_work_size[1] = (size_t)ne11; - global_work_size[2] = (size_t)ne12; - - size_t lws0 = 16, lws1 = 4, lws2 = 1; - if (ne10 < 16) lws0 = ne10; - if (ne11 < 4) lws1 = ne11; - if (ne12 < 1) lws2 = ne12 > 0 ? ne12 : 1; - - while (lws0 * lws1 * lws2 > 256 && lws0 > 1) lws0 /= 2; - while (lws0 * lws1 * lws2 > 256 && lws1 > 1) lws1 /= 2; - while (lws0 * lws1 * lws2 > 256 && lws2 > 1) lws2 /= 2; - - - size_t local_work_size[] = {lws0, lws1, lws2}; - - size_t* local_work_size_ptr = local_work_size; - if (!backend_ctx->non_uniform_workgroups) { - if (global_work_size[0] % local_work_size[0] != 0 || - global_work_size[1] % local_work_size[1] != 0 || - global_work_size[2] % local_work_size[2] != 0) { - local_work_size_ptr = NULL; - } - } - if (global_work_size[0] == 0 || global_work_size[1] == 0 || global_work_size[2] == 0) return; - - backend_ctx->enqueue_ndrange_kernel(kernel, 3, global_work_size, local_work_size_ptr, dst); -} - -static void ggml_cl_softplus(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { - GGML_ASSERT(src0); - GGML_ASSERT(src0->extra); - GGML_ASSERT(dst); - GGML_ASSERT(dst->extra); - - UNUSED(src1); - - ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; - - ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; - ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; - - cl_ulong offset0_abs = extra0->offset + src0->view_offs; - cl_ulong offsetd_abs = extrad->offset + dst->view_offs; - - cl_kernel kernel; - if (dst->type == GGML_TYPE_F32) { - kernel = backend_ctx->kernel_softplus_f32_nd; - } else if (dst->type == GGML_TYPE_F16) { - kernel = backend_ctx->kernel_softplus_f16_nd; - } else { - GGML_ASSERT(false && "Unsupported type for ggml_cl_softplus"); - } - GGML_ASSERT(kernel != nullptr); - - const int ne00 = src0->ne[0]; - const int ne01 = src0->ne[1]; - const int ne02 = src0->ne[2]; - const int ne03 = src0->ne[3]; - - const cl_ulong nb00 = src0->nb[0]; - const cl_ulong nb01 = src0->nb[1]; - const cl_ulong nb02 = src0->nb[2]; - const cl_ulong nb03 = src0->nb[3]; - - const int ne10 = dst->ne[0]; - const int ne11 = dst->ne[1]; - const int ne12 = dst->ne[2]; - const int ne13 = dst->ne[3]; - - const cl_ulong nb10 = dst->nb[0]; - const cl_ulong nb11 = dst->nb[1]; - const cl_ulong nb12 = dst->nb[2]; - const cl_ulong nb13 = dst->nb[3]; - - CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); - CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0_abs)); - CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extrad->data_device)); - CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offsetd_abs)); - - CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), &ne00)); - CL_CHECK(clSetKernelArg(kernel, 5, sizeof(int), &ne01)); - CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne02)); - CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), &ne03)); - CL_CHECK(clSetKernelArg(kernel, 8, sizeof(cl_ulong), &nb00)); - CL_CHECK(clSetKernelArg(kernel, 9, sizeof(cl_ulong), &nb01)); - CL_CHECK(clSetKernelArg(kernel, 10, sizeof(cl_ulong),&nb02)); - CL_CHECK(clSetKernelArg(kernel, 11, sizeof(cl_ulong),&nb03)); - - CL_CHECK(clSetKernelArg(kernel, 12, sizeof(int), &ne10)); - CL_CHECK(clSetKernelArg(kernel, 13, sizeof(int), &ne11)); - CL_CHECK(clSetKernelArg(kernel, 14, sizeof(int), &ne12)); - CL_CHECK(clSetKernelArg(kernel, 15, sizeof(int), &ne13)); - CL_CHECK(clSetKernelArg(kernel, 16, sizeof(cl_ulong),&nb10)); - CL_CHECK(clSetKernelArg(kernel, 17, sizeof(cl_ulong),&nb11)); - CL_CHECK(clSetKernelArg(kernel, 18, sizeof(cl_ulong),&nb12)); - CL_CHECK(clSetKernelArg(kernel, 19, sizeof(cl_ulong),&nb13)); - - size_t global_work_size[3]; - if (ne10 == 0 || ne11 == 0 || ne12 == 0 || ne13 == 0) { // Handle case of 0 elements - return; - } - global_work_size[0] = (size_t)ne10; - global_work_size[1] = (size_t)ne11; - global_work_size[2] = (size_t)ne12; - - size_t lws0 = 16, lws1 = 4, lws2 = 1; - if (ne10 < 16) lws0 = ne10; - if (ne11 < 4) lws1 = ne11; - if (ne12 < 1) lws2 = ne12 > 0 ? ne12 : 1; - - while (lws0 * lws1 * lws2 > 256 && lws0 > 1) lws0 /= 2; - while (lws0 * lws1 * lws2 > 256 && lws1 > 1) lws1 /= 2; - while (lws0 * lws1 * lws2 > 256 && lws2 > 1) lws2 /= 2; - - - size_t local_work_size[] = {lws0, lws1, lws2}; - - size_t* local_work_size_ptr = local_work_size; - if (!backend_ctx->non_uniform_workgroups) { - if (global_work_size[0] % local_work_size[0] != 0 || - global_work_size[1] % local_work_size[1] != 0 || - global_work_size[2] % local_work_size[2] != 0) { - local_work_size_ptr = NULL; - } - } - if (global_work_size[0] == 0 || global_work_size[1] == 0 || global_work_size[2] == 0) return; - - backend_ctx->enqueue_ndrange_kernel(kernel, 3, global_work_size, local_work_size_ptr, dst); -} - static void ggml_cl_repeat(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1_shape_def, ggml_tensor * dst) { GGML_ASSERT(src0); GGML_ASSERT(src0->extra); @@ -7760,10 +7395,8 @@ static void ggml_cl_mul_mat(ggml_backend_t backend, const ggml_tensor * src0, co region.origin = 0; // Specify the size of the sub-buffer (divide by 2 for FP16) region.size = K * (N + padding) * sizeof(float)/2; - backend_ctx->prealloc_act_trans.allocate(context, region.size); - B_d = clCreateSubBuffer( - backend_ctx->prealloc_act_trans.buffer, + backend_ctx->B_d_max, 0, CL_BUFFER_CREATE_TYPE_REGION, ®ion, @@ -9494,72 +9127,6 @@ static void ggml_cl_rope(ggml_backend_t backend, const ggml_tensor * src0, const backend_ctx->enqueue_ndrange_kernel(kernel, 3, global_work_size, local_work_size, dst); } -static void ggml_cl_solve_tri(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { - GGML_ASSERT(src0); - GGML_ASSERT(src0->extra); - GGML_ASSERT(src1); - GGML_ASSERT(src1->extra); - GGML_ASSERT(dst); - GGML_ASSERT(dst->extra); - - ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; - - ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; - ggml_tensor_extra_cl * extra1 = (ggml_tensor_extra_cl *)src1->extra; - ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; - - cl_ulong offset0 = extra0->offset + src0->view_offs; - cl_ulong offset1 = extra1->offset + src1->view_offs; - cl_ulong offsetd = extrad->offset + dst->view_offs; - - cl_kernel kernel = backend_ctx->kernel_solve_tri_f32; - GGML_ASSERT(kernel != nullptr); - - const int n = src0->ne[0]; - const int k = src1->ne[0]; - - const cl_ulong nb00 = src0->nb[0]; - const cl_ulong nb01 = src0->nb[1]; - const cl_ulong nb02 = src0->nb[2]; - const cl_ulong nb03 = src0->nb[3]; - - const cl_ulong nb10 = src1->nb[0]; - const cl_ulong nb11 = src1->nb[1]; - const cl_ulong nb12 = src1->nb[2]; - const cl_ulong nb13 = src1->nb[3]; - - const cl_ulong nb0 = dst->nb[0]; - const cl_ulong nb1 = dst->nb[1]; - const cl_ulong nb2 = dst->nb[2]; - const cl_ulong nb3 = dst->nb[3]; - - CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); - CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); - CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra1->data_device)); - CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offset1)); - CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), &extrad->data_device)); - CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &offsetd)); - CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &n)); - CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), &k)); - CL_CHECK(clSetKernelArg(kernel, 8, sizeof(cl_ulong), &nb00)); - CL_CHECK(clSetKernelArg(kernel, 9, sizeof(cl_ulong), &nb01)); - CL_CHECK(clSetKernelArg(kernel, 10, sizeof(cl_ulong),&nb02)); - CL_CHECK(clSetKernelArg(kernel, 11, sizeof(cl_ulong),&nb03)); - CL_CHECK(clSetKernelArg(kernel, 12, sizeof(cl_ulong),&nb10)); - CL_CHECK(clSetKernelArg(kernel, 13, sizeof(cl_ulong),&nb11)); - CL_CHECK(clSetKernelArg(kernel, 14, sizeof(cl_ulong),&nb12)); - CL_CHECK(clSetKernelArg(kernel, 15, sizeof(cl_ulong),&nb13)); - CL_CHECK(clSetKernelArg(kernel, 16, sizeof(cl_ulong),&nb0)); - CL_CHECK(clSetKernelArg(kernel, 17, sizeof(cl_ulong),&nb1)); - CL_CHECK(clSetKernelArg(kernel, 18, sizeof(cl_ulong),&nb2)); - CL_CHECK(clSetKernelArg(kernel, 19, sizeof(cl_ulong),&nb3)); - - size_t global_work_size[3]= { (size_t)k, (size_t)dst->ne[2], (size_t)dst->ne[3]}; - size_t local_work_size[] = {16, 4, 1}; - - backend_ctx->enqueue_ndrange_kernel(kernel, 3, global_work_size, local_work_size, dst); -} - static void ggml_cl_im2col(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { GGML_ASSERT(src0); GGML_ASSERT(src1); @@ -9987,18 +9554,6 @@ bool ggml_cl_compute_forward(ggml_backend_t backend, struct ggml_tensor * tensor } func = ggml_cl_tanh; break; - case GGML_UNARY_OP_EXPM1: - if (!any_on_device) { - return false; - } - func = ggml_cl_expm1; - break; - case GGML_UNARY_OP_SOFTPLUS: - if (!any_on_device) { - return false; - } - func = ggml_cl_softplus; - break; default: return false; } break; @@ -10008,12 +9563,6 @@ bool ggml_cl_compute_forward(ggml_backend_t backend, struct ggml_tensor * tensor } func = ggml_cl_glu; break; - case GGML_OP_FILL: - if (!any_on_device) { - return false; - } - func = ggml_cl_fill; - break; case GGML_OP_CLAMP: if (!any_on_device) { return false; @@ -10125,12 +9674,6 @@ bool ggml_cl_compute_forward(ggml_backend_t backend, struct ggml_tensor * tensor } func = ggml_cl_rope; break; - case GGML_OP_SOLVE_TRI: - if (!any_on_device) { - return false; - } - func = ggml_cl_solve_tri; - break; case GGML_OP_IM2COL: if (!any_on_device) { return false; diff --git a/ggml/src/ggml-opencl/kernels/expm1.cl b/ggml/src/ggml-opencl/kernels/expm1.cl deleted file mode 100644 index 126298a..0000000 --- a/ggml/src/ggml-opencl/kernels/expm1.cl +++ /dev/null @@ -1,82 +0,0 @@ -#pragma OPENCL EXTENSION cl_khr_fp16 : enable - -//------------------------------------------------------------------------------ -// expm1 -//------------------------------------------------------------------------------ -kernel void kernel_expm1_f32_nd( - global void * p_src0_base, - ulong off_src0_abs, - global void * p_dst_base, - ulong off_dst_abs, - int ne00, - int ne01, - int ne02, - int ne03, - ulong nb00, - ulong nb01, - ulong nb02, - ulong nb03, - int ne10, - int ne11, - int ne12, - int ne13, - ulong nb10, - ulong nb11, - ulong nb12, - ulong nb13 -) { - int i0 = get_global_id(0); - int i1 = get_global_id(1); - int i2 = get_global_id(2); - - if (i0 < ne10 && i1 < ne11 && i2 < ne12) { - for (int i3 = 0; i3 < ne13; ++i3) { - ulong src_offset_in_tensor = (ulong)i0*nb00 + (ulong)i1*nb01 + (ulong)i2*nb02 + (ulong)i3*nb03; - global const float *src_val_ptr = (global const float *)((global char *)p_src0_base + off_src0_abs + src_offset_in_tensor); - - ulong dst_offset_in_tensor = (ulong)i0*nb10 + (ulong)i1*nb11 + (ulong)i2*nb12 + (ulong)i3*nb13; - global float *dst_val_ptr = (global float *)((global char *)p_dst_base + off_dst_abs + dst_offset_in_tensor); - - *dst_val_ptr = exp(*src_val_ptr) - 1; - } - } -} - -kernel void kernel_expm1_f16_nd( - global void * p_src0_base, - ulong off_src0_abs, - global void * p_dst_base, - ulong off_dst_abs, - int ne00, - int ne01, - int ne02, - int ne03, - ulong nb00, - ulong nb01, - ulong nb02, - ulong nb03, - int ne10, - int ne11, - int ne12, - int ne13, - ulong nb10, - ulong nb11, - ulong nb12, - ulong nb13 -) { - int i0 = get_global_id(0); - int i1 = get_global_id(1); - int i2 = get_global_id(2); - - if (i0 < ne10 && i1 < ne11 && i2 < ne12) { - for (int i3 = 0; i3 < ne13; ++i3) { - ulong src_offset_in_tensor = (ulong)i0*nb00 + (ulong)i1*nb01 + (ulong)i2*nb02 + (ulong)i3*nb03; - global const half *src_val_ptr = (global const half *)((global char *)p_src0_base + off_src0_abs + src_offset_in_tensor); - - ulong dst_offset_in_tensor = (ulong)i0*nb10 + (ulong)i1*nb11 + (ulong)i2*nb12 + (ulong)i3*nb13; - global half *dst_val_ptr = (global half *)((global char *)p_dst_base + off_dst_abs + dst_offset_in_tensor); - - *dst_val_ptr = exp(*src_val_ptr) - 1; - } - } -} diff --git a/ggml/src/ggml-opencl/kernels/fill.cl b/ggml/src/ggml-opencl/kernels/fill.cl deleted file mode 100644 index 9b73938..0000000 --- a/ggml/src/ggml-opencl/kernels/fill.cl +++ /dev/null @@ -1,17 +0,0 @@ -#pragma OPENCL EXTENSION cl_khr_fp16 : enable - -//------------------------------------------------------------------------------ -// fill -//------------------------------------------------------------------------------ -__kernel void kernel_fill_f32( - __global float *dst, - ulong offsetd, - float v, - int n - -) { - dst = (global float*)((global char*)dst + offsetd); - if(get_global_id(0) < n){ - dst[get_global_id(0)] = v; - } -} diff --git a/ggml/src/ggml-opencl/kernels/softplus.cl b/ggml/src/ggml-opencl/kernels/softplus.cl deleted file mode 100644 index 033766e..0000000 --- a/ggml/src/ggml-opencl/kernels/softplus.cl +++ /dev/null @@ -1,88 +0,0 @@ -#pragma OPENCL EXTENSION cl_khr_fp16 : enable - -//------------------------------------------------------------------------------ -// softplus -//------------------------------------------------------------------------------ -inline float softplus_f32(float x){ - float ax = fabs(x); - float m = fmax(x, 0.0f); - return log1p(exp(-ax)) + m; -} - -kernel void kernel_softplus_f32_nd( - global void * p_src0_base, - ulong off_src0_abs, - global void * p_dst_base, - ulong off_dst_abs, - int ne00, - int ne01, - int ne02, - int ne03, - ulong nb00, - ulong nb01, - ulong nb02, - ulong nb03, - int ne10, - int ne11, - int ne12, - int ne13, - ulong nb10, - ulong nb11, - ulong nb12, - ulong nb13 -) { - int i0 = get_global_id(0); - int i1 = get_global_id(1); - int i2 = get_global_id(2); - - if (i0 < ne10 && i1 < ne11 && i2 < ne12) { - for (int i3 = 0; i3 < ne13; ++i3) { - ulong src_offset_in_tensor = (ulong)i0*nb00 + (ulong)i1*nb01 + (ulong)i2*nb02 + (ulong)i3*nb03; - global const float *src_val_ptr = (global const float *)((global char *)p_src0_base + off_src0_abs + src_offset_in_tensor); - - ulong dst_offset_in_tensor = (ulong)i0*nb10 + (ulong)i1*nb11 + (ulong)i2*nb12 + (ulong)i3*nb13; - global float *dst_val_ptr = (global float *)((global char *)p_dst_base + off_dst_abs + dst_offset_in_tensor); - - *dst_val_ptr = softplus_f32(*src_val_ptr); - } - } -} - -kernel void kernel_softplus_f16_nd( - global void * p_src0_base, - ulong off_src0_abs, - global void * p_dst_base, - ulong off_dst_abs, - int ne00, - int ne01, - int ne02, - int ne03, - ulong nb00, - ulong nb01, - ulong nb02, - ulong nb03, - int ne10, - int ne11, - int ne12, - int ne13, - ulong nb10, - ulong nb11, - ulong nb12, - ulong nb13 -) { - int i0 = get_global_id(0); - int i1 = get_global_id(1); - int i2 = get_global_id(2); - - if (i0 < ne10 && i1 < ne11 && i2 < ne12) { - for (int i3 = 0; i3 < ne13; ++i3) { - ulong src_offset_in_tensor = (ulong)i0*nb00 + (ulong)i1*nb01 + (ulong)i2*nb02 + (ulong)i3*nb03; - global const half *src_val_ptr = (global const half *)((global char *)p_src0_base + off_src0_abs + src_offset_in_tensor); - - ulong dst_offset_in_tensor = (ulong)i0*nb10 + (ulong)i1*nb11 + (ulong)i2*nb12 + (ulong)i3*nb13; - global half *dst_val_ptr = (global half *)((global char *)p_dst_base + off_dst_abs + dst_offset_in_tensor); - - *dst_val_ptr = (half)(softplus_f32((float)(*src_val_ptr))); - } - } -} diff --git a/ggml/src/ggml-opencl/kernels/solve_tri.cl b/ggml/src/ggml-opencl/kernels/solve_tri.cl deleted file mode 100644 index 80745fc..0000000 --- a/ggml/src/ggml-opencl/kernels/solve_tri.cl +++ /dev/null @@ -1,51 +0,0 @@ -#pragma OPENCL EXTENSION cl_khr_fp16 : enable - -//------------------------------------------------------------------------------ -// solve_tri -//------------------------------------------------------------------------------ -kernel void kernel_solve_tri_f32( - global uchar * src0, - ulong offset0, - global uchar * src1, - ulong offset1, - global uchar * dst, - ulong offsetd, - int n, - int k, - ulong nb00, - ulong nb01, - ulong nb02, - ulong nb03, - ulong nb10, - ulong nb11, - ulong nb12, - ulong nb13, - ulong nb0, - ulong nb1, - ulong nb2, - ulong nb3 -) { - int col = get_global_id(0); - int i2 = get_global_id(1); - int i3 = get_global_id(2); - - global const uchar * Lb = src0 + offset0 + i2 * nb02 + i3 * nb03; - global const uchar * Bb = src1 + offset1 + i2 * nb12 + i3 * nb13; - global uchar * Xb = dst + offsetd + i2 * nb2 + i3 * nb3; - - for(int row = 0; row < n; ++row){ - global const float *pB = (global const float *)(Bb + row * nb11 + col * nb10); - - float sum = 0.0f; - for(int j = 0; j < row; ++j){ - global const float *pL = (global const float *)(Lb + row * nb01 + j * nb00); - global const float *pX = (global const float *)(Xb + j * nb1 + col * nb0); - sum += (*pL) * (*pX); - } - - global const float * pDiag = (global const float *)(Lb + row * nb01 + row *nb00); - global float * pOut = (global float *)(Xb + row * nb1 + col *nb0); - - *pOut = ((* pB) - sum) / (*pDiag); - } -} diff --git a/ggml/src/ggml-rpc/ggml-rpc.cpp b/ggml/src/ggml-rpc/ggml-rpc.cpp index d7c8ad8..13cf1f5 100644 --- a/ggml/src/ggml-rpc/ggml-rpc.cpp +++ b/ggml/src/ggml-rpc/ggml-rpc.cpp @@ -524,7 +524,6 @@ static std::shared_ptr get_socket(const std::string & endpoint) { std::string host; int port; if (!parse_endpoint(endpoint, host, port)) { - GGML_LOG_ERROR("Failed to parse endpoint: %s\n", endpoint.c_str()); return nullptr; } #ifdef _WIN32 @@ -572,10 +571,6 @@ static void * ggml_backend_rpc_buffer_get_base(ggml_backend_buffer_t buffer) { return ctx->base_ptr; } -static bool ggml_backend_buffer_is_rpc(ggml_backend_buffer_t buffer) { - return buffer->iface.free_buffer == ggml_backend_rpc_buffer_free_buffer; -} - static rpc_tensor serialize_tensor(const ggml_tensor * tensor) { rpc_tensor result; if (!tensor) { @@ -585,7 +580,7 @@ static rpc_tensor serialize_tensor(const ggml_tensor * tensor) { result.id = reinterpret_cast(tensor); result.type = tensor->type; - if (tensor->buffer && ggml_backend_buffer_is_rpc(tensor->buffer)) { + if (tensor->buffer) { ggml_backend_buffer_t buffer = tensor->buffer; ggml_backend_rpc_buffer_context * ctx = (ggml_backend_rpc_buffer_context *)buffer->context; result.buffer = ctx != nullptr ? ctx->remote_ptr : 0; @@ -669,6 +664,10 @@ static void ggml_backend_rpc_buffer_get_tensor(ggml_backend_buffer_t buffer, con RPC_STATUS_ASSERT(status); } +static bool ggml_backend_buffer_is_rpc(ggml_backend_buffer_t buffer) { + return buffer->iface.free_buffer == ggml_backend_rpc_buffer_free_buffer; +} + static bool ggml_backend_rpc_buffer_cpy_tensor(ggml_backend_buffer_t buffer, const ggml_tensor * src, ggml_tensor * dst) { if (ggml_backend_buffer_is_rpc(src->buffer)) { // check if src and dst are on the same server @@ -1517,12 +1516,10 @@ bool rpc_server::graph_compute(const std::vector & input) { struct ggml_cgraph * graph = ggml_new_graph_custom(ctx, n_nodes, false); graph->n_nodes = n_nodes; std::unordered_map tensor_ptrs; - tensor_ptrs.reserve(n_tensors); for (uint32_t i = 0; i < n_tensors; i++) { - tensor_ptrs.emplace(tensors[i].id, &tensors[i]); + tensor_ptrs[tensors[i].id] = &tensors[i]; } std::unordered_map tensor_map; - tensor_map.reserve(n_nodes); for (uint32_t i = 0; i < n_nodes; i++) { int64_t id; memcpy(&id, &nodes[i], sizeof(id)); @@ -2056,10 +2053,6 @@ ggml_backend_reg_t ggml_backend_rpc_reg(void) { static uint32_t ggml_backend_rpc_get_device_count(const char * endpoint) { auto sock = get_socket(endpoint); - if (sock == nullptr) { - GGML_LOG_ERROR("Failed to connect to %s\n", endpoint); - return 0; - } rpc_msg_device_count_rsp response; bool status = send_rpc_cmd(sock, RPC_CMD_DEVICE_COUNT, nullptr, 0, &response, sizeof(response)); RPC_STATUS_ASSERT(status); diff --git a/ggml/src/ggml-sycl/CMakeLists.txt b/ggml/src/ggml-sycl/CMakeLists.txt index 5a89d8d..88f2922 100644 --- a/ggml/src/ggml-sycl/CMakeLists.txt +++ b/ggml/src/ggml-sycl/CMakeLists.txt @@ -36,47 +36,7 @@ if (WIN32) endif() endif() -macro(detect_and_find_package package_name) - set(test_source " - cmake_minimum_required(VERSION ${CMAKE_VERSION}) - project(check_package LANGUAGES CXX) - find_package(${package_name} QUIET) - ") - - set(test_dir "${CMAKE_CURRENT_BINARY_DIR}/check_package_${package_name}") - file(WRITE "${test_dir}/CMakeLists.txt" "${test_source}") - - set(cmake_args "") - if(CMAKE_GENERATOR) - list(APPEND cmake_args "-G" "${CMAKE_GENERATOR}") - endif() - if(CMAKE_GENERATOR_PLATFORM) - list(APPEND cmake_args "-A" "${CMAKE_GENERATOR_PLATFORM}") - endif() - if(CMAKE_GENERATOR_TOOLSET) - list(APPEND cmake_args "-T" "${CMAKE_GENERATOR_TOOLSET}") - endif() - if(CMAKE_CXX_COMPILER) - list(APPEND cmake_args "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}") - endif() - - execute_process( - COMMAND ${CMAKE_COMMAND} ${cmake_args} . - WORKING_DIRECTORY "${test_dir}" - RESULT_VARIABLE result - OUTPUT_QUIET - ERROR_QUIET - ) - - if(result EQUAL 0) - find_package(${package_name} ${ARGN}) - else() - message(WARNING "Detection of ${package_name} failed. The package might be broken or incompatible.") - set(${package_name}_FOUND FALSE) - endif() -endmacro() - -detect_and_find_package(IntelSYCL) +find_package(IntelSYCL) if (IntelSYCL_FOUND) # Use oneAPI CMake when possible target_link_libraries(ggml-sycl PRIVATE IntelSYCL::SYCL_CXX) @@ -231,4 +191,3 @@ if (GGML_SYCL_DEVICE_ARCH) target_compile_options(ggml-sycl PRIVATE -Xsycl-target-backend --offload-arch=${GGML_SYCL_DEVICE_ARCH}) target_link_options(ggml-sycl PRIVATE -Xsycl-target-backend --offload-arch=${GGML_SYCL_DEVICE_ARCH}) endif() - diff --git a/ggml/src/ggml-sycl/ggml-sycl.cpp b/ggml/src/ggml-sycl/ggml-sycl.cpp index 8f8176b..e996d98 100644 --- a/ggml/src/ggml-sycl/ggml-sycl.cpp +++ b/ggml/src/ggml-sycl/ggml-sycl.cpp @@ -4286,7 +4286,6 @@ struct ggml_backend_sycl_device_context { int device; std::string name; std::string description; - int op_offload_min_batch_size; }; static const char * ggml_backend_sycl_device_get_name(ggml_backend_dev_t dev) { @@ -4675,8 +4674,9 @@ static int64_t get_op_batch_size(const ggml_tensor * op) { } static bool ggml_backend_sycl_device_offload_op(ggml_backend_dev_t dev, const ggml_tensor * op) { - ggml_backend_sycl_device_context * sycl_ctx = (ggml_backend_sycl_device_context *)dev->context; - return get_op_batch_size(op) >= sycl_ctx->op_offload_min_batch_size; + const int min_batch_size = 32; + return get_op_batch_size(op) >= min_batch_size; + GGML_UNUSED(dev); } static ggml_backend_event_t @@ -4799,7 +4799,6 @@ ggml_backend_reg_t ggml_backend_sycl_reg() { std::lock_guard lock(mutex); if (!initialized) { ggml_backend_sycl_reg_context * ctx = new ggml_backend_sycl_reg_context; - const int min_batch_size = getenv("GGML_OP_OFFLOAD_MIN_BATCH") ? atoi(getenv("GGML_OP_OFFLOAD_MIN_BATCH")) : 32; for (int i = 0; i < ggml_sycl_info().device_count; i++) { ggml_backend_sycl_device_context * dev_ctx = new ggml_backend_sycl_device_context; @@ -4813,7 +4812,6 @@ ggml_backend_reg_t ggml_backend_sycl_reg() { prop, dpct::dev_mgr::instance().get_device(i)))); dev_ctx->description = prop.get_name(); - dev_ctx->op_offload_min_batch_size = min_batch_size; ggml_backend_dev_t dev = new ggml_backend_device { /* .iface = */ ggml_backend_sycl_device_interface, diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index 0fabbce..a524adb 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -119,8 +119,6 @@ struct ggml_backend_vk_context; // Max number of adds that can be fused without exceeding MAX_PARAMETER_COUNT. #define MAX_FUSED_ADDS (MAX_PARAMETER_COUNT - 3) -typedef std::shared_ptr vk_pipeline; - struct vk_pipeline_struct { std::string name; vk::ShaderModule shader_module; @@ -138,15 +136,9 @@ struct vk_pipeline_struct { std::atomic compiled {}; // number of registers used, extracted from pipeline executable properties uint32_t register_count {}; - -#if defined(VK_EXT_shader_64bit_indexing) - bool is_64b_indexing {}; -#endif - // linked list of pipelines for multiple compilation variants. - // currently only used to compile a 64-bit indexing variant. - vk_pipeline next; }; +typedef std::shared_ptr vk_pipeline; typedef std::weak_ptr vk_pipeline_ref; static void ggml_vk_destroy_pipeline(vk::Device& device, vk_pipeline& pipeline); @@ -238,7 +230,9 @@ static ggml_backend_buffer_type_i ggml_backend_vk_buffer_type_interface = { /* .is_host = */ NULL, }; +#ifdef GGML_VULKAN_MEMORY_DEBUG class vk_memory_logger; +#endif class vk_perf_logger; static void ggml_vk_destroy_buffer(vk_buffer& buf); static void ggml_vk_synchronize(ggml_backend_vk_context * ctx); @@ -385,18 +379,18 @@ enum FaCodePath { }; struct vk_fa_pipeline_state { - vk_fa_pipeline_state(uint32_t HSK, uint32_t HSV, bool small_rows, bool small_cache, FaCodePath path, bool aligned, bool f32acc) - : HSK(HSK), HSV(HSV), small_rows(small_rows), small_cache(small_cache), path(path), aligned(aligned), f32acc(f32acc) {} + vk_fa_pipeline_state(uint32_t HSK, uint32_t HSV, bool small_rows, FaCodePath path, bool aligned, bool f32acc) + : HSK(HSK), HSV(HSV), small_rows(small_rows), path(path), aligned(aligned), f32acc(f32acc) {} uint32_t HSK, HSV; - bool small_rows, small_cache; + bool small_rows; FaCodePath path; bool aligned; bool f32acc; bool operator<(const vk_fa_pipeline_state &b) const { - return std::tie(HSK, HSV, small_rows, small_cache, path, aligned, f32acc) < - std::tie(b.HSK, b.HSV, b.small_rows, b.small_cache, b.path, b.aligned, b.f32acc); + return std::tie(HSK, HSV, small_rows, path, aligned, f32acc) < + std::tie(b.HSK, b.HSV, b.small_rows, b.path, b.aligned, b.f32acc); } }; @@ -440,15 +434,8 @@ static constexpr std::initializer_list topk_moe_early_softmax_norm{ GGM GGML_OP_VIEW, GGML_OP_GET_ROWS, GGML_OP_RESHAPE, GGML_OP_SUM_ROWS, GGML_OP_CLAMP, GGML_OP_DIV, GGML_OP_RESHAPE }; - -static constexpr std::initializer_list topk_moe_sigmoid_norm_bias{ GGML_OP_UNARY, GGML_OP_RESHAPE, GGML_OP_ADD, - GGML_OP_ARGSORT, GGML_OP_VIEW, GGML_OP_GET_ROWS, - GGML_OP_RESHAPE, GGML_OP_SUM_ROWS, GGML_OP_CLAMP, - GGML_OP_DIV, GGML_OP_RESHAPE }; - static constexpr std::initializer_list topk_moe_early_softmax { GGML_OP_SOFT_MAX, GGML_OP_RESHAPE, GGML_OP_ARGSORT, GGML_OP_VIEW, GGML_OP_GET_ROWS }; - static constexpr std::initializer_list topk_moe_late_softmax { GGML_OP_ARGSORT, GGML_OP_VIEW, GGML_OP_GET_ROWS, GGML_OP_RESHAPE, GGML_OP_SOFT_MAX, GGML_OP_RESHAPE }; @@ -477,32 +464,6 @@ static constexpr std::initializer_list> topk_moe_early_softma { 9, 0, 8 }, // reshape->src[0] == div }; -//node #436 ( UNARY): ffn_moe_probs-10 ( 256K) [Vulka ] use=2: ffn_moe_logits-10 ( 256K) [Vulka ] -//node #437 ( RESHAPE): ffn_moe_probs-10 (re ( 256K) [Vulka ] use=1: ffn_moe_probs-10 ( 256K) [Vulka ] -//node #438 ( ADD): ffn_moe_probs_biased ( 256K) [Vulka ] use=1: ffn_moe_probs-10 ( 256K) [Vulka ] blk.10.exp_probs_b.b ( 0K) [Vulka ] -//node #439 ( ARGSORT): ffn_moe_argsort-10 ( 256K) [Vulka ] use=1: ffn_moe_probs_biased ( 256K) [Vulka ] -//node #440 ( VIEW): ffn_moe_topk-10 ( 255K) [Vulka ] use=3: ffn_moe_argsort-10 ( 256K) [Vulka ] -//node #441 ( GET_ROWS): ffn_moe_weights-10 ( 12K) [Vulka ] use=1: ffn_moe_probs-10 (re ( 256K) [Vulka ] ffn_moe_topk-10 ( 255K) [Vulka ] -//node #442 ( RESHAPE): ffn_moe_weights-10 ( ( 12K) [Vulka ] use=2: ffn_moe_weights-10 ( 12K) [Vulka ] -//node #443 ( SUM_ROWS): ffn_moe_weights_sum- ( 2K) [Vulka ] use=1: ffn_moe_weights-10 ( ( 12K) [Vulka ] -//node #444 ( CLAMP): ffn_moe_weights_sum_ ( 2K) [Vulka ] use=1: ffn_moe_weights_sum- ( 2K) [Vulka ] -//node #445 ( DIV): ffn_moe_weights_norm ( 12K) [Vulka ] use=1: ffn_moe_weights-10 ( ( 12K) [Vulka ] ffn_moe_weights_sum_ ( 2K) [Vulka ] -//node #446 ( RESHAPE): ffn_moe_weights_norm ( 12K) [Vulka ] use=1: ffn_moe_weights_norm ( 12K) [Vulka ] -static constexpr std::initializer_list> topk_moe_sigmoid_norm_bias_edges { - { 1, 0, 0 }, // reshape->src[0] == sigmoid - { 2, 0, 0 }, // add->src[0] == sigmoid - { 3, 0, 2 }, // argsort->src[0] == add - { 4, 0, 3 }, // view->src[0] == argsort - { 5, 0, 1 }, // get_rows->src[0] == reshape - { 5, 1, 4 }, // get_rows->src[1] == view - { 6, 0, 5 }, // reshape->src[0] == get_rows - { 7, 0, 6 }, // sum_rows->src[0] == reshape - { 8, 0, 7 }, // clamp->src[0] == sum_rows - { 9, 0, 6 }, // div->src[0] == reshape - { 9, 1, 8 }, // div->src[1] == clamp - {10, 0, 9 }, // reshape->src[0] == div -}; - // same as early_softmax_norm but ending after the get_rows static constexpr std::initializer_list> topk_moe_early_softmax_edges { { 1, 0, 0 }, // reshape->src[0] == softmax @@ -530,10 +491,16 @@ enum topk_moe_mode { TOPK_MOE_EARLY_SOFTMAX, TOPK_MOE_EARLY_SOFTMAX_NORM, TOPK_MOE_LATE_SOFTMAX, - TOPK_MOE_SIGMOID_NORM_BIAS, TOPK_MOE_COUNT, }; +static topk_moe_mode ggml_vk_num_additional_ops_to_topk_moe_mode(uint32_t num) { + topk_moe_mode mode = num == topk_moe_early_softmax_norm.size() - 1 ? TOPK_MOE_EARLY_SOFTMAX_NORM : + num == topk_moe_early_softmax.size() - 1 ? TOPK_MOE_EARLY_SOFTMAX : + TOPK_MOE_LATE_SOFTMAX; + return mode; +} + static constexpr std::initializer_list> rope_view_set_rows_edges { { 1, 0, 0 }, // view->src[0] == rope { 2, 0, 1 }, // set_rows->src[0] == view @@ -556,8 +523,6 @@ struct vk_device_struct { uint64_t max_memory_allocation_size; uint64_t max_buffer_size; uint64_t suballocation_block_size; - uint64_t min_imported_host_pointer_alignment; - bool external_memory_host {}; bool fp16; bool bf16; bool pipeline_robustness; @@ -576,7 +541,6 @@ struct vk_device_struct { bool uma; bool prefer_host_memory; bool float_controls_rte_fp16; - bool subgroup_basic; bool subgroup_arithmetic; bool subgroup_shuffle; bool subgroup_ballot; @@ -590,8 +554,6 @@ struct vk_device_struct { bool add_rms_fusion; uint32_t partials_binding_alignment; - bool shader_64b_indexing; - bool integer_dot_product; // 0: default, 1: force mmvq, -1: disable mmvq int32_t mmvq_mode; @@ -689,7 +651,7 @@ struct vk_device_struct { vk_pipeline pipeline_add_id_f32; vk_pipeline pipeline_concat_f32, pipeline_concat_f16, pipeline_concat_i32; - vk_pipeline pipeline_upscale_nearest_f32, pipeline_upscale_bilinear_f32, pipeline_upscale_bicubic_f32, pipeline_upscale_bilinear_antialias_f32; + vk_pipeline pipeline_upscale_nearest_f32, pipeline_upscale_bilinear_f32, pipeline_upscale_bicubic_f32; vk_pipeline pipeline_scale_f32; vk_pipeline pipeline_sqr_f32; vk_pipeline pipeline_sqrt_f32; @@ -776,9 +738,6 @@ struct vk_device_struct { vk_pipeline pipeline_topk_f32[num_topk_pipelines]; vk_pipeline pipeline_sum_rows_f32; vk_pipeline pipeline_cumsum_f32; - vk_pipeline pipeline_cumsum_small_f32; - vk_pipeline pipeline_cumsum_multipass1_f32; - vk_pipeline pipeline_cumsum_multipass2_f32; vk_pipeline pipeline_argmax_f32; vk_pipeline pipeline_count_equal_i32; std::map pipeline_solve_tri_f32; @@ -804,10 +763,9 @@ struct vk_device_struct { std::map pipeline_flash_attn_f32_f16[GGML_TYPE_COUNT]; vk_pipeline pipeline_flash_attn_split_k_reduce; - vk_pipeline pipeline_count_experts; // [2] is for whether to take n_experts from spec constant (0) or push constant (1) - vk_pipeline pipeline_topk_moe[num_topk_moe_pipelines][2]; + vk_pipeline pipeline_topk_moe[num_topk_moe_pipelines][TOPK_MOE_COUNT][2]; std::vector all_pipelines; @@ -823,7 +781,9 @@ struct vk_device_struct { bool allow_sysmem_fallback; bool disable_graph_optimize; +#ifdef GGML_VULKAN_MEMORY_DEBUG std::unique_ptr memory_logger; +#endif ~vk_device_struct() { VK_LOG_DEBUG("destroy device " << name); @@ -1044,14 +1004,6 @@ struct vk_op_push_constants { float param4; }; -struct vk_op_count_experts_push_constants { - uint32_t ne00; - uint32_t ne01; - uint32_t nb00; - uint32_t nb01; - uint32_t a_offset; -}; - struct vk_op_glu_push_constants { uint32_t N; uint32_t ne00; @@ -1220,11 +1172,6 @@ struct vk_op_topk_moe_push_constants { uint32_t n_expert_used; float clamp_min; float clamp_max; - uint32_t gating_func; - uint32_t has_bias; - uint32_t with_norm; - float output_scale; - float output_bias; }; struct vk_op_add_id_push_constants { @@ -1245,7 +1192,6 @@ struct vk_op_diag_mask_push_constants { struct vk_op_rope_push_constants { uint32_t rope_mode; uint32_t ncols; - uint32_t nrows; uint32_t n_dims; float freq_scale; uint32_t p_delta_rows; @@ -1511,11 +1457,6 @@ template <> void init_pushconst_fastdiv(vk_op_sum_rows_push_constants &p) { init_fastdiv_values(p.ne01, p.ne0_1mp, p.ne0_1L); } -struct vk_quantize_q8_1_push_constants { - uint32_t ne; - uint32_t num_blocks; -}; - // Allow pre-recording command buffers struct vk_staging_memcpy { vk_staging_memcpy(void * _dst, const void * _src, size_t _n) : dst(_dst), src(_src), n(_n) {} @@ -1559,9 +1500,8 @@ static void ggml_vk_preallocate_buffers(ggml_backend_vk_context * ctx, vk_contex static void ggml_vk_load_shaders(vk_device& device); static void ggml_pipeline_allocate_descriptor_sets(ggml_backend_vk_context * ctx); -static bool vk_memory_logger_enabled = false; - -#define VK_LOG_MEMORY(msg) if (vk_memory_logger_enabled) { std::cerr << "ggml_vulkan memory: " << msg << std::endl; } +#if defined(GGML_VULKAN_MEMORY_DEBUG) || defined(GGML_VULKAN_DEBUG) +#define VK_LOG_MEMORY(msg) std::cerr << "ggml_vulkan memory: " << msg << std::endl static std::string format_size(size_t size) { const size_t kib = 1024; @@ -1594,10 +1534,10 @@ private: std::map allocations; // Track allocations size_t total_device; size_t total_host; - static std::mutex log_mutex; }; - -std::mutex vk_memory_logger::log_mutex; +#else +#define VK_LOG_MEMORY(msg) ((void) 0) +#endif // GGML_VULKAN_MEMORY_DEBUG static bool vk_perf_logger_enabled = false; static bool vk_perf_logger_concurrent = false; @@ -1624,7 +1564,7 @@ class vk_perf_logger { total_op_times += time; } std::cerr << t.first << ": " << t.second.size() << " x " << (total_op_times / t.second.size() / 1000.0) - << " us = " << (total_op_times / 1000.0) << " us"; + << " us"; // If we have as many flops entries as timing entries for the op, then compute and log the flops/S. auto it = flops.find(t.first); @@ -1821,8 +1761,6 @@ struct ggml_backend_vk_context { // Bit 'i' means nodes[start_of_fusion + i] writes to memory. // If there's no fusion, bit 0 is still set. int fused_ops_write_mask {}; - topk_moe_mode fused_topk_moe_mode {}; - bool fused_topk_moe_scale {}; // for GGML_VK_PERF_LOGGER std::unique_ptr perf_logger; @@ -1904,10 +1842,10 @@ struct ggml_backend_vk_buffer_context { } }; +#ifdef GGML_VULKAN_MEMORY_DEBUG +static std::mutex log_mutex; + void vk_memory_logger::log_allocation(vk_buffer_ref buf_ref, size_t size) { - if (!vk_memory_logger_enabled) { - return; - } std::lock_guard guard(log_mutex); vk_buffer buf = buf_ref.lock(); const bool device = bool(buf->memory_property_flags & vk::MemoryPropertyFlagBits::eDeviceLocal); @@ -1919,7 +1857,7 @@ void vk_memory_logger::log_allocation(vk_buffer_ref buf_ref, size_t size) { } void vk_memory_logger::log_deallocation(vk_buffer_ref buf_ref) { - if (buf_ref.expired() || buf_ref.lock()->size == 0 || !vk_memory_logger_enabled) { + if (buf_ref.expired() || buf_ref.lock()->size == 0) { return; } @@ -1937,6 +1875,7 @@ void vk_memory_logger::log_deallocation(vk_buffer_ref buf_ref) { VK_LOG_MEMORY("ERROR " << buf->device->name << ": Attempted to deallocate unknown " << type << " memory at " << buf->buffer); } } +#endif // GGML_VULKAN_MEMORY_DEBUG struct vk_instance_t { vk::Instance instance; @@ -2086,19 +2025,6 @@ static void ggml_vk_create_pipeline_func(vk_device& device, vk_pipeline& pipelin compute_pipeline_create_info.setPNext(&rci); } -#if defined(VK_EXT_shader_64bit_indexing) - vk::PipelineCreateFlags2CreateInfo pipelineFlags2CreateInfo; - if (pipeline->is_64b_indexing) - { - pipelineFlags2CreateInfo.flags = vk::PipelineCreateFlagBits2::e64BitIndexingEXT; - if (device->pipeline_executable_properties_support) { - pipelineFlags2CreateInfo.flags |= vk::PipelineCreateFlagBits2::eCaptureStatisticsKHR; - } - pipelineFlags2CreateInfo.setPNext(compute_pipeline_create_info.pNext); - compute_pipeline_create_info.setPNext(&pipelineFlags2CreateInfo); - } -#endif - try { pipeline->pipeline = device->device.createComputePipeline(VK_NULL_HANDLE, compute_pipeline_create_info).value; } catch (const vk::SystemError& e) { @@ -2437,8 +2363,7 @@ static std::vector ggml_vk_find_memory_properties(const vk::PhysicalDe return indices; } -static vk_buffer ggml_vk_create_buffer(vk_device& device, size_t size, const std::initializer_list & req_flags_list, - void *import_ptr = nullptr) { +static vk_buffer ggml_vk_create_buffer(vk_device& device, size_t size, const std::initializer_list & req_flags_list) { VK_LOG_DEBUG("ggml_vk_create_buffer(" << device->name << ", " << size << ", " << to_string(req_flags_list.begin()[0]) << ", " << to_string(req_flags_list.begin()[req_flags_list.size()-1]) << ")"); if (size > device->max_buffer_size) { throw vk::OutOfDeviceMemoryError("Requested buffer size exceeds device buffer size limit"); @@ -2467,12 +2392,6 @@ static vk_buffer ggml_vk_create_buffer(vk_device& device, size_t size, const std nullptr, }; - vk::ExternalMemoryBufferCreateInfo external_memory_bci; - if (import_ptr) { - external_memory_bci.handleTypes = vk::ExternalMemoryHandleTypeFlagBits::eHostAllocationEXT; - buffer_create_info.setPNext(&external_memory_bci); - } - buf->buffer = device->device.createBuffer(buffer_create_info); vk::MemoryRequirements mem_req = device->device.getBufferMemoryRequirements(buf->buffer); @@ -2487,80 +2406,35 @@ static vk_buffer ggml_vk_create_buffer(vk_device& device, size_t size, const std mem_flags_info.setPNext(&mem_priority_info); } - if (import_ptr) { - vk::MemoryHostPointerPropertiesEXT host_pointer_props; - try { - host_pointer_props = device->device.getMemoryHostPointerPropertiesEXT(vk::ExternalMemoryHandleTypeFlagBits::eHostAllocationEXT, import_ptr); - } catch (vk::SystemError& e) { - GGML_LOG_WARN("ggml_vulkan: Failed getMemoryHostPointerPropertiesEXT (%s)\n", e.what()); - device->device.destroyBuffer(buf->buffer); - return {}; + for (auto it = req_flags_list.begin(); it != req_flags_list.end(); it++) { + const auto & req_flags = *it; + + const std::vector memory_type_indices = ggml_vk_find_memory_properties(&mem_props, &mem_req, req_flags); + + if (memory_type_indices.empty()) { + continue; } - vk::PhysicalDeviceMemoryProperties mem_props = device->physical_device.getMemoryProperties(); + buf->memory_property_flags = req_flags; - uint32_t memory_type_idx; - vk::MemoryPropertyFlags property_flags = *req_flags_list.begin(); - for (memory_type_idx = 0; memory_type_idx < 32; ++memory_type_idx) { - if (!(host_pointer_props.memoryTypeBits & (1u << memory_type_idx))) { - continue; - } - if (!(mem_req.memoryTypeBits & (1u << memory_type_idx))) { - continue; - } + bool done = false; - vk::MemoryType memory_type = mem_props.memoryTypes[memory_type_idx]; - // check for visible+coherent+cached. Other flags (e.g. devicelocal) are allowed - if ((memory_type.propertyFlags & property_flags) == property_flags) { - property_flags = memory_type.propertyFlags; + for (auto mtype_it = memory_type_indices.begin(); mtype_it != memory_type_indices.end(); mtype_it++) { + try { + buf->device_memory = device->device.allocateMemory({ mem_req.size, *mtype_it, &mem_flags_info }); + done = true; break; - } - } - if (memory_type_idx == 32) { - GGML_LOG_WARN("ggml_vulkan: Memory type for host allocation not found\n"); - device->device.destroyBuffer(buf->buffer); - return {}; - } - - buf->memory_property_flags = mem_props.memoryTypes[memory_type_idx].propertyFlags; - try { - vk::ImportMemoryHostPointerInfoEXT import_info; - import_info.handleType = vk::ExternalMemoryHandleTypeFlagBits::eHostAllocationEXT; - import_info.pHostPointer = import_ptr; - import_info.setPNext(&mem_flags_info); - buf->device_memory = device->device.allocateMemory({ size, memory_type_idx, &import_info }); - } catch (const vk::SystemError& e) { - } - } else { - for (auto it = req_flags_list.begin(); it != req_flags_list.end(); it++) { - const auto & req_flags = *it; - - const std::vector memory_type_indices = ggml_vk_find_memory_properties(&mem_props, &mem_req, req_flags); - - if (memory_type_indices.empty()) { - continue; - } - buf->memory_property_flags = req_flags; - - bool done = false; - - for (auto mtype_it = memory_type_indices.begin(); mtype_it != memory_type_indices.end(); mtype_it++) { - try { - buf->device_memory = device->device.allocateMemory({ mem_req.size, *mtype_it, &mem_flags_info }); - done = true; - break; - } catch (const vk::SystemError& e) { - // loop and retry - // during last attempt throw the exception - if (it + 1 == req_flags_list.end() && mtype_it + 1 == memory_type_indices.end()) { - device->device.destroyBuffer(buf->buffer); - throw e; - } + } catch (const vk::SystemError& e) { + // loop and retry + // during last attempt throw the exception + if (it + 1 == req_flags_list.end() && mtype_it + 1 == memory_type_indices.end()) { + device->device.destroyBuffer(buf->buffer); + throw e; } } + } - if (done) { - break; - } + if (done) { + break; } } @@ -2571,12 +2445,8 @@ static vk_buffer ggml_vk_create_buffer(vk_device& device, size_t size, const std buf->ptr = nullptr; - if (import_ptr) { - buf->ptr = import_ptr; - } else { - if (buf->memory_property_flags & vk::MemoryPropertyFlagBits::eHostVisible) { - buf->ptr = device->device.mapMemory(buf->device_memory, 0, VK_WHOLE_SIZE); - } + if (buf->memory_property_flags & vk::MemoryPropertyFlagBits::eHostVisible) { + buf->ptr = device->device.mapMemory(buf->device_memory, 0, VK_WHOLE_SIZE); } device->device.bindBufferMemory(buf->buffer, buf->device_memory, 0); @@ -2589,7 +2459,9 @@ static vk_buffer ggml_vk_create_buffer(vk_device& device, size_t size, const std buf->bda_addr = device->device.getBufferAddress(addressInfo); } +#ifdef GGML_VULKAN_MEMORY_DEBUG device->memory_logger->log_allocation(buf, size); +#endif return buf; } @@ -2646,9 +2518,11 @@ static void ggml_vk_destroy_buffer(vk_buffer& buf) { return; } +#ifdef GGML_VULKAN_MEMORY_DEBUG if (buf->device != nullptr) { buf->device->memory_logger->log_deallocation(buf); } +#endif buf.reset(); } @@ -2708,10 +2582,10 @@ static void ggml_vk_wait_events(vk_context& ctx, std::vector&& events static constexpr uint32_t flash_attention_num_small_rows = 32; static constexpr uint32_t scalar_flash_attention_num_small_rows = 1; -static uint32_t get_fa_scalar_num_large_rows(uint32_t hsk, uint32_t hsv, bool small_cache) { +static uint32_t get_fa_scalar_num_large_rows(uint32_t hsk, uint32_t hsv) { if (hsv >= 192) { return 2; - } else if ((hsv | hsk) & 8 || small_cache) { + } else if ((hsv | hsk) & 8) { return 4; } else { return 8; @@ -2733,8 +2607,9 @@ static uint32_t get_fa_num_small_rows(FaCodePath path) { } } -static std::array fa_rows_cols(FaCodePath path, uint32_t hsk, uint32_t hsv, uint32_t clamp, ggml_type type, bool small_rows, bool small_cache) { +static std::array fa_rows_cols(FaCodePath path, uint32_t hsk, uint32_t hsv, uint32_t clamp, ggml_type type, bool small_rows) { GGML_UNUSED(clamp); + GGML_UNUSED(hsv); if (path == FA_SCALAR) { if (small_rows) { @@ -2743,9 +2618,9 @@ static std::array fa_rows_cols(FaCodePath path, uint32_t hsk, uint3 if ((hsv | hsk) & 8) { // HSV/HSK not being a multiple of 16 makes D_split smaller, which makes cols_per_iter // larger, and Bc needs to be >= cols_per_thread. 64 is large enough, 32 is not. - return {get_fa_scalar_num_large_rows(hsk, hsv, small_cache), 64}; + return {get_fa_scalar_num_large_rows(hsk, hsv), 64}; } else { - return {get_fa_scalar_num_large_rows(hsk, hsv, small_cache), 32}; + return {get_fa_scalar_num_large_rows(hsk, hsv), 32}; } } } @@ -2774,8 +2649,8 @@ static std::array fa_rows_cols(FaCodePath path, uint32_t hsk, uint3 return {64, 64}; } -static uint32_t fa_align(FaCodePath path, uint32_t hsk, uint32_t hsv, ggml_type type, bool small_rows, bool small_cache) { - return fa_rows_cols(path, hsk, hsv, 0, type, small_rows, small_cache)[1]; +static uint32_t fa_align(FaCodePath path, uint32_t hsk, uint32_t hsv, ggml_type type, bool small_rows) { + return fa_rows_cols(path, hsk, hsv, 0, type, small_rows)[1]; } static bool ggml_vk_matmul_shmem_support(const vk_device& device, const std::vector& warptile, bool mul_mat_id, ggml_type src0_type) { @@ -2784,7 +2659,7 @@ static bool ggml_vk_matmul_shmem_support(const vk_device& device, const std::vec switch (src0_type) { case GGML_TYPE_IQ1_S: case GGML_TYPE_IQ1_M: - lut_size = 2*2048 + 4*2048; + lut_size = 2*2048; break; case GGML_TYPE_IQ2_XXS: lut_size = 8*256; @@ -2955,9 +2830,9 @@ static void ggml_vk_load_shaders(vk_device& device) { s_mmq_wg_denoms_k = { 32, 64, 1 }; // spec constants and tile sizes for quant matmul_id - l_warptile_mmqid = { 256, 128, 128, 32, 1, device->subgroup_size }; - m_warptile_mmqid = { 256, 128, 64, 32, 0, device->subgroup_size }; - s_warptile_mmqid = { 256, 128, 64, 32, 0, device->subgroup_size }; + l_warptile_mmqid = { 256, 128, 128, 16, 1, device->subgroup_size }; + m_warptile_mmqid = { 256, 128, 64, 16, 0, device->subgroup_size }; + s_warptile_mmqid = { 256, 128, 64, 16, 0, device->subgroup_size }; l_mmqid_wg_denoms = { 128, 128, 1 }; m_mmqid_wg_denoms = { 128, 64, 1 }; s_mmqid_wg_denoms = { 128, 64, 1 }; @@ -2977,55 +2852,44 @@ static void ggml_vk_load_shaders(vk_device& device) { const uint32_t tk_m = device->coopmat_support ? device->coopmat_k : 1; const uint32_t tk_s = device->coopmat_support ? device->coopmat_k : 1; - const uint32_t s_warptile_wm = device->subgroup_size == 8 ? 8 : 32; + l_warptile = { 128, 128, 128, 16, subgroup_size_8 * 2, 64, 2, tm_l, tn_l, tk_l, subgroup_size_8 }; + m_warptile = { 128, 64, 64, 16, subgroup_size_8, 32, 2, tm_m, tn_m, tk_m, subgroup_size_8 }; + s_warptile = { subgroup_size_16, 32, 32, 16, 32, 32, 2, tm_s, tn_s, tk_s, subgroup_size_8 }; - l_warptile = { 128, 128, 128, 16, subgroup_size_8 * 2, 64, 2, tm_l, tn_l, tk_l, subgroup_size_8 }; - m_warptile = { 128, 64, 64, 16, subgroup_size_8, 32, 2, tm_m, tn_m, tk_m, subgroup_size_8 }; - s_warptile = { subgroup_size_32, 32, 32, 16, s_warptile_wm, 32, 2, tm_s, tn_s, tk_s, subgroup_size_8 }; - - l_warptile_mmq = { 128, 128, 128, 32, subgroup_size_8 * 2, 64, 2, tm_l, tn_l, tk_l, subgroup_size_8 }; - m_warptile_mmq = { 128, 64, 64, 32, subgroup_size_8, 32, 2, tm_m, tn_m, tk_m, subgroup_size_8 }; - s_warptile_mmq = { subgroup_size_32, 32, 32, 32, s_warptile_wm, 32, 2, tm_s, tn_s, tk_s, subgroup_size_8 }; + l_warptile_mmq = { 128, 128, 128, 32, subgroup_size_8 * 2, 64, 2, tm_l, tn_l, tk_l, subgroup_size_8 }; + m_warptile_mmq = { 128, 64, 64, 32, subgroup_size_8, 32, 2, tm_m, tn_m, tk_m, subgroup_size_8 }; + s_warptile_mmq = { subgroup_size_32, 32, 32, 32, 32, 32, 2, tm_s, tn_s, tk_s, subgroup_size_8 }; // Integer MMQ has a smaller shared memory profile, but heavier register use - l_warptile_mmq_int = { 128, 128, 128, 32, subgroup_size_8 * 2, 64, 2, 4, 4, 1, subgroup_size_8 }; - m_warptile_mmq_int = { 128, 64, 64, 32, subgroup_size_8, 32, 2, 2, 2, 1, subgroup_size_8 }; - s_warptile_mmq_int = { subgroup_size_32, 32, 32, 32, s_warptile_wm, 32, 2, 2, 1, 1, subgroup_size_8 }; + l_warptile_mmq_int = { 128, 128, 128, 32, subgroup_size_8 * 2, 64, 2, 4, 4, 1, subgroup_size_8 }; + m_warptile_mmq_int = { 128, 64, 64, 32, subgroup_size_8, 32, 2, 2, 2, 1, subgroup_size_8 }; + s_warptile_mmq_int = { subgroup_size_32, 32, 32, 32, 32, 32, 2, 2, 1, 1, subgroup_size_8 }; // K-quants use even more registers, mitigate by setting WMITER to 1 - l_warptile_mmq_int_k = { 128, 128, 128, 32, subgroup_size_8 * 2, 64, 1, 4, 4, 1, subgroup_size_8 }; - m_warptile_mmq_int_k = { 128, 64, 64, 32, subgroup_size_8, 32, 1, 2, 2, 1, subgroup_size_8 }; - s_warptile_mmq_int_k = { subgroup_size_32, 32, 32, 32, s_warptile_wm, 32, 1, 2, 1, 1, subgroup_size_8 }; + l_warptile_mmq_int_k = { 128, 128, 128, 32, subgroup_size_8 * 2, 64, 1, 4, 4, 1, subgroup_size_8 }; + m_warptile_mmq_int_k = { 128, 64, 64, 32, subgroup_size_8, 32, 1, 2, 2, 1, subgroup_size_8 }; + s_warptile_mmq_int_k = { subgroup_size_32, 32, 32, 32, 32, 32, 1, 2, 1, 1, subgroup_size_8 }; - l_warptile_id = { 128, 128, 128, 16, mul_mat_subgroup_size_16 * 2, 64, 2, tm_l, tn_l, tk_l, mul_mat_subgroup_size_16 }; - m_warptile_id = { 128, 64, 64, 16, mul_mat_subgroup_size_16, 32, 2, tm_m, tn_m, tk_m, mul_mat_subgroup_size_16 }; - s_warptile_id = { mul_mat_subgroup_size_16, 32, 32, 16, s_warptile_wm, 32, 2, tm_s, tn_s, tk_s, mul_mat_subgroup_size_16 }; + l_warptile_id = { 128, 128, 128, 16, mul_mat_subgroup_size_16 * 2, 64, 2, tm_l, tn_l, tk_l, mul_mat_subgroup_size_16 }; + m_warptile_id = { 128, 64, 64, 16, mul_mat_subgroup_size_16, 32, 2, tm_m, tn_m, tk_m, mul_mat_subgroup_size_16 }; + s_warptile_id = { mul_mat_subgroup_size_16, 32, 32, 16, 32, 32, 2, tm_s, tn_s, tk_s, mul_mat_subgroup_size_16 }; - l_warptile_mmqid = { 128, 128, 128, 32, mul_mat_subgroup_size_8 * 2, 64, 2, tm_l, tn_l, tk_l, mul_mat_subgroup_size_8 }; - m_warptile_mmqid = { 128, 64, 64, 32, mul_mat_subgroup_size_8, 32, 2, tm_m, tn_m, tk_m, mul_mat_subgroup_size_8 }; - s_warptile_mmqid = { mul_mat_subgroup_size_32, 32, 32, 32, s_warptile_wm, 32, 2, tm_s, tn_s, tk_s, mul_mat_subgroup_size_8 }; + l_warptile_mmqid = { 128, 128, 128, 32, mul_mat_subgroup_size_8 * 2, 64, 2, tm_l, tn_l, tk_l, mul_mat_subgroup_size_8 }; + m_warptile_mmqid = { 128, 64, 64, 32, mul_mat_subgroup_size_8, 32, 2, tm_m, tn_m, tk_m, mul_mat_subgroup_size_8 }; + s_warptile_mmqid = { mul_mat_subgroup_size_32, 32, 32, 32, 32, 32, 2, tm_s, tn_s, tk_s, mul_mat_subgroup_size_8 }; - l_warptile_mmqid_int = { 128, 128, 128, 32, mul_mat_subgroup_size_8 * 2, 64, 2, 4, 4, 1, mul_mat_subgroup_size_8 }; - m_warptile_mmqid_int = { 128, 64, 64, 32, mul_mat_subgroup_size_8, 32, 2, 2, 2, 1, mul_mat_subgroup_size_8 }; - s_warptile_mmqid_int = { mul_mat_subgroup_size_32, 32, 32, 32, s_warptile_wm, 32, 2, 2, 1, 1, mul_mat_subgroup_size_8 }; + l_warptile_mmqid_int = { 128, 128, 128, 32, mul_mat_subgroup_size_8 * 2, 64, 2, 4, 4, 1, mul_mat_subgroup_size_8 }; + m_warptile_mmqid_int = { 128, 64, 64, 32, mul_mat_subgroup_size_8, 32, 2, 2, 2, 1, mul_mat_subgroup_size_8 }; + s_warptile_mmqid_int = { mul_mat_subgroup_size_32, 32, 32, 32, 32, 32, 2, 2, 1, 1, mul_mat_subgroup_size_8 }; - l_warptile_mmqid_int_k = { 128, 128, 128, 32, mul_mat_subgroup_size_16 * 2, 64, 1, 4, 4, 1, mul_mat_subgroup_size_16 }; - m_warptile_mmqid_int_k = { 128, 64, 64, 32, mul_mat_subgroup_size_16, 32, 1, 2, 2, 1, mul_mat_subgroup_size_16 }; - s_warptile_mmqid_int_k = { mul_mat_subgroup_size_32, 32, 32, 32, s_warptile_wm, 32, 1, 2, 1, 1, mul_mat_subgroup_size_16 }; + l_warptile_mmqid_int_k = { 128, 128, 128, 32, mul_mat_subgroup_size_16 * 2, 64, 1, 4, 4, 1, mul_mat_subgroup_size_16 }; + m_warptile_mmqid_int_k = { 128, 64, 64, 32, mul_mat_subgroup_size_16, 32, 1, 2, 2, 1, mul_mat_subgroup_size_16 }; + s_warptile_mmqid_int_k = { mul_mat_subgroup_size_32, 32, 32, 32, 32, 32, 1, 2, 1, 1, mul_mat_subgroup_size_16 }; // chip specific tuning if ((device->architecture == AMD_GCN) && (device->driver_id != vk::DriverId::eAmdProprietary)) { m_warptile_mmq = m_warptile_mmq_int = { 256, 64, 64, 32, 16, 16, 2, 2, 2, 1, 16 }; m_warptile_mmqid = m_warptile_mmqid_int = { 256, 64, 64, 32, 16, 16, 2, 2, 2, 1, 16 }; - } else if (device->vendor_id == VK_VENDOR_ID_AMD && device->coopmat_support && device->driver_id != vk::DriverId::eAmdProprietary) { - // This is intentionally using tx_m values, slight performance increase - l_warptile = { 256, 128, 128, 16, subgroup_size_8, 64, 2, tm_m, tn_m, tk_m, subgroup_size_8 }; - l_warptile_mmq = l_warptile_mmq_int = { 256, 128, 128, 32, subgroup_size_8, 64, 2, tm_m, tn_m, tk_m, subgroup_size_8 }; - l_warptile_mmq_int_k = { 256, 128, 128, 32, subgroup_size_16, 64, 1, 4, 2, 1, subgroup_size_16 }; - } else if (device->vendor_id == VK_VENDOR_ID_INTEL && device->coopmat_support && device->architecture == INTEL_XE2) { - // Xe2/Xe3 with coopmat enabled - warptile performance tuning - l_warptile = { 512, 128, 128, 16, subgroup_size_8, 32, 2, tm_m, tn_m, tk_m, subgroup_size_8 }; - l_warptile_mmq = { 512, 128, 128, 32, subgroup_size_8, 32, 2, tm_m, tn_m, tk_m, subgroup_size_8 }; } l_mmq_wg_denoms = l_wg_denoms = {128, 128, 1 }; @@ -3081,7 +2945,7 @@ static void ggml_vk_load_shaders(vk_device& device) { } std::vector> compiles; - auto const &ggml_vk_create_pipeline = [&](vk_device& device, vk_pipeline& base_pipeline, const char *name, size_t spv_size, const void* spv_data, const char *entrypoint, + auto const &ggml_vk_create_pipeline = [&](vk_device& device, vk_pipeline& pipeline, const char *name, size_t spv_size, const void* spv_data, const char *entrypoint, uint32_t parameter_count, uint32_t push_constant_size, std::array wg_denoms, const std::vector& specialization_constants, uint32_t align, bool disable_robustness = false, bool require_full_subgroups = false, uint32_t required_subgroup_size = 0) { @@ -3089,49 +2953,35 @@ static void ggml_vk_load_shaders(vk_device& device) { required_subgroup_size = get_subgroup_size(name, device->architecture); } - vk_pipeline *ptr = &base_pipeline; - - int num_pipelines = 1; -#if defined(VK_EXT_shader_64bit_indexing) - if (device->shader_64b_indexing) { - num_pipelines = 2; + if (!pipeline) { + pipeline = std::make_shared(); } -#endif - for (int i = 0; i < num_pipelines; ++i, ptr = &(*ptr)->next) { - vk_pipeline &pipeline = *ptr; - if (!pipeline) { - pipeline = std::make_shared(); - } - if (!pipeline->initialized) { - pipeline->name = name; - pipeline->parameter_count = parameter_count; - pipeline->push_constant_size = push_constant_size; - pipeline->wg_denoms = wg_denoms; - pipeline->align = align; - pipeline->initialized = true; -#if defined(VK_EXT_shader_64bit_indexing) - pipeline->is_64b_indexing = (i == 1); -#endif - } - - if (!pipeline->needed || pipeline->compiled) { - continue; - } - // TODO: We're no longer benefitting from the async compiles (shaders are - // compiled individually, as needed) and this complexity can be removed. - { - // wait until fewer than N compiles are in progress - uint32_t N = std::max(1u, std::thread::hardware_concurrency()); - std::unique_lock guard(compile_count_mutex); - while (compile_count >= N) { - compile_count_cond.wait(guard); - } - compile_count++; - } - - compiles.push_back(std::async(ggml_vk_create_pipeline_func, std::ref(device), std::ref(pipeline), spv_size, spv_data, entrypoint, - parameter_count, wg_denoms, specialization_constants, disable_robustness, require_full_subgroups, required_subgroup_size)); + if (!pipeline->initialized) { + pipeline->name = name; + pipeline->parameter_count = parameter_count; + pipeline->push_constant_size = push_constant_size; + pipeline->wg_denoms = wg_denoms; + pipeline->align = align; + pipeline->initialized = true; } + + if (!pipeline->needed || pipeline->compiled) { + return; + } + // TODO: We're no longer benefitting from the async compiles (shaders are + // compiled individually, as needed) and this complexity can be removed. + { + // wait until fewer than N compiles are in progress + uint32_t N = std::max(1u, std::thread::hardware_concurrency()); + std::unique_lock guard(compile_count_mutex); + while (compile_count >= N) { + compile_count_cond.wait(guard); + } + compile_count++; + } + + compiles.push_back(std::async(ggml_vk_create_pipeline_func, std::ref(device), std::ref(pipeline), spv_size, spv_data, entrypoint, + parameter_count, wg_denoms, specialization_constants, disable_robustness, require_full_subgroups, required_subgroup_size)); }; auto const &ggml_vk_create_pipeline2 = [&](vk_device& device, vk_pipeline& pipeline, const std::string &name, size_t spv_size, const void* spv_data, const char *entrypoint, @@ -3142,11 +2992,11 @@ static void ggml_vk_load_shaders(vk_device& device) { align, disable_robustness, require_full_subgroups, required_subgroup_size); }; - auto const &fa_wg_denoms = [&](FaCodePath path, uint32_t hsk, uint32_t hsv, uint32_t clamp, ggml_type type, bool small_rows, bool small_cache) -> std::array { - return {fa_rows_cols(path, hsk, hsv, clamp, type, small_rows, small_cache)[0], 1, 1}; + auto const &fa_wg_denoms = [&](FaCodePath path, uint32_t hsk, uint32_t hsv, uint32_t clamp, ggml_type type, bool small_rows) -> std::array { + return {fa_rows_cols(path, hsk, hsv, clamp, type, small_rows)[0], 1, 1}; }; - auto const &fa_spec_constants = [&](FaCodePath path, uint32_t hsk, uint32_t hsv, uint32_t clamp, ggml_type type, bool small_rows, bool small_cache) -> std::vector { + auto const &fa_spec_constants = [&](FaCodePath path, uint32_t hsk, uint32_t hsv, uint32_t clamp, ggml_type type, bool small_rows) -> std::vector { // For large number of rows, 128 invocations seems to work best. // For small number of rows (e.g. N==1), 256 works better. But matrix granularity for 256 is 32, so we // can't use 256 for D==80. @@ -3156,7 +3006,7 @@ static void ggml_vk_load_shaders(vk_device& device) { uint32_t wg_size = (path == FA_SCALAR || path == FA_COOPMAT1) ? scalar_flash_attention_workgroup_size : ((small_rows && (D % 32) == 0) ? 256 : 128); - auto rows_cols = fa_rows_cols(path, hsk, hsv, clamp, type, small_rows, small_cache); + auto rows_cols = fa_rows_cols(path, hsk, hsv, clamp, type, small_rows); // D_split can't be larger than a subgroup because we use subgroupShuffle to reduce it. // D_split can't be larger than the LSB of D divided by 4 due to vectorization in the shader. @@ -3171,22 +3021,21 @@ static void ggml_vk_load_shaders(vk_device& device) { uint32_t HSK = fa.first.HSK; \ uint32_t HSV = fa.first.HSV; \ bool small_rows = fa.first.small_rows; \ - bool small_cache = fa.first.small_cache; \ FaCodePath path = fa.first.path; \ bool aligned = fa.first.aligned; \ bool f32acc = fa.first.f32acc; \ if (path == FAPATH) { \ if (aligned) { \ if (f32acc) { \ - ggml_vk_create_pipeline(device, fa.second, "flash_attn_f32_f16_aligned_f32acc" #NAMELC, flash_attn_f32_f16_ ## NAMELC ## SUFFIX ## _len, flash_attn_f32_f16_ ## NAMELC ## SUFFIX ## _data, "main", 6, sizeof(vk_flash_attn_push_constants), fa_wg_denoms(FAPATH, HSK,HSV,0,TYPE,small_rows,small_cache), fa_spec_constants(FAPATH, HSK,HSV,0,TYPE,small_rows,small_cache), fa_align(FAPATH,HSK,HSV,TYPE,small_rows,small_cache), true, true, (FAPATH==FA_COOPMAT1 ? 32 : 0)); \ + ggml_vk_create_pipeline(device, fa.second, "flash_attn_f32_f16_aligned_f32acc" #NAMELC, flash_attn_f32_f16_ ## NAMELC ## SUFFIX ## _len, flash_attn_f32_f16_ ## NAMELC ## SUFFIX ## _data, "main", 6, sizeof(vk_flash_attn_push_constants), fa_wg_denoms(FAPATH, HSK,HSV,0,TYPE,small_rows), fa_spec_constants(FAPATH, HSK,HSV,0,TYPE,small_rows), fa_align(FAPATH,HSK,HSV,TYPE,small_rows), true, true, (FAPATH==FA_COOPMAT1 ? 32 : 0)); \ } else { \ - ggml_vk_create_pipeline(device, fa.second, "flash_attn_f32_f16_aligned_f16acc" #NAMELC, flash_attn_f32_f16_ ## NAMELC ## _f16acc ## SUFFIX ## _len, flash_attn_f32_f16_ ## NAMELC ## _f16acc ## SUFFIX ## _data, "main", 6, sizeof(vk_flash_attn_push_constants), fa_wg_denoms(FAPATH, HSK,HSV,0,TYPE,small_rows,small_cache), fa_spec_constants(FAPATH, HSK,HSV,0,TYPE,small_rows,small_cache), fa_align(FAPATH,HSK,HSV,TYPE,small_rows,small_cache), true, true, (FAPATH==FA_COOPMAT1 ? 32 : 0)); \ + ggml_vk_create_pipeline(device, fa.second, "flash_attn_f32_f16_aligned_f16acc" #NAMELC, flash_attn_f32_f16_ ## NAMELC ## _f16acc ## SUFFIX ## _len, flash_attn_f32_f16_ ## NAMELC ## _f16acc ## SUFFIX ## _data, "main", 6, sizeof(vk_flash_attn_push_constants), fa_wg_denoms(FAPATH, HSK,HSV,0,TYPE,small_rows), fa_spec_constants(FAPATH, HSK,HSV,0,TYPE,small_rows), fa_align(FAPATH,HSK,HSV,TYPE,small_rows), true, true, (FAPATH==FA_COOPMAT1 ? 32 : 0)); \ } \ } else { \ if (f32acc) { \ - ggml_vk_create_pipeline(device, fa.second, "flash_attn_f32_f16_f32acc" #NAMELC, flash_attn_f32_f16_ ## NAMELC ## SUFFIX ## _len, flash_attn_f32_f16_ ## NAMELC ## SUFFIX ## _data, "main", 6, sizeof(vk_flash_attn_push_constants), fa_wg_denoms(FAPATH, HSK,HSV,1,TYPE,small_rows,small_cache), fa_spec_constants(FAPATH, HSK,HSV,1,TYPE,small_rows,small_cache), 1, true, true, (FAPATH==FA_COOPMAT1 ? 32 : 0)); \ + ggml_vk_create_pipeline(device, fa.second, "flash_attn_f32_f16_f32acc" #NAMELC, flash_attn_f32_f16_ ## NAMELC ## SUFFIX ## _len, flash_attn_f32_f16_ ## NAMELC ## SUFFIX ## _data, "main", 6, sizeof(vk_flash_attn_push_constants), fa_wg_denoms(FAPATH, HSK,HSV,1,TYPE,small_rows), fa_spec_constants(FAPATH, HSK,HSV,1,TYPE,small_rows), 1, true, true, (FAPATH==FA_COOPMAT1 ? 32 : 0)); \ } else { \ - ggml_vk_create_pipeline(device, fa.second, "flash_attn_f32_f16_f16acc" #NAMELC, flash_attn_f32_f16_ ## NAMELC ## _f16acc ## SUFFIX ## _len, flash_attn_f32_f16_ ## NAMELC ## _f16acc ## SUFFIX ## _data, "main", 6, sizeof(vk_flash_attn_push_constants), fa_wg_denoms(FAPATH, HSK,HSV,1,TYPE,small_rows,small_cache), fa_spec_constants(FAPATH, HSK,HSV,1,TYPE,small_rows,small_cache), 1, true, true, (FAPATH==FA_COOPMAT1 ? 32 : 0)); \ + ggml_vk_create_pipeline(device, fa.second, "flash_attn_f32_f16_f16acc" #NAMELC, flash_attn_f32_f16_ ## NAMELC ## _f16acc ## SUFFIX ## _len, flash_attn_f32_f16_ ## NAMELC ## _f16acc ## SUFFIX ## _data, "main", 6, sizeof(vk_flash_attn_push_constants), fa_wg_denoms(FAPATH, HSK,HSV,1,TYPE,small_rows), fa_spec_constants(FAPATH, HSK,HSV,1,TYPE,small_rows), 1, true, true, (FAPATH==FA_COOPMAT1 ? 32 : 0)); \ } \ } \ } \ @@ -3218,19 +3067,17 @@ static void ggml_vk_load_shaders(vk_device& device) { #endif #undef CREATE_FA - const int mul_mat_id_param_count = 5; - #if defined(VK_NV_cooperative_matrix2) && defined(GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT) if (device->coopmat2) { // Create 6 variants, {s,m,l}x{unaligned,aligned} #define CREATE_MM(PIPELINE_NAME, NAMELC, F16ACC, WG_DENOMS, WARPTILE, PUSHCONST, PARAMCOUNT) \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->l, #NAMELC #F16ACC "_l", NAMELC ## F16ACC ## _cm2_len, NAMELC ## F16ACC ## _cm2_data, "main", PARAMCOUNT, sizeof(PUSHCONST), l_ ## WG_DENOMS, l_ ## WARPTILE, 1, true); \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->m, #NAMELC #F16ACC "_m", NAMELC ## F16ACC ## _cm2_len, NAMELC ## F16ACC ## _cm2_data, "main", PARAMCOUNT, sizeof(PUSHCONST), m_ ## WG_DENOMS, m_ ## WARPTILE, 1, true); \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->s, #NAMELC #F16ACC "_s", NAMELC ## F16ACC ## _cm2_len, NAMELC ## F16ACC ## _cm2_data, "main", PARAMCOUNT, sizeof(PUSHCONST), s_ ## WG_DENOMS, s_ ## WARPTILE, 1, true); \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->a_l, #NAMELC #F16ACC "_aligned_l", NAMELC ## _aligned ## F16ACC ## _cm2_len, NAMELC ## _aligned ## F16ACC ## _cm2_data, "main", PARAMCOUNT, sizeof(PUSHCONST), l_ ## WG_DENOMS, l_ ## WARPTILE, l_align, true); \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->a_m, #NAMELC #F16ACC "_aligned_m", NAMELC ## _aligned ## F16ACC ## _cm2_len, NAMELC ## _aligned ## F16ACC ## _cm2_data, "main", PARAMCOUNT, sizeof(PUSHCONST), m_ ## WG_DENOMS, m_ ## WARPTILE, m_align, true); \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->a_s, #NAMELC #F16ACC "_aligned_s", NAMELC ## _aligned ## F16ACC ## _cm2_len, NAMELC ## _aligned ## F16ACC ## _cm2_data, "main", PARAMCOUNT, sizeof(PUSHCONST), s_ ## WG_DENOMS, s_ ## WARPTILE, s_align, true); \ + ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->l, #NAMELC #F16ACC "_l", NAMELC ## F16ACC ## _cm2_len, NAMELC ## F16ACC ## _cm2_data, "main", PARAMCOUNT, sizeof(PUSHCONST), l_ ## WG_DENOMS, l_ ## WARPTILE, 1); \ + ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->m, #NAMELC #F16ACC "_m", NAMELC ## F16ACC ## _cm2_len, NAMELC ## F16ACC ## _cm2_data, "main", PARAMCOUNT, sizeof(PUSHCONST), m_ ## WG_DENOMS, m_ ## WARPTILE, 1); \ + ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->s, #NAMELC #F16ACC "_s", NAMELC ## F16ACC ## _cm2_len, NAMELC ## F16ACC ## _cm2_data, "main", PARAMCOUNT, sizeof(PUSHCONST), s_ ## WG_DENOMS, s_ ## WARPTILE, 1); \ + ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->a_l, #NAMELC #F16ACC "_aligned_l", NAMELC ## _aligned ## F16ACC ## _cm2_len, NAMELC ## _aligned ## F16ACC ## _cm2_data, "main", PARAMCOUNT, sizeof(PUSHCONST), l_ ## WG_DENOMS, l_ ## WARPTILE, l_align); \ + ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->a_m, #NAMELC #F16ACC "_aligned_m", NAMELC ## _aligned ## F16ACC ## _cm2_len, NAMELC ## _aligned ## F16ACC ## _cm2_data, "main", PARAMCOUNT, sizeof(PUSHCONST), m_ ## WG_DENOMS, m_ ## WARPTILE, m_align); \ + ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->a_s, #NAMELC #F16ACC "_aligned_s", NAMELC ## _aligned ## F16ACC ## _cm2_len, NAMELC ## _aligned ## F16ACC ## _cm2_data, "main", PARAMCOUNT, sizeof(PUSHCONST), s_ ## WG_DENOMS, s_ ## WARPTILE, s_align); \ // Create 2 variants, {f16,f32} accumulator #define CREATE_MM2(PIPELINE_NAME, NAMELC, WG_DENOMS, WARPTILE, PUSHCONST, PARAMCOUNT) \ @@ -3266,32 +3113,32 @@ static void ggml_vk_load_shaders(vk_device& device) { GGML_ASSERT(device->subgroup_ballot); - CREATE_MM2(pipeline_matmul_id_f16, matmul_id_subgroup_f16, wg_denoms, warptile, vk_mat_mat_id_push_constants, 5) + CREATE_MM2(pipeline_matmul_id_f16, matmul_id_subgroup_f16, wg_denoms, warptile, vk_mat_mat_id_push_constants, 4) #if defined(GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT) if (device->coopmat_bf16_support) { - CREATE_MM(pipeline_matmul_id_bf16, matmul_id_subgroup_bf16, , wg_denoms, warptile, vk_mat_mat_id_push_constants, 5) + CREATE_MM(pipeline_matmul_id_bf16, matmul_id_subgroup_bf16, , wg_denoms, warptile, vk_mat_mat_id_push_constants, 4) } #endif - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_0], matmul_id_subgroup_q4_0_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_1], matmul_id_subgroup_q4_1_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_0], matmul_id_subgroup_q5_0_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_1], matmul_id_subgroup_q5_1_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q8_0], matmul_id_subgroup_q8_0_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q2_K], matmul_id_subgroup_q2_k_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q3_K], matmul_id_subgroup_q3_k_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_K], matmul_id_subgroup_q4_k_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_K], matmul_id_subgroup_q5_k_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K], matmul_id_subgroup_q6_k_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_S], matmul_id_subgroup_iq1_s_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_M], matmul_id_subgroup_iq1_m_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XXS], matmul_id_subgroup_iq2_xxs_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XS], matmul_id_subgroup_iq2_xs_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_S], matmul_id_subgroup_iq2_s_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_XXS], matmul_id_subgroup_iq3_xxs_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_S], matmul_id_subgroup_iq3_s_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_XS], matmul_id_subgroup_iq4_xs_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL], matmul_id_subgroup_iq4_nl_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) - CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_MXFP4], matmul_id_subgroup_mxfp4_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 5) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_0], matmul_id_subgroup_q4_0_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_1], matmul_id_subgroup_q4_1_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_0], matmul_id_subgroup_q5_0_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_1], matmul_id_subgroup_q5_1_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q8_0], matmul_id_subgroup_q8_0_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q2_K], matmul_id_subgroup_q2_k_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q3_K], matmul_id_subgroup_q3_k_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_K], matmul_id_subgroup_q4_k_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_K], matmul_id_subgroup_q5_k_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K], matmul_id_subgroup_q6_k_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_S], matmul_id_subgroup_iq1_s_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_M], matmul_id_subgroup_iq1_m_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XXS], matmul_id_subgroup_iq2_xxs_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XS], matmul_id_subgroup_iq2_xs_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_S], matmul_id_subgroup_iq2_s_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_XXS], matmul_id_subgroup_iq3_xxs_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_S], matmul_id_subgroup_iq3_s_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_XS], matmul_id_subgroup_iq4_xs_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL], matmul_id_subgroup_iq4_nl_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) + CREATE_MM2(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_MXFP4], matmul_id_subgroup_mxfp4_f16, mmqid_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4) #undef CREATE_MM #undef CREATE_MM2 } else @@ -3380,35 +3227,35 @@ static void ggml_vk_load_shaders(vk_device& device) { GGML_ASSERT(device->subgroup_ballot); - CREATE_MM(GGML_TYPE_F32, pipeline_matmul_id_f32, matmul_id_subgroup_f32_f32, , wg_denoms, warptile, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_F16, pipeline_matmul_id_f16, matmul_id_subgroup_f16, wg_denoms, warptile, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_F16, pipeline_matmul_id_f16_f32, matmul_id_subgroup_f16_f32, wg_denoms, warptile, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); + CREATE_MM(GGML_TYPE_F32, pipeline_matmul_id_f32, matmul_id_subgroup_f32_f32, , wg_denoms, warptile, vk_mat_mat_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_F16, pipeline_matmul_id_f16, matmul_id_subgroup_f16, wg_denoms, warptile, vk_mat_mat_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_F16, pipeline_matmul_id_f16_f32, matmul_id_subgroup_f16_f32, wg_denoms, warptile, vk_mat_mat_push_constants, 4, _id); #if defined(GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT) if (device->coopmat_bf16_support) { - CREATE_MM(GGML_TYPE_BF16, pipeline_matmul_id_bf16, matmul_id_subgroup_bf16, , wg_denoms, warptile, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); + CREATE_MM(GGML_TYPE_BF16, pipeline_matmul_id_bf16, matmul_id_subgroup_bf16, , wg_denoms, warptile, vk_mat_mat_push_constants, 4, _id); } #endif - CREATE_MM2(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_0], matmul_id_subgroup_q4_0_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_1], matmul_id_subgroup_q4_1_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_0], matmul_id_subgroup_q5_0_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_1], matmul_id_subgroup_q5_1_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q8_0], matmul_id_subgroup_q8_0_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q2_K], matmul_id_subgroup_q2_k_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q3_K], matmul_id_subgroup_q3_k_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_K], matmul_id_subgroup_q4_k_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_K], matmul_id_subgroup_q5_k_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K], matmul_id_subgroup_q6_k_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_IQ1_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_S], matmul_id_subgroup_iq1_s_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_IQ1_M, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_M], matmul_id_subgroup_iq1_m_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_IQ2_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XXS], matmul_id_subgroup_iq2_xxs_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_IQ2_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XS], matmul_id_subgroup_iq2_xs_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_IQ2_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_S], matmul_id_subgroup_iq2_s_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_IQ3_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_XXS], matmul_id_subgroup_iq3_xxs_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_IQ3_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_S], matmul_id_subgroup_iq3_s_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_IQ4_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_XS], matmul_id_subgroup_iq4_xs_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_IQ4_NL, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL], matmul_id_subgroup_iq4_nl_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); - CREATE_MM2(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_MXFP4], matmul_id_subgroup_mxfp4_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id); + CREATE_MM2(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_0], matmul_id_subgroup_q4_0_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_1], matmul_id_subgroup_q4_1_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_0], matmul_id_subgroup_q5_0_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_1], matmul_id_subgroup_q5_1_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q8_0], matmul_id_subgroup_q8_0_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q2_K], matmul_id_subgroup_q2_k_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q3_K], matmul_id_subgroup_q3_k_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_K], matmul_id_subgroup_q4_k_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_K], matmul_id_subgroup_q5_k_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K], matmul_id_subgroup_q6_k_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_IQ1_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_S], matmul_id_subgroup_iq1_s_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_IQ1_M, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_M], matmul_id_subgroup_iq1_m_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_IQ2_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XXS], matmul_id_subgroup_iq2_xxs_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_IQ2_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XS], matmul_id_subgroup_iq2_xs_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_IQ2_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_S], matmul_id_subgroup_iq2_s_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_IQ3_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_XXS], matmul_id_subgroup_iq3_xxs_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_IQ3_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_S], matmul_id_subgroup_iq3_s_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_IQ4_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_XS], matmul_id_subgroup_iq4_xs_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_IQ4_NL, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL], matmul_id_subgroup_iq4_nl_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM2(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_MXFP4], matmul_id_subgroup_mxfp4_f32, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); #undef CREATE_MM2 #undef CREATE_MM } else @@ -3493,91 +3340,91 @@ static void ggml_vk_load_shaders(vk_device& device) { #endif if (device->subgroup_ballot && device->subgroup_require_full_support && subgroup_min_size_16) { - CREATE_MM(GGML_TYPE_F32, pipeline_matmul_id_f32, matmul_id_subgroup_f32_f32, , wg_denoms, warptile_id, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size_16); - CREATE_MM2(GGML_TYPE_F16, pipeline_matmul_id_f16, matmul_id_subgroup_f16, wg_denoms, warptile_id, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size_16); - CREATE_MM2(GGML_TYPE_F16, pipeline_matmul_id_f16_f32, matmul_id_subgroup_f16_f32, wg_denoms, warptile_id, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size_16); - CREATE_MM(GGML_TYPE_BF16, pipeline_matmul_id_bf16, matmul_id_subgroup_bf16, , wg_denoms, warptile_id, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size_16); + CREATE_MM(GGML_TYPE_F32, pipeline_matmul_id_f32, matmul_id_subgroup_f32_f32, , wg_denoms, warptile_id, vk_mat_mat_push_constants, 4, _id, mul_mat_subgroup_size_16); + CREATE_MM2(GGML_TYPE_F16, pipeline_matmul_id_f16, matmul_id_subgroup_f16, wg_denoms, warptile_id, vk_mat_mat_push_constants, 4, _id, mul_mat_subgroup_size_16); + CREATE_MM2(GGML_TYPE_F16, pipeline_matmul_id_f16_f32, matmul_id_subgroup_f16_f32, wg_denoms, warptile_id, vk_mat_mat_push_constants, 4, _id, mul_mat_subgroup_size_16); + CREATE_MM(GGML_TYPE_BF16, pipeline_matmul_id_bf16, matmul_id_subgroup_bf16, , wg_denoms, warptile_id, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size_16); - CREATE_MM2(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_0], matmul_id_subgroup_q4_0_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_1], matmul_id_subgroup_q4_1_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_0], matmul_id_subgroup_q5_0_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_1], matmul_id_subgroup_q5_1_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q8_0], matmul_id_subgroup_q8_0_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q2_K], matmul_id_subgroup_q2_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q3_K], matmul_id_subgroup_q3_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_K], matmul_id_subgroup_q4_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_K], matmul_id_subgroup_q5_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K], matmul_id_subgroup_q6_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_IQ1_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_S], matmul_id_subgroup_iq1_s_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_IQ1_M, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_M], matmul_id_subgroup_iq1_m_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_IQ2_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XXS], matmul_id_subgroup_iq2_xxs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_IQ2_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XS], matmul_id_subgroup_iq2_xs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_IQ2_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_S], matmul_id_subgroup_iq2_s_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_IQ3_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_XXS], matmul_id_subgroup_iq3_xxs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_IQ3_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_S], matmul_id_subgroup_iq3_s_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_IQ4_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_XS], matmul_id_subgroup_iq4_xs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_IQ4_NL, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL], matmul_id_subgroup_iq4_nl_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM2(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_MXFP4], matmul_id_subgroup_mxfp4_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_0], matmul_id_subgroup_q4_0_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_1], matmul_id_subgroup_q4_1_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_0], matmul_id_subgroup_q5_0_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_1], matmul_id_subgroup_q5_1_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q8_0], matmul_id_subgroup_q8_0_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q2_K], matmul_id_subgroup_q2_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q3_K], matmul_id_subgroup_q3_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_K], matmul_id_subgroup_q4_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_K], matmul_id_subgroup_q5_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K], matmul_id_subgroup_q6_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_IQ1_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_S], matmul_id_subgroup_iq1_s_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_IQ1_M, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_M], matmul_id_subgroup_iq1_m_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_IQ2_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XXS], matmul_id_subgroup_iq2_xxs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_IQ2_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XS], matmul_id_subgroup_iq2_xs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_IQ2_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_S], matmul_id_subgroup_iq2_s_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_IQ3_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_XXS], matmul_id_subgroup_iq3_xxs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_IQ3_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_S], matmul_id_subgroup_iq3_s_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_IQ4_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_XS], matmul_id_subgroup_iq4_xs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_IQ4_NL, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL], matmul_id_subgroup_iq4_nl_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM2(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_MXFP4], matmul_id_subgroup_mxfp4_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); #if defined(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT) if (device->integer_dot_product) { - CREATE_MMQ(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_0], matmul_id_subgroup_q4_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MMQ(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_1], matmul_id_subgroup_q4_1_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MMQ(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_0], matmul_id_subgroup_q5_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MMQ(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_1], matmul_id_subgroup_q5_1_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MMQ(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q8_0], matmul_id_subgroup_q8_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); + CREATE_MMQ(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_0], matmul_id_subgroup_q4_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MMQ(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_1], matmul_id_subgroup_q4_1_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MMQ(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_0], matmul_id_subgroup_q5_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MMQ(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_1], matmul_id_subgroup_q5_1_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MMQ(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q8_0], matmul_id_subgroup_q8_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); - CREATE_MMQ(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_MXFP4], matmul_id_subgroup_mxfp4_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); + CREATE_MMQ(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_MXFP4], matmul_id_subgroup_mxfp4_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); - CREATE_MMQ(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q2_K], matmul_id_subgroup_q2_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size_16); - CREATE_MMQ(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q3_K], matmul_id_subgroup_q3_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size_16); - CREATE_MMQ(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_K], matmul_id_subgroup_q4_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size_16); - CREATE_MMQ(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_K], matmul_id_subgroup_q5_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size_16); - CREATE_MMQ(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q6_K], matmul_id_subgroup_q6_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size_16); + CREATE_MMQ(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q2_K], matmul_id_subgroup_q2_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size_16); + CREATE_MMQ(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q3_K], matmul_id_subgroup_q3_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size_16); + CREATE_MMQ(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_K], matmul_id_subgroup_q4_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size_16); + CREATE_MMQ(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_K], matmul_id_subgroup_q5_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size_16); + CREATE_MMQ(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q6_K], matmul_id_subgroup_q6_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size_16); } #endif } else { - CREATE_MM(GGML_TYPE_F32, pipeline_matmul_id_f32, matmul_id_f32_f32, , wg_denoms, warptile, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_F16, pipeline_matmul_id_f16, matmul_id_f16, wg_denoms, warptile, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_F16, pipeline_matmul_id_f16_f32, matmul_id_f16_f32, wg_denoms, warptile, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_BF16, pipeline_matmul_id_bf16, matmul_id_bf16, , wg_denoms, warptile, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); + CREATE_MM(GGML_TYPE_F32, pipeline_matmul_id_f32, matmul_id_f32_f32, , wg_denoms, warptile, vk_mat_mat_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_F16, pipeline_matmul_id_f16, matmul_id_f16, wg_denoms, warptile, vk_mat_mat_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_F16, pipeline_matmul_id_f16_f32, matmul_id_f16_f32, wg_denoms, warptile, vk_mat_mat_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_BF16, pipeline_matmul_id_bf16, matmul_id_bf16, , wg_denoms, warptile, vk_mat_mat_id_push_constants, 4, _id, 0); - CREATE_MM2(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_0], matmul_id_q4_0_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_1], matmul_id_q4_1_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_0], matmul_id_q5_0_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_1], matmul_id_q5_1_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q8_0], matmul_id_q8_0_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q2_K], matmul_id_q2_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q3_K], matmul_id_q3_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_K], matmul_id_q4_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_K], matmul_id_q5_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K], matmul_id_q6_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_IQ1_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_S], matmul_id_iq1_s_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_IQ1_M, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_M], matmul_id_iq1_m_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_IQ2_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XXS], matmul_id_iq2_xxs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_IQ2_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XS], matmul_id_iq2_xs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_IQ2_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_S], matmul_id_iq2_s_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_IQ3_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_XXS], matmul_id_iq3_xxs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_IQ3_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_S], matmul_id_iq3_s_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_IQ4_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_XS], matmul_id_iq4_xs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_IQ4_NL, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL], matmul_id_iq4_nl_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM2(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_MXFP4], matmul_id_mxfp4_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); + CREATE_MM2(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_0], matmul_id_q4_0_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_1], matmul_id_q4_1_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_0], matmul_id_q5_0_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_1], matmul_id_q5_1_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q8_0], matmul_id_q8_0_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q2_K], matmul_id_q2_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q3_K], matmul_id_q3_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_K], matmul_id_q4_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_K], matmul_id_q5_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K], matmul_id_q6_k_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_IQ1_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_S], matmul_id_iq1_s_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_IQ1_M, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_M], matmul_id_iq1_m_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_IQ2_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XXS], matmul_id_iq2_xxs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_IQ2_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XS], matmul_id_iq2_xs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_IQ2_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_S], matmul_id_iq2_s_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_IQ3_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_XXS], matmul_id_iq3_xxs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_IQ3_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_S], matmul_id_iq3_s_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_IQ4_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_XS], matmul_id_iq4_xs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_IQ4_NL, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL], matmul_id_iq4_nl_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM2(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_MXFP4], matmul_id_mxfp4_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); #if defined(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT) if (device->integer_dot_product) { - CREATE_MMQ(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_0], matmul_id_q4_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MMQ(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_1], matmul_id_q4_1_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MMQ(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_0], matmul_id_q5_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MMQ(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_1], matmul_id_q5_1_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MMQ(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q8_0], matmul_id_q8_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); + CREATE_MMQ(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_0], matmul_id_q4_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_1], matmul_id_q4_1_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_0], matmul_id_q5_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_1], matmul_id_q5_1_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q8_0], matmul_id_q8_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, 0); - CREATE_MMQ(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_MXFP4], matmul_id_mxfp4_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); + CREATE_MMQ(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_MXFP4], matmul_id_mxfp4_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, 0); - CREATE_MMQ(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q2_K], matmul_id_q2_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MMQ(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q3_K], matmul_id_q3_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MMQ(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_K], matmul_id_q4_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MMQ(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_K], matmul_id_q5_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MMQ(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q6_K], matmul_id_q6_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); + CREATE_MMQ(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q2_K], matmul_id_q2_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q3_K], matmul_id_q3_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_K], matmul_id_q4_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_K], matmul_id_q5_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q6_K], matmul_id_q6_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, 0); } #endif } @@ -3654,57 +3501,57 @@ static void ggml_vk_load_shaders(vk_device& device) { #endif if (device->subgroup_ballot && device->subgroup_require_full_support && subgroup_min_size_16) { - CREATE_MM(GGML_TYPE_F32, pipeline_matmul_id_f32, matmul_id_subgroup_f32_f32, , wg_denoms, warptile_id, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size_16); - CREATE_MM(GGML_TYPE_F16, pipeline_matmul_id_f16.f32acc, matmul_id_subgroup_f16, , wg_denoms, warptile_id, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size_16); - CREATE_MM(GGML_TYPE_F16, pipeline_matmul_id_f16_f32.f32acc, matmul_id_subgroup_f16_f32, , wg_denoms, warptile_id, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size_16); - CREATE_MM(GGML_TYPE_BF16, pipeline_matmul_id_bf16, matmul_id_subgroup_bf16, , wg_denoms, warptile_id, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size_16); + CREATE_MM(GGML_TYPE_F32, pipeline_matmul_id_f32, matmul_id_subgroup_f32_f32, , wg_denoms, warptile_id, vk_mat_mat_push_constants, 4, _id, mul_mat_subgroup_size_16); + CREATE_MM(GGML_TYPE_F16, pipeline_matmul_id_f16.f32acc, matmul_id_subgroup_f16, , wg_denoms, warptile_id, vk_mat_mat_push_constants, 4, _id, mul_mat_subgroup_size_16); + CREATE_MM(GGML_TYPE_F16, pipeline_matmul_id_f16_f32.f32acc, matmul_id_subgroup_f16_f32, , wg_denoms, warptile_id, vk_mat_mat_push_constants, 4, _id, mul_mat_subgroup_size_16); + CREATE_MM(GGML_TYPE_BF16, pipeline_matmul_id_bf16, matmul_id_subgroup_bf16, , wg_denoms, warptile_id, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size_16); - CREATE_MM(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_0].f32acc, matmul_id_subgroup_q4_0_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_1].f32acc, matmul_id_subgroup_q4_1_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_0].f32acc, matmul_id_subgroup_q5_0_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_1].f32acc, matmul_id_subgroup_q5_1_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q8_0].f32acc, matmul_id_subgroup_q8_0_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q2_K].f32acc, matmul_id_subgroup_q2_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q3_K].f32acc, matmul_id_subgroup_q3_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_K].f32acc, matmul_id_subgroup_q4_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_K].f32acc, matmul_id_subgroup_q5_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K].f32acc, matmul_id_subgroup_q6_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_IQ1_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_S].f32acc, matmul_id_subgroup_iq1_s_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_IQ1_M, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_M].f32acc, matmul_id_subgroup_iq1_m_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_IQ2_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XXS].f32acc, matmul_id_subgroup_iq2_xxs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_IQ2_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XS].f32acc, matmul_id_subgroup_iq2_xs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_IQ2_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_S].f32acc, matmul_id_subgroup_iq2_s_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_IQ3_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_XXS].f32acc, matmul_id_subgroup_iq3_xxs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_IQ3_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_S].f32acc, matmul_id_subgroup_iq3_s_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_IQ4_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_XS].f32acc, matmul_id_subgroup_iq4_xs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_IQ4_NL, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL].f32acc, matmul_id_subgroup_iq4_nl_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); - CREATE_MM(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_MXFP4].f32acc, matmul_id_subgroup_mxfp4_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_0].f32acc, matmul_id_subgroup_q4_0_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_1].f32acc, matmul_id_subgroup_q4_1_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_0].f32acc, matmul_id_subgroup_q5_0_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_1].f32acc, matmul_id_subgroup_q5_1_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q8_0].f32acc, matmul_id_subgroup_q8_0_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q2_K].f32acc, matmul_id_subgroup_q2_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q3_K].f32acc, matmul_id_subgroup_q3_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_K].f32acc, matmul_id_subgroup_q4_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_K].f32acc, matmul_id_subgroup_q5_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K].f32acc, matmul_id_subgroup_q6_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_IQ1_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_S].f32acc, matmul_id_subgroup_iq1_s_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_IQ1_M, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_M].f32acc, matmul_id_subgroup_iq1_m_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_IQ2_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XXS].f32acc, matmul_id_subgroup_iq2_xxs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_IQ2_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XS].f32acc, matmul_id_subgroup_iq2_xs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_IQ2_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_S].f32acc, matmul_id_subgroup_iq2_s_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_IQ3_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_XXS].f32acc, matmul_id_subgroup_iq3_xxs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_IQ3_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_S].f32acc, matmul_id_subgroup_iq3_s_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_IQ4_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_XS].f32acc, matmul_id_subgroup_iq4_xs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_IQ4_NL, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL].f32acc, matmul_id_subgroup_iq4_nl_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MM(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_MXFP4].f32acc, matmul_id_subgroup_mxfp4_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); } else { - CREATE_MM(GGML_TYPE_F32, pipeline_matmul_id_f32, matmul_id_f32_f32, , wg_denoms, warptile, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_F16, pipeline_matmul_id_f16.f32acc, matmul_id_f16, , wg_denoms, warptile, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_F16, pipeline_matmul_id_f16_f32.f32acc, matmul_id_f16_f32, , wg_denoms, warptile, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_BF16, pipeline_matmul_id_bf16, matmul_id_bf16, , wg_denoms, warptile, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); + CREATE_MM(GGML_TYPE_F32, pipeline_matmul_id_f32, matmul_id_f32_f32, , wg_denoms, warptile, vk_mat_mat_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_F16, pipeline_matmul_id_f16.f32acc, matmul_id_f16, , wg_denoms, warptile, vk_mat_mat_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_F16, pipeline_matmul_id_f16_f32.f32acc, matmul_id_f16_f32, , wg_denoms, warptile, vk_mat_mat_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_BF16, pipeline_matmul_id_bf16, matmul_id_bf16, , wg_denoms, warptile, vk_mat_mat_id_push_constants, 4, _id, 0); - CREATE_MM(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_0].f32acc, matmul_id_q4_0_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_1].f32acc, matmul_id_q4_1_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_0].f32acc, matmul_id_q5_0_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_1].f32acc, matmul_id_q5_1_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q8_0].f32acc, matmul_id_q8_0_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q2_K].f32acc, matmul_id_q2_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q3_K].f32acc, matmul_id_q3_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_K].f32acc, matmul_id_q4_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_K].f32acc, matmul_id_q5_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K].f32acc, matmul_id_q6_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_IQ1_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_S].f32acc, matmul_id_iq1_s_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_IQ1_M, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_M].f32acc, matmul_id_iq1_m_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_IQ2_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XXS].f32acc, matmul_id_iq2_xxs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_IQ2_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XS].f32acc, matmul_id_iq2_xs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_IQ2_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_S].f32acc, matmul_id_iq2_s_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_IQ3_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_XXS].f32acc, matmul_id_iq3_xxs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_IQ3_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_S].f32acc, matmul_id_iq3_s_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_IQ4_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_XS].f32acc, matmul_id_iq4_xs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_IQ4_NL, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL].f32acc, matmul_id_iq4_nl_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); - CREATE_MM(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_MXFP4].f32acc, matmul_id_mxfp4_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); + CREATE_MM(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_0].f32acc, matmul_id_q4_0_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_1].f32acc, matmul_id_q4_1_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_0].f32acc, matmul_id_q5_0_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_1].f32acc, matmul_id_q5_1_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q8_0].f32acc, matmul_id_q8_0_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q2_K].f32acc, matmul_id_q2_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q3_K].f32acc, matmul_id_q3_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_K].f32acc, matmul_id_q4_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_K].f32acc, matmul_id_q5_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K].f32acc, matmul_id_q6_k_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_IQ1_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_S].f32acc, matmul_id_iq1_s_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_IQ1_M, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ1_M].f32acc, matmul_id_iq1_m_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_IQ2_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XXS].f32acc, matmul_id_iq2_xxs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_IQ2_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_XS].f32acc, matmul_id_iq2_xs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_IQ2_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ2_S].f32acc, matmul_id_iq2_s_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_IQ3_XXS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_XXS].f32acc, matmul_id_iq3_xxs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_IQ3_S, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ3_S].f32acc, matmul_id_iq3_s_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_IQ4_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_XS].f32acc, matmul_id_iq4_xs_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_IQ4_NL, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL].f32acc, matmul_id_iq4_nl_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MM(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_MXFP4].f32acc, matmul_id_mxfp4_f32, , mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); } } // reusing CREATE_MM from the fp32 path @@ -3722,13 +3569,8 @@ static void ggml_vk_load_shaders(vk_device& device) { m_wg_denoms = { 64, 64, 1 }; s_wg_denoms = { 32, 32, 1 }; - if (device->vendor_id == VK_VENDOR_ID_INTEL && device->architecture == INTEL_XE2) { - // Xe2/Xe3 - bf16 warptile performance tuning - l_warptile = { 512, 128, 128, 16, subgroup_size_8, 32, 2, 4, 4, 1, subgroup_size_8 }; - } - CREATE_MM(GGML_TYPE_BF16, pipeline_matmul_bf16, matmul_bf16, , wg_denoms, warptile, vk_mat_mat_push_constants, 3, , 0); - CREATE_MM(GGML_TYPE_BF16, pipeline_matmul_id_bf16, matmul_id_bf16, , wg_denoms, warptile, vk_mat_mat_id_push_constants, mul_mat_id_param_count, _id, 0); + CREATE_MM(GGML_TYPE_BF16, pipeline_matmul_id_bf16, matmul_id_bf16, , wg_denoms, warptile, vk_mat_mat_id_push_constants, 4, _id, 0); } #undef CREATE_MM @@ -3739,7 +3581,6 @@ static void ggml_vk_load_shaders(vk_device& device) { uint32_t rm_kq = 2; uint32_t rm_stdq_int = 1; uint32_t rm_kq_int = 1; - auto const &rm_iq_int = [](uint32_t i) { return i == 0 ? 8u : 4u; }; if (device->vendor_id == VK_VENDOR_ID_AMD) { if (device->architecture == AMD_GCN) { rm_stdq = 2; @@ -3843,10 +3684,6 @@ static void ggml_vk_load_shaders(vk_device& device) { ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_q8_1_f32[w][GGML_TYPE_Q4_K][i], "mul_mat_vec_q4_k_q8_1_f32", arr_dmmv_q4_k_q8_1_f32_len[reduc], arr_dmmv_q4_k_q8_1_f32_data[reduc], "main", mul_mat_vec_num_bindings, sizeof(vk_mat_vec_push_constants), {1*rm_kq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_kq_int, i+1}, 1, true, use_subgroups, subgroup_size_int); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_q8_1_f32[w][GGML_TYPE_Q5_K][i], "mul_mat_vec_q5_k_q8_1_f32", arr_dmmv_q5_k_q8_1_f32_len[reduc], arr_dmmv_q5_k_q8_1_f32_data[reduc], "main", mul_mat_vec_num_bindings, sizeof(vk_mat_vec_push_constants), {1*rm_kq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_kq_int, i+1}, 1, true, use_subgroups, subgroup_size_int); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_q8_1_f32[w][GGML_TYPE_Q6_K][i], "mul_mat_vec_q6_k_q8_1_f32", arr_dmmv_q6_k_q8_1_f32_len[reduc], arr_dmmv_q6_k_q8_1_f32_data[reduc], "main", mul_mat_vec_num_bindings, sizeof(vk_mat_vec_push_constants), {1*rm_kq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_kq_int, i+1}, 1, true, use_subgroups, subgroup_size_int); - - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_q8_1_f32[w][GGML_TYPE_IQ1_S][i], "mul_mat_vec_iq1_s_q8_1_f32", arr_dmmv_iq1_s_q8_1_f32_len[reduc], arr_dmmv_iq1_s_q8_1_f32_data[reduc], "main", mul_mat_vec_num_bindings, sizeof(vk_mat_vec_push_constants), {1*rm_iq_int(i), 1, 1}, {wg_size_subgroup_int, 1*rm_iq_int(i), i+1}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_q8_1_f32[w][GGML_TYPE_IQ1_M][i], "mul_mat_vec_iq1_m_q8_1_f32", arr_dmmv_iq1_m_q8_1_f32_len[reduc], arr_dmmv_iq1_m_q8_1_f32_data[reduc], "main", mul_mat_vec_num_bindings, sizeof(vk_mat_vec_push_constants), {1*rm_iq_int(i), 1, 1}, {wg_size_subgroup_int, 1*rm_iq_int(i), i+1}, 1, true, use_subgroups, subgroup_size_int); - } #endif // GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT } @@ -3880,22 +3717,19 @@ static void ggml_vk_load_shaders(vk_device& device) { const uint32_t subgroup_size_int = (device->vendor_id == VK_VENDOR_ID_INTEL && device->subgroup_size_control) ? device->subgroup_min_size : device->subgroup_size; const uint32_t wg_size_subgroup_int = (w == DMMV_WG_SIZE_SUBGROUP) ? subgroup_size_int : (subgroup_size_int * 4); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q4_0], "mul_mat_vec_id_q4_0_q8_1_f32", arr_dmmv_id_q4_0_q8_1_f32_len[reduc], arr_dmmv_id_q4_0_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_id_push_constants), {1*rm_stdq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_stdq_int}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q4_1], "mul_mat_vec_id_q4_1_q8_1_f32", arr_dmmv_id_q4_1_q8_1_f32_len[reduc], arr_dmmv_id_q4_1_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_id_push_constants), {1*rm_stdq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_stdq_int}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q5_0], "mul_mat_vec_id_q5_0_q8_1_f32", arr_dmmv_id_q5_0_q8_1_f32_len[reduc], arr_dmmv_id_q5_0_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_id_push_constants), {1*rm_stdq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_stdq_int}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q5_1], "mul_mat_vec_id_q5_1_q8_1_f32", arr_dmmv_id_q5_1_q8_1_f32_len[reduc], arr_dmmv_id_q5_1_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_id_push_constants), {1*rm_stdq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_stdq_int}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q8_0], "mul_mat_vec_id_q8_0_q8_1_f32", arr_dmmv_id_q8_0_q8_1_f32_len[reduc], arr_dmmv_id_q8_0_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_id_push_constants), {1*rm_stdq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_stdq_int}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q4_0], "mul_mat_vec_id_q4_0_q8_1_f32", arr_dmmv_id_q4_0_q8_1_f32_len[reduc], arr_dmmv_id_q4_0_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_push_constants), {1*rm_stdq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_stdq_int}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q4_1], "mul_mat_vec_id_q4_1_q8_1_f32", arr_dmmv_id_q4_1_q8_1_f32_len[reduc], arr_dmmv_id_q4_1_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_push_constants), {1*rm_stdq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_stdq_int}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q5_0], "mul_mat_vec_id_q5_0_q8_1_f32", arr_dmmv_id_q5_0_q8_1_f32_len[reduc], arr_dmmv_id_q5_0_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_push_constants), {1*rm_stdq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_stdq_int}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q5_1], "mul_mat_vec_id_q5_1_q8_1_f32", arr_dmmv_id_q5_1_q8_1_f32_len[reduc], arr_dmmv_id_q5_1_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_push_constants), {1*rm_stdq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_stdq_int}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q8_0], "mul_mat_vec_id_q8_0_q8_1_f32", arr_dmmv_id_q8_0_q8_1_f32_len[reduc], arr_dmmv_id_q8_0_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_push_constants), {1*rm_stdq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_stdq_int}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_MXFP4], "mul_mat_vec_id_mxfp4_q8_1_f32", arr_dmmv_id_mxfp4_q8_1_f32_len[reduc], arr_dmmv_id_mxfp4_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_id_push_constants), {2*rm_stdq_int, 1, 1}, {wg_size_subgroup_int, 2*rm_stdq_int}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_MXFP4], "mul_mat_vec_id_mxfp4_q8_1_f32", arr_dmmv_id_mxfp4_q8_1_f32_len[reduc], arr_dmmv_id_mxfp4_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_push_constants), {2*rm_stdq_int, 1, 1}, {wg_size_subgroup_int, 2*rm_stdq_int}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q2_K], "mul_mat_vec_id_q2_k_q8_1_f32", arr_dmmv_id_q2_k_q8_1_f32_len[reduc], arr_dmmv_id_q2_k_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_id_push_constants), {2*rm_kq_int, 1, 1}, {wg_size_subgroup_int, 2*rm_kq_int}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q3_K], "mul_mat_vec_id_q3_k_q8_1_f32", arr_dmmv_id_q3_k_q8_1_f32_len[reduc], arr_dmmv_id_q3_k_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_id_push_constants), {1*rm_kq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_kq_int}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q4_K], "mul_mat_vec_id_q4_k_q8_1_f32", arr_dmmv_id_q4_k_q8_1_f32_len[reduc], arr_dmmv_id_q4_k_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_id_push_constants), {1*rm_kq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_kq_int}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q5_K], "mul_mat_vec_id_q5_k_q8_1_f32", arr_dmmv_id_q5_k_q8_1_f32_len[reduc], arr_dmmv_id_q5_k_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_id_push_constants), {1*rm_kq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_kq_int}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q6_K], "mul_mat_vec_id_q6_k_q8_1_f32", arr_dmmv_id_q6_k_q8_1_f32_len[reduc], arr_dmmv_id_q6_k_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_id_push_constants), {1*rm_kq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_kq_int}, 1, true, use_subgroups, subgroup_size_int); - - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_IQ1_S], "mul_mat_vec_id_iq1_s_q8_1_f32", arr_dmmv_id_iq1_s_q8_1_f32_len[reduc], arr_dmmv_id_iq1_s_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_id_push_constants), {1*rm_iq_int(0), 1, 1}, {wg_size_subgroup_int, 1*rm_iq_int(0)}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_IQ1_M], "mul_mat_vec_id_iq1_m_q8_1_f32", arr_dmmv_id_iq1_m_q8_1_f32_len[reduc], arr_dmmv_id_iq1_m_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_id_push_constants), {1*rm_iq_int(0), 1, 1}, {wg_size_subgroup_int, 1*rm_iq_int(0)}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q2_K], "mul_mat_vec_id_q2_k_q8_1_f32", arr_dmmv_id_q2_k_q8_1_f32_len[reduc], arr_dmmv_id_q2_k_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_push_constants), {2*rm_kq_int, 1, 1}, {wg_size_subgroup_int, 2*rm_kq_int}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q3_K], "mul_mat_vec_id_q3_k_q8_1_f32", arr_dmmv_id_q3_k_q8_1_f32_len[reduc], arr_dmmv_id_q3_k_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_push_constants), {1*rm_kq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_kq_int}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q4_K], "mul_mat_vec_id_q4_k_q8_1_f32", arr_dmmv_id_q4_k_q8_1_f32_len[reduc], arr_dmmv_id_q4_k_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_push_constants), {1*rm_kq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_kq_int}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q5_K], "mul_mat_vec_id_q5_k_q8_1_f32", arr_dmmv_id_q5_k_q8_1_f32_len[reduc], arr_dmmv_id_q5_k_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_push_constants), {1*rm_kq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_kq_int}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_q8_1_f32[w][GGML_TYPE_Q6_K], "mul_mat_vec_id_q6_k_q8_1_f32", arr_dmmv_id_q6_k_q8_1_f32_len[reduc], arr_dmmv_id_q6_k_q8_1_f32_data[reduc], "main", mul_mat_vec_id_num_bindings, sizeof(vk_mat_vec_push_constants), {1*rm_kq_int, 1, 1}, {wg_size_subgroup_int, 1*rm_kq_int}, 1, true, use_subgroups, subgroup_size_int); } #endif // GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT } @@ -3903,7 +3737,6 @@ static void ggml_vk_load_shaders(vk_device& device) { #if !defined(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT) GGML_UNUSED(rm_stdq_int); GGML_UNUSED(rm_kq_int); - GGML_UNUSED(rm_iq_int); #endif // dequant shaders @@ -3983,9 +3816,9 @@ static void ggml_vk_load_shaders(vk_device& device) { ggml_vk_create_pipeline(device, device->pipeline_flash_attn_split_k_reduce, "fa_split_k_reduce", fa_split_k_reduce_len, fa_split_k_reduce_data, "main", 3, 5 * sizeof(uint32_t), {1, device->subgroup_size, 1}, {device->subgroup_size}, 1, true); if (device->subgroup_clustered && device->subgroup_require_full_support) { - ggml_vk_create_pipeline(device, device->pipeline_quantize_q8_1_x4, "quantize_q8_1_x4", quantize_q8_1_x4_subgroup_len, quantize_q8_1_x4_subgroup_data, "main", 2, sizeof(vk_quantize_q8_1_push_constants), {32 * device->subgroup_size / 8, 1, 1}, { device->subgroup_size }, 1, true, true); + ggml_vk_create_pipeline(device, device->pipeline_quantize_q8_1_x4, "quantize_q8_1_x4", quantize_q8_1_x4_subgroup_len, quantize_q8_1_x4_subgroup_data, "main", 2, 1 * sizeof(uint32_t), {32 * device->subgroup_size / 8, 1, 1}, { device->subgroup_size }, 1, true, true); } else { - ggml_vk_create_pipeline(device, device->pipeline_quantize_q8_1_x4, "quantize_q8_1_x4", quantize_q8_1_x4_len, quantize_q8_1_x4_data, "main", 2, sizeof(vk_quantize_q8_1_push_constants), {32 * device->subgroup_size / 8, 1, 1}, { device->subgroup_size }, 1); + ggml_vk_create_pipeline(device, device->pipeline_quantize_q8_1_x4, "quantize_q8_1_x4", quantize_q8_1_x4_len, quantize_q8_1_x4_data, "main", 2, 1 * sizeof(uint32_t), {32 * device->subgroup_size / 8, 1, 1}, { device->subgroup_size }, 1); } for (uint32_t i = 0; i < p021_max_gqa_ratio; ++i) { @@ -4122,7 +3955,6 @@ static void ggml_vk_load_shaders(vk_device& device) { ggml_vk_create_pipeline(device, device->pipeline_upscale_nearest_f32, "upscale_f32", upscale_f32_len, upscale_f32_data, "main", 2, sizeof(vk_op_upscale_push_constants), {512, 1, 1}, {GGML_SCALE_MODE_NEAREST}, 1); ggml_vk_create_pipeline(device, device->pipeline_upscale_bilinear_f32, "upscale_f32", upscale_f32_len, upscale_f32_data, "main", 2, sizeof(vk_op_upscale_push_constants), {512, 1, 1}, {GGML_SCALE_MODE_BILINEAR}, 1); ggml_vk_create_pipeline(device, device->pipeline_upscale_bicubic_f32, "upscale_f32", upscale_f32_len, upscale_f32_data, "main", 2, sizeof(vk_op_upscale_push_constants), {512, 1, 1}, {GGML_SCALE_MODE_BICUBIC}, 1); - ggml_vk_create_pipeline(device, device->pipeline_upscale_bilinear_antialias_f32, "upscale_f32", upscale_f32_len, upscale_f32_data, "main", 2, sizeof(vk_op_upscale_push_constants), {512, 1, 1}, {GGML_SCALE_MODE_BILINEAR | GGML_SCALE_FLAG_ANTIALIAS}, 1); ggml_vk_create_pipeline(device, device->pipeline_scale_f32, "scale_f32", scale_f32_len, scale_f32_data, "main", 2, sizeof(vk_op_unary_push_constants), {512, 1, 1}, {}, 1); @@ -4193,9 +4025,9 @@ static void ggml_vk_load_shaders(vk_device& device) { ggml_vk_create_pipeline(device, device->pipeline_add1_f16_f32, "add1_f16_f32", add1_f16_f32_len, add1_f16_f32_data, "main", 3, sizeof(vk_op_binary_push_constants), {512, 1, 1}, {}, 1); ggml_vk_create_pipeline(device, device->pipeline_add1_f32_f32, "add1_f32_f32", add1_f32_f32_len, add1_f32_f32_data, "main", 3, sizeof(vk_op_binary_push_constants), {512, 1, 1}, {}, 1); - ggml_vk_create_pipeline(device, device->pipeline_arange_f32, "arange_f32", arange_f32_len, arange_f32_data, "main", 1, sizeof(vk_op_push_constants), {512, 1, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_arange_f32, "arange_f32", arange_f32_len, arange_f32_data, "main", 1, sizeof(vk_op_unary_push_constants), {512, 1, 1}, {}, 1); - ggml_vk_create_pipeline(device, device->pipeline_fill_f32, "fill_f32", fill_f32_len, fill_f32_data, "main", 1, sizeof(vk_op_push_constants), {512, 1, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_fill_f32, "fill_f32", fill_f32_len, fill_f32_data, "main", 1, sizeof(vk_op_unary_push_constants), {512, 1, 1}, {}, 1); #define CREATE_GLU(name) \ if (device->float_controls_rte_fp16) { \ @@ -4290,16 +4122,10 @@ static void ggml_vk_load_shaders(vk_device& device) { ggml_vk_create_pipeline(device, device->pipeline_sum_rows_f32, "sum_rows_f32", sum_rows_f32_len, sum_rows_f32_data, "main", 2, sizeof(vk_op_sum_rows_push_constants), {1, 1, 1}, { device->subgroup_size }, 1); - const uint32_t cumsum_elem_per_thread = (device->vendor_id == VK_VENDOR_ID_AMD || device->vendor_id == VK_VENDOR_ID_INTEL) ? 2 : 4; - ggml_vk_create_pipeline(device, device->pipeline_cumsum_f32, "cumsum_f32", cumsum_f32_len, cumsum_f32_data, "main", 2, sizeof(vk_op_sum_rows_push_constants), {1, 1, 1}, { 256, device->subgroup_size, cumsum_elem_per_thread }, 1, true, true, device->subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_cumsum_small_f32, "cumsum_f32", cumsum_f32_len, cumsum_f32_data, "main", 2, sizeof(vk_op_sum_rows_push_constants), {1, 1, 1}, { 128, device->subgroup_size, 1 }, 1, true, true, device->subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_cumsum_multipass1_f32, "cumsum_multipass1_f32", cumsum_multipass1_f32_len, cumsum_multipass1_f32_data, "main", 3, sizeof(vk_op_sum_rows_push_constants), {256, 1, 1}, { 256, device->subgroup_size }, 1, true, true, device->subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_cumsum_multipass2_f32, "cumsum_multipass2_f32", cumsum_multipass2_f32_len, cumsum_multipass2_f32_data, "main", 3, sizeof(vk_op_sum_rows_push_constants), {256, 1, 1}, { 256, device->subgroup_size }, 1, true, true, device->subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_cumsum_f32, "cumsum_f32", cumsum_f32_len, cumsum_f32_data, "main", 2, sizeof(vk_op_sum_rows_push_constants), {1, 1, 1}, { 128, device->subgroup_size }, 1, true, true, device->subgroup_size); ggml_vk_create_pipeline(device, device->pipeline_count_equal_i32, "count_equal_i32", count_equal_i32_len, count_equal_i32_data, "main", 3, sizeof(vk_op_push_constants), {512, 1, 1}, { device->subgroup_size }, 1); - ggml_vk_create_pipeline(device, device->pipeline_count_experts, "count_experts", count_experts_len, count_experts_data, "main", 2, sizeof(vk_op_count_experts_push_constants), {1, 1, 1}, {}, 1, true); - for (auto &s : device->pipeline_solve_tri_f32) { const vk_solve_tri_pipeline_state &state = s.first; @@ -4341,8 +4167,8 @@ static void ggml_vk_load_shaders(vk_device& device) { ggml_vk_create_pipeline(device, device->pipeline_rwkv_wkv7_f32, "rwkv_wkv7_f32", rwkv_wkv7_f32_len, rwkv_wkv7_f32_data, "main", 8, sizeof(vk_op_rwkv_wkv7_push_constants), {1, 1, 1}, {device->subgroup_size}, 1); if (device->subgroup_arithmetic && device->subgroup_require_full_support) { - ggml_vk_create_pipeline(device, device->pipeline_ssm_scan_f32_d128, "ssm_scan_128_f32", ssm_scan_subgroup_f32_len, ssm_scan_subgroup_f32_data, "main", 8, sizeof(vk_op_ssm_scan_push_constants), {1, 1, 1}, {128, device->subgroup_size}, 1, true, true); - ggml_vk_create_pipeline(device, device->pipeline_ssm_scan_f32_d256, "ssm_scan_256_f32", ssm_scan_subgroup_f32_len, ssm_scan_subgroup_f32_data, "main", 8, sizeof(vk_op_ssm_scan_push_constants), {1, 1, 1}, {256, device->subgroup_size}, 1, true, true); + ggml_vk_create_pipeline(device, device->pipeline_ssm_scan_f32_d128, "ssm_scan_128_f32", ssm_scan_subgroup_f32_len, ssm_scan_subgroup_f32_data, "main", 8, sizeof(vk_op_ssm_scan_push_constants), {1, 1, 1}, {128, device->subgroup_size, 16}, 1, true, true); + ggml_vk_create_pipeline(device, device->pipeline_ssm_scan_f32_d256, "ssm_scan_256_f32", ssm_scan_subgroup_f32_len, ssm_scan_subgroup_f32_data, "main", 8, sizeof(vk_op_ssm_scan_push_constants), {1, 1, 1}, {256, device->subgroup_size, 16}, 1, true, true); } else { ggml_vk_create_pipeline(device, device->pipeline_ssm_scan_f32_d128, "ssm_scan_128_f32", ssm_scan_f32_len, ssm_scan_f32_data, "main", 8, sizeof(vk_op_ssm_scan_push_constants), {1, 1, 1}, {128, device->subgroup_size, 16}, 1, true, true); ggml_vk_create_pipeline(device, device->pipeline_ssm_scan_f32_d256, "ssm_scan_256_f32", ssm_scan_f32_len, ssm_scan_f32_data, "main", 8, sizeof(vk_op_ssm_scan_push_constants), {1, 1, 1}, {256, device->subgroup_size, 16}, 1, true, true); @@ -4450,7 +4276,9 @@ static void ggml_vk_load_shaders(vk_device& device) { for (uint32_t use_push = 0; use_push < 2; ++use_push) { for (uint32_t i = 0; i < num_topk_moe_pipelines; ++i) { - ggml_vk_create_pipeline2(device, device->pipeline_topk_moe[i][use_push], "topk_moe_f32_"+std::to_string(i), topk_moe_f32_len, topk_moe_f32_data, "main", 4, sizeof(vk_op_topk_moe_push_constants), {1, 1, 1}, {device->subgroup_size, 1u<subgroup_size); + ggml_vk_create_pipeline2(device, device->pipeline_topk_moe[i][TOPK_MOE_EARLY_SOFTMAX][use_push], "topk_moe_f32_early_softmax_"+std::to_string(i), topk_moe_f32_len, topk_moe_f32_data, "main", 3, sizeof(vk_op_topk_moe_push_constants), {1, 1, 1}, {device->subgroup_size, 1u<subgroup_size); + ggml_vk_create_pipeline2(device, device->pipeline_topk_moe[i][TOPK_MOE_EARLY_SOFTMAX_NORM][use_push], "topk_moe_f32_early_softmax_norm"+std::to_string(i), topk_moe_f32_len, topk_moe_f32_data, "main", 3, sizeof(vk_op_topk_moe_push_constants), {1, 1, 1}, {device->subgroup_size, 1u<subgroup_size); + ggml_vk_create_pipeline2(device, device->pipeline_topk_moe[i][TOPK_MOE_LATE_SOFTMAX][use_push], "topk_moe_f32_late_softmax"+std::to_string(i), topk_moe_f32_len, topk_moe_f32_data, "main", 3, sizeof(vk_op_topk_moe_push_constants), {1, 1, 1}, {device->subgroup_size, 1u<subgroup_size); } } @@ -4469,7 +4297,9 @@ static vk_device ggml_vk_get_device(size_t idx) { vk_device device = std::make_shared(); vk_instance.devices[idx] = device; +#ifdef GGML_VULKAN_MEMORY_DEBUG device->memory_logger = std::unique_ptr(new vk_memory_logger()); +#endif size_t dev_num = vk_instance.device_indices[idx]; @@ -4507,7 +4337,6 @@ static vk_device ggml_vk_get_device(size_t idx) { bool pipeline_executable_properties_support = false; device->coopmat_support = false; device->integer_dot_product = false; - device->shader_64b_indexing = false; bool bfloat16_support = false; for (const auto& properties : ext_props) { @@ -4553,12 +4382,6 @@ static vk_device ggml_vk_get_device(size_t idx) { } else if (strcmp("VK_EXT_memory_priority", properties.extensionName) == 0 && getenv("GGML_VK_ENABLE_MEMORY_PRIORITY")) { device->memory_priority = true; - } else if (strcmp("VK_EXT_external_memory_host", properties.extensionName) == 0) { - device->external_memory_host = true; -#if defined(VK_EXT_shader_64bit_indexing) - } else if (strcmp("VK_EXT_shader_64bit_indexing", properties.extensionName) == 0) { - device->shader_64b_indexing = true; -#endif } } @@ -4573,7 +4396,6 @@ static vk_device ggml_vk_get_device(size_t idx) { vk::PhysicalDeviceVulkan12Properties vk12_props; vk::PhysicalDeviceSubgroupSizeControlPropertiesEXT subgroup_size_control_props; vk::PhysicalDeviceShaderIntegerDotProductPropertiesKHR shader_integer_dot_product_props; - vk::PhysicalDeviceExternalMemoryHostPropertiesEXT external_memory_host_props; props2.pNext = &props3; props3.pNext = &subgroup_props; @@ -4613,22 +4435,11 @@ static vk_device ggml_vk_get_device(size_t idx) { last_struct = (VkBaseOutStructure *)&shader_integer_dot_product_props; } - if (device->external_memory_host) { - last_struct->pNext = (VkBaseOutStructure *)&external_memory_host_props; - last_struct = (VkBaseOutStructure *)&external_memory_host_props; - } - device->physical_device.getProperties2(&props2); device->properties = props2.properties; device->vendor_id = device->properties.vendorID; device->driver_id = driver_props.driverID; - if (device->driver_id == vk::DriverId::eMoltenvk) { - // Disable external_memory_host until https://github.com/KhronosGroup/MoltenVK/pull/2622 - // is available in the Vulkan SDK. - device->external_memory_host = false; - } - // Implementing the async backend interfaces seems broken on older Intel HW, // see https://github.com/ggml-org/llama.cpp/issues/17302. device->support_async = (device->vendor_id != VK_VENDOR_ID_INTEL || @@ -4681,8 +4492,6 @@ static vk_device ggml_vk_get_device(size_t idx) { } device->float_controls_rte_fp16 = vk12_props.shaderRoundingModeRTEFloat16; - device->subgroup_basic = (vk11_props.subgroupSupportedStages & vk::ShaderStageFlagBits::eCompute) && - (vk11_props.subgroupSupportedOperations & vk::SubgroupFeatureFlagBits::eBasic); device->subgroup_arithmetic = (vk11_props.subgroupSupportedStages & vk::ShaderStageFlagBits::eCompute) && (vk11_props.subgroupSupportedOperations & vk::SubgroupFeatureFlagBits::eArithmetic); #ifdef __APPLE__ @@ -4712,8 +4521,6 @@ static vk_device ggml_vk_get_device(size_t idx) { device->integer_dot_product = device->integer_dot_product && shader_integer_dot_product_props.integerDotProduct4x8BitPackedSignedAccelerated; - device->min_imported_host_pointer_alignment = external_memory_host_props.minImportedHostPointerAlignment; - device->max_workgroup_size_log2 = uint32_t(log2f(float(device->properties.limits.maxComputeWorkGroupInvocations))); std::vector queue_family_props = device->physical_device.getQueueFamilyProperties(); @@ -4845,20 +4652,6 @@ static vk_device ggml_vk_get_device(size_t idx) { device_extensions.push_back("VK_KHR_pipeline_executable_properties"); } - if (device->external_memory_host) { - device_extensions.push_back("VK_EXT_external_memory_host"); - } - -#if defined(VK_EXT_shader_64bit_indexing) - VkPhysicalDeviceShader64BitIndexingFeaturesEXT shader_64bit_indexing_features {}; - shader_64bit_indexing_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_64_BIT_INDEXING_FEATURES_EXT; - if (device->shader_64b_indexing) { - last_struct->pNext = (VkBaseOutStructure *)&shader_64bit_indexing_features; - last_struct = (VkBaseOutStructure *)&shader_64bit_indexing_features; - device_extensions.push_back("VK_EXT_shader_64bit_indexing"); - } -#endif - vkGetPhysicalDeviceFeatures2(device->physical_device, &device_features2); device->pipeline_executable_properties_support = pipeline_executable_properties_support; @@ -5125,23 +4918,11 @@ static vk_device ggml_vk_get_device(size_t idx) { switch (device->vendor_id) { #ifndef GGML_VULKAN_RUN_TESTS case VK_VENDOR_ID_AMD: - device->mul_mat_l[i] = device->coopmat_support && device->driver_id != vk::DriverId::eAmdProprietary; - device->mul_mat_m[i] = true; - device->mul_mat_s[i] = true; - device->mul_mat_id_l[i] = false; - device->mul_mat_id_m[i] = true; - device->mul_mat_id_s[i] = true; - break; case VK_VENDOR_ID_INTEL: - if (!device->coopmat_support || device->architecture != INTEL_XE2) { - device->mul_mat_l[i] = false; - device->mul_mat_id_l[i] = false; - } else { - device->mul_mat_l[i] = true; // if coopmat & XE2+, allow large matmul warptile config for Intel - device->mul_mat_id_l[i] = true; - } + device->mul_mat_l[i] = false; device->mul_mat_m[i] = true; device->mul_mat_s[i] = true; + device->mul_mat_id_l[i] = false; device->mul_mat_id_m[i] = true; device->mul_mat_id_s[i] = true; break; @@ -5466,7 +5247,6 @@ static void ggml_vk_instance_init() { vk_perf_logger_enabled = getenv("GGML_VK_PERF_LOGGER") != nullptr; vk_perf_logger_concurrent = getenv("GGML_VK_PERF_LOGGER_CONCURRENT") != nullptr; vk_enable_sync_logger = getenv("GGML_VK_SYNC_LOGGER") != nullptr; - vk_memory_logger_enabled = getenv("GGML_VK_MEMORY_LOGGER") != nullptr; const char* GGML_VK_PERF_LOGGER_FREQUENCY = getenv("GGML_VK_PERF_LOGGER_FREQUENCY"); if (GGML_VK_PERF_LOGGER_FREQUENCY != nullptr) { @@ -5789,8 +5569,6 @@ static vk_pipeline ggml_vk_get_dequantize_mul_mat_vec(ggml_backend_vk_context * case GGML_TYPE_Q4_K: case GGML_TYPE_Q5_K: case GGML_TYPE_Q6_K: - case GGML_TYPE_IQ1_S: - case GGML_TYPE_IQ1_M: break; default: return nullptr; @@ -5947,8 +5725,6 @@ static vk_pipeline ggml_vk_get_dequantize_mul_mat_vec_id(ggml_backend_vk_context case GGML_TYPE_Q4_K: case GGML_TYPE_Q5_K: case GGML_TYPE_Q6_K: - case GGML_TYPE_IQ1_S: - case GGML_TYPE_IQ1_M: break; default: return nullptr; @@ -6153,7 +5929,6 @@ static void ggml_vk_dispatch_pipeline(ggml_backend_vk_context* ctx, vk_context& GGML_ASSERT(ctx->descriptor_set_idx < ctx->descriptor_sets.size()); GGML_ASSERT(descriptor_buffer_infos.size() <= MAX_PARAMETER_COUNT); GGML_ASSERT(pipeline->parameter_count == descriptor_buffer_infos.size()); - GGML_ASSERT(pipeline->push_constant_size == push_constant_size(push_constants)); vk::DescriptorSet& descriptor_set = ctx->descriptor_sets[ctx->descriptor_set_idx++]; vk::WriteDescriptorSet write_descriptor_set{ descriptor_set, 0, 0, pipeline->parameter_count, vk::DescriptorType::eStorageBuffer, nullptr, descriptor_buffer_infos.begin() }; @@ -6748,18 +6523,18 @@ static uint32_t ggml_vk_guess_matmul_id_pipeline_align(ggml_backend_vk_context * static void ggml_vk_matmul_id( ggml_backend_vk_context * ctx, vk_context& subctx, vk_pipeline& pipeline, - vk_subbuffer&& a, vk_subbuffer&& b, vk_subbuffer&& d, vk_subbuffer&& ids, const vk_subbuffer & expert_count_buf, + vk_subbuffer&& a, vk_subbuffer&& b, vk_subbuffer&& d, vk_subbuffer&& ids, uint32_t m, uint32_t n, uint32_t k, uint32_t stride_a, uint32_t stride_b, uint32_t stride_d, uint32_t batch_stride_a, uint32_t batch_stride_b, uint32_t batch_stride_d, uint32_t n_as, uint32_t nei0, uint32_t nei1, uint32_t nbi1, uint32_t ne11, uint32_t padded_n) { - VK_LOG_DEBUG("ggml_vk_matmul_id(a: (" << a.buffer->buffer << ", " << a.offset << ", " << a.size << "), b: (" << b.buffer->buffer << ", " << b.offset << ", " << b.size << "), d: (" << d.buffer->buffer << ", " << d.offset << ", " << d.size << "), ids: (" << ids.buffer->buffer << ", " << ids.offset << ", " << ids.size << "), expert_count: (" << expert_count_buf.buffer->buffer << ", " << expert_count_buf.offset << ", " << expert_count_buf.size << "), " << + VK_LOG_DEBUG("ggml_vk_matmul_id(a: (" << a.buffer->buffer << ", " << a.offset << ", " << a.size << "), b: (" << b.buffer->buffer << ", " << b.offset << ", " << b.size << "), d: (" << d.buffer->buffer << ", " << d.offset << ", " << d.size << "), ids: (" << ids.buffer->buffer << ", " << ids.offset << ", " << ids.size << "), " << "m: " << m << ", n: " << n << ", k: " << k << ", stride_a: " << stride_a << ", stride_b: " << stride_b << ", stride_d: " << stride_d << ", " << "batch_stride_a: " << batch_stride_a << ", batch_stride_b: " << batch_stride_b << ", batch_stride_d: " << batch_stride_d << ", " << "n_as: " << n_as << ", nei0: " << nei0 << ", nei1: " << nei1 << ", nbi1: " << nbi1 << ", ne11: " << ne11 << ")"); const vk_mat_mat_id_push_constants pc = { m, n, k, stride_a, stride_b, stride_d, batch_stride_a, batch_stride_b, batch_stride_d, nei0, nei1, nbi1, ne11, padded_n }; - ggml_vk_dispatch_pipeline(ctx, subctx, pipeline, { a, b, d, ids, expert_count_buf }, pc, { m, nei1, n_as }); + ggml_vk_dispatch_pipeline(ctx, subctx, pipeline, { a, b, d, ids }, pc, { m, nei1, n_as }); } static bool ggml_vk_dim01_contiguous(const ggml_tensor * tensor) { @@ -6931,34 +6706,10 @@ static void ggml_vk_quantize_q8_1(ggml_backend_vk_context * ctx, vk_context& sub vk_pipeline pipeline = ggml_vk_get_quantize_pipeline(ctx, GGML_TYPE_Q8_1); - const uint32_t num_blocks = CEIL_DIV(ne, pipeline->wg_denoms[0]); - // clamp the number of elements to the max workgroup count. The shader will iterate over the total number of blocks. - const uint64_t max_elements = std::min(uint64_t{ctx->device->properties.limits.maxComputeWorkGroupCount[0]} * pipeline->wg_denoms[0], std::numeric_limits::max()); - const uint32_t elements = std::min(ne, static_cast(max_elements)); - - const vk_quantize_q8_1_push_constants pc = { - ne, - num_blocks, - }; - - ggml_vk_dispatch_pipeline(ctx, subctx, pipeline, { in, out }, pc, { elements, 1, 1 }); + ggml_vk_dispatch_pipeline(ctx, subctx, pipeline, { in, out }, std::array{ne}, { ne, 1, 1 }); ggml_vk_sync_buffers(ctx, subctx); } -static vk_pipeline ggml_vk_get_64b_indexing_pipeline(ggml_backend_vk_context * ctx, vk_pipeline &pipeline) { - GGML_UNUSED(ctx); -#if defined(VK_EXT_shader_64bit_indexing) - vk_pipeline *ptr = &pipeline; - while (*ptr) { - if ((*ptr)->is_64b_indexing) { - return *ptr; - } - ptr = &(*ptr)->next; - } -#endif - return pipeline; -} - static void ggml_vk_mul_mat_q_f16(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, bool disable_split_k) { VK_LOG_DEBUG("ggml_vk_mul_mat_q_f16((" << src0 << ", name=" << src0->name << ", type=" << ggml_type_name(src0->type) << ", ne0=" << src0->ne[0] << ", ne1=" << src0->ne[1] << ", ne2=" << src0->ne[2] << ", ne3=" << src0->ne[3] << ", nb0=" << src0->nb[0] << ", nb1=" << src0->nb[1] << ", nb2=" << src0->nb[2] << ", nb3=" << src0->nb[3]; std::cerr << "), (" << src1 << ", name=" << src1->name << ", type=" << ggml_type_name(src1->type) << ", ne0=" << src1->ne[0] << ", ne1=" << src1->ne[1] << ", ne2=" << src1->ne[2] << ", ne3=" << src1->ne[3] << ", nb0=" << src1->nb[0] << ", nb1=" << src1->nb[1] << ", nb2=" << src1->nb[2] << ", nb3=" << src1->nb[3]; @@ -7042,10 +6793,6 @@ static void ggml_vk_mul_mat_q_f16(ggml_backend_vk_context * ctx, vk_context& sub vk_pipeline pipeline = ggml_vk_guess_matmul_pipeline(ctx, mmp, ne01, ne11, aligned, qx_needs_dequant ? f16_type : src0->type, quantize_y ? GGML_TYPE_Q8_1 : (y_f32_kernel ? GGML_TYPE_F32 : src1->type)); - if (ggml_nbytes(src0) > ctx->device->properties.limits.maxStorageBufferRange) { - pipeline = ggml_vk_get_64b_indexing_pipeline(ctx, pipeline); - } - // Reserve extra storage in the N dimension for the Y matrix, so we can avoid bounds-checking uint32_t padded_n = qy_needs_dequant ? ROUNDUP_POW2(ne11, pipeline->wg_denoms[1]) : ne11; const uint64_t x_ne = ggml_nelements(src0); @@ -7243,7 +6990,7 @@ static bool ggml_vk_should_use_mmvq(const vk_device& device, uint32_t m, uint32_ // Quantization overhead is not worth it for small k switch (device->vendor_id) { case VK_VENDOR_ID_NVIDIA: - if (src0_type == GGML_TYPE_Q2_K || src0_type == GGML_TYPE_IQ1_S || src0_type == GGML_TYPE_IQ1_M) { + if (src0_type == GGML_TYPE_Q2_K) { return true; } @@ -7355,10 +7102,6 @@ static void ggml_vk_mul_mat_vec_q_f16(ggml_backend_vk_context * ctx, vk_context& to_q8_1 = ggml_vk_get_quantize_pipeline(ctx, GGML_TYPE_Q8_1); } - if (ggml_nbytes(src0) > ctx->device->properties.limits.maxStorageBufferRange) { - dmmv = ggml_vk_get_64b_indexing_pipeline(ctx, dmmv); - } - const bool qx_needs_dequant = x_non_contig; const bool qy_needs_dequant = !quantize_y && ((src1->type != GGML_TYPE_F16 && !f16_f32_kernel) || y_non_contig); @@ -7554,15 +7297,9 @@ static void ggml_vk_mul_mat_vec_p021_f16_f32(ggml_backend_vk_context * ctx, vk_c gqa_ratio = 1; } - vk_pipeline pipeline = ctx->device->pipeline_mul_mat_vec_p021_f16_f32[gqa_ratio - 1]; - - if (ggml_nbytes(src0) > ctx->device->properties.limits.maxStorageBufferRange) { - pipeline = ggml_vk_get_64b_indexing_pipeline(ctx, pipeline); - } - { // Request descriptor sets - ggml_pipeline_request_descriptor_sets(ctx, pipeline, 1); + ggml_pipeline_request_descriptor_sets(ctx, ctx->device->pipeline_mul_mat_vec_p021_f16_f32[gqa_ratio - 1], 1); } vk_subbuffer d_D = ggml_vk_tensor_subbuffer(ctx, cgraph->nodes[node_idx + ctx->num_additional_fused_ops], true); @@ -7604,7 +7341,7 @@ static void ggml_vk_mul_mat_vec_p021_f16_f32(ggml_backend_vk_context * ctx, vk_c workgroups_z /= gqa_ratio; } - ggml_vk_dispatch_pipeline(ctx, subctx, pipeline, + ggml_vk_dispatch_pipeline(ctx, subctx, ctx->device->pipeline_mul_mat_vec_p021_f16_f32[gqa_ratio - 1], { d_Qx, d_Qy, @@ -7654,14 +7391,9 @@ static void ggml_vk_mul_mat_vec_nc_f16_f32(ggml_backend_vk_context * ctx, vk_con const uint32_t channel_stride_x = nb02 / sizeof(ggml_fp16_t); const uint32_t channel_stride_y = nb12 / sizeof(float); - vk_pipeline pipeline = ctx->device->pipeline_mul_mat_vec_nc_f16_f32; - if (ggml_nbytes(src0) > ctx->device->properties.limits.maxStorageBufferRange) { - pipeline = ggml_vk_get_64b_indexing_pipeline(ctx, pipeline); - } - { // Request descriptor sets - ggml_pipeline_request_descriptor_sets(ctx, pipeline, 1); + ggml_pipeline_request_descriptor_sets(ctx, ctx->device->pipeline_mul_mat_vec_nc_f16_f32, 1); } vk_subbuffer d_D = ggml_vk_tensor_subbuffer(ctx, cgraph->nodes[node_idx + ctx->num_additional_fused_ops], true); @@ -7698,7 +7430,7 @@ static void ggml_vk_mul_mat_vec_nc_f16_f32(ggml_backend_vk_context * ctx, vk_con init_pushconst_tensor_offsets(ctx, pc, src0, src1, nullptr, nullptr, cgraph->nodes[node_idx + ctx->num_additional_fused_ops]); - ggml_vk_dispatch_pipeline(ctx, subctx, pipeline, + ggml_vk_dispatch_pipeline(ctx, subctx, ctx->device->pipeline_mul_mat_vec_nc_f16_f32, { d_Qx, d_Qy, @@ -7717,9 +7449,8 @@ static void ggml_vk_mul_mat(ggml_backend_vk_context * ctx, vk_context& subctx, c // Handle huge A matrix by splitting the M dimensions. This works well for convolution use cases // where the M dimension is very large. // Split_k doesn't work with M splitting. - // This only supports batchsize == 1. const size_t nbytes = ggml_nbytes(src0); - const bool needs_split = dst->ne[2] == 1 && dst->ne[3] == 1 && nbytes > ctx->device->properties.limits.maxStorageBufferRange; + const bool needs_split = nbytes > ctx->device->properties.limits.maxStorageBufferRange; if (needs_split) { // Choose the number of rows that can fit (and divide by two, to allow for any additional offsets) const uint32_t M_split = ctx->device->properties.limits.maxStorageBufferRange / (2 * src0->nb[1]); @@ -7786,7 +7517,6 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& const uint64_t nei0 = ids->ne[0]; const uint64_t nei1 = ids->ne[1]; - const uint32_t nbi0 = ids->nb[0]; const uint32_t nbi1 = ids->nb[1]; const uint32_t nbi2 = ids->nb[2]; @@ -7861,9 +7591,6 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& vk_pipeline pipeline = ggml_vk_guess_matmul_id_pipeline(ctx, mmp, ne01, nei1, aligned, qx_needs_dequant ? f16_type : src0->type); - if (ggml_nbytes(src0) > ctx->device->properties.limits.maxStorageBufferRange) { - pipeline = ggml_vk_get_64b_indexing_pipeline(ctx, pipeline); - } // Reserve extra storage in the N dimension for the Y matrix, so we can avoid bounds-checking uint32_t padded_n = qy_needs_dequant ? ROUNDUP_POW2(ne11, pipeline->wg_denoms[1]) :ne11; const uint64_t x_ne = ggml_nelements(src0); @@ -7897,9 +7624,6 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& if (quantize_y) { to_q8_1 = ggml_vk_get_quantize_pipeline(ctx, GGML_TYPE_Q8_1); } - vk_pipeline count_experts = ctx->device->pipeline_count_experts; - - uint32_t expert_count_size = sizeof(uint32_t) * n_as; { if ( @@ -7915,10 +7639,6 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& ctx->prealloc_size_y = y_sz; ggml_vk_preallocate_buffers(ctx, subctx); } - if (ctx->prealloc_size_split_k < expert_count_size) { - ctx->prealloc_size_split_k = expert_count_size; - ggml_vk_preallocate_buffers(ctx, subctx); - } // Request descriptor sets ggml_pipeline_request_descriptor_sets(ctx, pipeline, 1); @@ -7931,7 +7651,6 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& if (quantize_y) { ggml_pipeline_request_descriptor_sets(ctx, to_q8_1, 1); } - ggml_pipeline_request_descriptor_sets(ctx, count_experts, 1); } vk_buffer d_D = dst_buf_ctx->dev_buffer; @@ -7981,20 +7700,6 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& ggml_vk_sync_buffers(ctx, subctx); } } - // Count how many times each expert is used - vk_subbuffer expert_count_buf = ggml_vk_subbuffer(ctx, ctx->prealloc_split_k, 0); - if (ctx->prealloc_split_k_need_sync) { - ggml_vk_sync_buffers(ctx, subctx); - } - { - const std::vector pc = { (uint32_t)nei0, - (uint32_t)nei1, - (uint32_t)(nbi0 / ggml_type_size(ids->type)), - (uint32_t)(nbi1 / ggml_type_size(ids->type)), - (uint32_t)(get_misalign_bytes(ctx, ids) / ggml_type_size(ids->type)) }; - ggml_vk_dispatch_pipeline(ctx, subctx, count_experts, - { vk_subbuffer{ d_ids, ids_buf_offset, ids_sz }, expert_count_buf }, pc, { (uint32_t)n_as, 1, 1}); - } if (x_non_contig) { ggml_vk_cpy_to_contiguous(ctx, subctx, to_fp16_vk_0, src0, ggml_vk_subbuffer(ctx, d_Qx, qx_buf_offset), ggml_vk_subbuffer(ctx, d_X, 0)); @@ -8002,6 +7707,7 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& const std::vector pc = { (uint32_t)ne01, (uint32_t)ne10, (uint32_t)ne10, (uint32_t)ne10, (uint32_t)(ggml_nelements(src0)) }; ggml_vk_dispatch_pipeline(ctx, subctx, to_fp16_vk_0, { vk_subbuffer{ d_Qx, qx_buf_offset, qx_sz }, vk_subbuffer{ d_X, 0, x_sz } }, pc, { (uint32_t)x_ne, 1, 1}); + ggml_vk_sync_buffers(ctx, subctx); } if (y_non_contig) { if (ctx->prealloc_y_last_pipeline_used != to_fp16_vk_1.get() || @@ -8025,7 +7731,6 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& ctx->prealloc_y_last_tensor_used = src1; } } - ggml_vk_sync_buffers(ctx, subctx); uint32_t stride_batch_x = ne00*ne01; uint32_t stride_batch_y = ne10*ne11; @@ -8042,7 +7747,7 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& ggml_vk_matmul_id( ctx, subctx, pipeline, { d_X, x_buf_offset, x_sz }, { d_Y, y_buf_offset, y_sz }, - { d_D, d_buf_offset, d_sz }, { d_ids, ids_buf_offset, ids_sz }, expert_count_buf, + { d_D, d_buf_offset, d_sz }, { d_ids, ids_buf_offset, ids_sz }, ne01, ne21, ne10, ne10, ne10, ne01, stride_batch_x, stride_batch_y, ne20*ne21, n_as, nei0, nei1, nbi1 / ggml_type_size(ids->type), ne11, padded_n @@ -8054,7 +7759,6 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& if (y_non_contig || quantize_y) { ctx->prealloc_y_need_sync = true; } - ctx->prealloc_split_k_need_sync = true; } static void ggml_vk_mul_mat_vec_id_q_f16(ggml_backend_vk_context * ctx, vk_context& subctx, const struct ggml_cgraph * cgraph, int node_idx) { @@ -8125,10 +7829,6 @@ static void ggml_vk_mul_mat_vec_id_q_f16(ggml_backend_vk_context * ctx, vk_conte const bool qx_needs_dequant = x_non_contig; const bool qy_needs_dequant = !quantize_y && ((src1->type != GGML_TYPE_F16 && !f16_f32_kernel) || y_non_contig); - if (ggml_nbytes(src0) > ctx->device->properties.limits.maxStorageBufferRange) { - dmmv = ggml_vk_get_64b_indexing_pipeline(ctx, dmmv); - } - // Not implemented GGML_ASSERT(y_non_contig || !qy_needs_dequant); // NOLINT GGML_ASSERT(!qx_needs_dequant || to_fp16_vk_0 != nullptr); // NOLINT @@ -8308,11 +8008,11 @@ static void ggml_vk_mul_mat_id(ggml_backend_vk_context * ctx, vk_context& subctx } } -static bool ggml_vk_flash_attn_scalar_shmem_support(const vk_device& device, const uint32_t hsk, uint32_t hsv, bool small_cache) { +static bool ggml_vk_flash_attn_scalar_shmem_support(const vk_device& device, const uint32_t hsk, uint32_t hsv) { // Needs to be kept up to date on shader changes GGML_UNUSED(hsv); const uint32_t wg_size = scalar_flash_attention_workgroup_size; - const uint32_t Br = get_fa_scalar_num_large_rows(hsk, hsv, small_cache); + const uint32_t Br = get_fa_scalar_num_large_rows(hsk, hsv); const uint32_t Bc = scalar_flash_attention_Bc; const uint32_t tmpsh = wg_size * sizeof(float); @@ -8436,8 +8136,6 @@ static void ggml_vk_flash_attn(ggml_backend_vk_context * ctx, vk_context& subctx uint32_t workgroups_y = (uint32_t)neq2; uint32_t workgroups_z = (uint32_t)neq3; - const bool small_cache = nek1 < 1024; - // For scalar/coopmat1 FA, we can use the "large" size to accommodate qga. // For coopmat2 FA, we always use the small size (which is still pretty large for gqa). uint32_t max_gqa; @@ -8445,7 +8143,7 @@ static void ggml_vk_flash_attn(ggml_backend_vk_context * ctx, vk_context& subctx case FA_SCALAR: case FA_COOPMAT1: // We may switch from coopmat1 to scalar, so use the scalar limit for both - max_gqa = get_fa_scalar_num_large_rows(HSK, HSV, small_cache); + max_gqa = get_fa_scalar_num_large_rows(HSK, HSV); break; case FA_COOPMAT2: max_gqa = get_fa_num_small_rows(FA_COOPMAT2); @@ -8479,7 +8177,7 @@ static void ggml_vk_flash_attn(ggml_backend_vk_context * ctx, vk_context& subctx // with large hsk/hsv, scalar path may need to use small_rows to fit in shared memory if (path == FA_SCALAR && - !ggml_vk_flash_attn_scalar_shmem_support(ctx->device, HSK, HSV, small_cache)) { + !ggml_vk_flash_attn_scalar_shmem_support(ctx->device, HSK, HSV)) { small_rows = true; } @@ -8495,7 +8193,7 @@ static void ggml_vk_flash_attn(ggml_backend_vk_context * ctx, vk_context& subctx v_stride /= 4; } - uint32_t alignment = fa_align(path, HSK, HSV, k->type, small_rows, small_cache); + uint32_t alignment = fa_align(path, HSK, HSV, k->type, small_rows); bool aligned = (KV % alignment) == 0 && // the "aligned" shader variant will forcibly align strides, for performance (q_stride & 7) == 0 && (k_stride & 7) == 0 && (v_stride & 7) == 0; @@ -8507,7 +8205,7 @@ static void ggml_vk_flash_attn(ggml_backend_vk_context * ctx, vk_context& subctx bool f32acc = path == FA_SCALAR || dst->op_params[3] == GGML_PREC_F32; - vk_fa_pipeline_state fa_pipeline_state(HSK, HSV, small_rows, small_cache, path, aligned, f32acc); + vk_fa_pipeline_state fa_pipeline_state(HSK, HSV, small_rows, path, aligned, f32acc); vk_pipeline pipeline = nullptr; @@ -8732,7 +8430,7 @@ static vk_pipeline ggml_vk_op_get_pipeline(ggml_backend_vk_context * ctx, const return nullptr; case GGML_OP_UPSCALE: if (src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32) { - uint32_t mode = (ggml_get_op_params_i32(dst, 0) & (0xFF | GGML_SCALE_FLAG_ANTIALIAS)); + ggml_scale_mode mode = (ggml_scale_mode)(ggml_get_op_params_i32(dst, 0) & 0xFF); switch (mode) { case GGML_SCALE_MODE_NEAREST: return ctx->device->pipeline_upscale_nearest_f32; @@ -8740,8 +8438,6 @@ static vk_pipeline ggml_vk_op_get_pipeline(ggml_backend_vk_context * ctx, const return ctx->device->pipeline_upscale_bilinear_f32; case GGML_SCALE_MODE_BICUBIC: return ctx->device->pipeline_upscale_bicubic_f32; - case GGML_SCALE_MODE_BILINEAR | GGML_SCALE_FLAG_ANTIALIAS: - return ctx->device->pipeline_upscale_bilinear_antialias_f32; default: return nullptr; } @@ -8945,9 +8641,10 @@ static vk_pipeline ggml_vk_op_get_pipeline(ggml_backend_vk_context * ctx, const if (ctx->num_additional_fused_ops) { uint32_t idx = (uint32_t)ceilf(log2f(float(dst->ne[0]))); GGML_ASSERT(idx < num_topk_moe_pipelines); + topk_moe_mode mode = ggml_vk_num_additional_ops_to_topk_moe_mode(ctx->num_additional_fused_ops); // use n_experts from push constant if it's not equal to the power of two spec constant bool use_push = dst->ne[0] != (1u << idx); - return ctx->device->pipeline_topk_moe[idx][use_push]; + return ctx->device->pipeline_topk_moe[idx][mode][use_push]; } if (src0->type == GGML_TYPE_F32 && (src1 == nullptr || src1->type == GGML_TYPE_F32) && dst->type == GGML_TYPE_F32) { @@ -9020,11 +8717,7 @@ static vk_pipeline ggml_vk_op_get_pipeline(ggml_backend_vk_context * ctx, const return nullptr; case GGML_OP_CUMSUM: if (src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32) { - if (src0->ne[0] <= 512) { - return ctx->device->pipeline_cumsum_small_f32; - } else { - return ctx->device->pipeline_cumsum_f32; - } + return ctx->device->pipeline_cumsum_f32; } return nullptr; case GGML_OP_SOLVE_TRI: @@ -9395,20 +9088,10 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co elements = { num_groups * (uint32_t)src0->ne[3], 1, 1 }; } break; case GGML_OP_DIAG_MASK_INF: - elements = { (uint32_t)ggml_nrows(src0), (uint32_t)ne00, 1 }; - break; case GGML_OP_ROPE: case GGML_OP_ROPE_BACK: - { - uint32_t nrows = (uint32_t)ggml_nrows(src0); - uint32_t z = 1; - if (nrows > ctx->device->properties.limits.maxComputeWorkGroupCount[0]) { - z = CEIL_DIV(nrows, 32768); - nrows = 32768; - } - elements = { nrows, (uint32_t)ne00, z }; - - } break; + elements = { (uint32_t)ggml_nrows(src0), (uint32_t)ne00, 1 }; + break; case GGML_OP_GET_ROWS: elements = { (uint32_t)ne00, (uint32_t)ne10, (uint32_t)(ne11 * ne12) }; elements[1] = std::min(elements[1], ctx->device->properties.limits.maxComputeWorkGroupCount[1]); @@ -9973,9 +9656,8 @@ static void ggml_vk_ssm_scan(ggml_backend_vk_context * ctx, vk_context& subctx, std::array elements; - const uint32_t d_state = src0->ne[0]; - uint32_t num_subgroups = d_state / ctx->device->subgroup_size; - const uint32_t num_workgroups_x = CEIL_DIV(n_head * head_dim, num_subgroups); + const int splitH = 16; + const uint32_t num_workgroups_x = CEIL_DIV(n_head * head_dim, splitH); const uint32_t num_workgroups_y = n_seq; elements = { num_workgroups_x, num_workgroups_y, 1 }; @@ -10337,7 +10019,7 @@ static vk_op_rope_push_constants ggml_vk_make_rope_constants(const ggml_tensor * uint32_t nb02 = src0->nb[2] / ggml_type_size(src0->type); vk_op_rope_push_constants rope { - (uint32_t)mode, (uint32_t)src0->ne[0], (uint32_t)ggml_nrows(src0), (uint32_t)n_dims, freq_scale, (uint32_t)src0->ne[1], + (uint32_t)mode, (uint32_t)src0->ne[0], (uint32_t)n_dims, freq_scale, (uint32_t)src0->ne[1], freq_base, ext_factor, attn_factor, {corr_dims[0], corr_dims[1]}, theta_scale, has_ff, (uint32_t)src0->ne[2], nb01, nb02, { sections[0], sections[1], sections[2], sections[3] }, is_imrope, backprop, set_rows_stride, @@ -10611,16 +10293,14 @@ static void ggml_vk_soft_max_back(ggml_backend_vk_context * ctx, vk_context& sub } static void ggml_vk_topk_moe(ggml_backend_vk_context * ctx, vk_context& subctx, ggml_cgraph * cgraph, int node_idx) { - topk_moe_mode mode = ctx->fused_topk_moe_mode; + topk_moe_mode mode = ggml_vk_num_additional_ops_to_topk_moe_mode(ctx->num_additional_fused_ops); ggml_tensor * logits = cgraph->nodes[node_idx + 0]->src[0]; - ggml_tensor * bias = (mode == TOPK_MOE_SIGMOID_NORM_BIAS) ? cgraph->nodes[node_idx + 2]->src[1] : logits; - ggml_tensor * weights = cgraph->nodes[node_idx + ctx->num_additional_fused_ops]; - ggml_tensor * ids = (mode == TOPK_MOE_SIGMOID_NORM_BIAS) ? cgraph->nodes[node_idx + 4] : - (mode == TOPK_MOE_LATE_SOFTMAX) ? cgraph->nodes[node_idx + 1] : - cgraph->nodes[node_idx + 3]; + ggml_tensor * weights = (mode == TOPK_MOE_EARLY_SOFTMAX_NORM) ? cgraph->nodes[node_idx + 9] : + (mode == TOPK_MOE_EARLY_SOFTMAX) ? cgraph->nodes[node_idx + 4] : + cgraph->nodes[node_idx + 5]; + ggml_tensor * ids = (mode == TOPK_MOE_LATE_SOFTMAX) ? cgraph->nodes[node_idx + 1] : cgraph->nodes[node_idx + 3]; GGML_ASSERT(logits->type == GGML_TYPE_F32); - GGML_ASSERT(bias->type == GGML_TYPE_F32); GGML_ASSERT(weights->type == GGML_TYPE_F32); GGML_ASSERT(ids->type == GGML_TYPE_I32); @@ -10635,7 +10315,6 @@ static void ggml_vk_topk_moe(ggml_backend_vk_context * ctx, vk_context& subctx, ggml_pipeline_request_descriptor_sets(ctx, pipeline, 1); vk_subbuffer logits_buf = ggml_vk_tensor_subbuffer(ctx, logits); - vk_subbuffer bias_buf = ggml_vk_tensor_subbuffer(ctx, bias); vk_subbuffer weights_buf = ggml_vk_tensor_subbuffer(ctx, weights); vk_subbuffer ids_buf = ggml_vk_tensor_subbuffer(ctx, ids); @@ -10643,45 +10322,18 @@ static void ggml_vk_topk_moe(ggml_backend_vk_context * ctx, vk_context& subctx, pc.n_rows = n_rows; pc.n_experts_push = n_experts; pc.n_expert_used = n_expert_used; - pc.clamp_min = -std::numeric_limits::infinity(); - pc.clamp_max = std::numeric_limits::infinity(); if (mode == TOPK_MOE_EARLY_SOFTMAX_NORM) { ggml_tensor * clamp = cgraph->nodes[node_idx + 7]; - GGML_ASSERT(clamp->op == GGML_OP_CLAMP); pc.clamp_min = ggml_get_op_params_f32(clamp, 0); pc.clamp_max = ggml_get_op_params_f32(clamp, 1); } - if (mode == TOPK_MOE_SIGMOID_NORM_BIAS) { - ggml_tensor * clamp = cgraph->nodes[node_idx + 8]; - GGML_ASSERT(clamp->op == GGML_OP_CLAMP); - pc.clamp_min = ggml_get_op_params_f32(clamp, 0); - pc.clamp_max = ggml_get_op_params_f32(clamp, 1); - } - -#define GATING_FUNC_SOFTMAX 0 -#define GATING_FUNC_SIGMOID 1 -#define GATING_FUNC_SOFTMAX_WEIGHT 2 - - pc.gating_func = mode == TOPK_MOE_SIGMOID_NORM_BIAS ? GATING_FUNC_SIGMOID : - mode == TOPK_MOE_LATE_SOFTMAX ? GATING_FUNC_SOFTMAX_WEIGHT : - GATING_FUNC_SOFTMAX; - pc.has_bias = mode == TOPK_MOE_SIGMOID_NORM_BIAS; - pc.with_norm = mode == TOPK_MOE_EARLY_SOFTMAX_NORM || mode == TOPK_MOE_SIGMOID_NORM_BIAS; - if (ctx->fused_topk_moe_scale) { - GGML_ASSERT(weights->op == GGML_OP_SCALE); - pc.output_scale = ggml_get_op_params_f32(weights, 0); - pc.output_bias = ggml_get_op_params_f32(weights, 1); - } else { - pc.output_scale = 1.0f; - pc.output_bias = 0.0f; - } GGML_ASSERT(n_expert_used <= n_experts); const uint32_t rows_per_block = 4; std::array elements = { CEIL_DIV(n_rows, rows_per_block), 1, 1 }; - ggml_vk_dispatch_pipeline(ctx, subctx, pipeline, {logits_buf, bias_buf, weights_buf, ids_buf}, pc, elements); + ggml_vk_dispatch_pipeline(ctx, subctx, pipeline, {logits_buf, weights_buf, ids_buf}, pc, elements); } static void ggml_vk_rope(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_cgraph * cgraph, int node_idx, bool backprop) { @@ -10929,50 +10581,8 @@ static void ggml_vk_mean(ggml_backend_vk_context * ctx, vk_context& subctx, cons } static void ggml_vk_cumsum(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst) { - vk_op_sum_rows_push_constants pc = vk_op_sum_rows_push_constants_init(src0, dst, src0->ne[0]); - // Use the single pass shader when the rows are small or there are enough rows to fill the GPU. - // For fewer, larger rows, use the multipass shader to spread each row across SMs. - if (dst->ne[0] <= 4096 || ggml_nrows(dst) >= ctx->device->shader_core_count) { - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_CUMSUM, pc); - return; - } - - // First pass computes partial sums within a block, and stores the last partial - // to the temp buffer. Second pass sums the block partials from the temp buffer - // and adds that to the result of the first pass. - vk_pipeline pipeline1 = ctx->device->pipeline_cumsum_multipass1_f32; - vk_pipeline pipeline2 = ctx->device->pipeline_cumsum_multipass2_f32; - GGML_ASSERT(pipeline1 != nullptr && pipeline2 != nullptr); - - ggml_pipeline_request_descriptor_sets(ctx, pipeline1, 1); - ggml_pipeline_request_descriptor_sets(ctx, pipeline2, 1); - - std::array elements; - - elements[0] = dst->ne[0]; - elements[1] = (uint32_t)ggml_nrows(dst); - elements[2] = 1; - - size_t temp_size = sizeof(float) * elements[0] * ggml_nrows(dst); - - if (ctx->prealloc_size_split_k < temp_size) { - ctx->prealloc_size_split_k = temp_size; - ggml_vk_preallocate_buffers(ctx, subctx); - } - - vk_subbuffer src_buf = ggml_vk_tensor_subbuffer(ctx, src0); - vk_subbuffer dst_buf = ggml_vk_tensor_subbuffer(ctx, dst); - vk_subbuffer temp_buf = ggml_vk_subbuffer(ctx, ctx->prealloc_split_k, 0); - - if (ctx->prealloc_split_k_need_sync) { - ggml_vk_sync_buffers(ctx, subctx); - } - - ggml_vk_dispatch_pipeline(ctx, subctx, pipeline1, {src_buf, dst_buf, temp_buf}, pc, elements); - ggml_vk_sync_buffers(ctx, subctx); - ggml_vk_dispatch_pipeline(ctx, subctx, pipeline2, {src_buf, dst_buf, temp_buf}, pc, elements); - - ctx->prealloc_split_k_need_sync = true; + vk_op_sum_rows_push_constants p = vk_op_sum_rows_push_constants_init(src0, dst, src0->ne[0]); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_CUMSUM, p); } static void ggml_vk_argmax(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst) { @@ -12465,11 +12075,6 @@ static bool ggml_vk_build_graph(ggml_backend_vk_context * ctx, ggml_cgraph * cgr break; case GGML_OP_UNARY: - if (ctx->fused_topk_moe_mode != TOPK_MOE_COUNT) { - ggml_vk_topk_moe(ctx, compute_ctx, cgraph, node_idx); - break; - } - switch (ggml_get_unary_op(node)) { case GGML_UNARY_OP_EXP: case GGML_UNARY_OP_SILU: @@ -12517,7 +12122,7 @@ static bool ggml_vk_build_graph(ggml_backend_vk_context * ctx, ggml_cgraph * cgr break; case GGML_OP_SOFT_MAX: - if (ctx->fused_topk_moe_mode != TOPK_MOE_COUNT) { + if (ctx->num_additional_fused_ops) { ggml_vk_topk_moe(ctx, compute_ctx, cgraph, node_idx); } else { ggml_vk_soft_max(ctx, compute_ctx, src0, src1, src2, node); @@ -12537,7 +12142,7 @@ static bool ggml_vk_build_graph(ggml_backend_vk_context * ctx, ggml_cgraph * cgr break; case GGML_OP_ARGSORT: - if (ctx->fused_topk_moe_mode != TOPK_MOE_COUNT) { + if (ctx->num_additional_fused_ops) { ggml_vk_topk_moe(ctx, compute_ctx, cgraph, node_idx); } else { ggml_vk_argsort(ctx, compute_ctx, src0, node); @@ -13390,24 +12995,6 @@ static bool ggml_vk_can_fuse_topk_moe(ggml_backend_vk_context * ctx, const struc get_rows = cgraph->nodes[node_idx + 4]; argsort = cgraph->nodes[node_idx + 2]; break; - case TOPK_MOE_SIGMOID_NORM_BIAS: - softmax = cgraph->nodes[node_idx + 0]; // really sigmoid - weights = cgraph->nodes[node_idx + 10]; - get_rows = cgraph->nodes[node_idx + 5]; - argsort = cgraph->nodes[node_idx + 3]; - if (ggml_get_unary_op(softmax) != GGML_UNARY_OP_SIGMOID) { - return false; - } - // bias is expected to be 1D - if (ggml_nrows(cgraph->nodes[node_idx + 2]->src[1]) != 1 || - !ggml_is_contiguous(cgraph->nodes[node_idx + 2]->src[1])) { - return false; - } - // sigmoid fusion seems to generate infinities on moltenvk - if (ctx->device->driver_id == vk::DriverId::eMoltenvk) { - return false; - } - break; case TOPK_MOE_EARLY_SOFTMAX: softmax = cgraph->nodes[node_idx + 0]; weights = cgraph->nodes[node_idx + 4]; @@ -13431,28 +13018,26 @@ static bool ggml_vk_can_fuse_topk_moe(ggml_backend_vk_context * ctx, const struc probs = probs->src[0]; ggml_tensor * selection_probs = argsort->src[0]; - if (probs != selection_probs && mode != TOPK_MOE_SIGMOID_NORM_BIAS) { + if (probs != selection_probs) { return false; } + const float * op_params = (const float *)softmax->op_params; + + float scale = op_params[0]; + float max_bias = op_params[1]; + if (!ggml_is_contiguous(softmax->src[0]) || !ggml_is_contiguous(weights)) { return false; } - if (softmax->op == GGML_OP_SOFT_MAX) { - const float * op_params = (const float *)softmax->op_params; + if (scale != 1.0f || max_bias != 0.0f) { + return false; + } - float scale = op_params[0]; - float max_bias = op_params[1]; - - if (scale != 1.0f || max_bias != 0.0f) { - return false; - } - - // don't fuse when masks or sinks are present - if (softmax->src[1] || softmax->src[2]) { - return false; - } + // don't fuse when masks or sinks are present + if (softmax->src[1] || softmax->src[2]) { + return false; } const int n_expert = softmax->ne[0]; @@ -13725,8 +13310,6 @@ static ggml_status ggml_backend_vk_graph_compute(ggml_backend_t backend, ggml_cg total_mul_mat_bytes += bytes; } - ctx->fused_topk_moe_mode = TOPK_MOE_COUNT; - ctx->fused_topk_moe_scale = false; const char *fusion_string {}; if (!ctx->device->disable_fusion) { uint32_t num_adds = ggml_vk_fuse_multi_add(ctx, cgraph, i); @@ -13772,23 +13355,13 @@ static ggml_status ggml_backend_vk_graph_compute(ggml_backend_t backend, ggml_cg ctx->num_additional_fused_ops = topk_moe_early_softmax_norm.size() - 1; // view of argsort writes to memory ctx->fused_ops_write_mask |= 1 << 3; - ctx->fused_topk_moe_mode = TOPK_MOE_EARLY_SOFTMAX_NORM; fusion_string = "TOPK_MOE_EARLY_SOFTMAX_NORM"; - } else if (ggml_can_fuse_subgraph(cgraph, i, topk_moe_sigmoid_norm_bias, { i + 4, i + 10 }) && - ggml_check_edges(cgraph, i, topk_moe_sigmoid_norm_bias_edges) && - ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, TOPK_MOE_SIGMOID_NORM_BIAS)) { - ctx->num_additional_fused_ops = topk_moe_sigmoid_norm_bias.size() - 1; - // view of argsort writes to memory - ctx->fused_ops_write_mask |= 1 << 4; - ctx->fused_topk_moe_mode = TOPK_MOE_SIGMOID_NORM_BIAS; - fusion_string = "TOPK_MOE_SIGMOID_NORM_BIAS"; } else if (ggml_can_fuse_subgraph(cgraph, i, topk_moe_early_softmax, { i + 3, i + 4 }) && ggml_check_edges(cgraph, i, topk_moe_early_softmax_edges) && ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, TOPK_MOE_EARLY_SOFTMAX)) { ctx->num_additional_fused_ops = topk_moe_early_softmax.size() - 1; // view of argsort writes to memory ctx->fused_ops_write_mask |= 1 << 3; - ctx->fused_topk_moe_mode = TOPK_MOE_EARLY_SOFTMAX; fusion_string = "TOPK_MOE_EARLY_SOFTMAX"; } else if (ggml_can_fuse_subgraph(cgraph, i, topk_moe_late_softmax, { i + 1, i + 5 }) && ggml_check_edges(cgraph, i, topk_moe_late_softmax_edges) && @@ -13796,17 +13369,8 @@ static ggml_status ggml_backend_vk_graph_compute(ggml_backend_t backend, ggml_cg ctx->num_additional_fused_ops = topk_moe_late_softmax.size() - 1; // view of argsort writes to memory ctx->fused_ops_write_mask |= 1 << 1; - ctx->fused_topk_moe_mode = TOPK_MOE_LATE_SOFTMAX; fusion_string = "TOPK_MOE_LATE_SOFTMAX"; } - if (ctx->fused_topk_moe_mode != TOPK_MOE_COUNT) { - // Look for an additional scale op to fuse - occurs in deepseek2 and nemotron3 nano. - if (ggml_can_fuse_subgraph(cgraph, i + ctx->num_additional_fused_ops - 1, { GGML_OP_DIV, GGML_OP_RESHAPE, GGML_OP_SCALE }, { i + ctx->num_additional_fused_ops + 1 }) || - ggml_can_fuse_subgraph(cgraph, i + ctx->num_additional_fused_ops, { GGML_OP_GET_ROWS, GGML_OP_SCALE }, { i + ctx->num_additional_fused_ops + 1 })) { - ctx->fused_topk_moe_scale = true; - ctx->num_additional_fused_ops++; - } - } } ctx->fused_ops_write_mask |= 1 << ctx->num_additional_fused_ops; @@ -13985,9 +13549,6 @@ static void ggml_vk_graph_optimize(ggml_backend_t backend, struct ggml_cgraph * if (keep_pattern(topk_moe_early_softmax_norm)) { continue; } - if (keep_pattern(topk_moe_sigmoid_norm_bias)) { - continue; - } if (keep_pattern(topk_moe_early_softmax)) { continue; } @@ -14014,7 +13575,6 @@ static void ggml_vk_graph_optimize(ggml_backend_t backend, struct ggml_cgraph * } // Don't pull forward nodes from fusion patterns if (match_pattern(topk_moe_early_softmax_norm, j) || - match_pattern(topk_moe_sigmoid_norm_bias, j) || match_pattern(topk_moe_early_softmax, j) || match_pattern(topk_moe_late_softmax, j)) { continue; @@ -14156,7 +13716,6 @@ static void ggml_vk_graph_optimize(ggml_backend_t backend, struct ggml_cgraph * } static void ggml_backend_vk_event_record(ggml_backend_t backend, ggml_backend_event_t event) { - VK_LOG_DEBUG("ggml_backend_vk_event_record(backend=" << backend << ", event=" << event << ")"); ggml_backend_vk_context * ctx = (ggml_backend_vk_context *)backend->context; vk_event *vkev = (vk_event *)event->context; @@ -14186,7 +13745,6 @@ static void ggml_backend_vk_event_record(ggml_backend_t backend, ggml_backend_ev } static void ggml_backend_vk_event_wait(ggml_backend_t backend, ggml_backend_event_t event) { - VK_LOG_DEBUG("ggml_backend_vk_event_wait(backend=" << backend << ", event=" << event << ")"); ggml_backend_vk_context * ctx = (ggml_backend_vk_context *)backend->context; vk_event *vkev = (vk_event *)event->context; @@ -14202,8 +13760,6 @@ static void ggml_backend_vk_event_wait(ggml_backend_t backend, ggml_backend_even } ggml_vk_wait_events(transfer_ctx, {vkev->event}); - ggml_vk_ctx_end(transfer_ctx); - ctx->transfer_ctx.reset(); } // TODO: enable async and synchronize @@ -14353,7 +13909,6 @@ struct ggml_backend_vk_device_context { std::string description; bool is_integrated_gpu; std::string pci_bus_id; - int op_offload_min_batch_size; }; static const char * ggml_backend_vk_device_get_name(ggml_backend_dev_t dev) { @@ -14410,35 +13965,6 @@ static ggml_backend_t ggml_backend_vk_device_init(ggml_backend_dev_t dev, const } static bool ggml_backend_vk_device_supports_op(ggml_backend_dev_t dev, const ggml_tensor * op) { - ggml_backend_vk_device_context * ctx = (ggml_backend_vk_device_context *)dev->context; - const vk_device& device = ggml_vk_get_device(ctx->device); - - const bool uses_bda = (op->op == GGML_OP_IM2COL || op->op == GGML_OP_IM2COL_3D) && - device->shader_int64 && device->buffer_device_address; - - auto const & tensor_size_supported = [&](size_t tensor_size) { - if (tensor_size > device->max_buffer_size) { - return false; - } - // For im2col shaders using BDA, maxStorageBufferRange limit doesn't apply. - // If shader64BitIndexing is enabled, maxStorageBufferRange limit doesn't apply. - if (!uses_bda && !device->shader_64b_indexing) { - if (tensor_size > device->properties.limits.maxStorageBufferRange) { - return false; - } - } - return true; - }; - // reject any tensors larger than the max buffer size - for (int i = 0; i < GGML_MAX_SRC; i++) { - if (op->src[i] && !tensor_size_supported(ggml_nbytes(op->src[i]))) { - return false; - } - } - if (!tensor_size_supported(ggml_nbytes(op))) { - return false; - } - switch (op->op) { case GGML_OP_UNARY: switch (ggml_get_unary_op(op)) { @@ -14487,6 +14013,8 @@ static bool ggml_backend_vk_device_supports_op(ggml_backend_dev_t dev, const ggm case GGML_OP_MUL_MAT_ID: { ggml_type src0_type = op->src[0]->type; + ggml_backend_vk_device_context * ctx = (ggml_backend_vk_device_context *)dev->context; + const vk_device& device = ggml_vk_get_device(ctx->device); if (op->op == GGML_OP_MUL_MAT_ID) { if (!device->mul_mat_id_s[src0_type] && !device->mul_mat_id_m[src0_type] && !device->mul_mat_id_l[src0_type]) { // If there's not enough shared memory for row_ids and the result tile, fallback to CPU @@ -14547,6 +14075,8 @@ static bool ggml_backend_vk_device_supports_op(ggml_backend_dev_t dev, const ggm } case GGML_OP_FLASH_ATTN_EXT: { + ggml_backend_vk_device_context * ctx = (ggml_backend_vk_device_context *)dev->context; + auto device = ggml_vk_get_device(ctx->device); bool coopmat2 = device->coopmat2; uint32_t HSK = op->src[1]->ne[0]; uint32_t HSV = op->src[2]->ne[0]; @@ -14768,6 +14298,8 @@ static bool ggml_backend_vk_device_supports_op(ggml_backend_dev_t dev, const ggm if (!ggml_is_contiguous(op) || !ggml_is_contiguous(op->src[0])) { return false; } + ggml_backend_vk_device_context * ctx = (ggml_backend_vk_device_context *)dev->context; + auto device = ggml_vk_get_device(ctx->device); // pipeline_argsort_large_f32 requires vulkan memory model. if (device->vulkan_memory_model) { return true; @@ -14780,6 +14312,8 @@ static bool ggml_backend_vk_device_supports_op(ggml_backend_dev_t dev, const ggm if (!ggml_is_contiguous(op) || !ggml_is_contiguous(op->src[0])) { return false; } + ggml_backend_vk_device_context * ctx = (ggml_backend_vk_device_context *)dev->context; + auto device = ggml_vk_get_device(ctx->device); // We could potentially support larger, using argsort to sort the // whole thing. Not clear if this is needed. uint32_t min_pipeline = (uint32_t)log2f(float(op->ne[0])) + 1; @@ -14790,12 +14324,7 @@ static bool ggml_backend_vk_device_supports_op(ggml_backend_dev_t dev, const ggm } return true; case GGML_OP_UPSCALE: - if (op->op_params[0] & GGML_SCALE_FLAG_ANTIALIAS) { - if ((op->op_params[0] & 0xFF) != GGML_SCALE_MODE_BILINEAR) { - return false; - } - } - return op->src[0]->type == GGML_TYPE_F32; + return op->src[0]->type == GGML_TYPE_F32 && !(op->op_params[0] & GGML_SCALE_FLAG_ANTIALIAS); case GGML_OP_ACC: return op->src[0]->type == GGML_TYPE_F32; case GGML_OP_CONCAT: @@ -14826,6 +14355,8 @@ static bool ggml_backend_vk_device_supports_op(ggml_backend_dev_t dev, const ggm return op->src[0]->type == GGML_TYPE_F32 && ggml_is_contiguous_rows(op->src[0]); case GGML_OP_CUMSUM: { + ggml_backend_vk_device_context * ctx = (ggml_backend_vk_device_context *)dev->context; + auto device = ggml_vk_get_device(ctx->device); if (device->subgroup_arithmetic && device->subgroup_require_full_support) { return op->src[0]->type == GGML_TYPE_F32 && ggml_is_contiguous_rows(op->src[0]); } @@ -14833,6 +14364,9 @@ static bool ggml_backend_vk_device_supports_op(ggml_backend_dev_t dev, const ggm } case GGML_OP_SOLVE_TRI: { + ggml_backend_vk_device_context * ctx = (ggml_backend_vk_device_context *)dev->context; + const vk_device& device = ggml_vk_get_device(ctx->device); + if (op->type != GGML_TYPE_F32 || op->src[0]->type != GGML_TYPE_F32) { return false; } @@ -14897,13 +14431,14 @@ static bool ggml_backend_vk_device_supports_op(ggml_backend_dev_t dev, const ggm return false; } - size_t shmem_size = d_state * sizeof(float); + ggml_backend_vk_device_context * ctx = (ggml_backend_vk_device_context *)dev->context; + const vk_device& device = ggml_vk_get_device(ctx->device); - if (shmem_size > device->properties.limits.maxComputeSharedMemorySize) { - return false; - } + const uint32_t SPLIT_H = 16; - if (!device->subgroup_basic) { + size_t stateC_size = SPLIT_H * d_state * sizeof(float); + + if (stateC_size > device->properties.limits.maxComputeSharedMemorySize) { return false; } @@ -14943,10 +14478,12 @@ static bool ggml_backend_vk_device_supports_buft(ggml_backend_dev_t dev, ggml_ba } static bool ggml_backend_vk_device_offload_op(ggml_backend_dev_t dev, const ggml_tensor * op) { - ggml_backend_vk_device_context * dev_ctx = (ggml_backend_vk_device_context *)dev->context; + const int min_batch_size = 32; - return (op->ne[1] >= dev_ctx->op_offload_min_batch_size && op->op != GGML_OP_GET_ROWS) || - (op->ne[2] >= dev_ctx->op_offload_min_batch_size && op->op == GGML_OP_MUL_MAT_ID); + return (op->ne[1] >= min_batch_size && op->op != GGML_OP_GET_ROWS) || + (op->ne[2] >= min_batch_size && op->op == GGML_OP_MUL_MAT_ID); + + UNUSED(dev); } static ggml_backend_event_t ggml_backend_vk_device_event_new(ggml_backend_dev_t dev) { @@ -14982,7 +14519,6 @@ static void ggml_backend_vk_device_event_free(ggml_backend_dev_t dev, ggml_backe } static void ggml_backend_vk_device_event_synchronize(ggml_backend_dev_t dev, ggml_backend_event_t event) { - VK_LOG_DEBUG("ggml_backend_vk_device_event_synchronize(backend=" << dev << ", event=" << event << ")"); ggml_backend_vk_device_context * ctx = (ggml_backend_vk_device_context *)dev->context; auto device = ggml_vk_get_device(ctx->device); vk_event *vkev = (vk_event *)event->context; @@ -14990,51 +14526,6 @@ static void ggml_backend_vk_device_event_synchronize(ggml_backend_dev_t dev, ggm VK_CHECK(device->device.waitForFences({ vkev->fence }, true, UINT64_MAX), "event_synchronize"); } -static vk_buffer ggml_vk_buffer_from_host_ptr(vk_device & device, void * ptr, size_t size) { - if (!device->external_memory_host) { - return {}; - } - - uintptr_t uptr = reinterpret_cast(ptr); - if (uptr & (device->min_imported_host_pointer_alignment - 1)) { - return {}; - } - if (size & (device->min_imported_host_pointer_alignment - 1)) { - return {}; - } - - const vk::MemoryPropertyFlags property_flags = vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostCached; - - vk_buffer buf {}; - try { - buf = ggml_vk_create_buffer(device, size, { property_flags }, ptr); - } catch (vk::SystemError& e) { - GGML_LOG_WARN("ggml_vulkan: Failed ggml_vk_create_buffer (%s)\n", e.what()); - } - - return buf; -} - -static ggml_backend_buffer_t ggml_backend_vk_device_buffer_from_host_ptr(ggml_backend_dev_t dev, void * ptr, size_t size, size_t max_tensor_size) { - VK_LOG_DEBUG("ggml_backend_vk_device_buffer_from_host_ptr(backend=" << dev << ", ptr=" << ptr << ", size=" << size << ")"); - GGML_UNUSED(max_tensor_size); - - ggml_backend_vk_device_context * ctx = (ggml_backend_vk_device_context *)dev->context; - auto device = ggml_vk_get_device(ctx->device); - - vk_buffer buf = ggml_vk_buffer_from_host_ptr(device, ptr, size); - - if (!buf) { - return {}; - } - - ggml_backend_vk_buffer_context * bufctx = new ggml_backend_vk_buffer_context(device, std::move(buf), device->name); - - ggml_backend_buffer_t ret = ggml_backend_buffer_init(ggml_backend_vk_device_get_buffer_type(dev), ggml_backend_vk_buffer_interface, bufctx, size); - - return ret; -} - static const struct ggml_backend_device_i ggml_backend_vk_device_i = { /* .get_name = */ ggml_backend_vk_device_get_name, /* .get_description = */ ggml_backend_vk_device_get_description, @@ -15044,7 +14535,7 @@ static const struct ggml_backend_device_i ggml_backend_vk_device_i = { /* .init_backend = */ ggml_backend_vk_device_init, /* .get_buffer_type = */ ggml_backend_vk_device_get_buffer_type, /* .get_host_buffer_type = */ ggml_backend_vk_device_get_host_buffer_type, - /* .buffer_from_host_ptr = */ ggml_backend_vk_device_buffer_from_host_ptr, + /* .buffer_from_host_ptr = */ NULL, /* .supports_op = */ ggml_backend_vk_device_supports_op, /* .supports_buft = */ ggml_backend_vk_device_supports_buft, /* .offload_op = */ ggml_backend_vk_device_offload_op, @@ -15072,7 +14563,6 @@ static ggml_backend_dev_t ggml_backend_vk_reg_get_device(ggml_backend_reg_t reg, static std::mutex mutex; std::lock_guard lock(mutex); if (!initialized) { - const int min_batch_size = getenv("GGML_OP_OFFLOAD_MIN_BATCH") ? atoi(getenv("GGML_OP_OFFLOAD_MIN_BATCH")) : 32; for (int i = 0; i < ggml_backend_vk_get_device_count(); i++) { ggml_backend_vk_device_context * ctx = new ggml_backend_vk_device_context; char desc[256]; @@ -15082,7 +14572,6 @@ static ggml_backend_dev_t ggml_backend_vk_reg_get_device(ggml_backend_reg_t reg, ctx->description = desc; ctx->is_integrated_gpu = ggml_backend_vk_get_device_type(i) == vk::PhysicalDeviceType::eIntegratedGpu; ctx->pci_bus_id = ggml_backend_vk_get_device_pci_id(i); - ctx->op_offload_min_batch_size = min_batch_size; devices.push_back(new ggml_backend_device { /* .iface = */ ggml_backend_vk_device_i, /* .reg = */ reg, diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/count_experts.comp b/ggml/src/ggml-vulkan/vulkan-shaders/count_experts.comp deleted file mode 100644 index ffc8608..0000000 --- a/ggml/src/ggml-vulkan/vulkan-shaders/count_experts.comp +++ /dev/null @@ -1,51 +0,0 @@ -#version 450 - -#extension GL_EXT_control_flow_attributes : enable - -#include "types.glsl" - -layout (push_constant) uniform parameter -{ - uint32_t ne00; - uint32_t ne01; - uint32_t nb00; - uint32_t nb01; - uint32_t a_offset; -} p; - -#define BLOCK_SIZE 256 - -layout(local_size_x = BLOCK_SIZE, local_size_y = 1, local_size_z = 1) in; - -layout (binding = 0) readonly buffer A {uint data_a[];}; -layout (binding = 1) writeonly buffer D {uint data_d[];}; - -shared uint vals[BLOCK_SIZE]; - -void main() { - const uint expert_id = gl_WorkGroupID.x; - const uint num_elements = p.ne00 * p.ne01; - const uint tid = gl_LocalInvocationID.x; - - uint count = 0; - for (uint idx = tid; idx < num_elements; idx += BLOCK_SIZE) { - const uint i01 = idx / p.ne00; - const uint i00 = idx % p.ne00; - const uint a = data_a[p.a_offset + i01 * p.nb01 + i00 * p.nb00]; - - count += uint(a == expert_id); - } - - vals[tid] = count; - barrier(); - [[unroll]] for (uint s = BLOCK_SIZE / 2; s > 0; s >>= 1) { - if (tid < s) { - vals[tid] += vals[tid + s]; - } - barrier(); - } - - if (tid == 0) { - data_d[expert_id] = vals[0]; - } -} diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/cumsum.comp b/ggml/src/ggml-vulkan/vulkan-shaders/cumsum.comp index 75e3c3b..a4c8fc3 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/cumsum.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/cumsum.comp @@ -14,7 +14,6 @@ layout (binding = 1) writeonly buffer D {D_TYPE data_d[];}; layout (constant_id = 0) const uint BLOCK_SIZE = 128; layout (constant_id = 1) const uint SUBGROUP_SIZE = 32; -layout (constant_id = 2) const uint ELEM_PER_THREAD = 4; #define CEIL_DIV(a, b) (((a) + (b) - 1) / (b)) @@ -39,45 +38,32 @@ void main() { last_sum = 0; } - uint col = tid * ELEM_PER_THREAD; - uint num_iter = CEIL_DIV(p.n_cols, BLOCK_SIZE * ELEM_PER_THREAD); + uint col = tid; + uint num_iter = CEIL_DIV(p.n_cols, BLOCK_SIZE); for (int i = 0; i < num_iter; ++i) { - FLOAT_TYPE v[ELEM_PER_THREAD]; - FLOAT_TYPE thread_sum = 0; - [[unroll]] for (uint j = 0; j < ELEM_PER_THREAD; ++j) { - if (col + j < p.n_cols) { - thread_sum += FLOAT_TYPE(data_a[src_idx + col + j]); - } - v[j] = thread_sum; + FLOAT_TYPE v = 0; + if (col < p.n_cols) { + v = FLOAT_TYPE(data_a[src_idx + col]); } + v = subgroupInclusiveAdd(v); - thread_sum = subgroupExclusiveAdd(thread_sum); - [[unroll]] for (uint j = 0; j < ELEM_PER_THREAD; ++j) { - v[j] += thread_sum; - } // Store the largest partial sum for each subgroup, then add the partials for all // lower subgroups and the final partial sum from the previous iteration. if (gl_SubgroupInvocationID == SUBGROUP_SIZE - 1) { - partial[subgroup_id] = v[ELEM_PER_THREAD - 1]; + partial[subgroup_id] = v; } barrier(); - for (int s = 0; s < subgroup_id; ++s) { - [[unroll]] for (uint j = 0; j < ELEM_PER_THREAD; ++j) { - v[j] += partial[s]; - } - } - [[unroll]] for (uint j = 0; j < ELEM_PER_THREAD; ++j) { - v[j] += last_sum; + for (int j = 0; j < subgroup_id; ++j) { + v += partial[j]; } + v += last_sum; barrier(); if (tid == BLOCK_SIZE - 1) { - last_sum = v[ELEM_PER_THREAD - 1]; + last_sum = v; } - [[unroll]] for (uint j = 0; j < ELEM_PER_THREAD; ++j) { - if (col + j < p.n_cols) { - data_d[dst_idx + col + j] = D_TYPE(v[j]); - } + if (col < p.n_cols) { + data_d[dst_idx + col] = D_TYPE(v); } - col += BLOCK_SIZE * ELEM_PER_THREAD; + col += BLOCK_SIZE; } } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/cumsum_multipass1.comp b/ggml/src/ggml-vulkan/vulkan-shaders/cumsum_multipass1.comp deleted file mode 100644 index 6d39f92..0000000 --- a/ggml/src/ggml-vulkan/vulkan-shaders/cumsum_multipass1.comp +++ /dev/null @@ -1,60 +0,0 @@ -#version 450 - -#include "types.glsl" -#include "sum_rows.glsl" - -#extension GL_EXT_control_flow_attributes : enable -#extension GL_KHR_shader_subgroup_arithmetic : enable -#extension GL_KHR_shader_subgroup_basic : enable - -layout(local_size_x_id = 0, local_size_y = 1, local_size_z = 1) in; - -layout (binding = 0) readonly buffer A {A_TYPE data_a[];}; -layout (binding = 1) writeonly buffer D {D_TYPE data_d[];}; -layout (binding = 2) writeonly buffer T {D_TYPE data_t[];}; - -layout (constant_id = 0) const uint BLOCK_SIZE = 128; -layout (constant_id = 1) const uint SUBGROUP_SIZE = 32; - -#define CEIL_DIV(a, b) (((a) + (b) - 1) / (b)) - -shared FLOAT_TYPE partial[BLOCK_SIZE / SUBGROUP_SIZE]; - -void main() { - const uint row = gl_WorkGroupID.y; - const uint tid = gl_LocalInvocationID.x; - const uint col = gl_GlobalInvocationID.x; - - const uint i03 = fastdiv(row, p.ne0_12mp, p.ne0_12L); - const uint i03_offset = i03 * p.ne01*p.ne02; - const uint i02 = fastdiv(row - i03_offset, p.ne0_1mp, p.ne0_1L); - const uint i01 = row - i03_offset - i02*p.ne01; - - const uint src_idx = get_aoffset() + i01 * p.nb01 + i02 * p.nb02 + i03 * p.nb03; - const uint dst_idx = get_doffset() + i01 * p.nb11 + i02 * p.nb12 + i03 * p.nb13; - - uint subgroup_id = tid / SUBGROUP_SIZE; - - FLOAT_TYPE v = 0; - if (col < p.n_cols) { - v = FLOAT_TYPE(data_a[src_idx + col]); - } - v = subgroupInclusiveAdd(v); - - // Store the largest partial sum for each subgroup, then add the partials for all - // lower subgroups and the final partial sum from the previous iteration. - if (gl_SubgroupInvocationID == SUBGROUP_SIZE - 1) { - partial[subgroup_id] = v; - } - barrier(); - for (int j = 0; j < subgroup_id; ++j) { - v += partial[j]; - } - barrier(); - if (tid == BLOCK_SIZE - 1) { - data_t[gl_WorkGroupID.x + gl_NumWorkGroups.x * row] = v; - } - if (col < p.n_cols) { - data_d[dst_idx + col] = D_TYPE(v); - } -} diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/cumsum_multipass2.comp b/ggml/src/ggml-vulkan/vulkan-shaders/cumsum_multipass2.comp deleted file mode 100644 index e401893..0000000 --- a/ggml/src/ggml-vulkan/vulkan-shaders/cumsum_multipass2.comp +++ /dev/null @@ -1,66 +0,0 @@ -#version 450 - -#include "types.glsl" -#include "sum_rows.glsl" - -#extension GL_EXT_control_flow_attributes : enable -#extension GL_KHR_shader_subgroup_arithmetic : enable -#extension GL_KHR_shader_subgroup_basic : enable - -layout(local_size_x_id = 0, local_size_y = 1, local_size_z = 1) in; - -layout (binding = 0) readonly buffer A {A_TYPE data_a[];}; -layout (binding = 1) buffer D {D_TYPE data_d[];}; -layout (binding = 2) readonly buffer T {D_TYPE data_t[];}; - -layout (constant_id = 0) const uint BLOCK_SIZE = 128; -layout (constant_id = 1) const uint SUBGROUP_SIZE = 32; - -#define CEIL_DIV(a, b) (((a) + (b) - 1) / (b)) - -shared FLOAT_TYPE temp[BLOCK_SIZE / SUBGROUP_SIZE]; - -void main() { - const uint row = gl_WorkGroupID.y; - const uint tid = gl_LocalInvocationID.x; - - const uint i03 = fastdiv(row, p.ne0_12mp, p.ne0_12L); - const uint i03_offset = i03 * p.ne01*p.ne02; - const uint i02 = fastdiv(row - i03_offset, p.ne0_1mp, p.ne0_1L); - const uint i01 = row - i03_offset - i02*p.ne01; - - const uint src_idx = get_aoffset() + i01 * p.nb01 + i02 * p.nb02 + i03 * p.nb03; - const uint dst_idx = get_doffset() + i01 * p.nb11 + i02 * p.nb12 + i03 * p.nb13; - - const uint col = gl_GlobalInvocationID.x; - - float v = 0; - // prefetch value we're adding to - if (col < p.n_cols) { - v = data_d[dst_idx + col]; - } - - // compute the sum of all previous blocks - uint c = tid; - float sum = 0; - while (c < gl_WorkGroupID.x) { - sum += data_t[c + gl_NumWorkGroups.x * row]; - c += BLOCK_SIZE; - } - - sum = subgroupAdd(sum); - if (gl_SubgroupInvocationID == 0) { - temp[gl_SubgroupID] = sum; - } - barrier(); - sum = 0; - [[unroll]] for (uint s = 0; s < BLOCK_SIZE / SUBGROUP_SIZE; ++s) { - sum += temp[s]; - } - - // Add the sum to what the first pass computed - if (col < p.n_cols) { - data_d[dst_idx + col] = v + sum; - } -} - diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.glsl index 7865a6b..70ee542 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.glsl @@ -401,7 +401,13 @@ vec4 dequantize4(uint ib, uint iqs, uint a_offset) { const uint sl = (data_a[a_offset + ib].scales_l[ib32/2] >> (4 * (ib32 & 1))) & 0xF; const uint sh = (data_a[a_offset + ib].scales_h >> (2 * ib32)) & 3; const uint qshift = (iqs & 16) >> 2; - const u8vec4 qs = unpack8((data_a_packed32[a_offset + ib].qs[iq/4] >> qshift) & 0x0F0F0F0F); + u8vec4 qs = u8vec4( + data_a[a_offset + ib].qs[iq + 0], + data_a[a_offset + ib].qs[iq + 1], + data_a[a_offset + ib].qs[iq + 2], + data_a[a_offset + ib].qs[iq + 3] + ); + qs = (qs >> qshift) & uint8_t(0xF); const float dl = float(int(sl | (sh << 4)) - 32); return dl * vec4( @@ -462,8 +468,7 @@ vec2 get_dm(uint ib, uint a_offset) { #if defined(DATA_A_Q4_1) || defined(DATA_A_Q5_1) vec2 get_dm(uint ib, uint a_offset) { - const vec2 dm = vec2(data_a_packed32[a_offset + ib].dm); - return dm; + return vec2(float(data_a[a_offset + ib].d), float(data_a[a_offset + ib].m)); } #endif diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec.comp index 2271be4..b3c9657 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec.comp @@ -87,6 +87,7 @@ void compute_outputs(const uint32_t first_row, const uint32_t num_rows) { const uint tid = gl_LocalInvocationID.x; get_offsets(a_offset, b_offset, d_offset); + a_offset /= QUANT_K; y_offset = QUANT_R == 1 ? 1 : QUANT_K/2; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_base.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_base.glsl index dfb7865..cfc8b0c 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_base.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_base.glsl @@ -65,9 +65,9 @@ void get_offsets(out uint a_offset, out uint b_offset, out uint d_offset) { a_offset = #ifdef MUL_MAT_ID - expert_id * (p.batch_stride_a / QUANT_K); + expert_id * p.batch_stride_a; #else - batch_idx_a * (p.batch_stride_a / QUANT_K); + batch_idx_a * p.batch_stride_a; #endif b_offset = #ifdef MUL_MAT_ID diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq1_m.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq1_m.comp index 3ea24a7..e5cc7ff 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq1_m.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq1_m.comp @@ -11,7 +11,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint ib32, const uint num_blocks_per_row, const uint first_row, const uint num_rows) { // Compute starting index in matrix B for this superblock const uint y_idx = i * QUANT_K + 32 * ib32; - uint ibi = a_offset + first_row * num_blocks_per_row + i; + uint ibi = a_offset / QUANT_K + first_row * num_blocks_per_row + i; // Precompute indices for quantization lookup tables const uint qh_base = 2 * ib32; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq1_s.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq1_s.comp index fd953c8..c5f5e9c 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq1_s.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq1_s.comp @@ -17,7 +17,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint ib32, const vec4 b_val_1 = vec4(data_b_v4[base_b_idx + 2 * l + 1]); // index for data_a - uint ibi = a_offset + first_row * num_blocks_per_row + i; + uint ibi = a_offset / QUANT_K + first_row * num_blocks_per_row + i; [[unroll]] for (uint n = 0; n < num_rows; ++n) { const float d = float(data_a[ibi].d); diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq2_s.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq2_s.comp index b4f6d1d..e424af1 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq2_s.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq2_s.comp @@ -12,7 +12,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint itid, const uint nibble_shift = 4 * (itid & 1); const uint ib32 = itid / 2; // 0..7 - uint ibi = a_offset + first_row * num_blocks_per_row + i; + uint ibi = a_offset / QUANT_K + first_row * num_blocks_per_row + i; [[unroll]] for (uint n = 0; n < num_rows; ++n) { const float d = float(data_a[ibi].d); const uint scale = (data_a[ibi].scales[ib32] >> nibble_shift) & 0xF; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq2_xs.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq2_xs.comp index d8dafe5..7ec2e04 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq2_xs.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq2_xs.comp @@ -11,7 +11,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint itid, const uint y_idx = i * QUANT_K + 16 * itid; const uint nibble_shift = 4 * (itid & 1); const uint ib32 = itid / 2; // 0..7 - uint ibi = a_offset + first_row * num_blocks_per_row + i; + uint ibi = a_offset / QUANT_K + first_row * num_blocks_per_row + i; // Precompute db multiplication factors float db_vals[NUM_ROWS]; [[unroll]] for (uint n = 0; n < num_rows; ++n) { @@ -22,7 +22,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint itid, db_vals[n] = d * (0.125f + float(scale) * 0.25f); ibi += num_blocks_per_row; } - ibi = a_offset + first_row * num_blocks_per_row + i; + ibi = a_offset / QUANT_K + first_row * num_blocks_per_row + i; [[unroll]] for (uint n = 0; n < num_rows; ++n) { // Preload grid and sign data for all l values vec4 grid0_vals[2], grid1_vals[2]; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq2_xxs.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq2_xxs.comp index f75dcf8..71bd72d 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq2_xxs.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq2_xxs.comp @@ -11,7 +11,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint itid, const uint y_idx = i * QUANT_K + 16 * itid; const uint ib32 = itid / 2; // 0..7 - uint ibi = a_offset + first_row * num_blocks_per_row + i; + uint ibi = a_offset / QUANT_K + first_row * num_blocks_per_row + i; [[unroll]] for (uint n = 0; n < num_rows; ++n) { const float d = float(data_a[ibi].d); const uint signscale = pack32(u16vec2( diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq3_s.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq3_s.comp index 5cdf2a8..a4b9ab1 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq3_s.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq3_s.comp @@ -10,7 +10,7 @@ FLOAT_TYPE temp[NUM_COLS][NUM_ROWS]; void calc_superblock(const uint a_offset, const uint b_offset, const uint ib32, const uint i, const uint num_blocks_per_row, const uint first_row, const uint num_rows) { const uint y_idx = i * QUANT_K + 32 * ib32; - uint ibi = a_offset + first_row * num_blocks_per_row + i; + uint ibi = a_offset / QUANT_K + first_row * num_blocks_per_row + i; [[unroll]] for (uint n = 0; n < num_rows; ++n) { const float d = float(data_a[ibi].d); const uint scale = (data_a[ibi].scales[ib32/2] >> (4 * (ib32 & 1))) & 0xF; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq3_xxs.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq3_xxs.comp index a888981..40849c6 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq3_xxs.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iq3_xxs.comp @@ -11,7 +11,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint itid, const uint y_idx = i * QUANT_K + 16 * itid; const uint ib32 = itid / 2; // 0..7 - uint ibi = a_offset + first_row * num_blocks_per_row + i; + uint ibi = a_offset / QUANT_K + first_row * num_blocks_per_row + i; [[unroll]] for (uint n = 0; n < num_rows; ++n) { const float d = float(data_a[ibi].d); const uint signscale = pack32(u16vec2( diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q2_k.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q2_k.comp index 619de05..14093c0 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q2_k.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q2_k.comp @@ -15,7 +15,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint itid, const uint y_idx = i * QUANT_K + y_offset; [[unroll]] for (uint n = 0; n < num_rows; ++n) { - const uint ib0 = a_offset + (first_row+n)*num_blocks_per_row; + const uint ib0 = a_offset / QUANT_K + (first_row+n)*num_blocks_per_row; csel ^= 1; if (!all_threads) { // when we don't have enough blocks to use all threads diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q3_k.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q3_k.comp index 93e48b7..528f224 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q3_k.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q3_k.comp @@ -14,7 +14,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint ix, co const uint y_idx = i * QUANT_K + y_offset; [[unroll]] for (uint n = 0; n < num_rows; ++n) { - const uint ib0 = a_offset + (first_row+n)*num_blocks_per_row; + const uint ib0 = a_offset / QUANT_K + (first_row+n)*num_blocks_per_row; csel ^= 1; if (!all_threads) { // when we don't have enough blocks to use all threads diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q4_k.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q4_k.comp index 6af5a81..49d91ad 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q4_k.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q4_k.comp @@ -13,7 +13,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint v_im, const uint y2_idx = y1_idx + 128; [[unroll]] for (uint n = 0; n < num_rows; ++n) { - const uint ib0 = a_offset + (first_row+n)*num_blocks_per_row; + const uint ib0 = a_offset / QUANT_K + (first_row+n)*num_blocks_per_row; const FLOAT_TYPE_VEC2 dm = FLOAT_TYPE_VEC2(data_a[ib0 + i].dm); const uint32_t scale0_u32 = data_a_packed16[ib0 + i].scales[v_im ]; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q5_k.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q5_k.comp index 3695b47..0d61b49 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q5_k.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q5_k.comp @@ -13,7 +13,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint v_im, const uint y2_idx = y1_idx + 128; [[unroll]] for (uint n = 0; n < num_rows; ++n) { - const uint ib0 = a_offset + (first_row+n)*num_blocks_per_row; + const uint ib0 = a_offset / QUANT_K + (first_row+n)*num_blocks_per_row; const FLOAT_TYPE_VEC2 dm = FLOAT_TYPE_VEC2(data_a[ib0 + i].dm); const uint32_t scale0_u32 = data_a_packed16[ib0 + i].scales[v_im ]; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q6_k.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q6_k.comp index 3e89d91..d7a7f64 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q6_k.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q6_k.comp @@ -15,7 +15,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint itid, const uint y_idx = i * QUANT_K + y_offset; [[unroll]] for (uint n = 0; n < num_rows; ++n) { - const uint ib0 = a_offset + (first_row+n)*num_blocks_per_row; + const uint ib0 = a_offset / QUANT_K + (first_row+n)*num_blocks_per_row; csel ^= 1; if (!all_threads) { // when we don't have enough blocks to use all threads diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq.comp index 6fe3e2d..15f005b 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq.comp @@ -14,8 +14,6 @@ layout(local_size_x_id = 0, local_size_y = 1, local_size_z = 1) in; #define K_PER_ITER 8 #elif defined(DATA_A_QUANT_K) #define K_PER_ITER 16 -#elif defined(DATA_A_IQ1_S) || defined(DATA_A_IQ1_M) -#define K_PER_ITER 32 #else #error unimplemented #endif @@ -51,15 +49,6 @@ void iter(inout FLOAT_TYPE temp[NUM_COLS][NUM_ROWS], const uint first_row, const cache_b_qs[1] = data_b[b_block_idx_outer].qs[b_block_idx_inner * 8 + b_qs_idx * 4 + 1]; cache_b_qs[2] = data_b[b_block_idx_outer].qs[b_block_idx_inner * 8 + b_qs_idx * 4 + 2]; cache_b_qs[3] = data_b[b_block_idx_outer].qs[b_block_idx_inner * 8 + b_qs_idx * 4 + 3]; -#elif K_PER_ITER == 32 - cache_b_qs[0] = data_b[b_block_idx_outer].qs[b_block_idx_inner * 8 ]; - cache_b_qs[1] = data_b[b_block_idx_outer].qs[b_block_idx_inner * 8 + 1]; - cache_b_qs[2] = data_b[b_block_idx_outer].qs[b_block_idx_inner * 8 + 2]; - cache_b_qs[3] = data_b[b_block_idx_outer].qs[b_block_idx_inner * 8 + 3]; - cache_b_qs[4] = data_b[b_block_idx_outer].qs[b_block_idx_inner * 8 + 4]; - cache_b_qs[5] = data_b[b_block_idx_outer].qs[b_block_idx_inner * 8 + 5]; - cache_b_qs[6] = data_b[b_block_idx_outer].qs[b_block_idx_inner * 8 + 6]; - cache_b_qs[7] = data_b[b_block_idx_outer].qs[b_block_idx_inner * 8 + 7]; #else #error unimplemented #endif @@ -79,7 +68,7 @@ void compute_outputs(const uint32_t first_row, const uint32_t num_rows) { const uint tid = gl_LocalInvocationID.x; get_offsets(a_offset, b_offset, d_offset); - a_offset *= QUANT_K / QUANT_K_Q8_1; + a_offset /= QUANT_K_Q8_1; b_offset /= QUANT_K_Q8_1; FLOAT_TYPE temp[NUM_COLS][NUM_ROWS]; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq_funcs.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq_funcs.glsl index 6ddbed3..2389ea0 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq_funcs.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq_funcs.glsl @@ -377,118 +377,3 @@ FLOAT_TYPE mmvq_dot_product(const uint ib_a, const uint iqs) { return FLOAT_TYPE(float(cache_b_ds.x) * float(d_scale) * float(q_sum)); } #endif - -#if defined(DATA_A_IQ1_S) -void repack8(uint ib, uint iqs, out i32vec4 out0, out i32vec4 out1) { - const uint ib32 = iqs / 32; - - const uint qh = data_a[ib].qh[ib32]; - - const uint qs16_0 = data_a_packed16[ib].qs[(4 * ib32 + 0) / 2]; - const uint qs16_1 = data_a_packed16[ib].qs[(4 * ib32 + 2) / 2]; - - const uint qs0 = qs16_0 & 0xFF; - const uint qs1 = qs16_0 >> 8; - const uint qs2 = qs16_1 & 0xFF; - const uint qs3 = qs16_1 >> 8; - - const uint hi0 = bitfieldExtract(qh, 3 * int(0), 3); - const uint hi1 = bitfieldExtract(qh, 3 * int(1), 3); - const uint hi2 = bitfieldExtract(qh, 3 * int(2), 3); - const uint hi3 = bitfieldExtract(qh, 3 * int(3), 3); - - const int32_t grid0 = int32_t(iq1s_grid_gpu[qs0 | (hi0 << 8)]); - const int32_t grid1 = int32_t(iq1s_grid_gpu[qs1 | (hi1 << 8)]); - const int32_t grid2 = int32_t(iq1s_grid_gpu[qs2 | (hi2 << 8)]); - const int32_t grid3 = int32_t(iq1s_grid_gpu[qs3 | (hi3 << 8)]); - - out0 = i32vec4((grid0 >> 0) & 0x0F0F0F0F, - (grid0 >> 4) & 0x0F0F0F0F, - (grid1 >> 0) & 0x0F0F0F0F, - (grid1 >> 4) & 0x0F0F0F0F); - out1 = i32vec4((grid2 >> 0) & 0x0F0F0F0F, - (grid2 >> 4) & 0x0F0F0F0F, - (grid3 >> 0) & 0x0F0F0F0F, - (grid3 >> 4) & 0x0F0F0F0F); -} - -vec2 get_dm(uint ib, uint iqs) { - const uint ib32 = iqs / 32; - - const uint qh = data_a[ib].qh[ib32]; - const float delta = ((qh & 0x8000) != 0) ? -IQ1S_DELTA : IQ1S_DELTA; - - const float d = float(data_a[ib].d); - const float dl = d * float(2 * bitfieldExtract(qh, 12, 3) + 1); - - // the -1 cancels out the bias in iq1s_grid_gpu - return FLOAT_TYPE_VEC2(dl, dl * (delta - 1)); -} - -FLOAT_TYPE mmvq_dot_product(const uint ib_a, const uint iqs) { - int32_t q_sum = 0; - - const uint ib_k = ib_a / 8; - const uint iqs_k = (ib_a % 8) * 32 + iqs * 32; - - i32vec4 qs_a0; - i32vec4 qs_a1; - repack8(ib_k, iqs_k, qs_a0, qs_a1); - - const vec2 dm = get_dm(ib_k, iqs_k); - - q_sum += dotPacked4x8EXT(qs_a0.x, cache_b_qs[0]); - q_sum += dotPacked4x8EXT(qs_a0.y, cache_b_qs[1]); - q_sum += dotPacked4x8EXT(qs_a0.z, cache_b_qs[2]); - q_sum += dotPacked4x8EXT(qs_a0.w, cache_b_qs[3]); - q_sum += dotPacked4x8EXT(qs_a1.x, cache_b_qs[4]); - q_sum += dotPacked4x8EXT(qs_a1.y, cache_b_qs[5]); - q_sum += dotPacked4x8EXT(qs_a1.z, cache_b_qs[6]); - q_sum += dotPacked4x8EXT(qs_a1.w, cache_b_qs[7]); - - return FLOAT_TYPE(float(cache_b_ds.x) * float(dm.x) * float(q_sum) + float(dm.y) * float(cache_b_ds.y)); -} -#endif - -#if defined(DATA_A_IQ1_M) -FLOAT_TYPE mmvq_dot_product(const uint ib_a, const uint iqs) { - const uint ib_k = ib_a / 8; - const uint iqs_k = (ib_a % 8) * 32 + iqs * 32; - - const uint ib32 = iqs_k / 32; - const uint ib64 = ib32 / 2; - - const uint16_t[4] scales = data_a[ib_k].scales; - const u16vec4 s = u16vec4(scales[0], scales[1], scales[2], scales[3]) >> 12; - const float d = float(unpackHalf2x16(s.x | (s.y << 4) | (s.z << 8) | (s.w << 12)).x); - - const uint qs32 = data_a_packed32[ib_k].qs[ib32]; - const uint qh16 = data_a_packed16[ib_k].qh[ib32]; - - float sum = 0; - const uint sc = data_a[ib_k].scales[ib64]; - [[unroll]] for (int l = 0; l < 4; ++l) { - const uint ib16 = 2 * ib32 + l / 2; - const float dl = d * (2 * bitfieldExtract(sc, 3 * int(ib16 & 3), 3) + 1); - const uint qh = qh16 >> (4 * l); - const uint qs = (qs32 >> (8 * l)) & 0xFF; - const float delta = ((qh & 8) != 0) ? -IQ1M_DELTA : IQ1M_DELTA; - - const int32_t grid = int32_t(iq1s_grid_gpu[qs | ((qh & 7) << 8)]); - - int32_t q_sum = 0; - q_sum += dotPacked4x8EXT((grid >> 0) & 0x0F0F0F0F, cache_b_qs[2 * l + 0]); - q_sum += dotPacked4x8EXT((grid >> 4) & 0x0F0F0F0F, cache_b_qs[2 * l + 1]); - - int32_t y_sum = 0; - y_sum += dotPacked4x8EXT(int(0x01010101), cache_b_qs[2 * l + 0]); - y_sum += dotPacked4x8EXT(int(0x01010101), cache_b_qs[2 * l + 1]); - - // the -1 cancels out the bias in iq1s_grid_gpu - sum += dl * (q_sum + y_sum * (delta - 1)); - } - sum *= float(cache_b_ds.x); - - return sum; -} -#endif diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp index 775e9a7..5c5251d 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp @@ -68,7 +68,6 @@ layout (binding = 2) writeonly buffer D {D_TYPE data_d[];}; #ifdef MUL_MAT_ID layout (binding = 3) readonly buffer IDS {int data_ids[];}; -layout (binding = 4) readonly buffer Counts {int data_expert_count[];}; #endif layout (push_constant) uniform parameter @@ -136,19 +135,13 @@ shared ACC_TYPE coopmat_stage[TM * TN * NUM_WARPS]; #include "mul_mm_funcs.glsl" void main() { - const uint ic = gl_WorkGroupID.y; - -#ifdef MUL_MAT_ID - const uint expert_idx = gl_GlobalInvocationID.z; - if (ic * BN >= data_expert_count[expert_idx]) { - return; - } -#endif #ifdef NEEDS_INIT_IQ_SHMEM init_iq_shmem(gl_WorkGroupSize); #endif -#ifndef MUL_MAT_ID +#ifdef MUL_MAT_ID + const uint expert_idx = gl_GlobalInvocationID.z; +#else const uint batch_idx = gl_GlobalInvocationID.z; const uint i13 = batch_idx / p.ne12; @@ -163,6 +156,7 @@ void main() { const uint blocks_m = (p.M + BM - 1) / BM; const uint ir = gl_WorkGroupID.x % blocks_m; const uint ik = gl_WorkGroupID.x / blocks_m; + const uint ic = gl_WorkGroupID.y; const uint WNITER = (WM * WN) / (WARP * TM * TN * WMITER); const uint WSUBM = WM / WMITER; @@ -234,13 +228,13 @@ void main() { const uint end_k = min(p.K, (ik + 1) * p.k_split); #endif - uint pos_a = + uint pos_a = ( #ifdef MUL_MAT_ID - expert_idx * (p.batch_stride_a / LOAD_VEC_A) + + expert_idx * p.batch_stride_a + #else - batch_idx_a * (p.batch_stride_a / LOAD_VEC_A) + + batch_idx_a * p.batch_stride_a + #endif - (ir * BM * p.stride_a + start_k) / LOAD_VEC_A; + ir * BM * p.stride_a + start_k) / LOAD_VEC_A; #ifdef MUL_MAT_ID uint pos_b = 0; #else diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_cm2.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_cm2.comp index b6614d2..2e04baa 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_cm2.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_cm2.comp @@ -92,7 +92,6 @@ layout (binding = 2) writeonly buffer D {D_TYPE data_d[];}; #ifdef MUL_MAT_ID layout (binding = 3) readonly buffer IDS {int data_ids[];}; -layout (binding = 4) readonly buffer Counts {int data_expert_count[];}; shared u16vec4 row_ids[BN]; @@ -108,7 +107,11 @@ B_TYPE decodeFuncB(const in decodeBufB bl, const in uint blockCoords[2], const i { const uint row_i = blockCoords[0]; - const u16vec4 row_idx = row_ids[row_i]; + if (row_i >= _ne1) { + return B_TYPE(0.0); + } + + const u16vec4 row_idx = row_ids[row_i & (BN - 1)]; B_TYPE ret = data_b[row_idx.y * p.batch_stride_b + row_idx.x * p.stride_b + blockCoords[1]]; return ret; @@ -135,8 +138,6 @@ void load_row_ids(uint expert_idx, bool nei0_is_pow2, uint ic) { uint ids[16]; uint iter = 0; - uint expert_count = data_expert_count[expert_idx]; - for (uint j = 0; j < num_elements; j += BLOCK_SIZE) { // prefetch up to 16 elements if (iter == 0) { @@ -184,7 +185,7 @@ void load_row_ids(uint expert_idx, bool nei0_is_pow2, uint ic) { } _ne1 += total; iter &= 15; - if (_ne1 >= (ic + 1) * BN || _ne1 == expert_count) { + if (_ne1 >= (ic + 1) * BN) { break; } } @@ -193,28 +194,15 @@ void load_row_ids(uint expert_idx, bool nei0_is_pow2, uint ic) { #endif void main() { - const uint tid = gl_LocalInvocationIndex; - const uint ic = gl_WorkGroupID.y; - -#ifdef MUL_MAT_ID - const uint expert_idx = gl_GlobalInvocationID.z; - if (ic * BN >= data_expert_count[expert_idx]) { - return; - } - // initialize to row 0 so we don't need to bounds check - if (tid < BN) { - row_ids[tid] = u16vec4(0); - } -#if !defined(NEEDS_INIT_IQ_SHMEM) - barrier(); -#endif -#endif - #ifdef NEEDS_INIT_IQ_SHMEM init_iq_shmem(gl_WorkGroupSize); #endif -#ifndef MUL_MAT_ID + const uint tid = gl_LocalInvocationIndex; + +#ifdef MUL_MAT_ID + const uint expert_idx = gl_GlobalInvocationID.z; +#else const uint batch_idx = gl_GlobalInvocationID.z; const uint i13 = batch_idx / p.ne12; @@ -229,6 +217,7 @@ void main() { const uint blocks_m = (p.M + BM - 1) / BM; const uint ir = gl_WorkGroupID.x % blocks_m; const uint ik = gl_WorkGroupID.x / blocks_m; + const uint ic = gl_WorkGroupID.y; #ifdef MUL_MAT_ID if (bitCount(p.nei0) == 1) { @@ -250,10 +239,10 @@ void main() { #endif #ifdef MUL_MAT_ID - uint pos_a = expert_idx * (p.batch_stride_a / QUANT_K); + uint pos_a = (expert_idx * p.batch_stride_a) / QUANT_K; uint pos_b = 0; #else - uint pos_a = batch_idx_a * (p.batch_stride_a / QUANT_K); + uint pos_a = (batch_idx_a * p.batch_stride_a) / QUANT_K; uint pos_b = batch_idx * p.batch_stride_b; uint pos_d = batch_idx * p.batch_stride_d + ik * p.batch_stride_d * gl_NumWorkGroups.z; #endif @@ -493,7 +482,7 @@ void main() { coopmat mat_b; coopMatLoadTensorNV(mat_a, data_a, pos_a, sliceTensorLayoutNV(tensorLayoutA, ir * BM, BM, block_k, BK) DECODEFUNCA); - coopMatLoadTensorNV(mat_b, data_b, pos_b, sliceTensorLayoutNV(tensorLayoutB, 0, BNover4, block_k, BK), tensorViewTranspose, decodeFuncB); + coopMatLoadTensorNV(mat_b, data_b, pos_b, sliceTensorLayoutNV(tensorLayoutB, ic * BN, BNover4, block_k, BK), tensorViewTranspose, decodeFuncB); sum = coopMatMulAdd(mat_a, mat_b, sum); } else { @@ -501,7 +490,7 @@ void main() { coopmat mat_b; coopMatLoadTensorNV(mat_a, data_a, pos_a, sliceTensorLayoutNV(tensorLayoutAClamp, ir * BM, BM, block_k, BK) DECODEFUNCA); - coopMatLoadTensorNV(mat_b, data_b, pos_b, sliceTensorLayoutNV(tensorLayoutB, 0, BNover4, block_k, BK), tensorViewTranspose, decodeFuncB); + coopMatLoadTensorNV(mat_b, data_b, pos_b, sliceTensorLayoutNV(tensorLayoutB, ic * BN, BNover4, block_k, BK), tensorViewTranspose, decodeFuncB); sum = coopMatMulAdd(mat_a, mat_b, sum); } @@ -537,7 +526,7 @@ void main() { coopmat mat_b; coopMatLoadTensorNV(mat_a, data_a, pos_a, sliceTensorLayoutNV(tensorLayoutA, ir * BM, BM, block_k, BK) DECODEFUNCA); - coopMatLoadTensorNV(mat_b, data_b, pos_b, sliceTensorLayoutNV(tensorLayoutB, 0, BNover2, block_k, BK), tensorViewTranspose, decodeFuncB); + coopMatLoadTensorNV(mat_b, data_b, pos_b, sliceTensorLayoutNV(tensorLayoutB, ic * BN, BNover2, block_k, BK), tensorViewTranspose, decodeFuncB); sum = coopMatMulAdd(mat_a, mat_b, sum); } else { @@ -545,7 +534,7 @@ void main() { coopmat mat_b; coopMatLoadTensorNV(mat_a, data_a, pos_a, sliceTensorLayoutNV(tensorLayoutAClamp, ir * BM, BM, block_k, BK) DECODEFUNCA); - coopMatLoadTensorNV(mat_b, data_b, pos_b, sliceTensorLayoutNV(tensorLayoutB, 0, BNover2, block_k, BK), tensorViewTranspose, decodeFuncB); + coopMatLoadTensorNV(mat_b, data_b, pos_b, sliceTensorLayoutNV(tensorLayoutB, ic * BN, BNover2, block_k, BK), tensorViewTranspose, decodeFuncB); sum = coopMatMulAdd(mat_a, mat_b, sum); } @@ -582,7 +571,7 @@ void main() { coopMatLoadTensorNV(mat_a, data_a, pos_a, sliceTensorLayoutNV(tensorLayoutA, ir * BM, BM, block_k, BK) DECODEFUNCA); #ifdef MUL_MAT_ID - coopMatLoadTensorNV(mat_b, data_b, pos_b, sliceTensorLayoutNV(tensorLayoutB, 0, BN, block_k, BK), tensorViewTranspose, decodeFuncB); + coopMatLoadTensorNV(mat_b, data_b, pos_b, sliceTensorLayoutNV(tensorLayoutB, ic * BN, BN, block_k, BK), tensorViewTranspose, decodeFuncB); #else coopMatLoadTensorNV(mat_b, data_b, pos_b, sliceTensorLayoutNV(tensorLayoutBClamp, ic * BN, BN, block_k, BK), tensorViewTranspose); #endif @@ -594,7 +583,7 @@ void main() { coopMatLoadTensorNV(mat_a, data_a, pos_a, sliceTensorLayoutNV(tensorLayoutAClamp, ir * BM, BM, block_k, BK) DECODEFUNCA); #ifdef MUL_MAT_ID - coopMatLoadTensorNV(mat_b, data_b, pos_b, sliceTensorLayoutNV(tensorLayoutB, 0, BN, block_k, BK), tensorViewTranspose, decodeFuncB); + coopMatLoadTensorNV(mat_b, data_b, pos_b, sliceTensorLayoutNV(tensorLayoutB, ic * BN, BN, block_k, BK), tensorViewTranspose, decodeFuncB); #else coopMatLoadTensorNV(mat_b, data_b, pos_b, sliceTensorLayoutNV(tensorLayoutBClamp, ic * BN, BN, block_k, BK), tensorViewTranspose); #endif diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.glsl index ce7f2d6..58ede04 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.glsl @@ -47,7 +47,7 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin #endif #elif defined(DATA_A_Q4_0) const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row; - const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_A / 4; + const uint buf_idx = col * SHMEM_STRIDE + 2 * row; const uint ib = idx / 4; const uint iqs = idx & 0x03; @@ -63,15 +63,16 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin buf_a[buf_idx + 9] = FLOAT_TYPE_VEC2(v1.zw); #elif defined(DATA_A_Q4_1) const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row; - const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_A / 4; + const uint buf_idx = col * SHMEM_STRIDE + 2 * row; const uint ib = idx / 4; const uint iqs = idx & 0x03; - const vec2 dm = vec2(data_a_packed32[ib].dm); - const uint vui = data_a_packed32[ib].qs[iqs]; - const vec4 v0 = vec4(unpack8(vui & 0x0F0F0F0F)) * dm.x + dm.y; - const vec4 v1 = vec4(unpack8((vui >> 4) & 0x0F0F0F0F)) * dm.x + dm.y; + const float d = float(data_a_packed16[ib].d); + const float m = float(data_a_packed16[ib].m); + const uint vui = uint(data_a_packed16[ib].qs[2*iqs]) | (uint(data_a_packed16[ib].qs[2*iqs + 1]) << 16); + const vec4 v0 = vec4(unpack8(vui & 0x0F0F0F0F)) * d + m; + const vec4 v1 = vec4(unpack8((vui >> 4) & 0x0F0F0F0F)) * d + m; buf_a[buf_idx ] = FLOAT_TYPE_VEC2(v0.xy); buf_a[buf_idx + 1 ] = FLOAT_TYPE_VEC2(v0.zw); @@ -79,7 +80,7 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin buf_a[buf_idx + 9 ] = FLOAT_TYPE_VEC2(v1.zw); #elif defined(DATA_A_Q5_0) const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row; - const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_A / 4; + const uint buf_idx = col * SHMEM_STRIDE + row; const uint ib = idx / 8; const uint iqs = idx & 0x07; @@ -96,26 +97,22 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin buf_a[buf_idx + 8] = FLOAT_TYPE_VEC2(v.yw); #elif defined(DATA_A_Q5_1) const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row; - const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_A / 4; + const uint buf_idx = col * SHMEM_STRIDE + row; - const uint ib = idx / 4; - const uint iqs = idx & 0x03; + const uint ib = idx / 8; + const uint iqs = idx & 0x07; - const vec2 dm = vec2(data_a_packed32[ib].dm); - const uint uint_qh = data_a_packed32[ib].qh; - const uvec2 qh0 = uvec2(((uint_qh >> 4*iqs) << 4) & 0x10, (uint_qh >> (4*iqs + 12)) & 0x10); - const uvec2 qh1 = uvec2(((uint_qh >> (4*iqs + 1)) << 4) & 0x10, (uint_qh >> (4*iqs + 13)) & 0x10); - const uvec2 qh2 = uvec2(((uint_qh >> (4*iqs + 2)) << 4) & 0x10, (uint_qh >> (4*iqs + 14)) & 0x10); - const uvec2 qh3 = uvec2(((uint_qh >> (4*iqs + 3)) << 4) & 0x10, (uint_qh >> (4*iqs + 15)) & 0x10); + const float d = float(data_a_packed16[ib].d); + const float m = float(data_a_packed16[ib].m); + const uint uint_qh = data_a_packed16[ib].qh; + const ivec2 qh0 = ivec2(((uint_qh >> 2*iqs) << 4) & 0x10, (uint_qh >> (2*iqs + 12)) & 0x10); + const ivec2 qh1 = ivec2(((uint_qh >> (2*iqs + 1)) << 4) & 0x10, (uint_qh >> (2*iqs + 13)) & 0x10); - const uint vui = data_a_packed32[ib].qs[iqs]; - const vec4 v0 = vec4((vui & 0xF) | qh0.x, ((vui >> 4) & 0xF) | qh0.y, ((vui >> 8) & 0xF) | qh1.x, ((vui >> 12) & 0xF) | qh1.y) * dm.x + dm.y; - const vec4 v1 = vec4(((vui >> 16) & 0xF) | qh2.x, ((vui >> 20) & 0xF) | qh2.y, ((vui >> 24) & 0xF) | qh3.x, ((vui >> 28) & 0xF) | qh3.y) * dm.x + dm.y; + const uint vui = uint(data_a_packed16[ib].qs[iqs]); + const vec4 v = vec4((vui & 0xF) | qh0.x, ((vui >> 4) & 0xF) | qh0.y, ((vui >> 8) & 0xF) | qh1.x, (vui >> 12) | qh1.y) * d + m; - buf_a[buf_idx ] = FLOAT_TYPE_VEC2(v0.xz); - buf_a[buf_idx + 1] = FLOAT_TYPE_VEC2(v1.xz); - buf_a[buf_idx + 8] = FLOAT_TYPE_VEC2(v0.yw); - buf_a[buf_idx + 9] = FLOAT_TYPE_VEC2(v1.yw); + buf_a[buf_idx ] = FLOAT_TYPE_VEC2(v.xz); + buf_a[buf_idx + 8] = FLOAT_TYPE_VEC2(v.yw); #elif defined(DATA_A_Q8_0) const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row; const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_A / 2; @@ -134,21 +131,20 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row; const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_A / 2; - const uint ib = idx / 64; // 4 values per idx - const uint iqs = (idx % 64) * 2; // 0,2,4..126 + const uint ib = idx / 128; // 2 values per idx + const uint iqs = idx % 128; // 0..127 const uint qsi = (iqs / 64) * 16 + (iqs % 16); // 0..15 const uint scalesi = iqs / 8; // 0..15 const uint qsshift = ((iqs % 64) / 16) * 2; // 0,2,4,6 - const vec4 qs = vec4(unpack8((data_a_packed32[ib].qs[qsi / 2] >> qsshift) & 0x03030303)); + const uvec2 qs = uvec2(unpack8(data_a_packed16[ib].qs[qsi])); const uint scales = data_a[ib].scales[scalesi]; const vec2 dm = vec2(data_a[ib].dm); - const vec4 v = dm.x * float(scales & 0xF) * qs - dm.y * float(scales >> 4); + const vec2 v = dm.x * float(scales & 0xF) * vec2((qs >> qsshift) & 3) - dm.y * float(scales >> 4); - buf_a[buf_idx ] = FLOAT_TYPE_VEC2(v.xy); - buf_a[buf_idx + 1] = FLOAT_TYPE_VEC2(v.zw); + buf_a[buf_idx] = FLOAT_TYPE_VEC2(v.xy); #elif defined(DATA_A_Q3_K) const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row; const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_A / 2; @@ -163,22 +159,20 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin const uint is = iqs / 8; // 0..15 const uint halfsplit = ((iqs % 64) / 16); // 0,1,2,3 const uint qsshift = halfsplit * 2; // 0,2,4,6 + const uint m = 1 << (4 * n + halfsplit); // 1,2,4,8,16,32,64,128 const int8_t us = int8_t(((data_a[ib].scales[is % 8] >> (4 * int(is / 8))) & 0xF) | (((data_a[ib].scales[8 + (is % 4)] >> (2 * int(is / 4))) & 3) << 4)); const float dl = float(data_a[ib].d) * float(us - 32); - const vec2 qs = vec2(unpack8((uint(data_a_packed16[ib].qs[qsi / 2]) >> qsshift) & 0x0303).xy); - const vec2 hm = vec2(unpack8(((uint(data_a_packed16[ib].hmask[hmi / 2]) >> (4 * n + halfsplit)) & 0x0101 ^ 0x0101) << 2).xy); - - buf_a[buf_idx] = FLOAT_TYPE_VEC2(dl * (qs.x - hm.x), - dl * (qs.y - hm.y)); + buf_a[buf_idx] = FLOAT_TYPE_VEC2(dl * float(int8_t((data_a[ib].qs[qsi ] >> qsshift) & 3) - (((data_a[ib].hmask[hmi ] & m) != 0) ? 0 : 4)), + dl * float(int8_t((data_a[ib].qs[qsi + 1] >> qsshift) & 3) - (((data_a[ib].hmask[hmi + 1] & m) != 0) ? 0 : 4))); #elif defined(DATA_A_Q4_K) const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row; const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_A / 2; - const uint ib = idx / 64; // 4 values per idx - const uint iqs = (idx % 64) * 2; // 0,2,4..126 + const uint ib = idx / 128; // 2 values per idx + const uint iqs = idx % 128; // 0..127 const uint n = iqs / 32; // 0,1,2,3 const uint b = (iqs % 32) / 16; // 0,1 @@ -204,16 +198,14 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin const float d = loadd.x * sc; const float m = -loadd.y * mbyte; - const vec4 q = vec4(unpack8((data_a_packed32[ib].qs[qsi / 4] >> (b * 4)) & 0x0F0F0F0F)); - - buf_a[buf_idx ] = FLOAT_TYPE_VEC2(fma(d, q.x, m), fma(d, q.y, m)); - buf_a[buf_idx + 1] = FLOAT_TYPE_VEC2(fma(d, q.z, m), fma(d, q.w, m)); + buf_a[buf_idx] = FLOAT_TYPE_VEC2(fma(d, float((data_a[ib].qs[qsi ] >> (b * 4)) & 0xF), m), + fma(d, float((data_a[ib].qs[qsi + 1] >> (b * 4)) & 0xF), m)); #elif defined(DATA_A_Q5_K) const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row; const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_A / 2; - const uint ib = idx / 64; // 4 values per idx - const uint iqs = (idx % 64) * 2; // 0,2,4..126 + const uint ib = idx / 128; // 2 values per idx + const uint iqs = idx % 128; // 0..127 const uint n = iqs / 32; // 0,1,2,3 const uint b = (iqs % 32) / 16; // 0,1 @@ -221,6 +213,8 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin const uint qsi = n * 32 + (iqs % 16) * 2; // 0,2,4..126 const uint qhi = (iqs % 16) * 2; // 0,2,4..30 + const uint8_t hm = uint8_t(1 << (iqs / 16)); + const vec2 loadd = vec2(data_a[ib].dm); const uint scidx0 = (is < 4) ? is : (is + 4); @@ -240,12 +234,8 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin const float d = loadd.x * sc; const float m = -loadd.y * mbyte; - const uint qs = (data_a_packed32[ib].qs[qsi / 4] >> (b * 4)) & 0x0F0F0F0F; - const uint qh = ((data_a_packed32[ib].qh[qhi / 4] >> (iqs / 16)) & 0x01010101) << 4; - const vec4 q = vec4(unpack8(qs | qh)); - - buf_a[buf_idx ] = FLOAT_TYPE_VEC2(fma(d, q.x, m), fma(d, q.y, m)); - buf_a[buf_idx + 1] = FLOAT_TYPE_VEC2(fma(d, q.z, m), fma(d, q.w, m)); + buf_a[buf_idx] = FLOAT_TYPE_VEC2(fma(d, float((data_a[ib].qs[qsi ] >> (b * 4)) & 0xF) + float((data_a[ib].qh[qhi ] & hm) != 0 ? 16 : 0), m), + fma(d, float((data_a[ib].qs[qsi + 1] >> (b * 4)) & 0xF) + float((data_a[ib].qh[qhi + 1] & hm) != 0 ? 16 : 0), m)); #elif defined(DATA_A_Q6_K) const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row; const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_A / 2; @@ -404,9 +394,11 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin const float d = float(data_a[ib].d); const uint qs = data_a[ib].qs[iqs]; - const uint signs = pack32(u16vec2( - data_a_packed16[ib].qs[is/2], - data_a_packed16[ib].qs[is/2+1] + const uint signs = pack32(u8vec4( + data_a[ib].qs[is+0], + data_a[ib].qs[is+1], + data_a[ib].qs[is+2], + data_a[ib].qs[is+3] )); const float db = d * 0.5 * (0.5 + (signs >> 28)); const uint32_t sign7 = bitfieldExtract(signs, 7 * (int(iqs / 2) % 4), 7); @@ -451,7 +443,8 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin const uint sl = (data_a[ib].scales_l[ib32/2] >> (4 * (ib32 & 1))) & 0xF; const uint sh = ((data_a[ib].scales_h) >> (2 * ib32)) & 3; const uint qshift = (idx & 8) >> 1; - u8vec2 qs = unpack8((uint(data_a_packed16[ib].qs[iq/2]) >> qshift) & 0x0F0F).xy; + u8vec2 qs = u8vec2(data_a[ib].qs[iq], data_a[ib].qs[iq + 1]); + qs = (qs >> qshift) & uint8_t(0xF); const float d = float(data_a[ib].d); const vec2 v = d * float(int(sl | (sh << 4)) - 32) * vec2(kvalues_iq4nl[qs.x], kvalues_iq4nl[qs.y]); @@ -459,7 +452,7 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin buf_a[buf_idx ] = FLOAT_TYPE_VEC2(v.xy); #elif defined(DATA_A_IQ4_NL) const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row; - const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_A / 4; + const uint buf_idx = col * SHMEM_STRIDE + row; const uint ib = idx / 8; const uint iqs = idx & 0x07; @@ -473,7 +466,7 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin kvalues_iq4nl[vui >> 12]); #elif defined(DATA_A_MXFP4) const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row; - const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_A / 4; + const uint buf_idx = col * SHMEM_STRIDE + row; const uint ib = idx / 8; const uint iqs = (idx & 0x07) * 2; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_id_funcs.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_id_funcs.glsl index 743004f..1d0e84a 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_id_funcs.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_id_funcs.glsl @@ -13,8 +13,6 @@ void load_row_ids(uint expert_idx, bool nei0_is_pow2, uint ic) { uint ids[16]; uint iter = 0; - uint expert_count = data_expert_count[expert_idx]; - for (uint j = 0; j < num_elements; j += BLOCK_SIZE) { // prefetch up to 16 elements if (iter == 0) { @@ -62,7 +60,7 @@ void load_row_ids(uint expert_idx, bool nei0_is_pow2, uint ic) { } _ne1 += total; iter &= 15; - if (_ne1 >= (ic + 1) * BN || _ne1 == expert_count) { + if (_ne1 >= (ic + 1) * BN) { break; } } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq.comp index 335d7f6..dc8b3df 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq.comp @@ -35,7 +35,6 @@ layout (binding = 2) writeonly buffer D {D_TYPE data_d[];}; #ifdef MUL_MAT_ID layout (binding = 3) readonly buffer IDS {int data_ids[];}; -layout (binding = 4) readonly buffer Counts {int data_expert_count[];}; #endif layout (push_constant) uniform parameter @@ -105,19 +104,13 @@ block_b_cache cache_b; #include "mul_mmq_funcs.glsl" void main() { - const uint ic = gl_WorkGroupID.y; - -#ifdef MUL_MAT_ID - const uint expert_idx = gl_GlobalInvocationID.z; - if (ic * BN >= data_expert_count[expert_idx]) { - return; - } -#endif #ifdef NEEDS_INIT_IQ_SHMEM init_iq_shmem(gl_WorkGroupSize); #endif -#ifndef MUL_MAT_ID +#ifdef MUL_MAT_ID + const uint expert_idx = gl_GlobalInvocationID.z; +#else const uint batch_idx = gl_GlobalInvocationID.z; const uint i13 = batch_idx / p.ne12; @@ -132,6 +125,7 @@ void main() { const uint blocks_m = (p.M + BM - 1) / BM; const uint ir = gl_WorkGroupID.x % blocks_m; const uint ik = gl_WorkGroupID.x / blocks_m; + const uint ic = gl_WorkGroupID.y; const uint WNITER = (WM * WN) / (WARP * TM * TN * WMITER); const uint WSUBM = WM / WMITER; @@ -189,13 +183,13 @@ void main() { const uint end_k = min(p.K, (ik + 1) * p.k_split); #endif - uint pos_a_ib = + uint pos_a_ib = ( #ifdef MUL_MAT_ID - expert_idx * (p.batch_stride_a / BK) + + expert_idx * p.batch_stride_a + #else - batch_idx_a * (p.batch_stride_a / BK) + + batch_idx_a * p.batch_stride_a + #endif - (ir * BM * p.stride_a + start_k) / BK; + ir * BM * p.stride_a + start_k) / BK; #ifdef MUL_MAT_ID uint pos_b_ib = 0; #else diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_funcs.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_funcs.glsl index 9c297d1..7f32dad 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_funcs.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_funcs.glsl @@ -264,7 +264,7 @@ void block_a_to_shmem(const uint buf_ib, const uint ib, const uint iqs) { const i8vec2 scales = i8vec2(unpack8(uint32_t(((data_a_packed16[ib_k].scales[(is % 8 ) / 2] >> (4 * (is / 8))) & 0x0F0F) | (((data_a_packed16[ib_k].scales[(8 + (is % 4)) / 2] >> (2 * (is / 4))) & 0x0303) << 4))).xy); // vec4 used due to #12147 - buf_a[buf_ib].d_scales = FLOAT_TYPE_VEC2(float(data_a_packed16[ib_k].d) * vec2(scales - 32)); + buf_a[buf_ib].d_scales = FLOAT_TYPE(data_a_packed16[ib_k].d) * FLOAT_TYPE_VEC2(scales - 32); } } @@ -334,7 +334,7 @@ void block_a_to_shmem(const uint buf_ib, const uint ib, const uint iqs) { (data_a[ib_k].scales[is+4] >> 4) | ((data_a[ib_k].scales[is ] & 0xC0) >> 2)); } - buf_a[buf_ib].dm = FLOAT_TYPE_VEC2(vec2(data_a_packed32[ib_k].dm) * vec2(scale_dm)); + buf_a[buf_ib].dm = FLOAT_TYPE_VEC2(data_a_packed32[ib_k].dm) * FLOAT_TYPE_VEC2(scale_dm); } } @@ -385,7 +385,7 @@ void block_a_to_shmem(const uint buf_ib, const uint ib, const uint iqs) { const uint is = iqs_k / 4; const i8vec2 scales = unpack8(int32_t(data_a_packed16[ib_k].scales[is / 2])).xy; - buf_a[buf_ib].d_scales = FLOAT_TYPE_VEC2(float(data_a_packed16[ib_k].d) * vec2(scales)); + buf_a[buf_ib].d_scales = FLOAT_TYPE(data_a_packed16[ib_k].d) * FLOAT_TYPE_VEC2(scales); } } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/quantize_q8_1.comp b/ggml/src/ggml-vulkan/vulkan-shaders/quantize_q8_1.comp index 7ea29a0..20e45d0 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/quantize_q8_1.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/quantize_q8_1.comp @@ -15,7 +15,6 @@ layout (push_constant) uniform parameter { uint ne; - uint num_blocks; } p; #include "types.glsl" @@ -34,7 +33,8 @@ layout (binding = 1) writeonly buffer D {block_q8_1_x4 data_b[];}; shared float shmem[GROUP_SIZE]; #endif -void quantize(const uint wgid) { +void quantize() { + const uint wgid = gl_WorkGroupID.x; const uint tid = INVOCATION_ID; // Each thread handles a vec4, so 8 threads handle a block @@ -45,7 +45,11 @@ void quantize(const uint wgid) { const uint ib = wgid * blocks_per_group + block_in_wg; const uint iqs = tid % 8; -#ifdef QBLOCK_X4 +#ifndef QBLOCK_X4 + if (ib >= gl_NumWorkGroups.x * blocks_per_group) { + return; + } +#else const uint ibx4_outer = ib / 4; const uint ibx4_inner = ib % 4; @@ -119,9 +123,5 @@ void quantize(const uint wgid) { } void main() { - uint wgid = gl_WorkGroupID.x; - while (wgid < p.num_blocks) { - quantize(wgid); - wgid += gl_NumWorkGroups.x; - } + quantize(); } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/rope_multi.comp b/ggml/src/ggml-vulkan/vulkan-shaders/rope_multi.comp index f758746..7c1fb1c 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/rope_multi.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/rope_multi.comp @@ -6,9 +6,6 @@ void main() { const uint i0 = 2*gl_GlobalInvocationID.y; // i1 is actually i2*nb2+i1, but the rows are contiguous - const uint i1 = gl_GlobalInvocationID.x + 32768 * gl_GlobalInvocationID.z; - if (i1 >= pc.nrows) { - return; - } + const uint i1 = gl_GlobalInvocationID.x; rope_multi(i0, i1, pc); } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/rope_neox.comp b/ggml/src/ggml-vulkan/vulkan-shaders/rope_neox.comp index acb8ed7..68f00c1 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/rope_neox.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/rope_neox.comp @@ -6,9 +6,6 @@ void main() { const uint i0 = 2*gl_GlobalInvocationID.y; // i1 is actually i2*nb2+i1, but the rows are contiguous - const uint i1 = gl_GlobalInvocationID.x + 32768 * gl_GlobalInvocationID.z; - if (i1 >= pc.nrows) { - return; - } + const uint i1 = gl_GlobalInvocationID.x; rope_neox(i0, i1, pc); } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/rope_norm.comp b/ggml/src/ggml-vulkan/vulkan-shaders/rope_norm.comp index 0033cdb..28a939e 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/rope_norm.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/rope_norm.comp @@ -6,9 +6,6 @@ void main() { const uint i0 = 2*gl_GlobalInvocationID.y; // i1 is actually i2*nb2+i1, but the rows are contiguous - const uint i1 = gl_GlobalInvocationID.x + 32768 * gl_GlobalInvocationID.z; - if (i1 >= pc.nrows) { - return; - } + const uint i1 = gl_GlobalInvocationID.x; rope_norm(i0, i1, pc); } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/rope_params.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/rope_params.glsl index 939cf3c..82f39ce 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/rope_params.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/rope_params.glsl @@ -6,7 +6,6 @@ struct rope_params { uint rope_mode; uint ncols; - uint nrows; uint n_dims; float freq_scale; uint p_delta_rows; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/rope_vision.comp b/ggml/src/ggml-vulkan/vulkan-shaders/rope_vision.comp index d93800b..ea1e0fd 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/rope_vision.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/rope_vision.comp @@ -6,9 +6,6 @@ void main() { const uint i0 = 2*gl_GlobalInvocationID.y; // i1 is actually i2*nb2+i1, but the rows are contiguous - const uint i1 = gl_GlobalInvocationID.x + 32768 * gl_GlobalInvocationID.z; - if (i1 >= pc.nrows) { - return; - } + const uint i1 = gl_GlobalInvocationID.x; rope_vision(i0, i1, pc); } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/ssm_scan.comp b/ggml/src/ggml-vulkan/vulkan-shaders/ssm_scan.comp index c741620..8f67be9 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/ssm_scan.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/ssm_scan.comp @@ -1,7 +1,6 @@ #version 450 #extension GL_EXT_control_flow_attributes : require -#extension GL_KHR_shader_subgroup_basic : enable #if USE_SUBGROUP_ADD #extension GL_KHR_shader_subgroup_arithmetic : enable #endif @@ -10,8 +9,7 @@ layout(constant_id = 0) const uint D_STATE = 128; layout(constant_id = 1) const uint SUBGROUP_SIZE = 32; - -const uint32_t c_factor = D_STATE / SUBGROUP_SIZE; +layout(constant_id = 2) const uint SPLIT_H = 16; layout(local_size_x_id = 0, local_size_y = 1, local_size_z = 1) in; @@ -43,28 +41,22 @@ float softplus(float x) { } } -#if !USE_SUBGROUP_ADD -shared float temp[D_STATE]; -#endif +shared float stateC[SPLIT_H * D_STATE]; void main() { - const uint subgroup = gl_SubgroupID; - const uint lane = gl_SubgroupInvocationID; - const uint tid = gl_SubgroupID * SUBGROUP_SIZE + lane; - const uint subgroup_idx = gl_WorkGroupID.x * c_factor + subgroup; - - const uint head_idx = subgroup_idx / d_head; - const uint head_off = (subgroup_idx % d_head) * 4; - const uint seq_idx = gl_WorkGroupID.y; + const uint tid = gl_LocalInvocationID.x; + const uint head_idx = (gl_WorkGroupID.x * SPLIT_H) / d_head; + const uint head_off = ((gl_WorkGroupID.x * SPLIT_H) % d_head) * 4; + const uint seq_idx = gl_WorkGroupID.y; const uint group_off = (head_idx / (n_head / n_group)) * D_STATE * 4; const uint s0_base_idx = (uint(ids[seq_idx]) * nb03 + head_idx * nb02 + head_off * D_STATE) / 4; - const uint x_base_idx = (seq_idx * nb13 + subgroup_idx * 4) / 4; + const uint x_base_idx = (seq_idx * nb13 + gl_WorkGroupID.x * SPLIT_H * 4) / 4; const uint dt_base_idx = (seq_idx * nb22 + head_idx * 4) / 4; const uint A_base_idx = (head_idx * nb31) / 4; const uint B_base_idx = (seq_idx * nb43 + group_off) / 4; const uint C_base_idx = (seq_idx * nb53 + group_off) / 4; - const uint y_base_idx = seq_idx * n_tok * n_head * d_head + subgroup_idx; + const uint y_base_idx = seq_idx * n_tok * n_head * d_head + gl_WorkGroupID.x * SPLIT_H; const uint s_base_idx = (s_off + seq_idx * nb03 + head_idx * nb02 + head_off * D_STATE) / 4; const uint stride_x = nb12 / 4; @@ -73,52 +65,76 @@ void main() { const uint stride_C = nb52 / 4; const uint stride_y = n_head * d_head; - float state[c_factor]; - - [[unroll]] for (uint j = 0; j < c_factor; j++) { - state[j] = s0[s0_base_idx + SUBGROUP_SIZE * j + lane]; + float state[SPLIT_H]; + [[unroll]] for (uint j = 0; j < SPLIT_H; j++) { + state[j] = s0[s0_base_idx + j * D_STATE + tid]; } - float a = A[A_base_idx]; - for (uint i = 0; i < n_tok; i++) { - float dt_soft_plus = softplus(dt[dt_base_idx + i * stride_dt]); + const float dt_soft_plus = softplus(dt[dt_base_idx + i * stride_dt]); - float state_sum = 0.0f; + const float dA = exp(dt_soft_plus * A[A_base_idx]); + + const float B_val = B[B_base_idx + i * stride_B + tid]; + const float C_val = C[C_base_idx + i * stride_C + tid]; + + [[unroll]] for (uint j = 0; j < SPLIT_H; j++) { + const float x_dt = x[x_base_idx + i * stride_x + j] * dt_soft_plus; - const float dA = exp(dt_soft_plus * a); - const float x_dt = x[x_base_idx + i * stride_x] * dt_soft_plus; - [[unroll]] for (uint j = 0; j < c_factor; j++) { - float B_val = B[B_base_idx + i * stride_B + SUBGROUP_SIZE * j + lane]; - float C_val = C[C_base_idx + i * stride_C + SUBGROUP_SIZE * j + lane]; state[j] = (state[j] * dA) + (B_val * x_dt); - state_sum += state[j] * C_val; + + stateC[j * D_STATE + tid] = state[j] * C_val; } -#if USE_SUBGROUP_ADD - state_sum = subgroupAdd(state_sum); -#else - temp[tid] = state_sum; barrier(); - [[unroll]] for (uint s = SUBGROUP_SIZE / 2; s > 0; s >>= 1) { - if (lane < s) { - temp[tid] += temp[tid + s]; + [[unroll]] + for (uint w = D_STATE / 2; w >= SUBGROUP_SIZE; w >>= 1) { + [[unroll]] for (uint j = 0; j < (w * SPLIT_H + D_STATE - 1) / D_STATE; j++) { + const uint k = (tid % w) + (D_STATE * (tid / w)) + j * D_STATE * (D_STATE / w); + if (k < SPLIT_H * D_STATE && (k + w) < SPLIT_H * D_STATE) { + stateC[k] += stateC[k + w]; + } } barrier(); } - // get the value from lane 0 - state_sum = temp[subgroup * SUBGROUP_SIZE]; - barrier(); + + [[unroll]] for (uint j = 0; j < max(1, SPLIT_H / (D_STATE / SUBGROUP_SIZE)); j++) { + const uint idx = (tid % SUBGROUP_SIZE) + + D_STATE * (tid / SUBGROUP_SIZE) + + j * D_STATE * (D_STATE / SUBGROUP_SIZE); + const uint max_idx = SUBGROUP_SIZE - 1 + + D_STATE * ((D_STATE - 1) / SUBGROUP_SIZE) + + j * D_STATE * (D_STATE / SUBGROUP_SIZE); + + if (idx < SPLIT_H * D_STATE || + max_idx < SPLIT_H * D_STATE) { + float sc; +#if USE_SUBGROUP_ADD + sc = stateC[idx]; + sc = subgroupAdd(sc); +#else + [[unroll]] for (uint offset = SUBGROUP_SIZE / 2; offset > 0; offset >>= 1) { + if (idx + offset < SPLIT_H * D_STATE) { + stateC[idx] += stateC[idx + offset]; + } + barrier(); + } + if (tid % SUBGROUP_SIZE == 0) { + sc = stateC[idx]; + } #endif - if (lane == 0) { - d[y_base_idx + i * stride_y] = state_sum; + if (tid % SUBGROUP_SIZE == 0) { + const uint k = tid / SUBGROUP_SIZE + j * (D_STATE / SUBGROUP_SIZE); + d[y_base_idx + i * stride_y + k] = sc; + } + } } + + barrier(); } - // write back the state - [[unroll]] - for (int j = 0; j < c_factor; j++) { - d[s_base_idx + SUBGROUP_SIZE * j + lane] = state[j]; + [[unroll]] for (uint j = 0; j < SPLIT_H; j++) { + d[s_base_idx + j * D_STATE + tid] = state[j]; } } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/topk_moe.comp b/ggml/src/ggml-vulkan/vulkan-shaders/topk_moe.comp index ef2f202..b83a2b9 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/topk_moe.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/topk_moe.comp @@ -7,10 +7,6 @@ #include "types.glsl" -#define GATING_FUNC_SOFTMAX 0 -#define GATING_FUNC_SIGMOID 1 -#define GATING_FUNC_SOFTMAX_WEIGHT 2 - layout (push_constant) uniform parameter { uint n_rows; @@ -18,18 +14,15 @@ layout (push_constant) uniform parameter uint n_expert_used; float clamp_min; float clamp_max; - uint gating_func; - uint has_bias; - uint with_norm; - float output_scale; - float output_bias; }; layout(local_size_x_id = 0, local_size_y = 4, local_size_z = 1) in; layout(constant_id = 0) const uint WARP_SIZE = 32; layout(constant_id = 1) const uint n_experts_spec = 512; -layout(constant_id = 2) const bool nexperts_use_push = false; +layout(constant_id = 2) const bool with_norm = true; +layout(constant_id = 3) const bool late_softmax = false; +layout(constant_id = 4) const bool nexperts_use_push = false; uint n_experts = nexperts_use_push ? n_experts_push : n_experts_spec; @@ -38,9 +31,8 @@ uint n_experts = nexperts_use_push ? n_experts_push : n_experts_spec; const uint experts_per_thread = CEIL_DIV(n_experts_spec, WARP_SIZE); layout (binding = 0, std430) readonly buffer Logits {float logits[];}; -layout (binding = 1, std430) readonly buffer BiasProbs {float bias[];}; -layout (binding = 2, std430) writeonly buffer Weights {float weights[];}; -layout (binding = 3, std430) writeonly buffer Ids {uint ids[];}; +layout (binding = 1, std430) writeonly buffer Weights {float weights[];}; +layout (binding = 2, std430) writeonly buffer Ids {uint ids[];}; const float INFINITY = 1.0 / 0.0; @@ -95,45 +87,20 @@ void main() { } const uint logits_offset = n_experts * row; - const uint bias_offset = 0; // 1D const uint weights_offset = n_expert_used * row; const uint ids_offset = n_experts * row; const uint lane = gl_SubgroupInvocationID; - float probs[experts_per_thread]; - [[unroll]] - for (int i = 0; i < experts_per_thread; i++) { - probs[i] = -INFINITY; - } + float wt[experts_per_thread]; [[unroll]] for (uint i = 0; i < n_experts; i += WARP_SIZE) { const uint expert = i + lane; - probs[i / WARP_SIZE] = (n_experts % WARP_SIZE == 0 || expert < n_experts) ? logits[logits_offset + expert] : -INFINITY; + wt[i / WARP_SIZE] = (n_experts % WARP_SIZE == 0 || expert < n_experts) ? logits[logits_offset + expert] : -INFINITY; } - if (gating_func == GATING_FUNC_SOFTMAX) { - softmax_warp_inplace(probs, n_experts, lane, nexperts_use_push); - } else if (gating_func == GATING_FUNC_SIGMOID) { - [[unroll]] - for (uint i = 0; i < n_experts; i += WARP_SIZE) { - const uint expert = i + lane; - probs[i / WARP_SIZE] = (n_experts % WARP_SIZE == 0 || expert < n_experts) ? 1.f / (1.f + exp(-probs[i / WARP_SIZE])) : -INFINITY; - } - } - - float selection_probs[experts_per_thread]; - if (has_bias != 0) { - [[unroll]] - for (uint i = 0; i < n_experts; i += WARP_SIZE) { - const uint expert = i + lane; - selection_probs[i / WARP_SIZE] = (n_experts % WARP_SIZE == 0 || expert < n_experts) ? probs[i / WARP_SIZE] + bias[bias_offset + expert] : -INFINITY; - } - } else { - [[unroll]] - for (int i = 0; i < experts_per_thread; i++) { - selection_probs[i] = probs[i]; - } + if (!late_softmax) { + softmax_warp_inplace(wt, n_experts, lane, nexperts_use_push); } // at this point, each thread holds a portion of softmax, @@ -150,16 +117,14 @@ void main() { } for (int k = 0; k < n_expert_used; k++) { - float max_val = probs[0]; - float max_val_s = selection_probs[0]; + float max_val = wt[0]; uint max_expert = lane; [[unroll]] - for (uint i = WARP_SIZE; i < n_experts; i += WARP_SIZE) { - const uint expert = i + lane; - if ((n_experts % WARP_SIZE == 0 || expert < n_experts) && selection_probs[i / WARP_SIZE] > max_val_s) { - max_val = probs[i / WARP_SIZE]; - max_val_s = selection_probs[i / WARP_SIZE]; + for (int i = 1; i < experts_per_thread; i++) { + const uint expert = lane + i * WARP_SIZE; + if ((n_experts % WARP_SIZE == 0 || expert < n_experts) && wt[i] > max_val) { + max_val = wt[i]; max_expert = expert; } } @@ -167,11 +132,9 @@ void main() { [[unroll]] for (uint mask = WARP_SIZE / 2; mask > 0; mask /= 2) { const float val = subgroupShuffleXor(max_val, mask); - const float val_s = subgroupShuffleXor(max_val_s, mask); const uint expert = subgroupShuffleXor(max_expert, mask); - if (val_s > max_val_s || (val_s == max_val_s && expert < max_expert)) { + if (val > max_val || (val == max_val && expert < max_expert)) { max_val = val; - max_val_s = val_s; max_expert = expert; } } @@ -181,14 +144,16 @@ void main() { } if ((max_expert & (WARP_SIZE - 1)) == lane) { - selection_probs[max_expert / WARP_SIZE] = -INFINITY; + wt[max_expert / WARP_SIZE] = -INFINITY; ids[ids_offset + k] = max_expert; - wt_sum += max_val; + if (with_norm) { + wt_sum += max_val; + } } } - if (with_norm != 0) { + if (with_norm) { wt_sum = subgroupAdd(wt_sum); wt_sum = clamp(wt_sum, clamp_min, clamp_max); const float inv_sum = 1.0f / wt_sum; @@ -199,7 +164,7 @@ void main() { } } - if (gating_func == GATING_FUNC_SOFTMAX_WEIGHT) { + if (late_softmax) { softmax_warp_inplace(output_weights, n_expert_used, lane, true); } @@ -207,7 +172,7 @@ void main() { for (uint i = 0; i < experts_per_thread; ++i) { uint idx = i * WARP_SIZE + lane; if (idx < n_expert_used) { - weights[weights_offset + idx] = output_scale * output_weights[i] + output_bias; + weights[weights_offset + idx] = output_weights[i]; } } } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/types.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/types.glsl index bdb2c09..02578c7 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/types.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/types.glsl @@ -172,12 +172,16 @@ struct block_q8_0 float16_t d; int8_t qs[32]; }; - struct block_q8_0_packed16 { float16_t d; int16_t qs[32/2]; }; +struct block_q8_0_packed32 +{ + float16_t d; + int32_t qs[32/4]; +}; #if defined(DATA_A_Q8_0) #define QUANT_K QUANT_K_Q8_0 @@ -185,6 +189,7 @@ struct block_q8_0_packed16 #define QUANT_AUXF 1 #define A_TYPE block_q8_0 #define A_TYPE_PACKED16 block_q8_0_packed16 +#define A_TYPE_PACKED32 block_q8_0_packed32 #define DATA_A_QUANT_LEGACY #endif @@ -196,13 +201,11 @@ struct block_q8_1 f16vec2 ds; int8_t qs[32]; }; - struct block_q8_1_packed16 { f16vec2 ds; int16_t qs[16]; }; - struct block_q8_1_packed32 { f16vec2 ds; @@ -215,7 +218,6 @@ struct block_q8_1_x4 f16vec2 ds[4]; int32_t qs[32]; }; - struct block_q8_1_x4_packed128 { f16vec2 ds[4]; @@ -396,12 +398,6 @@ struct block_iq1_s { uint16_t qh[QUANT_K_IQ1_S/32]; }; -struct block_iq1_s_packed16 { - float16_t d; - uint16_t qs[QUANT_K_IQ1_S/8/2]; - uint16_t qh[QUANT_K_IQ1_S/32]; -}; - #define QUANT_K_IQ1_M 256 #define QUANT_R_IQ1_M 1 @@ -411,18 +407,6 @@ struct block_iq1_m { uint16_t scales[QUANT_K_IQ1_M/64]; }; -struct block_iq1_m_packed16 { - uint16_t qs[QUANT_K_IQ1_M/8/2]; - uint16_t qh[QUANT_K_IQ1_M/16/2]; - uint16_t scales[QUANT_K_IQ1_M/64]; -}; - -struct block_iq1_m_packed32 { - uint32_t qs[QUANT_K_IQ1_M/8/4]; - uint32_t qh[QUANT_K_IQ1_M/16/4]; - uint32_t scales[QUANT_K_IQ1_M/64/2]; -}; - struct block_iq1_m_packed64 { uint64_t qs[QUANT_K_IQ1_M/8/8]; uint64_t qh[QUANT_K_IQ1_M/16/8]; @@ -433,15 +417,12 @@ struct block_iq1_m_packed64 { #define QUANT_K QUANT_K_IQ1_S #define QUANT_R QUANT_R_IQ1_S #define A_TYPE block_iq1_s -#define A_TYPE_PACKED16 block_iq1_s_packed16 #endif #if defined(DATA_A_IQ1_M) #define QUANT_K QUANT_K_IQ1_M #define QUANT_R QUANT_R_IQ1_M #define A_TYPE block_iq1_m -#define A_TYPE_PACKED16 block_iq1_m_packed16 -#define A_TYPE_PACKED32 block_iq1_m_packed32 #endif #if defined(DATA_A_IQ1_S) || defined(DATA_A_IQ1_M) @@ -580,270 +561,7 @@ const uint[1024] iq1s_grid_const = { 0x55dd55df, 0x55d555d7, 0x5503550c, 0x557f5501, 0x5577557d, 0x55405575, 0x555d555f, 0x55555557 }; -// Same content as iq1s_grid_const except each 2-bit value is expanded to 4-bit -// and has 1 added to it (allows packed values to be extracted with & 0x0F0F0F0F -// and 0xF0F0F0F0). -const uint32_t[2048] iq1s_grid_gpu_const = { - 0x00000000, 0x00000002, 0x00000101, 0x00000200, 0x00000202, 0x00010001, 0x00010101, 0x00020000, - 0x00020002, 0x00020200, 0x00020202, 0x01000101, 0x01010001, 0x01010100, 0x01010102, 0x01020101, - 0x02000000, 0x02000002, 0x02000200, 0x02000202, 0x02010101, 0x02020000, 0x02020002, 0x02020200, - 0x02020202, 0x00000110, 0x00000111, 0x00010011, 0x00010110, 0x00010112, 0x00010211, 0x00010212, - 0x00020111, 0x01000011, 0x01000112, 0x01000211, 0x01010012, 0x01010111, 0x01010212, 0x01020011, - 0x01020110, 0x01020112, 0x01020210, 0x02000111, 0x02010011, 0x02010110, 0x02010112, 0x02020111, - 0x00000020, 0x00000022, 0x00000220, 0x00000222, 0x00010121, 0x00020020, 0x00020022, 0x00020220, - 0x00020222, 0x01000121, 0x01010021, 0x01010221, 0x01020120, 0x01020221, 0x02000020, 0x02000022, - 0x02000220, 0x02000222, 0x02010021, 0x02010121, 0x02010221, 0x02020020, 0x02020022, 0x02020220, - 0x02020222, 0x00011001, 0x00011100, 0x00011102, 0x00021101, 0x01001001, 0x01001201, 0x01011101, - 0x01011202, 0x01021100, 0x01021101, 0x02011001, 0x02011201, 0x02021101, 0x00001011, 0x00001110, - 0x00001111, 0x00001112, 0x00011111, 0x00011210, 0x00011212, 0x00021211, 0x01001010, 0x01001111, - 0x01001212, 0x01011010, 0x01011011, 0x01011110, 0x01011111, 0x01011112, 0x01011211, 0x01021010, - 0x01021012, 0x01021111, 0x01021210, 0x01021212, 0x02001011, 0x02011011, 0x02011111, 0x02011210, - 0x02011212, 0x02021011, 0x02021110, 0x02021111, 0x02021112, 0x02021211, 0x00011120, 0x00011221, - 0x01001021, 0x01001120, 0x01011020, 0x01011022, 0x01011121, 0x01011220, 0x01021020, 0x01021021, - 0x01021122, 0x01021221, 0x02001121, 0x02011021, 0x02011120, 0x02011221, 0x00002000, 0x00002002, - 0x00002200, 0x00002202, 0x00012101, 0x00022000, 0x00022002, 0x00022200, 0x00022202, 0x01002101, - 0x01012001, 0x01012102, 0x01022101, 0x02002000, 0x02002002, 0x02002200, 0x02002202, 0x02012101, - 0x02022000, 0x02022002, 0x02022200, 0x02022202, 0x00002111, 0x00012011, 0x00012110, 0x00012211, - 0x00022110, 0x00022111, 0x01002011, 0x01012010, 0x01012011, 0x01012111, 0x01022011, 0x01022110, - 0x01022211, 0x02012011, 0x02012110, 0x02012112, 0x02012211, 0x02022111, 0x00002020, 0x00002022, - 0x00002220, 0x00002222, 0x00012121, 0x00022020, 0x00022022, 0x00022220, 0x00022222, 0x01002121, - 0x01012021, 0x01012221, 0x01022021, 0x01022121, 0x02002020, 0x02002022, 0x02002121, 0x02002220, - 0x02002222, 0x02012121, 0x02022020, 0x02022022, 0x02022220, 0x02022222, 0x00110000, 0x00110001, - 0x00110100, 0x00110201, 0x00120100, 0x00120101, 0x01100001, 0x01100100, 0x01110000, 0x01110101, - 0x01110200, 0x01120001, 0x01120100, 0x01120101, 0x01120201, 0x02110001, 0x02110100, 0x02110102, - 0x02120001, 0x02120101, 0x00100011, 0x00100110, 0x00100112, 0x00100211, 0x00110010, 0x00110012, - 0x00110111, 0x00110210, 0x00120011, 0x00120110, 0x00120211, 0x01100111, 0x01100212, 0x01110010, - 0x01110011, 0x01110012, 0x01110110, 0x01110111, 0x01110112, 0x01110211, 0x01120010, 0x01120111, - 0x02100110, 0x02110012, 0x02110111, 0x02120011, 0x02120110, 0x00110021, 0x00110120, 0x00110122, - 0x00120121, 0x01100020, 0x01100122, 0x01100221, 0x01110022, 0x01110121, 0x01110220, 0x01110222, - 0x01120120, 0x01120122, 0x02100121, 0x02110021, 0x02110120, 0x02110122, 0x02120121, 0x00101001, - 0x00101102, 0x00101201, 0x00111100, 0x00111101, 0x00111200, 0x00111201, 0x00121001, 0x00121102, - 0x01101001, 0x01101101, 0x01101102, 0x01101200, 0x01101202, 0x01111001, 0x01111100, 0x01111101, - 0x01111102, 0x01111201, 0x01121002, 0x01121101, 0x01121200, 0x02101100, 0x02101201, 0x02111000, - 0x02111100, 0x02111101, 0x02111200, 0x02111201, 0x02111202, 0x02121001, 0x02121100, 0x02121101, - 0x02121201, 0x00101012, 0x00101111, 0x00101212, 0x00111011, 0x00111110, 0x00111111, 0x00111112, - 0x00111211, 0x00121010, 0x00121012, 0x00121111, 0x00121210, 0x00121212, 0x01101011, 0x01101110, - 0x01101111, 0x01101112, 0x01111011, 0x01111012, 0x01111110, 0x01111111, 0x01111112, 0x01111211, - 0x01111212, 0x01121011, 0x01121110, 0x01121111, 0x01121112, 0x01121211, 0x02101010, 0x02101012, - 0x02101110, 0x02101111, 0x02101210, 0x02101212, 0x02111010, 0x02111011, 0x02111110, 0x02111111, - 0x02111112, 0x02111211, 0x02111212, 0x02121010, 0x02121012, 0x02121111, 0x00101021, 0x00101120, - 0x00101121, 0x00101122, 0x00111121, 0x00111122, 0x00111220, 0x00111222, 0x00121021, 0x00121122, - 0x01101020, 0x01101022, 0x01101120, 0x01101121, 0x01101220, 0x01101222, 0x01111021, 0x01111121, - 0x01111122, 0x01111220, 0x01111221, 0x01121021, 0x01121120, 0x01121121, 0x01121220, 0x01121221, - 0x01121222, 0x02101122, 0x02101222, 0x02111022, 0x02111121, 0x02121120, 0x02121221, 0x00112001, - 0x00112102, 0x00122101, 0x01102001, 0x01102100, 0x01102102, 0x01102201, 0x01112000, 0x01112101, - 0x01112200, 0x01112202, 0x01122000, 0x01122001, 0x01122100, 0x01122102, 0x01122201, 0x02102101, - 0x02112001, 0x02112100, 0x02122101, 0x00112010, 0x00112012, 0x00112111, 0x00112212, 0x00122011, - 0x00122111, 0x01102012, 0x01102110, 0x01102111, 0x01102210, 0x01112011, 0x01112110, 0x01112111, - 0x01112112, 0x01112211, 0x01112212, 0x01122010, 0x01122111, 0x01122212, 0x02102211, 0x02112011, - 0x02112012, 0x02112111, 0x02112210, 0x02122011, 0x02122112, 0x02122211, 0x00102221, 0x00112122, - 0x00122120, 0x00122122, 0x01102120, 0x01102122, 0x01102221, 0x01112020, 0x01112022, 0x01112121, - 0x01112220, 0x01122021, 0x01122122, 0x01122221, 0x02102121, 0x02112021, 0x02112122, 0x02112222, - 0x00200000, 0x00200002, 0x00200200, 0x00200202, 0x00210101, 0x00220000, 0x00220002, 0x00220101, - 0x00220200, 0x00220202, 0x01200101, 0x01210001, 0x01210201, 0x01220001, 0x01220101, 0x02200000, - 0x02200002, 0x02200200, 0x02200202, 0x02210101, 0x02220000, 0x02220002, 0x02220101, 0x02220200, - 0x02220202, 0x00200111, 0x00210011, 0x00210110, 0x00210211, 0x00220111, 0x01200012, 0x01200110, - 0x01200211, 0x01210111, 0x01210210, 0x01210212, 0x01220011, 0x01220110, 0x01220111, 0x01220112, - 0x02200111, 0x02210010, 0x02210112, 0x02210211, 0x02220111, 0x00200021, 0x00200220, 0x00200222, - 0x00210021, 0x00210121, 0x00220020, 0x00220022, 0x00220220, 0x00220222, 0x01200121, 0x01210021, - 0x01210122, 0x01210221, 0x01220121, 0x02200021, 0x02200220, 0x02200222, 0x02210021, 0x02210121, - 0x02220020, 0x02220022, 0x02220220, 0x02220222, 0x00201101, 0x00211100, 0x00211102, 0x00211201, - 0x00221101, 0x01201100, 0x01201101, 0x01201102, 0x01201201, 0x01211002, 0x01211101, 0x01211200, - 0x01211202, 0x01221102, 0x02201101, 0x02211001, 0x02211100, 0x02211201, 0x02221001, 0x02221101, - 0x00201211, 0x00211111, 0x00221011, 0x00221211, 0x01201010, 0x01201111, 0x01201210, 0x01211011, - 0x01211110, 0x01211111, 0x01211211, 0x01221012, 0x01221111, 0x01221210, 0x02201211, 0x02211010, - 0x02211110, 0x02211111, 0x02211210, 0x02211212, 0x02221011, 0x02221110, 0x02221112, 0x02221211, - 0x00201121, 0x00211020, 0x00211022, 0x00211221, 0x00221121, 0x01201021, 0x01201221, 0x01211121, - 0x01221020, 0x01221021, 0x01221221, 0x02201120, 0x02201122, 0x02211020, 0x02211222, 0x00202000, - 0x00202002, 0x00202200, 0x00202202, 0x00212101, 0x00222000, 0x00222002, 0x00222200, 0x00222202, - 0x01202101, 0x01212001, 0x01212100, 0x01222101, 0x02202000, 0x02202002, 0x02202200, 0x02202202, - 0x02222000, 0x02222002, 0x02222200, 0x02222202, 0x00202211, 0x00212011, 0x00212110, 0x00212211, - 0x00222111, 0x01202112, 0x01202211, 0x01212012, 0x01212111, 0x01222011, 0x01222110, 0x01222112, - 0x01222211, 0x02202111, 0x02212010, 0x02212112, 0x02212211, 0x02222110, 0x02222111, 0x00202020, - 0x00202022, 0x00202220, 0x00202222, 0x00222020, 0x00222022, 0x00222220, 0x00222222, 0x01202121, - 0x01212021, 0x01212122, 0x01212221, 0x01222121, 0x02202020, 0x02202022, 0x02202220, 0x02202222, - 0x02212121, 0x02222020, 0x02222022, 0x02222220, 0x02222222, 0x10000101, 0x10010001, 0x10010102, - 0x10020101, 0x11000201, 0x11010002, 0x11010101, 0x11010200, 0x11010202, 0x11020001, 0x11020100, - 0x11020102, 0x12010100, 0x12010201, 0x12020001, 0x12020102, 0x10000010, 0x10000011, 0x10000110, - 0x10000112, 0x10000211, 0x10010012, 0x10010111, 0x10010112, 0x10010210, 0x10010212, 0x10020011, - 0x10020112, 0x10020211, 0x11000111, 0x11000210, 0x11000212, 0x11010011, 0x11010110, 0x11010111, - 0x11010112, 0x11010211, 0x11010212, 0x11020111, 0x11020210, 0x11020212, 0x12000011, 0x12000110, - 0x12000112, 0x12010010, 0x12010012, 0x12010111, 0x12020010, 0x12020011, 0x12020012, 0x10000121, - 0x10010021, 0x10010120, 0x10010122, 0x10020121, 0x11000021, 0x11010022, 0x11010121, 0x11010222, - 0x11020120, 0x11020221, 0x12000221, 0x12010120, 0x12020121, 0x10001001, 0x10011101, 0x10011201, - 0x10021201, 0x11001101, 0x11001200, 0x11001202, 0x11011001, 0x11011100, 0x11011101, 0x11011102, - 0x11021001, 0x11021002, 0x11021101, 0x11021200, 0x11021202, 0x12001001, 0x12001102, 0x12001201, - 0x12011000, 0x12011002, 0x12011101, 0x12021000, 0x12021001, 0x12021201, 0x10001011, 0x10001012, - 0x10001111, 0x10001212, 0x10011011, 0x10011110, 0x10011111, 0x10011112, 0x10011211, 0x10021010, - 0x10021111, 0x10021212, 0x11001011, 0x11001110, 0x11001111, 0x11001112, 0x11001211, 0x11011010, - 0x11011011, 0x11011110, 0x11011111, 0x11011112, 0x11011210, 0x11011211, 0x11021011, 0x11021110, - 0x11021111, 0x11021112, 0x11021211, 0x12001012, 0x12001110, 0x12001111, 0x12001210, 0x12011011, - 0x12011110, 0x12011111, 0x12011112, 0x12011211, 0x12011212, 0x12021111, 0x12021210, 0x12021212, - 0x10001021, 0x10001121, 0x10001221, 0x10011120, 0x10011121, 0x10011220, 0x10011222, 0x10021021, - 0x10021120, 0x10021221, 0x11001020, 0x11001022, 0x11001121, 0x11001220, 0x11011020, 0x11011021, - 0x11011022, 0x11011121, 0x11011122, 0x11011221, 0x11021022, 0x11021121, 0x11021220, 0x12001021, - 0x12001121, 0x12001222, 0x12011120, 0x12011121, 0x12021021, 0x12021120, 0x12021122, 0x10002101, - 0x10012001, 0x10012101, 0x10012202, 0x10022101, 0x11002002, 0x11002201, 0x11012000, 0x11012101, - 0x11012200, 0x11022001, 0x11022100, 0x11022102, 0x11022201, 0x12002101, 0x12012001, 0x12012100, - 0x12012102, 0x12012201, 0x12022101, 0x10002011, 0x10002111, 0x10002112, 0x10002212, 0x10012010, - 0x10012110, 0x10012111, 0x10012210, 0x10022011, 0x10022110, 0x10022112, 0x11002010, 0x11002111, - 0x11002212, 0x11012011, 0x11012012, 0x11012110, 0x11012111, 0x11012112, 0x11012211, 0x11022010, - 0x11022012, 0x11022111, 0x11022112, 0x11022212, 0x12002112, 0x12002211, 0x12012012, 0x12012111, - 0x12012112, 0x12012210, 0x12022011, 0x12022110, 0x12022112, 0x12022211, 0x10012122, 0x11002120, - 0x11002122, 0x11002221, 0x11012121, 0x11012220, 0x11012222, 0x11022120, 0x11022221, 0x12012120, - 0x12022121, 0x10100001, 0x10100100, 0x10100101, 0x10100102, 0x10100201, 0x10110002, 0x10110101, - 0x10110202, 0x10120001, 0x10120100, 0x10120201, 0x11100000, 0x11100101, 0x11100200, 0x11110001, - 0x11110100, 0x11110101, 0x11110102, 0x11110201, 0x11120101, 0x11120200, 0x12100102, 0x12100201, - 0x12110101, 0x12110200, 0x12120000, 0x12120001, 0x12120102, 0x12120201, 0x10100111, 0x10100210, - 0x10100211, 0x10100212, 0x10110011, 0x10110110, 0x10110111, 0x10110112, 0x10110210, 0x10110211, - 0x10120010, 0x10120111, 0x10120112, 0x10120210, 0x10120212, 0x11100011, 0x11100110, 0x11100111, - 0x11100112, 0x11100211, 0x11110010, 0x11110011, 0x11110012, 0x11110110, 0x11110111, 0x11110112, - 0x11110210, 0x11110211, 0x11110212, 0x11120011, 0x11120110, 0x11120111, 0x11120112, 0x11120211, - 0x12100012, 0x12100111, 0x12110011, 0x12110110, 0x12110111, 0x12110112, 0x12110211, 0x12120010, - 0x12120111, 0x12120212, 0x10100021, 0x10100122, 0x10110022, 0x10110121, 0x10110222, 0x10120021, - 0x10120120, 0x11100022, 0x11100121, 0x11100222, 0x11110021, 0x11110120, 0x11110121, 0x11110122, - 0x11110221, 0x11120022, 0x11120121, 0x12100121, 0x12110020, 0x12110022, 0x12110121, 0x12110221, - 0x12110222, 0x12120120, 0x10101100, 0x10101101, 0x10111001, 0x10111100, 0x10111101, 0x10111102, - 0x10111200, 0x10111201, 0x10121001, 0x10121101, 0x10121200, 0x10121202, 0x11101001, 0x11101100, - 0x11101101, 0x11101102, 0x11101201, 0x11101202, 0x11111000, 0x11111001, 0x11111100, 0x11111101, - 0x11111102, 0x11111200, 0x11111201, 0x11111202, 0x11121001, 0x11121002, 0x11121100, 0x11121101, - 0x11121102, 0x11121201, 0x12101000, 0x12101200, 0x12101202, 0x12111001, 0x12111100, 0x12111101, - 0x12111102, 0x12111201, 0x12121001, 0x12121100, 0x12121101, 0x12121202, 0x10101011, 0x10101012, - 0x10101110, 0x10101111, 0x10101112, 0x10101211, 0x10111010, 0x10111011, 0x10111012, 0x10111110, - 0x10111111, 0x10111112, 0x10111211, 0x10111212, 0x10121011, 0x10121110, 0x10121111, 0x10121112, - 0x10121211, 0x11101010, 0x11101011, 0x11101012, 0x11101110, 0x11101111, 0x11101112, 0x11101210, - 0x11101211, 0x11111010, 0x11111011, 0x11111012, 0x11111110, 0x11111111, 0x11111112, 0x11111210, - 0x11111211, 0x11111212, 0x11121010, 0x11121011, 0x11121110, 0x11121111, 0x11121112, 0x11121210, - 0x11121211, 0x11121212, 0x12101011, 0x12101110, 0x12101111, 0x12101211, 0x12101212, 0x12111010, - 0x12111011, 0x12111110, 0x12111111, 0x12111112, 0x12111210, 0x12111211, 0x12121011, 0x12121110, - 0x12121111, 0x12121112, 0x12121211, 0x10101020, 0x10101021, 0x10101022, 0x10101120, 0x10101122, - 0x10101220, 0x10101221, 0x10111021, 0x10111120, 0x10111121, 0x10111220, 0x10111221, 0x10121020, - 0x10121021, 0x10121022, 0x10121120, 0x10121121, 0x10121122, 0x10121220, 0x10121221, 0x11101021, - 0x11101121, 0x11101122, 0x11101220, 0x11101221, 0x11101222, 0x11111020, 0x11111021, 0x11111022, - 0x11111120, 0x11111121, 0x11111122, 0x11111220, 0x11111221, 0x11111222, 0x11121021, 0x11121120, - 0x11121121, 0x11121221, 0x12101022, 0x12101121, 0x12101122, 0x12101220, 0x12101221, 0x12101222, - 0x12111021, 0x12111121, 0x12111222, 0x12121022, 0x12121121, 0x12121122, 0x12121220, 0x12121221, - 0x10102100, 0x10102101, 0x10102102, 0x10102201, 0x10112000, 0x10112101, 0x10112200, 0x10122001, - 0x10122202, 0x11102101, 0x11102200, 0x11102202, 0x11112001, 0x11112100, 0x11112101, 0x11112102, - 0x11112200, 0x11112201, 0x11122000, 0x11122002, 0x11122100, 0x11122101, 0x12102002, 0x12102201, - 0x12112000, 0x12112002, 0x12112101, 0x12112200, 0x12122001, 0x12122201, 0x10102011, 0x10102012, - 0x10102111, 0x10102212, 0x10112011, 0x10112110, 0x10112111, 0x10112112, 0x10112211, 0x10122111, - 0x11102011, 0x11102110, 0x11102111, 0x11102112, 0x11102211, 0x11112010, 0x11112011, 0x11112012, - 0x11112110, 0x11112111, 0x11112112, 0x11112210, 0x11112211, 0x11112212, 0x11122011, 0x11122110, - 0x11122111, 0x11122112, 0x11122211, 0x12102011, 0x12102111, 0x12102211, 0x12112011, 0x12112110, - 0x12112111, 0x12112112, 0x12112210, 0x12112211, 0x12122111, 0x10102120, 0x10102220, 0x10112121, - 0x10112222, 0x10122020, 0x10122121, 0x10122122, 0x10122221, 0x11102121, 0x11102220, 0x11102221, - 0x11112021, 0x11112121, 0x11112122, 0x11112220, 0x11112221, 0x11122022, 0x11122121, 0x11122220, - 0x11122222, 0x12102021, 0x12102222, 0x12112022, 0x12112121, 0x12112122, 0x12112220, 0x12112222, - 0x12122021, 0x10200101, 0x10210100, 0x10210102, 0x10210201, 0x10220101, 0x11200100, 0x11210000, - 0x11210101, 0x11210102, 0x11210200, 0x11210202, 0x11220001, 0x11220100, 0x11220102, 0x11220201, - 0x12200001, 0x12210102, 0x12220101, 0x10200011, 0x10200110, 0x10200112, 0x10200211, 0x10210012, - 0x10210111, 0x10220011, 0x10220012, 0x10220112, 0x10220211, 0x11200111, 0x11200211, 0x11210011, - 0x11210111, 0x11210112, 0x11210211, 0x11220111, 0x11220112, 0x11220212, 0x12200110, 0x12200212, - 0x12210012, 0x12210111, 0x12220011, 0x12220112, 0x12220211, 0x10210021, 0x10210122, 0x10210221, - 0x11200020, 0x11200021, 0x11200122, 0x11210121, 0x11210122, 0x11210220, 0x11220020, 0x12200121, - 0x12210021, 0x12210122, 0x12220121, 0x10211001, 0x10211002, 0x10211101, 0x10211102, 0x10211202, - 0x10221001, 0x10221102, 0x10221201, 0x11201000, 0x11201002, 0x11201101, 0x11201200, 0x11201202, - 0x11211001, 0x11211100, 0x11211101, 0x11211102, 0x11211201, 0x11211202, 0x11221000, 0x11221002, - 0x11221101, 0x12201100, 0x12201101, 0x12201201, 0x12211000, 0x12211002, 0x12211100, 0x12211101, - 0x12211102, 0x12211200, 0x12211202, 0x12221001, 0x12221100, 0x12221201, 0x10201111, 0x10201210, - 0x10201212, 0x10211011, 0x10211111, 0x10211112, 0x10211211, 0x11201110, 0x11201111, 0x11201112, - 0x11201211, 0x11211010, 0x11211011, 0x11211110, 0x11211111, 0x11211112, 0x11211211, 0x11221011, - 0x11221110, 0x11221111, 0x11221112, 0x11221211, 0x12201112, 0x12201211, 0x12201212, 0x12211011, - 0x12211111, 0x12211112, 0x12211211, 0x12211212, 0x12221012, 0x12221111, 0x12221112, 0x12221210, - 0x10201022, 0x10201221, 0x10211121, 0x10221020, 0x10221122, 0x10221220, 0x10221221, 0x11201020, - 0x11201121, 0x11201220, 0x11201222, 0x11211021, 0x11211120, 0x11211121, 0x11211122, 0x11211220, - 0x11211222, 0x11221020, 0x11221121, 0x11221220, 0x12201020, 0x12201022, 0x12201121, 0x12201222, - 0x12211120, 0x12211122, 0x12211220, 0x12211221, 0x12221020, 0x12221120, 0x12221122, 0x12221222, - 0x10212102, 0x10212201, 0x10222101, 0x11202001, 0x11212002, 0x11212101, 0x11212202, 0x11222001, - 0x11222201, 0x12202101, 0x12212001, 0x12212200, 0x12222102, 0x10202011, 0x10202110, 0x10212010, - 0x10212111, 0x10222011, 0x10222110, 0x10222112, 0x10222211, 0x11202010, 0x11202011, 0x11202111, - 0x11202112, 0x11202210, 0x11212011, 0x11212110, 0x11212111, 0x11212112, 0x11212211, 0x11222010, - 0x11222111, 0x11222212, 0x12202012, 0x12202110, 0x12202212, 0x12212111, 0x12222011, 0x12222110, - 0x12222111, 0x12222211, 0x10212021, 0x10212122, 0x10212220, 0x11202021, 0x11202120, 0x11202221, - 0x11212020, 0x11212121, 0x11212220, 0x11212222, 0x11222120, 0x11222121, 0x11222221, 0x12202122, - 0x12212120, 0x12212220, 0x12212222, 0x12222122, 0x20000000, 0x20000002, 0x20000200, 0x20000202, - 0x20020000, 0x20020002, 0x20020200, 0x20020202, 0x21000101, 0x21010000, 0x21010001, 0x21010100, - 0x21010102, 0x21010201, 0x21020101, 0x22000000, 0x22000002, 0x22000200, 0x22000202, 0x22010101, - 0x22020000, 0x22020002, 0x22020200, 0x22020202, 0x20000111, 0x20010011, 0x20010110, 0x20010112, - 0x20010211, 0x20020111, 0x21000011, 0x21000110, 0x21000211, 0x21010010, 0x21010012, 0x21010111, - 0x21010112, 0x21010210, 0x21010211, 0x21020110, 0x21020112, 0x21020211, 0x22000111, 0x22000211, - 0x22010110, 0x22010112, 0x22010211, 0x22020111, 0x20000020, 0x20000022, 0x20000220, 0x20000222, - 0x20010121, 0x20020020, 0x20020022, 0x20020220, 0x20020222, 0x21010021, 0x21010120, 0x21010221, - 0x21020121, 0x22000020, 0x22000022, 0x22000220, 0x22000222, 0x22010121, 0x22020020, 0x22020022, - 0x22020220, 0x22020222, 0x20011100, 0x20011201, 0x21001001, 0x21001100, 0x21011001, 0x21011101, - 0x21011202, 0x21021001, 0x21021100, 0x21021201, 0x22011100, 0x22011201, 0x20001011, 0x20001211, - 0x20011012, 0x20011111, 0x20011212, 0x20021112, 0x20021211, 0x21001010, 0x21001011, 0x21001111, - 0x21001210, 0x21011011, 0x21011110, 0x21011111, 0x21011112, 0x21011211, 0x21011212, 0x21021111, - 0x21021112, 0x21021210, 0x21021212, 0x22001011, 0x22001110, 0x22001112, 0x22001211, 0x22011010, - 0x22011012, 0x22011111, 0x22011210, 0x22021112, 0x20011021, 0x20011122, 0x20011221, 0x20021121, - 0x21001021, 0x21001120, 0x21001221, 0x21001222, 0x21011020, 0x21011121, 0x21011221, 0x21011222, - 0x21021021, 0x21021122, 0x21021222, 0x22001121, 0x22011021, 0x22011222, 0x22021120, 0x20002000, - 0x20002002, 0x20002200, 0x20002202, 0x20012101, 0x20022000, 0x20022002, 0x20022200, 0x20022202, - 0x21002001, 0x21002101, 0x21012001, 0x21012100, 0x21012201, 0x21022101, 0x21022201, 0x22002000, - 0x22002002, 0x22002200, 0x22002202, 0x22012101, 0x22022000, 0x22022002, 0x22022200, 0x22022202, - 0x20002111, 0x20002112, 0x20012011, 0x20012110, 0x20012112, 0x20022111, 0x21002011, 0x21002110, - 0x21002112, 0x21002211, 0x21012010, 0x21012012, 0x21012111, 0x21012212, 0x21022011, 0x21022110, - 0x22002111, 0x22012112, 0x22012211, 0x22022111, 0x20002020, 0x20002022, 0x20002220, 0x20002222, - 0x20012121, 0x20022020, 0x20022022, 0x20022220, 0x20022222, 0x21002121, 0x21012021, 0x21012120, - 0x21012122, 0x22002020, 0x22002022, 0x22002220, 0x22002222, 0x22012121, 0x22022020, 0x22022022, - 0x22022220, 0x22022222, 0x20100101, 0x20110001, 0x20110102, 0x20110200, 0x20110201, 0x20120101, - 0x21100001, 0x21100102, 0x21100201, 0x21110101, 0x21110200, 0x21110202, 0x21120201, 0x21120202, - 0x22100101, 0x22110001, 0x22110100, 0x22110102, 0x22110201, 0x22120101, 0x20100011, 0x20100110, - 0x20100112, 0x20100211, 0x20110010, 0x20110111, 0x20110210, 0x20110212, 0x20120011, 0x20120110, - 0x20120112, 0x20120211, 0x21100010, 0x21100111, 0x21110010, 0x21110011, 0x21110110, 0x21110111, - 0x21110112, 0x21110211, 0x21120012, 0x21120111, 0x22100110, 0x22100112, 0x22110012, 0x22110111, - 0x22110210, 0x22120011, 0x22120110, 0x22120112, 0x22120211, 0x20100121, 0x20110021, 0x20110120, - 0x20110221, 0x20120121, 0x21100120, 0x21100122, 0x21100221, 0x21110020, 0x21110022, 0x21110121, - 0x21110220, 0x21120122, 0x21120221, 0x22100121, 0x22110120, 0x22110122, 0x22120221, 0x20101001, - 0x20101100, 0x20101102, 0x20111000, 0x20111101, 0x20111200, 0x20121102, 0x21101000, 0x21101202, - 0x21111001, 0x21111100, 0x21111101, 0x21111102, 0x21111200, 0x21111201, 0x21121000, 0x21121001, - 0x21121002, 0x21121101, 0x22101100, 0x22101102, 0x22111002, 0x22111100, 0x22111101, 0x22111200, - 0x22121001, 0x22121201, 0x20101010, 0x20101111, 0x20101210, 0x20101212, 0x20111010, 0x20111011, - 0x20111110, 0x20111111, 0x20111112, 0x20111211, 0x20121011, 0x20121111, 0x20121211, 0x20121212, - 0x21101011, 0x21101110, 0x21101111, 0x21101112, 0x21101211, 0x21111010, 0x21111011, 0x21111012, - 0x21111110, 0x21111111, 0x21111112, 0x21111210, 0x21111211, 0x21111212, 0x21121011, 0x21121110, - 0x21121111, 0x21121112, 0x21121211, 0x22101011, 0x22101111, 0x22101210, 0x22111011, 0x22111012, - 0x22111110, 0x22111111, 0x22111112, 0x22111211, 0x22111212, 0x22121010, 0x22121012, 0x22121111, - 0x22121210, 0x22121212, 0x20101021, 0x20101120, 0x20111020, 0x20111121, 0x20111221, 0x20121020, - 0x20121122, 0x20121221, 0x21101121, 0x21101220, 0x21101221, 0x21111021, 0x21111022, 0x21111121, - 0x21111122, 0x21111221, 0x21121121, 0x21121220, 0x22101022, 0x22101120, 0x22101221, 0x22101222, - 0x22111022, 0x22111120, 0x22111121, 0x22121120, 0x22121122, 0x22121221, 0x20102101, 0x20112102, - 0x20112201, 0x20122101, 0x21102001, 0x21102102, 0x21112000, 0x21112002, 0x21112101, 0x21112102, - 0x21112202, 0x21122100, 0x21122101, 0x22102101, 0x22112001, 0x22112102, 0x22112201, 0x22122101, - 0x20102110, 0x20102112, 0x20102211, 0x20112010, 0x20112012, 0x20112111, 0x20112210, 0x20112212, - 0x20122010, 0x20122011, 0x20122110, 0x20122112, 0x21102010, 0x21102012, 0x21102111, 0x21102210, - 0x21102212, 0x21112011, 0x21112110, 0x21112111, 0x21112112, 0x21112211, 0x21122012, 0x21122111, - 0x21122112, 0x21122212, 0x22102011, 0x22102110, 0x22112010, 0x22112012, 0x22112111, 0x22112212, - 0x22122011, 0x22122112, 0x20102121, 0x20112121, 0x20122121, 0x21102120, 0x21102122, 0x21102221, - 0x21112020, 0x21112121, 0x21112220, 0x21122021, 0x22102121, 0x22112021, 0x22112120, 0x22112121, - 0x22112122, 0x20200000, 0x20200002, 0x20200200, 0x20200202, 0x20210101, 0x20220000, 0x20220002, - 0x20220200, 0x20220202, 0x21200101, 0x21210001, 0x21210100, 0x21210102, 0x21210201, 0x22200000, - 0x22200002, 0x22200200, 0x22200202, 0x22210101, 0x22220000, 0x22220002, 0x22220200, 0x22220202, - 0x20200111, 0x20200211, 0x20210011, 0x20210110, 0x20210112, 0x20210211, 0x20210212, 0x21200112, - 0x21200211, 0x21210011, 0x21210111, 0x21210210, 0x21210212, 0x21220011, 0x21220110, 0x22200111, - 0x22210010, 0x22210012, 0x22210112, 0x22210211, 0x20200022, 0x20200220, 0x20200222, 0x20210020, - 0x20210221, 0x20220022, 0x20220220, 0x20220222, 0x21200121, 0x21210021, 0x21210122, 0x21210221, - 0x21220121, 0x22200020, 0x22200022, 0x22200220, 0x22200222, 0x22210121, 0x22220020, 0x22220022, - 0x22220220, 0x22220222, 0x20211201, 0x20221101, 0x21201001, 0x21201100, 0x21211000, 0x21211100, - 0x21211101, 0x21211200, 0x21211202, 0x21221001, 0x21221101, 0x21221102, 0x21221200, 0x21221201, - 0x22201101, 0x20201112, 0x20201211, 0x20211010, 0x20211012, 0x20211111, 0x20211210, 0x20221112, - 0x20221211, 0x21201012, 0x21201111, 0x21211011, 0x21211110, 0x21211111, 0x21211112, 0x21211211, - 0x21221111, 0x21221212, 0x22201011, 0x22201110, 0x22201111, 0x22201112, 0x22201211, 0x22211012, - 0x22211111, 0x22211210, 0x20201121, 0x20211021, 0x20211122, 0x20211222, 0x20221021, 0x20221121, - 0x21201120, 0x21201122, 0x21201222, 0x21211022, 0x21211121, 0x21211122, 0x21211220, 0x21221020, - 0x21221022, 0x22201122, 0x22211020, 0x22211121, 0x22211122, 0x22211221, 0x22221021, 0x22221120, - 0x22221122, 0x20202000, 0x20202002, 0x20202200, 0x20202202, 0x20222000, 0x20222002, 0x20222200, - 0x20222202, 0x21212001, 0x21212100, 0x21212102, 0x21212201, 0x22202000, 0x22202002, 0x22202200, - 0x22202202, 0x22212101, 0x22222000, 0x22222002, 0x22222200, 0x22222202, 0x20202111, 0x20212110, - 0x20212211, 0x20222011, 0x20222111, 0x21202011, 0x21212010, 0x21212111, 0x21212212, 0x21222011, - 0x21222112, 0x21222211, 0x22212010, 0x22212112, 0x20202020, 0x20202022, 0x20202220, 0x20202222, - 0x20222020, 0x20222022, 0x20222220, 0x20222222, 0x21212021, 0x21212120, 0x21212122, 0x22202020, - 0x22202022, 0x22202220, 0x22202222, 0x22212121, 0x22222020, 0x22222022, 0x22222220, 0x22222222, -}; - shared uint16_t iq1s_grid[2048]; -shared uint32_t iq1s_grid_gpu[2048]; #define NEEDS_INIT_IQ_SHMEM void init_iq_shmem(uvec3 wgsize) @@ -857,12 +575,6 @@ void init_iq_shmem(uvec3 wgsize) iq1s_grid[2*idx+1] = g.y; } } - [[unroll]] for (uint i = 0; i < iq1s_grid_gpu_const.length(); i += wgsize.x) { - uint idx = i + gl_LocalInvocationIndex.x; - if (iq1s_grid_gpu_const.length() % wgsize.x == 0 || idx < iq1s_grid_gpu_const.length()) { - iq1s_grid_gpu[idx] = iq1s_grid_gpu_const[idx]; - } - } barrier(); } #endif @@ -1634,28 +1346,10 @@ struct block_iq4_xs uint8_t qs[QUANT_K_IQ4_XS/2]; }; -struct block_iq4_xs_packed16 -{ - float16_t d; - uint16_t scales_h; - uint16_t scales_l[QUANT_K_IQ4_XS/128]; - uint16_t qs[QUANT_K_IQ4_XS/4]; -}; - -struct block_iq4_xs_packed32 -{ - float16_t d; - uint16_t scales_h; - uint32_t scales_l; - uint32_t qs[QUANT_K_IQ4_XS/8]; -}; - #if defined(DATA_A_IQ4_XS) #define QUANT_K QUANT_K_IQ4_XS #define QUANT_R QUANT_R_IQ4_XS #define A_TYPE block_iq4_xs -#define A_TYPE_PACKED16 block_iq4_xs_packed16 -#define A_TYPE_PACKED32 block_iq4_xs_packed32 #endif #define QUANT_K_IQ4_NL 32 diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/upscale.comp b/ggml/src/ggml-vulkan/vulkan-shaders/upscale.comp index f7d12a8..037ab0c 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/upscale.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/upscale.comp @@ -21,7 +21,6 @@ layout (binding = 1) writeonly buffer D {D_TYPE data_d[];}; #define NEAREST 0 #define BILINEAR 1 #define BICUBIC 2 -#define BILINEAR_ANTIALIAS 513 layout (constant_id = 0) const uint scale_mode = 0; @@ -63,56 +62,6 @@ float interpolate_bilinear(uint i10, uint i11, uint i12, uint i13) { return fetch_bilinear(c0, c1, d, i12, i13); } -float triangle_filter(float x) { - return max(1.0f - abs(x), 0.0f); -} - -float interpolate_bilinear_antialias(uint i10, uint i11, uint i12, uint i13) { - const float support1 = max(1.0f, 1.0f / p.sf1); - const float invscale1 = 1.0f / support1; - const float support0 = max(1.0f, 1.0f / p.sf0); - const float invscale0 = 1.0f / support0; - - const uint i02 = uint(i12 / p.sf2); - const uint i03 = uint(i13 / p.sf3); - - const float y = (float(i11) + p.pixel_offset) / p.sf1; - const float x = (float(i10) + p.pixel_offset) / p.sf0; - - // the range of source pixels that contribute - const int x_min = max(int(x - support0 + p.pixel_offset), 0); - const int x_max = min(int(x + support0 + p.pixel_offset), int(p.ne00)); - const int y_min = max(int(y - support1 + p.pixel_offset), 0); - const int y_max = min(int(y + support1 + p.pixel_offset), int(p.ne01)); - - // bilinear filter with antialiasing - float val = 0.0f; - float total_weight = 0.0f; - - for (int sy = y_min; sy < y_max; sy++) { - const float weight_y = triangle_filter((sy - y + p.pixel_offset) * invscale1); - - for (int sx = x_min; sx < x_max; sx++) { - const float weight_x = triangle_filter((sx - x + p.pixel_offset) * invscale0); - const float weight = weight_x * weight_y; - - if (weight <= 0.0f) { - continue; - } - - const float pixel = data_a[p.a_offset + i03 * p.nb03 + i02 * p.nb02 + sy * p.nb01 + sx * p.nb00]; - val += pixel * weight; - total_weight += weight; - } - } - - if (total_weight > 0.0f) { - val /= total_weight; - } - - return val; -} - // Bicubic interpolation with alpha = -0.75 // https://en.wikipedia.org/wiki/Bicubic_interpolation#Bicubic_convolution_algorithm const vec4 bcoeffs1 = vec4( 1.25, -2.25, 0.0, 1.0); @@ -169,9 +118,6 @@ void main() { case BICUBIC: result = interpolate_bicubic(i10, i11, i12, i13); break; - case BILINEAR_ANTIALIAS: - result = interpolate_bilinear_antialias(i10, i11, i12, i13); - break; } data_d[p.d_offset + idx] = D_TYPE(result); diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp b/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp index bbdbf9d..e237a8e 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp @@ -552,9 +552,9 @@ void matmul_shaders(bool fp16, MatMulIdType matmul_id_type, bool coopmat, bool c for (const auto& tname : type_names) { std::string load_vec_quant = "2"; - if ((tname == "q4_0") || (tname == "q4_1") || (tname == "q5_1") || (tname == "iq1_s") || (tname == "iq1_m") || (tname == "iq2_xxs") || (tname == "iq2_xs") || (tname == "iq2_s")) + if ((tname == "q4_0") || (tname == "q4_1") || (tname == "iq1_s") || (tname == "iq1_m") || (tname == "iq2_xxs") || (tname == "iq2_xs") || (tname == "iq2_s")) load_vec_quant = "8"; - else if ((tname == "q5_0") || (tname == "q8_0") || (tname == "q2_k") || (tname == "q4_k") || (tname == "q5_k") || (tname == "iq3_xxs") || (tname == "iq3_s") || (tname == "iq4_nl") || (tname == "mxfp4")) + else if ((tname == "q5_0") || (tname == "q5_1") || (tname == "q8_0") || (tname == "iq3_xxs") || (tname == "iq3_s") || (tname == "iq4_nl") || (tname == "mxfp4")) load_vec_quant = "4"; if (tname == "bf16") { @@ -685,7 +685,7 @@ void process_shaders() { // mul mat vec with integer dot product #if defined(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT) - if (is_legacy_quant(tname) || tname == "mxfp4" || is_k_quant(tname) || tname == "iq1_s" || tname == "iq1_m") { + if (is_legacy_quant(tname) || tname == "mxfp4" || is_k_quant(tname)) { string_to_spv("mul_mat_vec_" + tname + "_q8_1_f32", "mul_mat_vecq.comp", merge_maps(base_dict, {{data_a_key, "1"}, {"D_TYPE", "float"}, {"FLOAT_TYPE", "float"}, {"FLOAT_TYPE_VEC2", "vec2"}, {"ACC_TYPE", "float"}})); string_to_spv("mul_mat_vec_" + tname + "_q8_1_f32_subgroup", "mul_mat_vecq.comp", merge_maps(base_dict, {{data_a_key, "1"}, {"D_TYPE", "float"}, {"FLOAT_TYPE", "float"}, {"FLOAT_TYPE_VEC2", "vec2"}, {"ACC_TYPE", "float"}, {"USE_SUBGROUP_ADD", "1"}})); string_to_spv("mul_mat_vec_" + tname + "_q8_1_f32_subgroup_no_shmem", "mul_mat_vecq.comp", merge_maps(base_dict, {{data_a_key, "1"}, {"D_TYPE", "float"}, {"FLOAT_TYPE", "float"}, {"FLOAT_TYPE_VEC2", "vec2"}, {"ACC_TYPE", "float"}, {"USE_SUBGROUP_ADD_NO_SHMEM", "1"}})); @@ -944,10 +944,6 @@ void process_shaders() { string_to_spv("sum_rows_f32", "sum_rows.comp", merge_maps(base_dict, {{"A_TYPE", "float"}, {"D_TYPE", "float"}})); string_to_spv("count_equal_i32", "count_equal.comp", merge_maps(base_dict, {{"A_TYPE", "int"}, {"B_TYPE", "int"}, {"D_TYPE", "int"}})); string_to_spv("cumsum_f32", "cumsum.comp", merge_maps(base_dict, {{"A_TYPE", "float"}, {"D_TYPE", "float"}})); - string_to_spv("cumsum_multipass1_f32", "cumsum_multipass1.comp", merge_maps(base_dict, {{"A_TYPE", "float"}, {"D_TYPE", "float"}})); - string_to_spv("cumsum_multipass2_f32", "cumsum_multipass2.comp", merge_maps(base_dict, {{"A_TYPE", "float"}, {"D_TYPE", "float"}})); - - string_to_spv("count_experts", "count_experts.comp", merge_maps(base_dict, {{"A_TYPE", "uint"}, {"D_TYPE", "uint"}})); for (std::string dim_str : {"", "_3d"}) { for (bool bda : {false, true}) { @@ -1125,7 +1121,7 @@ void write_output_files() { for (const std::string& btype : btypes) { for (const auto& tname : type_names) { - if (btype == "q8_1" && !is_legacy_quant(tname) && tname != "mxfp4" && !is_k_quant(tname) && tname != "iq1_s" && tname != "iq1_m") { + if (btype == "q8_1" && !is_legacy_quant(tname) && tname != "mxfp4" && !is_k_quant(tname)) { continue; } hdr << "extern const void * arr_dmmv_" << tname << "_" << btype << "_f32_data[3];\n"; diff --git a/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp b/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp deleted file mode 100644 index 7fdb4c8..0000000 --- a/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp +++ /dev/null @@ -1,169 +0,0 @@ -#ifndef GGML_WEBGPU_SHADER_LIB_HPP -#define GGML_WEBGPU_SHADER_LIB_HPP - -#include "ggml.h" -#include "pre_wgsl.hpp" - -#include -#include - -#define GGML_WEBGPU_F16_SIZE_BYTES 2 -#define GGML_WEBGPU_F32_SIZE_BYTES 4 -#define GGML_WEBGPU_FLASH_ATTN_PREFERRED_KV_SG_TILES 8u -#define GGML_WEBGPU_FLASH_ATTN_PREFERRED_WG_SIZE 128u -// Matches GGML_PAD(..., 256) in src/llama-context.cpp for KV cache sizing. -#define GGML_WEBGPU_KV_SEQ_PAD 256u - -struct ggml_webgpu_flash_attn_shader_lib_context { - ggml_type kv_type; - uint32_t head_dim_qk; - uint32_t head_dim_v; - bool kv_direct; - bool has_mask; - bool has_sinks; - bool uses_logit_softcap; - uint32_t sg_mat_m; - uint32_t sg_mat_n; - uint32_t sg_mat_k; - size_t wg_mem_limit_bytes; - uint32_t max_subgroup_size; -}; - -struct ggml_webgpu_flash_attn_shader_decisions { - uint32_t q_tile = 0; - uint32_t kv_tile = 0; - uint32_t wg_size = 0; -}; - -struct ggml_webgpu_processed_shader { - std::string wgsl; - std::string variant; - ggml_webgpu_flash_attn_shader_decisions decisions; -}; - -// This is exposed because it's necessary in supports_op -inline size_t ggml_webgpu_flash_attn_wg_mem_bytes(uint32_t q_tile, - uint32_t kv_tile, - uint32_t head_dim_qk, - uint32_t head_dim_v, - bool has_mask, - bool kv_direct) { - const uint32_t max_head_dim = std::max(head_dim_qk, head_dim_v); - size_t f16_elems = 0; - size_t f32_elems = 0; - f16_elems += q_tile * head_dim_qk; // q_shmem - if (!kv_direct) { - f16_elems += kv_tile * max_head_dim; // kv_shmem - } - f16_elems += q_tile * head_dim_v; // o_shmem - if (has_mask) { - f16_elems += q_tile * kv_tile; // mask_shmem - } - f16_elems += q_tile * kv_tile; // inter_shmem - f32_elems += q_tile; // row_max_shmem - f32_elems += q_tile; // exp_sum_shmem - return f16_elems * GGML_WEBGPU_F16_SIZE_BYTES + f32_elems * GGML_WEBGPU_F32_SIZE_BYTES; -} - -static uint32_t ggml_webgpu_flash_attn_max_kv_tile(const ggml_webgpu_flash_attn_shader_lib_context & context) { - const size_t limit_bytes = context.wg_mem_limit_bytes; - const size_t q_tile = context.sg_mat_m; - const size_t base_q_bytes = (context.head_dim_qk + context.head_dim_v) * q_tile * GGML_WEBGPU_F16_SIZE_BYTES + - 2 * q_tile * GGML_WEBGPU_F32_SIZE_BYTES; - size_t bytes_per_kv = 0; - if (!context.kv_direct) { - bytes_per_kv += std::max(context.head_dim_qk, context.head_dim_v); - } - if (context.has_mask) { - bytes_per_kv += q_tile; - } - bytes_per_kv += q_tile; - bytes_per_kv *= GGML_WEBGPU_F16_SIZE_BYTES; - const uint32_t max_kv_tile = (limit_bytes - base_q_bytes) / bytes_per_kv; - return (max_kv_tile / context.sg_mat_n) * context.sg_mat_n; -} - -inline ggml_webgpu_processed_shader ggml_webgpu_preprocess_flash_attn_shader( - pre_wgsl::Preprocessor & preprocessor, - const char * shader_src, - const ggml_webgpu_flash_attn_shader_lib_context & context) { - std::vector defines; - std::string variant = "flash_attn"; - - switch (context.kv_type) { - case GGML_TYPE_F32: - defines.push_back("KV_F32"); - break; - case GGML_TYPE_F16: - defines.push_back("KV_F16"); - break; - case GGML_TYPE_Q4_0: - defines.push_back("KV_Q4_0"); - break; - case GGML_TYPE_Q8_0: - defines.push_back("KV_Q8_0"); - break; - default: - GGML_ABORT("Unsupported KV type for flash attention shader"); - } - variant += std::string("_") + ggml_type_name(context.kv_type); - - if (context.has_mask) { - defines.push_back("MASK"); - variant += "_mask"; - } - if (context.has_sinks) { - defines.push_back("SINKS"); - variant += "_sinks"; - } - if (context.uses_logit_softcap) { - defines.push_back("LOGIT_SOFTCAP"); - variant += "_lgsc"; - } - - if (context.kv_direct) { - defines.push_back("KV_DIRECT"); - variant += "_kvdirect"; - } - - defines.push_back(std::string("HEAD_DIM_QK=") + std::to_string(context.head_dim_qk)); - variant += std::string("_hsqk") + std::to_string(context.head_dim_qk); - - defines.push_back(std::string("HEAD_DIM_V=") + std::to_string(context.head_dim_v)); - variant += std::string("_hsv") + std::to_string(context.head_dim_v); - - // For now these are not part of the variant name - defines.push_back(std::string("SG_MAT_M=") + std::to_string(context.sg_mat_m)); - defines.push_back(std::string("SG_MAT_N=") + std::to_string(context.sg_mat_n)); - defines.push_back(std::string("SG_MAT_K=") + std::to_string(context.sg_mat_k)); - - // Add chosen Q/KV tile sizes - uint32_t q_tile = context.sg_mat_m; - uint32_t kv_tile = std::min(ggml_webgpu_flash_attn_max_kv_tile(context), - context.sg_mat_n * GGML_WEBGPU_FLASH_ATTN_PREFERRED_KV_SG_TILES); - if (context.kv_direct) { - GGML_ASSERT(kv_tile <= GGML_WEBGPU_KV_SEQ_PAD); - // Avoids having to use bounds-checks and decreasing performance for direct KV loads - while (GGML_WEBGPU_KV_SEQ_PAD % kv_tile != 0) { - kv_tile -= context.sg_mat_n; - } - } - - defines.push_back(std::string("Q_TILE=") + std::to_string(q_tile)); - defines.push_back(std::string("KV_TILE=") + std::to_string(kv_tile)); - - // workgroup size - uint32_t wg_size = std::max(context.max_subgroup_size, GGML_WEBGPU_FLASH_ATTN_PREFERRED_WG_SIZE); - - defines.push_back(std::string("WG_SIZE=") + std::to_string(wg_size)); - - ggml_webgpu_processed_shader result; - result.wgsl = preprocessor.preprocess(shader_src, defines); - result.variant = variant; - result.decisions.q_tile = q_tile; - result.decisions.kv_tile = kv_tile; - result.decisions.wg_size = wg_size; - return result; -} - -#endif // GGML_WEBGPU_SHADER_LIB_HPP diff --git a/ggml/src/ggml-webgpu/ggml-webgpu.cpp b/ggml/src/ggml-webgpu/ggml-webgpu.cpp index 5b8f7f7..d0e99b6 100644 --- a/ggml/src/ggml-webgpu/ggml-webgpu.cpp +++ b/ggml/src/ggml-webgpu/ggml-webgpu.cpp @@ -7,9 +7,7 @@ #include "ggml-backend-impl.h" #include "ggml-impl.h" -#include "ggml-webgpu-shader-lib.hpp" #include "ggml-wgsl-shaders.hpp" -#include "pre_wgsl.hpp" #ifdef __EMSCRIPTEN__ # include @@ -19,7 +17,6 @@ #include #include -#include #include #include #include @@ -33,7 +30,7 @@ #ifdef GGML_WEBGPU_DEBUG # define WEBGPU_LOG_DEBUG(msg) std::cout << msg << std::endl -# define WEBGPU_DEBUG_BUF_ELEMS 512 +# define WEBGPU_DEBUG_BUF_ELEMS 32 #else # define WEBGPU_LOG_DEBUG(msg) ((void) 0) #endif // GGML_WEBGPU_DEBUG @@ -254,7 +251,6 @@ struct webgpu_gpu_profile_buf_pool { struct webgpu_pipeline { wgpu::ComputePipeline pipeline; std::string name; - void * context = nullptr; }; struct webgpu_command { @@ -267,46 +263,6 @@ struct webgpu_command { #endif }; -struct flash_attn_pipeline_key { - int q_type; - int kv_type; - int dst_type; - uint32_t head_dim_qk; - uint32_t head_dim_v; - bool kv_direct; - bool has_mask; - bool has_sinks; - bool uses_logit_softcap; - - bool operator==(const flash_attn_pipeline_key & other) const { - return q_type == other.q_type && kv_type == other.kv_type && dst_type == other.dst_type && - head_dim_qk == other.head_dim_qk && head_dim_v == other.head_dim_v && kv_direct == other.kv_direct && - has_mask == other.has_mask && has_sinks == other.has_sinks && - uses_logit_softcap == other.uses_logit_softcap; - } -}; - -// Same hash combine function as in boost -template inline void ggml_webgpu_hash_combine(size_t & seed, const T & value) { - seed ^= std::hash{}(value) + 0x9e3779b9 + (seed << 6) + (seed >> 2); -} - -struct flash_attn_pipeline_key_hash { - size_t operator()(const flash_attn_pipeline_key & key) const { - size_t seed = 0; - ggml_webgpu_hash_combine(seed, key.q_type); - ggml_webgpu_hash_combine(seed, key.kv_type); - ggml_webgpu_hash_combine(seed, key.dst_type); - ggml_webgpu_hash_combine(seed, key.head_dim_qk); - ggml_webgpu_hash_combine(seed, key.head_dim_v); - ggml_webgpu_hash_combine(seed, key.kv_direct); - ggml_webgpu_hash_combine(seed, key.has_mask); - ggml_webgpu_hash_combine(seed, key.has_sinks); - ggml_webgpu_hash_combine(seed, key.uses_logit_softcap); - return seed; - } -}; - // All the base objects needed to run operations on a WebGPU device struct webgpu_context_struct { wgpu::Instance instance; @@ -315,12 +271,12 @@ struct webgpu_context_struct { wgpu::Queue queue; wgpu::Limits limits; - uint32_t max_subgroup_size; + uint32_t subgroup_size; - bool supports_subgroup_matrix = false; - uint32_t sg_mat_m; - uint32_t sg_mat_n; - uint32_t sg_mat_k; +#ifndef __EMSCRIPTEN__ + bool supports_subgroup_matrix = false; + wgpu::SubgroupMatrixConfig subgroup_matrix_config; +#endif std::recursive_mutex mutex; std::atomic_uint inflight_threads = 0; @@ -328,24 +284,20 @@ struct webgpu_context_struct { webgpu_buf_pool param_buf_pool; webgpu_buf_pool set_rows_error_buf_pool; - pre_wgsl::Preprocessor p; - std::map memset_pipelines; // variant or type index std::map>> mul_mat_pipelines; // src0_type, src1_type, vectorized std::map>> mul_mat_vec_pipelines; // src0_type, src1_type, vectorized - std::unordered_map flash_attn_pipelines; + std::map> set_rows_pipelines; // dst_type, vectorized + std::map> get_rows_pipelines; // src_type, vectorized - std::map> set_rows_pipelines; // dst_type, vectorized - std::map> get_rows_pipelines; // src_type, vectorized - - std::map> cpy_pipelines; // src_type, dst_type - std::map> add_pipelines; // type, inplace - std::map> sub_pipelines; // type, inplace - std::map> mul_pipelines; // type, inplace - std::map> div_pipelines; // type, inplace + std::map> cpy_pipelines; // src_type, dst_type + std::map> add_pipelines; // type, inplace + std::map> sub_pipelines; // type, inplace + std::map> mul_pipelines; // type, inplace + std::map> div_pipelines; // type, inplace std::map rms_norm_pipelines; // inplace std::map>> rope_pipelines; // type, ff, inplace @@ -409,6 +361,8 @@ struct ggml_backend_webgpu_buffer_context { label(std::move(lbl)) {} }; +/* End struct definitions */ + /* WebGPU object initializations */ // Process a WGSL shader string, replacing tokens of the form {{KEY}} with @@ -530,9 +484,14 @@ static void ggml_backend_webgpu_debug(webgpu_context & ctx) { encoder.CopyBufferToBuffer(ctx->debug_dev_buf, 0, ctx->debug_host_buf, 0, ctx->debug_host_buf.GetSize()); wgpu::CommandBuffer commands = encoder.Finish(); ctx->queue.Submit(1, &commands); + ggml_backend_webgpu_map_buffer(ctx, ctx->debug_host_buf, wgpu::MapMode::Read, 0, ctx->debug_host_buf.GetSize()); - const float * debug_data = (const float *) ctx->debug_host_buf.GetConstMappedRange(); - std::cout << "debug[0]: " << debug_data[0] << "\n"; + const uint32_t * debug_data = (const uint32_t *) ctx->debug_host_buf.GetConstMappedRange(); + std::cout << "debug data:"; + for (size_t i = 0; i < WEBGPU_DEBUG_BUF_ELEMS; i++) { + std::cout << " " << i << ": " << debug_data[i]; + } + std::cout << "\n"; ctx->debug_host_buf.Unmap(); } #endif @@ -714,7 +673,6 @@ static const char * ggml_backend_webgpu_name(ggml_backend_t backend) { return ctx->name.c_str(); } -// TODO: implement proper cleanup static void ggml_backend_webgpu_free(ggml_backend_t backend) { ggml_backend_webgpu_context * ctx = (ggml_backend_webgpu_context *) backend->context; WEBGPU_LOG_DEBUG("ggml_backend_webgpu_free(" << ctx->name << ")"); @@ -772,12 +730,12 @@ static wgpu::Buffer ggml_webgpu_tensor_buf(const ggml_tensor * tensor) { return ctx->buffer; } -static size_t ggml_webgpu_tensor_misalignment(webgpu_context & ctx, const ggml_tensor * t) { +static size_t ggml_webgpu_tensor_misalignment(webgpu_context & ctx, ggml_tensor * t) { size_t offset = ggml_webgpu_tensor_offset(t); return offset & (ctx->limits.minStorageBufferOffsetAlignment - 1); } -static size_t ggml_webgpu_tensor_align_offset(webgpu_context & ctx, const ggml_tensor * t) { +static size_t ggml_webgpu_tensor_align_offset(webgpu_context & ctx, ggml_tensor * t) { size_t offset = ggml_webgpu_tensor_offset(t); return offset & ~(ctx->limits.minStorageBufferOffsetAlignment - 1); } @@ -1006,10 +964,12 @@ static webgpu_command ggml_webgpu_mul_mat(webgpu_context & ctx, #ifndef __EMSCRIPTEN__ if (ctx->supports_subgroup_matrix) { // The total number of subgroups/workgroups needed per matrix. - uint32_t wg_m_sg_tile = WEBGPU_MUL_MAT_SUBGROUP_M * WEBGPU_MUL_MAT_SUBGROUP_MATRIX_M * ctx->sg_mat_m; - wg_m = CEIL_DIV(dst->ne[0], wg_m_sg_tile); - uint32_t wg_n_sg_tile = WEBGPU_MUL_MAT_SUBGROUP_N * WEBGPU_MUL_MAT_SUBGROUP_MATRIX_N * ctx->sg_mat_n; - wg_n = CEIL_DIV(dst->ne[1], wg_n_sg_tile); + uint32_t wg_m_sg_tile = + WEBGPU_MUL_MAT_SUBGROUP_M * WEBGPU_MUL_MAT_SUBGROUP_MATRIX_M * ctx->subgroup_matrix_config.M; + wg_m = CEIL_DIV(dst->ne[0], wg_m_sg_tile); + uint32_t wg_n_sg_tile = + WEBGPU_MUL_MAT_SUBGROUP_N * WEBGPU_MUL_MAT_SUBGROUP_MATRIX_N * ctx->subgroup_matrix_config.N; + wg_n = CEIL_DIV(dst->ne[1], wg_n_sg_tile); } else { #endif uint32_t tile_m_s = WEBGPU_MUL_MAT_TILE_M * WEBGPU_MUL_MAT_WG_SIZE_M; @@ -1026,146 +986,6 @@ static webgpu_command ggml_webgpu_mul_mat(webgpu_context & ctx, return ggml_backend_webgpu_build(ctx, pipeline, params, entries, wg_x, wg_y); } -static webgpu_command ggml_webgpu_flash_attn(webgpu_context & ctx, - ggml_tensor * Q, - ggml_tensor * K, - ggml_tensor * V, - ggml_tensor * mask, - ggml_tensor * sinks, - ggml_tensor * dst) { - float scale = *(float *) dst->op_params; - float max_bias; - memcpy(&max_bias, (float *) dst->op_params + 1, sizeof(float)); - float logit_softcap; - memcpy(&logit_softcap, (float *) dst->op_params + 2, sizeof(float)); - if (logit_softcap != 0.0f) { - scale /= logit_softcap; - } - float n_head_log2 = float(1u << (uint32_t) floor(log2(Q->ne[2]))); - float m0 = powf(2.0f, -(max_bias) / n_head_log2); - float m1 = powf(2.0f, -(max_bias / 2.0f) / n_head_log2); - - const int has_mask = (mask != nullptr); - const int has_sinks = (sinks != nullptr); - - std::vector params = { - (uint32_t) (ggml_webgpu_tensor_misalignment(ctx, Q) / ggml_type_size(Q->type)), - (uint32_t) (ggml_webgpu_tensor_misalignment(ctx, K) / ggml_type_size(K->type)), - (uint32_t) (ggml_webgpu_tensor_misalignment(ctx, V) / ggml_type_size(V->type)), - has_mask ? (uint32_t) (ggml_webgpu_tensor_misalignment(ctx, mask) / ggml_type_size(mask->type)) : 0, - has_sinks ? (uint32_t) (ggml_webgpu_tensor_misalignment(ctx, sinks) / ggml_type_size(sinks->type)) : 0, - (uint32_t) (ggml_webgpu_tensor_misalignment(ctx, dst) / ggml_type_size(dst->type)), - (uint32_t) Q->ne[2], // number of heads - (uint32_t) Q->ne[1], // sequence length (Q) - (uint32_t) K->ne[1], // sequence length (K/V) - (uint32_t) (Q->nb[1] / ggml_type_size(Q->type)), // stride (elements/blocks) of Q in dimension 1 - (uint32_t) (Q->nb[2] / ggml_type_size(Q->type)), // stride (elements/blocks) of Q in dimension 2 - (uint32_t) (Q->nb[3] / ggml_type_size(Q->type)), // stride (elements/blocks) of Q in dimension 3 - (uint32_t) (K->nb[1] / ggml_type_size(K->type)), // stride (elements/blocks) of K in dimension 1 - (uint32_t) (K->nb[2] / ggml_type_size(K->type)), // stride (elements/blocks) of K in dimension 2 - (uint32_t) (K->nb[3] / ggml_type_size(K->type)), // stride (elements/blocks) of K in dimension 3 - (uint32_t) (V->nb[1] / ggml_type_size(V->type)), // stride (elements/blocks) of V in dimension 1 - (uint32_t) (V->nb[2] / ggml_type_size(V->type)), // stride (elements/blocks) of V in dimension 2 - (uint32_t) (V->nb[3] / ggml_type_size(V->type)), // stride (elements/blocks) of V in dimension 3 - has_mask ? (uint32_t) (mask->nb[3] / ggml_type_size(mask->type)) : 0, // stride of mask dim 3 - (uint32_t) (Q->ne[2] / K->ne[2]), // repeat factor for K/V in dim 2 (MHA/MQA/GQA) - *(uint32_t *) &scale, // scale (possibly adjusted for logit softcap) - *(uint32_t *) &max_bias, - *(uint32_t *) &logit_softcap, - *(uint32_t *) &n_head_log2, - *(uint32_t *) &m0, - *(uint32_t *) &m1 - - }; - std::vector entries = { - { .binding = 0, - .buffer = ggml_webgpu_tensor_buf(Q), - .offset = ggml_webgpu_tensor_align_offset(ctx, Q), - .size = ggml_webgpu_tensor_binding_size(ctx, Q) }, - { .binding = 1, - .buffer = ggml_webgpu_tensor_buf(K), - .offset = ggml_webgpu_tensor_align_offset(ctx, K), - .size = ggml_webgpu_tensor_binding_size(ctx, K) }, - { .binding = 2, - .buffer = ggml_webgpu_tensor_buf(V), - .offset = ggml_webgpu_tensor_align_offset(ctx, V), - .size = ggml_webgpu_tensor_binding_size(ctx, V) } - }; - uint32_t binding_index = 3; - if (has_mask) { - entries.push_back({ .binding = binding_index++, - .buffer = ggml_webgpu_tensor_buf(mask), - .offset = ggml_webgpu_tensor_align_offset(ctx, mask), - .size = ggml_webgpu_tensor_binding_size(ctx, mask) }); - } - if (has_sinks) { - entries.push_back({ .binding = binding_index++, - .buffer = ggml_webgpu_tensor_buf(sinks), - .offset = ggml_webgpu_tensor_align_offset(ctx, sinks), - .size = ggml_webgpu_tensor_binding_size(ctx, sinks) }); - } - entries.push_back({ .binding = binding_index++, - .buffer = ggml_webgpu_tensor_buf(dst), - .offset = ggml_webgpu_tensor_align_offset(ctx, dst), - .size = ggml_webgpu_tensor_binding_size(ctx, dst) }); - - bool kv_direct = - (K->type == GGML_TYPE_F16) && (Q->ne[0] % ctx->sg_mat_k == 0) && (K->ne[1] % GGML_WEBGPU_KV_SEQ_PAD == 0); - - flash_attn_pipeline_key key = { - .q_type = Q->type, - .kv_type = K->type, - .dst_type = dst->type, - .head_dim_qk = (uint32_t) Q->ne[0], - .head_dim_v = (uint32_t) V->ne[0], - .kv_direct = kv_direct, - .has_mask = static_cast(has_mask), - .has_sinks = static_cast(has_sinks), - .uses_logit_softcap = logit_softcap != 0.0f, - }; - - webgpu_pipeline pipeline; - ggml_webgpu_flash_attn_shader_decisions decisions = {}; - - auto it = ctx->flash_attn_pipelines.find(key); - if (it != ctx->flash_attn_pipelines.end()) { - pipeline = it->second; - decisions = *static_cast(pipeline.context); - } else { - std::lock_guard lock(ctx->mutex); - it = ctx->flash_attn_pipelines.find(key); - if (it != ctx->flash_attn_pipelines.end()) { - pipeline = it->second; - decisions = *static_cast(pipeline.context); - } else { - ggml_webgpu_flash_attn_shader_lib_context shader_lib_ctx = { .kv_type = K->type, - .head_dim_qk = (uint32_t) Q->ne[0], - .head_dim_v = (uint32_t) V->ne[0], - .kv_direct = kv_direct, - .has_mask = static_cast(has_mask), - .has_sinks = static_cast(has_sinks), - .uses_logit_softcap = logit_softcap != 0.0f, - .sg_mat_m = ctx->sg_mat_m, - .sg_mat_n = ctx->sg_mat_n, - .sg_mat_k = ctx->sg_mat_k, - .wg_mem_limit_bytes = - ctx->limits.maxComputeWorkgroupStorageSize, - .max_subgroup_size = ctx->max_subgroup_size }; - - ggml_webgpu_processed_shader processed = - ggml_webgpu_preprocess_flash_attn_shader(ctx->p, wgsl_flash_attn, shader_lib_ctx); - pipeline = ggml_webgpu_create_pipeline(ctx->device, processed.wgsl.c_str(), processed.variant.c_str()); - pipeline.context = new ggml_webgpu_flash_attn_shader_decisions(processed.decisions); - ctx->flash_attn_pipelines.emplace(key, pipeline); - decisions = processed.decisions; - } - } - - uint32_t wg_per_head = CEIL_DIV(Q->ne[1], decisions.q_tile); - uint32_t wg_x = wg_per_head * Q->ne[2] * Q->ne[3]; // wg per head * number of heads * number of batches - return ggml_backend_webgpu_build(ctx, pipeline, params, entries, wg_x); -} - static webgpu_command ggml_webgpu_unary_op(webgpu_context & ctx, ggml_tensor * src, ggml_tensor * dst) { uint32_t ne = (uint32_t) ggml_nelements(dst); ggml_unary_op unary_op = ggml_get_unary_op(dst); @@ -1577,8 +1397,6 @@ static std::optional ggml_webgpu_encode_node(webgpu_context ctx, return ggml_webgpu_get_rows(ctx, src0, src1, node); case GGML_OP_MUL_MAT: return ggml_webgpu_mul_mat(ctx, src0, src1, node); - case GGML_OP_FLASH_ATTN_EXT: - return ggml_webgpu_flash_attn(ctx, src0, src1, src2, node->src[3], node->src[4], node); case GGML_OP_ADD: { int inplace = ggml_webgpu_tensor_equal(src0, node); @@ -1648,7 +1466,6 @@ static ggml_status ggml_backend_webgpu_graph_compute(ggml_backend_t backend, str webgpu_submission_futures new_futures = ggml_backend_webgpu_submit(ctx, commands); futures.push_back(new_futures); } - ggml_backend_webgpu_wait(ctx, futures); ctx->inflight_threads--; WEBGPU_CPU_PROFILE_TOTAL_END(graph_compute, ctx); @@ -1881,18 +1698,9 @@ static const char * ggml_backend_webgpu_device_get_description(ggml_backend_dev_ static void ggml_backend_webgpu_device_get_memory(ggml_backend_dev_t dev, size_t * free, size_t * total) { ggml_backend_webgpu_device_context * ctx = static_cast(dev->context); - // TODO: for now, return maxBufferSize as both free and total memory - // Track https://github.com/gpuweb/gpuweb/issues/5505 for updates. - uint64_t max_buffer_size = ctx->webgpu_ctx->limits.maxBufferSize; - // If we're on a 32-bit system, clamp to UINTPTR_MAX -#if UINTPTR_MAX < UINT64_MAX - uint64_t max_ptr_size = static_cast(UINTPTR_MAX); - if (max_buffer_size > max_ptr_size) { - max_buffer_size = max_ptr_size; - } -#endif - *free = static_cast(max_buffer_size); - *total = static_cast(max_buffer_size); + // TODO: what do we actually want to return here? maxBufferSize might not be the full available memory. + *free = ctx->webgpu_ctx->limits.maxBufferSize; + *total = ctx->webgpu_ctx->limits.maxBufferSize; } static enum ggml_backend_dev_type ggml_backend_webgpu_device_get_type(ggml_backend_dev_t dev) { @@ -2000,15 +1808,15 @@ static void ggml_webgpu_init_mul_mat_pipeline(webgpu_context & webgpu_ctx) { #ifndef __EMSCRIPTEN__ if (webgpu_ctx->supports_subgroup_matrix) { std::map sg_matrix_repls; - sg_matrix_repls["WEBGPU_MAX_SUBGROUP_SIZE"] = std::to_string(webgpu_ctx->max_subgroup_size); + sg_matrix_repls["WEBGPU_MAX_SUBGROUP_SIZE"] = std::to_string(webgpu_ctx->subgroup_size); sg_matrix_repls["WEBGPU_TILE_K"] = std::to_string(WEBGPU_MUL_MAT_TILE_K); sg_matrix_repls["WEBGPU_SUBGROUP_M"] = std::to_string(WEBGPU_MUL_MAT_SUBGROUP_M); sg_matrix_repls["WEBGPU_SUBGROUP_N"] = std::to_string(WEBGPU_MUL_MAT_SUBGROUP_N); sg_matrix_repls["WEBGPU_SUBGROUP_MATRIX_M"] = std::to_string(WEBGPU_MUL_MAT_SUBGROUP_MATRIX_M); sg_matrix_repls["WEBGPU_SUBGROUP_MATRIX_N"] = std::to_string(WEBGPU_MUL_MAT_SUBGROUP_MATRIX_N); - sg_matrix_repls["WEBGPU_SG_MAT_M_SIZE"] = std::to_string(webgpu_ctx->sg_mat_m); - sg_matrix_repls["WEBGPU_SG_MAT_N_SIZE"] = std::to_string(webgpu_ctx->sg_mat_n); - sg_matrix_repls["WEBGPU_SG_MAT_K_SIZE"] = std::to_string(webgpu_ctx->sg_mat_k); + sg_matrix_repls["WEBGPU_SG_MAT_M_SIZE"] = std::to_string(webgpu_ctx->subgroup_matrix_config.M); + sg_matrix_repls["WEBGPU_SG_MAT_N_SIZE"] = std::to_string(webgpu_ctx->subgroup_matrix_config.N); + sg_matrix_repls["WEBGPU_SG_MAT_K_SIZE"] = std::to_string(webgpu_ctx->subgroup_matrix_config.K); proc_mul_mat_f32_f32 = ggml_webgpu_process_shader_repls(wgsl_mul_mat_subgroup_matrix_f32_f32, sg_matrix_repls); proc_mul_mat_f32_f32_vec = @@ -2465,16 +2273,6 @@ static void ggml_webgpu_init_unary_pipeline(webgpu_context & webgpu_ctx) { ggml_webgpu_create_pipeline(webgpu_ctx->device, wgsl_xielu_inplace_f32, "xielu_inplace_f32", constants); webgpu_ctx->unary_pipelines[GGML_UNARY_OP_XIELU][GGML_TYPE_F16][1] = ggml_webgpu_create_pipeline(webgpu_ctx->device, wgsl_xielu_inplace_f16, "xielu_inplace_f16", constants); - - // CEIL - webgpu_ctx->unary_pipelines[GGML_UNARY_OP_CEIL][GGML_TYPE_F32][0] = - ggml_webgpu_create_pipeline(webgpu_ctx->device, wgsl_ceil_f32, "ceil_f32", constants); - webgpu_ctx->unary_pipelines[GGML_UNARY_OP_CEIL][GGML_TYPE_F16][0] = - ggml_webgpu_create_pipeline(webgpu_ctx->device, wgsl_ceil_f16, "ceil_f16", constants); - webgpu_ctx->unary_pipelines[GGML_UNARY_OP_CEIL][GGML_TYPE_F32][1] = - ggml_webgpu_create_pipeline(webgpu_ctx->device, wgsl_ceil_inplace_f32, "ceil_inplace_f32", constants); - webgpu_ctx->unary_pipelines[GGML_UNARY_OP_CEIL][GGML_TYPE_F16][1] = - ggml_webgpu_create_pipeline(webgpu_ctx->device, wgsl_ceil_inplace_f16, "ceil_inplace_f16", constants); } static void ggml_webgpu_init_scale_pipeline(webgpu_context & webgpu_ctx) { @@ -2520,7 +2318,6 @@ static void ggml_webgpu_init_soft_max_pipeline(webgpu_context & webgpu_ctx) { webgpu_ctx->device, wgsl_soft_max_f32_mask_f16_sink_inplace, "soft_max_f32_mask_f16_sink_inplace", constants); } -// TODO: move most initialization logic here static ggml_backend_t ggml_backend_webgpu_device_init(ggml_backend_dev_t dev, const char * params) { GGML_UNUSED(params); @@ -2682,29 +2479,6 @@ static bool ggml_backend_webgpu_device_supports_op(ggml_backend_dev_t dev, const } break; } - case GGML_OP_FLASH_ATTN_EXT: - { - if (!webgpu_ctx->supports_subgroup_matrix) { - break; - } - // Head dimensions must fit in workgroup memory with minimum tile sizes - size_t limit_bytes = webgpu_ctx->limits.maxComputeWorkgroupStorageSize; - const bool has_mask = op->src[3] != nullptr; - const bool kv_direct = src1->type == GGML_TYPE_F16 && (src0->ne[0] % webgpu_ctx->sg_mat_k) == 0 && - (src1->ne[1] % GGML_WEBGPU_KV_SEQ_PAD) == 0; - const size_t min_bytes = ggml_webgpu_flash_attn_wg_mem_bytes( - webgpu_ctx->sg_mat_m, webgpu_ctx->sg_mat_n, (uint32_t) src0->ne[0], (uint32_t) src2->ne[0], - has_mask, kv_direct); - if (min_bytes > limit_bytes) { - break; - } - - supports_op = src0->type == GGML_TYPE_F32 && - (src1->type == GGML_TYPE_F32 || src1->type == GGML_TYPE_F16 || - src1->type == GGML_TYPE_Q4_0 || src1->type == GGML_TYPE_Q8_0) && - src2->type == src1->type && op->type == GGML_TYPE_F32; - break; - } case GGML_OP_RMS_NORM: supports_op = op->type == GGML_TYPE_F32 && src0->type == GGML_TYPE_F32; break; @@ -2754,7 +2528,6 @@ static bool ggml_backend_webgpu_device_supports_op(ggml_backend_dev_t dev, const case GGML_UNARY_OP_EXP: case GGML_UNARY_OP_GELU_ERF: case GGML_UNARY_OP_XIELU: - case GGML_UNARY_OP_CEIL: supports_op = supports_op = (op->type == GGML_TYPE_F32 || op->type == GGML_TYPE_F16) && (src0->type == op->type); break; @@ -2822,7 +2595,6 @@ static size_t ggml_backend_webgpu_reg_get_device_count(ggml_backend_reg_t reg) { } // TODO: Does this need to be thread safe? Is it only called once? -// TODO: move most logic to device_init function so backend can be freed/initialized properly // Only one device is supported for now static ggml_backend_dev_t ggml_backend_webgpu_reg_get_device(ggml_backend_reg_t reg, size_t index) { GGML_ASSERT(index == 0); @@ -2882,9 +2654,7 @@ static ggml_backend_dev_t ggml_backend_webgpu_reg_get_device(ggml_backend_reg_t if (config.M == config.N && config.N == config.K && (config.K == 8 || config.K == 16) && config.componentType == wgpu::SubgroupMatrixComponentType::F16 && config.resultComponentType == wgpu::SubgroupMatrixComponentType::F16) { - ctx->sg_mat_m = config.M; - ctx->sg_mat_n = config.N; - ctx->sg_mat_k = config.K; + ctx->subgroup_matrix_config = config; valid_subgroup_matrix_config = true; break; } @@ -2895,7 +2665,7 @@ static ggml_backend_dev_t ggml_backend_webgpu_reg_get_device(ggml_backend_reg_t #endif // For subgroup matrix code to be the most efficient, we would like the subgroup size to be consistent and accurate. // Unfortunately, that is not possible, so we use the maximum subgroup size reported by the adapter. - ctx->max_subgroup_size = info.subgroupMaxSize; + ctx->subgroup_size = info.subgroupMaxSize; // Initialize device std::vector required_features = { wgpu::FeatureName::ShaderF16 }; @@ -2920,11 +2690,8 @@ static ggml_backend_dev_t ggml_backend_webgpu_reg_get_device(ggml_backend_reg_t wgpu::CallbackMode::AllowSpontaneous, [](const wgpu::Device & device, wgpu::DeviceLostReason reason, wgpu::StringView message) { GGML_UNUSED(device); - GGML_UNUSED(reason); - GGML_UNUSED(message); - //TODO: uncomment once proper free logic is in place - //GGML_LOG_ERROR("ggml_webgpu: Device lost! Reason: %d, Message: %s\n", static_cast(reason), - //std::string(message).c_str()); + GGML_LOG_ERROR("ggml_webgpu: Device lost! Reason: %d, Message: %s\n", static_cast(reason), + std::string(message).c_str()); }); dev_desc.SetUncapturedErrorCallback( [](const wgpu::Device & device, wgpu::ErrorType reason, wgpu::StringView message) { diff --git a/ggml/src/ggml-webgpu/pre_wgsl.hpp b/ggml/src/ggml-webgpu/pre_wgsl.hpp deleted file mode 100644 index 4d43594..0000000 --- a/ggml/src/ggml-webgpu/pre_wgsl.hpp +++ /dev/null @@ -1,778 +0,0 @@ -#ifndef PRE_WGSL_HPP -#define PRE_WGSL_HPP - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace pre_wgsl { - -//============================================================== -// Options -//============================================================== -struct Options { - std::string include_path = "."; - std::vector macros; -}; - -//============================================================== -// Utility: trim -//============================================================== -static std::string trim(const std::string & s) { - size_t a = 0; - while (a < s.size() && std::isspace((unsigned char) s[a])) { - a++; - } - size_t b = s.size(); - while (b > a && std::isspace((unsigned char) s[b - 1])) { - b--; - } - return s.substr(a, b - a); -} - -static std::string trim_value(std::istream & is) { - std::string str; - std::getline(is, str); - return trim(str); -} - -static bool isIdentChar(char c) { - return std::isalnum(static_cast(c)) || c == '_'; -} - -static std::string expandMacrosRecursiveInternal(const std::string & line, - const std::unordered_map & macros, - std::unordered_set & visiting); - -static std::string expandMacroValue(const std::string & name, - const std::unordered_map & macros, - std::unordered_set & visiting) { - if (visiting.count(name)) { - throw std::runtime_error("Recursive macro: " + name); - } - visiting.insert(name); - - auto it = macros.find(name); - if (it == macros.end()) { - visiting.erase(name); - return name; - } - - const std::string & value = it->second; - if (value.empty()) { - visiting.erase(name); - return ""; - } - - std::string expanded = expandMacrosRecursiveInternal(value, macros, visiting); - visiting.erase(name); - return expanded; -} - -static std::string expandMacrosRecursiveInternal(const std::string & line, - const std::unordered_map & macros, - std::unordered_set & visiting) { - std::string result; - result.reserve(line.size()); - - size_t i = 0; - while (i < line.size()) { - if (isIdentChar(line[i])) { - size_t start = i; - while (i < line.size() && isIdentChar(line[i])) { - i++; - } - std::string token = line.substr(start, i - start); - - auto it = macros.find(token); - if (it != macros.end()) { - result += expandMacroValue(token, macros, visiting); - } else { - result += token; - } - } else { - result += line[i]; - i++; - } - } - - return result; -} - -static std::string expandMacrosRecursive(const std::string & line, - const std::unordered_map & macros) { - std::unordered_set visiting; - return expandMacrosRecursiveInternal(line, macros, visiting); -} - -//============================================================== -// Tokenizer for expressions in #if/#elif -//============================================================== -class ExprLexer { - public: - enum Kind { END, IDENT, NUMBER, OP, LPAREN, RPAREN }; - - struct Tok { - Kind kind; - std::string text; - }; - - explicit ExprLexer(std::string_view sv) : src(sv), pos(0) {} - - Tok next() { - skipWS(); - if (pos >= src.size()) { - return { END, "" }; - } - - char c = src[pos]; - - // number - if (std::isdigit((unsigned char) c)) { - size_t start = pos; - while (pos < src.size() && std::isdigit((unsigned char) src[pos])) { - pos++; - } - return { NUMBER, std::string(src.substr(start, pos - start)) }; - } - - // identifier - if (std::isalpha((unsigned char) c) || c == '_') { - size_t start = pos; - while (pos < src.size() && (std::isalnum((unsigned char) src[pos]) || src[pos] == '_')) { - pos++; - } - return { IDENT, std::string(src.substr(start, pos - start)) }; - } - - if (c == '(') { - pos++; - return { LPAREN, "(" }; - } - if (c == ')') { - pos++; - return { RPAREN, ")" }; - } - - // multi-char operators - static const char * two_ops[] = { "==", "!=", "<=", ">=", "&&", "||", "<<", ">>" }; - for (auto op : two_ops) { - if (src.substr(pos, 2) == op) { - pos += 2; - return { OP, std::string(op) }; - } - } - - // single-char operators - if (std::string("+-*/%<>!").find(c) != std::string::npos) { - pos++; - return { OP, std::string(1, c) }; - } - - // unexpected - pos++; - return { END, "" }; - } - - private: - std::string_view src; - size_t pos; - - void skipWS() { - while (pos < src.size() && std::isspace((unsigned char) src[pos])) { - pos++; - } - } -}; - -//============================================================== -// Expression Parser (recursive descent) -//============================================================== -class ExprParser { - public: - ExprParser(std::string_view expr, - const std::unordered_map & macros, - std::unordered_set & visiting) : - lex(expr), - macros(macros), - visiting(visiting) { - advance(); - } - - int parse() { return parseLogicalOr(); } - - private: - ExprLexer lex; - ExprLexer::Tok tok; - const std::unordered_map & macros; - std::unordered_set & visiting; - - void advance() { tok = lex.next(); } - - bool acceptOp(const std::string & s) { - if (tok.kind == ExprLexer::OP && tok.text == s) { - advance(); - return true; - } - return false; - } - - bool acceptKind(ExprLexer::Kind k) { - if (tok.kind == k) { - advance(); - return true; - } - return false; - } - - int parseLogicalOr() { - int v = parseLogicalAnd(); - while (acceptOp("||")) { - int rhs = parseLogicalAnd(); - v = (v || rhs); - } - return v; - } - - int parseLogicalAnd() { - int v = parseEquality(); - while (acceptOp("&&")) { - int rhs = parseEquality(); - v = (v && rhs); - } - return v; - } - - int parseEquality() { - int v = parseRelational(); - for (;;) { - if (acceptOp("==")) { - int rhs = parseRelational(); - v = (v == rhs); - } else if (acceptOp("!=")) { - int rhs = parseRelational(); - v = (v != rhs); - } else { - break; - } - } - return v; - } - - int parseRelational() { - int v = parseShift(); - for (;;) { - if (acceptOp("<")) { - int rhs = parseShift(); - v = (v < rhs); - } else if (acceptOp(">")) { - int rhs = parseShift(); - v = (v > rhs); - } else if (acceptOp("<=")) { - int rhs = parseShift(); - v = (v <= rhs); - } else if (acceptOp(">=")) { - int rhs = parseShift(); - v = (v >= rhs); - } else { - break; - } - } - return v; - } - - int parseShift() { - int v = parseAdd(); - for (;;) { - if (acceptOp("<<")) { - int rhs = parseAdd(); - v = (v << rhs); - } else if (acceptOp(">>")) { - int rhs = parseAdd(); - v = (v >> rhs); - } else { - break; - } - } - return v; - } - - int parseAdd() { - int v = parseMult(); - for (;;) { - if (acceptOp("+")) { - int rhs = parseMult(); - v = (v + rhs); - } else if (acceptOp("-")) { - int rhs = parseMult(); - v = (v - rhs); - } else { - break; - } - } - return v; - } - - int parseMult() { - int v = parseUnary(); - for (;;) { - if (acceptOp("*")) { - int rhs = parseUnary(); - v = (v * rhs); - } else if (acceptOp("/")) { - int rhs = parseUnary(); - v = (rhs == 0 ? 0 : v / rhs); - } else if (acceptOp("%")) { - int rhs = parseUnary(); - v = (rhs == 0 ? 0 : v % rhs); - } else { - break; - } - } - return v; - } - - int parseUnary() { - if (acceptOp("!")) { - return !parseUnary(); - } - if (acceptOp("-")) { - return -parseUnary(); - } - if (acceptOp("+")) { - return +parseUnary(); - } - return parsePrimary(); - } - - int parsePrimary() { - // '(' expr ')' - if (acceptKind(ExprLexer::LPAREN)) { - int v = parse(); - if (!acceptKind(ExprLexer::RPAREN)) { - throw std::runtime_error("missing ')'"); - } - return v; - } - - // number - if (tok.kind == ExprLexer::NUMBER) { - int v = std::stoi(tok.text); - advance(); - return v; - } - - // defined(identifier) - if (tok.kind == ExprLexer::IDENT && tok.text == "defined") { - advance(); - if (acceptKind(ExprLexer::LPAREN)) { - if (tok.kind != ExprLexer::IDENT) { - throw std::runtime_error("expected identifier in defined()"); - } - std::string name = tok.text; - advance(); - if (!acceptKind(ExprLexer::RPAREN)) { - throw std::runtime_error("missing ) in defined()"); - } - return macros.count(name) ? 1 : 0; - } else { - // defined NAME - if (tok.kind != ExprLexer::IDENT) { - throw std::runtime_error("expected identifier in defined NAME"); - } - std::string name = tok.text; - advance(); - return macros.count(name) ? 1 : 0; - } - } - - // identifier -> treat as integer, if defined use its value else 0 - if (tok.kind == ExprLexer::IDENT) { - std::string name = tok.text; - advance(); - auto it = macros.find(name); - if (it == macros.end()) { - return 0; - } - if (it->second.empty()) { - return 1; - } - return evalMacroExpression(name, it->second); - } - - // unexpected - return 0; - } - - int evalMacroExpression(const std::string & name, const std::string & value) { - if (visiting.count(name)) { - throw std::runtime_error("Recursive macro: " + name); - } - - visiting.insert(name); - ExprParser ep(value, macros, visiting); - int v = ep.parse(); - visiting.erase(name); - return v; - } -}; - -//============================================================== -// Preprocessor -//============================================================== -class Preprocessor { - public: - explicit Preprocessor(Options opts = {}) : opts_(std::move(opts)) { - // Treat empty include path as current directory - if (opts_.include_path.empty()) { - opts_.include_path = "."; - } - parseMacroDefinitions(opts_.macros); - } - - std::string preprocess_file(const std::string & filename, const std::vector & additional_macros = {}) { - std::unordered_map macros; - std::unordered_set predefined; - std::unordered_set include_stack; - buildMacros(additional_macros, macros, predefined); - - std::string result = processFile(filename, macros, predefined, include_stack, DirectiveMode::All); - return result; - } - - std::string preprocess(const std::string & contents, const std::vector & additional_macros = {}) { - std::unordered_map macros; - std::unordered_set predefined; - std::unordered_set include_stack; - buildMacros(additional_macros, macros, predefined); - - std::string result = processString(contents, macros, predefined, include_stack, DirectiveMode::All); - return result; - } - - std::string preprocess_includes_file(const std::string & filename) { - std::unordered_map macros; - std::unordered_set predefined; - std::unordered_set include_stack; - std::string result = processFile(filename, macros, predefined, include_stack, DirectiveMode::IncludesOnly); - return result; - } - - std::string preprocess_includes(const std::string & contents) { - std::unordered_map macros; - std::unordered_set predefined; - std::unordered_set include_stack; - std::string result = processString(contents, macros, predefined, include_stack, DirectiveMode::IncludesOnly); - return result; - } - - private: - Options opts_; - std::unordered_map global_macros; - - enum class DirectiveMode { All, IncludesOnly }; - - struct Cond { - bool parent_active; - bool active; - bool taken; - }; - - //---------------------------------------------------------- - // Parse macro definitions into global_macros - //---------------------------------------------------------- - void parseMacroDefinitions(const std::vector & macro_defs) { - for (const auto & def : macro_defs) { - size_t eq_pos = def.find('='); - if (eq_pos != std::string::npos) { - // Format: NAME=VALUE - std::string name = trim(def.substr(0, eq_pos)); - std::string value = trim(def.substr(eq_pos + 1)); - global_macros[name] = value; - } else { - // Format: NAME - std::string name = trim(def); - global_macros[name] = ""; - } - } - } - - //---------------------------------------------------------- - // Build combined macro map and predefined set for a preprocessing operation - //---------------------------------------------------------- - void buildMacros(const std::vector & additional_macros, - std::unordered_map & macros, - std::unordered_set & predefined) { - macros = global_macros; - predefined.clear(); - - for (const auto & [name, value] : global_macros) { - predefined.insert(name); - } - - for (const auto & def : additional_macros) { - size_t eq_pos = def.find('='); - std::string name, value; - if (eq_pos != std::string::npos) { - name = trim(def.substr(0, eq_pos)); - value = trim(def.substr(eq_pos + 1)); - } else { - name = trim(def); - value = ""; - } - - // Add to macros map (will override global if same name) - macros[name] = value; - predefined.insert(name); - } - } - - //---------------------------------------------------------- - // Helpers - //---------------------------------------------------------- - std::string loadFile(const std::string & fname) { - std::ifstream f(fname); - if (!f.is_open()) { - throw std::runtime_error("Could not open file: " + fname); - } - std::stringstream ss; - ss << f.rdbuf(); - return ss.str(); - } - - bool condActive(const std::vector & cond) const { - if (cond.empty()) { - return true; - } - return cond.back().active; - } - - //---------------------------------------------------------- - // Process a file - //---------------------------------------------------------- - std::string processFile(const std::string & name, - std::unordered_map & macros, - const std::unordered_set & predefined_macros, - std::unordered_set & include_stack, - DirectiveMode mode) { - if (include_stack.count(name)) { - throw std::runtime_error("Recursive include: " + name); - } - - include_stack.insert(name); - std::string shader_code = loadFile(name); - std::string out = processString(shader_code, macros, predefined_macros, include_stack, mode); - include_stack.erase(name); - return out; - } - - std::string processIncludeFile(const std::string & fname, - std::unordered_map & macros, - const std::unordered_set & predefined_macros, - std::unordered_set & include_stack, - DirectiveMode mode) { - std::string full_path = opts_.include_path + "/" + fname; - return processFile(full_path, macros, predefined_macros, include_stack, mode); - } - - //---------------------------------------------------------- - // Process text - //---------------------------------------------------------- - std::string processString(const std::string & shader_code, - std::unordered_map & macros, - const std::unordered_set & predefined_macros, - std::unordered_set & include_stack, - DirectiveMode mode) { - std::vector cond; // Conditional stack for this shader - std::stringstream out; - std::istringstream in(shader_code); - std::string line; - - while (std::getline(in, line)) { - std::string t = trim(line); - - if (!t.empty() && t[0] == '#') { - bool handled = handleDirective(t, out, macros, predefined_macros, cond, include_stack, mode); - if (mode == DirectiveMode::IncludesOnly && !handled) { - out << line << "\n"; - } - } else { - if (mode == DirectiveMode::IncludesOnly) { - out << line << "\n"; - } else if (condActive(cond)) { - // Expand macros in the line before outputting - std::string expanded = expandMacrosRecursive(line, macros); - out << expanded << "\n"; - } - } - } - - if (mode == DirectiveMode::All && !cond.empty()) { - throw std::runtime_error("Unclosed #if directive"); - } - - return out.str(); - } - - //---------------------------------------------------------- - // Directive handler - //---------------------------------------------------------- - bool handleDirective(const std::string & t, - std::stringstream & out, - std::unordered_map & macros, - const std::unordered_set & predefined_macros, - std::vector & cond, - std::unordered_set & include_stack, - DirectiveMode mode) { - // split into tokens - std::string body = t.substr(1); - std::istringstream iss(body); - std::string cmd; - iss >> cmd; - - if (cmd == "include") { - if (mode == DirectiveMode::All && !condActive(cond)) { - return true; - } - std::string file; - iss >> file; - if (file.size() >= 2 && file.front() == '"' && file.back() == '"') { - file = file.substr(1, file.size() - 2); - } - out << processIncludeFile(file, macros, predefined_macros, include_stack, mode); - return true; - } - - if (mode == DirectiveMode::IncludesOnly) { - return false; - } - - if (cmd == "define") { - if (!condActive(cond)) { - return true; - } - std::string name; - iss >> name; - // Don't override predefined macros from options - if (predefined_macros.count(name)) { - return true; - } - std::string value = trim_value(iss); - macros[name] = value; - return true; - } - - if (cmd == "undef") { - if (!condActive(cond)) { - return true; - } - std::string name; - iss >> name; - // Don't undef predefined macros from options - if (predefined_macros.count(name)) { - return true; - } - macros.erase(name); - return true; - } - - if (cmd == "ifdef") { - std::string name; - iss >> name; - bool p = condActive(cond); - bool v = macros.count(name); - cond.push_back({ p, p && v, p && v }); - return true; - } - - if (cmd == "ifndef") { - std::string name; - iss >> name; - bool p = condActive(cond); - bool v = !macros.count(name); - cond.push_back({ p, p && v, p && v }); - return true; - } - - if (cmd == "if") { - std::string expr = trim_value(iss); - bool p = condActive(cond); - bool v = false; - if (p) { - std::unordered_set visiting; - ExprParser ep(expr, macros, visiting); - v = ep.parse() != 0; - } - cond.push_back({ p, p && v, p && v }); - return true; - } - - if (cmd == "elif") { - std::string expr = trim_value(iss); - - if (cond.empty()) { - throw std::runtime_error("#elif without #if"); - } - - Cond & c = cond.back(); - if (!c.parent_active) { - c.active = false; - return true; - } - - if (c.taken) { - c.active = false; - return true; - } - - std::unordered_set visiting; - ExprParser ep(expr, macros, visiting); - bool v = ep.parse() != 0; - c.active = v; - if (v) { - c.taken = true; - } - return true; - } - - if (cmd == "else") { - if (cond.empty()) { - throw std::runtime_error("#else without #if"); - } - - Cond & c = cond.back(); - if (!c.parent_active) { - c.active = false; - return true; - } - if (c.taken) { - c.active = false; - } else { - c.active = true; - c.taken = true; - } - return true; - } - - if (cmd == "endif") { - if (cond.empty()) { - throw std::runtime_error("#endif without #if"); - } - cond.pop_back(); - return true; - } - - // Unknown directive - throw std::runtime_error("Unknown directive: #" + cmd); - } -}; - -} // namespace pre_wgsl - -#endif // PRE_WGSL_HPP diff --git a/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn.wgsl b/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn.wgsl deleted file mode 100644 index de7c132..0000000 --- a/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn.wgsl +++ /dev/null @@ -1,591 +0,0 @@ -diagnostic(off, chromium.subgroup_matrix_uniformity); -diagnostic(off, subgroup_uniformity); -enable f16; -enable subgroups; -enable chromium_experimental_subgroup_matrix; - -#ifdef KV_F32 -#define KV_TYPE f32 -#else -#define KV_TYPE f16 -#endif - -// Default values -#define HEAD_DIM_QK 64 -#define HEAD_DIM_V 64 - -// The number of rows/columns/k in a subgroup matrix. MxK * KxN = MxN -// Note that the "K" here does not correspond to the K in attention's Q/K/V, it's just the common dimension. -#define SG_MAT_M 8 -#define SG_MAT_N 8 -#define SG_MAT_K 8 - -// Each workgroup processes one subgroup matrix of Q rows -#define Q_TILE SG_MAT_M -#define KV_TILE 16 -#define WG_SIZE 64 - -// Number of subgroup-matrix-width blocks that span the KV tile. SG_MAT_N must divide KV_TILE. -#define KV_BLOCKS (KV_TILE / SG_MAT_N) - -// Quantization constants/helpers -#define BLOCK_SIZE 32 -#define BLOCKS_K ((HEAD_DIM_QK + BLOCK_SIZE - 1) / BLOCK_SIZE) -#define BLOCKS_V ((HEAD_DIM_V + BLOCK_SIZE - 1) / BLOCK_SIZE) -// number of quantized elements processed per thread -#if defined(KV_Q4_0) -#define NQ 16 -// Q4_0 has 32 elements, 1 f16 for scale, 8 f16 for 4-bit weights -#define F16_PER_BLOCK 9 -#define WEIGHTS_PER_F16 4 -#elif defined(KV_Q8_0) -#define NQ 8 -// Q8_0 has 32 elements, 1 f16 for scale, 16 f16 for 8-bit weights -#define F16_PER_BLOCK 17 -#define WEIGHTS_PER_F16 2 -#endif -#define F16_PER_THREAD (NQ / WEIGHTS_PER_F16) - -// Ok not to put these in a define block, compiler will remove if unused -fn get_byte(value: u32, index: u32) -> u32 { - return (value >> (index * 8)) & 0xFF; -} - -fn get_byte_i32(value: u32, index: u32) -> i32 { - return bitcast(((value >> (index * 8)) & 0xFF) << 24) >> 24; -} - -struct Params { - offset_q: u32, - offset_k: u32, - offset_v: u32, - offset_mask: u32, - offset_sinks: u32, - offset_dst: u32, - - // shapes of Q/K/V - n_heads: u32, - seq_len_q: u32, - seq_len_kv: u32, - - // strides (in elements) - stride_q1: u32, - stride_q2: u32, - stride_q3: u32, - stride_k1: u32, - stride_k2: u32, - stride_k3: u32, - stride_v1: u32, - stride_v2: u32, - stride_v3: u32, - stride_mask3: u32, - - // repeat factors for K/V, e.g., MHA vs. MQA vs. GQA - q_per_kv: u32, - - // softmax params - scale: f32, - max_bias: f32, - logit_softcap: f32, - n_head_log2: f32, - m0: f32, - m1: f32, -}; - -@group(0) @binding(0) var Q: array; -@group(0) @binding(1) var K: array; -@group(0) @binding(2) var V: array; - -#if defined(MASK) && defined(SINKS) -@group(0) @binding(3) var mask: array; -@group(0) @binding(4) var sinks: array; -#define DST_BINDING 5 -#define PARAMS_BINDING 6 -#elif defined(MASK) -@group(0) @binding(3) var mask: array; -#define DST_BINDING 4 -#define PARAMS_BINDING 5 -#elif defined(SINKS) -@group(0) @binding(3) var sinks: array; -#define DST_BINDING 4 -#define PARAMS_BINDING 5 -#else -#define DST_BINDING 3 -#define PARAMS_BINDING 4 -#endif - -@group(0) @binding(DST_BINDING) var dst: array; -@group(0) @binding(PARAMS_BINDING) var params: Params; - -// Just a very small float value. -const FLOAT_MIN: f32 = -1.0e9; - -// The number of Q rows processed per workgroup -var q_shmem: array; - -#ifndef KV_DIRECT -const kv_shmem_size = KV_TILE * max(HEAD_DIM_QK, HEAD_DIM_V); -// we can reuse the same shmem for K and V since we only need one at a time -var kv_shmem: array; -#endif - -var o_shmem: array; // output shmem - -#ifdef MASK -// storage for mask values -var mask_shmem: array; -#endif - -// storage for output of Q*K^T scores for online softmax (S matrix from paper) -// also storage for diagonal matrix during online softmax (P matrix from paper) -// note that we reuse the same storage for both since we only need one at a time -var inter_shmem: array; - -// Storage for row max and exp sum during online softmax -var row_max_shmem: array; -var exp_sum_shmem: array; - -fn calc_softmax_term(kv_idx: u32, q_tile_row: u32, slope: f32) -> f32 { - var v = select(FLOAT_MIN, - f32(inter_shmem[kv_idx + q_tile_row * KV_TILE]) * params.scale, - kv_idx < KV_TILE); -#ifdef LOGIT_SOFTCAP - v = params.logit_softcap * tanh(v); -#endif -#ifdef MASK - let mask_val = select(0.0, f32(mask_shmem[q_tile_row * KV_TILE + kv_idx]), kv_idx < KV_TILE); - let mask_term = slope * mask_val; - v += mask_term; -#endif - return v; -} - - -@compute @workgroup_size(WG_SIZE) -fn main(@builtin(workgroup_id) wg_id: vec3, - @builtin(local_invocation_id) local_id: vec3, - @builtin(subgroup_id) subgroup_id: u32, - @builtin(subgroup_size) subgroup_size: u32, - @builtin(num_subgroups) num_subgroups: u32, - @builtin(subgroup_invocation_id) sg_inv_id: u32) { - - // initialize row max for online softmax - for (var i = local_id.x; i < Q_TILE; i += WG_SIZE) { - row_max_shmem[i] = FLOAT_MIN; - exp_sum_shmem[i] = 0.0; - } - - for (var i = local_id.x; i < Q_TILE * HEAD_DIM_V; i += WG_SIZE) { - o_shmem[i] = 0.0; - } - - // workgroups per head/batch - let wg_per_head = (params.seq_len_q + Q_TILE - 1u) / Q_TILE; - let wg_per_batch = wg_per_head * params.n_heads; - - let dst2_stride = HEAD_DIM_V * params.n_heads; - let dst3_stride = dst2_stride * params.seq_len_q; - - // batch index - let batch_idx = wg_id.x / wg_per_batch; - let q_batch_offset = params.offset_q + batch_idx * params.stride_q3; - let k_batch_offset = params.offset_k + batch_idx * params.stride_k3; - let v_batch_offset = params.offset_v + batch_idx * params.stride_v3; - let dst_batch_offset = params.offset_dst + batch_idx * dst3_stride; - let wg_in_batch = wg_id.x % wg_per_batch; - - // head index - let head_idx = wg_in_batch / wg_per_head; - let q_head_offset = q_batch_offset + head_idx * params.stride_q2; - let k_head_idx = head_idx / params.q_per_kv; - let v_head_idx = k_head_idx; - let k_head_offset = k_batch_offset + k_head_idx * params.stride_k2; - let v_head_offset = v_batch_offset + v_head_idx * params.stride_v2; - - // starting Q row for this workgroup - let wg_in_head = wg_in_batch % wg_per_head; - let q_row_start = wg_in_head * Q_TILE; - -#ifdef MASK - // mask offset - let mask_global_offset = params.offset_mask + batch_idx * params.stride_mask3 + q_row_start * params.seq_len_kv; -#endif - - // note that the output is permuted, the layout is [head_dim_v, n_heads, seq_len_q, batch_size] - let dst_global_offset = dst_batch_offset + q_row_start * dst2_stride + head_idx * HEAD_DIM_V; - - let head = f32(head_idx); - let slope = select(1.0, select(pow(params.m1, 2.0 * (head - params.n_head_log2) + 1.0), pow(params.m0, head + 1.0), head < params.n_head_log2), params.max_bias > 0); - - // load q tile into shared memory - for (var elem_idx = local_id.x; elem_idx < Q_TILE * HEAD_DIM_QK; elem_idx += WG_SIZE) { - let q_row = elem_idx / HEAD_DIM_QK; - let q_col = elem_idx % HEAD_DIM_QK; - let head_q_row = q_row_start + q_row; - let global_q_row_offset = q_head_offset + head_q_row * params.stride_q1; - q_shmem[elem_idx] = f16(select( - 0.0, - Q[global_q_row_offset + q_col], - head_q_row < params.seq_len_q && q_col < HEAD_DIM_QK)); - } - - for (var kv_tile = 0u; kv_tile < params.seq_len_kv; kv_tile += KV_TILE) { - // clear inter_shmem to ensure zero-initialized accumulators - for (var elem_idx = local_id.x; elem_idx < Q_TILE * KV_TILE; elem_idx += WG_SIZE) { - inter_shmem[elem_idx] = 0.0; - } - - // load k tile into shared memory -#if defined(KV_Q4_0) - for (var elem_idx = local_id.x * NQ; elem_idx < KV_TILE * HEAD_DIM_QK; elem_idx += WG_SIZE * NQ) { - let blck_idx = elem_idx / BLOCK_SIZE; - let block_offset = (elem_idx % BLOCK_SIZE) / WEIGHTS_PER_F16; - let k_row = blck_idx / BLOCKS_K; - let global_k_row = kv_tile + k_row; - let block_k = blck_idx % BLOCKS_K; - let row_offset = k_row * HEAD_DIM_QK; - - if (global_k_row < params.seq_len_kv) { - let global_block_idx = k_head_offset + global_k_row * params.stride_k1 + block_k; - let base_idx = global_block_idx * F16_PER_BLOCK; - let d = K[base_idx]; // scale - for (var j = 0u; j < F16_PER_THREAD; j += 2) { - let q_0 = K[base_idx + 1u + block_offset + j]; - let q_1 = K[base_idx + 1u + block_offset + j + 1]; - let q_packed = bitcast(vec2(q_0, q_1)); - for (var k = 0u; k < 4u; k++) { - let q_byte = get_byte(q_packed, k); - let q_hi = (f16((q_byte >> 4) & 0xF) - 8.0) * d; - let q_lo = (f16(q_byte & 0xF) - 8.0) * d; - let idx = block_k * BLOCK_SIZE + block_offset * 2u + j * 2u + k; - kv_shmem[row_offset + idx] = q_lo; - kv_shmem[row_offset + idx + 16u] = q_hi; - } - } - } - } -#elif defined(KV_Q8_0) - for (var elem_idx = local_id.x * NQ; elem_idx < KV_TILE * HEAD_DIM_QK; elem_idx += WG_SIZE * NQ) { - let blck_idx = elem_idx / BLOCK_SIZE; - let block_offset = (elem_idx % BLOCK_SIZE) / WEIGHTS_PER_F16; - let k_row = blck_idx / BLOCKS_K; - let global_k_row = kv_tile + k_row; - let block_k = blck_idx % BLOCKS_K; - let row_offset = k_row * HEAD_DIM_QK; - - if (global_k_row < params.seq_len_kv) { - let global_block_idx = k_head_offset + global_k_row * params.stride_k1 + block_k; - let base_idx = global_block_idx * F16_PER_BLOCK; - let d = K[base_idx]; // scale - for (var j = 0u; j < F16_PER_THREAD; j += 2) { - let q_0 = K[base_idx + 1u + block_offset + j]; - let q_1 = K[base_idx + 1u + block_offset + j + 1]; - let q_packed = bitcast(vec2(q_0, q_1)); - for (var k = 0u; k < 4u; k++) { - let q_byte = get_byte_i32(q_packed, k); - let q_val = f16(q_byte) * d; - let idx = block_k * BLOCK_SIZE + block_offset * 2u + j * 2u + k; - kv_shmem[row_offset + idx] = q_val; - } - } - } - } -#elif defined(KV_DIRECT) - // Direct global loads for KV -#else - for (var elem_idx = local_id.x; elem_idx < KV_TILE * HEAD_DIM_QK; elem_idx += WG_SIZE) { - let k_row = elem_idx / HEAD_DIM_QK; - let k_col = elem_idx % HEAD_DIM_QK; - let global_k_row = kv_tile + k_row; - let global_k_row_offset = k_head_offset + global_k_row * params.stride_k1; - kv_shmem[elem_idx] = f16(select( - 0.0, - K[global_k_row_offset + k_col], - global_k_row < params.seq_len_kv && k_col < HEAD_DIM_QK)); - } -#endif - - workgroupBarrier(); - - // accumulate q block * k block into registers across the entire KV tile - // TODO: this loop seems to be the current largest bottleneck - for (var kv_block = subgroup_id; kv_block < KV_BLOCKS; kv_block += num_subgroups) { - let inter_offset = kv_block * SG_MAT_N; - var acc: subgroup_matrix_result = subgroupMatrixLoad< - subgroup_matrix_result>(&inter_shmem, inter_offset, false, KV_TILE); -#ifdef KV_DIRECT - let k_block_row = kv_tile + kv_block * SG_MAT_N; - let k_global_offset = k_head_offset + k_block_row * params.stride_k1; -#else - let k_block_offset = kv_block * SG_MAT_N * HEAD_DIM_QK; -#endif - for (var head_dim_block = 0u; head_dim_block < HEAD_DIM_QK; head_dim_block += SG_MAT_K) { - // load q submatrix from shared memory - var q_sg_mat: subgroup_matrix_left = subgroupMatrixLoad>( - &q_shmem, - head_dim_block, - false, - HEAD_DIM_QK - ); - - // load k submatrix from device or shared memory -#ifdef KV_DIRECT - var k_sg_mat: subgroup_matrix_right = subgroupMatrixLoad>( - &K, - k_global_offset + head_dim_block, - true, - params.stride_k1 - ); -#else - var k_sg_mat: subgroup_matrix_right = subgroupMatrixLoad>( - &kv_shmem, - k_block_offset + head_dim_block, - true, - HEAD_DIM_QK - ); -#endif - acc = subgroupMatrixMultiplyAccumulate(q_sg_mat, k_sg_mat, acc); - } - - // store acc to shared memory for softmax (S matrix from paper) - subgroupMatrixStore(&inter_shmem, inter_offset, acc, false, KV_TILE); - } - -#ifdef MASK - // load mask tile into shared memory for this KV block - // TODO: optimize and skip if mask is -INF for the entire tile - for (var elem_idx = local_id.x; elem_idx < Q_TILE * KV_TILE; elem_idx += WG_SIZE) { - let mask_row = elem_idx / KV_TILE; - let mask_col = elem_idx % KV_TILE; - let global_q_row = q_row_start + mask_row; - let global_k_col = kv_tile + mask_col; - let mask_in_bounds = global_q_row < params.seq_len_q && global_k_col < params.seq_len_kv; - let mask_idx = mask_global_offset + mask_row * params.seq_len_kv + global_k_col; - mask_shmem[elem_idx] = select(0.0, mask[mask_idx], mask_in_bounds); - } -#endif - - workgroupBarrier(); - - // online softmax - for (var q_tile_row = subgroup_id; q_tile_row < Q_TILE; q_tile_row += num_subgroups) { - let global_q_row = q_row_start + q_tile_row; - if (global_q_row >= params.seq_len_q) { - break; - } - - // initialize running max for this row - var prev_max = row_max_shmem[q_tile_row]; - var final_max = prev_max; - // pass 1: compute final max across the full KV tile in chunks - for (var kv_offset = 0u; kv_offset < KV_TILE; kv_offset += subgroup_size) { - let kv_idx = kv_offset + sg_inv_id; - let softmax_term = calc_softmax_term(kv_idx, q_tile_row, slope); - final_max = subgroupMax(max(final_max, softmax_term)); - } - - var total_exp_term: f32 = 0.0; - // pass 2: compute exp sum and write P using final_max - for (var kv_offset = 0u; kv_offset < KV_TILE; kv_offset += subgroup_size) { - let kv_idx = kv_offset + sg_inv_id; - let softmax_term = calc_softmax_term(kv_idx, q_tile_row, slope); - let cur_p = select(0.0, - exp(softmax_term - final_max), - kv_tile + kv_idx < params.seq_len_kv && kv_idx < KV_TILE); - total_exp_term += subgroupAdd(cur_p); - if (kv_idx < KV_TILE) { - inter_shmem[kv_idx + q_tile_row * KV_TILE] = f16(cur_p); - } - } - - let cur_exp = exp(prev_max - final_max); - - if (sg_inv_id == 0) { - row_max_shmem[q_tile_row] = final_max; - exp_sum_shmem[q_tile_row] = exp_sum_shmem[q_tile_row] * cur_exp + total_exp_term; - } - - for (var elem_idx = sg_inv_id; elem_idx < HEAD_DIM_V; elem_idx += subgroup_size) { - let idx = q_tile_row * HEAD_DIM_V + elem_idx; - o_shmem[idx] = f16(f32(o_shmem[idx]) * cur_exp); - } - } - - // load v tile into shared memory -#if defined(KV_Q4_0) - for (var elem_idx = local_id.x * NQ; elem_idx < KV_TILE * HEAD_DIM_V; elem_idx += WG_SIZE * NQ) { - let blck_idx = elem_idx / BLOCK_SIZE; - let block_offset = (elem_idx % BLOCK_SIZE) / WEIGHTS_PER_F16; - let v_row = blck_idx / BLOCKS_V; - let global_v_row = kv_tile + v_row; - let block_k = blck_idx % BLOCKS_V; - let row_offset = v_row * HEAD_DIM_V; - - if (global_v_row < params.seq_len_kv) { - let global_block_idx = v_head_offset + global_v_row * params.stride_v1 + block_k; - let base_idx = global_block_idx * F16_PER_BLOCK; - let d = V[base_idx]; // scale - for (var j = 0u; j < F16_PER_THREAD; j += 2) { - let q_0 = V[base_idx + 1u + block_offset + j]; - let q_1 = V[base_idx + 1u + block_offset + j + 1]; - let q_packed = bitcast(vec2(q_0, q_1)); - for (var k = 0u; k < 4u; k++) { - let q_byte = get_byte(q_packed, k); - let q_hi = (f16((q_byte >> 4) & 0xF) - 8.0) * d; - let q_lo = (f16(q_byte & 0xF) - 8.0) * d; - let idx = block_k * BLOCK_SIZE + block_offset * 2u + j * 2u + k; - kv_shmem[row_offset + idx] = q_lo; - kv_shmem[row_offset + idx + 16u] = q_hi; - } - } - } - } -#elif defined(KV_Q8_0) - for (var elem_idx = local_id.x * NQ; elem_idx < KV_TILE * HEAD_DIM_V; elem_idx += WG_SIZE * NQ) { - let blck_idx = elem_idx / BLOCK_SIZE; - let block_offset = (elem_idx % BLOCK_SIZE) / WEIGHTS_PER_F16; - let v_row = blck_idx / BLOCKS_V; - let global_v_row = kv_tile + v_row; - let block_k = blck_idx % BLOCKS_V; - let row_offset = v_row * HEAD_DIM_V; - - if (global_v_row < params.seq_len_kv) { - let global_block_idx = v_head_offset + global_v_row * params.stride_v1 + block_k; - let base_idx = global_block_idx * F16_PER_BLOCK; - let d = V[base_idx]; // scale - for (var j = 0u; j < F16_PER_THREAD; j += 2) { - let q_0 = V[base_idx + 1u + block_offset + j]; - let q_1 = V[base_idx + 1u + block_offset + j + 1]; - let q_packed = bitcast(vec2(q_0, q_1)); - for (var k = 0u; k < 4u; k++) { - let q_byte = get_byte_i32(q_packed, k); - let q_val = f16(q_byte) * d; - let idx = block_k * BLOCK_SIZE + block_offset * 2u + j * 2u + k; - kv_shmem[row_offset + idx] = q_val; - } - } - } - } -#elif defined(KV_DIRECT) - // Direct global loads for KV -#else - for (var elem_idx = local_id.x; elem_idx < KV_TILE * HEAD_DIM_V; elem_idx += WG_SIZE) { - let v_row = elem_idx / HEAD_DIM_V; - let v_col = elem_idx % HEAD_DIM_V; - let global_v_row = kv_tile + v_row; - let global_v_row_offset = v_head_offset + global_v_row * params.stride_v1; - kv_shmem[elem_idx] = f16(select( - 0.0, - V[global_v_row_offset + v_col], - global_v_row < params.seq_len_kv && v_col < HEAD_DIM_V)); - } -#endif - - workgroupBarrier(); - - // we have P (Q_TILE x KV_TILE) in inter_shmem and V (KV_TILE x head_dim_v) in kv_shmem - // we want to compute O += P * V across the full KV tile - for (var head_dim_block = subgroup_id * SG_MAT_N; - head_dim_block < HEAD_DIM_V; - head_dim_block += num_subgroups * SG_MAT_N) { - // load O submatrix from shared memory - var o_sg_mat: subgroup_matrix_result = subgroupMatrixLoad>( - &o_shmem, - head_dim_block, - false, - HEAD_DIM_V - ); - - for (var kv_block = 0u; kv_block < KV_BLOCKS; kv_block++) { - let p_offset = kv_block * SG_MAT_N; - var p_sg_mat: subgroup_matrix_left = subgroupMatrixLoad>( - &inter_shmem, - p_offset, - false, - KV_TILE - ); - - // load V submatrix from global or shared memory -#ifdef KV_DIRECT - let v_block_row = kv_tile + kv_block * SG_MAT_N; - let v_global_offset = v_head_offset + v_block_row * params.stride_v1 + head_dim_block; - var v_sg_mat: subgroup_matrix_right = subgroupMatrixLoad>( - &V, - v_global_offset, - false, - params.stride_v1 - ); -#else - let v_block_offset = kv_block * SG_MAT_N * HEAD_DIM_V; - var v_sg_mat: subgroup_matrix_right = subgroupMatrixLoad>( - &kv_shmem, - v_block_offset + head_dim_block, - false, - HEAD_DIM_V - ); -#endif - // O += P * V - o_sg_mat = subgroupMatrixMultiplyAccumulate(p_sg_mat, v_sg_mat, o_sg_mat); - } - - // store O back to shared memory - subgroupMatrixStore(&o_shmem, head_dim_block, o_sg_mat, false, HEAD_DIM_V); - } - - workgroupBarrier(); - } - -#ifdef SINKS - // add sinks (applied once after processing all KV tiles) - for (var q_tile_row = subgroup_id; - q_tile_row < Q_TILE; - q_tile_row += num_subgroups) { - // no need to process rows beyond seq_len_q - let global_q_row = q_row_start + q_tile_row; - if (global_q_row >= params.seq_len_q) { - break; - } - - var prev_max = row_max_shmem[q_tile_row]; - - // for non-sink threads, exp(FLOAT_MIN) effectively zeroes out their contribution to the sum - let sink_val = select(FLOAT_MIN, sinks[params.offset_sinks + head_idx], sg_inv_id == 0); - let new_max = subgroupMax(max(prev_max, sink_val)); - let max_exp = exp(prev_max - new_max); - let sink_exp = exp(sink_val - new_max); - - let sink_exp_sum = subgroupAdd(sink_exp); - - if (sg_inv_id == 0) { - exp_sum_shmem[q_tile_row] = exp_sum_shmem[q_tile_row] * max_exp + sink_exp_sum; - } - - for (var elem_idx = sg_inv_id; elem_idx < HEAD_DIM_V; elem_idx += subgroup_size) { - let idx = q_tile_row * HEAD_DIM_V + elem_idx; - let val = f32(o_shmem[idx]) * max_exp; - o_shmem[idx] = f16(val); - } - } - - workgroupBarrier(); -#endif - - // write output back to global memory - for (var q_tile_row = subgroup_id; - q_tile_row < Q_TILE; - q_tile_row += num_subgroups) { - let global_q_row = q_row_start + q_tile_row; - if (global_q_row >= params.seq_len_q) { - break; - } - - let exp_sum = exp_sum_shmem[q_tile_row]; - let scale = select(0.0, 1.0 / exp_sum, exp_sum != 0); - - for (var elem_idx = sg_inv_id; elem_idx < HEAD_DIM_V; elem_idx += subgroup_size) { - let o_val = o_shmem[q_tile_row * HEAD_DIM_V + elem_idx]; - let scaled = f32(o_val) * scale; - dst[dst_global_offset + q_tile_row * dst2_stride + elem_idx] = scaled; - } - } -} diff --git a/ggml/src/ggml-webgpu/wgsl-shaders/unary_op.wgsl b/ggml/src/ggml-webgpu/wgsl-shaders/unary_op.wgsl index 25fe285..d474ab1 100644 --- a/ggml/src/ggml-webgpu/wgsl-shaders/unary_op.wgsl +++ b/ggml/src/ggml-webgpu/wgsl-shaders/unary_op.wgsl @@ -16,8 +16,7 @@ "HARDSWISH_FUNC": "{{MUTATE}}[dst_i] = src[src_i] * min(1.0, max(0.0, (src[src_i] + 3.0) / 6.0));", "GELU_FUNC": "{{MUTATE}}[dst_i] = 0.5 * src[src_i] * (1.0 + tanh(clamp(sqrt(2.0 / 3.14159265) * (src[src_i] + 0.044715 * pow(src[src_i], 3.0)), -9.010913, 9.010913))); // Regarding tanh() domain restrictions in wgsl https://github.com/gpuweb/gpuweb/issues/4458", "GELU_QUICK_FUNC": "{{MUTATE}}[dst_i] = src[src_i] * 0.5 * (1.0 + tanh(clamp(0.79788456 * (src[src_i] + 0.044715 * src[src_i] * src[src_i] * src[src_i]), -9.010913, 9.010913))); // Regarding tanh() domain restrictions in wgsl https://github.com/gpuweb/gpuweb/issues/4458", - "GELU_ERF_FUNC": "{{MUTATE}}[dst_i] = 0.5 * src[src_i] * (1.0 + tanh(clamp(0.79788456 * (src[src_i] + 0.044715 * src[src_i] * src[src_i] * src[src_i]), -9.010913, 9.010913))); // Regarding tanh() domain restrictions in wgsl https://github.com/gpuweb/gpuweb/issues/4458", - "CEIL_FUNC": "{{MUTATE}}[dst_i] = ceil(src[src_i]);" + "GELU_ERF_FUNC": "{{MUTATE}}[dst_i] = 0.5 * src[src_i] * (1.0 + tanh(clamp(0.79788456 * (src[src_i] + 0.044715 * src[src_i] * src[src_i] * src[src_i]), -9.010913, 9.010913))); // Regarding tanh() domain restrictions in wgsl https://github.com/gpuweb/gpuweb/issues/4458" } #end(REPL_TEMPLATES) @@ -358,27 +357,6 @@ "SHADER_NAME": "gelu_erf_inplace_f16", "REPLS": { "TYPE": "f16", "FUNC": "GELU_ERF_FUNC", "EXT_PARAMS": "", "MUTATE": "src" }, "DECLS": ["INPLACE"] - }, - - { - "SHADER_NAME": "ceil_f32", - "REPLS": { "TYPE": "f32", "FUNC": "CEIL_FUNC", "EXT_PARAMS": "", "MUTATE": "dst" }, - "DECLS": ["NOT_INPLACE"] - }, - { - "SHADER_NAME": "ceil_f16", - "REPLS": { "TYPE": "f16", "FUNC": "CEIL_FUNC", "EXT_PARAMS": "", "MUTATE": "dst" }, - "DECLS": ["NOT_INPLACE"] - }, - { - "SHADER_NAME": "ceil_inplace_f32", - "REPLS": { "TYPE": "f32", "FUNC": "CEIL_FUNC", "EXT_PARAMS": "", "MUTATE": "src" }, - "DECLS": ["INPLACE"] - }, - { - "SHADER_NAME": "ceil_inplace_f16", - "REPLS": { "TYPE": "f16", "FUNC": "CEIL_FUNC", "EXT_PARAMS": "", "MUTATE": "src" }, - "DECLS": ["INPLACE"] } ] diff --git a/ggml/src/ggml.c b/ggml/src/ggml.c index 09b8eb4..eb3ae72 100644 --- a/ggml/src/ggml.c +++ b/ggml/src/ggml.c @@ -53,15 +53,13 @@ #define UNUSED GGML_UNUSED -// Needed for ggml_fp32_to_bf16_row() -#if defined(__AVX512BF16__) #if defined(_MSC_VER) +#define m512bh(p) p #define m512i(p) p #else -#include +#define m512bh(p) (__m512bh)(p) #define m512i(p) (__m512i)(p) -#endif // defined(_MSC_VER) -#endif // defined(__AVX512BF16__) +#endif #if defined(__linux__) || \ defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \ diff --git a/gguf-py/gguf/constants.py b/gguf-py/gguf/constants.py index 31273b2..41d3bd4 100644 --- a/gguf-py/gguf/constants.py +++ b/gguf-py/gguf/constants.py @@ -104,7 +104,6 @@ class Keys: VOCAB_SIZE = "{arch}.vocab_size" CONTEXT_LENGTH = "{arch}.context_length" EMBEDDING_LENGTH = "{arch}.embedding_length" - EMBEDDING_LENGTH_OUT = "{arch}.embedding_length_out" FEATURES_LENGTH = "{arch}.features_length" BLOCK_COUNT = "{arch}.block_count" LEADING_DENSE_BLOCK_COUNT = "{arch}.leading_dense_block_count" @@ -276,13 +275,12 @@ class Keys: DATASETS = "imatrix.datasets" class Clip: - PROJECTOR_TYPE = "clip.projector_type" - HAS_VISION_ENCODER = "clip.has_vision_encoder" - HAS_AUDIO_ENCODER = "clip.has_audio_encoder" - HAS_LLAVA_PROJECTOR = "clip.has_llava_projector" + PROJECTOR_TYPE = "clip.projector_type" + HAS_VISION_ENCODER = "clip.has_vision_encoder" + HAS_AUDIO_ENCODER = "clip.has_audio_encoder" + HAS_LLAVA_PROJECTOR = "clip.has_llava_projector" class ClipVision: - PROJECTOR_TYPE = "clip.vision.projector_type" # for mixed modality models IMAGE_SIZE = "clip.vision.image_size" PREPROC_IMAGE_SIZE = "clip.vision.preproc_image_size" PATCH_SIZE = "clip.vision.patch_size" @@ -296,9 +294,7 @@ class Keys: USE_GELU = "clip.use_gelu" USE_SILU = "clip.use_silu" N_WA_PATTERN = "clip.vision.n_wa_pattern" # used by qwen2.5vl - WA_LAYER_INDEXES = "clip.vision.wa_layer_indexes" # used by youtuvl IS_DEEPSTACK_LAYERS = "clip.vision.is_deepstack_layers" - WINDOW_SIZE = "clip.vision.window_size" class Attention: HEAD_COUNT = "clip.vision.attention.head_count" @@ -308,7 +304,6 @@ class Keys: SCALE_FACTOR = "clip.vision.projector.scale_factor" class ClipAudio: - PROJECTOR_TYPE = "clip.audio.projector_type" # for mixed modality models NUM_MEL_BINS = "clip.audio.num_mel_bins" EMBEDDING_LENGTH = "clip.audio.embedding_length" FEED_FORWARD_LENGTH = "clip.audio.feed_forward_length" @@ -382,7 +377,6 @@ class MODEL_ARCH(IntEnum): PHIMOE = auto() PLAMO = auto() PLAMO2 = auto() - PLAMO3 = auto() CODESHELL = auto() ORION = auto() INTERNLM2 = auto() @@ -424,7 +418,6 @@ class MODEL_ARCH(IntEnum): NEMOTRON_H_MOE = auto() EXAONE = auto() EXAONE4 = auto() - EXAONE_MOE = auto() GRANITE = auto() GRANITE_MOE = auto() GRANITE_HYBRID = auto() @@ -456,9 +449,6 @@ class MODEL_ARCH(IntEnum): RND1 = auto() PANGU_EMBED = auto() MISTRAL3 = auto() - MIMO2 = auto() - LLAMA_EMBED = auto() - MAINCODER = auto() class VISION_PROJECTOR_TYPE(IntEnum): @@ -468,7 +458,6 @@ class VISION_PROJECTOR_TYPE(IntEnum): RESAMPLER = auto() GLM_EDGE = auto() MERGER = auto() - GEMMA3N = auto() GEMMA3 = auto() QWEN3VL = auto() COGVLM = auto() @@ -679,15 +668,6 @@ class MODEL_TENSOR(IntEnum): V_MM_INP_NORM = auto() V_MM_INP_PROJ = auto() # gemma3 V_MM_SOFT_EMB_NORM = auto() # gemma3 - V_MM_EMBEDDING = auto() # gemma3n - V_MM_HARD_EMB_NORM = auto() # gemma3n - V_ENC_CONV_STEM = auto() # gemma3n - V_ENC_CONV_STEM_NORM = auto() # gemma3n - V_ENC_MSFA_EXP = auto() # gemma3n - V_ENC_MSFA_EXP_NORM = auto() # gemma3n - V_ENC_MSFA_PROJ = auto() # gemma3n - V_ENC_MSFA_PROJ_NORM = auto() # gemma3n - V_ENC_MSFA_NORM = auto() # gemma3n V_RESMPL_POS_EMBD_K = auto() # minicpmv V_RESMPL_ATTN_Q = auto() # minicpmv V_RESMPL_ATTN_K = auto() # minicpmv @@ -711,41 +691,30 @@ class MODEL_TENSOR(IntEnum): V_TOK_BOI = auto() # cogvlm V_TOK_EOI = auto() # cogvlm # audio (mtmd) - A_ENC_EMBD_POS = auto() - A_ENC_EMBD_NORM = auto() - A_ENC_EMBD_TO_LOGITS = auto() # lfm2 - A_ENC_CONV1D = auto() - A_ENC_CONV1D_NORM = auto() # gemma3n - A_PRE_NORM = auto() - A_POST_NORM = auto() - A_ENC_LAYER_PRE_NORM = auto() # gemma3n - A_ENC_ATTN_Q = auto() - A_ENC_ATTN_K = auto() - A_ENC_ATTN_V = auto() - A_ENC_PER_DIM_SCALE = auto() # gemma3n - A_ENC_INPUT_NORM = auto() - A_ENC_OUTPUT = auto() - A_ENC_OUTPUT_NORM = auto() - A_ENC_FFN_UP = auto() - A_ENC_FFN_NORM = auto() - A_ENC_FFN_POST_NORM = auto() # gemma3n - A_ENC_FFN_SCALE = auto() # gemma3n - A_ENC_FFN_GATE = auto() - A_ENC_FFN_DOWN = auto() - A_ENC_FFN_UP_1 = auto() # lfm2, gemma3n - A_ENC_FFN_NORM_1 = auto() # lfm2, gemma3n (pre-norm) - A_ENC_FFN_POST_NORM_1 = auto() # gemma3n - A_ENC_FFN_SCALE_1 = auto() # gemma3n - A_ENC_FFN_GATE_1 = auto() # lfm2, gemma3n - A_ENC_FFN_DOWN_1 = auto() # lfm2, gemma3n - A_MMPROJ = auto() - A_MMPROJ_FC = auto() - A_MM_NORM_PRE = auto() - A_MM_NORM_MID = auto() - A_MM_EMBEDDING = auto() # gemma3n - A_MM_HARD_EMB_NORM = auto() # gemma3n - A_MM_SOFT_EMB_NORM = auto() # gemma3n - A_MM_INP_PROJ = auto() # gemma3n + A_ENC_EMBD_POS = auto() + A_ENC_EMBD_NORM = auto() + A_ENC_EMBD_TO_LOGITS = auto() + A_ENC_CONV1D = auto() + A_PRE_NORM = auto() + A_POST_NORM = auto() + A_ENC_ATTN_Q = auto() + A_ENC_ATTN_K = auto() + A_ENC_ATTN_V = auto() + A_ENC_INPUT_NORM = auto() + A_ENC_OUTPUT = auto() + A_ENC_OUTPUT_NORM = auto() + A_ENC_FFN_UP = auto() + A_ENC_FFN_NORM = auto() + A_ENC_FFN_GATE = auto() + A_ENC_FFN_DOWN = auto() + A_ENC_FFN_UP_1 = auto() + A_ENC_FFN_NORM_1 = auto() + A_ENC_FFN_GATE_1 = auto() + A_ENC_FFN_DOWN_1 = auto() + A_MMPROJ = auto() + A_MMPROJ_FC = auto() + A_MM_NORM_PRE = auto() + A_MM_NORM_MID = auto() # nextn/mtp NEXTN_EH_PROJ = auto() NEXTN_EMBED_TOKENS = auto() @@ -802,7 +771,6 @@ MODEL_ARCH_NAMES: dict[MODEL_ARCH, str] = { MODEL_ARCH.PHIMOE: "phimoe", MODEL_ARCH.PLAMO: "plamo", MODEL_ARCH.PLAMO2: "plamo2", - MODEL_ARCH.PLAMO3: "plamo3", MODEL_ARCH.CODESHELL: "codeshell", MODEL_ARCH.ORION: "orion", MODEL_ARCH.INTERNLM2: "internlm2", @@ -844,7 +812,6 @@ MODEL_ARCH_NAMES: dict[MODEL_ARCH, str] = { MODEL_ARCH.NEMOTRON_H_MOE: "nemotron_h_moe", MODEL_ARCH.EXAONE: "exaone", MODEL_ARCH.EXAONE4: "exaone4", - MODEL_ARCH.EXAONE_MOE: "exaone-moe", MODEL_ARCH.GRANITE: "granite", MODEL_ARCH.GRANITE_MOE: "granitemoe", MODEL_ARCH.GRANITE_HYBRID: "granitehybrid", @@ -877,9 +844,6 @@ MODEL_ARCH_NAMES: dict[MODEL_ARCH, str] = { MODEL_ARCH.RND1: "rnd1", MODEL_ARCH.PANGU_EMBED: "pangu-embedded", MODEL_ARCH.MISTRAL3: "mistral3", - MODEL_ARCH.MIMO2: "mimo2", - MODEL_ARCH.LLAMA_EMBED: "llama-embed", - MODEL_ARCH.MAINCODER: "maincoder", } VISION_PROJECTOR_TYPE_NAMES: dict[VISION_PROJECTOR_TYPE, str] = { @@ -1096,16 +1060,7 @@ TENSOR_NAMES: dict[MODEL_TENSOR, str] = { MODEL_TENSOR.V_MM_POST_NORM: "mm.post_norm", MODEL_TENSOR.V_MM_INP_PROJ: "mm.input_projection", MODEL_TENSOR.V_MM_INP_NORM: "mm.input_norm", - MODEL_TENSOR.V_MM_SOFT_EMB_NORM: "mm.soft_emb_norm", # gemma3n - MODEL_TENSOR.V_MM_EMBEDDING: "mm.embedding", # gemma3n - MODEL_TENSOR.V_MM_HARD_EMB_NORM: "mm.hard_emb_norm", # gemma3n - MODEL_TENSOR.V_ENC_CONV_STEM: "v.conv_stem.conv", # gemma3n - MODEL_TENSOR.V_ENC_CONV_STEM_NORM: "v.conv_stem.bn", # gemma3n - MODEL_TENSOR.V_ENC_MSFA_EXP: "v.msfa.ffn.pw_exp.conv", # gemma3n - MODEL_TENSOR.V_ENC_MSFA_EXP_NORM: "v.msfa.ffn.pw_exp.bn", # gemma3n - MODEL_TENSOR.V_ENC_MSFA_PROJ: "v.msfa.ffn.pw_proj.conv", # gemma3n - MODEL_TENSOR.V_ENC_MSFA_PROJ_NORM: "v.msfa.ffn.pw_proj.bn", # gemma3n - MODEL_TENSOR.V_ENC_MSFA_NORM: "v.msfa.norm", # gemma3n + MODEL_TENSOR.V_MM_SOFT_EMB_NORM: "mm.soft_emb_norm", MODEL_TENSOR.V_RESMPL_POS_EMBD_K: "resampler.pos_embd_k", MODEL_TENSOR.V_RESMPL_ATTN_Q: "resampler.attn.q", MODEL_TENSOR.V_RESMPL_ATTN_K: "resampler.attn.k", @@ -1134,26 +1089,19 @@ TENSOR_NAMES: dict[MODEL_TENSOR, str] = { MODEL_TENSOR.A_ENC_EMBD_NORM: "a.position_embd_norm", MODEL_TENSOR.A_ENC_EMBD_TO_LOGITS: "a.embd_to_logits", MODEL_TENSOR.A_ENC_CONV1D: "a.conv1d.{bid}", - MODEL_TENSOR.A_ENC_CONV1D_NORM: "a.conv1d.{bid}.norm", MODEL_TENSOR.A_PRE_NORM: "a.pre_ln", MODEL_TENSOR.A_POST_NORM: "a.post_ln", - MODEL_TENSOR.A_ENC_LAYER_PRE_NORM: "a.blk.{bid}.layer_pre_norm", MODEL_TENSOR.A_ENC_ATTN_Q: "a.blk.{bid}.attn_q", MODEL_TENSOR.A_ENC_ATTN_K: "a.blk.{bid}.attn_k", MODEL_TENSOR.A_ENC_ATTN_V: "a.blk.{bid}.attn_v", - MODEL_TENSOR.A_ENC_PER_DIM_SCALE: "a.blk.{bid}.per_dim_scale", MODEL_TENSOR.A_ENC_INPUT_NORM: "a.blk.{bid}.ln1", MODEL_TENSOR.A_ENC_OUTPUT: "a.blk.{bid}.attn_out", MODEL_TENSOR.A_ENC_OUTPUT_NORM: "a.blk.{bid}.ln2", MODEL_TENSOR.A_ENC_FFN_NORM: "a.blk.{bid}.ffn_norm", - MODEL_TENSOR.A_ENC_FFN_POST_NORM: "a.blk.{bid}.ffn_post_norm", - MODEL_TENSOR.A_ENC_FFN_SCALE: "a.blk.{bid}.ffn_scale", MODEL_TENSOR.A_ENC_FFN_UP: "a.blk.{bid}.ffn_up", MODEL_TENSOR.A_ENC_FFN_GATE: "a.blk.{bid}.ffn_gate", MODEL_TENSOR.A_ENC_FFN_DOWN: "a.blk.{bid}.ffn_down", MODEL_TENSOR.A_ENC_FFN_NORM_1: "a.blk.{bid}.ffn_norm_1", - MODEL_TENSOR.A_ENC_FFN_POST_NORM_1: "a.blk.{bid}.ffn_post_norm_1", - MODEL_TENSOR.A_ENC_FFN_SCALE_1: "a.blk.{bid}.ffn_scale_1", MODEL_TENSOR.A_ENC_FFN_UP_1: "a.blk.{bid}.ffn_up_1", MODEL_TENSOR.A_ENC_FFN_GATE_1: "a.blk.{bid}.ffn_gate_1", MODEL_TENSOR.A_ENC_FFN_DOWN_1: "a.blk.{bid}.ffn_down_1", @@ -1161,10 +1109,6 @@ TENSOR_NAMES: dict[MODEL_TENSOR, str] = { MODEL_TENSOR.A_MMPROJ_FC: "mm.a.fc", MODEL_TENSOR.A_MM_NORM_PRE: "mm.a.norm_pre", MODEL_TENSOR.A_MM_NORM_MID: "mm.a.norm_mid", - MODEL_TENSOR.A_MM_INP_PROJ: "mm.a.input_projection", # gemma3n - MODEL_TENSOR.A_MM_SOFT_EMB_NORM: "mm.a.soft_emb_norm", # gemma3n - MODEL_TENSOR.A_MM_EMBEDDING: "mm.a.embedding", # gemma3n - MODEL_TENSOR.A_MM_HARD_EMB_NORM: "mm.a.hard_emb_norm", # gemma3n # lfm2 audio MODEL_TENSOR.A_ENC_NORM_CONV: "a.blk.{bid}.norm_conv", MODEL_TENSOR.A_ENC_LINEAR_POS: "a.blk.{bid}.linear_pos", @@ -1215,15 +1159,6 @@ MODEL_TENSORS: dict[MODEL_ARCH, list[MODEL_TENSOR]] = { MODEL_TENSOR.V_MM_INP_PROJ, MODEL_TENSOR.V_MM_INP_NORM, MODEL_TENSOR.V_MM_SOFT_EMB_NORM, - MODEL_TENSOR.V_MM_EMBEDDING, - MODEL_TENSOR.V_MM_HARD_EMB_NORM, - MODEL_TENSOR.V_ENC_CONV_STEM, - MODEL_TENSOR.V_ENC_CONV_STEM_NORM, - MODEL_TENSOR.V_ENC_MSFA_EXP, - MODEL_TENSOR.V_ENC_MSFA_EXP_NORM, - MODEL_TENSOR.V_ENC_MSFA_PROJ, - MODEL_TENSOR.V_ENC_MSFA_PROJ_NORM, - MODEL_TENSOR.V_ENC_MSFA_NORM, MODEL_TENSOR.V_RESMPL_POS_EMBD_K, MODEL_TENSOR.V_RESMPL_ATTN_Q, MODEL_TENSOR.V_RESMPL_ATTN_K, @@ -1251,26 +1186,19 @@ MODEL_TENSORS: dict[MODEL_ARCH, list[MODEL_TENSOR]] = { MODEL_TENSOR.A_ENC_EMBD_NORM, MODEL_TENSOR.A_ENC_EMBD_TO_LOGITS, MODEL_TENSOR.A_ENC_CONV1D, - MODEL_TENSOR.A_ENC_CONV1D_NORM, MODEL_TENSOR.A_PRE_NORM, MODEL_TENSOR.A_POST_NORM, - MODEL_TENSOR.A_ENC_LAYER_PRE_NORM, MODEL_TENSOR.A_ENC_ATTN_Q, MODEL_TENSOR.A_ENC_ATTN_K, MODEL_TENSOR.A_ENC_ATTN_V, - MODEL_TENSOR.A_ENC_PER_DIM_SCALE, MODEL_TENSOR.A_ENC_INPUT_NORM, MODEL_TENSOR.A_ENC_OUTPUT, MODEL_TENSOR.A_ENC_OUTPUT_NORM, MODEL_TENSOR.A_ENC_FFN_NORM, - MODEL_TENSOR.A_ENC_FFN_POST_NORM, - MODEL_TENSOR.A_ENC_FFN_SCALE, MODEL_TENSOR.A_ENC_FFN_UP, MODEL_TENSOR.A_ENC_FFN_GATE, MODEL_TENSOR.A_ENC_FFN_DOWN, MODEL_TENSOR.A_ENC_FFN_NORM_1, - MODEL_TENSOR.A_ENC_FFN_POST_NORM_1, - MODEL_TENSOR.A_ENC_FFN_SCALE_1, MODEL_TENSOR.A_ENC_FFN_UP_1, MODEL_TENSOR.A_ENC_FFN_GATE_1, MODEL_TENSOR.A_ENC_FFN_DOWN_1, @@ -1287,10 +1215,6 @@ MODEL_TENSORS: dict[MODEL_ARCH, list[MODEL_TENSOR]] = { MODEL_TENSOR.A_ENC_CONV_NORM, MODEL_TENSOR.A_ENC_CONV_PW1, MODEL_TENSOR.A_ENC_CONV_PW2, - MODEL_TENSOR.A_MM_INP_PROJ, - MODEL_TENSOR.A_MM_SOFT_EMB_NORM, - MODEL_TENSOR.A_MM_EMBEDDING, - MODEL_TENSOR.A_MM_HARD_EMB_NORM, ], MODEL_ARCH.LLAMA: [ MODEL_TENSOR.TOKEN_EMBD, @@ -1740,7 +1664,6 @@ MODEL_TENSORS: dict[MODEL_ARCH, list[MODEL_TENSOR]] = { MODEL_TENSOR.ATTN_OUT, MODEL_TENSOR.ATTN_POST_NORM, MODEL_TENSOR.ATTN_GATE, - MODEL_TENSOR.ATTN_QKV, MODEL_TENSOR.FFN_GATE_INP, MODEL_TENSOR.FFN_GATE_INP_SHEXP, MODEL_TENSOR.FFN_UP_SHEXP, @@ -1836,21 +1759,6 @@ MODEL_TENSORS: dict[MODEL_ARCH, list[MODEL_TENSOR]] = { MODEL_TENSOR.SSM_B_NORM, MODEL_TENSOR.SSM_C_NORM, ], - MODEL_ARCH.PLAMO3: [ - MODEL_TENSOR.TOKEN_EMBD, - MODEL_TENSOR.OUTPUT_NORM, - MODEL_TENSOR.OUTPUT, - MODEL_TENSOR.ATTN_NORM, - MODEL_TENSOR.ATTN_QKV, - MODEL_TENSOR.ATTN_Q_NORM, - MODEL_TENSOR.ATTN_K_NORM, - MODEL_TENSOR.ATTN_OUT, - MODEL_TENSOR.ATTN_POST_NORM, - MODEL_TENSOR.FFN_NORM, - MODEL_TENSOR.FFN_DOWN, - MODEL_TENSOR.FFN_UP, - MODEL_TENSOR.FFN_POST_NORM, - ], MODEL_ARCH.GPT2: [ MODEL_TENSOR.TOKEN_EMBD, MODEL_TENSOR.POS_EMBD, @@ -2756,38 +2664,6 @@ MODEL_TENSORS: dict[MODEL_ARCH, list[MODEL_TENSOR]] = { MODEL_TENSOR.FFN_UP, MODEL_TENSOR.FFN_POST_NORM, ], - MODEL_ARCH.EXAONE_MOE: [ - MODEL_TENSOR.TOKEN_EMBD, - MODEL_TENSOR.OUTPUT_NORM, - MODEL_TENSOR.OUTPUT, - MODEL_TENSOR.ROPE_FREQS, - MODEL_TENSOR.ATTN_NORM, - MODEL_TENSOR.ATTN_Q, - MODEL_TENSOR.ATTN_Q_NORM, - MODEL_TENSOR.ATTN_K, - MODEL_TENSOR.ATTN_K_NORM, - MODEL_TENSOR.ATTN_V, - MODEL_TENSOR.ATTN_OUT, - MODEL_TENSOR.FFN_NORM, - MODEL_TENSOR.FFN_GATE, - MODEL_TENSOR.FFN_DOWN, - MODEL_TENSOR.FFN_UP, - MODEL_TENSOR.FFN_GATE_INP, - MODEL_TENSOR.FFN_GATE_EXP, - MODEL_TENSOR.FFN_DOWN_EXP, - MODEL_TENSOR.FFN_UP_EXP, - MODEL_TENSOR.FFN_GATE_SHEXP, - MODEL_TENSOR.FFN_DOWN_SHEXP, - MODEL_TENSOR.FFN_UP_SHEXP, - MODEL_TENSOR.FFN_EXP_PROBS_B, - # NextN/MTP tensors - preserved but unused - MODEL_TENSOR.NEXTN_EH_PROJ, - MODEL_TENSOR.NEXTN_EMBED_TOKENS, - MODEL_TENSOR.NEXTN_ENORM, - MODEL_TENSOR.NEXTN_HNORM, - MODEL_TENSOR.NEXTN_SHARED_HEAD_HEAD, - MODEL_TENSOR.NEXTN_SHARED_HEAD_NORM, - ], MODEL_ARCH.GRANITE: [ MODEL_TENSOR.TOKEN_EMBD, MODEL_TENSOR.OUTPUT_NORM, @@ -3137,7 +3013,6 @@ MODEL_TENSORS: dict[MODEL_ARCH, list[MODEL_TENSOR]] = { MODEL_TENSOR.ATTN_V, MODEL_TENSOR.ATTN_OUT, MODEL_TENSOR.OUTPUT, - MODEL_TENSOR.DENSE_2_OUT, # LFM2-ColBert-350M ], MODEL_ARCH.LFM2MOE: [ MODEL_TENSOR.TOKEN_EMBD, @@ -3321,62 +3196,6 @@ MODEL_TENSORS: dict[MODEL_ARCH, list[MODEL_TENSOR]] = { MODEL_TENSOR.FFN_DOWN_EXP, MODEL_TENSOR.FFN_UP_EXP, ], - MODEL_ARCH.MIMO2: [ - MODEL_TENSOR.TOKEN_EMBD, - MODEL_TENSOR.OUTPUT_NORM, - MODEL_TENSOR.OUTPUT, - MODEL_TENSOR.ATTN_NORM, - MODEL_TENSOR.ATTN_Q, - MODEL_TENSOR.ATTN_K, - MODEL_TENSOR.ATTN_V, - MODEL_TENSOR.ATTN_SINKS, - MODEL_TENSOR.ATTN_OUT, - MODEL_TENSOR.FFN_NORM, - MODEL_TENSOR.FFN_GATE, - MODEL_TENSOR.FFN_DOWN, - MODEL_TENSOR.FFN_UP, - MODEL_TENSOR.FFN_GATE_INP, - MODEL_TENSOR.FFN_GATE_EXP, - MODEL_TENSOR.FFN_DOWN_EXP, - MODEL_TENSOR.FFN_UP_EXP, - MODEL_TENSOR.FFN_EXP_PROBS_B, - ], - MODEL_ARCH.LLAMA_EMBED: [ - MODEL_TENSOR.TOKEN_EMBD, - MODEL_TENSOR.OUTPUT_NORM, - MODEL_TENSOR.OUTPUT, - MODEL_TENSOR.ROPE_FREQS, - MODEL_TENSOR.ATTN_NORM, - MODEL_TENSOR.ATTN_Q, - MODEL_TENSOR.ATTN_K, - MODEL_TENSOR.ATTN_V, - MODEL_TENSOR.ATTN_OUT, - MODEL_TENSOR.ATTN_ROT_EMBD, - MODEL_TENSOR.FFN_GATE_INP, - MODEL_TENSOR.FFN_NORM, - MODEL_TENSOR.FFN_GATE, - MODEL_TENSOR.FFN_DOWN, - MODEL_TENSOR.FFN_UP, - MODEL_TENSOR.FFN_GATE_EXP, - MODEL_TENSOR.FFN_DOWN_EXP, - MODEL_TENSOR.FFN_UP_EXP, - ], - MODEL_ARCH.MAINCODER: [ - MODEL_TENSOR.TOKEN_EMBD, - MODEL_TENSOR.OUTPUT_NORM, - MODEL_TENSOR.OUTPUT, - MODEL_TENSOR.ATTN_NORM, - MODEL_TENSOR.ATTN_Q, - MODEL_TENSOR.ATTN_Q_NORM, - MODEL_TENSOR.ATTN_K, - MODEL_TENSOR.ATTN_K_NORM, - MODEL_TENSOR.ATTN_V, - MODEL_TENSOR.ATTN_OUT, - MODEL_TENSOR.FFN_NORM, - MODEL_TENSOR.FFN_GATE, - MODEL_TENSOR.FFN_DOWN, - MODEL_TENSOR.FFN_UP, - ], # TODO } @@ -3594,8 +3413,6 @@ class GGUFValueType(IntEnum): class VisionProjectorType: GEMMA3 = "gemma3" - GEMMA3NV = "gemma3nv" - GEMMA3NA = "gemma3na" IDEFICS3 = "idefics3" PIXTRAL = "pixtral" LLAMA4 = "llama4" @@ -3614,9 +3431,7 @@ class VisionProjectorType: COGVLM = "cogvlm" JANUS_PRO = "janus_pro" LFM2A = "lfm2a" # audio - MUSIC_FLAMINGO = "musicflamingo" # audio GLM4V = "glm4v" - YOUTUVL = "youtuvl" # Items here are (block size, type size) diff --git a/gguf-py/gguf/gguf_writer.py b/gguf-py/gguf/gguf_writer.py index 7fbb788..6a4a504 100644 --- a/gguf-py/gguf/gguf_writer.py +++ b/gguf-py/gguf/gguf_writer.py @@ -681,9 +681,6 @@ class GGUFWriter: def add_embedding_length(self, length: int) -> None: self.add_uint32(Keys.LLM.EMBEDDING_LENGTH.format(arch=self.arch), length) - def add_embedding_length_out(self, length: int) -> None: - self.add_uint32(Keys.LLM.EMBEDDING_LENGTH_OUT.format(arch=self.arch), length) - def add_features_length(self, length: int) -> None: self.add_uint32(Keys.LLM.FEATURES_LENGTH.format(arch=self.arch), length) @@ -1086,9 +1083,6 @@ class GGUFWriter: def add_clip_projector_type(self, value: str) -> None: self.add_string(Keys.Clip.PROJECTOR_TYPE, value) - def add_clip_vision_projector_type(self, value: str) -> None: - self.add_string(Keys.ClipVision.PROJECTOR_TYPE, value) - def add_vision_projection_dim(self, value: int) -> None: self.add_uint32(Keys.ClipVision.PROJECTION_DIM, value) @@ -1135,45 +1129,13 @@ class GGUFWriter: self.add_uint32(Keys.ClipVision.Projector.SCALE_FACTOR, value) def add_vision_n_wa_pattern(self, value: int) -> None: - """Add window attention pattern interval for vision models. - - This defines the pattern interval for window attention vs full attention layers. - For example, if n_wa_pattern=4, then layers 3, 7, 11, ... use full attention, - while other layers use window attention. - - Used by models like Qwen2.5-VL where full attention layers follow a regular pattern. - """ self.add_uint32(Keys.ClipVision.N_WA_PATTERN, value) - def add_vision_wa_layer_indexes(self, layers: Sequence[int]) -> None: - """Add explicit layer indexes that use full attention in vision models. - - This specifies the exact layer indices (0-based) that should use full attention - instead of window attention. All other layers will use window attention. - - Args: - layers: List of layer indices that use full attention (e.g., [3, 7, 11, 15]) - - Used by models like YoutuVL where full attention layers are explicitly specified - rather than following a regular pattern. - - Difference from add_vision_n_wa_pattern: - - n_wa_pattern: Defines a regular interval pattern (every Nth layer uses full attention) - - wa_layer_indexes: Explicitly lists which layers use full attention (irregular pattern) - """ - self.add_array(Keys.ClipVision.WA_LAYER_INDEXES, layers) - def add_vision_is_deepstack_layers(self, layers: Sequence[bool]) -> None: self.add_array(Keys.ClipVision.IS_DEEPSTACK_LAYERS, layers) - def add_vision_window_size(self, value: int) -> None: - self.add_uint32(Keys.ClipVision.WINDOW_SIZE, value) - # audio models - def add_clip_audio_projector_type(self, value: str) -> None: - self.add_string(Keys.ClipAudio.PROJECTOR_TYPE, value) - def add_audio_projection_dim(self, value: int) -> None: self.add_uint32(Keys.ClipAudio.PROJECTION_DIM, value) diff --git a/gguf-py/gguf/tensor_mapping.py b/gguf-py/gguf/tensor_mapping.py index 84aa868..276720f 100644 --- a/gguf-py/gguf/tensor_mapping.py +++ b/gguf-py/gguf/tensor_mapping.py @@ -123,40 +123,6 @@ class TensorNameMap: MODEL_TENSOR.CONV1D: ( "backbone.embed", # roberta ), - - MODEL_TENSOR.V_MM_EMBEDDING: ( - "model.embed_vision.embedding", # gemma3n - ), - MODEL_TENSOR.V_MM_HARD_EMB_NORM: ( - "model.embed_vision.hard_embedding_norm", # gemma3n - ), - MODEL_TENSOR.V_MM_INP_PROJ: ( - "model.embed_vision.embedding_projection", # gemma3n - ), - MODEL_TENSOR.V_MM_SOFT_EMB_NORM: ( - "model.embed_vision.soft_embedding_norm", # gemma3n - ), - MODEL_TENSOR.V_ENC_CONV_STEM: ( - "model.vision_tower.timm_model.conv_stem.conv", # gemma3n - ), - MODEL_TENSOR.V_ENC_CONV_STEM_NORM: ( - "model.vision_tower.timm_model.conv_stem.bn", # gemma3n - ), - MODEL_TENSOR.V_ENC_MSFA_EXP: ( - "model.vision_tower.timm_model.msfa.ffn.pw_exp.conv", # gemma3n - ), - MODEL_TENSOR.V_ENC_MSFA_EXP_NORM: ( - "model.vision_tower.timm_model.msfa.ffn.pw_exp.bn", # gemma3n - ), - MODEL_TENSOR.V_ENC_MSFA_PROJ: ( - "model.vision_tower.timm_model.msfa.ffn.pw_proj.conv", # gemma3n - ), - MODEL_TENSOR.V_ENC_MSFA_PROJ_NORM: ( - "model.vision_tower.timm_model.msfa.ffn.pw_proj.bn", # gemma3n - ), - MODEL_TENSOR.V_ENC_MSFA_NORM: ( - "model.vision_tower.timm_model.msfa.norm", # gemma3n - ), } block_mappings_cfg: dict[MODEL_TENSOR, tuple[str, ...]] = { @@ -354,7 +320,6 @@ class TensorNameMap: MODEL_TENSOR.ATTN_SINKS: ( "model.layers.{bid}.self_attn.sinks", # openai-moe - "model.layers.{bid}.self_attn.attention_sink_bias", # mimov2 ), MODEL_TENSOR.ATTN_GATE: ( @@ -436,8 +401,7 @@ class TensorNameMap: "model.layers.{bid}.mlp.expert_bias", # afmoe "model.layers.{bid}.feed_forward.expert_bias", # lfm2moe "model.layers.{bid}.block_sparse_moe.e_score_correction", # minimax-m2 - "backbone.layers.{bid}.mixer.gate.e_score_correction", # nemotron-h-moe - "model.layers.{bid}.mlp.e_score_correction", # exaone-moe + "backbone.layers.{bid}.mixer.gate.e_score_correction" # nemotron-h-moe ), # Feed-forward up @@ -630,7 +594,6 @@ class TensorNameMap: "encoder.layer.{bid}.attention.self.layer_norm_q", # jina-bert-v2 "transformer.layers.{bid}.attn.q_norm", # openelm "model.layers.layers.{bid}.mixer.q", # plamo2 - "model.layers.layers.{bid}.mixer.q_norm", # plamo3 "layers.{bid}.self_attn.q_norm", # qwen3-embedding "model.layers.{bid}.attention.query_layernorm", # apertus ), @@ -646,7 +609,6 @@ class TensorNameMap: "encoder.layer.{bid}.attention.self.layer_norm_k", # jina-bert-v2 "transformer.layers.{bid}.attn.k_norm", # openelm "model.layers.layers.{bid}.mixer.k", # plamo2 - "model.layers.layers.{bid}.mixer.k_norm", # plamo3 "layers.{bid}.self_attn.k_norm", # qwen3-embedding "model.layers.{bid}.attention.key_layernorm", # apertus ), @@ -1256,7 +1218,6 @@ class TensorNameMap: MODEL_TENSOR.V_MMPROJ: ( "multi_modal_projector.linear_{bid}", "visual.merger.mlp.{bid}", # qwen2vl - "merger.mlp.{bid}", ), MODEL_TENSOR.V_MMPROJ_FC: ( @@ -1294,7 +1255,6 @@ class TensorNameMap: "visual.patch_embed.proj", # qwen2vl "vision_tower.patch_embed.proj", # kimi-vl "model.vision.patch_embedding.proj", # cogvlm - "siglip2.vision_model.embeddings.patch_embedding", ), MODEL_TENSOR.V_ENC_EMBD_NORM: ( @@ -1328,7 +1288,6 @@ class TensorNameMap: "vision_encoder.transformer.layers.{bid}.attention.wq", # pixtral "visual.blocks.{bid}.attn.q", # qwen2vl, generated "vision_tower.encoder.blocks.{bid}.wq", # kimi-vl, generated - "siglip2.vision_model.encoder.layers.{bid}.self_attn.q_proj", # youtuvl ), MODEL_TENSOR.V_ENC_ATTN_Q_NORM: ( @@ -1346,7 +1305,6 @@ class TensorNameMap: "vision_encoder.transformer.layers.{bid}.attention.wk", # pixtral "visual.blocks.{bid}.attn.k", # qwen2vl, generated "vision_tower.encoder.blocks.{bid}.wk", # kimi-vl, generated - "siglip2.vision_model.encoder.layers.{bid}.self_attn.k_proj", ), MODEL_TENSOR.V_ENC_ATTN_K_NORM: ( @@ -1364,7 +1322,6 @@ class TensorNameMap: "vision_encoder.transformer.layers.{bid}.attention.wv", # pixtral "visual.blocks.{bid}.attn.v", # qwen2vl, generated "vision_tower.encoder.blocks.{bid}.wv", # kimi-vl, generated - "siglip2.vision_model.encoder.layers.{bid}.self_attn.v_proj", ), MODEL_TENSOR.V_ENC_INPUT_NORM: ( @@ -1379,7 +1336,6 @@ class TensorNameMap: "visual.blocks.{bid}.norm1", # qwen2vl "vision_tower.encoder.blocks.{bid}.norm0", # kimi-vl (norm0/norm1) "model.vision.transformer.layers.{bid}.input_layernorm", # cogvlm - "siglip2.vision_model.encoder.layers.{bid}.layer_norm1", ), MODEL_TENSOR.V_ENC_ATTN_O: ( @@ -1395,7 +1351,6 @@ class TensorNameMap: "visual.blocks.{bid}.attn.proj", # qwen2vl "vision_tower.encoder.blocks.{bid}.wo", # kimi-vl "model.vision.transformer.layers.{bid}.attention.dense", # cogvlm - "siglip2.vision_model.encoder.layers.{bid}.self_attn.out_proj", # youtuvl ), MODEL_TENSOR.V_ENC_POST_ATTN_NORM: ( @@ -1410,7 +1365,6 @@ class TensorNameMap: "visual.blocks.{bid}.norm2", # qwen2vl "vision_tower.encoder.blocks.{bid}.norm1", # kimi-vl (norm0/norm1) "model.vision.transformer.layers.{bid}.post_attention_layernorm", # cogvlm - "siglip2.vision_model.encoder.layers.{bid}.layer_norm2", ), MODEL_TENSOR.V_ENC_FFN_UP: ( @@ -1426,7 +1380,6 @@ class TensorNameMap: "visual.blocks.{bid}.mlp.linear_fc1", # qwen3vl "vision_tower.encoder.blocks.{bid}.mlp.fc0", # kimi-vl (fc0/fc1) "model.vision.transformer.layers.{bid}.mlp.fc1", # cogvlm - "siglip2.vision_model.encoder.layers.{bid}.mlp.fc1", ), MODEL_TENSOR.V_ENC_FFN_GATE: ( @@ -1448,7 +1401,6 @@ class TensorNameMap: "visual.blocks.{bid}.mlp.linear_fc2", # qwen3vl "vision_tower.encoder.blocks.{bid}.mlp.fc1", # kimi-vl (fc0/fc1) "model.vision.transformer.layers.{bid}.mlp.fc2", # cogvlm - "siglip2.vision_model.encoder.layers.{bid}.mlp.fc2", ), MODEL_TENSOR.V_LAYER_SCALE_1: ( @@ -1475,7 +1427,6 @@ class TensorNameMap: "visual.merger.ln_q", # qwen2vl "vision_tower.encoder.final_layernorm", # kimi-vl "visual.post_layernorm", # glm4v - "siglip2.vision_model.post_layernorm", ), MODEL_TENSOR.V_MM_POST_NORM: ( @@ -1492,7 +1443,6 @@ class TensorNameMap: "multi_modal_projector.pre_norm", "pre_mm_projector_norm", "model.vision.linear_proj.norm1", # cogvlm - "merger.ln_q", ), MODEL_TENSOR.V_MM_SOFT_EMB_NORM: ( @@ -1610,11 +1560,6 @@ class TensorNameMap: MODEL_TENSOR.A_ENC_CONV1D: ( "audio_tower.conv{bid}", # ultravox "conformer.pre_encode.conv.{bid}", # lfm2 - "model.audio_tower.subsample_conv_projection.conv_{bid}.conv", # gemma3n - ), - - MODEL_TENSOR.A_ENC_CONV1D_NORM: ( - "model.audio_tower.subsample_conv_projection.conv_{bid}.norm", # gemma3n ), MODEL_TENSOR.A_PRE_NORM: (), @@ -1627,64 +1572,40 @@ class TensorNameMap: MODEL_TENSOR.A_ENC_ATTN_Q: ( "audio_tower.layers.{bid}.self_attn.q_proj", # ultravox "conformer.layers.{bid}.self_attn.linear_q", # lfm2 - "conformer.layers.{bid}.attention.attn.q_proj", # gemma3n ), MODEL_TENSOR.A_ENC_ATTN_K: ( "audio_tower.layers.{bid}.self_attn.k_proj", # ultravox "conformer.layers.{bid}.self_attn.linear_k", # lfm2 - "conformer.layers.{bid}.attention.attn.k_proj", # gemma3n ), MODEL_TENSOR.A_ENC_ATTN_V: ( "audio_tower.layers.{bid}.self_attn.v_proj", # ultravox "conformer.layers.{bid}.self_attn.linear_v", # lfm2 - "conformer.layers.{bid}.attention.attn.v_proj", # gemma3n - ), - - MODEL_TENSOR.A_ENC_PER_DIM_SCALE: ( - "conformer.layers.{bid}.attention.attn.per_dim_scale", # gemma3n - ), - - MODEL_TENSOR.A_ENC_LAYER_PRE_NORM: ( - "conformer.layers.{bid}.norm", # gemma3n ), MODEL_TENSOR.A_ENC_INPUT_NORM: ( "audio_tower.layers.{bid}.self_attn_layer_norm", # ultravox "conformer.layers.{bid}.norm_self_att", # lfm2 - "conformer.layers.{bid}.attention.pre_attn_norm", # gemma3n ), MODEL_TENSOR.A_ENC_OUTPUT: ( "audio_tower.layers.{bid}.self_attn.out_proj", # ultravox "conformer.layers.{bid}.self_attn.linear_out", # lfm2 - "conformer.layers.{bid}.attention.post", # gemma3n ), MODEL_TENSOR.A_ENC_OUTPUT_NORM: ( "audio_tower.layers.{bid}.final_layer_norm", # ultravox "conformer.layers.{bid}.norm_out", # lfm2 - "conformer.layers.{bid}.attention.post_norm", # gemma3n ), MODEL_TENSOR.A_ENC_FFN_NORM: ( "conformer.layers.{bid}.norm_feed_forward1", # lfm2 - "conformer.layers.{bid}.ffw_layer_start.pre_layer_norm", # gemma3n - ), - - MODEL_TENSOR.A_ENC_FFN_POST_NORM: ( - "conformer.layers.{bid}.ffw_layer_start.post_layer_norm", # gemma3n - ), - - MODEL_TENSOR.A_ENC_FFN_SCALE: ( - "conformer.layers.{bid}.ffw_layer_start.post_layer_scale", # gemma3n ), MODEL_TENSOR.A_ENC_FFN_UP: ( "audio_tower.layers.{bid}.fc1", # ultravox "conformer.layers.{bid}.feed_forward1.linear1", # lfm2 - "conformer.layers.{bid}.ffw_layer_start.ffw_layer_1", # gemma3n ), MODEL_TENSOR.A_ENC_FFN_GATE: (), @@ -1692,35 +1613,22 @@ class TensorNameMap: MODEL_TENSOR.A_ENC_FFN_DOWN: ( "audio_tower.layers.{bid}.fc2", # ultravox "conformer.layers.{bid}.feed_forward1.linear2", # lfm2 - "conformer.layers.{bid}.ffw_layer_start.ffw_layer_2", # gemma3n ), MODEL_TENSOR.A_ENC_FFN_UP_1: ( "conformer.layers.{bid}.feed_forward2.linear1", # lfm2 - "conformer.layers.{bid}.ffw_layer_end.ffw_layer_1", # gemma3n ), MODEL_TENSOR.A_ENC_FFN_DOWN_1: ( "conformer.layers.{bid}.feed_forward2.linear2", # lfm2 - "conformer.layers.{bid}.ffw_layer_end.ffw_layer_2", # gemma3n ), MODEL_TENSOR.A_ENC_FFN_NORM_1: ( "conformer.layers.{bid}.norm_feed_forward2", # lfm2 - "conformer.layers.{bid}.ffw_layer_end.pre_layer_norm", # gemma3n - ), - - MODEL_TENSOR.A_ENC_FFN_POST_NORM_1: ( - "conformer.layers.{bid}.ffw_layer_end.post_layer_norm", # gemma3n - ), - - MODEL_TENSOR.A_ENC_FFN_SCALE_1: ( - "conformer.layers.{bid}.ffw_layer_end.post_layer_scale", # gemma3n ), MODEL_TENSOR.A_ENC_LINEAR_POS: ( "conformer.layers.{bid}.self_attn.linear_pos", # lfm2 - "conformer.layers.{bid}.attention.attn.relative_position_embedding.pos_proj", # gemma3n ), MODEL_TENSOR.A_ENC_POS_BIAS_U: ( @@ -1733,7 +1641,6 @@ class TensorNameMap: MODEL_TENSOR.A_ENC_OUT: ( "conformer.pre_encode.out", # lfm2 - "model.audio_tower.subsample_conv_projection.input_proj_linear", # gemma3n ), # note: some tensors below has "audio." pseudo-prefix, to prevent conflicts with vision tensors @@ -1759,43 +1666,25 @@ class TensorNameMap: MODEL_TENSOR.A_ENC_CONV_DW: ( "conformer.layers.{bid}.conv.depthwise_conv", # lfm2 - "conformer.layers.{bid}.lconv1d.depthwise_conv1d", # gemma3n ), MODEL_TENSOR.A_ENC_CONV_NORM: ( "conformer.layers.{bid}.conv.batch_norm", # lfm2 - "conformer.layers.{bid}.lconv1d.pre_layer_norm", # gemma3n ), MODEL_TENSOR.A_ENC_CONV_PW1: ( "conformer.layers.{bid}.conv.pointwise_conv1", # lfm2 - "conformer.layers.{bid}.lconv1d.linear_start", # gemma3n ), MODEL_TENSOR.A_ENC_CONV_PW2: ( "conformer.layers.{bid}.conv.pointwise_conv2", # lfm2 - "conformer.layers.{bid}.lconv1d.linear_end", # gemma3n ), MODEL_TENSOR.A_ENC_NORM_CONV: ( "conformer.layers.{bid}.norm_conv", # lfm2 - "conformer.layers.{bid}.lconv1d.conv_norm", # gemma3n ), - MODEL_TENSOR.A_MM_EMBEDDING: ( - "model.embed_audio.embedding", # gemma3n - ), - MODEL_TENSOR.A_MM_HARD_EMB_NORM: ( - "model.embed_audio.hard_embedding_norm", # gemma3n - ), - MODEL_TENSOR.A_MM_INP_PROJ: ( - "model.embed_audio.embedding_projection", # gemma3n - ), - MODEL_TENSOR.A_MM_SOFT_EMB_NORM: ( - "model.embed_audio.soft_embedding_norm", # gemma3n - ), - - # NextN/MTP tensors + # NextN/MTP tensors for GLM4_MOE MODEL_TENSOR.NEXTN_EH_PROJ: ( "model.layers.{bid}.eh_proj", ), diff --git a/gguf-py/pyproject.toml b/gguf-py/pyproject.toml index f6c4cd1..0f3a1ee 100644 --- a/gguf-py/pyproject.toml +++ b/gguf-py/pyproject.toml @@ -22,7 +22,6 @@ python = ">=3.8" numpy = ">=1.17" tqdm = ">=4.27" pyyaml = ">=5.1" -requests = ">=2.25" sentencepiece = { version = ">=0.1.98,<=0.2.0", optional = true } PySide6 = { version = "^6.9", python = ">=3.9,<3.14", optional = true } diff --git a/grammars/README.md b/grammars/README.md index dcd2864..daac7f4 100644 --- a/grammars/README.md +++ b/grammars/README.md @@ -150,9 +150,6 @@ You can use GBNF grammars: - in CLI, with [examples/json_schema_to_grammar.py](../examples/json_schema_to_grammar.py) - in JavaScript with [json-schema-to-grammar.mjs](../tools/server/public_legacy/json-schema-to-grammar.mjs) (this is used by the [server](../tools/server)'s Web UI) -> [!NOTE] -> The JSON schema is only used to constrain the model output and is not injected into the prompt. The model has no visibility into the schema, so if you want it to understand the expected structure, describe it explicitly in your prompt. This does not apply to tool calling, where schemas are injected into the prompt. - Take a look at [tests](../tests/test-json-schema-to-grammar.cpp) to see which features are likely supported (you'll also find usage examples in https://github.com/ggml-org/llama.cpp/pull/5978, https://github.com/ggml-org/llama.cpp/pull/6659 & https://github.com/ggml-org/llama.cpp/pull/6555). ```bash diff --git a/include/llama-cpp.h b/include/llama-cpp.h index 807e77f..8f63681 100644 --- a/include/llama-cpp.h +++ b/include/llama-cpp.h @@ -21,9 +21,7 @@ struct llama_sampler_deleter { }; struct llama_adapter_lora_deleter { - void operator()(llama_adapter_lora *) { - // llama_adapter_lora_free is deprecated - } + void operator()(llama_adapter_lora * adapter) { llama_adapter_lora_free(adapter); } }; typedef std::unique_ptr llama_model_ptr; diff --git a/include/llama.h b/include/llama.h index 2807457..f862930 100644 --- a/include/llama.h +++ b/include/llama.h @@ -286,7 +286,7 @@ extern "C" { // NULL-terminated list of buffer types to use for tensors that match a pattern const struct llama_model_tensor_buft_override * tensor_buft_overrides; - int32_t n_gpu_layers; // number of layers to store in VRAM, a negative value means all layers + int32_t n_gpu_layers; // number of layers to store in VRAM enum llama_split_mode split_mode; // how to split the model across multiple GPUs // the GPU that is used for the entire model when split_mode is LLAMA_SPLIT_MODE_NONE @@ -309,7 +309,6 @@ extern "C" { // Keep the booleans together to avoid misalignment during copy-by-value. bool vocab_only; // only load the vocabulary, no weights bool use_mmap; // use mmap if possible - bool use_direct_io; // use direct io, takes precedence over use_mmap bool use_mlock; // force system to keep model in RAM bool check_tensors; // validate model tensor data bool use_extra_bufts; // use extra buffer types (used for weight repacking) @@ -317,11 +316,6 @@ extern "C" { bool no_alloc; // only load metadata and simulate memory allocations }; - struct llama_sampler_seq_config { - llama_seq_id seq_id; - struct llama_sampler * sampler; - }; - // NOTE: changing the default values of parameters marked as [EXPERIMENTAL] may cause crashes or incorrect results in certain configurations // https://github.com/ggml-org/llama.cpp/pull/7544 struct llama_context_params { @@ -370,12 +364,6 @@ extern "C" { bool kv_unified; // use a unified buffer across the input sequences when computing the attention // try to disable when n_seq_max > 1 for improved performance when the sequences do not share a large prefix // ref: https://github.com/ggml-org/llama.cpp/pull/14363 - - // [EXPERIMENTAL] - // backend sampler chain configuration (make sure the caller keeps the sampler chains alive) - // note: the samplers must be sampler chains (i.e. use llama_sampler_chain_init) - struct llama_sampler_seq_config * samplers; - size_t n_samplers; }; // model quantization parameters @@ -479,23 +467,16 @@ extern "C" { // Frees all allocated memory LLAMA_API void llama_free(struct llama_context * ctx); - enum llama_params_fit_status { - LLAMA_PARAMS_FIT_STATUS_SUCCESS = 0, // found allocations that are projected to fit - LLAMA_PARAMS_FIT_STATUS_FAILURE = 1, // could not find allocations that are projected to fit - LLAMA_PARAMS_FIT_STATUS_ERROR = 2, // a hard error occured, e.g. because no model could be found at the specified path - }; - // fits mparams and cparams to free device memory (assumes system memory is unlimited) - // - returns true if the parameters could be successfully modified to fit device memory - // - this function is NOT thread safe because it modifies the global llama logger state - // - only parameters that have the same value as in llama_default_model_params are modified - LLAMA_API enum llama_params_fit_status llama_params_fit( + // returns true if the parameters could be successfully modified to fit device memory + // this function is NOT thread safe because it modifies the global llama logger state + LLAMA_API bool llama_params_fit( const char * path_model, struct llama_model_params * mparams, struct llama_context_params * cparams, float * tensor_split, // writable buffer for tensor split, needs at least llama_max_devices elements struct llama_model_tensor_buft_override * tensor_buft_overrides, // writable buffer for overrides, needs at least llama_max_tensor_buft_overrides elements - size_t * margins, // margins of memory to leave per device in bytes + size_t margin, // margin of memory to leave per device in bytes uint32_t n_ctx_min, // minimum context size to set when trying to reduce memory use enum ggml_log_level log_level); // minimum log level to print during fitting, lower levels go to debug log @@ -536,7 +517,6 @@ extern "C" { LLAMA_API int32_t llama_model_n_ctx_train(const struct llama_model * model); LLAMA_API int32_t llama_model_n_embd (const struct llama_model * model); LLAMA_API int32_t llama_model_n_embd_inp (const struct llama_model * model); - LLAMA_API int32_t llama_model_n_embd_out (const struct llama_model * model); LLAMA_API int32_t llama_model_n_layer (const struct llama_model * model); LLAMA_API int32_t llama_model_n_head (const struct llama_model * model); LLAMA_API int32_t llama_model_n_head_kv (const struct llama_model * model); @@ -620,8 +600,6 @@ extern "C" { // // Load a LoRA adapter from file - // The adapter is valid as long as the associated model is not freed - // All adapters must be loaded before context creation LLAMA_API struct llama_adapter_lora * llama_adapter_lora_init( struct llama_model * model, const char * path_lora); @@ -646,8 +624,7 @@ extern "C" { // Manually free a LoRA adapter // NOTE: loaded adapters will be free when the associated model is deleted - LLAMA_API DEPRECATED(void llama_adapter_lora_free(struct llama_adapter_lora * adapter), - "adapters are now freed together with the associated model"); + LLAMA_API void llama_adapter_lora_free(struct llama_adapter_lora * adapter); // Get the invocation tokens if the current lora is an alora LLAMA_API uint64_t llama_adapter_get_alora_n_invocation_tokens(const struct llama_adapter_lora * adapter); @@ -1006,32 +983,6 @@ extern "C" { // otherwise: float[n_embd] (1-dimensional) LLAMA_API float * llama_get_embeddings_seq(struct llama_context * ctx, llama_seq_id seq_id); - // - // backend sampling API [EXPERIMENTAL] - // note: use only if the llama_context was created with at least one llama_sampler_seq_config - // - - // Get the backend sampled token for the ith token. - // Returns LLAMA_TOKEN_NULL if no token was sampled. - LLAMA_API llama_token llama_get_sampled_token_ith(struct llama_context * ctx, int32_t i); - - // Get the backend sampled probabilites for the ith token - // The index matches llama_get_sampled_token_ith(). - // Returns NULL if no probabilites were generated. - LLAMA_API float * llama_get_sampled_probs_ith (struct llama_context * ctx, int32_t i); - LLAMA_API uint32_t llama_get_sampled_probs_count_ith(struct llama_context * ctx, int32_t i); - - // Get the backend sampled logits for the ith token - // Returns NULL if no logits were sampled. - LLAMA_API float * llama_get_sampled_logits_ith (struct llama_context * ctx, int32_t i); - LLAMA_API uint32_t llama_get_sampled_logits_count_ith(struct llama_context * ctx, int32_t i); - - // Get the backend sampled candidates (token ids) for the ith token - // These are needed to map probability/logit indices to vocab token ids. - // Returns NULL if no candidates were sampled. - LLAMA_API llama_token * llama_get_sampled_candidates_ith (struct llama_context * ctx, int32_t i); - LLAMA_API uint32_t llama_get_sampled_candidates_count_ith(struct llama_context * ctx, int32_t i); - // // Vocab // @@ -1203,16 +1154,11 @@ extern "C" { // // llama_sampler_free(smpl); // + // TODO: In the future, llama_sampler will be utilized to offload the sampling to the backends (e.g. GPU). + // typedef void * llama_sampler_context_t; - struct llama_sampler_data { - struct ggml_tensor * logits; - struct ggml_tensor * probs; - struct ggml_tensor * sampled; - struct ggml_tensor * candidates; - }; - // user code can implement the interface below in order to create custom llama_sampler struct llama_sampler_i { const char * (*name) (const struct llama_sampler * smpl); // can be NULL @@ -1222,44 +1168,17 @@ extern "C" { struct llama_sampler * (*clone) (const struct llama_sampler * smpl); // can be NULL if ctx is NULL void (*free) ( struct llama_sampler * smpl); // can be NULL if ctx is NULL - // [EXPERIMENTAL] - // backend sampling interface: - - // return true if the backend supports all ops needed by the sampler - // note: call once per sampler - bool (*backend_init)(struct llama_sampler * smpl, ggml_backend_buffer_type_t buft); - - // call after .backend_apply() - void (*backend_accept)( - struct llama_sampler * smpl, - struct ggml_context * ctx, - struct ggml_cgraph * gf, - struct ggml_tensor * selected_token); - - // call after .backend_init() - void (*backend_apply)( - struct llama_sampler * smpl, - struct ggml_context * ctx, - struct ggml_cgraph * gf, - struct llama_sampler_data * data); - - // called before graph execution to set inputs for the current ubatch - void (*backend_set_input)(struct llama_sampler * smpl); + // TODO: API for internal libllama usage for appending the sampling to an existing ggml_cgraph + //void (*apply_ggml) (struct llama_sampler * smpl, ...); }; struct llama_sampler { - struct llama_sampler_i * iface; - - llama_sampler_context_t ctx; + const struct llama_sampler_i * iface; + llama_sampler_context_t ctx; }; - // [EXPERIMENTAL] - // attach a sampler to the context - // note: prefer initializing the context with llama_context_params.samplers when possible - LLAMA_API bool llama_set_sampler(struct llama_context * ctx, llama_seq_id seq_id, struct llama_sampler * smpl); - // mirror of llama_sampler_i: - LLAMA_API struct llama_sampler * llama_sampler_init ( struct llama_sampler_i * iface, llama_sampler_context_t ctx); + LLAMA_API struct llama_sampler * llama_sampler_init (const struct llama_sampler_i * iface, llama_sampler_context_t ctx); LLAMA_API const char * llama_sampler_name (const struct llama_sampler * smpl); LLAMA_API void llama_sampler_accept( struct llama_sampler * smpl, llama_token token); LLAMA_API void llama_sampler_apply ( struct llama_sampler * smpl, llama_token_data_array * cur_p); @@ -1275,15 +1194,7 @@ extern "C" { // important: takes ownership of the sampler object and will free it when llama_sampler_free is called LLAMA_API void llama_sampler_chain_add( struct llama_sampler * chain, struct llama_sampler * smpl); - - // return NULL if: - // - the sampler is NULL - // - the sampler is not a llama_sampler_chain - // - the index is out of bounds, unless i == -1 - // - if i == -1, returns the chain itself (can be used to check if the sampler is a chain) - LLAMA_API struct llama_sampler * llama_sampler_chain_get( struct llama_sampler * chain, int32_t i); - - // the total number of samplers in the chain + LLAMA_API struct llama_sampler * llama_sampler_chain_get(const struct llama_sampler * chain, int32_t i); LLAMA_API int llama_sampler_chain_n (const struct llama_sampler * chain); // after removing a sampler, the chain will no longer own it, and it will not be freed when the chain is freed @@ -1292,9 +1203,7 @@ extern "C" { // available samplers: LLAMA_API struct llama_sampler * llama_sampler_init_greedy(void); - - /// seed == LLAMA_DEFAULT_SEED to use a random seed. - LLAMA_API struct llama_sampler * llama_sampler_init_dist(uint32_t seed); + LLAMA_API struct llama_sampler * llama_sampler_init_dist (uint32_t seed); /// @details Top-K sampling described in academic paper "The Curious Case of Neural Text Degeneration" https://arxiv.org/abs/1904.09751 /// Setting k <= 0 makes this a noop @@ -1395,33 +1304,6 @@ extern "C" { const char ** seq_breakers, size_t num_breakers); - /// adaptive-p: select tokens near a configurable target probability over time. - /// - /// the adaptive-p sampler transforms the token probability distribution to favor tokens - /// that fall near a user-configurable probability target. - /// - /// internally, the sampler maintains an exponential moving average of the *ORIGINAL* - /// probabilities of selected tokens at each sampling step. it uses this EMA to compute an - /// adapted target probability at each sampling step, thus maintaining the desired target - /// probability over time. - /// - /// adaptive-p selects a token ID rather than just mutating candidates, so it must be last - /// in the sampler chain (like mirostat, dist, greedy). - /// - /// only mild truncation before this sampler is recommended. we suggest applying min-p - /// before adaptive-p as the only other active sampler in the chain. - /// - /// @param target select tokens near this probability (valid range 0.0 to 1.0; negative = disabled) - /// @param decay EMA decay for adaptation; history ≈ 1/(1-decay) tokens (valid range 0.0 - 0.99) - /// @param seed RNG seed - /// - /// ref: https://github.com/ggml-org/llama.cpp/pull/17927 - /// - LLAMA_API struct llama_sampler * llama_sampler_init_adaptive_p( - float target, - float decay, - uint32_t seed); - LLAMA_API struct llama_sampler * llama_sampler_init_logit_bias( int32_t n_vocab, int32_t n_logit_bias, diff --git a/licenses/LICENSE-curl b/licenses/LICENSE-curl new file mode 100644 index 0000000..da9c038 --- /dev/null +++ b/licenses/LICENSE-curl @@ -0,0 +1,9 @@ +Copyright (c) 1996 - 2025, Daniel Stenberg, daniel@haxx.se, and many contributors, see the THANKS file. + +All rights reserved. + +Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder. diff --git a/vendor/cpp-httplib/LICENSE b/licenses/LICENSE-httplib similarity index 99% rename from vendor/cpp-httplib/LICENSE rename to licenses/LICENSE-httplib index 3e5ed35..47c418e 100644 --- a/vendor/cpp-httplib/LICENSE +++ b/licenses/LICENSE-httplib @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/licenses/LICENSE-linenoise b/licenses/LICENSE-linenoise new file mode 100644 index 0000000..b006b3b --- /dev/null +++ b/licenses/LICENSE-linenoise @@ -0,0 +1,26 @@ +Copyright (c) 2010-2014, Salvatore Sanfilippo +Copyright (c) 2010-2013, Pieter Noordhuis +Copyright (c) 2025, Eric Curtin + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/models/templates/llama-cpp-deepseek-r1.jinja b/models/templates/llama-cpp-deepseek-r1.jinja index 0d18870..fcb1732 100644 --- a/models/templates/llama-cpp-deepseek-r1.jinja +++ b/models/templates/llama-cpp-deepseek-r1.jinja @@ -38,7 +38,7 @@ Example function tool call syntax: {%- if message['role'] == 'user' -%} {{- '<|User|>' + message['content'] + '<|end▁of▁sentence|>' -}} {%- endif -%} - {%- if message['role'] == 'assistant' and not message['content'] -%} + {%- if message['role'] == 'assistant' and message['content'] is none -%} {{- '<|Assistant|><|tool▁calls▁begin|>' -}} {%- set ns.is_first = true -%} {%- for tc in message['tool_calls'] -%} @@ -53,7 +53,7 @@ Example function tool call syntax: {%- endfor -%} {{- '<|tool▁calls▁end|><|end▁of▁sentence|>' -}} {%- endif -%} - {%- if message['role'] == 'assistant' and message['content'] -%} + {%- if message['role'] == 'assistant' and message['content'] is not none -%} {{- flush_tool_outputs() -}} {%- set content = message['content'] -%} {%- if '' in content -%} @@ -73,4 +73,4 @@ Example function tool call syntax: {{- flush_tool_outputs() -}} {%- if add_generation_prompt and not ns.is_tool_outputs -%} {{- '<|Assistant|>\n' -}} -{%- endif -%} +{%- endif -%} \ No newline at end of file diff --git a/scripts/debug-test.sh b/scripts/debug-test.sh index ead7ea1..7e9e842 100755 --- a/scripts/debug-test.sh +++ b/scripts/debug-test.sh @@ -109,7 +109,8 @@ rm -rf "$build_dir" && mkdir "$build_dir" || abort "Failed to make $build_dir" # Step 2: Setup Build Environment and Compile Test Binaries ########################################################### -cmake -B "./$build_dir" -DCMAKE_BUILD_TYPE=Debug -DGGML_CUDA=1 || abort "Failed to build environment" +# Note: test-eval-callback requires -DLLAMA_CURL +cmake -B "./$build_dir" -DCMAKE_BUILD_TYPE=Debug -DGGML_CUDA=1 -DLLAMA_CURL=1 || abort "Failed to build environment" pushd "$build_dir" make -j || abort "Failed to compile" popd > /dev/null || exit 1 diff --git a/scripts/pr2wt.sh b/scripts/pr2wt.sh deleted file mode 100755 index bd635f3..0000000 --- a/scripts/pr2wt.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env bash - -# intialize a new worktree from a PR number: -# -# - creates a new remote using the fork's clone URL -# - creates a local branch tracking the remote branch -# - creates a new worktree in a parent folder, suffixed with "-pr-$PR" -# -# sample usage: -# ./scripts/pr2wt.sh 12345 -# ./scripts/pr2wt.sh 12345 opencode -# ./scripts/pr2wt.sh 12345 "cmake -B build && cmake --build build" -# ./scripts/pr2wt.sh 12345 "bash -l" - -function usage() { - echo "usage: $0 [cmd]" - exit 1 -} - -# check we are in the right directory -if [[ ! -f "scripts/pr2wt.sh" ]]; then - echo "error: this script must be run from the root of the repository" - exit 1 -fi - -if [[ $# -lt 1 || $# -gt 2 ]]; then - usage -fi - -PR=$1 -[[ "$PR" =~ ^[0-9]+$ ]] || { echo "error: PR number must be numeric"; exit 1; } - -url_origin=$(git config --get remote.origin.url) || { - echo "error: no remote named 'origin' in this repository" - exit 1 -} - -org_repo=$(echo $url_origin | cut -d/ -f4-) -org_repo=${org_repo%.git} - -echo "org/repo: $org_repo" - -meta=$(curl -sSLf -H "Accept: application/vnd.github+json" "https://api.github.com/repos/$org_repo/pulls/$PR") - -url_remote=$(echo "$meta" | jq -r '.head.repo.clone_url') -head_ref=$(echo "$meta" | jq -r '.head.ref') - -echo "url: $url_remote" -echo "head_ref: $head_ref" - -url_remote_cur=$(git config --get "remote.pr/$PR.url" 2>/dev/null || true) - -if [[ "$url_remote_cur" != "$url_remote" ]]; then - git remote rm pr/$PR 2> /dev/null - git remote add pr/$PR "$url_remote" -fi - -git fetch "pr/$PR" "$head_ref" - -dir=$(basename $(pwd)) - -git branch -D pr/$PR 2> /dev/null -git worktree add -b pr/$PR ../$dir-pr-$PR pr/$PR/$head_ref 2> /dev/null - -wt_path=$(cd ../$dir-pr-$PR && pwd) - -echo "git worktree created in $wt_path" - -cd $wt_path -git branch --set-upstream-to=pr/$PR/$head_ref -git pull --ff-only || { - echo "error: failed to pull pr/$PR" - exit 1 -} - -if [[ $# -eq 2 ]]; then - echo "executing: $2" - eval "$2" -fi diff --git a/scripts/serve-static.js b/scripts/serve-static.js index df4953e..8ddc04a 100644 --- a/scripts/serve-static.js +++ b/scripts/serve-static.js @@ -4,7 +4,7 @@ const path = require('path'); // This file is used for testing wasm build from emscripten // Example build command: -// emcmake cmake -B build-wasm -DGGML_WEBGPU=ON -DLLAMA_OPENSSL=OFF +// emcmake cmake -B build-wasm -DGGML_WEBGPU=ON -DLLAMA_CURL=OFF // cmake --build build-wasm --target test-backend-ops -j const PORT = 8080; diff --git a/scripts/snapdragon/adb/run-bench.sh b/scripts/snapdragon/adb/run-bench.sh index 2750860..b2e651e 100755 --- a/scripts/snapdragon/adb/run-bench.sh +++ b/scripts/snapdragon/adb/run-bench.sh @@ -10,23 +10,14 @@ branch=. adbserial= [ "$S" != "" ] && adbserial="-s $S" -adbhost= -[ "$H" != "" ] && adbhost="-H $H" - model="Llama-3.2-3B-Instruct-Q4_0.gguf" [ "$M" != "" ] && model="$M" device="HTP0" [ "$D" != "" ] && device="$D" -verbose= -[ "$V" != "" ] && verbose="GGML_HEXAGON_VERBOSE=$V" cli_opts="$cli_opts -v" - -experimental= -[ "$E" != "" ] && experimental="GGML_HEXAGON_EXPERIMENTAL=$E" - -profile= -[ "$PROF" != "" ] && profile="GGML_HEXAGON_PROFILE=$PROF GGML_HEXAGON_OPSYNC=1" cli_opts="$cli_opts -v" +verbose="" +[ "$V" != "" ] && verbose="$V" opmask= [ "$OPMASK" != "" ] && opmask="GGML_HEXAGON_OPMASK=$OPMASK" @@ -37,16 +28,13 @@ nhvx= ndev= [ "$NDEV" != "" ] && ndev="GGML_HEXAGON_NDEV=$NDEV" -hb= -[ "$HB" != "" ] && hb="GGML_HEXAGON_HOSTBUF=$HB" - set -x -adb $adbserial $adbhost shell " \ +adb $adbserial shell " \ cd $basedir; \ LD_LIBRARY_PATH=$basedir/$branch/lib \ ADSP_LIBRARY_PATH=$basedir/$branch/lib \ - $ndev $nhvx $opmask $verbose $experimental $profile $hb ./$branch/bin/llama-bench --device $device --mmap 0 -m $basedir/../gguf/$model \ + $ndev $nhvx $opmask ./$branch/bin/llama-bench --device $device --mmap 0 -m $basedir/../gguf/$model \ --poll 1000 -t 6 --cpu-mask 0xfc --cpu-strict 1 \ - --batch-size 128 -ngl 99 $cli_opts $@ \ + --batch-size 128 -ngl 99 $@ \ " diff --git a/scripts/snapdragon/adb/run-cli.sh b/scripts/snapdragon/adb/run-cli.sh index d19d4e9..cc5e47c 100755 --- a/scripts/snapdragon/adb/run-cli.sh +++ b/scripts/snapdragon/adb/run-cli.sh @@ -12,26 +12,23 @@ branch=. adbserial= [ "$S" != "" ] && adbserial="-s $S" -adbhost= -[ "$H" != "" ] && adbhost="-H $H" - model="Llama-3.2-3B-Instruct-Q4_0.gguf" [ "$M" != "" ] && model="$M" device="HTP0" [ "$D" != "" ] && device="$D" +verbose= +[ "$V" != "" ] && verbose="GGML_HEXAGON_VERBOSE=$V" + experimental= [ "$E" != "" ] && experimental="GGML_HEXAGON_EXPERIMENTAL=$E" -verbose= -[ "$V" != "" ] && verbose="GGML_HEXAGON_VERBOSE=$V" cli_opts="$cli_opts -v" - sched= [ "$SCHED" != "" ] && sched="GGML_SCHED_DEBUG=2" cli_opts="$cli_opts -v" profile= -[ "$PROF" != "" ] && profile="GGML_HEXAGON_PROFILE=$PROF GGML_HEXAGON_OPSYNC=1" cli_opts="$cli_opts -v" +[ "$PROF" != "" ] && profile="GGML_HEXAGON_PROFILE=$PROF GGML_HEXAGON_OPSYNC=1" opmask= [ "$OPMASK" != "" ] && opmask="GGML_HEXAGON_OPMASK=$OPMASK" @@ -42,18 +39,15 @@ nhvx= ndev= [ "$NDEV" != "" ] && ndev="GGML_HEXAGON_NDEV=$NDEV" -hb= -[ "$HB" != "" ] && hb="GGML_HEXAGON_HOSTBUF=$HB" - set -x -adb $adbserial $adbhost shell " \ +adb $adbserial shell " \ cd $basedir; ulimit -c unlimited; \ LD_LIBRARY_PATH=$basedir/$branch/lib \ ADSP_LIBRARY_PATH=$basedir/$branch/lib \ - $verbose $experimental $sched $opmask $profile $nhvx $ndev $hb \ - ./$branch/bin/llama-cli --no-mmap -m $basedir/../gguf/$model \ - --poll 1000 -t 6 --cpu-mask 0xfc --cpu-strict 1 \ - --ctx-size 8192 --batch-size 128 -fa on \ - -ngl 99 --device $device $cli_opts $@ \ + $verbose $experimental $sched $opmask $profile $nhvx $ndev \ + ./$branch/bin/llama-completion --no-mmap -m $basedir/../gguf/$model \ + --poll 1000 -t 6 --cpu-mask 0xfc --cpu-strict 1 \ + --ctx-size 8192 --batch-size 128 -ctk q8_0 -ctv q8_0 -fa on \ + -ngl 99 --device $device $cli_opts $@ \ " diff --git a/scripts/snapdragon/adb/run-completion.sh b/scripts/snapdragon/adb/run-completion.sh deleted file mode 100755 index da9df11..0000000 --- a/scripts/snapdragon/adb/run-completion.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/sh -# - -# Basedir on device -basedir=/data/local/tmp/llama.cpp - -cli_opts= - -branch=. -[ "$B" != "" ] && branch=$B - -adbserial= -[ "$S" != "" ] && adbserial="-s $S" - -adbhost= -[ "$H" != "" ] && adbhost="-H $H" - -model="Llama-3.2-3B-Instruct-Q4_0.gguf" -[ "$M" != "" ] && model="$M" - -device="HTP0" -[ "$D" != "" ] && device="$D" - -experimental= -[ "$E" != "" ] && experimental="GGML_HEXAGON_EXPERIMENTAL=$E" - -verbose= -[ "$V" != "" ] && verbose="GGML_HEXAGON_VERBOSE=$V" cli_opts="$cli_opts -v" - -sched= -[ "$SCHED" != "" ] && sched="GGML_SCHED_DEBUG=2" cli_opts="$cli_opts -v" - -profile= -[ "$PROF" != "" ] && profile="GGML_HEXAGON_PROFILE=$PROF GGML_HEXAGON_OPSYNC=1" cli_opts="$cli_opts -v" - -opmask= -[ "$OPMASK" != "" ] && opmask="GGML_HEXAGON_OPMASK=$OPMASK" - -nhvx= -[ "$NHVX" != "" ] && nhvx="GGML_HEXAGON_NHVX=$NHVX" - -ndev= -[ "$NDEV" != "" ] && ndev="GGML_HEXAGON_NDEV=$NDEV" - -hb= -[ "$HB" != "" ] && hb="GGML_HEXAGON_HOSTBUF=$HB" - -set -x - -adb $adbserial $adbhost shell " \ - cd $basedir; ulimit -c unlimited; \ - LD_LIBRARY_PATH=$basedir/$branch/lib \ - ADSP_LIBRARY_PATH=$basedir/$branch/lib \ - $verbose $experimental $sched $opmask $profile $nhvx $ndev $hb \ - ./$branch/bin/llama-completion --no-mmap -m $basedir/../gguf/$model \ - --poll 1000 -t 6 --cpu-mask 0xfc --cpu-strict 1 \ - --ctx-size 8192 --batch-size 128 -fa on \ - -ngl 99 -no-cnv --device $device $cli_opts $@ \ -" diff --git a/scripts/snapdragon/adb/run-mtmd.sh b/scripts/snapdragon/adb/run-mtmd.sh index fc018e7..91d8682 100755 --- a/scripts/snapdragon/adb/run-mtmd.sh +++ b/scripts/snapdragon/adb/run-mtmd.sh @@ -12,9 +12,6 @@ branch=. adbserial= [ "$S" != "" ] && adbserial="-s $S" -adbhost= -[ "$H" != "" ] && adbhost="-H $H" - model="gemma-3-4b-it-Q4_0.gguf" [ "$M" != "" ] && model="$M" @@ -54,7 +51,7 @@ mtmd_backend= set -x -adb $adbserial $adbhost shell " \ +adb $adbserial shell " \ cd $basedir; ulimit -c unlimited; \ LD_LIBRARY_PATH=$basedir/$branch/lib \ ADSP_LIBRARY_PATH=$basedir/$branch/lib \ diff --git a/scripts/snapdragon/adb/run-tool.sh b/scripts/snapdragon/adb/run-tool.sh index 4647ede..bfc213e 100755 --- a/scripts/snapdragon/adb/run-tool.sh +++ b/scripts/snapdragon/adb/run-tool.sh @@ -12,9 +12,6 @@ branch=. adbserial= [ "$S" != "" ] && adbserial="-s $S" -adbhost= -[ "$H" != "" ] && adbhost="-H $H" - device="HTP0" [ "$D" != "" ] && device="$D" @@ -22,7 +19,7 @@ verbose= [ "$V" != "" ] && verbose="GGML_HEXAGON_VERBOSE=$V" experimental= -[ "$E" != "" ] && experimental="GGML_HEXAGON_EXPERIMENTAL=$E" +[ "$E" != "" ] && experimental="GGML_HEXAGON_EXPERIMENTAL=$V" sched= [ "$SCHED" != "" ] && sched="GGML_SCHED_DEBUG=2" cli_opts="$cli_opts -v" @@ -46,7 +43,7 @@ set -x tool=$1; shift -adb $adbserial $adbhost shell " \ +adb $adbserial shell " \ cd $basedir; ulimit -c unlimited; \ LD_LIBRARY_PATH=$basedir/$branch/lib \ ADSP_LIBRARY_PATH=$basedir/$branch/lib \ diff --git a/scripts/sync-ggml.last b/scripts/sync-ggml.last index c838276..5823efa 100644 --- a/scripts/sync-ggml.last +++ b/scripts/sync-ggml.last @@ -1 +1 @@ -ebc3a0f4a56be1c9424a89fbec09962ac34fde85 +130bc125a88bb57664b88932c48c38a1cb316fac diff --git a/scripts/sync_vendor.py b/scripts/sync_vendor.py index c3fbbc2..637f4cd 100755 --- a/scripts/sync_vendor.py +++ b/scripts/sync_vendor.py @@ -16,8 +16,7 @@ vendor = { # "https://github.com/mackron/miniaudio/raw/refs/tags/0.11.23/miniaudio.h": "vendor/miniaudio/miniaudio.h", "https://github.com/mackron/miniaudio/raw/669ed3e844524fcd883231b13095baee9f6de304/miniaudio.h": "vendor/miniaudio/miniaudio.h", - "https://raw.githubusercontent.com/yhirose/cpp-httplib/refs/tags/v0.30.1/httplib.h": "vendor/cpp-httplib/httplib.h", - "https://raw.githubusercontent.com/yhirose/cpp-httplib/refs/tags/v0.30.1/LICENSE": "vendor/cpp-httplib/LICENSE", + "https://raw.githubusercontent.com/yhirose/cpp-httplib/refs/tags/v0.28.0/httplib.h": "vendor/cpp-httplib/httplib.h", "https://raw.githubusercontent.com/sheredom/subprocess.h/b49c56e9fe214488493021017bf3954b91c7c1f5/subprocess.h": "vendor/sheredom/subprocess.h", } diff --git a/scripts/tool_bench.py b/scripts/tool_bench.py index d9f5583..e1512a4 100755 --- a/scripts/tool_bench.py +++ b/scripts/tool_bench.py @@ -7,7 +7,7 @@ Simple usage example: - cmake -B build && cmake --build build --config Release -j -t llama-server + cmake -B build -DLLAMA_CURL=1 && cmake --build build --config Release -j -t llama-server export LLAMA_SERVER_BIN_PATH=$PWD/build/bin/llama-server export LLAMA_CACHE=${LLAMA_CACHE:-$HOME/Library/Caches/llama.cpp} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c15c281..4ca8974 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -62,7 +62,6 @@ add_library(llama models/ernie4-5.cpp models/exaone.cpp models/exaone4.cpp - models/exaone-moe.cpp models/falcon-h1.cpp models/falcon.cpp models/gemma-embedding.cpp @@ -88,9 +87,7 @@ add_library(llama models/llada.cpp models/llama-iswa.cpp models/llama.cpp - models/maincoder.cpp models/mamba.cpp - models/mimo2-iswa.cpp models/minicpm3.cpp models/minimax-m2.cpp models/modern-bert.cpp @@ -109,7 +106,6 @@ add_library(llama models/phi3.cpp models/plamo.cpp models/plamo2.cpp - models/plamo3.cpp models/plm.cpp models/qwen.cpp models/qwen2.cpp diff --git a/src/llama-adapter.cpp b/src/llama-adapter.cpp index d6a5800..d8eef75 100644 --- a/src/llama-adapter.cpp +++ b/src/llama-adapter.cpp @@ -411,9 +411,6 @@ static void llama_adapter_lora_init_impl(llama_model & model, const char * path_ } } - // register adapter with model - model.loras.insert(&adapter); - LLAMA_LOG_INFO("%s: loaded %zu tensors from lora file\n", __func__, adapter.ab_map.size()*2); } @@ -471,8 +468,8 @@ int32_t llama_adapter_meta_val_str_by_index(const llama_adapter_lora * adapter, return snprintf(buf, buf_size, "%s", it->second.c_str()); } -void llama_adapter_lora_free(llama_adapter_lora *) { - // deprecated: adapters are freed by llama_model's destructor +void llama_adapter_lora_free(llama_adapter_lora * adapter) { + delete adapter; } uint64_t llama_adapter_get_alora_n_invocation_tokens(const struct llama_adapter_lora * adapter) { diff --git a/src/llama-adapter.h b/src/llama-adapter.h index d275d25..4f65247 100644 --- a/src/llama-adapter.h +++ b/src/llama-adapter.h @@ -77,10 +77,6 @@ struct llama_adapter_lora { ~llama_adapter_lora() = default; llama_adapter_lora_weight * get_weight(ggml_tensor * w); - - uint32_t get_n_nodes() const { - return ab_map.size() * 6u; // a, b, scale, add, 2 x mul_mat - } }; using llama_adapter_loras = std::unordered_map; diff --git a/src/llama-arch.cpp b/src/llama-arch.cpp index a54bc19..80f44ae 100644 --- a/src/llama-arch.cpp +++ b/src/llama-arch.cpp @@ -42,7 +42,6 @@ static const std::map LLM_ARCH_NAMES = { { LLM_ARCH_PHIMOE, "phimoe" }, { LLM_ARCH_PLAMO, "plamo" }, { LLM_ARCH_PLAMO2, "plamo2" }, - { LLM_ARCH_PLAMO3, "plamo3" }, { LLM_ARCH_CODESHELL, "codeshell" }, { LLM_ARCH_ORION, "orion" }, { LLM_ARCH_INTERNLM2, "internlm2" }, @@ -81,7 +80,6 @@ static const std::map LLM_ARCH_NAMES = { { LLM_ARCH_NEMOTRON_H_MOE, "nemotron_h_moe" }, { LLM_ARCH_EXAONE, "exaone" }, { LLM_ARCH_EXAONE4, "exaone4" }, - { LLM_ARCH_EXAONE_MOE, "exaone-moe" }, { LLM_ARCH_RWKV6, "rwkv6" }, { LLM_ARCH_RWKV6QWEN2, "rwkv6qwen2" }, { LLM_ARCH_RWKV7, "rwkv7" }, @@ -117,9 +115,6 @@ static const std::map LLM_ARCH_NAMES = { { LLM_ARCH_RND1, "rnd1" }, { LLM_ARCH_PANGU_EMBED, "pangu-embedded" }, { LLM_ARCH_MISTRAL3, "mistral3" }, - { LLM_ARCH_MIMO2, "mimo2" }, - { LLM_ARCH_LLAMA_EMBED, "llama-embed" }, - { LLM_ARCH_MAINCODER, "maincoder" }, { LLM_ARCH_UNKNOWN, "(unknown)" }, }; @@ -153,7 +148,6 @@ static const std::map LLM_KV_NAMES = { { LLM_KV_VOCAB_SIZE, "%s.vocab_size" }, { LLM_KV_CONTEXT_LENGTH, "%s.context_length" }, { LLM_KV_EMBEDDING_LENGTH, "%s.embedding_length" }, - { LLM_KV_EMBEDDING_LENGTH_OUT, "%s.embedding_length_out" }, { LLM_KV_FEATURES_LENGTH, "%s.features_length" }, { LLM_KV_BLOCK_COUNT, "%s.block_count" }, { LLM_KV_LEADING_DENSE_BLOCK_COUNT, "%s.leading_dense_block_count" }, @@ -506,7 +500,6 @@ static std::set llm_get_tensor_names(llm_arch arch) { case LLM_ARCH_LLAMA: case LLM_ARCH_DECI: case LLM_ARCH_MISTRAL3: - case LLM_ARCH_LLAMA_EMBED: return { LLM_TENSOR_TOKEN_EMBD, LLM_TENSOR_OUTPUT_NORM, @@ -951,8 +944,6 @@ static std::set llm_get_tensor_names(llm_arch arch) { LLM_TENSOR_ATTN_K_NORM, LLM_TENSOR_ATTN_V, LLM_TENSOR_ATTN_OUT, - LLM_TENSOR_ATTN_QKV, - LLM_TENSOR_ATTN_GATE, LLM_TENSOR_FFN_NORM, LLM_TENSOR_FFN_GATE_INP, LLM_TENSOR_FFN_GATE_EXPS, @@ -1083,22 +1074,6 @@ static std::set llm_get_tensor_names(llm_arch arch) { LLM_TENSOR_ATTN_POST_NORM, LLM_TENSOR_FFN_POST_NORM, }; - case LLM_ARCH_PLAMO3: - return { - LLM_TENSOR_TOKEN_EMBD, - LLM_TENSOR_OUTPUT_NORM, - LLM_TENSOR_OUTPUT, - LLM_TENSOR_ATTN_NORM, - LLM_TENSOR_ATTN_QKV, - LLM_TENSOR_ATTN_Q_NORM, - LLM_TENSOR_ATTN_K_NORM, - LLM_TENSOR_ATTN_OUT, - LLM_TENSOR_ATTN_POST_NORM, - LLM_TENSOR_FFN_NORM, - LLM_TENSOR_FFN_POST_NORM, - LLM_TENSOR_FFN_DOWN, - LLM_TENSOR_FFN_UP, - }; case LLM_ARCH_CODESHELL: return { LLM_TENSOR_TOKEN_EMBD, @@ -1729,38 +1704,6 @@ static std::set llm_get_tensor_names(llm_arch arch) { LLM_TENSOR_FFN_UP, LLM_TENSOR_FFN_POST_NORM, }; - case LLM_ARCH_EXAONE_MOE: - return { - LLM_TENSOR_TOKEN_EMBD, - LLM_TENSOR_OUTPUT_NORM, - LLM_TENSOR_OUTPUT, - LLM_TENSOR_ROPE_FREQS, - LLM_TENSOR_ATTN_NORM, - LLM_TENSOR_ATTN_Q, - LLM_TENSOR_ATTN_Q_NORM, - LLM_TENSOR_ATTN_K, - LLM_TENSOR_ATTN_K_NORM, - LLM_TENSOR_ATTN_V, - LLM_TENSOR_ATTN_OUT, - LLM_TENSOR_FFN_NORM, - LLM_TENSOR_FFN_GATE, - LLM_TENSOR_FFN_DOWN, - LLM_TENSOR_FFN_UP, - LLM_TENSOR_FFN_GATE_INP, - LLM_TENSOR_FFN_GATE_EXPS, - LLM_TENSOR_FFN_DOWN_EXPS, - LLM_TENSOR_FFN_UP_EXPS, - LLM_TENSOR_FFN_GATE_SHEXP, - LLM_TENSOR_FFN_UP_SHEXP, - LLM_TENSOR_FFN_DOWN_SHEXP, - LLM_TENSOR_FFN_EXP_PROBS_B, - LLM_TENSOR_NEXTN_EH_PROJ, - LLM_TENSOR_NEXTN_EMBED_TOKENS, - LLM_TENSOR_NEXTN_ENORM, - LLM_TENSOR_NEXTN_HNORM, - LLM_TENSOR_NEXTN_SHARED_HEAD_HEAD, - LLM_TENSOR_NEXTN_SHARED_HEAD_NORM, - }; case LLM_ARCH_RWKV6: return { LLM_TENSOR_TOKEN_EMBD, @@ -2111,7 +2054,6 @@ static std::set llm_get_tensor_names(llm_arch arch) { LLM_TENSOR_TOKEN_EMBD, LLM_TENSOR_OUTPUT_NORM_LFM2, LLM_TENSOR_OUTPUT, - LLM_TENSOR_DENSE_2_OUT, }; case LLM_ARCH_LFM2MOE: return { @@ -2246,49 +2188,11 @@ static std::set llm_get_tensor_names(llm_arch arch) { LLM_TENSOR_VISEXP_FFN_DOWN, LLM_TENSOR_VISEXP_FFN_UP, }; - case LLM_ARCH_MIMO2: - return { - LLM_TENSOR_TOKEN_EMBD, - LLM_TENSOR_OUTPUT_NORM, - LLM_TENSOR_OUTPUT, - LLM_TENSOR_ATTN_NORM, - LLM_TENSOR_ATTN_Q, - LLM_TENSOR_ATTN_K, - LLM_TENSOR_ATTN_V, - LLM_TENSOR_ATTN_SINKS, - LLM_TENSOR_ATTN_OUT, - LLM_TENSOR_FFN_NORM, - LLM_TENSOR_FFN_GATE, - LLM_TENSOR_FFN_DOWN, - LLM_TENSOR_FFN_UP, - LLM_TENSOR_FFN_GATE_INP, - LLM_TENSOR_FFN_GATE_EXPS, - LLM_TENSOR_FFN_DOWN_EXPS, - LLM_TENSOR_FFN_UP_EXPS, - LLM_TENSOR_FFN_EXP_PROBS_B, - }; case LLM_ARCH_GPTJ: case LLM_ARCH_UNKNOWN: return { LLM_TENSOR_TOKEN_EMBD, }; - case LLM_ARCH_MAINCODER: - return { - LLM_TENSOR_TOKEN_EMBD, - LLM_TENSOR_OUTPUT_NORM, - LLM_TENSOR_OUTPUT, - LLM_TENSOR_ATTN_NORM, - LLM_TENSOR_ATTN_Q, - LLM_TENSOR_ATTN_Q_NORM, - LLM_TENSOR_ATTN_K, - LLM_TENSOR_ATTN_K_NORM, - LLM_TENSOR_ATTN_V, - LLM_TENSOR_ATTN_OUT, - LLM_TENSOR_FFN_NORM, - LLM_TENSOR_FFN_GATE, - LLM_TENSOR_FFN_DOWN, - LLM_TENSOR_FFN_UP, - }; default: GGML_ABORT("unknown architecture for tensor mapping"); } diff --git a/src/llama-arch.h b/src/llama-arch.h index 270d28b..a53bc39 100644 --- a/src/llama-arch.h +++ b/src/llama-arch.h @@ -46,7 +46,6 @@ enum llm_arch { LLM_ARCH_PHIMOE, LLM_ARCH_PLAMO, LLM_ARCH_PLAMO2, - LLM_ARCH_PLAMO3, LLM_ARCH_CODESHELL, LLM_ARCH_ORION, LLM_ARCH_INTERNLM2, @@ -85,7 +84,6 @@ enum llm_arch { LLM_ARCH_NEMOTRON_H_MOE, LLM_ARCH_EXAONE, LLM_ARCH_EXAONE4, - LLM_ARCH_EXAONE_MOE, LLM_ARCH_RWKV6, LLM_ARCH_RWKV6QWEN2, LLM_ARCH_RWKV7, @@ -121,9 +119,6 @@ enum llm_arch { LLM_ARCH_RND1, LLM_ARCH_PANGU_EMBED, LLM_ARCH_MISTRAL3, - LLM_ARCH_MIMO2, - LLM_ARCH_LLAMA_EMBED, - LLM_ARCH_MAINCODER, LLM_ARCH_UNKNOWN, }; @@ -157,7 +152,6 @@ enum llm_kv { LLM_KV_VOCAB_SIZE, LLM_KV_CONTEXT_LENGTH, LLM_KV_EMBEDDING_LENGTH, - LLM_KV_EMBEDDING_LENGTH_OUT, LLM_KV_FEATURES_LENGTH, LLM_KV_BLOCK_COUNT, LLM_KV_LEADING_DENSE_BLOCK_COUNT, diff --git a/src/llama-chat.cpp b/src/llama-chat.cpp index 3c7e0af..fc6a622 100644 --- a/src/llama-chat.cpp +++ b/src/llama-chat.cpp @@ -57,7 +57,6 @@ static const std::map LLM_CHAT_TEMPLATES = { { "minicpm", LLM_CHAT_TEMPLATE_MINICPM }, { "exaone3", LLM_CHAT_TEMPLATE_EXAONE_3 }, { "exaone4", LLM_CHAT_TEMPLATE_EXAONE_4 }, - { "exaone-moe", LLM_CHAT_TEMPLATE_EXAONE_MOE }, { "rwkv-world", LLM_CHAT_TEMPLATE_RWKV_WORLD }, { "granite", LLM_CHAT_TEMPLATE_GRANITE }, { "gigachat", LLM_CHAT_TEMPLATE_GIGACHAT }, @@ -75,7 +74,6 @@ static const std::map LLM_CHAT_TEMPLATES = { { "seed_oss", LLM_CHAT_TEMPLATE_SEED_OSS }, { "grok-2", LLM_CHAT_TEMPLATE_GROK_2 }, { "pangu-embedded", LLM_CHAT_TEMPLATE_PANGU_EMBED }, - { "solar-open", LLM_CHAT_TEMPLATE_SOLAR_OPEN }, }; llm_chat_template llm_chat_template_from_str(const std::string & name) { @@ -138,9 +136,6 @@ llm_chat_template llm_chat_detect_template(const std::string & tmpl) { } else if (tmpl_contains("[gMASK]")) { return LLM_CHAT_TEMPLATE_CHATGLM_4; } else if (tmpl_contains("<|assistant|>") && tmpl_contains("<|user|>")) { - if (tmpl_contains("<|tool_declare|>")) { - return LLM_CHAT_TEMPLATE_EXAONE_MOE; - } return tmpl_contains("") ? LLM_CHAT_TEMPLATE_FALCON_3 : LLM_CHAT_TEMPLATE_GLMEDGE; } else if (tmpl_contains("<|{{ item['role'] }}|>") && tmpl_contains("<|begin_of_image|>")) { return LLM_CHAT_TEMPLATE_GLMEDGE; @@ -221,8 +216,6 @@ llm_chat_template llm_chat_detect_template(const std::string & tmpl) { return LLM_CHAT_TEMPLATE_GROK_2; } else if (tmpl_contains(LU8("[unused9]系统:[unused10]"))) { return LLM_CHAT_TEMPLATE_PANGU_EMBED; - } else if (tmpl_contains("<|begin|>") && tmpl_contains("<|end|>") && tmpl_contains("<|content|>")) { - return LLM_CHAT_TEMPLATE_SOLAR_OPEN; } return LLM_CHAT_TEMPLATE_UNKNOWN; } @@ -580,22 +573,6 @@ int32_t llm_chat_apply_template( if (add_ass) { ss << "[|assistant|]"; } - } else if (tmpl == LLM_CHAT_TEMPLATE_EXAONE_MOE) { - for (auto message : chat) { - std::string role(message->role); - if (role == "system") { - ss << "<|system|>\n" << trim(message->content) << "<|endofturn|>\n"; - } else if (role == "user") { - ss << "<|user|>\n" << trim(message->content) << "<|endofturn|>\n"; - } else if (role == "assistant") { - ss << "<|assistant|>\n" << trim(message->content) << "<|endofturn|>\n"; - } else if (role == "tool") { - ss << "<|tool|>\n" << trim(message->content) << "<|endofturn|>\n"; - } - } - if (add_ass) { - ss << "<|assistant|>\n"; - } } else if (tmpl == LLM_CHAT_TEMPLATE_RWKV_WORLD) { // this template requires the model to have "\n\n" as EOT token for (size_t i = 0; i < chat.size(); i++) { @@ -868,14 +845,6 @@ int32_t llm_chat_apply_template( if (add_ass) { ss << "[unused9]助手:"; } - } else if (tmpl == LLM_CHAT_TEMPLATE_SOLAR_OPEN) { - for (auto message : chat) { - std::string role(message->role); - ss << "<|begin|>" << role << "<|content|>" << message->content << "<|end|>"; - } - if (add_ass) { - ss << "<|begin|>assistant"; - } } else { // template not supported return -1; diff --git a/src/llama-chat.h b/src/llama-chat.h index 9ed1db1..684efb4 100644 --- a/src/llama-chat.h +++ b/src/llama-chat.h @@ -36,7 +36,6 @@ enum llm_chat_template { LLM_CHAT_TEMPLATE_MINICPM, LLM_CHAT_TEMPLATE_EXAONE_3, LLM_CHAT_TEMPLATE_EXAONE_4, - LLM_CHAT_TEMPLATE_EXAONE_MOE, LLM_CHAT_TEMPLATE_RWKV_WORLD, LLM_CHAT_TEMPLATE_GRANITE, LLM_CHAT_TEMPLATE_GIGACHAT, @@ -55,7 +54,6 @@ enum llm_chat_template { LLM_CHAT_TEMPLATE_SEED_OSS, LLM_CHAT_TEMPLATE_GROK_2, LLM_CHAT_TEMPLATE_PANGU_EMBED, - LLM_CHAT_TEMPLATE_SOLAR_OPEN, LLM_CHAT_TEMPLATE_UNKNOWN, }; diff --git a/src/llama-context.cpp b/src/llama-context.cpp index a6d5ddf..015ebae 100644 --- a/src/llama-context.cpp +++ b/src/llama-context.cpp @@ -60,25 +60,6 @@ llama_context::llama_context( cparams.cb_eval = params.cb_eval; cparams.cb_eval_user_data = params.cb_eval_user_data; - // Initialize backend samplers here so they are part of the sampling graph - // before the reserve passes run later in this function. This avoids a later - // re-reserve when graph nodes change. - if (params.samplers != nullptr && params.n_samplers > 0) { - for (size_t i = 0; i < params.n_samplers; ++i) { - const auto & config = params.samplers[i]; - - if (llama_sampler_chain_get(config.sampler, -1) == nullptr) { - throw std::runtime_error("the backend samplers must be of type llama_sampler_chain"); - } - - if (set_sampler(config.seq_id, config.sampler)) { - const int n_samplers = llama_sampler_chain_n(config.sampler); - - LLAMA_LOG_INFO("%s: setting backend sampler for seq_id %d (n = %d)\n", __func__, config.seq_id, n_samplers); - } - } - } - auto rope_scaling_type = params.rope_scaling_type; if (rope_scaling_type == LLAMA_ROPE_SCALING_TYPE_UNSPECIFIED) { rope_scaling_type = hparams.rope_scaling_type_train; @@ -146,7 +127,6 @@ llama_context::llama_context( } cparams.flash_attn = params.flash_attn_type != LLAMA_FLASH_ATTN_TYPE_DISABLED; - cparams.auto_fa = params.flash_attn_type == LLAMA_FLASH_ATTN_TYPE_AUTO; // with causal attention, the batch size is limited by the context size cparams.n_batch = cparams.causal_attn ? std::min(cparams.n_ctx, params.n_batch) : params.n_batch; @@ -156,9 +136,6 @@ llama_context::llama_context( cparams.op_offload = params.op_offload; cparams.kv_unified = params.kv_unified; - // intialized later - cparams.pipeline_parallel = false; - { const char * LLAMA_GRAPH_REUSE_DISABLE = getenv("LLAMA_GRAPH_REUSE_DISABLE"); graph_reuse_disable = LLAMA_GRAPH_REUSE_DISABLE ? (atoi(LLAMA_GRAPH_REUSE_DISABLE) != 0) : graph_reuse_disable; @@ -254,10 +231,7 @@ llama_context::llama_context( // graph outputs buffer { // resized during inference when a batch uses more outputs - // Create a dummy batch for initialization. - llama_batch dummy_batch = {}; - dummy_batch.n_tokens = 0; - if (output_reserve(params.n_seq_max, dummy_batch) < params.n_seq_max) { + if (output_reserve(params.n_seq_max) < params.n_seq_max) { throw std::runtime_error("failed to reserve initial output buffer"); } @@ -306,12 +280,22 @@ llama_context::llama_context( LLAMA_LOG_DEBUG("%s: backend_ptrs.size() = %zu\n", __func__, backend_ptrs.size()); + const uint32_t n_seqs = cparams.n_seq_max; + const uint32_t n_tokens = std::min(cparams.n_ctx, cparams.n_ubatch); + + const size_t max_nodes = this->graph_max_nodes(n_tokens); + + LLAMA_LOG_DEBUG("%s: max_nodes = %zu\n", __func__, max_nodes); + + gf_res_prev.reset(new llm_graph_result(max_nodes)); + gf_res_reserve.reset(new llm_graph_result(max_nodes)); + // TODO: move these checks to ggml_backend_sched // enabling pipeline parallelism in the scheduler increases memory usage, so it is only done when necessary bool pipeline_parallel = model.n_devices() > 1 && - model.n_gpu_layers() > model.hparams.n_layer && - model.split_mode() == LLAMA_SPLIT_MODE_LAYER && + model.params.n_gpu_layers > (int) model.hparams.n_layer && + model.params.split_mode == LLAMA_SPLIT_MODE_LAYER && cparams.offload_kqv && !model.has_tensor_overrides(); @@ -334,28 +318,142 @@ llama_context::llama_context( } } - cparams.pipeline_parallel = pipeline_parallel; + sched.reset(ggml_backend_sched_new(backend_ptrs.data(), backend_buft.data(), backend_ptrs.size(), max_nodes, pipeline_parallel, cparams.op_offload)); - if (cparams.pipeline_parallel) { - LLAMA_LOG_INFO("%s: pipeline parallelism enabled\n", __func__); + if (pipeline_parallel) { + LLAMA_LOG_INFO("%s: pipeline parallelism enabled (n_copies=%d)\n", __func__, ggml_backend_sched_get_n_copies(sched.get())); } - sched_reserve(); - - if (!cparams.flash_attn) { - if (ggml_is_quantized(params.type_v)) { - throw std::runtime_error("quantized V cache was requested, but this requires Flash Attention"); + llama_memory_context_ptr mctx; + if (memory) { + LLAMA_LOG_DEBUG("%s: reserving full memory module\n", __func__); + mctx = memory->init_full(); + if (!mctx) { + throw std::runtime_error("failed to initialize memory module"); } } - } - // Initialize the full vocabulary token ids for backend samplers. - { - const int n_vocab = model.vocab.n_tokens(); + cross.v_embd.clear(); - sampling.token_ids_full_vocab.resize(n_vocab); - for (int i = 0; i < n_vocab; ++i) { - sampling.token_ids_full_vocab[i] = i; + // avoid reserving graphs with zero outputs - assume one output per sequence + n_outputs = n_seqs; + + LLAMA_LOG_DEBUG("%s: worst-case: n_tokens = %d, n_seqs = %d, n_outputs = %d\n", __func__, n_tokens, n_seqs, n_outputs); + + // resolve automatic Flash Attention use + if (params.flash_attn_type == LLAMA_FLASH_ATTN_TYPE_AUTO) { + auto * gf = graph_reserve(1, n_seqs, n_outputs, mctx.get(), true); + if (!gf) { + throw std::runtime_error("failed to split graph for Flash Attention check"); + } + + const size_t prefix_len = strlen(LLAMA_TENSOR_NAME_FATTN) + 1; + bool fa_device_mismatch = false; + for (int i = 0; i < ggml_graph_n_nodes(gf); i++) { + ggml_tensor * n = ggml_graph_node(gf, i); + if (n->op != GGML_OP_FLASH_ATTN_EXT) { + continue; + } + ggml_backend_dev_t device_fa = ggml_backend_get_device( + ggml_backend_sched_get_tensor_backend(sched.get(), n)); + + // TODO: instead of the tensor names, use a map to keep track of which (FA) tensors belong to which layer + GGML_ASSERT(strncmp(n->name, LLAMA_TENSOR_NAME_FATTN "-", prefix_len) == 0); + const int il = std::stoi(n->name + prefix_len); + ggml_backend_dev_t device_kv = model.dev_layer(il); + if (device_fa != device_kv) { + LLAMA_LOG_WARN("%s: layer %d is assigned to device %s but the Flash Attention tensor " + "is assigned to device %s (usually due to missing support)\n", + __func__, il, ggml_backend_dev_name(device_kv), ggml_backend_dev_name(device_fa)); + // FIXME: fa_device_mismatch logic is wrong for --no-kv-offload, but this is broken anyways + fa_device_mismatch = true; + break; + } + } + if (fa_device_mismatch) { + cparams.flash_attn = false; + LLAMA_LOG_WARN("%s: Flash Attention was auto, set to disabled\n", __func__); + if (ggml_is_quantized(params.type_v)) { + throw std::runtime_error("quantized V cache was requested, but this requires Flash Attention"); + } + } else { + cparams.flash_attn = true; + LLAMA_LOG_INFO("%s: Flash Attention was auto, set to enabled\n", __func__); + } + } + + // reserve worst-case graph + int n_splits_pp = -1; + int n_nodes_pp = -1; + + int n_splits_tg = -1; + int n_nodes_tg = -1; + + // reserve pp (prompt processing) graph first so that buffers are only allocated once + { + auto * gf = graph_reserve(n_tokens, n_seqs, n_tokens, mctx.get(), + model.hparams.no_alloc, model.hparams.no_alloc ? backend_buf_exp_size.data() : nullptr); + if (!gf) { + if (pipeline_parallel) { + LLAMA_LOG_WARN("%s: compute buffer allocation failed, retrying without pipeline parallelism\n", __func__); + sched.reset(ggml_backend_sched_new(backend_ptrs.data(), backend_buft.data(), backend_ptrs.size(), max_nodes, false, cparams.op_offload)); + gf = graph_reserve(n_tokens, n_seqs, n_tokens, mctx.get()); + } + if (!gf) { + throw std::runtime_error("failed to allocate compute pp buffers"); + } + } + + n_splits_pp = ggml_backend_sched_get_n_splits(sched.get()); + n_nodes_pp = ggml_graph_n_nodes(gf); + } + + // reserve with tg (token generation) graph to get the number of splits and nodes + { + auto * gf = graph_reserve(n_seqs, n_seqs, n_seqs, mctx.get(), model.hparams.no_alloc); + if (!gf) { + throw std::runtime_error("failed to allocate compute tg buffers"); + } + + n_splits_tg = ggml_backend_sched_get_n_splits(sched.get()); + n_nodes_tg = ggml_graph_n_nodes(gf); + } + + // reserve again with pp graph to avoid ggml-alloc reallocations during inference + { + // TODO: not sure if the following graph would be worster case for multi-stream KV caches: + // + // auto * gf = graph_reserve(n_tokens, 1, n_tokens, mctx.get()); + // + auto * gf = graph_reserve(n_tokens, n_seqs, n_tokens, mctx.get(), model.hparams.no_alloc); + if (!gf) { + throw std::runtime_error("failed to allocate compute pp buffers"); + } + } + + for (size_t i = 0; i < backend_ptrs.size(); ++i) { + ggml_backend_t backend = backend_ptrs[i]; + ggml_backend_buffer_type_t buft = backend_buft[i]; + if (!model.hparams.no_alloc) { + backend_buf_exp_size[i] = ggml_backend_sched_get_buffer_size(sched.get(), backend); + } + if (backend_buf_exp_size[i] > 1) { + LLAMA_LOG_INFO("%s: %10s compute buffer size = %8.2f MiB\n", __func__, + ggml_backend_buft_name(buft), + backend_buf_exp_size[i] / 1024.0 / 1024.0); + } + } + + if (n_nodes_pp == n_nodes_tg) { + LLAMA_LOG_INFO("%s: graph nodes = %d\n", __func__, n_nodes_pp); + } else { + LLAMA_LOG_INFO("%s: graph nodes = %d (with bs=%d), %d (with bs=1)\n", __func__, n_nodes_pp, n_tokens, n_nodes_tg); + } + + if (n_splits_pp == n_splits_tg) { + LLAMA_LOG_INFO("%s: graph splits = %d\n", __func__, n_splits_pp); + } else { + LLAMA_LOG_INFO("%s: graph splits = %d (with bs=%d), %d (with bs=1)\n", __func__, n_splits_pp, n_tokens, n_splits_tg); } } } @@ -380,172 +478,7 @@ llama_context::~llama_context() { ggml_opt_free(opt_ctx); } -void llama_context::sched_reserve() { - if (!sched_need_reserve) { - return; - } - - sched_need_reserve = false; - - LLAMA_LOG_INFO("%s: reserving ...\n", __func__); - - synchronize(); - - const int64_t t_start_us = ggml_time_us(); - - const uint32_t n_seqs = cparams.n_seq_max; - const uint32_t n_tokens = std::min(cparams.n_ctx, cparams.n_ubatch); - - const size_t max_nodes = this->graph_max_nodes(n_tokens); - - LLAMA_LOG_DEBUG("%s: max_nodes = %zu\n", __func__, max_nodes); - - gf_res_prev.reset(new llm_graph_result(max_nodes)); - gf_res_reserve.reset(new llm_graph_result(max_nodes)); - - sched.reset(ggml_backend_sched_new(backend_ptrs.data(), backend_buft.data(), backend_ptrs.size(), max_nodes, cparams.pipeline_parallel, cparams.op_offload)); - - llama_memory_context_ptr mctx; - if (memory) { - LLAMA_LOG_DEBUG("%s: reserving full memory module\n", __func__); - mctx = memory->init_full(); - if (!mctx) { - throw std::runtime_error("failed to initialize memory module"); - } - } - - // avoid reserving graphs with zero outputs - assume one output per sequence - const int n_outputs = n_seqs; - - LLAMA_LOG_DEBUG("%s: worst-case: n_tokens = %d, n_seqs = %d, n_outputs = %d\n", __func__, n_tokens, n_seqs, n_outputs); - - // resolve automatic Flash Attention use - if (cparams.auto_fa) { - auto * gf = graph_reserve(1, n_seqs, n_outputs, mctx.get(), true); - if (!gf) { - throw std::runtime_error("failed to split graph for Flash Attention check"); - } - - const size_t prefix_len = strlen(LLAMA_TENSOR_NAME_FATTN) + 1; - bool fa_device_mismatch = false; - for (int i = 0; i < ggml_graph_n_nodes(gf); i++) { - ggml_tensor * n = ggml_graph_node(gf, i); - if (n->op != GGML_OP_FLASH_ATTN_EXT) { - continue; - } - ggml_backend_dev_t device_fa = ggml_backend_get_device( - ggml_backend_sched_get_tensor_backend(sched.get(), n)); - - // TODO: instead of the tensor names, use a map to keep track of which (FA) tensors belong to which layer - GGML_ASSERT(strncmp(n->name, LLAMA_TENSOR_NAME_FATTN "-", prefix_len) == 0); - const int il = std::stoi(n->name + prefix_len); - ggml_backend_dev_t device_kv = model.dev_layer(il); - if (device_fa != device_kv) { - LLAMA_LOG_WARN("%s: layer %d is assigned to device %s but the Flash Attention tensor " - "is assigned to device %s (usually due to missing support)\n", - __func__, il, ggml_backend_dev_name(device_kv), ggml_backend_dev_name(device_fa)); - // FIXME: fa_device_mismatch logic is wrong for --no-kv-offload, but this is broken anyways - fa_device_mismatch = true; - break; - } - } - if (fa_device_mismatch) { - cparams.flash_attn = false; - LLAMA_LOG_WARN("%s: Flash Attention was auto, set to disabled\n", __func__); - } else { - cparams.flash_attn = true; - LLAMA_LOG_INFO("%s: Flash Attention was auto, set to enabled\n", __func__); - } - - cparams.auto_fa = false; - } - - // reserve worst-case graph - int n_splits_pp = -1; - int n_nodes_pp = -1; - - int n_splits_tg = -1; - int n_nodes_tg = -1; - - // reserve pp (prompt processing) graph first so that buffers are only allocated once - { - auto * gf = graph_reserve(n_tokens, n_seqs, n_tokens, mctx.get(), - model.hparams.no_alloc, model.hparams.no_alloc ? backend_buf_exp_size.data() : nullptr); - if (!gf) { - if (cparams.pipeline_parallel) { - LLAMA_LOG_WARN("%s: compute buffer allocation failed, retrying without pipeline parallelism\n", __func__); - cparams.pipeline_parallel = false; - sched.reset(ggml_backend_sched_new(backend_ptrs.data(), backend_buft.data(), backend_ptrs.size(), max_nodes, false, cparams.op_offload)); - gf = graph_reserve(n_tokens, n_seqs, n_tokens, mctx.get()); - } - if (!gf) { - throw std::runtime_error("failed to allocate compute pp buffers"); - } - } - - n_splits_pp = ggml_backend_sched_get_n_splits(sched.get()); - n_nodes_pp = ggml_graph_n_nodes(gf); - } - - // reserve with tg (token generation) graph to get the number of splits and nodes - { - auto * gf = graph_reserve(n_seqs, n_seqs, n_seqs, mctx.get(), model.hparams.no_alloc); - if (!gf) { - throw std::runtime_error("failed to allocate compute tg buffers"); - } - - n_splits_tg = ggml_backend_sched_get_n_splits(sched.get()); - n_nodes_tg = ggml_graph_n_nodes(gf); - } - - // reserve again with pp graph to avoid ggml-alloc reallocations during inference - { - // TODO: not sure if the following graph would be worster case for multi-stream KV caches: - // - // auto * gf = graph_reserve(n_tokens, 1, n_tokens, mctx.get()); - // - auto * gf = graph_reserve(n_tokens, n_seqs, n_tokens, mctx.get(), model.hparams.no_alloc); - if (!gf) { - throw std::runtime_error("failed to allocate compute pp buffers"); - } - } - - for (size_t i = 0; i < backend_ptrs.size(); ++i) { - ggml_backend_t backend = backend_ptrs[i]; - ggml_backend_buffer_type_t buft = backend_buft[i]; - if (!model.hparams.no_alloc) { - backend_buf_exp_size[i] = ggml_backend_sched_get_buffer_size(sched.get(), backend); - } - if (backend_buf_exp_size[i] > 1) { - LLAMA_LOG_INFO("%s: %10s compute buffer size = %8.2f MiB\n", __func__, - ggml_backend_buft_name(buft), - backend_buf_exp_size[i] / 1024.0 / 1024.0); - } - } - - if (n_nodes_pp == n_nodes_tg) { - LLAMA_LOG_INFO("%s: graph nodes = %d\n", __func__, n_nodes_pp); - } else { - LLAMA_LOG_INFO("%s: graph nodes = %d (with bs=%d), %d (with bs=1)\n", __func__, n_nodes_pp, n_tokens, n_nodes_tg); - } - - if (n_splits_pp == n_splits_tg) { - LLAMA_LOG_INFO("%s: graph splits = %d\n", __func__, n_splits_pp); - } else { - LLAMA_LOG_INFO("%s: graph splits = %d (with bs=%d), %d (with bs=1)\n", __func__, n_splits_pp, n_tokens, n_splits_tg); - } - - const int64_t t_end_us = ggml_time_us(); - - LLAMA_LOG_INFO("%s: reserve took %.2f ms, sched copies = %d\n", - __func__, (t_end_us - t_start_us)/1000.0, ggml_backend_sched_get_n_copies(sched.get())); -} - void llama_context::synchronize() { - if (!sched) { - return; - } - ggml_backend_sched_synchronize(sched.get()); // FIXME: if multiple single tokens are evaluated without a synchronization, @@ -683,35 +616,6 @@ float * llama_context::get_logits() { return logits; } -int64_t llama_context::output_resolve_row(int32_t i) const { - int64_t j = -1; - - // support negative indices (last output row) - if (i < 0) { - j = n_outputs + i; - if (j < 0) { - throw std::runtime_error(format("negative index out of range [0, %d)", n_outputs)); - } - } else if ((size_t) i >= output_ids.size()) { - throw std::runtime_error(format("out of range [0, %zu)", output_ids.size())); - } else { - // use output_ids to translate the batch token index into a row number - // that holds this token's data. - j = output_ids[i]; - } - - if (j < 0) { - // the batch token was not configured to output anything - throw std::runtime_error(format("batch.logits[%d] != true", i)); - } - - if (j >= n_outputs) { - throw std::runtime_error(format("corrupt output buffer (j=%" PRId64 ", n_outputs=%d)", j, n_outputs)); - } - - return j; -} - float * llama_context::get_logits_ith(int32_t i) { int64_t j = -1; @@ -722,7 +626,6 @@ float * llama_context::get_logits_ith(int32_t i) { throw std::runtime_error("no logits"); } - // TODO: use output_resolve_row() if (i < 0) { j = n_outputs + i; if (j < 0) { @@ -759,10 +662,6 @@ float * llama_context::get_embeddings() { return embd; } -llama_token * llama_context::get_sampled_tokens() const{ - return sampling.sampled; -} - float * llama_context::get_embeddings_ith(int32_t i) { int64_t j = -1; @@ -773,7 +672,6 @@ float * llama_context::get_embeddings_ith(int32_t i) { throw std::runtime_error("no embeddings"); } - // TODO: use output_resolve_row() if (i < 0) { j = n_outputs + i; if (j < 0) { @@ -793,8 +691,7 @@ float * llama_context::get_embeddings_ith(int32_t i) { throw std::runtime_error(format("corrupt output buffer (j=%" PRId64 ", n_outputs=%d)", j, n_outputs)); } - const uint32_t n_embd_out = model.hparams.get_n_embd_out(); - return embd + j*n_embd_out; + return embd + j*model.hparams.n_embd; } catch (const std::exception & err) { LLAMA_LOG_ERROR("%s: invalid embeddings id %d, reason: %s\n", __func__, i, err.what()); #ifndef NDEBUG @@ -814,136 +711,6 @@ float * llama_context::get_embeddings_seq(llama_seq_id seq_id) { return it->second.data(); } -llama_token llama_context::get_sampled_token_ith(int32_t idx) { - output_reorder(); - - if (sampling.sampled == nullptr) { - return LLAMA_TOKEN_NULL; - } - - try { - const int64_t row = output_resolve_row(idx); - GGML_ASSERT(row < (int64_t) sampling.sampled_size); - return sampling.sampled[row]; - } catch (const std::exception & err) { - LLAMA_LOG_ERROR("%s: invalid backend sampled token id %d, reason: %s\n", __func__, idx, err.what()); - return LLAMA_TOKEN_NULL; - } -} - -float * llama_context::get_sampled_probs_ith(int32_t idx) { - output_reorder(); - - if (sampling.probs == nullptr) { - return nullptr; - } - - try { - const int64_t row = output_resolve_row(idx); - if ((size_t) row >= sampling.probs_count.size() || sampling.probs_count[row] == 0) { - return nullptr; - } - return sampling.probs + row*model.vocab.n_tokens(); - } catch (const std::exception & err) { - LLAMA_LOG_ERROR("%s: invalid backend sampled probs id %d, reason: %s\n", __func__, idx, err.what()); - return nullptr; - } -} - -float * llama_context::get_sampled_logits_ith(int32_t idx) { - output_reorder(); - - if (sampling.logits == nullptr) { - return nullptr; - } - - try { - const int64_t row = output_resolve_row(idx); - if ((size_t) row >= sampling.logits_count.size() || sampling.logits_count[row] == 0) { - return nullptr; - } - return sampling.logits + row*model.vocab.n_tokens(); - } catch (const std::exception & err) { - LLAMA_LOG_ERROR("%s: invalid backend sampled logits id %d, reason: %s\n", __func__, idx, err.what()); - return nullptr; - } -} - -const llama_token * llama_context::get_sampled_candidates_ith(int32_t idx) { - output_reorder(); - - try { - const int64_t row = output_resolve_row(idx); - if (sampling.candidates != nullptr && - (size_t) row < sampling.candidates_count.size() && - sampling.candidates_count[row] > 0) { - return sampling.candidates + row*model.vocab.n_tokens(); - } - } catch (const std::exception & err) { - // fallback to full vocab list - } - - return sampling.token_ids_full_vocab.data(); -} - -size_t llama_context::get_sampled_candidates_count(int32_t idx) { - output_reorder(); - - if (sampling.candidates == nullptr) { - return 0; - } - - try { - const int64_t row = output_resolve_row(idx); - if ((size_t) row >= sampling.candidates_count.size()) { - return 0; - } - return sampling.candidates_count[row]; - } catch (const std::exception & err) { - LLAMA_LOG_ERROR("%s: invalid backend sampled candidates count id %d, reason: %s\n", __func__, idx, err.what()); - return 0; - } -} - -size_t llama_context::get_sampled_logits_count(int32_t idx) { - output_reorder(); - - if (sampling.logits == nullptr) { - return model.vocab.n_tokens(); - } - - try { - const int64_t row = output_resolve_row(idx); - if ((size_t) row >= sampling.logits_count.size()) { - return 0; - } - return sampling.logits_count[row]; - } catch (const std::exception & err) { - LLAMA_LOG_ERROR("%s: invalid backend sampled logits count id %d, reason: %s\n", __func__, idx, err.what()); - return 0; - } -} - -size_t llama_context::get_sampled_probs_count(int32_t idx) { - output_reorder(); - - if (sampling.probs == nullptr) { - return 0; - } - - try { - const int64_t row = output_resolve_row(idx); - if ((size_t) row >= sampling.probs_count.size()) { - return 0; - } - return sampling.probs_count[row]; - } catch (const std::exception & err) { - LLAMA_LOG_ERROR("%s: invalid backend sampled probs count id %d, reason: %s\n", __func__, idx, err.what()); - return 0; - } -} - - void llama_context::attach_threadpool( ggml_threadpool_t threadpool, ggml_threadpool_t threadpool_batch) { @@ -986,82 +753,18 @@ void llama_context::set_embeddings(bool value) { LLAMA_LOG_DEBUG("%s: value = %d\n", __func__, value); cparams.embeddings = value; - - // TODO: not sure yet if we want to reserve here - //sched_need_reserve = true; } void llama_context::set_causal_attn(bool value) { LLAMA_LOG_DEBUG("%s: value = %d\n", __func__, value); - if (cparams.causal_attn == value) { - return; - } - cparams.causal_attn = value; - - sched_need_reserve = true; } void llama_context::set_warmup(bool value) { LLAMA_LOG_DEBUG("%s: value = %d\n", __func__, value); - if (cparams.warmup == value) { - return; - } - cparams.warmup = value; - - // warmups are usually with small batches, so no need to reserve - //sched_need_reserve = true; -} - -bool llama_context::set_sampler(llama_seq_id seq_id, llama_sampler * sampler) { - if (!sampler && sampling.samplers.count(seq_id) == 0) { - return true; - } - - LLAMA_LOG_DEBUG("%s: seq_id = %d, sampler = %p\n", __func__, (int) seq_id, (void *) sampler); - - const bool can_offload = - sampler && - sampler->iface->backend_init && - sampler->iface->backend_apply && - llama_sampler_chain_n(sampler) > 0; - - if (sampler && can_offload) { - ggml_backend_buffer_type_t buft = ggml_backend_dev_buffer_type(model.dev_output()); - auto * host_buft = ggml_backend_dev_host_buffer_type(model.dev_output()); - if (host_buft) { - buft = host_buft; - } - - sampler->iface->backend_init(sampler, buft); - - sampling.samplers[seq_id] = sampler; - - sched_need_reserve = true; - - return true; - } - - if (sampler && !can_offload) { - LLAMA_LOG_WARN("%s: sampler '%s' for seq_id = %d, cannot be offloaded to the backend\n", __func__, llama_sampler_name(sampler), seq_id); - - if (sampling.samplers.count(seq_id) > 0) { - sched_need_reserve = true; - } - - sampling.samplers.erase(seq_id); - - return false; - } - - sampling.samplers.erase(seq_id); - - sched_need_reserve = true; - - return true; } void llama_context::set_adapter_lora( @@ -1069,27 +772,16 @@ void llama_context::set_adapter_lora( float scale) { LLAMA_LOG_DEBUG("%s: adapter = %p, scale = %f\n", __func__, (void *) adapter, scale); - if (auto it = loras.find(adapter); it != loras.end()) { - if (it->second == scale) { - return; - } - } - loras[adapter] = scale; - - sched_need_reserve = true; } bool llama_context::rm_adapter_lora( llama_adapter_lora * adapter) { LLAMA_LOG_DEBUG("%s: adapter = %p\n", __func__, (void *) adapter); - auto it = loras.find(adapter); - if (it != loras.end()) { - loras.erase(it); - - sched_need_reserve = true; - + auto pos = loras.find(adapter); + if (pos != loras.end()) { + loras.erase(pos); return true; } @@ -1099,13 +791,7 @@ bool llama_context::rm_adapter_lora( void llama_context::clear_adapter_lora() { LLAMA_LOG_DEBUG("%s: call\n", __func__); - if (loras.empty()) { - return; - } - loras.clear(); - - sched_need_reserve = true; } bool llama_context::apply_adapter_cvec( @@ -1116,8 +802,6 @@ bool llama_context::apply_adapter_cvec( int32_t il_end) { LLAMA_LOG_DEBUG("%s: il_start = %d, il_end = %d\n", __func__, il_start, il_end); - // TODO: should we reserve? - return cvec.apply(model, data, len, n_embd, il_start, il_end); } @@ -1220,12 +904,10 @@ int llama_context::encode(const llama_batch & batch_inp) { // TODO: this clear of the buffer can easily be forgotten - need something better embd_seq.clear(); - sched_reserve(); - n_queued_tokens += n_tokens; // reserve output buffer - if (output_reserve(n_tokens, batch_inp) < n_tokens) { + if (output_reserve(n_tokens) < n_tokens) { LLAMA_LOG_ERROR("%s: could not reserve space for batch with %u outputs\n", __func__, n_tokens); return -2; }; @@ -1261,7 +943,7 @@ int llama_context::encode(const llama_batch & batch_inp) { auto * t_embd = res->get_embd_pooled() ? res->get_embd_pooled() : res->get_embd(); // extract logits - if (logits && t_logits) { + if (logits && t_logits) { ggml_backend_t backend_res = ggml_backend_sched_get_tensor_backend(sched.get(), t_logits); GGML_ASSERT(backend_res != nullptr); GGML_ASSERT(logits != nullptr); @@ -1279,10 +961,9 @@ int llama_context::encode(const llama_batch & batch_inp) { { // extract token embeddings GGML_ASSERT(embd != nullptr); - const uint32_t n_embd_out = hparams.get_n_embd_out(); - GGML_ASSERT(n_tokens*n_embd_out <= (int64_t) embd_size); - ggml_backend_tensor_get_async(backend_embd, t_embd, embd, 0, n_tokens*n_embd_out*sizeof(float)); + GGML_ASSERT(n_tokens*n_embd <= (int64_t) embd_size); + ggml_backend_tensor_get_async(backend_embd, t_embd, embd, 0, n_tokens*n_embd*sizeof(float)); } break; case LLAMA_POOLING_TYPE_MEAN: case LLAMA_POOLING_TYPE_CLS: @@ -1350,112 +1031,6 @@ int llama_context::encode(const llama_batch & batch_inp) { return 0; } -static std::map build_seq_to_output_row(const llama_ubatch & ubatch, uint32_t row_offset) { - std::map seq_to_row; - // how many output tokens we have seen so far for this ubatch. - uint32_t local = 0; - for (uint32_t i = 0; i < ubatch.n_tokens; ++i) { - // skip tokens that are not output. - if (!ubatch.output[i]) { - continue; - } - - const llama_seq_id seq_id = ubatch.seq_id[i][0]; - // row_offset is the number of output tokens before this ubatch. - seq_to_row[seq_id] = row_offset + local; - ++local; - } - return seq_to_row; -} - -static void copy_tensor_async_ints( - const std::map & tensor_map, - llama_token * sampled, - size_t sampled_size, - const std::map & seq_to_row, - ggml_backend_sched_t sched) { - if (sampled == nullptr) { - return; - } - - for (const auto & [seq_id, tensor] : tensor_map) { - auto it = seq_to_row.find(seq_id); - if (it == seq_to_row.end()) { - continue; - } - - const uint32_t row = it->second; - GGML_ASSERT(row < sampled_size); - - GGML_ASSERT(ggml_is_contiguous(tensor) && "sampled tokens tensor must be contiguous for async copy"); - - ggml_backend_t backend = ggml_backend_sched_get_tensor_backend(sched, tensor); - ggml_backend_tensor_get_async(backend, tensor, sampled + row, 0, sizeof(sampled[row])); - } -} - -static void copy_tensor_async_floats( - const std::map & tensor_map, - float * dst, - size_t stride, - std::vector & counts, - const std::map & seq_to_row, - ggml_backend_sched_t sched) { - if (dst == nullptr) { - return; - } - - for (const auto & [seq_id, tensor] : tensor_map) { - auto it = seq_to_row.find(seq_id); - if (it == seq_to_row.end()) { - continue; - } - - const uint32_t row = it->second; - GGML_ASSERT(row < counts.size()); - - GGML_ASSERT(ggml_is_contiguous(tensor) && "logits/probs tensor must be contiguous for async copy"); - - ggml_backend_t backend = ggml_backend_sched_get_tensor_backend(sched, tensor); - float * row_ptr = dst + (size_t) row * stride; - ggml_backend_tensor_get_async(backend, tensor, row_ptr, 0, ggml_nbytes(tensor)); - - // Update the actual number of logits/probabilities that were written for this row. - counts[row] = ggml_nelements(tensor); - } -} - -static void copy_tensor_async_candidates( - const std::map & tensor_map, - llama_token * dst, - size_t stride, - std::vector & counts, - const std::map & seq_to_row, - ggml_backend_sched_t sched) { - if (dst == nullptr) { - return; - } - - for (const auto & [seq_id, tensor] : tensor_map) { - auto it = seq_to_row.find(seq_id); - if (it == seq_to_row.end()) { - continue; - } - - const uint32_t row = it->second; - GGML_ASSERT(row < counts.size()); - - GGML_ASSERT(ggml_is_contiguous(tensor) && "candidates tensor must be contiguous for async copy"); - - ggml_backend_t backend = ggml_backend_sched_get_tensor_backend(sched, tensor); - llama_token * row_ptr = dst + (size_t) row * stride; - ggml_backend_tensor_get_async(backend, tensor, row_ptr, 0, ggml_nbytes(tensor)); - - // Update the actual number of candidates that were written. - counts[row] = ggml_nelements(tensor); - } -} - int llama_context::decode(const llama_batch & batch_inp) { GGML_ASSERT((!batch_inp.token && batch_inp.embd) || (batch_inp.token && !batch_inp.embd)); // NOLINT @@ -1476,36 +1051,9 @@ int llama_context::decode(const llama_batch & batch_inp) { const int64_t n_embd = hparams.n_embd_inp(); // when computing embeddings, all tokens are output - const bool output_all = cparams.embeddings; - const bool has_samplers = !sampling.samplers.empty(); + const bool output_all = cparams.embeddings; - const uint32_t n_seq_max = cparams.kv_unified ? LLAMA_MAX_SEQ : cparams.n_seq_max; - - // TODO: avoid this workaround in the future - if (has_samplers && batch_inp.logits) { - std::vector seq_output_count(n_seq_max, 0); - - for (int32_t i = 0; i < batch_inp.n_tokens; ++i) { - if (batch_inp.logits[i] == 0) { - continue; - } - - const int ns = batch_inp.n_seq_id ? batch_inp.n_seq_id[i] : 1; - - for (int32_t s = 0; s < ns; ++s) { - const llama_seq_id seq_id = batch_inp.seq_id ? batch_inp.seq_id[i][s] : 0; - - seq_output_count[seq_id]++; - if (seq_output_count[seq_id] > 1) { - LLAMA_LOG_ERROR("%s: backend sampling requires at most one output token per sequence (seq_id %d had %d)\n", - __func__, seq_id, seq_output_count[seq_id]); - return -1; - } - } - } - } - - if (!balloc->init(batch_inp, vocab, memory.get(), n_embd, n_seq_max, output_all)) { + if (!balloc->init(batch_inp, vocab, memory.get(), n_embd, cparams.kv_unified ? LLAMA_MAX_SEQ : cparams.n_seq_max, output_all)) { LLAMA_LOG_ERROR("%s: failed to initialize batch\n", __func__); return -1; } @@ -1535,8 +1083,6 @@ int llama_context::decode(const llama_batch & batch_inp) { embd_seq.clear(); output_swaps.clear(); - sched_reserve(); - bool did_optimize = false; // handle any pending shifts/copies @@ -1588,7 +1134,7 @@ int llama_context::decode(const llama_batch & batch_inp) { } // reserve output buffer - if (output_reserve(n_outputs_all, balloc->get_batch()) < n_outputs_all) { + if (output_reserve(n_outputs_all) < n_outputs_all) { LLAMA_LOG_ERROR("%s: could not reserve space for batch with %d outputs\n", __func__, n_outputs_all); return -2; }; @@ -1661,10 +1207,7 @@ int llama_context::decode(const llama_batch & batch_inp) { } // extract logits - // For multi-sequence batches that mix backend samplers and CPU sampler - // this is currently inefficient as we copy all logits even for the - // backend sampled tokens. - if (logits && t_logits && n_outputs > 0) { + if (t_logits && n_outputs > 0) { ggml_backend_t backend_res = ggml_backend_sched_get_tensor_backend(sched.get(), t_logits); GGML_ASSERT(backend_res != nullptr); GGML_ASSERT(logits != nullptr); @@ -1679,7 +1222,7 @@ int llama_context::decode(const llama_batch & batch_inp) { } // extract embeddings - if (embd && t_embd && n_outputs > 0) { + if (t_embd && n_outputs > 0) { ggml_backend_t backend_embd = ggml_backend_sched_get_tensor_backend(sched.get(), t_embd); GGML_ASSERT(backend_embd != nullptr); @@ -1688,13 +1231,12 @@ int llama_context::decode(const llama_batch & batch_inp) { { // extract token embeddings GGML_ASSERT(embd != nullptr); - const uint32_t n_embd_out = hparams.get_n_embd_out(); - float * embd_out = embd + n_outputs_prev*n_embd_out; + float * embd_out = embd + n_outputs_prev*n_embd; if (n_outputs) { GGML_ASSERT( n_outputs_prev + n_outputs <= n_outputs_all); - GGML_ASSERT((n_outputs_prev + n_outputs)*n_embd_out <= (int64_t) embd_size); - ggml_backend_tensor_get_async(backend_embd, t_embd, embd_out, 0, n_outputs*n_embd_out*sizeof(float)); + GGML_ASSERT((n_outputs_prev + n_outputs)*n_embd <= (int64_t) embd_size); + ggml_backend_tensor_get_async(backend_embd, t_embd, embd_out, 0, n_outputs*n_embd*sizeof(float)); } } break; case LLAMA_POOLING_TYPE_MEAN: @@ -1734,22 +1276,6 @@ int llama_context::decode(const llama_batch & batch_inp) { } } - // This flag indicates whether a backend sampler has actually sampled a specific - // token, or if it has produced probabilites. If true, we can skip the normal copying of logits and embeddings. - const bool has_sampled = !res->t_sampled.empty() || !res->t_sampled_probs.empty() || !res->t_sampled_logits.empty(); - - if (has_samplers && has_sampled) { - const auto seq_to_output_row = build_seq_to_output_row(ubatch, n_outputs_prev); - const auto stride = n_vocab; - - // async copy the sampling data from the backend to the host - copy_tensor_async_ints(res->t_sampled, sampling.sampled, sampling.sampled_size, seq_to_output_row, sched.get()); - - copy_tensor_async_floats (res->t_sampled_logits, sampling.logits, stride, sampling.logits_count, seq_to_output_row, sched.get()); - copy_tensor_async_floats (res->t_sampled_probs, sampling.probs, stride, sampling.probs_count, seq_to_output_row, sched.get()); - copy_tensor_async_candidates(res->t_candidates, sampling.candidates, stride, sampling.candidates_count, seq_to_output_row, sched.get()); - } - n_outputs_prev += n_outputs; } while (mctx->next()); @@ -1813,15 +1339,15 @@ int llama_context::decode(const llama_batch & batch_inp) { // output // -uint32_t llama_context::output_reserve(int32_t n_outputs, const llama_batch & batch) { +uint32_t llama_context::output_reserve(int32_t n_outputs) { const auto & hparams = model.hparams; const auto & vocab = model.vocab; const int64_t n_outputs_max = std::max(n_outputs, n_seq_max()); - const auto n_batch = cparams.n_batch; - const auto n_vocab = vocab.n_tokens(); - const auto n_embd_out = hparams.get_n_embd_out(); + const auto n_batch = cparams.n_batch; + const auto n_vocab = vocab.n_tokens(); + const auto n_embd = hparams.n_embd; bool has_logits = true; bool has_embd = cparams.embeddings; @@ -1832,53 +1358,8 @@ uint32_t llama_context::output_reserve(int32_t n_outputs, const llama_batch & ba has_embd = true; } - // Check which sampling modes are needed for the current batch. - // TODO: avoid this branching by working with the worst-case - bool has_sampling = false; - bool cpu_logits = false; - - if (batch.logits) { - for (int32_t i = 0; i < batch.n_tokens; i++) { - if (!batch.logits[i]) { - continue; - } - for (int32_t j = 0; j < batch.n_seq_id[i]; j++) { - llama_seq_id seq_id = batch.seq_id[i][j]; - if (sampling.samplers.find(seq_id) != sampling.samplers.end()) { - has_sampling = true; - } else { - cpu_logits = true; - } - } - } - } else { - // When batch.logits is nullptr (when loading state with a dummy batch), - // allocate CPU logits. - cpu_logits = true; - } - - size_t backend_float_count = 0; - size_t backend_token_count = 0; - - // Allocate CPU logits buffer only if needed by sequences in this batch - logits_size = (has_logits && cpu_logits) ? n_vocab*n_outputs_max : 0; - embd_size = has_embd ? n_embd_out*n_outputs_max : 0; - - // TODO: avoid this branching by working with the worst-case - if (!has_sampling) { - sampling.logits_size = 0; - sampling.probs_size = 0; - sampling.sampled_size = 0; - sampling.candidates_size = 0; - } else { - sampling.logits_size = n_vocab*n_outputs_max; - sampling.probs_size = n_vocab*n_outputs_max; - sampling.sampled_size = n_outputs_max; - sampling.candidates_size = n_vocab*n_outputs_max; - - backend_float_count = sampling.logits_size + sampling.probs_size; - backend_token_count = sampling.sampled_size + sampling.candidates_size; - } + logits_size = has_logits ? n_vocab*n_outputs_max : 0; + embd_size = has_embd ? n_embd*n_outputs_max : 0; if (output_ids.empty()) { // init, never resized afterwards @@ -1886,9 +1367,7 @@ uint32_t llama_context::output_reserve(int32_t n_outputs, const llama_batch & ba } const size_t prev_size = buf_output ? ggml_backend_buffer_get_size(buf_output.get()) : 0; - const size_t new_size = - (logits_size + embd_size + backend_float_count) * sizeof(float) + - ( backend_token_count) * sizeof(llama_token); + const size_t new_size = (logits_size + embd_size) * sizeof(float); // alloc only when more than the current capacity is required // TODO: also consider shrinking the buffer @@ -1896,11 +1375,9 @@ uint32_t llama_context::output_reserve(int32_t n_outputs, const llama_batch & ba if (buf_output) { #ifndef NDEBUG // This doesn't happen often, but may be annoying in some cases (like the HellaSwag benchmark) - LLAMA_LOG_DEBUG("%s: reallocating output buffer from size %.02f MiB to %.02f MiB\n", __func__, prev_size / 1024.0 / 1024.0, new_size / 1024.0 / 1024.0); + LLAMA_LOG_INFO("%s: reallocating output buffer from size %.02f MiB to %.02f MiB\n", __func__, prev_size / 1024.0 / 1024.0, new_size / 1024.0 / 1024.0); #endif synchronize(); - - // TODO: not needed? buf_output = nullptr; logits = nullptr; embd = nullptr; @@ -1922,49 +1399,8 @@ uint32_t llama_context::output_reserve(int32_t n_outputs, const llama_batch & ba float * output_base = (float *) ggml_backend_buffer_get_base(buf_output.get()); - logits = nullptr; - embd = nullptr; - - size_t offset = 0; - uint8_t * base = (uint8_t *) output_base; - - logits = (has_logits && cpu_logits) ? output_base : nullptr; - offset += logits_size * sizeof(float); - - embd = has_embd ? (float *) (base + offset) : nullptr; - offset += embd_size * sizeof(float); - - sampling.logits = nullptr; - sampling.probs = nullptr; - sampling.sampled = nullptr; - sampling.candidates = nullptr; - - if (has_sampling) { - sampling.logits = (float *) (base + offset); - offset += sampling.logits_size * sizeof(float); - - sampling.probs = (float *) (base + offset); - offset += sampling.probs_size * sizeof(float); - - sampling.sampled = (llama_token *) (base + offset); - offset += sampling.sampled_size * sizeof(llama_token); - - sampling.candidates = (llama_token *) (base + offset); - offset += sampling.candidates_size * sizeof(llama_token); - - // The count vectors keep track of the actual number of logits/probs/candidates - // copied from the backend for each output row. - - sampling.logits_count.resize(n_outputs_max); - sampling.probs_count.resize(n_outputs_max); - sampling.candidates_count.resize(n_outputs_max); - - std::fill(sampling.logits_count.begin(), sampling.logits_count.end(), 0); - std::fill(sampling.probs_count.begin(), sampling.probs_count.end(), 0); - std::fill(sampling.candidates_count.begin(), sampling.candidates_count.end(), 0); - - std::fill_n(sampling.sampled, sampling.sampled_size, LLAMA_TOKEN_NULL); - } + logits = has_logits ? output_base : nullptr; + embd = has_embd ? output_base + logits_size : nullptr; // set all ids as invalid (negative) std::fill(output_ids.begin(), output_ids.end(), -1); @@ -1993,40 +1429,6 @@ void llama_context::output_reorder() { std::swap(embd[i0*n_embd + k], embd[i1*n_embd + k]); } } - - if (sampling.logits && sampling.logits_size > 0) { - for (uint64_t k = 0; k < n_vocab; ++k) { - std::swap(sampling.logits[i0*n_vocab + k], sampling.logits[i1*n_vocab + k]); - } - } - - if (sampling.probs && sampling.probs_size > 0) { - for (uint64_t k = 0; k < n_vocab; ++k) { - std::swap(sampling.probs[i0*n_vocab + k], sampling.probs[i1*n_vocab + k]); - } - } - - if (sampling.candidates && sampling.candidates_size > 0) { - for (uint64_t k = 0; k < n_vocab; ++k) { - std::swap(sampling.candidates[i0*n_vocab + k], sampling.candidates[i1*n_vocab + k]); - } - } - - if (sampling.sampled && sampling.sampled_size > 0) { - std::swap(sampling.sampled[i0], sampling.sampled[i1]); - } - - if (!sampling.logits_count.empty()) { - std::swap(sampling.logits_count[i0], sampling.logits_count[i1]); - } - - if (!sampling.probs_count.empty()) { - std::swap(sampling.probs_count[i0], sampling.probs_count[i1]); - } - - if (!sampling.candidates_count.empty()) { - std::swap(sampling.candidates_count[i0], sampling.candidates_count[i1]); - } } output_swaps.clear(); @@ -2040,11 +1442,7 @@ uint32_t llama_context::graph_max_nodes(uint32_t n_tokens) const { if (model.arch == LLM_ARCH_QWEN3NEXT) { return std::max(n_tokens * 40, 32u * model.n_tensors()); } - uint32_t res = std::max(1024u, 8u*model.n_tensors()); - for (const auto & lora : model.loras) { - res += lora->get_n_nodes(); - } - return res; + return std::max(1024u, 8u*model.n_tensors()); } llm_graph_result * llama_context::get_gf_res_reserve() const { @@ -2058,7 +1456,7 @@ ggml_cgraph * llama_context::graph_reserve( if (n_tokens % n_seqs != 0) { n_tokens = ((n_tokens + (n_seqs - 1)) / n_seqs) * n_seqs; // round to next multiple of n_seqs - n_outputs = std::max(n_outputs, n_tokens); + n_outputs = std::min(n_outputs, n_tokens); LLAMA_LOG_DEBUG("%s: making n_tokens a multiple of n_seqs - n_tokens = %u, n_seqs = %u, n_outputs = %u\n", __func__, n_tokens, n_seqs, n_outputs); } @@ -2077,15 +1475,6 @@ ggml_cgraph * llama_context::graph_reserve( llama_batch_allocr balloc(model.hparams.n_pos_per_embd()); llama_ubatch ubatch = balloc.ubatch_reserve(n_tokens/n_seqs, n_seqs); - // set one output token per sequence in order to activate all backend samplers - std::vector seq_ids(n_seqs); - for (uint32_t i = 0; i < n_seqs; ++i) { - seq_ids[i] = i; - ubatch.n_seq_id[i] = 1; - ubatch.seq_id[i] = &seq_ids[i]; - ubatch.output[i] = true; - } - auto * res = gf_res_reserve.get(); const auto gparams = graph_params(res, ubatch, mctx, LLM_GRAPH_TYPE_DEFAULT); @@ -2116,7 +1505,7 @@ llm_graph_params llama_context::graph_params( llm_graph_result * res, const llama_ubatch & ubatch, const llama_memory_context_i * mctx, - llm_graph_type gtype) const { + llm_graph_type gtype) const { return { /*.arch =*/ model.arch, /*.hparams =*/ model.hparams, @@ -2129,7 +1518,6 @@ llm_graph_params llama_context::graph_params( /*.loras =*/ &loras, /*.mctx =*/ mctx, /*.cross =*/ &cross, - /*.samplers =*/ sampling.samplers, /*.n_outputs =*/ n_outputs, /*.cb =*/ graph_get_cb(), /*.res =*/ res, @@ -2182,7 +1570,7 @@ llm_graph_cb llama_context::graph_get_cb() const { // norm may be automatically assigned to the backend of the previous layer, increasing data transfer between backends // FIXME: fix in ggml_backend_sched - const bool full_offload = model.n_gpu_layers() > model.hparams.n_layer; + const bool full_offload = model.params.n_gpu_layers > (int) model.hparams.n_layer; if (ubatch.n_tokens < 32 || full_offload) { if (il != -1 && strcmp(name, "norm") == 0) { const auto & dev_layer = model.dev_layer(il); @@ -2585,9 +1973,6 @@ size_t llama_context::state_write_data(llama_io_write_i & io) { } } - // TODO: handle sampling buffers and samplers state ? - // https://github.com/ggml-org/llama.cpp/pull/17004 - if (memory != nullptr) { LLAMA_LOG_DEBUG("%s: - writing memory module\n", __func__); memory->state_write(io); @@ -2620,10 +2005,7 @@ size_t llama_context::state_read_data(llama_io_read_i & io) { auto n_outputs = this->n_outputs; io.read_to(&n_outputs, sizeof(n_outputs)); - // Create a dummy batch for state loading. - llama_batch dummy_batch = {}; - dummy_batch.n_tokens = 0; - if (n_outputs > output_reserve(n_outputs, dummy_batch)) { + if (n_outputs > output_reserve(n_outputs)) { throw std::runtime_error("could not reserve outputs"); } @@ -2677,9 +2059,6 @@ size_t llama_context::state_read_data(llama_io_read_i & io) { } } - // TODO: handle sampling buffers and samplers state ? - // https://github.com/ggml-org/llama.cpp/pull/17004 - if (memory) { LLAMA_LOG_DEBUG("%s: - reading memory module\n", __func__); @@ -2868,7 +2247,7 @@ void llama_context::opt_epoch_iter( } // reserve output buffer - if (output_reserve(n_outputs_all, balloc->get_batch()) < n_outputs_all) { + if (output_reserve(n_outputs_all) < n_outputs_all) { LLAMA_LOG_ERROR("%s: could not reserve space for batch with %d outputs\n", __func__, n_outputs_all); GGML_ABORT("TODO: handle this error"); }; @@ -3013,8 +2392,6 @@ llama_context_params llama_context_default_params() { /*.op_offload =*/ true, /*.swa_full =*/ true, /*.kv_unified =*/ false, - /*.sampler =*/ nullptr, - /*.n_sampler =*/ 0, }; return result; @@ -3174,15 +2551,7 @@ float * llama_get_logits(llama_context * ctx) { float * llama_get_logits_ith(llama_context * ctx, int32_t i) { ctx->synchronize(); - float * res = nullptr; - - res = ctx->get_sampled_logits_ith(i); - - if (!res) { - res = ctx->get_logits_ith(i); - } - - return res; + return ctx->get_logits_ith(i); } float * llama_get_embeddings(llama_context * ctx) { @@ -3203,52 +2572,6 @@ float * llama_get_embeddings_seq(llama_context * ctx, llama_seq_id seq_id) { return ctx->get_embeddings_seq(seq_id); } -bool llama_set_sampler(llama_context * ctx, llama_seq_id seq_id, llama_sampler * smpl) { - return ctx->set_sampler(seq_id, smpl); -} - -llama_token llama_get_sampled_token_ith(llama_context * ctx, int32_t i) { - ctx->synchronize(); - - return ctx->get_sampled_token_ith(i); -} - -float * llama_get_sampled_probs_ith(llama_context * ctx, int32_t i) { - ctx->synchronize(); - - return ctx->get_sampled_probs_ith(i); -} - -float * llama_get_sampled_logits_ith(llama_context * ctx, int32_t i) { - ctx->synchronize(); - - return ctx->get_sampled_logits_ith(i); -} - -llama_token * llama_get_sampled_candidates_ith(llama_context * ctx, int32_t i) { - ctx->synchronize(); - - return const_cast(ctx->get_sampled_candidates_ith(i)); -} - -uint32_t llama_get_sampled_candidates_count_ith(llama_context * ctx, int32_t i) { - ctx->synchronize(); - - return static_cast(ctx->get_sampled_candidates_count(i)); -} - -uint32_t llama_get_sampled_logits_count_ith(llama_context * ctx, int32_t i) { - ctx->synchronize(); - - return static_cast(ctx->get_sampled_logits_count(i)); -} - -uint32_t llama_get_sampled_probs_count_ith(llama_context * ctx, int32_t i) { - ctx->synchronize(); - - return static_cast(ctx->get_sampled_probs_count(i)); -} - // llama adapter API int32_t llama_set_adapter_lora( diff --git a/src/llama-context.h b/src/llama-context.h index 86decc0..c311013 100644 --- a/src/llama-context.h +++ b/src/llama-context.h @@ -40,14 +40,6 @@ struct llama_context { ~llama_context(); - // reserve a new backend scheduler (if needed) - // for example, when: - // - changing loras - // - changing samplers - // - changing attention type - // - etc. - void sched_reserve(); - void synchronize(); const llama_model & get_model() const; @@ -78,18 +70,6 @@ struct llama_context { float * get_embeddings_ith(int32_t i); float * get_embeddings_seq(llama_seq_id seq_id); - llama_token * get_sampled_tokens() const; - llama_token get_sampled_token_ith(int32_t idx); - - float * get_sampled_logits_ith(int32_t idx); - size_t get_sampled_logits_count(int32_t idx); - - float * get_sampled_probs_ith(int32_t idx); - size_t get_sampled_probs_count(int32_t idx); - - const llama_token * get_sampled_candidates_ith(int32_t idx); - size_t get_sampled_candidates_count(int32_t idx); - void attach_threadpool( ggml_threadpool_t threadpool, ggml_threadpool_t threadpool_batch); @@ -212,13 +192,10 @@ private: // Make sure enough space is available for outputs. // Returns max number of outputs for which space was reserved. - uint32_t output_reserve(int32_t n_outputs, const llama_batch & batch); + uint32_t output_reserve(int32_t n_outputs); void output_reorder(); - // map the output row index `i` to batch index - int64_t output_resolve_row(int32_t i) const; - // // graph // @@ -236,8 +213,6 @@ public: ggml_cgraph * graph_reserve( uint32_t n_tokens, uint32_t n_seqs, uint32_t n_outputs, const llama_memory_context_i * mctx, bool split_only = false, size_t * sizes = nullptr); - bool set_sampler(llama_seq_id seq_id, llama_sampler * sampler); - private: llm_graph_params graph_params( llm_graph_result * res, @@ -277,31 +252,6 @@ private: size_t embd_size = 0; // capacity (of floats) for embeddings float * embd = nullptr; - // TODO: simplify - struct sampling_info { - std::map samplers; - - float * logits = nullptr; - size_t logits_size = 0; - - llama_token * sampled = nullptr; - size_t sampled_size = 0; - - float * probs = nullptr; - size_t probs_size = 0; - - llama_token * candidates = nullptr; - size_t candidates_size = 0; - - std::vector logits_count; - std::vector probs_count; - std::vector candidates_count; - - std::vector token_ids_full_vocab; - }; - - sampling_info sampling; - // sequence embeddings output (map of [n_embd] vectors) // populated only when pooling_type != LLAMA_POOLING_TYPE_NONE std::map> embd_seq; @@ -322,8 +272,6 @@ private: ggml_backend_sched_ptr sched; - bool sched_need_reserve = true; - ggml_backend_t backend_cpu = nullptr; std::vector backends; diff --git a/src/llama-cparams.h b/src/llama-cparams.h index 2da3bbd..fcef8fa 100644 --- a/src/llama-cparams.h +++ b/src/llama-cparams.h @@ -30,12 +30,10 @@ struct llama_cparams { bool causal_attn; bool offload_kqv; bool flash_attn; - bool auto_fa; bool no_perf; bool warmup; bool op_offload; bool kv_unified; - bool pipeline_parallel; enum llama_pooling_type pooling_type; diff --git a/src/llama-grammar.cpp b/src/llama-grammar.cpp index 64ea2fd..75d5d75 100644 --- a/src/llama-grammar.cpp +++ b/src/llama-grammar.cpp @@ -369,44 +369,6 @@ static void print_rule( fprintf(file, "\n"); } -// -// Regex utilities -// - -size_t llama_grammar_trigger_pattern::find(const std::string & input) const { - auto find_start_pos = [](const std::smatch & match) { - // get from the first matched capturing group to the end of the string - size_t start = std::string::npos; - for (auto i = 1u; i < match.size(); i++) { - if (match.length(i) > 0) { - start = match.position(i); - break; - } - } - if (start == std::string::npos) { - start = match.position(0); - } - return start; - }; - - if (!pattern.empty() && pattern.front() == '^' && pattern.back() == '$') { - // match against the entire input - std::smatch match; - if (std::regex_match(input, match, regex)) { - return find_start_pos(match); - } - } - - // search anywhere - std::smatch match; - if (std::regex_search(input, match, regex)) { - return find_start_pos(match); - } - - return std::string::npos; -} - - // // implementation // @@ -1350,10 +1312,21 @@ void llama_grammar_accept_impl(struct llama_grammar & grammar, llama_token token grammar.trigger_buffer_positions.push_back(std::make_pair(token, position)); grammar.trigger_buffer += piece; + std::smatch match; for (const auto & trigger_pattern : grammar.trigger_patterns) { - auto start = trigger_pattern.find(grammar.trigger_buffer); - if (start != std::string::npos) { + if (std::regex_match(grammar.trigger_buffer, match, trigger_pattern.regex)) { grammar.awaiting_trigger = false; + // get from the first matched capturing group to the end of the string + size_t start = std::string::npos; + for (auto i = 1u; i < match.size(); i++) { + if (match.length(i) > 0) { + start = match.position(i); + break; + } + } + if (start == std::string::npos) { + start = match.position(0); + } // replay tokens that overlap with [start, end) for (const auto & [tok, tok_pos] : grammar.trigger_buffer_positions) { diff --git a/src/llama-grammar.h b/src/llama-grammar.h index b5a0e58..a4c978a 100644 --- a/src/llama-grammar.h +++ b/src/llama-grammar.h @@ -119,8 +119,6 @@ struct llama_grammar_parser { struct llama_grammar_trigger_pattern { std::string pattern; std::regex regex; - - size_t find(const std::string & input) const; }; struct llama_grammar { diff --git a/src/llama-graph.cpp b/src/llama-graph.cpp index 944c7e5..1d0d719 100644 --- a/src/llama-graph.cpp +++ b/src/llama-graph.cpp @@ -12,7 +12,6 @@ #include #include #include -#include void llm_graph_input_embd::set_input(const llama_ubatch * ubatch) { if (ubatch->token) { @@ -33,7 +32,7 @@ bool llm_graph_input_embd::can_reuse(const llm_graph_params & params) { bool res = true; res &= (!tokens && !params.ubatch.token) || (tokens && tokens->ne[0] == params.ubatch.n_tokens); - res &= (!embd && !params.ubatch.embd) || (embd && embd->ne[1] == params.ubatch.n_tokens); + res &= (!embd && !params.ubatch.embd) || (embd && embd->ne[0] == params.ubatch.n_tokens); return res; } @@ -63,7 +62,7 @@ void llm_graph_input_pos::set_input(const llama_ubatch * ubatch) { bool llm_graph_input_pos::can_reuse(const llm_graph_params & params) { bool res = true; - res &= pos->ne[0] == params.ubatch.n_tokens*n_pos_per_embd; + res &= pos->ne[0] == params.ubatch.n_tokens; return res; } @@ -96,9 +95,11 @@ void llm_graph_input_pos_bucket::set_input(const llama_ubatch * ubatch) { int32_t * data = (int32_t *) pos_bucket->data; - for (int j = 0; j < n_tokens; ++j) { - for (int i = 0; i < n_tokens; ++i) { - data[j*n_tokens + i] = llama_relative_position_bucket(ubatch->pos[i], ubatch->pos[j], hparams.n_rel_attn_bkts, true); + for (int h = 0; h < 1; ++h) { + for (int j = 0; j < n_tokens; ++j) { + for (int i = 0; i < n_tokens; ++i) { + data[h*(n_tokens*n_tokens) + j*n_tokens + i] = llama_relative_position_bucket(ubatch->pos[i], ubatch->pos[j], hparams.n_rel_attn_bkts, true); + } } } } @@ -321,32 +322,34 @@ void llm_graph_input_attn_no_cache::set_input(const llama_ubatch * ubatch) { const int64_t n_tokens = ubatch->n_tokens; const auto fill_mask = [&](float * data, int n_swa, llama_swa_type swa_type) { - for (int i1 = 0; i1 < n_tokens; ++i1) { - const llama_seq_id s1 = ubatch->seq_id[i1][0]; - const llama_pos p1 = ubatch->pos[i1]; + for (int h = 0; h < 1; ++h) { + for (int i1 = 0; i1 < n_tokens; ++i1) { + const llama_seq_id s1 = ubatch->seq_id[i1][0]; + const llama_pos p1 = ubatch->pos[i1]; - const uint64_t idst = i1*n_kv; + const uint64_t idst = h*(n_kv*n_tokens) + i1*n_kv; - for (int i0 = 0; i0 < n_tokens; ++i0) { - const llama_seq_id s0 = ubatch->seq_id[i0][0]; - const llama_pos p0 = ubatch->pos[i0]; + for (int i0 = 0; i0 < n_tokens; ++i0) { + const llama_seq_id s0 = ubatch->seq_id[i0][0]; + const llama_pos p0 = ubatch->pos[i0]; - // mask different sequences - if (s0 != s1) { - continue; + // mask different sequences + if (s0 != s1) { + continue; + } + + // mask future tokens + if (cparams.causal_attn && p0 > p1) { + continue; + } + + // apply SWA if any + if (llama_hparams::is_masked_swa(n_swa, swa_type, p0, p1)) { + continue; + } + + data[idst + i0] = hparams.use_alibi ? -std::abs(p0 - p1) : 0.0f; } - - // mask future tokens - if (cparams.causal_attn && p0 > p1) { - continue; - } - - // apply SWA if any - if (llama_hparams::is_masked_swa(n_swa, swa_type, p0, p1)) { - continue; - } - - data[idst + i0] = hparams.use_alibi ? -std::abs(p0 - p1) : 0.0f; } } }; @@ -450,19 +453,27 @@ void llm_graph_input_attn_cross::set_input(const llama_ubatch * ubatch) { float * data = (float *) cross_kq_mask->data; - for (int i = 0; i < n_tokens; ++i) { - for (int j = 0; j < n_enc; ++j) { - float f = -INFINITY; + for (int h = 0; h < 1; ++h) { + for (int i = 0; i < n_tokens; ++i) { + for (int j = 0; j < n_enc; ++j) { + float f = -INFINITY; - for (int s = 0; s < ubatch->n_seq_id[i]; ++s) { - const llama_seq_id seq_id = ubatch->seq_id[i][s]; + for (int s = 0; s < ubatch->n_seq_id[i]; ++s) { + const llama_seq_id seq_id = ubatch->seq_id[i][s]; - if (cross->seq_ids_enc[j].find(seq_id) != cross->seq_ids_enc[j].end()) { - f = 0.0f; + if (cross->seq_ids_enc[j].find(seq_id) != cross->seq_ids_enc[j].end()) { + f = 0.0f; + } } - } - data[i*n_enc + j] = f; + data[h*(n_enc*n_tokens) + i*n_enc + j] = f; + } + } + + for (int i = n_tokens; i < n_tokens; ++i) { + for (int j = 0; j < n_enc; ++j) { + data[h*(n_enc*n_tokens) + i*n_enc + j] = -INFINITY; + } } } } @@ -510,43 +521,6 @@ bool llm_graph_input_mem_hybrid::can_reuse(const llm_graph_params & params) { return res; } -void llm_graph_input_sampling::set_input(const llama_ubatch * ubatch) { - // set the inputs only for the active samplers in the current ubatch - std::unordered_set active_samplers; - for (uint32_t i = 0; i < ubatch->n_tokens; i++) { - if (ubatch->output[i]) { - llama_seq_id seq_id = ubatch->seq_id[i][0]; - active_samplers.insert(seq_id); - } - } - - for (auto seq_id : active_samplers) { - if (samplers.find(seq_id) == samplers.end()) { - continue; - } - - auto & sampler = samplers[seq_id]; - - if (sampler->iface->backend_set_input) { - sampler->iface->backend_set_input(sampler); - } - } -} - -bool llm_graph_input_sampling::can_reuse(const llm_graph_params & params) { - if (samplers.size() != params.samplers.size()) { - return false; - } - - for (const auto & [seq_id, sampler] : params.samplers) { - if (samplers[seq_id] != sampler) { - return false; - } - } - - return true; -} - // // llm_graph_result // @@ -567,10 +541,6 @@ void llm_graph_result::reset() { t_logits = nullptr; t_embd = nullptr; t_embd_pooled = nullptr; - t_sampled.clear(); - t_sampled_probs.clear(); - t_sampled_logits.clear(); - t_candidates.clear(); params = {}; @@ -595,38 +565,6 @@ void llm_graph_result::set_inputs(const llama_ubatch * ubatch) { } } -void llm_graph_result::set_outputs() { - if (t_logits != nullptr) { - ggml_set_output(t_logits); - } - if (t_embd != nullptr) { - ggml_set_output(t_embd); - } - if (t_embd_pooled != nullptr) { - ggml_set_output(t_embd_pooled); - } - for (auto & [seq_id, t] : t_sampled) { - if (t != nullptr) { - ggml_set_output(t); - } - } - for (auto & [seq_id, t] : t_sampled_probs) { - if (t != nullptr) { - ggml_set_output(t); - } - } - for (auto & [seq_id, t] : t_sampled_logits) { - if (t != nullptr) { - ggml_set_output(t); - } - } - for (auto & [seq_id, t] : t_candidates) { - if (t != nullptr) { - ggml_set_output(t); - } - } -} - bool llm_graph_result::can_reuse(const llm_graph_params & params) { if (!this->params.allow_reuse(params)) { if (debug > 1) { @@ -708,7 +646,6 @@ llm_graph_context::llm_graph_context(const llm_graph_params & params) : loras (params.loras), mctx (params.mctx), cross (params.cross), - samplers (params.samplers), cb_func (params.cb), res (params.res), ctx0 (res->get_ctx()), @@ -1314,10 +1251,6 @@ ggml_tensor * llm_graph_context::build_inp_embd(ggml_tensor * tok_embd) const { res->add_input(std::move(inp)); - // make sure the produced embeddings are immediately materialized in the ggml graph - // ref: https://github.com/ggml-org/llama.cpp/pull/18599 - ggml_build_forward_expand(gf, cur); - return cur; } @@ -1901,10 +1834,8 @@ llm_graph_input_attn_kv_iswa * llm_graph_context::build_attn_inp_kv_iswa() const inp->self_kq_mask = ggml_new_tensor_4d(ctx0, GGML_TYPE_F32, n_kv, n_tokens/n_stream, 1, n_stream); ggml_set_input(inp->self_kq_mask); - ggml_set_name(inp->self_kq_mask, "self_kq_mask"); inp->self_kq_mask_cnv = cparams.flash_attn ? ggml_cast(ctx0, inp->self_kq_mask, GGML_TYPE_F16) : inp->self_kq_mask; - ggml_set_name(inp->self_kq_mask_cnv, "self_kq_mask_cnv"); } { @@ -1917,10 +1848,8 @@ llm_graph_input_attn_kv_iswa * llm_graph_context::build_attn_inp_kv_iswa() const inp->self_kq_mask_swa = ggml_new_tensor_4d(ctx0, GGML_TYPE_F32, n_kv, n_tokens/n_stream, 1, n_stream); ggml_set_input(inp->self_kq_mask_swa); - ggml_set_name(inp->self_kq_mask_swa, "self_kq_mask_swa"); inp->self_kq_mask_swa_cnv = cparams.flash_attn ? ggml_cast(ctx0, inp->self_kq_mask_swa, GGML_TYPE_F16) : inp->self_kq_mask_swa; - ggml_set_name(inp->self_kq_mask_swa_cnv, "self_kq_mask_swa_cnv"); } return (llm_graph_input_attn_kv_iswa *) res->add_input(std::move(inp)); @@ -2059,18 +1988,14 @@ llm_graph_input_mem_hybrid * llm_graph_context::build_inp_mem_hybrid() const { void llm_graph_context::build_dense_out( ggml_tensor * dense_2, ggml_tensor * dense_3) const { - if (!cparams.embeddings || !(dense_2 || dense_3)) { + if (!cparams.embeddings || dense_2 == nullptr || dense_3 == nullptr) { return; } ggml_tensor * cur = res->t_embd_pooled != nullptr ? res->t_embd_pooled : res->t_embd; GGML_ASSERT(cur != nullptr && "missing t_embd_pooled/t_embd"); - if (dense_2) { - cur = ggml_mul_mat(ctx0, dense_2, cur); - } - if (dense_3) { - cur = ggml_mul_mat(ctx0, dense_3, cur); - } + cur = ggml_mul_mat(ctx0, dense_2, cur); + cur = ggml_mul_mat(ctx0, dense_3, cur); cb(cur, "result_embd_pooled", -1); res->t_embd_pooled = cur; ggml_build_forward_expand(gf, cur); @@ -2161,87 +2086,6 @@ void llm_graph_context::build_pooling( ggml_build_forward_expand(gf, cur); } -void llm_graph_context::build_sampling() const { - if (samplers.empty() || !res->t_logits) { - return; - } - - auto inp_sampling = std::make_unique(samplers); - res->add_input(std::move(inp_sampling)); - - std::map seq_to_logit_row; - int32_t logit_row_idx = 0; - - for (uint32_t i = 0; i < ubatch.n_tokens; i++) { - if (ubatch.output[i]) { - llama_seq_id seq_id = ubatch.seq_id[i][0]; - seq_to_logit_row[seq_id] = logit_row_idx; - logit_row_idx++; - } - } - - // res->t_logits will contain logits for all tokens that want the logits calculated (logits=1 or output=1) - GGML_ASSERT(res->t_logits != nullptr && "missing t_logits tensor"); - - // add a dummy row of logits - // this trick makes the graph static, regardless of which samplers are activated - // this is important in order to minimize graph reallocations - // TODO: use `ggml_build_forward_select()` when available (https://github.com/ggml-org/llama.cpp/pull/18550) - ggml_tensor * logits_t = ggml_pad(ctx0, res->t_logits, 0, 1, 0, 0); - - for (const auto & [seq_id, sampler] : samplers) { - const auto it = seq_to_logit_row.find(seq_id); - - // inactive samplers always work on the first row - const auto row_idx = seq_to_logit_row.find(seq_id) != seq_to_logit_row.end() ? it->second : 0; - - ggml_tensor * logits_seq = ggml_view_1d(ctx0, logits_t, logits_t->ne[0], row_idx * logits_t->nb[1]); - ggml_format_name(logits_seq, "logits_seq_%d", seq_id); - - struct llama_sampler_data data = { - /*.logits =*/ logits_seq, - /*.probs =*/ nullptr, - /*.sampled =*/ nullptr, - /*.candidates =*/ nullptr, - }; - - assert(sampler->iface->backend_apply); - sampler->iface->backend_apply(sampler, ctx0, gf, &data); - - if (data.sampled != nullptr) { - res->t_sampled[seq_id] = data.sampled; - ggml_build_forward_expand(gf, data.sampled); - } - - if (data.probs != nullptr) { - res->t_sampled_probs[seq_id] = data.probs; - ggml_build_forward_expand(gf, data.probs); - } - - if (data.logits != nullptr) { - res->t_sampled_logits[seq_id] = data.logits; - ggml_build_forward_expand(gf, data.logits); - } - - if (data.candidates != nullptr) { - res->t_candidates[seq_id] = data.candidates; - ggml_build_forward_expand(gf, data.candidates); - } - } - - // TODO: Call llama_sampler_accept_ggml after all samplers have been applied. - /* - for (const auto & [seq_id, sampler] : samplers) { - if (auto it = res->t_sampled.find(seq_id); it != res->t_sampled.end()) { - ggml_tensor * selected_token = it->second; - if (selected_token != nullptr) { - llama_sampler_accept_ggml(sampler, ctx0, gf, selected_token); - } - } - } - */ -} - int32_t llama_relative_position_bucket(llama_pos x, llama_pos y, uint64_t n_buckets, bool bidirectional) { // TODO move to hparams if a T5 variant appears that uses a different value const int64_t max_distance = 128; diff --git a/src/llama-graph.h b/src/llama-graph.h index 503ffd6..81ac329 100644 --- a/src/llama-graph.h +++ b/src/llama-graph.h @@ -10,7 +10,6 @@ #include #include #include -#include struct ggml_cgraph; struct ggml_context; @@ -397,18 +396,6 @@ public: const llama_memory_hybrid_context * mctx; }; -class llm_graph_input_sampling : public llm_graph_input_i { -public: - llm_graph_input_sampling(std::map samplers) : - samplers(std::move(samplers)) { } - virtual ~llm_graph_input_sampling() = default; - - void set_input(const llama_ubatch * ubatch) override; - bool can_reuse(const llm_graph_params & params) override; - - std::map samplers; -}; - // // llm_graph_result // @@ -442,23 +429,6 @@ struct llm_graph_params { const llama_memory_context_i * mctx; const llama_cross * cross; - std::map samplers; - - static bool samplers_equal( - const std::map & lhs, - const std::map & rhs) { - if (lhs.size() != rhs.size()) { - return false; - } - for (const auto & [seq_id, sampler] : lhs) { - auto it = rhs.find(seq_id); - if (it == rhs.end() || it->second != sampler) { - return false; - } - } - return true; - } - uint32_t n_outputs; llm_graph_cb cb; @@ -498,36 +468,15 @@ struct llm_graph_params { return false; } - if (n_outputs != other.n_outputs) { - return false; - } - - if (!samplers_equal(samplers, other.samplers)) { - return false; - } - - if (samplers.size() > 0) { - if (!ubatch.data || !other.ubatch.data) { - return false; - } - - // check that the outputs are the same for all samplers - for (uint32_t i = 0; i < ubatch.n_tokens; ++i) { - if (ubatch.output[i] != other.ubatch.output[i] || - ubatch.seq_id[i][0] != other.ubatch.seq_id[i][0]) { - return false; - } - } - } - return cparams.embeddings == other.cparams.embeddings && cparams.causal_attn == other.cparams.causal_attn && - arch == other.arch && - gtype == other.gtype && - cvec == other.cvec && - loras == other.loras && - cross == other.cross; + arch == other.arch && + gtype == other.gtype && + cvec == other.cvec && + loras == other.loras && + cross == other.cross && + n_outputs == other.n_outputs; } }; @@ -550,7 +499,6 @@ public: void reset(); void set_inputs(const llama_ubatch * ubatch); - void set_outputs(); // try to update the existing graph result using the new graph parameters in order to reuse it // this can only be done if we determine that the resulting graph using the new graph parameters @@ -569,11 +517,6 @@ public: ggml_tensor * t_embd = nullptr; ggml_tensor * t_embd_pooled = nullptr; - std::map t_sampled_logits; - std::map t_candidates; - std::map t_sampled; - std::map t_sampled_probs; - std::vector inputs; ggml_context_ptr ctx_compute; @@ -649,8 +592,6 @@ struct llm_graph_context { const llama_memory_context_i * mctx; const llama_cross * cross; - std::map samplers; - const llm_graph_cb & cb_func; llm_graph_result * res; @@ -891,12 +832,6 @@ struct llm_graph_context { ggml_tensor * cls_out, ggml_tensor * cls_out_b) const; - // - // sampling (backend sampling) - // - - void build_sampling() const; - // // dense (out) // diff --git a/src/llama-hparams.cpp b/src/llama-hparams.cpp index c847ef9..fe1fa43 100644 --- a/src/llama-hparams.cpp +++ b/src/llama-hparams.cpp @@ -72,10 +72,6 @@ uint32_t llama_hparams::n_embd_inp() const { return n_embd_inp; } -uint32_t llama_hparams::get_n_embd_out() const { - return n_embd_out > 0 ? n_embd_out : n_embd; -} - uint32_t llama_hparams::n_embd_k_gqa(uint32_t il) const { const uint32_t n_head_kv = this->n_head_kv(il); diff --git a/src/llama-hparams.h b/src/llama-hparams.h index 7ae3ec2..f6e95b5 100644 --- a/src/llama-hparams.h +++ b/src/llama-hparams.h @@ -105,9 +105,9 @@ struct llama_hparams { float rope_attn_factor = 1.0f; float rope_freq_base_train; - float rope_freq_base_train_swa = 10000.0f; + float rope_freq_base_train_swa; float rope_freq_scale_train; - float rope_freq_scale_train_swa = 1.0f; + float rope_freq_scale_train_swa; uint32_t n_ctx_orig_yarn; float rope_yarn_log_mul = 0.0f; @@ -123,11 +123,10 @@ struct llama_hparams { llama_swa_type swa_type = LLAMA_SWA_TYPE_NONE; // the size of the sliding window (0 - no SWA) uint32_t n_swa = 0; - // if swa_layers[il] == 1, then layer il is SWA - // if swa_layers[il] == 0, then layer il is dense (i.e. non-SWA) + // if swa_layers[il] == true, then layer il is SWA + // if swa_layers[il] == false, then layer il is dense (i.e. non-SWA) // by default, all layers are dense - // note: using uint32_t type for compatibility reason - std::array swa_layers; + std::array swa_layers; // for State Space Models uint32_t ssm_d_conv = 0; @@ -162,9 +161,6 @@ struct llama_hparams { // for Classifiers uint32_t n_cls_out = 1; - // output embedding dimension (0 = use n_embd) - uint32_t n_embd_out = 0; - // llama4 smallthinker uint32_t n_moe_layer_step = 0; uint32_t n_no_rope_layer_step = 4; @@ -237,9 +233,6 @@ struct llama_hparams { // dimension of main + auxiliary input embeddings uint32_t n_embd_inp() const; - // dimension of output embeddings - uint32_t get_n_embd_out() const; - // dimension of key embeddings across all k-v heads uint32_t n_embd_k_gqa(uint32_t il = 0) const; diff --git a/src/llama-kv-cache.h b/src/llama-kv-cache.h index 0c4ed64..1868f11 100644 --- a/src/llama-kv-cache.h +++ b/src/llama-kv-cache.h @@ -305,7 +305,7 @@ public: bool do_shift, stream_copy_info sc_info); - // used to create a batch processing context from a batch + // used to create a batch procesing context from a batch llama_kv_cache_context( llama_kv_cache * kv, slot_info_vec_t sinfos, diff --git a/src/llama-mmap.cpp b/src/llama-mmap.cpp index fe0847f..23b648a 100644 --- a/src/llama-mmap.cpp +++ b/src/llama-mmap.cpp @@ -110,7 +110,7 @@ struct llama_file::impl { } } - void read_raw(void * ptr, size_t len) { + void read_raw(void * ptr, size_t len) const { size_t bytes_read = 0; while (bytes_read < len) { size_t chunk_size = std::min(len - bytes_read, 64*1024*1024); @@ -127,7 +127,7 @@ struct llama_file::impl { } } - uint32_t read_u32() { + uint32_t read_u32() const { uint32_t val; read_raw(&val, sizeof(val)); return val; @@ -154,8 +154,8 @@ struct llama_file::impl { write_raw(&val, sizeof(val)); } - bool has_direct_io() const { - return true; + void read_aligned_chunk(size_t offset, void * dest, size_t size) const { + throw std::runtime_error("DirectIO is not implemented on Windows."); } ~impl() { @@ -164,45 +164,33 @@ struct llama_file::impl { } } #else - impl(const char * fname, const char * mode, [[maybe_unused]] const bool use_direct_io = false) : fname(fname) { + impl(const char * fname, const char * mode, [[maybe_unused]] const bool use_direct_io = false) { #ifdef __linux__ // Try unbuffered I/O for read only if (use_direct_io && std::strcmp(mode, "rb") == 0) { - if (init_fd()) { + fd = open(fname, O_RDONLY | O_DIRECT); + + if (fd != -1) { + struct stat file_stats{}; + fstat(fd, &file_stats); + + size = file_stats.st_size; + alignment = file_stats.st_blksize; + + off_t ret = lseek(fd, 0, SEEK_SET); + if (ret == -1) { + throw std::runtime_error(format("seek error: %s", strerror(errno))); + } return; } - LLAMA_LOG_WARN("Failed to open file '%s' with error: %s. Falling back to buffered I/O", - fname, strerror(errno)); + + LLAMA_LOG_WARN("Failed to open model %s with error: %s. Falling back to buffered I/O", + fname, strerror(errno)); } #endif - init_fp(mode); - } - -#ifdef __linux__ - bool init_fd() { - fd = open(fname.c_str(), O_RDONLY | O_DIRECT); - - if (fd != -1) { - struct stat file_stats{}; - fstat(fd, &file_stats); - - size = file_stats.st_size; - alignment = file_stats.st_blksize; - - off_t ret = lseek(fd, 0, SEEK_SET); - if (ret == -1) { - throw std::runtime_error(format("seek error: %s", strerror(errno))); - } - return true; - } - return false; - } -#endif - - void init_fp(const char * mode) { - fp = ggml_fopen(fname.c_str(), mode); + fp = ggml_fopen(fname, mode); if (fp == NULL) { - throw std::runtime_error(format("failed to open %s: %s", fname.c_str(), strerror(errno))); + throw std::runtime_error(format("failed to open %s: %s", fname, strerror(errno))); } seek(0, SEEK_END); size = tell(); @@ -238,62 +226,40 @@ struct llama_file::impl { } } - void read_raw_unsafe(void * ptr, size_t len) { + void read_raw(void * ptr, size_t len) const { if (len == 0) { return; } errno = 0; if (fd == -1) { - const size_t curr_off = tell(); - const size_t to_read = std::min(len, size - curr_off); - - std::size_t ret = std::fread(ptr, to_read, 1, fp); + std::size_t ret = std::fread(ptr, len, 1, fp); if (ferror(fp)) { throw std::runtime_error(format("read error: %s", strerror(errno))); } - if (to_read > 0 && ret != 1) { + if (ret != 1) { throw std::runtime_error("unexpectedly reached end of file"); } } else { - size_t bytes_read = 0; - while (bytes_read < len) { - const size_t to_read = len - bytes_read; - ssize_t ret = ::read(fd, reinterpret_cast(ptr) + bytes_read, to_read); + bool successful = false; + while (!successful) { + off_t ret = read(fd, ptr, len); if (ret == -1) { if (errno == EINTR) { continue; // Interrupted by signal, retry } - // Fallback to std::fread in case the DMA controller cannot access the buffer - if (errno == EFAULT) { - auto curr_off = tell(); - close(fd); - fd = -1; - alignment = 1; - init_fp("rb"); - seek(curr_off, SEEK_SET); - read_raw_unsafe(ptr, len); - return; - } throw std::runtime_error(format("read error: %s", strerror(errno))); } if (ret == 0) { - // EOF: allow if this read was only pulling alignment padding past file end - off_t pos = lseek(fd, 0, SEEK_CUR); - if (pos != -1 && (size_t) pos == size) { - std::memset(reinterpret_cast(ptr) + bytes_read, 0, len - bytes_read); - return; - } throw std::runtime_error("unexpectedly reached end of file"); } - bytes_read += (size_t) ret; + successful = true; } } } - void read_aligned_chunk(void * dest, size_t size) { - size_t offset = tell(); + void read_aligned_chunk(size_t offset, void * dest, size_t size) const { off_t aligned_offset = offset & ~(alignment - 1); off_t offset_from_alignment = offset - aligned_offset; size_t bytes_to_read = (offset_from_alignment + size + alignment - 1) & ~(alignment - 1); @@ -310,21 +276,13 @@ struct llama_file::impl { std::unique_ptr buffer(raw_buffer); seek(aligned_offset, SEEK_SET); - read_raw_unsafe(buffer.get(), bytes_to_read); + read_raw(buffer.get(), bytes_to_read); uintptr_t actual_data = reinterpret_cast(buffer.get()) + offset_from_alignment; memcpy(dest, reinterpret_cast(actual_data), size); } - void read_raw(void * ptr, size_t len) { - if (has_direct_io()) { - read_aligned_chunk(ptr, len); - } else { - read_raw_unsafe(ptr, len); - } - } - - uint32_t read_u32() { + uint32_t read_u32() const { uint32_t ret; read_raw(&ret, sizeof(ret)); return ret; @@ -345,10 +303,6 @@ struct llama_file::impl { write_raw(&val, sizeof(val)); } - bool has_direct_io() const { - return fd != -1 && alignment > 1; - } - ~impl() { if (fd != -1) { close(fd); @@ -357,9 +311,17 @@ struct llama_file::impl { } } int fd = -1; - std::string fname; #endif + void read_raw_at(void * ptr, size_t len, size_t offset) const { + if (alignment != 1) { + read_aligned_chunk(offset, ptr, len); + } else { + seek(offset, SEEK_SET); + read_raw(ptr, len); + } + } + size_t read_alignment() const { return alignment; } @@ -378,7 +340,6 @@ size_t llama_file::tell() const { return pimpl->tell(); } size_t llama_file::size() const { return pimpl->size; } size_t llama_file::read_alignment() const { return pimpl->read_alignment(); } -bool llama_file::has_direct_io() const { return pimpl->has_direct_io(); } int llama_file::file_id() const { #ifdef _WIN32 @@ -393,14 +354,10 @@ int llama_file::file_id() const { } void llama_file::seek(size_t offset, int whence) const { pimpl->seek(offset, whence); } -void llama_file::read_raw(void * ptr, size_t len) { pimpl->read_raw(ptr, len); } -#ifdef _WIN32 -void llama_file::read_raw_unsafe(void * ptr, size_t len) { pimpl->read_raw(ptr, len); } -#else -void llama_file::read_raw_unsafe(void * ptr, size_t len) { pimpl->read_raw_unsafe(ptr, len); } -#endif +void llama_file::read_raw(void * ptr, size_t len) const { pimpl->read_raw(ptr, len); } +void llama_file::read_raw_at(void * ptr, size_t len, size_t offset) const { pimpl->read_raw_at(ptr, len, offset); } -uint32_t llama_file::read_u32() { return pimpl->read_u32(); } +uint32_t llama_file::read_u32() const { return pimpl->read_u32(); } void llama_file::write_raw(const void * ptr, size_t len) const { pimpl->write_raw(ptr, len); } void llama_file::write_u32(uint32_t val) const { pimpl->write_u32(val); } @@ -614,9 +571,9 @@ struct llama_mlock::impl { char* errmsg = std::strerror(errno); bool suggest = (errno == ENOMEM); -#if defined(TARGET_OS_VISION) || defined(TARGET_OS_TV) || defined(_AIX) || defined(__HAIKU__) - // visionOS/tvOS/Haiku don't support RLIMIT_MEMLOCK - // Skip resource limit checks on these platforms +#if defined(TARGET_OS_VISION) || defined(TARGET_OS_TV) || defined(_AIX) + // visionOS/tvOS dont't support RLIMIT_MEMLOCK + // Skip resource limit checks on visionOS/tvOS suggest = false; #else struct rlimit lock_limit; diff --git a/src/llama-mmap.h b/src/llama-mmap.h index 29ce4d2..729aac1 100644 --- a/src/llama-mmap.h +++ b/src/llama-mmap.h @@ -24,16 +24,15 @@ struct llama_file { void seek(size_t offset, int whence) const; - void read_raw(void * ptr, size_t len); - void read_raw_unsafe(void * ptr, size_t len); - void read_aligned_chunk(void * dest, size_t size); - uint32_t read_u32(); + void read_raw(void * ptr, size_t len) const; + void read_raw_at(void * ptr, size_t len, size_t offset) const; + void read_aligned_chunk(size_t offset, void * dest, size_t size) const; + uint32_t read_u32() const; void write_raw(const void * ptr, size_t len) const; void write_u32(uint32_t val) const; size_t read_alignment() const; - bool has_direct_io() const; private: struct impl; std::unique_ptr pimpl; diff --git a/src/llama-model-loader.cpp b/src/llama-model-loader.cpp index 300a322..5003b4f 100644 --- a/src/llama-model-loader.cpp +++ b/src/llama-model-loader.cpp @@ -2,7 +2,6 @@ #include "ggml.h" -#include #include #include #include @@ -345,7 +344,6 @@ namespace GGUFMeta { GGUFMeta::GKV::get_kv(ctx, kid); switch (arr_info.gt) { - case GGUF_TYPE_BOOL: case GGUF_TYPE_UINT32: case GGUF_TYPE_INT32: GGML_ASSERT((std::is_same::value) || (std::is_same::value)); break; @@ -367,13 +365,7 @@ namespace GGUFMeta { result[i] = value; } } else { - if (arr_info.gt == GGUF_TYPE_BOOL) { - std::transform((const bool *)arr_info.data, (const bool *)arr_info.data + arr_info.length, result.begin(), [](bool x) { - return static_cast(x); - }); - } else { - std::copy((const T*)arr_info.data, (const T *)arr_info.data + arr_info.length, result.begin()); - } + std::copy((const T*)arr_info.data, (const T *)arr_info.data + arr_info.length, result.begin()); } return true; @@ -503,7 +495,6 @@ llama_model_loader::llama_model_loader( const std::string & fname, std::vector & splits, bool use_mmap, - bool use_direct_io, bool check_tensors, bool no_alloc, const llama_model_kv_override * param_overrides_p, @@ -536,17 +527,9 @@ llama_model_loader::llama_model_loader( get_key(llm_kv(LLM_KV_GENERAL_ARCHITECTURE), arch_name, false); llm_kv = LLM_KV(llm_arch_from_string(arch_name)); - files.emplace_back(new llama_file(fname.c_str(), "rb", use_direct_io)); + files.emplace_back(new llama_file(fname.c_str(), "rb", !use_mmap)); contexts.emplace_back(ctx); - use_direct_io = use_direct_io && files.back()->has_direct_io(); - - // Disable mmap in case Direct I/O is enabled and available - if (use_direct_io && use_mmap) { - use_mmap = false; - LLAMA_LOG_WARN("%s: direct I/O is enabled, disabling mmap\n", __func__); - } - // Save tensors data offset of the main file. // For subsidiary files, `meta` tensor data offset must not be used, // so we build a unified tensors index for weights. @@ -612,7 +595,7 @@ llama_model_loader::llama_model_loader( } } - files.emplace_back(new llama_file(fname_split, "rb", use_direct_io)); + files.emplace_back(new llama_file(fname_split, "rb", !use_mmap)); contexts.emplace_back(ctx); // Save tensors data offset info of the shard. @@ -756,7 +739,6 @@ llama_model_loader::llama_model_loader( } this->use_mmap = use_mmap; - this->use_direct_io = use_direct_io; this->check_tensors = check_tensors; this->no_alloc = no_alloc; } @@ -1118,8 +1100,7 @@ bool llama_model_loader::load_all_data( const auto & file = files.at(weight->idx); if (ggml_backend_buffer_is_host(cur->buffer)) { - file->seek(weight->offs, SEEK_SET); - file->read_raw(cur->data, n_size); + file->read_raw_at(cur->data, n_size, weight->offs); if (check_tensors) { validation_result.emplace_back(std::async(std::launch::async, [cur, n_size] { return std::make_pair(cur, ggml_validate_row_data(cur->type, cur->data, n_size)); @@ -1151,7 +1132,7 @@ bool llama_model_loader::load_all_data( ggml_backend_event_synchronize(events[buffer_idx]); // Read aligned chunk from file - file->read_raw_unsafe(reinterpret_cast(ptr_dest_aligned), read_size); + file->read_raw(reinterpret_cast(ptr_dest_aligned), read_size); // Calculate actual data portion (excluding alignment padding) uintptr_t ptr_data = ptr_dest_aligned; @@ -1181,8 +1162,7 @@ bool llama_model_loader::load_all_data( } } else { read_buf.resize(n_size); - file->seek(weight->offs, SEEK_SET); - file->read_raw(read_buf.data(), n_size); + file->read_raw_at(read_buf.data(), n_size, weight->offs); ggml_backend_tensor_set(cur, read_buf.data(), 0, n_size); if (check_tensors && !ggml_validate_row_data(cur->type, read_buf.data(), n_size)) { throw std::runtime_error(format("tensor '%s' has invalid data", ggml_get_name(cur))); diff --git a/src/llama-model-loader.h b/src/llama-model-loader.h index 65953dd..d13299a 100644 --- a/src/llama-model-loader.h +++ b/src/llama-model-loader.h @@ -70,7 +70,6 @@ struct llama_model_loader { size_t n_bytes = 0; bool use_mmap = false; - bool use_direct_io = false; bool check_tensors; bool no_alloc; @@ -98,7 +97,6 @@ struct llama_model_loader { const std::string & fname, std::vector & splits, // optional, only need if the split does not follow naming scheme bool use_mmap, - bool use_direct_io, bool check_tensors, bool no_alloc, const llama_model_kv_override * param_overrides_p, diff --git a/src/llama-model-saver.cpp b/src/llama-model-saver.cpp index ae27c71..563823d 100644 --- a/src/llama-model-saver.cpp +++ b/src/llama-model-saver.cpp @@ -146,9 +146,6 @@ void llama_model_saver::add_kv_from_model() { add_kv(LLM_KV_VOCAB_SIZE, vocab.n_tokens()); add_kv(LLM_KV_CONTEXT_LENGTH, hparams.n_ctx_train); add_kv(LLM_KV_EMBEDDING_LENGTH, hparams.n_embd); - if (hparams.n_embd_out > 0) { - add_kv(LLM_KV_EMBEDDING_LENGTH_OUT, hparams.n_embd_out); - } add_kv(LLM_KV_BLOCK_COUNT, hparams.n_layer); add_kv(LLM_KV_LEADING_DENSE_BLOCK_COUNT, hparams.n_layer_dense_lead); add_kv(LLM_KV_FEED_FORWARD_LENGTH, hparams.n_ff_arr, true); diff --git a/src/llama-model.cpp b/src/llama-model.cpp index 94c47dc..0d5bcc6 100644 --- a/src/llama-model.cpp +++ b/src/llama-model.cpp @@ -126,12 +126,10 @@ const char * llm_type_name(llm_type type) { case LLM_TYPE_31B_A3_5B: return "31B.A3.5B"; case LLM_TYPE_80B_A3B: return "80B.A3B"; case LLM_TYPE_100B_A6B: return "100B.A6B"; - case LLM_TYPE_102B_A12B: return "102B.A12B"; case LLM_TYPE_106B_A12B: return "106B.A12B"; case LLM_TYPE_230B_A10B: return "230B.A10B"; case LLM_TYPE_235B_A22B: return "235B.A22B"; case LLM_TYPE_300B_A47B: return "300B.A47B"; - case LLM_TYPE_310B_A15B: return "310B.A15B"; case LLM_TYPE_355B_A32B: return "355B.A32B"; case LLM_TYPE_E2B: return "E2B"; case LLM_TYPE_E4B: return "E4B"; @@ -446,7 +444,7 @@ struct llama_model::impl { llama_mlocks mlock_bufs; llama_mlocks mlock_mmaps; - // contexts where the model tensors metadata is stored as well as the corresponding buffers: + // contexts where the model tensors metadata is stored as well ass the corresponding buffers: std::vector>> ctxs_bufs; buft_list_t cpu_buft_list; @@ -468,11 +466,7 @@ llama_model::llama_model(const llama_model_params & params) : params(params), pi pimpl->has_tensor_overrides = params.tensor_buft_overrides && params.tensor_buft_overrides[0].pattern; } -llama_model::~llama_model() { - for (auto * lora : loras) { - delete lora; - } -} +llama_model::~llama_model() = default; void llama_model::load_stats(llama_model_loader & ml) { pimpl->n_elements = ml.n_elements; @@ -511,7 +505,6 @@ void llama_model::load_hparams(llama_model_loader & ml) { ml.get_key(LLM_KV_CONTEXT_LENGTH, hparams.n_ctx_train); ml.get_key(LLM_KV_EMBEDDING_LENGTH, hparams.n_embd); - ml.get_key(LLM_KV_EMBEDDING_LENGTH_OUT, hparams.n_embd_out, false); ml.get_key(LLM_KV_BLOCK_COUNT, hparams.n_layer); ml.get_key(LLM_KV_EXPERT_COUNT, hparams.n_expert, false); ml.get_key(LLM_KV_EXPERT_USED_COUNT, hparams.n_expert_used, false); @@ -583,7 +576,6 @@ void llama_model::load_hparams(llama_model_loader & ml) { hparams.rope_scaling_type_train = llama_rope_scaling_type_from_string(rope_scaling); GGML_ASSERT(hparams.rope_scaling_type_train != LLAMA_ROPE_SCALING_TYPE_UNSPECIFIED); - // TODO: Handle SWA metadata similarly when models start implementing it // rope_freq_scale (inverse of the kv) is optional float ropescale = 0.0f; if (!ml.get_key(LLM_KV_ROPE_SCALING_FACTOR, ropescale, false)) { @@ -592,6 +584,10 @@ void llama_model::load_hparams(llama_model_loader & ml) { } hparams.rope_freq_scale_train = ropescale == 0.0f ? 1.0f : 1.0f/ropescale; + // by default assume that the sliding-window layers use the same scaling type as the non-sliding-window layers + hparams.rope_freq_base_train_swa = hparams.rope_freq_base_train; + hparams.rope_freq_scale_train_swa = hparams.rope_freq_scale_train; + ml.get_key(LLM_KV_ROPE_SCALING_ATTN_FACTOR, hparams.rope_attn_factor, false); // non-transformer models do not have attention heads @@ -610,7 +606,7 @@ void llama_model::load_hparams(llama_model_loader & ml) { ml.get_key(LLM_KV_ROPE_DIMENSION_COUNT, hparams.n_rot, false); - if (arch == LLM_ARCH_LLAMA || arch == LLM_ARCH_DECI || arch == LLM_ARCH_FALCON || arch == LLM_ARCH_LLAMA_EMBED) { + if (arch == LLM_ARCH_LLAMA || arch == LLM_ARCH_DECI || arch == LLM_ARCH_FALCON) { if (hparams.n_rot != hparams.n_embd_head_k) { throw std::runtime_error(format("invalid n_rot: %u, expected %u", hparams.n_rot, hparams.n_embd_head_k)); } @@ -634,7 +630,6 @@ void llama_model::load_hparams(llama_model_loader & ml) { // arch-specific KVs switch (arch) { case LLM_ARCH_LLAMA: - case LLM_ARCH_LLAMA_EMBED: { ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps); @@ -679,10 +674,6 @@ void llama_model::load_hparams(llama_model_loader & ml) { hparams.f_attn_temp_scale = 0.1f; hparams.f_attn_temp_offset = 1.0f; hparams.set_swa_pattern(4); // pattern: 3 chunked - 1 full - - hparams.rope_freq_base_train_swa = hparams.rope_freq_base_train; - hparams.rope_freq_scale_train_swa = hparams.rope_freq_scale_train; - ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa, false); } switch (hparams.n_expert) { @@ -728,10 +719,6 @@ void llama_model::load_hparams(llama_model_loader & ml) { if (hparams.n_swa > 0) { hparams.swa_type = LLAMA_SWA_TYPE_STANDARD; hparams.set_swa_pattern(4); - - hparams.rope_freq_base_train_swa = hparams.rope_freq_base_train; - hparams.rope_freq_scale_train_swa = hparams.rope_freq_scale_train; - ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa, false); } else { hparams.swa_type = LLAMA_SWA_TYPE_NONE; } @@ -1120,14 +1107,6 @@ void llama_model::load_hparams(llama_model_loader & ml) { default: type = LLM_TYPE_UNKNOWN; } } break; - case LLM_ARCH_MAINCODER: - { - ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps); - switch (hparams.n_layer) { - case 32: type = LLM_TYPE_1B; break; - default: type = LLM_TYPE_UNKNOWN; - } - } break; case LLM_ARCH_QWEN3VL: { ml.get_key(LLM_KV_NUM_DEEPSTACK_LAYERS, hparams.n_deepstack_layers, false); @@ -1246,25 +1225,6 @@ void llama_model::load_hparams(llama_model_loader & ml) { ml.get_key(LLM_KV_ATTENTION_KEY_LENGTH, hparams.n_embd_head_k, false); ml.get_key(LLM_KV_ATTENTION_VALUE_LENGTH, hparams.n_embd_head_v, false); } break; - case LLM_ARCH_PLAMO3: - { - ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps); - const bool found_swa = ml.get_key(LLM_KV_ATTENTION_SLIDING_WINDOW, hparams.n_swa, false); - if (found_swa && hparams.n_swa > 0) { - uint32_t swa_period = 8; - hparams.swa_type = LLAMA_SWA_TYPE_STANDARD; - ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa); - ml.get_key_or_arr(LLM_KV_ATTENTION_SLIDING_WINDOW_PATTERN, swa_period, false); - hparams.set_swa_pattern(swa_period); - } else { - hparams.swa_type = LLAMA_SWA_TYPE_NONE; - } - - switch (hparams.n_layer) { - case 24: type = LLM_TYPE_2B; break; - default: type = LLM_TYPE_UNKNOWN; - } - } break; case LLM_ARCH_GPT2: { ml.get_key(LLM_KV_ATTENTION_LAYERNORM_EPS, hparams.f_norm_eps); @@ -1318,10 +1278,7 @@ void llama_model::load_hparams(llama_model_loader & ml) { hparams.n_swa = 4096; // default value of gemma 2 hparams.set_swa_pattern(2); hparams.attn_soft_cap = true; - hparams.rope_freq_base_train_swa = hparams.rope_freq_base_train; - hparams.rope_freq_scale_train_swa = hparams.rope_freq_scale_train; - ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa, false); ml.get_key(LLM_KV_ATTENTION_SLIDING_WINDOW, hparams.n_swa, false); ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps); ml.get_key(LLM_KV_ATTN_LOGIT_SOFTCAPPING, hparams.f_attn_logit_softcapping, false); @@ -1346,7 +1303,8 @@ void llama_model::load_hparams(llama_model_loader & ml) { hparams.swa_type = LLAMA_SWA_TYPE_STANDARD; hparams.set_swa_pattern(6); - ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa, false); + hparams.rope_freq_base_train_swa = 10000.0f; + hparams.rope_freq_scale_train_swa = 1.0f; } else { hparams.swa_type = LLAMA_SWA_TYPE_NONE; } @@ -1376,9 +1334,10 @@ void llama_model::load_hparams(llama_model_loader & ml) { hparams.set_swa_pattern(5); hparams.n_layer_kv_from_start = 20; + hparams.rope_freq_base_train_swa = 10000.0f; + hparams.rope_freq_scale_train_swa = 1.0f; hparams.f_attention_scale = 1.0f; - ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa, false); ml.get_key(LLM_KV_ATTENTION_SLIDING_WINDOW, hparams.n_swa); ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps); @@ -1394,8 +1353,9 @@ void llama_model::load_hparams(llama_model_loader & ml) { hparams.set_swa_pattern(6); hparams.causal_attn = false; // embeddings do not use causal attention + hparams.rope_freq_base_train_swa = 10000.0f; + hparams.rope_freq_scale_train_swa = 1.0f; - ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa, false); ml.get_key(LLM_KV_ATTENTION_SLIDING_WINDOW, hparams.n_swa); ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps); ml.get_key(LLM_KV_POOLING_TYPE, hparams.pooling_type); @@ -1534,10 +1494,7 @@ void llama_model::load_hparams(llama_model_loader & ml) { { hparams.swa_type = LLAMA_SWA_TYPE_STANDARD; hparams.set_swa_pattern(4); - hparams.rope_freq_base_train_swa = hparams.rope_freq_base_train; - hparams.rope_freq_scale_train_swa = hparams.rope_freq_scale_train; - ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa, false); ml.get_key(LLM_KV_ATTENTION_SLIDING_WINDOW, hparams.n_swa); ml.get_key(LLM_KV_LOGIT_SCALE, hparams.f_logit_scale); ml.get_key(LLM_KV_ATTENTION_LAYERNORM_EPS, hparams.f_norm_eps); @@ -1576,10 +1533,6 @@ void llama_model::load_hparams(llama_model_loader & ml) { if (found_swa && hparams.n_swa > 0) { hparams.swa_type = LLAMA_SWA_TYPE_STANDARD; hparams.set_swa_pattern(4); - - hparams.rope_freq_base_train_swa = hparams.rope_freq_base_train; - hparams.rope_freq_scale_train_swa = 1.0; // See olmo2.cpp - ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa, false); } else { hparams.swa_type = LLAMA_SWA_TYPE_NONE; } @@ -1707,7 +1660,7 @@ void llama_model::load_hparams(llama_model_loader & ml) { ml.get_key(LLM_KV_ATTENTION_VALUE_LENGTH_MLA, hparams.n_embd_head_v_mla, false); ml.get_key(LLM_KV_EXPERT_FEED_FORWARD_LENGTH, hparams.n_ff_exp); ml.get_key(LLM_KV_EXPERT_SHARED_COUNT, hparams.n_expert_shared); - ml.get_key(LLM_KV_EXPERT_WEIGHTS_SCALE, hparams.expert_weights_scale, false); + ml.get_key(LLM_KV_EXPERT_WEIGHTS_SCALE, hparams.expert_weights_scale); ml.get_key(LLM_KV_EXPERT_WEIGHTS_NORM, hparams.expert_weights_norm, false); ml.get_key(LLM_KV_EXPERT_GATING_FUNC, hparams.expert_gating_func, false); if (hparams.expert_gating_func == LLAMA_EXPERT_GATING_FUNC_TYPE_NONE) { @@ -1803,7 +1756,6 @@ void llama_model::load_hparams(llama_model_loader & ml) { switch (hparams.n_layer) { case 47: type = LLM_TYPE_106B_A12B; break; // GLM-4.5-Air (46 layers + 1 NextN layer) - case 48: type = LLM_TYPE_102B_A12B; break; // Solar Open case 93: type = LLM_TYPE_355B_A32B; break; // GLM-4.5 (92 layers + 1 NextN layer) default: type = LLM_TYPE_UNKNOWN; } @@ -1922,10 +1874,6 @@ void llama_model::load_hparams(llama_model_loader & ml) { hparams.swa_type = LLAMA_SWA_TYPE_STANDARD; hparams.n_swa = 4096; hparams.set_swa_pattern(4); - - hparams.rope_freq_base_train_swa = hparams.rope_freq_base_train; - hparams.rope_freq_scale_train_swa = hparams.rope_freq_scale_train; - ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa, false); } ml.get_key(LLM_KV_ATTENTION_SLIDING_WINDOW, hparams.n_swa, false); @@ -1937,34 +1885,6 @@ void llama_model::load_hparams(llama_model_loader & ml) { default: type = LLM_TYPE_UNKNOWN; } } break; - case LLM_ARCH_EXAONE_MOE: - { - hparams.swa_type = LLAMA_SWA_TYPE_STANDARD; - hparams.n_swa = 128; - hparams.set_swa_pattern(4); - hparams.rope_freq_base_train_swa = hparams.rope_freq_base_train; - hparams.rope_freq_scale_train_swa = hparams.rope_freq_scale_train; - - ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa, false); - ml.get_key(LLM_KV_ATTENTION_SLIDING_WINDOW, hparams.n_swa); - ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps); - ml.get_key(LLM_KV_EXPERT_SHARED_COUNT, hparams.n_expert_shared, false); - ml.get_key(LLM_KV_EXPERT_FEED_FORWARD_LENGTH, hparams.n_ff_exp); - ml.get_key(LLM_KV_EXPERT_SHARED_FEED_FORWARD_LENGTH, hparams.n_ff_shexp, false); - ml.get_key(LLM_KV_EXPERT_GATING_FUNC, hparams.expert_gating_func); - ml.get_key(LLM_KV_EXPERT_WEIGHTS_SCALE, hparams.expert_weights_scale, false); - ml.get_key(LLM_KV_EXPERT_WEIGHTS_NORM, hparams.expert_weights_norm, false); - ml.get_key(LLM_KV_LEADING_DENSE_BLOCK_COUNT, hparams.n_layer_dense_lead); - - ml.get_key(LLM_KV_NEXTN_PREDICT_LAYERS, hparams.nextn_predict_layers, false); - - switch (hparams.n_layer) { - case 32: type = LLM_TYPE_30B_A3B; break; - case 48: - case 49: type = LLM_TYPE_235B_A22B; break; - default: type = LLM_TYPE_UNKNOWN; - } - } break; case LLM_ARCH_RWKV6: case LLM_ARCH_RWKV6QWEN2: { @@ -2256,10 +2176,6 @@ void llama_model::load_hparams(llama_model_loader & ml) { hparams.swa_type = LLAMA_SWA_TYPE_STANDARD; hparams.set_swa_pattern(2); - hparams.rope_freq_base_train_swa = hparams.rope_freq_base_train; - hparams.rope_freq_scale_train_swa = hparams.rope_freq_scale_train; - ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa, false); - switch (hparams.n_layer) { case 24: type = LLM_TYPE_20B; break; case 36: type = LLM_TYPE_120B; break; @@ -2304,10 +2220,6 @@ void llama_model::load_hparams(llama_model_loader & ml) { hparams.swa_type = LLAMA_SWA_TYPE_STANDARD; hparams.n_swa = 4096; hparams.set_swa_pattern(4, true); - - hparams.rope_freq_base_train_swa = hparams.rope_freq_base_train; - hparams.rope_freq_scale_train_swa = hparams.rope_freq_scale_train; - ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa, false); } else { hparams.swa_type = LLAMA_SWA_TYPE_NONE; hparams.n_no_rope_layer_step = hparams.n_layer; @@ -2426,22 +2338,6 @@ void llama_model::load_hparams(llama_model_loader & ml) { default: type = LLM_TYPE_UNKNOWN; } } break; - case LLM_ARCH_MIMO2: - { - ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps); - - hparams.swa_type = LLAMA_SWA_TYPE_STANDARD; - - ml.get_key(LLM_KV_EXPERT_FEED_FORWARD_LENGTH, hparams.n_ff_exp); - ml.get_key(LLM_KV_ATTENTION_SLIDING_WINDOW, hparams.n_swa); - ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa); - ml.get_key_or_arr(LLM_KV_ATTENTION_SLIDING_WINDOW_PATTERN, hparams.swa_layers, hparams.n_layer); - - switch (hparams.n_layer) { - case 48: type = LLM_TYPE_310B_A15B; break; - default: type = LLM_TYPE_UNKNOWN; - } - } break; default: throw std::runtime_error("unsupported model architecture"); } @@ -2464,16 +2360,15 @@ void llama_model::load_vocab(llama_model_loader & ml) { bool llama_model::load_tensors(llama_model_loader & ml) { const auto & split_mode = params.split_mode; + const auto & n_gpu_layers = params.n_gpu_layers; const auto & use_mlock = params.use_mlock; const auto & tensor_split = params.tensor_split; - const int n_layer = hparams.n_layer; - const int n_gpu_layers = this->n_gpu_layers(); + const int n_layer = hparams.n_layer; const bool use_mmap_buffer = true; - LLAMA_LOG_INFO("%s: loading model tensors, this can take a while... (mmap = %s, direct_io = %s)\n", - __func__, ml.use_mmap ? "true" : "false", ml.use_direct_io ? "true" : "false"); + LLAMA_LOG_INFO("%s: loading model tensors, this can take a while... (mmap = %s)\n", __func__, ml.use_mmap ? "true" : "false"); // build a list of buffer types for the CPU and GPU devices pimpl->cpu_buft_list = make_cpu_buft_list(devices, params.use_extra_bufts, params.no_host); @@ -2484,11 +2379,6 @@ bool llama_model::load_tensors(llama_model_loader & ml) { pimpl->gpu_buft_list.emplace(dev, std::move(buft_list)); } - ggml_backend_dev_t cpu_dev = ggml_backend_dev_by_type(GGML_BACKEND_DEVICE_TYPE_CPU); - if (cpu_dev == nullptr) { - throw std::runtime_error(format("%s: no CPU backend found", __func__)); - } - // calculate the split points bool all_zero = tensor_split == nullptr || std::all_of(tensor_split, tensor_split + n_devices(), [](float x) { return x == 0.0f; }); std::vector splits(n_devices()); @@ -2499,13 +2389,6 @@ bool llama_model::load_tensors(llama_model_loader & ml) { size_t total; size_t free; ggml_backend_dev_memory(dev, &free, &total); - - // devices can return 0 bytes for free and total memory if they do not - // have any to report. in this case, we will use the host memory as a fallback - // fixes: https://github.com/ggml-org/llama.cpp/issues/18577 - if (free == 0 && total == 0) { - ggml_backend_dev_memory(cpu_dev, &free, &total); - } splits[i] = free; } } else { @@ -2522,6 +2405,10 @@ bool llama_model::load_tensors(llama_model_loader & ml) { splits[i] /= split_sum; } + ggml_backend_dev_t cpu_dev = ggml_backend_dev_by_type(GGML_BACKEND_DEVICE_TYPE_CPU); + if (cpu_dev == nullptr) { + throw std::runtime_error(format("%s: no CPU backend found", __func__)); + } const int i_gpu_start = std::max(int(hparams.n_layer) + 1 - n_gpu_layers, 0); const int act_gpu_layers = devices.empty() ? 0 : std::min(n_gpu_layers, int(n_layer) + 1); auto get_layer_buft_list = [&](int il) -> llama_model::impl::layer_dev { @@ -2765,7 +2652,6 @@ bool llama_model::load_tensors(llama_model_loader & ml) { case LLM_ARCH_GRANITE: case LLM_ARCH_GRANITE_MOE: case LLM_ARCH_MISTRAL3: - case LLM_ARCH_LLAMA_EMBED: { tok_embd = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, 0); @@ -3395,14 +3281,7 @@ bool llama_model::load_tensors(llama_model_loader & ml) { layer.attn_norm_2_b = create_tensor(tn(LLM_TENSOR_ATTN_NORM_2, "bias", i), {n_embd}, TENSOR_NOT_REQUIRED); layer.ffn_gate = create_tensor(tn(LLM_TENSOR_FFN_GATE, "weight", i), {n_embd, n_ff}, TENSOR_NOT_REQUIRED); - - const auto tn_ffn_up_weight = tn(LLM_TENSOR_FFN_UP, "weight", i); - ggml_tensor * t_ffn_up = ml.get_tensor_meta(tn_ffn_up_weight.str().c_str()); - const int64_t n_ffn_up = t_ffn_up ? t_ffn_up->ne[1] : n_ff; - - GGML_ASSERT(n_ffn_up == n_ff || n_ffn_up == n_ff * 2); - layer.ffn_up = create_tensor(tn_ffn_up_weight, {n_embd, n_ffn_up}, 0); - layer.ffn_up_b = create_tensor(tn(LLM_TENSOR_FFN_UP, "bias", i), {n_ffn_up}, TENSOR_NOT_REQUIRED); + layer.ffn_up = create_tensor(tn(LLM_TENSOR_FFN_UP, "weight", i), {n_embd, layer.ffn_gate ? n_ff : n_ff * 2}, 0); layer.ffn_down = create_tensor(tn(LLM_TENSOR_FFN_DOWN, "weight", i), {n_ff, n_embd}, 0); layer.ffn_down_b = create_tensor(tn(LLM_TENSOR_FFN_DOWN, "bias", i), {n_embd}, 0); @@ -3930,44 +3809,6 @@ bool llama_model::load_tensors(llama_model_loader & ml) { layer.ffn_post_norm = create_tensor(tn(LLM_TENSOR_FFN_POST_NORM, i), {n_embd}, 0); } } break; - case LLM_ARCH_PLAMO3: - { - const int64_t head_dim_q = hparams.n_embd_head_k; - const int64_t head_dim_v = hparams.n_embd_head_v; - - tok_embd = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, 0); - - output_norm = create_tensor(tn(LLM_TENSOR_OUTPUT_NORM, "weight"), {n_embd}, 0); - output = create_tensor(tn(LLM_TENSOR_OUTPUT, "weight"), {n_embd, n_vocab}, TENSOR_NOT_REQUIRED); - if (output == NULL) { - output = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, TENSOR_DUPLICATED); - } - - for (int i = 0; i < n_layer; ++i) { - auto & layer = layers[i]; - - const int64_t num_attention_heads = hparams.n_head(i); - const int64_t num_key_value_heads = hparams.n_head_kv(i); - const int64_t q_proj_dim = num_attention_heads * head_dim_q; - const int64_t k_proj_dim = num_key_value_heads * head_dim_q; - const int64_t v_proj_dim = num_key_value_heads * head_dim_v; - const int64_t n_ff_cur = hparams.n_ff(i); - - layer.attn_norm = create_tensor(tn(LLM_TENSOR_ATTN_NORM, "weight", i), {n_embd}, 0); - layer.wqkv = create_tensor(tn(LLM_TENSOR_ATTN_QKV, "weight", i), - {n_embd,q_proj_dim + k_proj_dim + v_proj_dim}, 0); - layer.attn_q_norm = create_tensor(tn(LLM_TENSOR_ATTN_Q_NORM, "weight", i), {head_dim_q}, 0); - layer.attn_k_norm = create_tensor(tn(LLM_TENSOR_ATTN_K_NORM, "weight", i), {head_dim_q}, 0); - layer.wo = create_tensor(tn(LLM_TENSOR_ATTN_OUT, "weight", i), {num_attention_heads * head_dim_v, n_embd}, 0); - layer.attn_post_norm = create_tensor(tn(LLM_TENSOR_ATTN_POST_NORM, i), {n_embd}, 0); - - layer.ffn_norm = create_tensor(tn(LLM_TENSOR_FFN_NORM, "weight", i), {n_embd}, 0); - layer.ffn_post_norm = create_tensor(tn(LLM_TENSOR_FFN_POST_NORM, i), {n_embd}, 0); - - layer.ffn_up = create_tensor(tn(LLM_TENSOR_FFN_UP, "weight", i), {n_embd, n_ff_cur * 2}, 0); - layer.ffn_down = create_tensor(tn(LLM_TENSOR_FFN_DOWN, "weight", i), {n_ff_cur, n_embd}, 0); - } - } break; case LLM_ARCH_GPT2: { tok_embd = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, 0); @@ -4858,11 +4699,7 @@ bool llama_model::load_tensors(llama_model_loader & ml) { // output output_norm = create_tensor(tn(LLM_TENSOR_OUTPUT_NORM, "weight"), {n_embd}, 0); - // try to load output.weight, if not found, use token_embd (tied embeddings) - output = create_tensor(tn(LLM_TENSOR_OUTPUT, "weight"), {n_embd, n_vocab}, TENSOR_NOT_REQUIRED); - if (!output) { - output = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, TENSOR_DUPLICATED); - } + output = create_tensor(tn(LLM_TENSOR_OUTPUT, "weight"), {n_embd, n_vocab}, 0); for (int i = 0; i < n_layer; ++i) { auto & layer = layers[i]; @@ -4925,11 +4762,7 @@ bool llama_model::load_tensors(llama_model_loader & ml) { // output output_norm = create_tensor(tn(LLM_TENSOR_OUTPUT_NORM, "weight"), {n_embd}, 0); - // try to load output.weight, if not found, use token_embd (tied embeddings) - output = create_tensor(tn(LLM_TENSOR_OUTPUT, "weight"), {n_embd, n_vocab}, TENSOR_NOT_REQUIRED); - if (!output) { - output = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, TENSOR_DUPLICATED); - } + output = create_tensor(tn(LLM_TENSOR_OUTPUT, "weight"), {n_embd, n_vocab}, 0); for (int i = 0; i < n_layer; ++i) { auto & layer = layers[i]; @@ -5296,9 +5129,9 @@ bool llama_model::load_tensors(llama_model_loader & ml) { layer.wq = create_tensor(tn(LLM_TENSOR_ATTN_Q, "weight", i), { n_embd, n_embd_head_k * n_head }, flags); layer.wk = create_tensor(tn(LLM_TENSOR_ATTN_K, "weight", i), { n_embd, n_embd_k_gqa }, flags); layer.wv = create_tensor(tn(LLM_TENSOR_ATTN_V, "weight", i), { n_embd, n_embd_v_gqa }, flags); - layer.bq = create_tensor(tn(LLM_TENSOR_ATTN_Q, "bias", i), { n_embd_head_k * n_head }, TENSOR_NOT_REQUIRED | flags); - layer.bk = create_tensor(tn(LLM_TENSOR_ATTN_K, "bias", i), { n_embd_k_gqa }, TENSOR_NOT_REQUIRED | flags); - layer.bv = create_tensor(tn(LLM_TENSOR_ATTN_V, "bias", i), { n_embd_v_gqa }, TENSOR_NOT_REQUIRED | flags); + layer.bq = create_tensor(tn(LLM_TENSOR_ATTN_Q, "bias", i), { n_embd_head_k * n_head }, flags); + layer.bk = create_tensor(tn(LLM_TENSOR_ATTN_K, "bias", i), { n_embd_k_gqa }, flags); + layer.bv = create_tensor(tn(LLM_TENSOR_ATTN_V, "bias", i), { n_embd_v_gqa }, flags); layer.wo = create_tensor(tn(LLM_TENSOR_ATTN_OUT, "weight", i), { n_embd_head_k * n_head, n_embd }, flags); @@ -5548,84 +5381,6 @@ bool llama_model::load_tensors(llama_model_loader & ml) { layer.ffn_post_norm = create_tensor(tn(LLM_TENSOR_FFN_POST_NORM, "weight", i), {n_embd}, 0); } } break; - case LLM_ARCH_EXAONE_MOE: - { - const int64_t n_ff_exp = hparams.n_ff_exp; - const int64_t n_expert = hparams.n_expert; - const int64_t n_expert_used = hparams.n_expert_used; - const int64_t n_ff_shexp = hparams.n_ff_shexp; - const int64_t head_dim = hparams.n_embd_head_k; - const int64_t n_qo_dim = n_head * head_dim; - const int64_t n_kv_dim = n_head_kv * head_dim; - - tok_embd = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, 0); - - // output - output_norm = create_tensor(tn(LLM_TENSOR_OUTPUT_NORM, "weight"), {n_embd}, 0); - output = create_tensor(tn(LLM_TENSOR_OUTPUT, "weight"), {n_embd, n_vocab}, 0); - - if (output == NULL) { - output = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, TENSOR_DUPLICATED); - } - - for (int i = 0; i < n_layer; ++i) { - int flags = 0; - if (hparams.nextn_predict_layers > 0 && static_cast(i) >= n_layer - hparams.nextn_predict_layers) { - // skip all tensors in the NextN layers - flags |= TENSOR_SKIP; - } - - auto & layer = layers[i]; - layer.wq = create_tensor(tn(LLM_TENSOR_ATTN_Q, "weight", i), {n_embd, n_qo_dim}, flags); - layer.wk = create_tensor(tn(LLM_TENSOR_ATTN_K, "weight", i), {n_embd, n_kv_dim}, flags); - layer.wv = create_tensor(tn(LLM_TENSOR_ATTN_V, "weight", i), {n_embd, n_kv_dim}, flags); - layer.wo = create_tensor(tn(LLM_TENSOR_ATTN_OUT, "weight", i), {n_qo_dim, n_embd}, flags); - - layer.rope_freqs = create_tensor(tn(LLM_TENSOR_ROPE_FREQS, "weight", i), {n_rot/2}, TENSOR_NOT_REQUIRED | (i != 0 ? TENSOR_DUPLICATED : 0) | flags); - - layer.attn_norm = create_tensor(tn(LLM_TENSOR_ATTN_NORM, "weight", i), {n_embd}, flags); - layer.attn_q_norm = create_tensor(tn(LLM_TENSOR_ATTN_Q_NORM, "weight", i), {n_embd_head_k}, flags); - layer.attn_k_norm = create_tensor(tn(LLM_TENSOR_ATTN_K_NORM, "weight", i), {n_embd_head_k}, flags); - - layer.ffn_norm = create_tensor(tn(LLM_TENSOR_FFN_NORM, "weight", i), {n_embd}, flags); - - // dense layers for first n_layer_dense_lead layers or nextn_predict_layers layers at the end - if (i < (int) hparams.n_layer_dense_lead || (hparams.nextn_predict_layers > 0 && static_cast(i) >= n_layer - hparams.nextn_predict_layers)) { - layer.ffn_gate = create_tensor(tn(LLM_TENSOR_FFN_GATE, "weight", i), {n_embd, n_ff}, flags); - layer.ffn_down = create_tensor(tn(LLM_TENSOR_FFN_DOWN, "weight", i), {n_ff, n_embd}, flags); - layer.ffn_up = create_tensor(tn(LLM_TENSOR_FFN_UP, "weight", i), {n_embd, n_ff}, flags); - } else { - layer.ffn_gate_inp = create_tensor(tn(LLM_TENSOR_FFN_GATE_INP, "weight", i), {n_embd, n_expert}, flags); - layer.ffn_exp_probs_b = create_tensor(tn(LLM_TENSOR_FFN_EXP_PROBS_B, "bias", i), {n_expert}, TENSOR_NOT_REQUIRED | flags); - - if (n_expert == 0) { - throw std::runtime_error("n_expert must be > 0"); - } - if (n_expert_used == 0) { - throw std::runtime_error("n_expert_used must be > 0"); - } - - layer.ffn_gate_exps = create_tensor(tn(LLM_TENSOR_FFN_GATE_EXPS, "weight", i), {n_embd, n_ff_exp, n_expert}, flags); - layer.ffn_down_exps = create_tensor(tn(LLM_TENSOR_FFN_DOWN_EXPS, "weight", i), {n_ff_exp, n_embd, n_expert}, flags); - layer.ffn_up_exps = create_tensor(tn(LLM_TENSOR_FFN_UP_EXPS, "weight", i), {n_embd, n_ff_exp, n_expert}, flags); - - layer.ffn_gate_shexp = create_tensor(tn(LLM_TENSOR_FFN_GATE_SHEXP, "weight", i), {n_embd, n_ff_shexp}, flags); - layer.ffn_down_shexp = create_tensor(tn(LLM_TENSOR_FFN_DOWN_SHEXP, "weight", i), {n_ff_shexp, n_embd}, flags); - layer.ffn_up_shexp = create_tensor(tn(LLM_TENSOR_FFN_UP_SHEXP, "weight", i), {n_embd, n_ff_shexp}, flags); - } - - // NextN/MTP tensors (preserved but unused) - conditionally load for last nextn_predict_layers - if (hparams.nextn_predict_layers > 0 && static_cast(i) >= n_layer - hparams.nextn_predict_layers) { - layer.nextn.eh_proj = create_tensor(tn(LLM_TENSOR_NEXTN_EH_PROJ, "weight", i), {2 * n_embd, n_embd}, flags); - layer.nextn.enorm = create_tensor(tn(LLM_TENSOR_NEXTN_ENORM, "weight", i), {n_embd}, flags); - layer.nextn.hnorm = create_tensor(tn(LLM_TENSOR_NEXTN_HNORM, "weight", i), {n_embd}, flags); - - layer.nextn.shared_head_norm = create_tensor(tn(LLM_TENSOR_NEXTN_SHARED_HEAD_NORM, "weight", i), {n_embd}, flags | TENSOR_NOT_REQUIRED); - layer.nextn.embed_tokens = create_tensor(tn(LLM_TENSOR_NEXTN_EMBED_TOKENS, "weight", i), {n_embd, n_vocab}, flags | TENSOR_NOT_REQUIRED); - layer.nextn.shared_head_head = create_tensor(tn(LLM_TENSOR_NEXTN_SHARED_HEAD_HEAD, "weight", i), {n_embd, n_vocab}, flags | TENSOR_NOT_REQUIRED); - } - } - } break; case LLM_ARCH_RWKV6: { tok_embd = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, 0); @@ -6589,9 +6344,6 @@ bool llama_model::load_tensors(llama_model_loader & ml) { layer.shortconv.out_proj = create_tensor(tn(LLM_TENSOR_SHORTCONV_OUTPROJ, "weight", i), {n_embd, n_embd}, 0); } } - - // for LFM2-ColBert-350M - dense_2_out_layers = create_tensor(tn(LLM_TENSOR_DENSE_2_OUT, "weight"), {n_embd, hparams.get_n_embd_out()}, TENSOR_NOT_REQUIRED); } break; case LLM_ARCH_SMALLTHINKER: { @@ -6873,10 +6625,7 @@ bool llama_model::load_tensors(llama_model_loader & ml) { } else { // Linear attention (gated delta net) specific tensors // Create tensors with calculated dimensions - // note: ssm_in is used by legacy GGUF - layer.ssm_in = create_tensor(tn(LLM_TENSOR_SSM_IN, "weight", i), { n_embd, qkvz_dim }, TENSOR_NOT_REQUIRED); - layer.wqkv = create_tensor(tn(LLM_TENSOR_ATTN_QKV, "weight", i), { n_embd, key_dim * 2 + value_dim }, TENSOR_NOT_REQUIRED); - layer.wqkv_gate = create_tensor(tn(LLM_TENSOR_ATTN_GATE, "weight", i), { n_embd, value_dim }, TENSOR_NOT_REQUIRED); + layer.ssm_in = create_tensor(tn(LLM_TENSOR_SSM_IN, "weight", i), { n_embd, qkvz_dim }, 0); layer.ssm_conv1d = create_tensor(tn(LLM_TENSOR_SSM_CONV1D, "weight", i), { hparams.ssm_d_conv, conv_dim }, 0); layer.ssm_dt = create_tensor(tn(LLM_TENSOR_SSM_DT, "bias", i), { hparams.ssm_dt_rank }, 0); layer.ssm_a = create_tensor(tn(LLM_TENSOR_SSM_A_NOSCAN, i), { hparams.ssm_dt_rank }, 0); @@ -6897,75 +6646,6 @@ bool llama_model::load_tensors(llama_model_loader & ml) { layer.ffn_down_shexp = create_tensor(tn(LLM_TENSOR_FFN_DOWN_SHEXP, "weight", i), { hparams.n_ff_shexp, n_embd }, 0); } } break; - case LLM_ARCH_MIMO2: - { - tok_embd = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, 0); - - // output - output_norm = create_tensor(tn(LLM_TENSOR_OUTPUT_NORM, "weight"), {n_embd}, 0); - output = create_tensor(tn(LLM_TENSOR_OUTPUT, "weight"), {n_embd, n_vocab}, 0); - - for (int i = 0; i < n_layer; ++i) { - auto & layer = layers[i]; - uint32_t n_embd_k_gqa = hparams.n_embd_k_gqa(i); - uint32_t n_embd_v_gqa = hparams.n_embd_v_gqa(i); - uint32_t n_head = hparams.n_head(i); - - layer.wq = create_tensor(tn(LLM_TENSOR_ATTN_Q, "weight", i), { n_embd, n_embd_head_k * n_head }, 0); - layer.wk = create_tensor(tn(LLM_TENSOR_ATTN_K, "weight", i), { n_embd, n_embd_k_gqa }, 0); - layer.wv = create_tensor(tn(LLM_TENSOR_ATTN_V, "weight", i), { n_embd, n_embd_v_gqa }, 0); - layer.wo = create_tensor(tn(LLM_TENSOR_ATTN_OUT, "weight", i), { n_embd_head_v * n_head, n_embd }, 0); - - layer.attn_norm = create_tensor(tn(LLM_TENSOR_ATTN_NORM, "weight", i), {n_embd}, 0); - layer.attn_sinks = create_tensor(tn(LLM_TENSOR_ATTN_SINKS, "weight", i), {n_head}, TENSOR_NOT_REQUIRED); - - layer.ffn_norm = create_tensor(tn(LLM_TENSOR_FFN_NORM, "weight", i), {n_embd}, 0); - - // non-MoE branch - layer.ffn_gate = create_tensor(tn(LLM_TENSOR_FFN_GATE, "weight", i), {n_embd, n_ff}, TENSOR_NOT_REQUIRED); - layer.ffn_down = create_tensor(tn(LLM_TENSOR_FFN_DOWN, "weight", i), { n_ff, n_embd}, TENSOR_NOT_REQUIRED); - layer.ffn_up = create_tensor(tn(LLM_TENSOR_FFN_UP, "weight", i), {n_embd, n_ff}, TENSOR_NOT_REQUIRED); - - // MoE branch - int64_t n_ff_exp = hparams.n_ff_exp; - layer.ffn_gate_inp = create_tensor(tn(LLM_TENSOR_FFN_GATE_INP, "weight", i), {n_embd, n_expert}, TENSOR_NOT_REQUIRED); - layer.ffn_gate_exps = create_tensor(tn(LLM_TENSOR_FFN_GATE_EXPS, "weight", i), {n_embd, n_ff_exp, n_expert}, TENSOR_NOT_REQUIRED); - layer.ffn_down_exps = create_tensor(tn(LLM_TENSOR_FFN_DOWN_EXPS, "weight", i), {n_ff_exp, n_embd, n_expert}, TENSOR_NOT_REQUIRED); - layer.ffn_up_exps = create_tensor(tn(LLM_TENSOR_FFN_UP_EXPS, "weight", i), {n_embd, n_ff_exp, n_expert}, TENSOR_NOT_REQUIRED); - layer.ffn_exp_probs_b = create_tensor(tn(LLM_TENSOR_FFN_EXP_PROBS_B, "bias", i), {n_expert}, TENSOR_NOT_REQUIRED); - } - } break; - case LLM_ARCH_MAINCODER: - { - tok_embd = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, 0); - - // output - output_norm = create_tensor(tn(LLM_TENSOR_OUTPUT_NORM, "weight"), {n_embd}, 0); - output = create_tensor(tn(LLM_TENSOR_OUTPUT, "weight"), {n_embd, n_vocab}, TENSOR_NOT_REQUIRED); - // if output is NULL, init from the input tok embed - if (output == NULL) { - output = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, TENSOR_DUPLICATED); - } - - for (int i = 0; i < n_layer; ++i) { - auto & layer = layers[i]; - - layer.attn_norm = create_tensor(tn(LLM_TENSOR_ATTN_NORM, "weight", i), {n_embd}, 0); - - layer.wq = create_tensor(tn(LLM_TENSOR_ATTN_Q, "weight", i), {n_embd, n_embd_head_k * n_head}, 0); - layer.wk = create_tensor(tn(LLM_TENSOR_ATTN_K, "weight", i), {n_embd, n_embd_gqa}, 0); - layer.wv = create_tensor(tn(LLM_TENSOR_ATTN_V, "weight", i), {n_embd, n_embd_gqa}, 0); - layer.wo = create_tensor(tn(LLM_TENSOR_ATTN_OUT, "weight", i), {n_embd_head_k * n_head, n_embd}, 0); - - layer.attn_k_norm = create_tensor(tn(LLM_TENSOR_ATTN_K_NORM, "weight", i), {n_embd_head_k}, 0); - layer.attn_q_norm = create_tensor(tn(LLM_TENSOR_ATTN_Q_NORM, "weight", i), {n_embd_head_k}, 0); - - layer.ffn_norm = create_tensor(tn(LLM_TENSOR_FFN_NORM, "weight", i), {n_embd}, 0); - layer.ffn_gate = create_tensor(tn(LLM_TENSOR_FFN_GATE, "weight", i), {n_embd, n_ff}, 0); - layer.ffn_down = create_tensor(tn(LLM_TENSOR_FFN_DOWN, "weight", i), { n_ff, n_embd}, 0); - layer.ffn_up = create_tensor(tn(LLM_TENSOR_FFN_UP, "weight", i), {n_embd, n_ff}, 0); - } - } break; default: throw std::runtime_error("unknown architecture"); } @@ -7147,14 +6827,6 @@ size_t llama_model::n_devices() const { return devices.size(); } -uint32_t llama_model::n_gpu_layers() const { - return params.n_gpu_layers >= 0 ? params.n_gpu_layers : hparams.n_layer + 1; -} - -llama_split_mode llama_model::split_mode() const { - return params.split_mode; -} - std::map llama_model::memory_breakdown() const { std::map ret; for (const auto & [ctx, bufs] : pimpl->ctxs_bufs) { @@ -7211,59 +6883,55 @@ void llama_model::print_info() const { }; // hparams - LLAMA_LOG_INFO("%s: arch = %s\n", __func__, arch_name().c_str()); - LLAMA_LOG_INFO("%s: vocab_only = %d\n", __func__, hparams.vocab_only); - LLAMA_LOG_INFO("%s: no_alloc = %d\n", __func__, hparams.no_alloc); + LLAMA_LOG_INFO("%s: arch = %s\n", __func__, arch_name().c_str()); + LLAMA_LOG_INFO("%s: vocab_only = %d\n", __func__, hparams.vocab_only); + LLAMA_LOG_INFO("%s: no_alloc = %d\n", __func__, hparams.no_alloc); if (!hparams.vocab_only) { - LLAMA_LOG_INFO("%s: n_ctx_train = %u\n", __func__, hparams.n_ctx_train); - LLAMA_LOG_INFO("%s: n_embd = %u\n", __func__, hparams.n_embd); - LLAMA_LOG_INFO("%s: n_embd_inp = %u\n", __func__, hparams.n_embd_inp()); - LLAMA_LOG_INFO("%s: n_layer = %u\n", __func__, hparams.n_layer); - LLAMA_LOG_INFO("%s: n_head = %s\n", __func__, print_f([&](uint32_t il) { return hparams.n_head(il); }, hparams.n_layer).c_str()); - LLAMA_LOG_INFO("%s: n_head_kv = %s\n", __func__, print_f([&](uint32_t il) { return hparams.n_head_kv(il); }, hparams.n_layer).c_str()); - LLAMA_LOG_INFO("%s: n_rot = %u\n", __func__, hparams.n_rot); - LLAMA_LOG_INFO("%s: n_swa = %u\n", __func__, hparams.n_swa); - LLAMA_LOG_INFO("%s: is_swa_any = %u\n", __func__, hparams.is_swa_any()); - LLAMA_LOG_INFO("%s: n_embd_head_k = %u\n", __func__, hparams.n_embd_head_k); - LLAMA_LOG_INFO("%s: n_embd_head_v = %u\n", __func__, hparams.n_embd_head_v); - LLAMA_LOG_INFO("%s: n_gqa = %s\n", __func__, print_f([&](uint32_t il) { return hparams.n_gqa(il); }, hparams.n_layer).c_str()); - LLAMA_LOG_INFO("%s: n_embd_k_gqa = %s\n", __func__, print_f([&](uint32_t il) { return hparams.n_embd_k_gqa(il); }, hparams.n_layer).c_str()); - LLAMA_LOG_INFO("%s: n_embd_v_gqa = %s\n", __func__, print_f([&](uint32_t il) { return hparams.n_embd_v_gqa(il); }, hparams.n_layer).c_str()); - LLAMA_LOG_INFO("%s: f_norm_eps = %.1e\n", __func__, hparams.f_norm_eps); - LLAMA_LOG_INFO("%s: f_norm_rms_eps = %.1e\n", __func__, hparams.f_norm_rms_eps); - LLAMA_LOG_INFO("%s: f_clamp_kqv = %.1e\n", __func__, hparams.f_clamp_kqv); - LLAMA_LOG_INFO("%s: f_max_alibi_bias = %.1e\n", __func__, hparams.f_max_alibi_bias); - LLAMA_LOG_INFO("%s: f_logit_scale = %.1e\n", __func__, hparams.f_logit_scale); - LLAMA_LOG_INFO("%s: f_attn_scale = %.1e\n", __func__, hparams.f_attention_scale); - LLAMA_LOG_INFO("%s: n_ff = %s\n", __func__, print_f([&](uint32_t il) { return hparams.n_ff(il); }, hparams.n_layer).c_str()); - LLAMA_LOG_INFO("%s: n_expert = %u\n", __func__, hparams.n_expert); - LLAMA_LOG_INFO("%s: n_expert_used = %u\n", __func__, hparams.n_expert_used); - LLAMA_LOG_INFO("%s: n_expert_groups = %d\n", __func__, hparams.n_expert_groups); - LLAMA_LOG_INFO("%s: n_group_used = %d\n", __func__, hparams.n_group_used); - LLAMA_LOG_INFO("%s: causal attn = %d\n", __func__, hparams.causal_attn); - LLAMA_LOG_INFO("%s: pooling type = %d\n", __func__, hparams.pooling_type); - LLAMA_LOG_INFO("%s: rope type = %d\n", __func__, hparams.rope_type); - LLAMA_LOG_INFO("%s: rope scaling = %s\n", __func__, rope_scaling_type.c_str()); - LLAMA_LOG_INFO("%s: freq_base_train = %.1f\n", __func__, hparams.rope_freq_base_train); - LLAMA_LOG_INFO("%s: freq_scale_train = %g\n", __func__, hparams.rope_freq_scale_train); - if (hparams.swa_type != LLAMA_SWA_TYPE_NONE) { - LLAMA_LOG_INFO("%s: freq_base_swa = %.1f\n", __func__, hparams.rope_freq_base_train_swa); - LLAMA_LOG_INFO("%s: freq_scale_swa = %g\n", __func__, hparams.rope_freq_scale_train_swa); - } - LLAMA_LOG_INFO("%s: n_ctx_orig_yarn = %u\n", __func__, hparams.n_ctx_orig_yarn); - LLAMA_LOG_INFO("%s: rope_yarn_log_mul = %.4f\n", __func__, hparams.rope_yarn_log_mul); - LLAMA_LOG_INFO("%s: rope_finetuned = %s\n", __func__, hparams.rope_finetuned ? "yes" : "unknown"); + LLAMA_LOG_INFO("%s: n_ctx_train = %u\n", __func__, hparams.n_ctx_train); + LLAMA_LOG_INFO("%s: n_embd = %u\n", __func__, hparams.n_embd); + LLAMA_LOG_INFO("%s: n_embd_inp = %u\n", __func__, hparams.n_embd_inp()); + LLAMA_LOG_INFO("%s: n_layer = %u\n", __func__, hparams.n_layer); + LLAMA_LOG_INFO("%s: n_head = %s\n", __func__, print_f([&](uint32_t il) { return hparams.n_head(il); }, hparams.n_layer).c_str()); + LLAMA_LOG_INFO("%s: n_head_kv = %s\n", __func__, print_f([&](uint32_t il) { return hparams.n_head_kv(il); }, hparams.n_layer).c_str()); + LLAMA_LOG_INFO("%s: n_rot = %u\n", __func__, hparams.n_rot); + LLAMA_LOG_INFO("%s: n_swa = %u\n", __func__, hparams.n_swa); + LLAMA_LOG_INFO("%s: is_swa_any = %u\n", __func__, hparams.is_swa_any()); + LLAMA_LOG_INFO("%s: n_embd_head_k = %u\n", __func__, hparams.n_embd_head_k); + LLAMA_LOG_INFO("%s: n_embd_head_v = %u\n", __func__, hparams.n_embd_head_v); + LLAMA_LOG_INFO("%s: n_gqa = %s\n", __func__, print_f([&](uint32_t il) { return hparams.n_gqa(il); }, hparams.n_layer).c_str()); + LLAMA_LOG_INFO("%s: n_embd_k_gqa = %s\n", __func__, print_f([&](uint32_t il) { return hparams.n_embd_k_gqa(il); }, hparams.n_layer).c_str()); + LLAMA_LOG_INFO("%s: n_embd_v_gqa = %s\n", __func__, print_f([&](uint32_t il) { return hparams.n_embd_v_gqa(il); }, hparams.n_layer).c_str()); + LLAMA_LOG_INFO("%s: f_norm_eps = %.1e\n", __func__, hparams.f_norm_eps); + LLAMA_LOG_INFO("%s: f_norm_rms_eps = %.1e\n", __func__, hparams.f_norm_rms_eps); + LLAMA_LOG_INFO("%s: f_clamp_kqv = %.1e\n", __func__, hparams.f_clamp_kqv); + LLAMA_LOG_INFO("%s: f_max_alibi_bias = %.1e\n", __func__, hparams.f_max_alibi_bias); + LLAMA_LOG_INFO("%s: f_logit_scale = %.1e\n", __func__, hparams.f_logit_scale); + LLAMA_LOG_INFO("%s: f_attn_scale = %.1e\n", __func__, hparams.f_attention_scale); + LLAMA_LOG_INFO("%s: n_ff = %s\n", __func__, print_f([&](uint32_t il) { return hparams.n_ff(il); }, hparams.n_layer).c_str()); + LLAMA_LOG_INFO("%s: n_expert = %u\n", __func__, hparams.n_expert); + LLAMA_LOG_INFO("%s: n_expert_used = %u\n", __func__, hparams.n_expert_used); + LLAMA_LOG_INFO("%s: n_expert_groups = %d\n", __func__, hparams.n_expert_groups); + LLAMA_LOG_INFO("%s: n_group_used = %d\n", __func__, hparams.n_group_used); + LLAMA_LOG_INFO("%s: causal attn = %d\n", __func__, hparams.causal_attn); + LLAMA_LOG_INFO("%s: pooling type = %d\n", __func__, hparams.pooling_type); + LLAMA_LOG_INFO("%s: rope type = %d\n", __func__, hparams.rope_type); + LLAMA_LOG_INFO("%s: rope scaling = %s\n", __func__, rope_scaling_type.c_str()); + LLAMA_LOG_INFO("%s: freq_base_train = %.1f\n", __func__, hparams.rope_freq_base_train); + LLAMA_LOG_INFO("%s: freq_scale_train = %g\n", __func__, hparams.rope_freq_scale_train); + LLAMA_LOG_INFO("%s: n_ctx_orig_yarn = %u\n", __func__, hparams.n_ctx_orig_yarn); + LLAMA_LOG_INFO("%s: rope_yarn_log_mul= %.4f\n", __func__, hparams.rope_yarn_log_mul); + LLAMA_LOG_INFO("%s: rope_finetuned = %s\n", __func__, hparams.rope_finetuned ? "yes" : "unknown"); // MRoPE (Multi-axis Rotary Position Embedding) sections if (const auto & s = hparams.rope_sections; s[0] || s[1] || s[2] || s[3]) { - LLAMA_LOG_INFO("%s: mrope sections = [%d, %d, %d, %d]\n", __func__, s[0], s[1], s[2], s[3]); + LLAMA_LOG_INFO("%s: mrope sections = [%d, %d, %d, %d]\n", __func__, s[0], s[1], s[2], s[3]); } if (!classifier_labels.empty()) { - LLAMA_LOG_INFO("%s: n_cls_out = %u\n", __func__, hparams.n_cls_out); + LLAMA_LOG_INFO("%s: n_cls_out = %u\n", __func__, hparams.n_cls_out); size_t i = 0; for (auto label : classifier_labels) { - LLAMA_LOG_INFO("%s: cls_label[%2zu] = %s\n", __func__, i++, label.c_str()); + LLAMA_LOG_INFO("%s: cls_label[%2zu] = %s\n", __func__, i++, label.c_str()); } } } @@ -7277,55 +6945,55 @@ void llama_model::print_info() const { arch == LLM_ARCH_QWEN3NEXT || arch == LLM_ARCH_NEMOTRON_H || arch == LLM_ARCH_NEMOTRON_H_MOE) { - LLAMA_LOG_INFO("%s: ssm_d_conv = %u\n", __func__, hparams.ssm_d_conv); - LLAMA_LOG_INFO("%s: ssm_d_inner = %u\n", __func__, hparams.ssm_d_inner); - LLAMA_LOG_INFO("%s: ssm_d_state = %u\n", __func__, hparams.ssm_d_state); - LLAMA_LOG_INFO("%s: ssm_dt_rank = %u\n", __func__, hparams.ssm_dt_rank); - LLAMA_LOG_INFO("%s: ssm_n_group = %u\n", __func__, hparams.ssm_n_group); - LLAMA_LOG_INFO("%s: ssm_dt_b_c_rms = %d\n", __func__, hparams.ssm_dt_b_c_rms); + LLAMA_LOG_INFO("%s: ssm_d_conv = %u\n", __func__, hparams.ssm_d_conv); + LLAMA_LOG_INFO("%s: ssm_d_inner = %u\n", __func__, hparams.ssm_d_inner); + LLAMA_LOG_INFO("%s: ssm_d_state = %u\n", __func__, hparams.ssm_d_state); + LLAMA_LOG_INFO("%s: ssm_dt_rank = %u\n", __func__, hparams.ssm_dt_rank); + LLAMA_LOG_INFO("%s: ssm_n_group = %u\n", __func__, hparams.ssm_n_group); + LLAMA_LOG_INFO("%s: ssm_dt_b_c_rms = %d\n", __func__, hparams.ssm_dt_b_c_rms); } - LLAMA_LOG_INFO("%s: model type = %s\n", __func__, type_name().c_str()); + LLAMA_LOG_INFO("%s: model type = %s\n", __func__, type_name().c_str()); if (pimpl->n_elements >= 1e12) { - LLAMA_LOG_INFO("%s: model params = %.2f T\n", __func__, pimpl->n_elements*1e-12); + LLAMA_LOG_INFO("%s: model params = %.2f T\n", __func__, pimpl->n_elements*1e-12); } else if (pimpl->n_elements >= 1e9) { - LLAMA_LOG_INFO("%s: model params = %.2f B\n", __func__, pimpl->n_elements*1e-9); + LLAMA_LOG_INFO("%s: model params = %.2f B\n", __func__, pimpl->n_elements*1e-9); } else if (pimpl->n_elements >= 1e6) { - LLAMA_LOG_INFO("%s: model params = %.2f M\n", __func__, pimpl->n_elements*1e-6); + LLAMA_LOG_INFO("%s: model params = %.2f M\n", __func__, pimpl->n_elements*1e-6); } else { - LLAMA_LOG_INFO("%s: model params = %.2f K\n", __func__, pimpl->n_elements*1e-3); + LLAMA_LOG_INFO("%s: model params = %.2f K\n", __func__, pimpl->n_elements*1e-3); } // general kv - LLAMA_LOG_INFO("%s: general.name = %s\n", __func__, name.c_str()); + LLAMA_LOG_INFO("%s: general.name = %s\n", __func__, name.c_str()); if (arch == LLM_ARCH_DEEPSEEK) { - LLAMA_LOG_INFO("%s: n_layer_dense_lead = %d\n", __func__, hparams.n_layer_dense_lead); - LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); - LLAMA_LOG_INFO("%s: n_expert_shared = %d\n", __func__, hparams.n_expert_shared); - LLAMA_LOG_INFO("%s: expert_weights_scale = %.1f\n", __func__, hparams.expert_weights_scale); + LLAMA_LOG_INFO("%s: n_layer_dense_lead = %d\n", __func__, hparams.n_layer_dense_lead); + LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); + LLAMA_LOG_INFO("%s: n_expert_shared = %d\n", __func__, hparams.n_expert_shared); + LLAMA_LOG_INFO("%s: expert_weights_scale = %.1f\n", __func__, hparams.expert_weights_scale); } if (arch == LLM_ARCH_DEEPSEEK2) { - LLAMA_LOG_INFO("%s: n_layer_dense_lead = %d\n", __func__, hparams.n_layer_dense_lead); - LLAMA_LOG_INFO("%s: n_lora_q = %d\n", __func__, hparams.n_lora_q); - LLAMA_LOG_INFO("%s: n_lora_kv = %d\n", __func__, hparams.n_lora_kv); - LLAMA_LOG_INFO("%s: n_embd_head_k_mla = %d\n", __func__, hparams.n_embd_head_k_mla); - LLAMA_LOG_INFO("%s: n_embd_head_v_mla = %d\n", __func__, hparams.n_embd_head_v_mla); - LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); - LLAMA_LOG_INFO("%s: n_expert_shared = %d\n", __func__, hparams.n_expert_shared); - LLAMA_LOG_INFO("%s: expert_weights_scale = %.1f\n", __func__, hparams.expert_weights_scale); - LLAMA_LOG_INFO("%s: expert_weights_norm = %d\n", __func__, hparams.expert_weights_norm); - LLAMA_LOG_INFO("%s: expert_gating_func = %s\n", __func__, llama_expert_gating_func_name((llama_expert_gating_func_type) hparams.expert_gating_func)); + LLAMA_LOG_INFO("%s: n_layer_dense_lead = %d\n", __func__, hparams.n_layer_dense_lead); + LLAMA_LOG_INFO("%s: n_lora_q = %d\n", __func__, hparams.n_lora_q); + LLAMA_LOG_INFO("%s: n_lora_kv = %d\n", __func__, hparams.n_lora_kv); + LLAMA_LOG_INFO("%s: n_embd_head_k_mla = %d\n", __func__, hparams.n_embd_head_k_mla); + LLAMA_LOG_INFO("%s: n_embd_head_v_mla = %d\n", __func__, hparams.n_embd_head_v_mla); + LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); + LLAMA_LOG_INFO("%s: n_expert_shared = %d\n", __func__, hparams.n_expert_shared); + LLAMA_LOG_INFO("%s: expert_weights_scale = %.1f\n", __func__, hparams.expert_weights_scale); + LLAMA_LOG_INFO("%s: expert_weights_norm = %d\n", __func__, hparams.expert_weights_norm); + LLAMA_LOG_INFO("%s: expert_gating_func = %s\n", __func__, llama_expert_gating_func_name((llama_expert_gating_func_type) hparams.expert_gating_func)); } if (arch == LLM_ARCH_QWEN2MOE) { - LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); - LLAMA_LOG_INFO("%s: n_ff_shexp = %d\n", __func__, hparams.n_ff_shexp); + LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); + LLAMA_LOG_INFO("%s: n_ff_shexp = %d\n", __func__, hparams.n_ff_shexp); } if (arch == LLM_ARCH_QWEN3MOE || arch == LLM_ARCH_OPENAI_MOE || arch == LLM_ARCH_QWEN3VLMOE || arch == LLM_ARCH_RND1) { - LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); + LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); } if (arch == LLM_ARCH_MINICPM || @@ -7333,41 +7001,41 @@ void llama_model::print_info() const { arch == LLM_ARCH_GRANITE_MOE || arch == LLM_ARCH_GRANITE_HYBRID || arch == LLM_ARCH_NEMOTRON_H_MOE) { - LLAMA_LOG_INFO("%s: f_embedding_scale = %f\n", __func__, hparams.f_embedding_scale); - LLAMA_LOG_INFO("%s: f_residual_scale = %f\n", __func__, hparams.f_residual_scale); - LLAMA_LOG_INFO("%s: f_attention_scale = %f\n", __func__, hparams.f_attention_scale); - LLAMA_LOG_INFO("%s: n_ff_shexp = %d\n", __func__, hparams.n_ff_shexp); + LLAMA_LOG_INFO("%s: f_embedding_scale = %f\n", __func__, hparams.f_embedding_scale); + LLAMA_LOG_INFO("%s: f_residual_scale = %f\n", __func__, hparams.f_residual_scale); + LLAMA_LOG_INFO("%s: f_attention_scale = %f\n", __func__, hparams.f_attention_scale); + LLAMA_LOG_INFO("%s: n_ff_shexp = %d\n", __func__, hparams.n_ff_shexp); } if (arch == LLM_ARCH_BAILINGMOE) { - LLAMA_LOG_INFO("%s: n_layer_dense_lead = %d\n", __func__, hparams.n_layer_dense_lead); - LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); - LLAMA_LOG_INFO("%s: n_expert_shared = %d\n", __func__, hparams.n_expert_shared); - LLAMA_LOG_INFO("%s: expert_weights_scale = %.1f\n", __func__, hparams.expert_weights_scale); - LLAMA_LOG_INFO("%s: expert_weights_norm = %d\n", __func__, hparams.expert_weights_norm); + LLAMA_LOG_INFO("%s: n_layer_dense_lead = %d\n", __func__, hparams.n_layer_dense_lead); + LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); + LLAMA_LOG_INFO("%s: n_expert_shared = %d\n", __func__, hparams.n_expert_shared); + LLAMA_LOG_INFO("%s: expert_weights_scale = %.1f\n", __func__, hparams.expert_weights_scale); + LLAMA_LOG_INFO("%s: expert_weights_norm = %d\n", __func__, hparams.expert_weights_norm); } if (arch == LLM_ARCH_BAILINGMOE2) { - LLAMA_LOG_INFO("%s: n_layer_dense_lead = %d\n", __func__, hparams.n_layer_dense_lead); - LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); - LLAMA_LOG_INFO("%s: n_ff_shexp = %d\n", __func__, hparams.n_ff_shexp); - LLAMA_LOG_INFO("%s: n_expert_shared = %d\n", __func__, hparams.n_expert_shared); - LLAMA_LOG_INFO("%s: expert_weights_scale = %.1f\n", __func__, hparams.expert_weights_scale); - LLAMA_LOG_INFO("%s: expert_weights_norm = %d\n", __func__, hparams.expert_weights_norm); - LLAMA_LOG_INFO("%s: expert_gating_func = %s\n", __func__, llama_expert_gating_func_name((llama_expert_gating_func_type) hparams.expert_gating_func)); - LLAMA_LOG_INFO("%s: nextn_predict_layers = %d\n", __func__, hparams.nextn_predict_layers); + LLAMA_LOG_INFO("%s: n_layer_dense_lead = %d\n", __func__, hparams.n_layer_dense_lead); + LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); + LLAMA_LOG_INFO("%s: n_ff_shexp = %d\n", __func__, hparams.n_ff_shexp); + LLAMA_LOG_INFO("%s: n_expert_shared = %d\n", __func__, hparams.n_expert_shared); + LLAMA_LOG_INFO("%s: expert_weights_scale = %.1f\n", __func__, hparams.expert_weights_scale); + LLAMA_LOG_INFO("%s: expert_weights_norm = %d\n", __func__, hparams.expert_weights_norm); + LLAMA_LOG_INFO("%s: expert_gating_func = %s\n", __func__, llama_expert_gating_func_name((llama_expert_gating_func_type) hparams.expert_gating_func)); + LLAMA_LOG_INFO("%s: nextn_predict_layers = %d\n", __func__, hparams.nextn_predict_layers); } if (arch == LLM_ARCH_SMALLTHINKER || arch == LLM_ARCH_LFM2MOE) { - LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); - LLAMA_LOG_INFO("%s: expert_gating_func = %s\n", __func__, llama_expert_gating_func_name((llama_expert_gating_func_type) hparams.expert_gating_func)); + LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); + LLAMA_LOG_INFO("%s: expert_gating_func = %s\n", __func__, llama_expert_gating_func_name((llama_expert_gating_func_type) hparams.expert_gating_func)); } if (arch == LLM_ARCH_GROVEMOE) { - LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); - LLAMA_LOG_INFO("%s: n_ff_chexp = %d\n", __func__, hparams.n_ff_chexp); - LLAMA_LOG_INFO("%s: n_group_experts = %d\n", __func__, hparams.n_group_experts); - LLAMA_LOG_INFO("%s: expert_group_scale = %.2f\n", __func__, hparams.expert_group_scale); + LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); + LLAMA_LOG_INFO("%s: n_ff_chexp = %d\n", __func__, hparams.n_ff_chexp); + LLAMA_LOG_INFO("%s: n_group_experts = %d\n", __func__, hparams.n_group_experts); + LLAMA_LOG_INFO("%s: expert_group_scale = %.2f\n", __func__, hparams.expert_group_scale); } vocab.print_info(); @@ -7601,24 +7269,16 @@ ggml_cgraph * llama_model::build_graph(const llm_graph_params & params) const { switch (arch) { case LLM_ARCH_LLAMA: { - llm = std::make_unique>(*this, params); + llm = std::make_unique(*this, params); } break; case LLM_ARCH_LLAMA4: { if (hparams.swa_type == LLAMA_SWA_TYPE_NONE) { - llm = std::make_unique>(*this, params); + llm = std::make_unique(*this, params); } else { llm = std::make_unique(*this, params); } } break; - case LLM_ARCH_LLAMA_EMBED: - { - llm = std::make_unique>(*this, params); - } break; - case LLM_ARCH_MAINCODER: - { - llm = std::make_unique(*this, params); - } break; case LLM_ARCH_DECI: { llm = std::make_unique(*this, params); @@ -7653,7 +7313,7 @@ ggml_cgraph * llama_model::build_graph(const llm_graph_params & params) const { } break; case LLM_ARCH_MODERN_BERT: { - llm = std::make_unique(*this, params); + llm = std::make_unique>(*this, params); } break; case LLM_ARCH_NEO_BERT: { @@ -7744,14 +7404,6 @@ ggml_cgraph * llama_model::build_graph(const llm_graph_params & params) const { { llm = std::make_unique(*this, params); } break; - case LLM_ARCH_PLAMO3: - { - if (hparams.swa_type != LLAMA_SWA_TYPE_NONE) { - llm = std::make_unique> (*this, params); - } else { - llm = std::make_unique>(*this, params); - } - } break; case LLM_ARCH_GPT2: { llm = std::make_unique(*this, params); @@ -7921,10 +7573,6 @@ ggml_cgraph * llama_model::build_graph(const llm_graph_params & params) const { llm = std::make_unique>(*this, params); } } break; - case LLM_ARCH_EXAONE_MOE: - { - llm = std::make_unique(*this, params); - } break; case LLM_ARCH_RWKV6: { llm = std::make_unique(*this, params); @@ -8056,10 +7704,6 @@ ggml_cgraph * llama_model::build_graph(const llm_graph_params & params) const { { llm = std::make_unique(*this, params); } break; - case LLM_ARCH_MIMO2: - { - llm = std::make_unique(*this, params); - } break; default: GGML_ABORT("fatal error"); } @@ -8067,17 +7711,12 @@ ggml_cgraph * llama_model::build_graph(const llm_graph_params & params) const { // add on pooling layer llm->build_pooling(cls, cls_b, cls_out, cls_out_b); - // add backend sampling layers (if any) - llm->build_sampling(); - // if the gguf model was converted with --sentence-transformers-dense-modules // there will be two additional dense projection layers // dense linear projections are applied after pooling // TODO: move reranking logic here and generalize llm->build_dense_out(dense_2_out_layers, dense_3_out_layers); - llm->res->set_outputs(); - return llm->res->get_gf(); } @@ -8090,7 +7729,7 @@ llama_model_params llama_model_default_params() { llama_model_params result = { /*.devices =*/ nullptr, /*.tensor_buft_overrides =*/ nullptr, - /*.n_gpu_layers =*/ -1, + /*.n_gpu_layers =*/ 999, /*.split_mode =*/ LLAMA_SPLIT_MODE_LAYER, /*.main_gpu =*/ 0, /*.tensor_split =*/ nullptr, @@ -8099,7 +7738,6 @@ llama_model_params llama_model_default_params() { /*.kv_overrides =*/ nullptr, /*.vocab_only =*/ false, /*.use_mmap =*/ true, - /*.use_direct_io =*/ true, /*.use_mlock =*/ false, /*.check_tensors =*/ false, /*.use_extra_bufts =*/ true, @@ -8134,10 +7772,6 @@ int32_t llama_model_n_embd_inp(const llama_model * model) { return model->hparams.n_embd_inp(); } -int32_t llama_model_n_embd_out(const llama_model * model) { - return model->hparams.get_n_embd_out(); -} - int32_t llama_model_n_layer(const llama_model * model) { return model->hparams.n_layer; } @@ -8240,8 +7874,6 @@ llama_rope_type llama_model_rope_type(const llama_model * model) { case LLM_ARCH_ERNIE4_5: case LLM_ARCH_ERNIE4_5_MOE: case LLM_ARCH_MISTRAL3: - case LLM_ARCH_LLAMA_EMBED: - case LLM_ARCH_MAINCODER: return LLAMA_ROPE_TYPE_NORM; // the pairs of head values are offset by n_rot/2 @@ -8271,7 +7903,6 @@ llama_rope_type llama_model_rope_type(const llama_model * model) { case LLM_ARCH_PHIMOE: case LLM_ARCH_PLAMO: case LLM_ARCH_PLAMO2: - case LLM_ARCH_PLAMO3: case LLM_ARCH_GEMMA: case LLM_ARCH_GEMMA2: case LLM_ARCH_GEMMA3: @@ -8285,7 +7916,6 @@ llama_rope_type llama_model_rope_type(const llama_model * model) { case LLM_ARCH_NEMOTRON: case LLM_ARCH_EXAONE: case LLM_ARCH_EXAONE4: - case LLM_ARCH_EXAONE_MOE: case LLM_ARCH_MINICPM3: case LLM_ARCH_BAILINGMOE2: case LLM_ARCH_DOTS1: @@ -8303,7 +7933,6 @@ llama_rope_type llama_model_rope_type(const llama_model * model) { case LLM_ARCH_PANGU_EMBED: case LLM_ARCH_AFMOE: case LLM_ARCH_QWEN3NEXT: - case LLM_ARCH_MIMO2: return LLAMA_ROPE_TYPE_NEOX; case LLM_ARCH_QWEN2VL: diff --git a/src/llama-model.h b/src/llama-model.h index d1de16e..7f560d4 100644 --- a/src/llama-model.h +++ b/src/llama-model.h @@ -11,7 +11,6 @@ #include #include #include -#include #include struct llama_cparams; @@ -120,12 +119,10 @@ enum llm_type { LLM_TYPE_31B_A3_5B, LLM_TYPE_80B_A3B, // Qwen3 Next LLM_TYPE_100B_A6B, - LLM_TYPE_102B_A12B, // Solar-Open LLM_TYPE_106B_A12B, // GLM-4.5-Air LLM_TYPE_230B_A10B, // Minimax M2 LLM_TYPE_235B_A22B, LLM_TYPE_300B_A47B, // Ernie MoE big - LLM_TYPE_310B_A15B, // /MiMo-V2-Flash LLM_TYPE_355B_A32B, // GLM-4.5 LLM_TYPE_E2B, LLM_TYPE_E4B, @@ -468,6 +465,8 @@ struct llama_model { struct ggml_tensor * dense_2_out_layers = nullptr; struct ggml_tensor * dense_3_out_layers = nullptr; + llama_model_params params; + // gguf metadata std::unordered_map gguf_kv; @@ -477,9 +476,6 @@ struct llama_model { // for quantize-stats only std::vector> tensors_by_name; - // for keeping track of associated LoRA adapters - std::unordered_set loras; - int64_t t_load_us = 0; int64_t t_start_us = 0; @@ -501,9 +497,6 @@ struct llama_model { size_t n_tensors() const; size_t n_devices() const; - uint32_t n_gpu_layers() const; - llama_split_mode split_mode() const; - std::map memory_breakdown() const; // total number of parameters in the model @@ -532,8 +525,6 @@ struct llama_model { ggml_cgraph * build_graph(const llm_graph_params & params) const; private: - llama_model_params params; - struct impl; std::unique_ptr pimpl; }; diff --git a/src/llama-quant.cpp b/src/llama-quant.cpp index 048d65a..bc4b05c 100644 --- a/src/llama-quant.cpp +++ b/src/llama-quant.cpp @@ -596,7 +596,7 @@ static void llama_model_quantize_impl(const std::string & fname_inp, const std:: } std::vector splits = {}; - llama_model_loader ml(fname_inp, splits, use_mmap, /*use_direct_io*/ true, /*check_tensors*/ true, /*no_alloc*/ false, kv_overrides, nullptr); + llama_model_loader ml(fname_inp, splits, use_mmap, /*check_tensors*/ true, /*no_alloc*/ false, kv_overrides, nullptr); ml.init_mappings(false); // no prefetching llama_model model(llama_model_default_params()); diff --git a/src/llama-sampling.cpp b/src/llama-sampling.cpp index 5dde513..d96f619 100644 --- a/src/llama-sampling.cpp +++ b/src/llama-sampling.cpp @@ -4,8 +4,6 @@ #include "llama-vocab.h" #include "llama-grammar.h" -#include "ggml-cpp.h" - #include #include #include @@ -348,9 +346,7 @@ static uint32_t get_rng_seed(uint32_t seed) { // llama_sampler API -struct llama_sampler * llama_sampler_init( - struct llama_sampler_i * iface, - llama_sampler_context_t ctx) { +struct llama_sampler * llama_sampler_init(const struct llama_sampler_i * iface, llama_sampler_context_t ctx) { return new llama_sampler { /* .iface = */ iface, /* .ctx = */ ctx, @@ -425,433 +421,19 @@ void llama_sampler_free(struct llama_sampler * smpl) { delete smpl; } -// empty sampler - -struct llama_sampler_empty { - const char * name; -}; - -static struct llama_sampler * llama_sampler_init_empty(const char * name); - -static const char * llama_sampler_empty_name(const struct llama_sampler * smpl) { - auto * ctx = (llama_sampler_empty *) smpl->ctx; - return ctx->name; -} - -static void llama_sampler_empty_accept(struct llama_sampler * smpl, llama_token token) { - GGML_UNUSED(smpl); - GGML_UNUSED(token); -} - -static void llama_sampler_empty_apply(struct llama_sampler * smpl, llama_token_data_array * cur_p) { - GGML_UNUSED(smpl); - GGML_UNUSED(cur_p); -} - -static void llama_sampler_empty_reset(struct llama_sampler * smpl) { - GGML_UNUSED(smpl); -} - -static struct llama_sampler * llama_sampler_empty_clone(const struct llama_sampler * smpl) { - auto * ctx = (llama_sampler_empty *) smpl->ctx; - return llama_sampler_init_empty(ctx->name); -} - -static void llama_sampler_empty_free(struct llama_sampler * smpl) { - delete (llama_sampler_empty *) smpl->ctx; -} - -static bool llama_sampler_empty_backend_init( - struct llama_sampler * smpl, - ggml_backend_buffer_type_t buft) { - GGML_UNUSED(smpl); - GGML_UNUSED(buft); - - return true; -} - -static void llama_sampler_empty_backend_accept( - struct llama_sampler * smpl, - ggml_context * ctx, - ggml_cgraph * gf, - struct ggml_tensor * selected_token) { - GGML_UNUSED(smpl); - GGML_UNUSED(ctx); - GGML_UNUSED(gf); - GGML_UNUSED(selected_token); -} - -static void llama_sampler_empty_backend_apply( - struct llama_sampler * smpl, - struct ggml_context * ctx, - struct ggml_cgraph * gf, - struct llama_sampler_data * data) { - GGML_UNUSED(smpl); - GGML_UNUSED(ctx); - GGML_UNUSED(gf); - GGML_UNUSED(data); -} - -static void llama_sampler_empty_backend_set_input(struct llama_sampler * smpl) { - GGML_UNUSED(smpl); -} - -static struct llama_sampler_i llama_sampler_empty_i = { - /* .name = */ llama_sampler_empty_name, - /* .accept = */ llama_sampler_empty_accept, - /* .apply = */ llama_sampler_empty_apply, - /* .reset = */ llama_sampler_empty_reset, - /* .clone = */ llama_sampler_empty_clone, - /* .free = */ llama_sampler_empty_free, - /* .backend_init = */ llama_sampler_empty_backend_init, - /* .backend_accept = */ llama_sampler_empty_backend_accept, - /* .backend_apply = */ llama_sampler_empty_backend_apply, - /* .backend_set_input = */ llama_sampler_empty_backend_set_input, -}; - -struct llama_sampler * llama_sampler_init_empty(const char * name) { - return llama_sampler_init( - /* .iface = */ &llama_sampler_empty_i, - /* .ctx = */ new llama_sampler_empty { - /* .name = */ name, - } - ); -} - -// common backend sampler functionality -// -// +name : means that the sampler is support and will run on the backend -// -name : means that a ggml operator is not supported by the backend -// -struct llama_sampler_backend { - llama_sampler_backend(const char * name) : name(name), name_ext(name), is_init(false), support(false) {} - - const char * get_name() { - if (!is_init) { - return name.c_str(); - } - - if (support) { - name_ext = "+" + name; - } else { - name_ext = "-" + name; - } - - return name_ext.c_str(); - } - - void init(bool support) { - GGML_ASSERT(this->is_init == false); - - this->is_init = true; - this->support = support; - } - -private: - std::string name; - std::string name_ext; - - bool is_init; - bool support; -}; - -// check if all ggml ops used by the sampler are supported by the backend -static bool llama_sampler_backend_support( - llama_sampler * smpl, - ggml_backend_buffer_type_t buft) { - auto * device = ggml_backend_buft_get_device(buft); - if (!device) { - // CPU backend always supported - return true; - } - - ggml_init_params params = { - /*.mem_size =*/ 128*ggml_tensor_overhead() + ggml_graph_overhead(), - /*.mem_buffer =*/ NULL, - /*.no_alloc =*/ true, - }; - - ggml_context_ptr ctx_ptr { ggml_init(params) }; - if (!ctx_ptr) { - throw std::runtime_error(format("failed to create ggml context")); - } - - ggml_context * ctx = ctx_ptr.get(); - - const int64_t n = 1024*1024; - - llama_sampler_data data = { - /*.logits = */ ggml_new_tensor_1d(ctx, GGML_TYPE_F32, n), - /*.probs = */ nullptr, - /*.sampled = */ nullptr, - /*.candidates = */ ggml_new_tensor_1d(ctx, GGML_TYPE_I32, n), - }; - - ggml_cgraph * gf = ggml_new_graph(ctx); - - smpl->iface->backend_apply(smpl, ctx, gf, &data); - - if (data.logits) { - ggml_build_forward_expand(gf, data.logits); - } - - if (data.probs) { - ggml_build_forward_expand(gf, data.probs); - } - - if (data.sampled) { - ggml_build_forward_expand(gf, data.sampled); - } - - if (data.candidates) { - ggml_build_forward_expand(gf, data.candidates); - } - - for (int i = 0; i < ggml_graph_n_nodes(gf); i++) { - struct ggml_tensor * op = ggml_graph_node(gf, i); - - if (!ggml_backend_dev_supports_op(device, op)) { - LLAMA_LOG_WARN("%s: device '%s' does not have support for op %s needed for sampler '%s'\n", - __func__, ggml_backend_dev_name(device), ggml_op_name(op->op), smpl->iface->name(smpl)); - - return false; - } - } - - return true; -} - -// sampler chain - -static const char * llama_sampler_chain_name(const struct llama_sampler * /*smpl*/) { - return "chain"; -} - -static void llama_sampler_chain_accept(struct llama_sampler * smpl, llama_token token) { - auto * chain = (llama_sampler_chain *) smpl->ctx; - - time_meas tm(chain->t_sample_us, chain->params.no_perf); - - for (auto & smpl : chain->samplers) { - llama_sampler_accept(smpl.ptr, token); - } - - chain->n_sample++; -} - -static void llama_sampler_chain_apply(struct llama_sampler * smpl, llama_token_data_array * cur_p) { - auto * chain = (llama_sampler_chain *) smpl->ctx; - - time_meas tm(chain->t_sample_us, chain->params.no_perf); - - bool is_backend = chain->is_init; - - for (auto & smpl : chain->samplers) { - if (is_backend && smpl.is_backend) { - continue; - } - - is_backend = false; - - if (smpl.ptr->iface->apply == nullptr) { - continue; - } - - llama_sampler_apply(smpl.ptr, cur_p); - } -} - -static void llama_sampler_chain_reset(struct llama_sampler * smpl) { - auto * chain = (llama_sampler_chain *) smpl->ctx; - - for (auto & smpl : chain->samplers) { - llama_sampler_reset(smpl.ptr); - } -} - -static struct llama_sampler * llama_sampler_chain_clone(const struct llama_sampler * smpl) { - const auto * chain_src = (const llama_sampler_chain *) smpl->ctx; - - auto * result = llama_sampler_chain_init(chain_src->params); - - for (const auto & smpl : chain_src->samplers) { - llama_sampler_chain_add(result, llama_sampler_clone(smpl.ptr)); - } - - return result; -} - -static void llama_sampler_chain_free(struct llama_sampler * smpl) { - auto * chain = (llama_sampler_chain *) smpl->ctx; - - for (auto & smpl : chain->samplers) { - llama_sampler_free(smpl.ptr); - } - - delete chain; -} - -static bool llama_sampler_chain_backend_init( - struct llama_sampler * smpl, - ggml_backend_buffer_type_t buft) { - auto * chain = (llama_sampler_chain *) smpl->ctx; - - GGML_ASSERT(chain->is_init == false && "llama_sampler_chain_backend_init() called twice"); - - chain->is_init = true; - - bool res = true; - - for (auto & smpl : chain->samplers) { - bool res_cur = true; - - // to be able to run a sampler on the backend, it has to: - // - have the .backend_init() API implemented - // - return true during .backend_init() - if (smpl.ptr->iface->backend_init) { - if (!smpl.ptr->iface->backend_init(smpl.ptr, buft)) { - res_cur = false; - } - } else { - res_cur = false; - } - - smpl.is_backend = res_cur; - - res = res && res_cur; - } - - return res; -} - -static void llama_sampler_chain_backend_accept( - struct llama_sampler * smpl, - ggml_context * ctx, - ggml_cgraph * gf, - struct ggml_tensor * selected_token) { - auto * chain = (llama_sampler_chain *) smpl->ctx; - - for (auto & smpl : chain->samplers) { - if (!smpl.is_backend) { - break; - } - - if (smpl.ptr->iface->backend_accept) { - smpl.ptr->iface->backend_accept(smpl.ptr, ctx, gf, selected_token); - } - } -} - -static void llama_sampler_chain_backend_apply( - struct llama_sampler * smpl, - struct ggml_context * ctx, - struct ggml_cgraph * gf, - struct llama_sampler_data * data) { - auto * chain = (llama_sampler_chain *) smpl->ctx; - - GGML_ASSERT(chain->is_init && "llama_sampler_chain_backend_init() not called"); - - for (auto & smpl : chain->samplers) { - if (!smpl.is_backend) { - break; - } - - if (smpl.ptr->iface->backend_apply) { - smpl.ptr->iface->backend_apply(smpl.ptr, ctx, gf, data); - } - } -} - -static void llama_sampler_chain_backend_set_input(struct llama_sampler * smpl) { - auto * chain = (llama_sampler_chain *) smpl->ctx; - - for (auto & smpl : chain->samplers) { - if (!smpl.is_backend) { - break; - } - - if (smpl.ptr->iface->backend_set_input) { - smpl.ptr->iface->backend_set_input(smpl.ptr); - } - } -} - -static struct llama_sampler_i llama_sampler_chain_i = { - /* .name = */ llama_sampler_chain_name, - /* .accept = */ llama_sampler_chain_accept, - /* .apply = */ llama_sampler_chain_apply, - /* .reset = */ llama_sampler_chain_reset, - /* .clone = */ llama_sampler_chain_clone, - /* .free = */ llama_sampler_chain_free, - /* .backend_init = */ llama_sampler_chain_backend_init, - /* .backend_accept = */ llama_sampler_chain_backend_accept, - /* .backend_apply = */ llama_sampler_chain_backend_apply, - /* .backend_set_input = */ llama_sampler_chain_backend_set_input, -}; - -struct llama_sampler * llama_sampler_chain_init(struct llama_sampler_chain_params params) { - return llama_sampler_init( - /* .iface = */ &llama_sampler_chain_i, - /* .ctx = */ new llama_sampler_chain { - /* .params = */ params, - /* .is_init = */ false, - /* .samplers = */ {}, - /* .cur = */ {}, - /* .t_sample_us = */ 0, - /* .n_sample = */ 0, - } - ); -} - llama_token llama_sampler_sample(struct llama_sampler * smpl, struct llama_context * ctx, int32_t idx) { - const llama_token sampled_token = llama_get_sampled_token_ith (ctx, idx); - const float * sampled_probs = llama_get_sampled_probs_ith (ctx, idx); - const float * sampled_logits = llama_get_sampled_logits_ith (ctx, idx); - const llama_token * sampled_ids = llama_get_sampled_candidates_ith(ctx, idx); - - // If a backend sampler has already sampled a token, return it. - if (sampled_token != LLAMA_TOKEN_NULL) { - LLAMA_LOG_DEBUG("%s: Backend sampler selected token for idx %d. Skipping CPU samplers\n", __func__, idx); - return sampled_token; - } + const auto * logits = llama_get_logits_ith(ctx, idx); const llama_model * model = llama_get_model(ctx); const llama_vocab * vocab = llama_model_get_vocab(model); const int n_vocab = llama_vocab_n_tokens(vocab); - // use pre-allocated buffer from chain if available, otherwise allocate locally - std::vector * cur_ptr; - std::vector cur_local; - - if (smpl->iface == &llama_sampler_chain_i) { - auto * chain = (llama_sampler_chain *) smpl->ctx; - cur_ptr = &chain->cur; - } else { - cur_ptr = &cur_local; - } - - auto & cur = *cur_ptr; - - if (sampled_probs) { - const uint32_t sampled_probs_count = llama_get_sampled_probs_count_ith(ctx, idx); - cur.resize(sampled_probs_count); - for (uint32_t i = 0; i < sampled_probs_count; ++i) { - cur[i] = llama_token_data{sampled_ids[i], sampled_logits[i], sampled_probs[i]}; - } - } else if (sampled_logits) { - const uint32_t sampled_logits_count = llama_get_sampled_logits_count_ith(ctx, idx); - cur.resize(sampled_logits_count); - for (llama_token i = 0; i < (int)sampled_logits_count; i++) { - cur[i] = llama_token_data{sampled_ids[i], sampled_logits[i], 0.0f}; - } - } else { - const auto * logits = llama_get_logits_ith(ctx, idx); - GGML_ASSERT(logits != nullptr); - cur.resize(n_vocab); - for (llama_token token_id = 0; token_id < n_vocab; token_id++) { - cur[token_id] = llama_token_data{token_id, logits[token_id], 0.0f}; - } + // TODO: do not allocate each time + std::vector cur; + cur.reserve(n_vocab); + for (llama_token token_id = 0; token_id < n_vocab; token_id++) { + cur.emplace_back(llama_token_data{token_id, logits[token_id], 0.0f}); } llama_token_data_array cur_p = { @@ -872,35 +454,98 @@ llama_token llama_sampler_sample(struct llama_sampler * smpl, struct llama_conte return token; } +// sampler chain + +static const char * llama_sampler_chain_name(const struct llama_sampler * /*smpl*/) { + return "chain"; +} + +static void llama_sampler_chain_accept(struct llama_sampler * smpl, llama_token token) { + auto * chain = (llama_sampler_chain *) smpl->ctx; + + time_meas tm(chain->t_sample_us, chain->params.no_perf); + + for (auto * smpl : chain->samplers) { + llama_sampler_accept(smpl, token); + } + + chain->n_sample++; +} + +static void llama_sampler_chain_apply(struct llama_sampler * smpl, llama_token_data_array * cur_p) { + auto * chain = (llama_sampler_chain *) smpl->ctx; + + time_meas tm(chain->t_sample_us, chain->params.no_perf); + + for (auto * smpl : chain->samplers) { + llama_sampler_apply(smpl, cur_p); + } +} + +static void llama_sampler_chain_reset(struct llama_sampler * smpl) { + auto * chain = (llama_sampler_chain *) smpl->ctx; + + for (auto * smpl : chain->samplers) { + llama_sampler_reset(smpl); + } +} + +static struct llama_sampler * llama_sampler_chain_clone(const struct llama_sampler * smpl) { + const auto * chain_src = (const llama_sampler_chain *) smpl->ctx; + + auto * result = llama_sampler_chain_init(chain_src->params); + + for (auto * smpl : chain_src->samplers) { + llama_sampler_chain_add(result, llama_sampler_clone(smpl)); + } + + return result; +} + +static void llama_sampler_chain_free(struct llama_sampler * smpl) { + auto * chain = (llama_sampler_chain *) smpl->ctx; + + for (auto * smpl : chain->samplers) { + llama_sampler_free(smpl); + } + + delete chain; +} + +static struct llama_sampler_i llama_sampler_chain_i = { + /* .name = */ llama_sampler_chain_name, + /* .accept = */ llama_sampler_chain_accept, + /* .apply = */ llama_sampler_chain_apply, + /* .reset = */ llama_sampler_chain_reset, + /* .clone = */ llama_sampler_chain_clone, + /* .free = */ llama_sampler_chain_free, +}; + +struct llama_sampler * llama_sampler_chain_init(struct llama_sampler_chain_params params) { + return llama_sampler_init( + /* .iface = */ &llama_sampler_chain_i, + /* .ctx = */ new llama_sampler_chain { + /* .params = */ params, + /* .samplers = */ {}, + /* .t_sample_us = */ 0, + /* .n_sample = */ 0, + } + ); +} void llama_sampler_chain_add(struct llama_sampler * chain, struct llama_sampler * smpl) { auto * p = (llama_sampler_chain *) chain->ctx; - p->samplers.push_back({ - /* .is_backend = */ false, - /* .ptr = */ smpl, - }); + p->samplers.push_back(smpl); } -struct llama_sampler * llama_sampler_chain_get(struct llama_sampler * chain, int32_t i) { - if (chain == nullptr) { - return nullptr; - } - - if (chain->iface != &llama_sampler_chain_i) { - return nullptr; - } - - if (i == -1) { - return chain; - } - +struct llama_sampler * llama_sampler_chain_get(const struct llama_sampler * chain, int32_t i) { const auto * p = (const llama_sampler_chain *) chain->ctx; if (i < 0 || (size_t) i >= p->samplers.size()) { return nullptr; } - return p->samplers[i].ptr; + return p->samplers[i]; } struct llama_sampler * llama_sampler_chain_remove(struct llama_sampler * chain, int32_t i) { @@ -910,7 +555,7 @@ struct llama_sampler * llama_sampler_chain_remove(struct llama_sampler * chain, return nullptr; } - auto * result = p->samplers[i].ptr; + auto * result = p->samplers[i]; p->samplers.erase(p->samplers.begin() + i); return result; @@ -928,36 +573,8 @@ int llama_sampler_chain_n(const struct llama_sampler * chain) { // greedy -struct llama_sampler_greedy : public llama_sampler_backend { -}; - -static const char * llama_sampler_greedy_name(const struct llama_sampler * smpl) { - auto * sctx = (llama_sampler_greedy *) smpl->ctx; - return sctx->get_name(); -} - -static void llama_sampler_greedy_reset(struct llama_sampler * smpl) { - auto * ctx = (llama_sampler_greedy *) smpl->ctx; - GGML_UNUSED(ctx); -} - -static struct llama_sampler * llama_sampler_greedy_clone(const struct llama_sampler * smpl) { - const auto * ctx = (const llama_sampler_greedy *) smpl->ctx; - auto * result = llama_sampler_init_greedy(); - - // copy the state - { - auto * result_ctx = (llama_sampler_greedy *) result->ctx; - - GGML_UNUSED(ctx); - GGML_UNUSED(result_ctx); - } - - return result; -} - -static void llama_sampler_greedy_free(struct llama_sampler * smpl) { - delete (llama_sampler_greedy *) smpl->ctx; +static const char * llama_sampler_greedy_name(const struct llama_sampler * /*smpl*/) { + return "greedy"; } static void llama_sampler_greedy_apply(struct llama_sampler * /*smpl*/, llama_token_data_array * cur_p) { @@ -969,72 +586,33 @@ static void llama_sampler_greedy_apply(struct llama_sampler * /*smpl*/, llama_to } } -static bool llama_sampler_greedy_backend_init( - struct llama_sampler * smpl, - ggml_backend_buffer_type_t buft) { - auto * sctx = (llama_sampler_greedy *) smpl->ctx; - - const bool res = llama_sampler_backend_support(smpl, buft); - - sctx->init(res); - - return res; -} - -static void llama_sampler_greedy_backend_apply( - struct llama_sampler * smpl, - struct ggml_context * ctx, - struct ggml_cgraph * gf, - struct llama_sampler_data * data) { - GGML_UNUSED(gf); - GGML_UNUSED(smpl); - - struct ggml_tensor * curl = ggml_argmax(ctx, data->logits); - ggml_set_name(curl, "greedy_argmax"); - - data->sampled = curl; -} - static struct llama_sampler_i llama_sampler_greedy_i = { - /* .name = */ llama_sampler_greedy_name, - /* .accept = */ nullptr, - /* .apply = */ llama_sampler_greedy_apply, - /* .reset = */ llama_sampler_greedy_reset, - /* .clone = */ llama_sampler_greedy_clone, - /* .free = */ llama_sampler_greedy_free, - /* .backend_init = */ llama_sampler_greedy_backend_init, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ llama_sampler_greedy_backend_apply, - /* .backend_set_input = */ nullptr, + /* .name = */ llama_sampler_greedy_name, + /* .accept = */ nullptr, + /* .apply = */ llama_sampler_greedy_apply, + /* .reset = */ nullptr, + /* .clone = */ nullptr, + /* .free = */ nullptr, }; struct llama_sampler * llama_sampler_init_greedy() { return llama_sampler_init( /* .iface = */ &llama_sampler_greedy_i, - /* .ctx = */ new llama_sampler_greedy { - ("greedy"), - } + /* .ctx = */ nullptr ); } // dist -struct llama_sampler_dist : public llama_sampler_backend { +struct llama_sampler_dist { const uint32_t seed; uint32_t seed_cur; std::mt19937 rng; - - // backend input - struct ggml_tensor * inp_uniform; - - ggml_context_ptr inp_ctx; - ggml_backend_buffer_ptr inp_buf; }; -static const char * llama_sampler_dist_name(const struct llama_sampler * smpl) { - auto * sctx = (llama_sampler_dist *) smpl->ctx; - return sctx->get_name(); +static const char * llama_sampler_dist_name(const struct llama_sampler * /*smpl*/) { + return "dist"; } static void llama_sampler_dist_apply(struct llama_sampler * smpl, llama_token_data_array * cur_p) { @@ -1109,12 +687,6 @@ static void llama_sampler_dist_apply(struct llama_sampler * smpl, llama_token_da #endif } -static void llama_sampler_dist_reset(struct llama_sampler * smpl) { - auto * ctx = (llama_sampler_dist *) smpl->ctx; - ctx->seed_cur = get_rng_seed(ctx->seed); - ctx->rng.seed(ctx->seed_cur); -} - static struct llama_sampler * llama_sampler_dist_clone(const struct llama_sampler * smpl) { const auto * ctx = (const llama_sampler_dist *) smpl->ctx; auto * result = llama_sampler_init_dist(ctx->seed); @@ -1129,127 +701,23 @@ static struct llama_sampler * llama_sampler_dist_clone(const struct llama_sample return result; } +static void llama_sampler_dist_reset(struct llama_sampler * smpl) { + auto * ctx = (llama_sampler_dist *) smpl->ctx; + ctx->seed_cur = get_rng_seed(ctx->seed); + ctx->rng.seed(ctx->seed_cur); +} + static void llama_sampler_dist_free(struct llama_sampler * smpl) { delete (llama_sampler_dist *) smpl->ctx; } -static bool llama_sampler_dist_backend_init( - struct llama_sampler * smpl, - ggml_backend_buffer_type_t buft) { - auto * sctx = (llama_sampler_dist *) smpl->ctx; - - // allocate inputs - { - ggml_init_params params = { - /*.mem_size =*/ ggml_tensor_overhead(), - /*.mem_buffer =*/ nullptr, - /*.no_alloc =*/ true, - }; - - sctx->inp_ctx.reset(ggml_init(params)); - - // Create the uniform random scalar input tensor. This will be set by - // llama_sampler_dist_backend_set_input after this graph is built. - sctx->inp_uniform = ggml_new_tensor_1d(sctx->inp_ctx.get(), GGML_TYPE_F32, 1); - ggml_set_name (sctx->inp_uniform, "uniform"); - ggml_set_input(sctx->inp_uniform); - - // Allocate all tensors from our context to the backend - sctx->inp_buf.reset(ggml_backend_alloc_ctx_tensors_from_buft(sctx->inp_ctx.get(), buft)); - - ggml_backend_buffer_clear(sctx->inp_buf.get(), 0); - } - - const bool res = llama_sampler_backend_support(smpl, buft); - - sctx->init(res); - - if (!res) { - sctx->inp_ctx.reset(nullptr); - sctx->inp_buf.reset(nullptr); - } - - return res; -} - -static void llama_sampler_dist_backend_apply( - struct llama_sampler * smpl, - struct ggml_context * ctx, - struct ggml_cgraph * gf, - struct llama_sampler_data * data) { - GGML_UNUSED(gf); - auto * sctx = (llama_sampler_dist *) smpl->ctx; - - struct ggml_tensor * probs = ggml_soft_max(ctx, data->logits); - ggml_set_name(probs, "dist_probs"); - - struct ggml_tensor * cumsum = ggml_cumsum(ctx, probs); - ggml_set_name(cumsum, "dist_cumsum"); - - // The uniform tensor has a random value and we subtract this tensor with - // the cumsum tensor (the uniform tensor will be broadcasted by ggml_sub). - // Recall that each entry in cumsum is the cumulative probability up to that - // index so values stay negative while the cumulative total is below the - // random value, and become zero/positive once the threshold is crossed. - struct ggml_tensor * diff = ggml_sub(ctx, cumsum, sctx->inp_uniform); - ggml_set_name(diff, "dist_cumsum"); - - // The ggml_step function produces a tensor where entries are 1 if the - // corresponding entry in diff is > 0, and 0 otherwise. So all values up to - // the index where the cumulative probability exceeds the random value are 0, - // and all entries after that are 1. - struct ggml_tensor * mask = ggml_step(ctx, diff); - ggml_set_name(mask, "dist_mask"); - - // Taking the sum of the mask gives us the sum of elements after the threshold - // we are interested in. - struct ggml_tensor * idxf = ggml_sum(ctx, mask); - ggml_set_name(idxf, "dist_index_f32"); - - // Use ggml_scale_bias to scale the index value by -1 and then add the size - // of the mask to that value so we get the correct index ((-1 * idxf) + n). - struct ggml_tensor * idx = ggml_cast(ctx, ggml_scale_bias(ctx, idxf, -1.0f, mask->ne[0]), GGML_TYPE_I32); - ggml_set_name(idx, "dist_index_i32"); - - // Map back to original vocab ids if a candidates tensor is available. - struct ggml_tensor * sampled_token = idx; - if (data->candidates != nullptr) { - struct ggml_tensor * candidates = ggml_reshape_2d(ctx, data->candidates, 1, ggml_nelements(data->candidates)); - - sampled_token = ggml_get_rows(ctx, candidates, idx); - ggml_set_name(sampled_token, "dist_sampled_token"); - } - - data->sampled = sampled_token; - data->probs = probs; -} - -static void llama_sampler_dist_backend_set_input(struct llama_sampler * smpl) { - auto * sctx = (llama_sampler_dist *) smpl->ctx; - GGML_ASSERT(sctx->inp_uniform != nullptr); - - // We sample in double precision and cast to float to match rnd numbers of - // llama_dampler_dist which uses double precision (sampling from - // std::uniform_real_distribution and - // std::uniform_real_distribution with same rng will produce - // different sequences). - std::uniform_real_distribution dist(0.0f, 1.0f); - const float rnd = dist(sctx->rng); - - ggml_backend_tensor_set(sctx->inp_uniform, &rnd, 0, sizeof(float)); -} - static struct llama_sampler_i llama_sampler_dist_i = { - /* .name = */ llama_sampler_dist_name, - /* .accept = */ nullptr, - /* .apply = */ llama_sampler_dist_apply, - /* .reset = */ llama_sampler_dist_reset, - /* .clone = */ llama_sampler_dist_clone, - /* .free = */ llama_sampler_dist_free, - /* .backend_init = */ llama_sampler_dist_backend_init, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ llama_sampler_dist_backend_apply, - /* .backend_set_input = */ llama_sampler_dist_backend_set_input, + /* .name = */ llama_sampler_dist_name, + /* .accept = */ nullptr, + /* .apply = */ llama_sampler_dist_apply, + /* .reset = */ llama_sampler_dist_reset, + /* .clone = */ llama_sampler_dist_clone, + /* .free = */ llama_sampler_dist_free, }; struct llama_sampler * llama_sampler_init_dist(uint32_t seed) { @@ -1257,26 +725,21 @@ struct llama_sampler * llama_sampler_init_dist(uint32_t seed) { return llama_sampler_init( /* .iface = */ &llama_sampler_dist_i, /* .ctx = */ new llama_sampler_dist { - ("dist"), - /* .seed = */ seed, - /* .seed_cur = */ seed_cur, - /* .rng = */ std::mt19937(seed_cur), - /* .inp_uniform = */ nullptr, - /* .inp_ctx = */ nullptr, - /* .inp_buf = */ nullptr, + /* .seed = */ seed, + /* .seed_cur = */ seed_cur, + /* .rng = */ std::mt19937(seed_cur), } ); } // top-k -struct llama_sampler_top_k : public llama_sampler_backend { +struct llama_sampler_top_k { const int32_t k; }; -static const char * llama_sampler_top_k_name(const struct llama_sampler * smpl) { - auto * sctx = (llama_sampler_top_k *) smpl->ctx; - return sctx->get_name(); +static const char * llama_sampler_top_k_name(const struct llama_sampler * /*smpl*/) { + return "top-k"; } static void llama_sampler_top_k_apply(struct llama_sampler * smpl, llama_token_data_array * cur_p) { @@ -1293,69 +756,19 @@ static void llama_sampler_top_k_free(struct llama_sampler * smpl) { delete (llama_sampler_top_k *) smpl->ctx; } -static bool llama_sampler_top_k_backend_init( - struct llama_sampler * smpl, - ggml_backend_buffer_type_t buft) { - auto * sctx = (llama_sampler_top_k *) smpl->ctx; - - const bool res = llama_sampler_backend_support(smpl, buft); - - sctx->init(res); - - return res; -} - -static void llama_sampler_top_k_backend_apply( - struct llama_sampler * smpl, - struct ggml_context * ctx, - struct ggml_cgraph * gf, - struct llama_sampler_data * data) { - auto * sctx = (llama_sampler_top_k *) smpl->ctx; - - struct ggml_tensor * top_k = ggml_top_k(ctx, data->logits, sctx->k); - ggml_set_name(top_k, "top_k"); - - if (data->candidates) { - struct ggml_tensor * candidates_rows = ggml_reshape_2d(ctx, data->candidates, 1, data->candidates->ne[0]); - data->candidates = ggml_get_rows(ctx, candidates_rows, top_k); - data->candidates = ggml_reshape_1d(ctx, data->candidates, sctx->k); - ggml_set_name(data->candidates, "top_k_candidates"); - } else { - data->candidates = top_k; - } - - struct ggml_tensor * logits_rows = ggml_reshape_2d(ctx, data->logits, 1, data->logits->ne[0]); - struct ggml_tensor * top_k_rows = ggml_get_rows(ctx, logits_rows, top_k); - data->logits = ggml_reshape_1d(ctx, top_k_rows, sctx->k); - ggml_set_name(top_k_rows, "top_k_rows"); - - GGML_UNUSED(gf); -} - static struct llama_sampler_i llama_sampler_top_k_i = { - /* .name = */ llama_sampler_top_k_name, - /* .accept = */ nullptr, - /* .apply = */ llama_sampler_top_k_apply, - /* .reset = */ nullptr, - /* .clone = */ llama_sampler_top_k_clone, - /* .free = */ llama_sampler_top_k_free, - /* .backend_init = */ llama_sampler_top_k_backend_init, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ llama_sampler_top_k_backend_apply, - /* .backend_set_input = */ nullptr, + /* .name = */ llama_sampler_top_k_name, + /* .accept = */ nullptr, + /* .apply = */ llama_sampler_top_k_apply, + /* .reset = */ nullptr, + /* .clone = */ llama_sampler_top_k_clone, + /* .free = */ llama_sampler_top_k_free, }; struct llama_sampler * llama_sampler_init_top_k(int32_t k) { - const bool is_empty = (k <= 0); - - if (is_empty) { - return llama_sampler_init_empty("?top-k"); - } - return llama_sampler_init( /* .iface = */ &llama_sampler_top_k_i, /* .ctx = */ new llama_sampler_top_k { - ("top-k"), /* .k = */ k, } ); @@ -1363,16 +776,15 @@ struct llama_sampler * llama_sampler_init_top_k(int32_t k) { // top-p -struct llama_sampler_top_p : public llama_sampler_backend { +struct llama_sampler_top_p { const float p; const size_t min_keep; std::vector buf_sort; }; -static const char * llama_sampler_top_p_name(const struct llama_sampler * smpl) { - auto * sctx = (llama_sampler_top_p *) smpl->ctx; - return sctx->get_name(); +static const char * llama_sampler_top_p_name(const struct llama_sampler * /*smpl*/) { + return "top-p"; } static void llama_sampler_top_p_apply(struct llama_sampler * smpl, llama_token_data_array * cur_p) { @@ -1439,115 +851,19 @@ static void llama_sampler_top_p_free(struct llama_sampler * smpl) { delete (llama_sampler_top_p *) smpl->ctx; } -static bool llama_sampler_top_p_backend_init( - struct llama_sampler * smpl, - ggml_backend_buffer_type_t buft) { - auto * sctx = (llama_sampler_top_p *) smpl->ctx; - - const bool res = llama_sampler_backend_support(smpl, buft); - - sctx->init(res); - - return res; -} - -static void llama_sampler_top_p_backend_apply( - struct llama_sampler * smpl, - struct ggml_context * ctx, - struct ggml_cgraph * gf, - struct llama_sampler_data * data) { - auto * sctx = (llama_sampler_top_p *) smpl->ctx; - - auto ggml_sort = [ctx](struct ggml_tensor * a, struct ggml_tensor * b) { - GGML_ASSERT(ggml_nrows(a) == 1); - struct ggml_tensor * a_reshaped = ggml_reshape_2d(ctx, a, 1, a->ne[0]); - struct ggml_tensor * a_sorted = ggml_get_rows(ctx, a_reshaped, b); - return ggml_reshape_1d(ctx, a_sorted, a->ne[0]); - }; - - // Get the sorted logits in descending order. - struct ggml_tensor * sorted_idx = ggml_argsort(ctx, data->logits, GGML_SORT_ORDER_DESC); - ggml_set_name(sorted_idx, "top_p_sorted_idx"); - - // Do the sorting via reshape + get_rows - struct ggml_tensor * sorted_logits = ggml_sort(data->logits, sorted_idx); - ggml_set_name(sorted_logits, "top_p_sorted_logits"); - - struct ggml_tensor * softmax = ggml_soft_max(ctx, sorted_logits); - ggml_set_name(softmax, "top_p_softmax"); - - // If candidates are provided, sort them as well. Otherwise, set sorted indices as candidates. - if (data->candidates) { - data->candidates = ggml_sort(data->candidates, sorted_idx); - } else { - data->candidates = sorted_idx; - } - ggml_set_name(data->candidates, "top_p_candidates"); - - // Compute Cumulative Distribution Function (CDF) by means of GGML_OP_CUMSUM. - struct ggml_tensor * cdf = ggml_cumsum(ctx, softmax); - ggml_set_name(cdf, "top_p_cdf"); - - // Invert CDF and add top-p value so that ggml_step yields 1 for values we want to keep - struct ggml_tensor * cdf_scaled = ggml_scale_bias(ctx, cdf, -1.0f, sctx->p); - ggml_set_name(cdf_scaled, "top_p_cdf_scaled"); - - struct ggml_tensor * mask = ggml_step(ctx, cdf_scaled); - ggml_set_name(mask, "top_p_mask"); - - // Taking the sum of the mask gives us the sum of elements after the threshold - // we are interested in. - struct ggml_tensor * idxf = ggml_sum(ctx, mask); - ggml_set_name(idxf, "top_p_index_f32"); - - // prevent out-of-bounds access - idxf = ggml_clamp(ctx, idxf, 0.0f, mask->ne[0] - 1); - - // construct ones tensor to set the value in the mask - struct ggml_tensor * ones = ggml_scale_bias(ctx, idxf, 0.0f, 1.0f); - ggml_set_name(ones, "top_p_ones"); - - // Make top-p inclusive (i.e. return all values such that cum_sum/cdf >= p) - struct ggml_tensor * mask_reshaped = ggml_reshape_2d(ctx, mask, 1, mask->ne[0]); - - mask_reshaped = ggml_set_rows(ctx, mask_reshaped, ones, ggml_cast(ctx, idxf, GGML_TYPE_I32)); - mask = ggml_reshape_1d(ctx, mask_reshaped, mask->ne[0]); - - // Apply -INFINITY bias for masked-out tokens - // log(1) = 0 (keep), log(0) = -INF (discard) - struct ggml_tensor * top_p_bias = ggml_log(ctx, mask); - ggml_set_name(top_p_bias, "top_p_bias"); - - data->logits = ggml_add(ctx, sorted_logits, top_p_bias); - ggml_set_name(data->logits, "top_p_logits"); - - GGML_UNUSED(gf); -} - static struct llama_sampler_i llama_sampler_top_p_i = { - /* .name = */ llama_sampler_top_p_name, - /* .accept = */ nullptr, - /* .apply = */ llama_sampler_top_p_apply, - /* .reset = */ nullptr, - /* .clone = */ llama_sampler_top_p_clone, - /* .free = */ llama_sampler_top_p_free, - /* .backend_init = */ llama_sampler_top_p_backend_init, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ llama_sampler_top_p_backend_apply, - /* .backend_set_input = */ nullptr, + /* .name = */ llama_sampler_top_p_name, + /* .accept = */ nullptr, + /* .apply = */ llama_sampler_top_p_apply, + /* .reset = */ nullptr, + /* .clone = */ llama_sampler_top_p_clone, + /* .free = */ llama_sampler_top_p_free, }; struct llama_sampler * llama_sampler_init_top_p(float p, size_t min_keep) { - const bool is_empty = p >= 1.0f; - - if (is_empty) { - return llama_sampler_init_empty("?top-p"); - } - return llama_sampler_init( /* .iface = */ &llama_sampler_top_p_i, /* .ctx = */ new llama_sampler_top_p { - ("top-p"), /* .p = */ p, /* .min_keep = */ min_keep, /* .buf_sort = */ {}, @@ -1557,14 +873,13 @@ struct llama_sampler * llama_sampler_init_top_p(float p, size_t min_keep) { // min-p -struct llama_sampler_min_p : public llama_sampler_backend { +struct llama_sampler_min_p { const float p; const size_t min_keep; }; -static const char * llama_sampler_min_p_name(const struct llama_sampler * smpl) { - auto * sctx = (llama_sampler_min_p *) smpl->ctx; - return sctx->get_name(); +static const char * llama_sampler_min_p_name(const struct llama_sampler * /*smpl*/) { + return "min-p"; } static void llama_sampler_min_p_apply(struct llama_sampler * smpl, llama_token_data_array * cur_p) { @@ -1630,81 +945,19 @@ static void llama_sampler_min_p_free(struct llama_sampler * smpl) { delete (llama_sampler_min_p *) smpl->ctx; } -static bool llama_sampler_min_p_backend_init( - struct llama_sampler * smpl, - ggml_backend_buffer_type_t buft) { - auto * sctx = (llama_sampler_min_p *) smpl->ctx; - - const bool res = llama_sampler_backend_support(smpl, buft); - - sctx->init(res); - - return res; -} - -static void llama_sampler_min_p_backend_apply( - struct llama_sampler * smpl, - struct ggml_context * ctx, - struct ggml_cgraph * gf, - struct llama_sampler_data * data) { - auto * sctx = (llama_sampler_min_p *) smpl->ctx; - - struct ggml_tensor * max_idx = ggml_argmax(ctx, data->logits); - ggml_set_name(max_idx, "max_idx"); - - struct ggml_tensor * logits_rows = ggml_reshape_2d(ctx, data->logits, 1, data->logits->ne[0]); - ggml_set_name(logits_rows, "logits_rows"); - - struct ggml_tensor * max_logit = ggml_get_rows(ctx, logits_rows, max_idx); - ggml_set_name(max_logit, "max_logit"); - - // Calculate the threshold value. - struct ggml_tensor * threshold = ggml_scale_bias(ctx, max_logit, 1.0f, logf(sctx->p)); - ggml_set_name(threshold, "min_p_threshold"); - - // Subtract the threshold from logits. - struct ggml_tensor * sub = ggml_sub(ctx, data->logits, threshold); - - // Create a mask where logits below the threshold are 0 (discard), - // and others are 1 (keep). - struct ggml_tensor * mask = ggml_step(ctx, sub); - ggml_set_name(mask, "min_p_mask"); - - // Apply -INFINITY bias for masked-out tokens - // log(1) = 0 (keep), log(0) = -INF (discard) - struct ggml_tensor * min_p_bias = ggml_log(ctx, mask); - ggml_set_name(min_p_bias, "min_p_bias"); - - data->logits = ggml_add(ctx, data->logits, min_p_bias); - ggml_set_name(data->logits, "min_p_logits"); - - GGML_UNUSED(gf); -} - static struct llama_sampler_i llama_sampler_min_p_i = { - /* .name = */ llama_sampler_min_p_name, - /* .accept = */ nullptr, - /* .apply = */ llama_sampler_min_p_apply, - /* .reset = */ nullptr, - /* .clone = */ llama_sampler_min_p_clone, - /* .free = */ llama_sampler_min_p_free, - /* .backend_init = */ llama_sampler_min_p_backend_init, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ llama_sampler_min_p_backend_apply, - /* .backend_set_input = */ nullptr, + /* .name = */ llama_sampler_min_p_name, + /* .accept = */ nullptr, + /* .apply = */ llama_sampler_min_p_apply, + /* .reset = */ nullptr, + /* .clone = */ llama_sampler_min_p_clone, + /* .free = */ llama_sampler_min_p_free, }; struct llama_sampler * llama_sampler_init_min_p(float p, size_t min_keep) { - const bool is_empty = (p <= 0.0f); - - if (is_empty) { - return llama_sampler_init_empty("?min-p"); - } - return llama_sampler_init( /* .iface = */ &llama_sampler_min_p_i, /* .ctx = */ new llama_sampler_min_p { - ("min-p"), /* .p = */ p, /* .min_keep = */ min_keep, } @@ -1792,25 +1045,15 @@ static void llama_sampler_typical_free(struct llama_sampler * smpl) { } static struct llama_sampler_i llama_sampler_typical_i = { - /* .name = */ llama_sampler_typical_name, - /* .accept = */ nullptr, - /* .apply = */ llama_sampler_typical_apply, - /* .reset = */ nullptr, - /* .clone = */ llama_sampler_typical_clone, - /* .free = */ llama_sampler_typical_free, - /* .backend_init = */ nullptr, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ nullptr, - /* .backend_set_input = */ nullptr, + /* .name = */ llama_sampler_typical_name, + /* .accept = */ nullptr, + /* .apply = */ llama_sampler_typical_apply, + /* .reset = */ nullptr, + /* .clone = */ llama_sampler_typical_clone, + /* .free = */ llama_sampler_typical_free, }; struct llama_sampler * llama_sampler_init_typical(float p, size_t min_keep) { - const bool is_empty = (p >= 1.0f); - - if (is_empty) { - return llama_sampler_init_empty("?typical"); - } - return llama_sampler_init( /* .iface = */ &llama_sampler_typical_i, /* .ctx = */ new llama_sampler_typical { @@ -1822,13 +1065,12 @@ struct llama_sampler * llama_sampler_init_typical(float p, size_t min_keep) { // temp -struct llama_sampler_temp : public llama_sampler_backend { +struct llama_sampler_temp { const float temp; }; -static const char * llama_sampler_temp_name(const struct llama_sampler * smpl) { - auto * sctx = (llama_sampler_temp *) smpl->ctx; - return sctx->get_name(); +static const char * llama_sampler_temp_name(const struct llama_sampler * /*smpl*/) { + return "temp"; } static void llama_sampler_temp_apply(struct llama_sampler * smpl, llama_token_data_array * cur_p) { @@ -1846,79 +1088,19 @@ static void llama_sampler_temp_free(struct llama_sampler * smpl) { delete (llama_sampler_temp *) smpl->ctx; } -static void llama_sampler_backend_temp_sampling( - struct ggml_context * ctx, - struct ggml_cgraph * gf, - struct llama_sampler_data * data, - float temp) { - if (temp <= 0.0f) { - // Find the most probable token index. - struct ggml_tensor * max_idx = ggml_argmax(ctx, data->logits); - ggml_set_name(max_idx, "temp_max_idx"); - - if (data->candidates) { - struct ggml_tensor * candidates_rows = ggml_reshape_2d(ctx, data->candidates, 1, data->candidates->ne[0]); - data->candidates = ggml_get_rows(ctx, candidates_rows, max_idx); - } else { - data->candidates = max_idx; - } - - struct ggml_tensor * logits_rows = ggml_reshape_2d(ctx, data->logits, 1, data->logits->ne[0]); - data->logits = ggml_get_rows(ctx, logits_rows, max_idx); - - return; - } - - data->logits = ggml_scale(ctx, data->logits, 1.0f / temp); - - GGML_UNUSED(gf); -} - -static bool llama_sampler_temp_backend_init( - struct llama_sampler * smpl, - ggml_backend_buffer_type_t buft) { - auto * sctx = (llama_sampler_temp *) smpl->ctx; - - const bool res = llama_sampler_backend_support(smpl, buft); - - sctx->init(res); - - return res; -} - -static void llama_sampler_temp_backend_apply( - struct llama_sampler * smpl, - struct ggml_context * ctx, - struct ggml_cgraph * gf, - struct llama_sampler_data * data) { - auto * sctx = (llama_sampler_temp *) smpl->ctx; - llama_sampler_backend_temp_sampling(ctx, gf, data, sctx->temp); -} - static struct llama_sampler_i llama_sampler_temp_i = { - /* .name = */ llama_sampler_temp_name, - /* .accept = */ nullptr, - /* .apply = */ llama_sampler_temp_apply, - /* .reset = */ nullptr, - /* .clone = */ llama_sampler_temp_clone, - /* .free = */ llama_sampler_temp_free, - /* .backend_init = */ llama_sampler_temp_backend_init, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ llama_sampler_temp_backend_apply, - /* .backend_set_input = */ nullptr, + /* .name = */ llama_sampler_temp_name, + /* .accept = */ nullptr, + /* .apply = */ llama_sampler_temp_apply, + /* .reset = */ nullptr, + /* .clone = */ llama_sampler_temp_clone, + /* .free = */ llama_sampler_temp_free, }; struct llama_sampler * llama_sampler_init_temp(float temp) { - const bool is_empty = temp == 1.0f; - - if (is_empty) { - return llama_sampler_init_empty("?temp"); - } - return llama_sampler_init( /* .iface = */ &llama_sampler_temp_i, /* .ctx = */ new llama_sampler_temp { - ("temp"), /*.temp = */ temp, } ); @@ -1926,15 +1108,14 @@ struct llama_sampler * llama_sampler_init_temp(float temp) { // temp-ext -struct llama_sampler_temp_ext : public llama_sampler_backend { +struct llama_sampler_temp_ext { const float temp; const float delta; const float exponent; }; -static const char * llama_sampler_temp_ext_name(const struct llama_sampler * smpl) { - auto * sctx = (llama_sampler_temp_ext *) smpl->ctx; - return sctx->get_name(); +static const char * llama_sampler_temp_ext_name(const struct llama_sampler * /*smpl*/) { + return "temp-ext"; } static void llama_sampler_temp_ext_apply(struct llama_sampler * smpl, llama_token_data_array * cur_p) { @@ -2017,112 +1198,24 @@ static void llama_sampler_temp_ext_free(struct llama_sampler * smpl) { delete (llama_sampler_temp_ext *) smpl->ctx; } -static bool llama_sampler_temp_ext_backend_init( - struct llama_sampler * smpl, - ggml_backend_buffer_type_t buft) { - auto * sctx = (llama_sampler_temp_ext *) smpl->ctx; - - const bool res = llama_sampler_backend_support(smpl, buft); - - sctx->init(res); - - return res; -} - -static void llama_sampler_temp_ext_backend_apply( - struct llama_sampler * smpl, - struct ggml_context * ctx, - struct ggml_cgraph * gf, - struct llama_sampler_data * data) { - auto * sctx = (llama_sampler_temp_ext *) smpl->ctx; - - // Revert to standard temperature scaling if delta or temp are non-positive. - if (sctx->delta <= 0.0f || sctx->temp <= 0.0f) { - llama_sampler_backend_temp_sampling(ctx, gf, data, sctx->temp); - return; - } - - // Calculate min_temp, max_temp, and max_entropy. - const float min_temp = std::max(0.0f, sctx->temp - sctx->delta); - const float max_temp = sctx->temp + sctx->delta; - const float max_entropy = logf(data->logits->ne[0]); - - // Calculate the probabilities. - struct ggml_tensor * probs = ggml_soft_max(ctx, data->logits); - ggml_set_name(probs, "temp_ext_softmax_probs"); - - // Clamp probabilities to avoid log(0) which would give -inf - struct ggml_tensor * probs_clamped = ggml_clamp(ctx, probs, 1e-10f, 1.0f); - ggml_set_name(probs_clamped, "temp_ext_probs_clamped"); - - // Calculate the entropy, entropy = -Σ(p * log(p)). - struct ggml_tensor * log_probs = ggml_log(ctx, probs_clamped); - struct ggml_tensor * p_log_p = ggml_mul(ctx, probs_clamped, log_probs); - struct ggml_tensor * sum_p_log_p = ggml_sum(ctx, p_log_p); - struct ggml_tensor * entropy = ggml_scale(ctx, sum_p_log_p, -1.0f); - ggml_set_name(log_probs, "temp_ext_log_probs"); - ggml_set_name(p_log_p, "temp_ext_p_log_p"); - ggml_set_name(sum_p_log_p, "temp_ext_sum_p_log_p"); - ggml_set_name(entropy, "temp_ext_entropy"); - - // Normalize the entropy, norm_entropy = entropy / max_entropy - struct ggml_tensor * norm_entropy = ggml_scale(ctx, entropy, 1.0f / max_entropy); - ggml_set_name(norm_entropy, "temp_ext_norm_entropy"); - - // Calculate the dynamic temperature: - // dyn_temp = min_temp + (max_temp - min_temp) * powf(normalized_entropy, exponent); - // - // Calculate powf(normalized_entropy, exponent) as - // norm_entropy^exponent = exp(exponent * log(norm_entropy)) - struct ggml_tensor * log_norm_entropy = ggml_log(ctx, norm_entropy); - struct ggml_tensor * scaled_log = ggml_scale(ctx, log_norm_entropy, sctx->exponent); - struct ggml_tensor * pow_entropy = ggml_exp(ctx, scaled_log); - // With pow_entropy computed we can now compute dyn_temp, scaling by - // (max_temp - min_temp) and then adding min_temp. - struct ggml_tensor * dyn_temp = ggml_scale_bias(ctx, pow_entropy, max_temp - min_temp, min_temp); - ggml_set_name(log_norm_entropy, "temp_ext_log_norm_entropy"); - ggml_set_name(scaled_log, "temp_ext_scaled_log"); - ggml_set_name(pow_entropy, "temp_ext_pow_entropy"); - ggml_set_name(dyn_temp, "temp_ext_dyn_temp"); - - // Scale the logits by the dynamic temperature - struct ggml_tensor * scaled_logits = ggml_div(ctx, data->logits, dyn_temp); - ggml_set_name(scaled_logits, "temp_ext_scaled_logits"); - - data->logits = scaled_logits; -} - static struct llama_sampler_i llama_sampler_temp_ext_i = { - /* .name = */ llama_sampler_temp_ext_name, - /* .accept = */ nullptr, - /* .apply = */ llama_sampler_temp_ext_apply, - /* .reset = */ nullptr, - /* .clone = */ llama_sampler_temp_ext_clone, - /* .free = */ llama_sampler_temp_ext_free, - /* .backend_init = */ llama_sampler_temp_ext_backend_init, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ llama_sampler_temp_ext_backend_apply, - /* .backend_set_input = */ nullptr, + /* .name = */ llama_sampler_temp_ext_name, + /* .accept = */ nullptr, + /* .apply = */ llama_sampler_temp_ext_apply, + /* .reset = */ nullptr, + /* .clone = */ llama_sampler_temp_ext_clone, + /* .free = */ llama_sampler_temp_ext_free, }; struct llama_sampler * llama_sampler_init_temp_ext(float temp, float delta, float exponent) { - const bool is_empty = temp == 1.0f && delta <= 0.0f; - - if (is_empty) { - return llama_sampler_init_empty("?temp-ext"); - } - - auto * res = llama_sampler_init( + return llama_sampler_init( /* .iface = */ &llama_sampler_temp_ext_i, /* .ctx = */ new llama_sampler_temp_ext { - ("temp-ext"), /* .temp = */ temp, /* .delta = */ delta, /* .exponent = */ exponent, } ); - - return res; } // xtc @@ -2135,7 +1228,7 @@ struct llama_sampler_xtc { const uint32_t seed; uint32_t seed_cur; - std::mt19937 rng; + std::mt19937 rng; }; static const char * llama_sampler_xtc_name(const struct llama_sampler * /*smpl*/) { @@ -2200,27 +1293,16 @@ static void llama_sampler_xtc_reset(struct llama_sampler * smpl) { } static struct llama_sampler_i llama_sampler_xtc_i = { - /* .name = */ llama_sampler_xtc_name, - /* .accept = */ nullptr, - /* .apply = */ llama_sample_xtc_apply, - /* .reset = */ llama_sampler_xtc_reset, - /* .clone = */ llama_sampler_xtc_clone, - /* .free = */ llama_sampler_xtc_free, - /* .backend_init = */ nullptr, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ nullptr, - /* .backend_set_input = */ nullptr, + /* .name = */ llama_sampler_xtc_name, + /* .accept = */ nullptr, + /* .apply = */ llama_sample_xtc_apply, + /* .reset = */ llama_sampler_xtc_reset, + /* .clone = */ llama_sampler_xtc_clone, + /* .free = */ llama_sampler_xtc_free, }; struct llama_sampler * llama_sampler_init_xtc(float p, float t, size_t min_keep, uint32_t seed) { - const bool is_empty = (p <= 0.0f || t > 0.5f); - - if (is_empty) { - return llama_sampler_init_empty("?xtc"); - } - - const auto seed_cur = get_rng_seed(seed); - + auto seed_cur = get_rng_seed(seed); return llama_sampler_init( /* .iface = */ &llama_sampler_xtc_i, /* .ctx = */ new llama_sampler_xtc { @@ -2319,21 +1401,16 @@ static void llama_sampler_mirostat_free(struct llama_sampler * smpl) { } static struct llama_sampler_i llama_sampler_mirostat_i = { - /* .name = */ llama_sampler_mirostat_name, - /* .accept = */ nullptr, - /* .apply = */ llama_sampler_mirostat_apply, - /* .reset = */ llama_sampler_mirostat_reset, - /* .clone = */ llama_sampler_mirostat_clone, - /* .free = */ llama_sampler_mirostat_free, - /* .backend_init = */ nullptr, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ nullptr, - /* .backend_set_input = */ nullptr, + /* .name = */ llama_sampler_mirostat_name, + /* .accept = */ nullptr, + /* .apply = */ llama_sampler_mirostat_apply, + /* .reset = */ llama_sampler_mirostat_reset, + /* .clone = */ llama_sampler_mirostat_clone, + /* .free = */ llama_sampler_mirostat_free, }; struct llama_sampler * llama_sampler_init_mirostat(int32_t n_vocab, uint32_t seed, float tau, float eta, int32_t m) { - const auto seed_cur = get_rng_seed(seed); - + auto seed_cur = get_rng_seed(seed); return llama_sampler_init( /* .iface = */ &llama_sampler_mirostat_i, /* .ctx = */ new llama_sampler_mirostat { @@ -2423,16 +1500,12 @@ static void llama_sampler_mirostat_v2_free(struct llama_sampler * smpl) { } static struct llama_sampler_i llama_sampler_mirostat_v2_i = { - /* .name = */ llama_sampler_mirostat_v2_name, - /* .accept = */ nullptr, - /* .apply = */ llama_sampler_mirostat_v2_apply, - /* .reset = */ llama_sampler_mirostat_v2_reset, - /* .clone = */ llama_sampler_mirostat_v2_clone, - /* .free = */ llama_sampler_mirostat_v2_free, - /* .backend_init = */ nullptr, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ nullptr, - /* .backend_set_input = */ nullptr, + /* .name = */ llama_sampler_mirostat_v2_name, + /* .accept = */ nullptr, + /* .apply = */ llama_sampler_mirostat_v2_apply, + /* .reset = */ llama_sampler_mirostat_v2_reset, + /* .clone = */ llama_sampler_mirostat_v2_clone, + /* .free = */ llama_sampler_mirostat_v2_free, }; struct llama_sampler * llama_sampler_init_mirostat_v2(uint32_t seed, float tau, float eta) { @@ -2544,16 +1617,12 @@ static void llama_sampler_grammar_free(struct llama_sampler * smpl) { } static struct llama_sampler_i llama_sampler_grammar_i = { - /* .name = */ llama_sampler_grammar_name, - /* .accept = */ llama_sampler_grammar_accept_impl, - /* .apply = */ llama_sampler_grammar_apply, - /* .reset = */ llama_sampler_grammar_reset, - /* .clone = */ llama_sampler_grammar_clone, - /* .free = */ llama_sampler_grammar_free, - /* .backend_init = */ nullptr, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ nullptr, - /* .backend_set_input = */ nullptr, + /* .name = */ llama_sampler_grammar_name, + /* .accept = */ llama_sampler_grammar_accept_impl, + /* .apply = */ llama_sampler_grammar_apply, + /* .reset = */ llama_sampler_grammar_reset, + /* .clone = */ llama_sampler_grammar_clone, + /* .free = */ llama_sampler_grammar_free, }; static struct llama_sampler * llama_sampler_init_grammar_impl( @@ -2755,16 +1824,12 @@ static void llama_sampler_penalties_free(struct llama_sampler * smpl) { } static struct llama_sampler_i llama_sampler_penalties_i = { - /* .name = */ llama_sampler_penalties_name, - /* .accept = */ llama_sampler_penalties_accept, - /* .apply = */ llama_sampler_penalties_apply, - /* .reset = */ llama_sampler_penalties_reset, - /* .clone = */ llama_sampler_penalties_clone, - /* .free = */ llama_sampler_penalties_free, - /* .backend_init = */ nullptr, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ nullptr, - /* .backend_set_input = */ nullptr, + /* .name = */ llama_sampler_penalties_name, + /* .accept = */ llama_sampler_penalties_accept, + /* .apply = */ llama_sampler_penalties_apply, + /* .reset = */ llama_sampler_penalties_reset, + /* .clone = */ llama_sampler_penalties_clone, + /* .free = */ llama_sampler_penalties_free, }; struct llama_sampler * llama_sampler_init_penalties( @@ -2774,12 +1839,6 @@ struct llama_sampler * llama_sampler_init_penalties( float penalty_present) { penalty_last_n = std::max(penalty_last_n, 0); - const bool is_empty = (penalty_last_n == 0 || (penalty_repeat == 1.0f && penalty_freq == 0.0f && penalty_present == 0.0f)); - - if (is_empty) { - return llama_sampler_init_empty("?penalties"); - } - return llama_sampler_init( /* .iface = */ &llama_sampler_penalties_i, /* .ctx = */ new llama_sampler_penalties { @@ -2817,7 +1876,9 @@ static void llama_sampler_top_n_sigma_apply(struct llama_sampler * smpl, llama_t for (size_t i = 0; i < cur_p->size; ++i) { // Only count non-negative infinity values if (cur_p->data[i].logit != -INFINITY) { - max = std::max(max, cur_p->data[i].logit); + if (cur_p->data[i].logit > max) { + max = cur_p->data[i].logit; + } logits_sum += cur_p->data[i].logit; valid_count++; } @@ -2854,25 +1915,15 @@ static void llama_sampler_top_n_sigma_free(struct llama_sampler * smpl) { } static struct llama_sampler_i llama_sampler_top_n_sigma_i = { - /* .name = */ llama_sampler_top_n_sigma_name, - /* .accept = */ nullptr, - /* .apply = */ llama_sampler_top_n_sigma_apply, - /* .reset = */ nullptr, - /* .clone = */ llama_sampler_top_n_sigma_clone, - /* .free = */ llama_sampler_top_n_sigma_free, - /* .backend_init = */ nullptr, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ nullptr, - /* .backend_set_input = */ nullptr, + /* .name = */ llama_sampler_top_n_sigma_name, + /* .accept = */ nullptr, + /* .apply = */ llama_sampler_top_n_sigma_apply, + /* .reset = */ nullptr, + /* .clone = */ llama_sampler_top_n_sigma_clone, + /* .free = */ llama_sampler_top_n_sigma_free, }; struct llama_sampler * llama_sampler_init_top_n_sigma(float n) { - const bool is_empty = (n <= 0.0f); - - if (is_empty) { - return llama_sampler_init_empty("?top-n-sigma"); - } - return llama_sampler_init( /* .iface = */ &llama_sampler_top_n_sigma_i, /* .ctx = */ new llama_sampler_top_n_sigma { @@ -3194,16 +2245,12 @@ static void llama_sampler_dry_free(struct llama_sampler * smpl) { } static struct llama_sampler_i llama_sampler_dry_i = { - /* .name = */ llama_sampler_dry_name, - /* .accept = */ llama_sampler_dry_accept, - /* .apply = */ llama_sampler_dry_apply, - /* .reset = */ llama_sampler_dry_reset, - /* .clone = */ llama_sampler_dry_clone, - /* .free = */ llama_sampler_dry_free, - /* .backend_init = */ nullptr, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ nullptr, - /* .backend_set_input = */ nullptr, + /* .name = */ llama_sampler_dry_name, + /* .accept = */ llama_sampler_dry_accept, + /* .apply = */ llama_sampler_dry_apply, + /* .reset = */ llama_sampler_dry_reset, + /* .clone = */ llama_sampler_dry_clone, + /* .free = */ llama_sampler_dry_free, }; struct llama_sampler * llama_sampler_init_dry(const struct llama_vocab * vocab, int32_t n_ctx_train, float dry_multiplier, float dry_base, int32_t dry_allowed_length, int32_t dry_penalty_last_n, const char** seq_breakers, size_t num_breakers) { @@ -3214,10 +2261,6 @@ struct llama_sampler * llama_sampler_init_dry(const struct llama_vocab * vocab, const bool dry_enabled = (dry_multiplier != 0.0f && dry_base >= 1.0f && dry_penalty_last_n != 0); - if (!dry_enabled) { - return llama_sampler_init_empty("?dry"); - } - if (dry_enabled && seq_breakers != nullptr && num_breakers > 0) { // Process sequence breakers for (size_t i = 0; i < num_breakers; ++i) { @@ -3286,189 +2329,18 @@ struct llama_sampler * llama_sampler_init_dry_testing(int32_t context_size, floa return result; } -// adaptive-p sampler state -// -// maintains an exponential moving average of the *ORIGINAL* probabilities -// of selected tokens, used to compute an adapted target at each sampling step. -// -// see llama.h for a full description of the sampler -// -// ref: https://github.com/ggml-org/llama.cpp/pull/17927 -// -struct llama_sampler_adaptive_p { - const float target; // target probability (0.0 - 1.0; negative = disabled) - const float decay; // EMA decay; history ~= 1/(1-decay) tokens (0.0 - 0.99) - const uint32_t seed; // original RNG seed - uint32_t seed_cur; // actual RNG seed - std::mt19937 rng; // RNG state - float weighted_sum; // sum(p_i * decay^i) - float total_weight; // sum(decay^i), converges to 1/(1-decay) - std::vector original_probs; // pre-transform probs, cached for EMA update - llama_token pending_token_id; // token ID of selected token - int32_t pending_token_idx; // index of orig. prob. of selected token in original_probs -}; - -// adaptive probability transformation constants -static constexpr float DISTRIBUTION_WIDTH = 0.3f; -static constexpr float PEAK_LOGIT_VALUE = 5.0f; -static constexpr float SHARPNESS = 10.0f; -static constexpr float INV_WIDTH = 1.0f / DISTRIBUTION_WIDTH; - -static const char * llama_sampler_adaptive_p_name(const struct llama_sampler * /*smpl*/) { - return "adaptive-p"; -} - -static void llama_sampler_adaptive_p_apply(struct llama_sampler * smpl, llama_token_data_array * cur_p) { - auto * ctx = (llama_sampler_adaptive_p *) smpl->ctx; - - llama_sampler_softmax_impl(cur_p, false); - - if (ctx->target < 0.0f) { - // at negative target values, adaptive-p is no-op - // we simply sample from the existing distribution - cur_p->selected = llama_sample_dist(cur_p, ctx->rng); - return; - } - - // store the original probabilities - ctx->original_probs.resize(cur_p->size); - for (size_t i = 0; i < cur_p->size; ++i) { - ctx->original_probs[i] = cur_p->data[i].p; - } - - // using the EMA, compute the adapted target probability for the current sampling step - auto target = std::clamp(ctx->target, 0.0f, 1.0f); - float adapted_target = std::clamp( - ctx->total_weight == 0.0f ? target : 2.0f * target - (ctx->weighted_sum / ctx->total_weight), - 0.0f, 1.0f - ); - - // adaptive probability transform - // - // quadratic near target for fine differentiation, transitioning to linear decay in the - // tails. unbounded negative logits ensure proper suppression of far-from-target tokens - // after the softmax. - // - for (size_t i = 0; i < cur_p->size; ++i) { - if (cur_p->data[i].logit == -INFINITY) { - // don't transform logits that are -INFINITY - // (as masked out by e.g. min-p and top-p when using backend sampling) - continue; - } - float dist = std::abs((cur_p->data[i].p - adapted_target) * INV_WIDTH); - cur_p->data[i].logit = PEAK_LOGIT_VALUE - SHARPNESS * dist * dist / (1.0f + dist); - } - - // softmax and sample from the transformed distribution - llama_sampler_softmax_impl(cur_p, false); - const int idx = llama_sample_dist(cur_p, ctx->rng); - cur_p->selected = idx; - - // store the selected token ID for acceptance later - ctx->pending_token_id = cur_p->data[idx].id; - ctx->pending_token_idx = idx; -} - -static void llama_sampler_adaptive_p_accept(struct llama_sampler * smpl, llama_token token) { - auto * ctx = (llama_sampler_adaptive_p *) smpl->ctx; - if (ctx->pending_token_id == token) { - GGML_ASSERT(ctx->pending_token_id != LLAMA_TOKEN_NULL); - GGML_ASSERT(ctx->pending_token_idx != -1); - // update EMA with the original probability of the selected token - ctx->weighted_sum = ctx->original_probs[ctx->pending_token_idx] + ctx->decay * ctx->weighted_sum; - ctx->total_weight = 1.0f + ctx->decay * ctx->total_weight; - } - ctx->pending_token_id = LLAMA_TOKEN_NULL; - ctx->pending_token_idx = -1; -} - -static void llama_sampler_adaptive_p_reset(struct llama_sampler * smpl) { - auto * ctx = (llama_sampler_adaptive_p *) smpl->ctx; - // ctx->target and ctx->decay never change after init, so it's safe to keep them as is. - // original_probs is completely overwritten on every call to _apply. - // so we only need to reset the EMA state and pending token. - ctx->weighted_sum = ctx->target / (1.0f - ctx->decay); - ctx->total_weight = 1.0f / (1.0f - ctx->decay); - ctx->pending_token_id = LLAMA_TOKEN_NULL; - ctx->pending_token_idx = -1; - ctx->seed_cur = get_rng_seed(ctx->seed); - ctx->rng.seed(ctx->seed_cur); -} - -static struct llama_sampler * llama_sampler_adaptive_p_clone(const struct llama_sampler * smpl) { - const auto * ctx = (const llama_sampler_adaptive_p *) smpl->ctx; - auto * result = llama_sampler_init_adaptive_p(ctx->target, ctx->decay, ctx->seed); - auto * result_ctx = (llama_sampler_adaptive_p *) result->ctx; - - // copy everything (target, decay, seed, and RNG are already set) - result_ctx->weighted_sum = ctx->weighted_sum; - result_ctx->total_weight = ctx->total_weight; - result_ctx->pending_token_id = ctx->pending_token_id; - result_ctx->pending_token_idx = ctx->pending_token_idx; - - return result; -} - -static void llama_sampler_adaptive_p_free(struct llama_sampler * smpl) { - delete (llama_sampler_adaptive_p *) smpl->ctx; -} - -static struct llama_sampler_i llama_sampler_adaptive_p_i = { - /* .name = */ llama_sampler_adaptive_p_name, - /* .accept = */ llama_sampler_adaptive_p_accept, - /* .apply = */ llama_sampler_adaptive_p_apply, - /* .reset = */ llama_sampler_adaptive_p_reset, - /* .clone = */ llama_sampler_adaptive_p_clone, - /* .free = */ llama_sampler_adaptive_p_free, - /* .backend_init = */ nullptr, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ nullptr, - /* .backend_set_input = */ nullptr, -}; - -struct llama_sampler * llama_sampler_init_adaptive_p( - float target, - float decay, - uint32_t seed -) { - auto seed_cur = get_rng_seed(seed); - float clamped_decay = std::clamp(decay, 0.0f, 0.99f); - return llama_sampler_init( - /* .iface = */ &llama_sampler_adaptive_p_i, - /* .ctx = */ new llama_sampler_adaptive_p { - /* .target = */ target, - /* .decay = */ clamped_decay, - /* .seed = */ seed, - /* .seed_cur = */ seed_cur, - /* .rng = */ std::mt19937(seed_cur), - /* .weighted_sum = */ target / (1.0f - clamped_decay), - /* .total_weight = */ 1.0f / (1.0f - clamped_decay), - /* .original_probs = */ {}, - /* .pending_token_id = */ LLAMA_TOKEN_NULL, - /* .pending_token_idx = */ -1 - } - ); -} - // logit-bias -struct llama_sampler_logit_bias : public llama_sampler_backend { +struct llama_sampler_logit_bias { const int32_t n_vocab; const std::vector logit_bias; std::vector to_search; - - struct ggml_tensor * inp_logit_bias; - struct ggml_tensor * inp_logit_idxs; - - ggml_context_ptr inp_ctx; - ggml_backend_buffer_ptr inp_buf; }; -static const char * llama_sampler_logit_bias_name(const struct llama_sampler * smpl) { - auto * ctx = (llama_sampler_logit_bias *) smpl->ctx; - return ctx->get_name(); +static const char * llama_sampler_logit_bias_name(const struct llama_sampler * /*smpl*/) { + return "logit-bias"; } static void llama_sampler_logit_bias_apply(struct llama_sampler * smpl, llama_token_data_array * cur_p) { @@ -3513,123 +2385,25 @@ static void llama_sampler_logit_bias_free(struct llama_sampler * smpl) { delete (llama_sampler_logit_bias *) smpl->ctx; } -static void llama_sampler_logit_bias_backend_apply( - struct llama_sampler * smpl, - struct ggml_context * ctx, - struct ggml_cgraph * gf, - struct llama_sampler_data * data) { - GGML_UNUSED(gf); - GGML_UNUSED(ctx); - - auto * sctx = (llama_sampler_logit_bias *) smpl->ctx; - if (sctx->logit_bias.empty()) { - return; - } - - ggml_tensor * cur = ggml_fill(ctx, data->logits, 0.0f); - - cur = ggml_reshape_2d(ctx, cur, 1, ggml_nelements(cur)); - cur = ggml_set_rows(ctx, cur, sctx->inp_logit_bias, sctx->inp_logit_idxs); - cur = ggml_reshape_1d(ctx, cur, ggml_nelements(cur)); - - data->logits = ggml_add(ctx, data->logits, cur); -} - -static void llama_sampler_logit_bias_backend_set_input(struct llama_sampler * smpl) { - auto * sctx = (llama_sampler_logit_bias *) smpl->ctx; - if (sctx->logit_bias.empty()) { - return; - } - - GGML_ASSERT(sctx->inp_logit_bias != nullptr); - GGML_ASSERT(sctx->inp_logit_idxs != nullptr); - - const size_t n = sctx->logit_bias.size(); - - std::vector data_logit_bias(n, 0.0f); - std::vector data_logit_idxs(n, 0); - for (size_t i = 0; i < n; ++i) { - const auto & lb = sctx->logit_bias[i]; - GGML_ASSERT(lb.token >= 0 && lb.token < (int32_t) sctx->n_vocab); - data_logit_bias[i] = lb.bias; - data_logit_idxs[i] = lb.token; - } - - ggml_backend_tensor_set(sctx->inp_logit_bias, data_logit_bias.data(), 0, ggml_nbytes(sctx->inp_logit_bias)); - ggml_backend_tensor_set(sctx->inp_logit_idxs, data_logit_idxs.data(), 0, ggml_nbytes(sctx->inp_logit_idxs)); -} - -static bool llama_sampler_logit_bias_backend_init( - struct llama_sampler * smpl, - ggml_backend_buffer_type_t buft) { - auto * sctx = (llama_sampler_logit_bias *) smpl->ctx; - - sctx->init(true); - - if (sctx->logit_bias.empty()) { - return true; - } - - ggml_init_params params = { - /*.mem_size =*/ 2*ggml_tensor_overhead(), - /*.mem_buffer =*/ nullptr, - /*.no_alloc =*/ true, - }; - - sctx->inp_ctx.reset(ggml_init(params)); - - const size_t n = sctx->logit_bias.size(); - - sctx->inp_logit_bias = ggml_new_tensor_2d(sctx->inp_ctx.get(), GGML_TYPE_F32, 1, n); - ggml_set_name(sctx->inp_logit_bias, "logit_bias"); - ggml_set_input(sctx->inp_logit_bias); - - sctx->inp_logit_idxs = ggml_new_tensor_1d(sctx->inp_ctx.get(), GGML_TYPE_I32, n); - ggml_set_name(sctx->inp_logit_idxs, "logit_idxs"); - ggml_set_input(sctx->inp_logit_idxs); - - // Allocate all tensors from our context to the backend - sctx->inp_buf.reset(ggml_backend_alloc_ctx_tensors_from_buft(sctx->inp_ctx.get(), buft)); - - ggml_backend_buffer_clear(sctx->inp_buf.get(), 0); - - return true; -} - static struct llama_sampler_i llama_sampler_logit_bias_i = { - /* .name = */ llama_sampler_logit_bias_name, - /* .accept = */ nullptr, - /* .apply = */ llama_sampler_logit_bias_apply, - /* .reset = */ nullptr, - /* .clone = */ llama_sampler_logit_bias_clone, - /* .free = */ llama_sampler_logit_bias_free, - /* .backend_init = */ llama_sampler_logit_bias_backend_init, - /* .backend_accept = */ nullptr, - /* .backend_apply = */ llama_sampler_logit_bias_backend_apply, - /* .backend_set_input = */ llama_sampler_logit_bias_backend_set_input, + /* .name = */ llama_sampler_logit_bias_name, + /* .accept = */ nullptr, + /* .apply = */ llama_sampler_logit_bias_apply, + /* .reset = */ nullptr, + /* .clone = */ llama_sampler_logit_bias_clone, + /* .free = */ llama_sampler_logit_bias_free, }; struct llama_sampler * llama_sampler_init_logit_bias( int32_t n_vocab, int32_t n_logit_bias, const llama_logit_bias * logit_bias) { - const bool is_empty = n_logit_bias <= 0; - - if (is_empty) { - return llama_sampler_init_empty("?logit-bias"); - } - return llama_sampler_init( /* .iface = */ &llama_sampler_logit_bias_i, /* .ctx = */ new llama_sampler_logit_bias { - ("logit-bias"), - /* .n_vocab = */ n_vocab, - /* .logit_bias = */ std::vector(logit_bias, logit_bias + n_logit_bias), - /* .to_search = */ {}, - /* .inp_logit_bias = */ nullptr, - /* .inp_logit_idxs = */ nullptr, - /* .inp_ctx = */ nullptr, - /* .inp_buf = */ nullptr, + /* .n_vocab = */ n_vocab, + /* .logit_bias = */ std::vector(logit_bias, logit_bias + n_logit_bias), + /* .to_search = */ {}, } ); } @@ -3842,16 +2616,12 @@ static void llama_sampler_infill_free(struct llama_sampler * smpl) { } static struct llama_sampler_i llama_sampler_infill_i = { - /* .name = */ llama_sampler_infill_name, - /* .accept = */ nullptr, - /* .apply = */ llama_sampler_infill_apply, - /* .reset = */ nullptr, - /* .clone = */ llama_sampler_infill_clone, - /* .free = */ llama_sampler_infill_free, - /* .backend_apply = */ nullptr, - /* .backend_accept = */ nullptr, - /* .backend_set_input = */ nullptr, - /* .backend_init = */ nullptr, + /* .name = */ llama_sampler_infill_name, + /* .accept = */ nullptr, + /* .apply = */ llama_sampler_infill_apply, + /* .reset = */ nullptr, + /* .clone = */ llama_sampler_infill_clone, + /* .free = */ llama_sampler_infill_free, }; struct llama_sampler * llama_sampler_init_infill(const struct llama_vocab * vocab) { @@ -3883,7 +2653,7 @@ uint32_t llama_sampler_get_seed(const struct llama_sampler * smpl) { if (smpl->iface == &llama_sampler_chain_i) { const auto * ctx = (const llama_sampler_chain *) smpl->ctx; for (auto it = ctx->samplers.rbegin(); it != ctx->samplers.rend(); ++it) { - const uint32_t seed = llama_sampler_get_seed(it->ptr); + const uint32_t seed = llama_sampler_get_seed(*it); if (seed != LLAMA_DEFAULT_SEED) { return seed; } diff --git a/src/llama-sampling.h b/src/llama-sampling.h index 6a963c0..759dd7d 100644 --- a/src/llama-sampling.h +++ b/src/llama-sampling.h @@ -14,19 +14,7 @@ struct llama_grammar; struct llama_sampler_chain { llama_sampler_chain_params params; - // has .backend_init() been called? - bool is_init = false; - - struct info { - bool is_backend; - - llama_sampler * ptr; - }; - - std::vector samplers; - - // pre-allocated buffer for llama_sampler_sample to avoid repeated allocations - std::vector cur; + std::vector samplers; // timing @@ -36,9 +24,9 @@ struct llama_sampler_chain { }; struct llama_sampler * llama_sampler_init_dry_testing( - int32_t context_size, - float dry_multiplier, - float dry_base, - int32_t dry_allowed_length, - int32_t dry_penalty_last_n, - const std::vector> & seq_breakers); + int32_t context_size, + float dry_multiplier, + float dry_base, + int32_t dry_allowed_length, + int32_t dry_penalty_last_n, + const std::vector>& seq_breakers); diff --git a/src/llama-vocab.cpp b/src/llama-vocab.cpp index a23950d..cd4092c 100644 --- a/src/llama-vocab.cpp +++ b/src/llama-vocab.cpp @@ -314,12 +314,6 @@ struct llm_tokenizer_bpe : llm_tokenizer { "[!\"#$%&'()*+,\\-./:;<=>?@\\[\\\\\\]^_`{|}~][A-Za-z]+|[^\r\n\\p{L}\\p{P}\\p{S}]?[\\p{L}\\p{M}]+| ?[\\p{P}\\p{S}]+[\r\n]*|\\s*[\r\n]+|\\s+(?!\\S)|\\s+", }; break; - case LLAMA_VOCAB_PRE_TYPE_YOUTU: - regex_exprs = { - "[가-힣ㄱ-ㆎ]+|[!…“”‘’—:;,、-〿︰-﹏]+|[ㄅ-ㄯ]+|[一-龥぀-ゟ゠-ヿ]+", - "[^\\r\\n\\p{L}\\p{N}]?[\\p{Lu}\\p{Lt}\\p{Lm}\\p{Lo}\\p{M}]*[\\p{Ll}\\p{Lm}\\p{Lo}\\p{M}]+(?:'[sS]|'[tT]|'[rR][eE]|'[vV][eE]|'[mM]|'[lL][lL]|'[dD])?|[^\\r\\n\\p{L}\\p{N}]?[\\p{Lu}\\p{Lt}\\p{Lm}\\p{Lo}\\p{M}]+[\\p{Ll}\\p{Lm}\\p{Lo}\\p{M}]*(?:'[sS]|'[tT]|'[rR][eE]|'[vV][eE]|'[mM]|'[lL][lL]|'[dD])?|\\p{N}| ?[^\\s\\p{L}\\p{N}]+[\\r\\n/]*|\\s*[\\r\\n]+|\\s+(?!\\S)|\\s+", - }; - break; case LLAMA_VOCAB_PRE_TYPE_DEEPSEEK_CODER: regex_exprs = { "[\r\n]", @@ -361,7 +355,6 @@ struct llm_tokenizer_bpe : llm_tokenizer { case LLAMA_VOCAB_PRE_TYPE_STABLELM2: case LLAMA_VOCAB_PRE_TYPE_QWEN2: case LLAMA_VOCAB_PRE_TYPE_HUNYUAN: - case LLAMA_VOCAB_PRE_TYPE_SOLAR_OPEN: regex_exprs = { // original regex from tokenizer.json // "(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\\r\\n\\p{L}\\p{N}]?\\p{L}+|\\p{N}| ?[^\\s\\p{L}\\p{N}]+[\\r\\n]*|\\s*[\\r\\n]+|\\s+(?!\\S)|\\s+" @@ -461,13 +454,6 @@ struct llm_tokenizer_bpe : llm_tokenizer { "[!\"#$%&'()*+,\\-./:;<=>?@\\[\\\\\\]^_`{|}~][A-Za-z]+|[^\\r\\n\\p{L}\\p{P}\\p{S}]?[\\p{L}\\p{M}]+| ?[\\p{P}\\p{S}]+[\\r\\n]*|\\s*[\\r\\n]+|\\s+(?!\\S)|\\s+", }; break; - case LLAMA_VOCAB_PRE_TYPE_EXAONE_MOE: - regex_exprs = { - // original regex from tokenizer.json - // "(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\\r\\n\\p{L}\\p{N}]?(?:\\p{L}\\p{M}*(?: \\p{L}\\p{M}*)*)+|\\p{N}| ?[^\\s\\p{L}\\p{N}]+[\\r\\n/]?|\\s*[\\r\\n]|\\s+(?!\\S)|\\s+" - "(?:'[sS]|'[tT]|'[rR][eE]|'[vV][eE]|'[mM]|'[lL][lL]|'[dD])|[^\\r\\n\\p{L}\\p{N}]?(?:\\p{L}\\p{M}*(?: \\p{L}\\p{M}*)*)+|\\p{N}| ?[^\\s\\p{L}\\p{N}]+[\\r\\n/]?|\\s*[\\r\\n]|\\s+(?!\\S)|\\s+", - }; - break; default: // default regex for BPE tokenization pre-processing regex_exprs = { @@ -1874,11 +1860,6 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { tokenizer_pre == "deepseek-v3") { pre_type = LLAMA_VOCAB_PRE_TYPE_DEEPSEEK3_LLM; clean_spaces = false; - } else if ( - tokenizer_pre == "youtu") { - pre_type = LLAMA_VOCAB_PRE_TYPE_YOUTU; - clean_spaces = false; - ignore_merges = true; } else if ( tokenizer_pre == "falcon") { pre_type = LLAMA_VOCAB_PRE_TYPE_FALCON; @@ -1972,9 +1953,6 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { } else if ( tokenizer_pre == "exaone4") { pre_type = LLAMA_VOCAB_PRE_TYPE_GPT2; - } else if ( - tokenizer_pre == "exaone-moe") { - pre_type = LLAMA_VOCAB_PRE_TYPE_EXAONE_MOE; } else if ( tokenizer_pre == "chameleon") { pre_type = LLAMA_VOCAB_PRE_TYPE_CHAMELEON; @@ -2037,10 +2015,6 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { tokenizer_pre == "minimax-m2") { pre_type = LLAMA_VOCAB_PRE_TYPE_MINIMAX_M2; clean_spaces = false; - } else if ( - tokenizer_pre == "solar-open") { - pre_type = LLAMA_VOCAB_PRE_TYPE_SOLAR_OPEN; - clean_spaces = false; } else { throw std::runtime_error(format("unknown pre-tokenizer type: '%s'", tokenizer_pre.c_str())); } @@ -2213,8 +2187,6 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { // for now, we apply this workaround to find the tokens based on their text for (const auto & t : token_to_id) { - auto & attr = id_to_token[t.second].attr; - // find EOT token: "<|eot_id|>", "<|im_end|>", "", etc. if (special_eot_id == LLAMA_TOKEN_NULL) { if (false @@ -2230,10 +2202,10 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { || t.first == "" // smoldocling ) { special_eot_id = t.second; - if ((attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { + if ((id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { LLAMA_LOG_WARN("%s: control-looking token: %6d '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n", __func__, t.second, t.first.c_str()); - attr = (llama_token_attr) (attr | LLAMA_TOKEN_ATTR_CONTROL); + id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL; } } } @@ -2244,10 +2216,10 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { || t.first == "<|eom_id|>" ) { special_eom_id = t.second; - if ((attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { + if ((id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { LLAMA_LOG_WARN("%s: control-looking token: %6d '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n", __func__, t.second, t.first.c_str()); - attr = (llama_token_attr) (attr | LLAMA_TOKEN_ATTR_CONTROL); + id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL; } } } @@ -2264,10 +2236,10 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { || t.first == "<|code_prefix|>" // GLM-4.5 ) { special_fim_pre_id = t.second; - if ((attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { + if ((id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { LLAMA_LOG_WARN("%s: control-looking token: %6d '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n", __func__, t.second, t.first.c_str()); - attr = (llama_token_attr) (attr | LLAMA_TOKEN_ATTR_CONTROL); + id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL; } } } @@ -2284,10 +2256,10 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { || t.first == "<|code_suffix|>" // GLM-4.5 ) { special_fim_suf_id = t.second; - if ((attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { + if ((id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { LLAMA_LOG_WARN("%s: control-looking token: %6d '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n", __func__, t.second, t.first.c_str()); - attr = (llama_token_attr) (attr | LLAMA_TOKEN_ATTR_CONTROL); + id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL; } } } @@ -2304,10 +2276,10 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { || t.first == "<|code_middle|>" // GLM-4.5 ) { special_fim_mid_id = t.second; - if ((attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { + if ((id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { LLAMA_LOG_WARN("%s: control-looking token: %6d '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n", __func__, t.second, t.first.c_str()); - attr = (llama_token_attr) (attr | LLAMA_TOKEN_ATTR_CONTROL); + id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL; } } } @@ -2321,10 +2293,10 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { || t.first == "" ) { special_fim_pad_id = t.second; - if ((attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { + if ((id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { LLAMA_LOG_WARN("%s: control-looking token: %6d '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n", __func__, t.second, t.first.c_str()); - attr = (llama_token_attr) (attr | LLAMA_TOKEN_ATTR_CONTROL); + id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL; } } } @@ -2339,10 +2311,10 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { || t.first == "" // Granite ) { special_fim_rep_id = t.second; - if ((attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { + if ((id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { LLAMA_LOG_WARN("%s: control-looking token: %6d '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n", __func__, t.second, t.first.c_str()); - attr = (llama_token_attr) (attr | LLAMA_TOKEN_ATTR_CONTROL); + id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL; } } } @@ -2353,41 +2325,15 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { || t.first == "<|file_sep|>" // Qwen ) { special_fim_sep_id = t.second; - if ((attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { + if ((id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { LLAMA_LOG_WARN("%s: control-looking token: %6d '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n", __func__, t.second, t.first.c_str()); - attr = (llama_token_attr) (attr | LLAMA_TOKEN_ATTR_CONTROL); + id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL; } } } } - // auto-detect unused tokens: e.g. control tokens with the word "unused" - // ideally, these tokens should be marked as unused during conversion - { - uint32_t n_unused = 0; - - for (const auto & t : token_to_id) { - auto & attr = id_to_token[t.second].attr; - - if ((attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { - continue; - } - - if ((attr & LLAMA_TOKEN_ATTR_UNUSED) == 0) { - if (strstr(t.first.c_str(), "unused") != NULL) { - attr = (llama_token_attr) (attr | LLAMA_TOKEN_ATTR_UNUSED); - } - } - - if (attr & LLAMA_TOKEN_ATTR_UNUSED) { - n_unused++; - } - } - - LLAMA_LOG_INFO("%s: %u unused tokens\n", __func__, n_unused); - } - // maintain a list of tokens that cause end-of-generation // this is currently determined based on the token text, which is obviously not ideal // ref: https://github.com/ggerganov/llama.cpp/issues/9606 @@ -2406,16 +2352,12 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { } for (const auto & t : token_to_id) { - auto & attr = id_to_token[t.second].attr; - if (false || t.first == "<|eot_id|>" || t.first == "<|im_end|>" || t.first == "<|end|>" || t.first == "<|return|>" // o200k_harmony || t.first == "<|call|>" // o200k_harmony - || t.first == "<|flush|>" // solar-open - || t.first == "<|calls|>" // solar-open || t.first == "" || t.first == "<|endoftext|>" || t.first == "<|eom_id|>" @@ -2425,31 +2367,24 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { || t.first == "" // smoldocling ) { special_eog_ids.insert(t.second); - if ((attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { + if ((id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL) == 0) { LLAMA_LOG_WARN("%s: control-looking token: %6d '%s' was not control-type; this is probably a bug in the model. its type will be overridden\n", __func__, t.second, t.first.c_str()); - attr = (llama_token_attr) (attr | LLAMA_TOKEN_ATTR_CONTROL); + id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_CONTROL; } } else { - if (attr & LLAMA_TOKEN_ATTR_CONTROL && !(attr & LLAMA_TOKEN_ATTR_UNUSED)) { - // token is control, but not marked as EOG -> print a debug log - if (special_eog_ids.count(t.second) == 0) { - LLAMA_LOG_DEBUG("%s: control token: %6d '%s' is not marked as EOG\n", - __func__, t.second, t.first.c_str()); - } + // token is control, but not marked as EOG -> print a debug log + if (id_to_token[t.second].attr & LLAMA_TOKEN_ATTR_CONTROL && special_eog_ids.count(t.second) == 0) { + LLAMA_LOG_DEBUG("%s: control token: %6d '%s' is not marked as EOG\n", + __func__, t.second, t.first.c_str()); } } } // @ngxson : quick hack for gpt-oss, always render these tokens for (const auto & t : token_to_id) { - auto & attr = id_to_token[t.second].attr; - if (t.first == "<|channel|>" || t.first == "<|message|>" || t.first == "<|start|>" || t.first == "<|constrain|>") { - LLAMA_LOG_WARN("%s: setting token '%s' (%d) attribute to USER_DEFINED (%u), old attributes: %u\n", - __func__, t.first.c_str(), t.second, LLAMA_TOKEN_ATTR_USER_DEFINED, attr); - - attr = LLAMA_TOKEN_ATTR_USER_DEFINED; + id_to_token[t.second].attr = LLAMA_TOKEN_ATTR_USER_DEFINED; } } @@ -2469,42 +2404,34 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { LLAMA_LOG_WARN("%s: special_eom_id is not in special_eog_ids - the tokenizer config may be incorrect\n", __func__); } - // TODO: workaround for o200k_harmony and solar-open tokenizer: the "<|end|>" token should not be EOG - // we don't have a good way to detect this, so for now, if we have "<|return|>" and "<|call|>" tokens ("<|calls|>" and "<|flush|>" for solar-open), + // TODO: workaround for o200k_harmony tokenizer: the "<|end|>" token should not be EOG + // we don't have a good way to detect this, so for now, if we have "<|return|>" and "<|call|>" tokens, // we remove the "<|end|>" token from the EOG list { bool has_return = false; bool has_call = false; bool has_end = false; - bool has_flush = false; llama_token end_id = LLAMA_TOKEN_NULL; LLAMA_LOG_INFO("%s: printing all EOG tokens:\n", __func__); for (auto tid : special_eog_ids) { - auto & text = id_to_token[tid].text; + LLAMA_LOG_INFO("%s: - %d ('%s')\n", __func__, tid, id_to_token[tid].text.c_str()); - LLAMA_LOG_INFO("%s: - %d ('%s')\n", __func__, tid, text.c_str()); - - if (text == "<|return|>") { + if (id_to_token[tid].text == "<|return|>") { has_return = true; - } else if (text == "<|call|>" || text == "<|calls|>") { + } else if (id_to_token[tid].text == "<|call|>") { has_call = true; - } else if (text == "<|flush|>") { - has_flush = true; - } else if (text == "<|end|>") { + } else if (id_to_token[tid].text == "<|end|>") { has_end = true; end_id = tid; } } - if ((has_return && has_call && has_end) || (has_call && has_flush && has_end)) { + if (has_return && has_call && has_end) { special_eog_ids.erase(end_id); - - auto & attr = id_to_token[end_id].attr; - attr = LLAMA_TOKEN_ATTR_USER_DEFINED; - - LLAMA_LOG_WARN("%s: special_eog_ids contains both '<|return|>' and '<|call|>', or '<|calls|>' and '<|flush|>' tokens, removing '<|end|>' token from EOG list\n", __func__); + id_to_token[end_id].attr = LLAMA_TOKEN_ATTR_USER_DEFINED; + LLAMA_LOG_WARN("%s: special_eog_ids contains both '<|return|>' and '<|call|>' tokens, removing '<|end|>' token from EOG list\n", __func__); } } } @@ -3302,34 +3229,34 @@ int32_t llama_vocab::impl::detokenize( } void llama_vocab::impl::print_info() const { - LLAMA_LOG_INFO("%s: vocab type = %s\n", __func__, type_name().c_str()); - LLAMA_LOG_INFO("%s: n_vocab = %u\n", __func__, vocab.n_tokens()); - LLAMA_LOG_INFO("%s: n_merges = %u\n", __func__, (uint32_t) bpe_ranks.size()); + LLAMA_LOG_INFO("%s: vocab type = %s\n", __func__, type_name().c_str()); + LLAMA_LOG_INFO("%s: n_vocab = %u\n", __func__, vocab.n_tokens()); + LLAMA_LOG_INFO("%s: n_merges = %u\n", __func__, (uint32_t) bpe_ranks.size()); // special tokens - if (special_bos_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: BOS token = %d '%s'\n", __func__, special_bos_id, id_to_token.at(special_bos_id).text.c_str() ); } - if (special_eos_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: EOS token = %d '%s'\n", __func__, special_eos_id, id_to_token.at(special_eos_id).text.c_str() ); } - if (special_eot_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: EOT token = %d '%s'\n", __func__, special_eot_id, id_to_token.at(special_eot_id).text.c_str() ); } - if (special_eom_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: EOM token = %d '%s'\n", __func__, special_eom_id, id_to_token.at(special_eom_id).text.c_str() ); } - if (special_unk_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: UNK token = %d '%s'\n", __func__, special_unk_id, id_to_token.at(special_unk_id).text.c_str() ); } - if (special_sep_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: SEP token = %d '%s'\n", __func__, special_sep_id, id_to_token.at(special_sep_id).text.c_str() ); } - if (special_pad_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: PAD token = %d '%s'\n", __func__, special_pad_id, id_to_token.at(special_pad_id).text.c_str() ); } - if (special_mask_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: MASK token = %d '%s'\n", __func__, special_mask_id, id_to_token.at(special_mask_id).text.c_str() ); } + if (special_bos_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: BOS token = %d '%s'\n", __func__, special_bos_id, id_to_token.at(special_bos_id).text.c_str() ); } + if (special_eos_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: EOS token = %d '%s'\n", __func__, special_eos_id, id_to_token.at(special_eos_id).text.c_str() ); } + if (special_eot_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: EOT token = %d '%s'\n", __func__, special_eot_id, id_to_token.at(special_eot_id).text.c_str() ); } + if (special_eom_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: EOM token = %d '%s'\n", __func__, special_eom_id, id_to_token.at(special_eom_id).text.c_str() ); } + if (special_unk_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: UNK token = %d '%s'\n", __func__, special_unk_id, id_to_token.at(special_unk_id).text.c_str() ); } + if (special_sep_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: SEP token = %d '%s'\n", __func__, special_sep_id, id_to_token.at(special_sep_id).text.c_str() ); } + if (special_pad_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: PAD token = %d '%s'\n", __func__, special_pad_id, id_to_token.at(special_pad_id).text.c_str() ); } + if (special_mask_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: MASK token = %d '%s'\n", __func__, special_mask_id, id_to_token.at(special_mask_id).text.c_str() ); } - if (linefeed_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: LF token = %d '%s'\n", __func__, linefeed_id, id_to_token.at(linefeed_id).text.c_str() ); } + if (linefeed_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: LF token = %d '%s'\n", __func__, linefeed_id, id_to_token.at(linefeed_id).text.c_str() ); } - if (special_fim_pre_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: FIM PRE token = %d '%s'\n", __func__, special_fim_pre_id, id_to_token.at(special_fim_pre_id).text.c_str() ); } - if (special_fim_suf_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: FIM SUF token = %d '%s'\n", __func__, special_fim_suf_id, id_to_token.at(special_fim_suf_id).text.c_str() ); } - if (special_fim_mid_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: FIM MID token = %d '%s'\n", __func__, special_fim_mid_id, id_to_token.at(special_fim_mid_id).text.c_str() ); } - if (special_fim_pad_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: FIM PAD token = %d '%s'\n", __func__, special_fim_pad_id, id_to_token.at(special_fim_pad_id).text.c_str() ); } - if (special_fim_rep_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: FIM REP token = %d '%s'\n", __func__, special_fim_rep_id, id_to_token.at(special_fim_rep_id).text.c_str() ); } - if (special_fim_sep_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: FIM SEP token = %d '%s'\n", __func__, special_fim_sep_id, id_to_token.at(special_fim_sep_id).text.c_str() ); } + if (special_fim_pre_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: FIM PRE token = %d '%s'\n", __func__, special_fim_pre_id, id_to_token.at(special_fim_pre_id).text.c_str() ); } + if (special_fim_suf_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: FIM SUF token = %d '%s'\n", __func__, special_fim_suf_id, id_to_token.at(special_fim_suf_id).text.c_str() ); } + if (special_fim_mid_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: FIM MID token = %d '%s'\n", __func__, special_fim_mid_id, id_to_token.at(special_fim_mid_id).text.c_str() ); } + if (special_fim_pad_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: FIM PAD token = %d '%s'\n", __func__, special_fim_pad_id, id_to_token.at(special_fim_pad_id).text.c_str() ); } + if (special_fim_rep_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: FIM REP token = %d '%s'\n", __func__, special_fim_rep_id, id_to_token.at(special_fim_rep_id).text.c_str() ); } + if (special_fim_sep_id != LLAMA_TOKEN_NULL) { LLAMA_LOG_INFO( "%s: FIM SEP token = %d '%s'\n", __func__, special_fim_sep_id, id_to_token.at(special_fim_sep_id).text.c_str() ); } for (const auto & id : special_eog_ids) { - LLAMA_LOG_INFO( "%s: EOG token = %d '%s'\n", __func__, id, id_to_token.at(id).text.c_str() ); + LLAMA_LOG_INFO( "%s: EOG token = %d '%s'\n", __func__, id, id_to_token.at(id).text.c_str() ); } - LLAMA_LOG_INFO("%s: max token length = %d\n", __func__, max_token_len); + LLAMA_LOG_INFO("%s: max token length = %d\n", __func__, max_token_len); } llama_vocab::llama_vocab() : pimpl(new impl(*this)) { diff --git a/src/llama-vocab.h b/src/llama-vocab.h index 28c3a82..55f8f39 100644 --- a/src/llama-vocab.h +++ b/src/llama-vocab.h @@ -51,9 +51,6 @@ enum llama_vocab_pre_type { LLAMA_VOCAB_PRE_TYPE_GRANITE_DOCLING = 40, LLAMA_VOCAB_PRE_TYPE_MINIMAX_M2 = 41, LLAMA_VOCAB_PRE_TYPE_AFMOE = 42, - LLAMA_VOCAB_PRE_TYPE_SOLAR_OPEN = 43, - LLAMA_VOCAB_PRE_TYPE_YOUTU = 44, - LLAMA_VOCAB_PRE_TYPE_EXAONE_MOE = 45, }; struct LLM_KV; diff --git a/src/llama.cpp b/src/llama.cpp index f1096d9..1e18637 100644 --- a/src/llama.cpp +++ b/src/llama.cpp @@ -111,20 +111,8 @@ static std::vector llama_get_device_memory_data( } } for (size_t i = 0; i < ret.size(); i++) { - size_t free; - size_t total; + size_t free, total; ggml_backend_dev_memory(model->devices[i], &free, &total); - - // devices can return 0 bytes for free and total memory if they do not - // have any to report. in this case, we will use the host memory as a fallback - // fixes: https://github.com/ggml-org/llama.cpp/issues/18577 - if (free == 0 && total == 0) { - ggml_backend_dev_t cpu_dev = ggml_backend_dev_by_type(GGML_BACKEND_DEVICE_TYPE_CPU); - if (cpu_dev == nullptr) { - throw std::runtime_error(format("%s: no CPU backend found", __func__)); - } - ggml_backend_dev_memory(cpu_dev, &free, &total); - } ret[i].free = free; ret[i].total = total; } @@ -152,15 +140,12 @@ enum layer_fraction_t { }; // this enum is only used in llama_params_fit_impl but needs to be defined outside of it to fix a Windows compilation issue -class llama_params_fit_exception : public std::runtime_error { - using std::runtime_error::runtime_error; -}; - static void llama_params_fit_impl( const char * path_model, struct llama_model_params * mparams, struct llama_context_params * cparams, float * tensor_split, struct llama_model_tensor_buft_override * tensor_buft_overrides, - size_t * margins_s, uint32_t n_ctx_min, enum ggml_log_level log_level) { + size_t margin_s, uint32_t n_ctx_min, enum ggml_log_level log_level) { constexpr int64_t MiB = 1024*1024; + const int64_t margin = margin_s; // this function uses int64_t rather than size_t for memory sizes to more conveniently handle deficits typedef std::vector dmds_t; const llama_model_params default_mparams = llama_model_default_params(); @@ -179,12 +164,6 @@ static void llama_params_fit_impl( return; } - std::vector margins; // this function uses int64_t rather than size_t for memory sizes to more conveniently handle deficits - margins.reserve(nd); - for (size_t id = 0; id < nd; id++) { - margins.push_back(margins_s[id]); - } - std::vector dev_names; { dev_names.reserve(nd); @@ -202,12 +181,12 @@ static void llama_params_fit_impl( } } - int64_t sum_free = 0; + int64_t sum_total = 0; int64_t sum_projected_free = 0; + int64_t min_projected_free = INT64_MAX; int64_t sum_projected_used = 0; int64_t sum_projected_model = 0; - std::vector projected_free_per_device; - projected_free_per_device.reserve(nd); + int64_t sum_projected_ctx = 0; if (nd > 1) { LLAMA_LOG_INFO("%s: projected memory use with initial parameters [MiB]:\n", __func__); @@ -217,63 +196,49 @@ static void llama_params_fit_impl( const int64_t projected_used = dmd.mb.total(); const int64_t projected_free = dmd.free - projected_used; - projected_free_per_device.push_back(projected_free); - sum_free += dmd.free; + sum_total += dmd.total; sum_projected_used += projected_used; sum_projected_free += projected_free; + min_projected_free = std::min(min_projected_free, projected_free); sum_projected_model += dmd.mb.model; + sum_projected_ctx += dmd.mb.context; if (nd > 1) { - LLAMA_LOG_INFO("%s: - %s: %6" PRId64 " total, %6" PRId64 " used, %6" PRId64 " free vs. target of %6" PRId64 "\n", - __func__, dev_names[id].c_str(), dmd.total/MiB, projected_used/MiB, projected_free/MiB, margins[id]/MiB); + LLAMA_LOG_INFO("%s: - %s: %6" PRId64 " total, %6" PRId64 " used, %6" PRId64 " %s\n", + __func__, dev_names[id].c_str(), dmd.total/MiB, projected_used/MiB, std::abs(projected_free)/MiB, + projected_free >= 0 ? "surplus" : "deficit"); } } - assert(sum_free >= 0 && sum_projected_used >= 0); + assert(sum_total >= 0 && sum_projected_used >= 0 && sum_projected_ctx >= 0); + assert(sum_projected_used >= sum_projected_ctx); LLAMA_LOG_INFO("%s: projected to use %" PRId64 " MiB of device memory vs. %" PRId64 " MiB of free device memory\n", - __func__, sum_projected_used/MiB, sum_free/MiB); - if (nd == 1) { - if (projected_free_per_device[0] >= margins[0]) { + __func__, sum_projected_used/MiB, sum_total/MiB); + if (min_projected_free >= margin) { + if (nd == 1) { LLAMA_LOG_INFO("%s: will leave %" PRId64 " >= %" PRId64 " MiB of free device memory, no changes needed\n", - __func__, projected_free_per_device[0]/MiB, margins[0]/MiB); - return; - } - } else { - bool changes_needed = false; - for (size_t id = 0; id < nd; id++) { - if (projected_free_per_device[id] < margins[id]) { - changes_needed = true; - break; - } - } - if (!changes_needed) { - LLAMA_LOG_INFO("%s: targets for free memory can be met on all devices, no changes needed\n", __func__); + __func__, min_projected_free/MiB, margin/MiB); return; } + LLAMA_LOG_INFO("%s: will leave at least %" PRId64 " >= %" PRId64 " MiB of free memory on all devices, no changes needed\n", + __func__, min_projected_free/MiB, margin/MiB); + return; } // step 2: try reducing memory use by reducing the context size { - int64_t global_surplus = sum_projected_free; - for (size_t id = 0; id < nd; id++) { - global_surplus -= margins[id]; - } + int64_t global_surplus = sum_projected_free - int64_t(nd)*margin; if (global_surplus < 0) { - if (nd == 1) { - LLAMA_LOG_INFO("%s: cannot meet free memory target of %" PRId64 " MiB, need to reduce device memory by %" PRId64 " MiB\n", - __func__, margins[0]/MiB, -global_surplus/MiB); - } else { - LLAMA_LOG_INFO( - "%s: cannot meet free memory targets on all devices, need to use %" PRId64 " MiB less in total\n", - __func__, -global_surplus/MiB); - } + LLAMA_LOG_INFO(nd == 1 ? + "%s: cannot fulfill margin of %" PRId64 " MiB, need to reduce device memory by %" PRId64 " MiB\n" : + "%s: cannot fulfill margin of %" PRId64 " MiB on all devices, need to use %" PRId64 " MiB less in total\n", + __func__, margin/MiB, -global_surplus/MiB); if (cparams->n_ctx == 0) { if (hp_nct > n_ctx_min) { - int64_t sum_used_target = sum_free; - for (size_t id = 0; id < nd; id++) { - sum_used_target -= margins[id]; - } + const int64_t bytes_per_ctx = sum_projected_ctx / hp_nct; + + int64_t memory_reduction = -global_surplus; if (nd > 1) { // for multiple devices we need to be more conservative in terms of how much context we think can fit: // - for dense models only whole layers can be assigned to devices @@ -281,34 +246,24 @@ static void llama_params_fit_impl( // - on average we expect a waste of 0.5 layers/tensors per device // - use slightly more than the expected average for nd devices to be safe const int64_t model_per_layer = sum_projected_model / std::min(uint32_t(mparams->n_gpu_layers), hp_ngl); - sum_used_target -= (nd + 1) * model_per_layer / (hp_nex == 0 ? 2 : 6); + memory_reduction += (nd + 1) * model_per_layer / (hp_nex == 0 ? 2 : 6); } - int64_t sum_projected_used_min_ctx = 0; - cparams->n_ctx = n_ctx_min; - const dmds_t dmds_min_ctx = llama_get_device_memory_data(path_model, mparams, cparams, devs, hp_ngl, hp_nct, hp_nex, log_level); - for (const auto & dmd : dmds_min_ctx) { - sum_projected_used_min_ctx += dmd.mb.total(); - } - if (sum_used_target > sum_projected_used_min_ctx) { - // linear interpolation between minimum and maximum context size: - cparams->n_ctx += (hp_nct - n_ctx_min) * (sum_used_target - sum_projected_used_min_ctx) - / (sum_projected_used - sum_projected_used_min_ctx); - cparams->n_ctx = std::max(cparams->n_ctx - cparams->n_ctx % 256, n_ctx_min); // round down context for CUDA backend + uint32_t ctx_reduction = std::min(uint32_t((memory_reduction + bytes_per_ctx - 1) / bytes_per_ctx), hp_nct - n_ctx_min); + cparams->n_ctx = hp_nct - ctx_reduction; + cparams->n_ctx = std::max(cparams->n_ctx - cparams->n_ctx % 256, n_ctx_min); // round down context for CUDA backend - const int64_t bytes_per_ctx = (sum_projected_used - sum_projected_used_min_ctx) / (hp_nct - n_ctx_min); - const int64_t memory_reduction = (hp_nct - cparams->n_ctx) * bytes_per_ctx; - LLAMA_LOG_INFO("%s: context size reduced from %" PRIu32 " to %" PRIu32 " -> need %" PRId64 " MiB less memory in total\n", - __func__, hp_nct, cparams->n_ctx, memory_reduction/MiB); + ctx_reduction = hp_nct - cparams->n_ctx; + memory_reduction = ctx_reduction * bytes_per_ctx; + global_surplus += memory_reduction; + LLAMA_LOG_INFO("%s: context size reduced from %" PRIu32 " to %" PRIu32 " -> need %" PRId64 " MiB less memory in total\n", + __func__, hp_nct, cparams->n_ctx, memory_reduction/MiB); + if (global_surplus >= 0) { if (nd == 1) { LLAMA_LOG_INFO("%s: entire model can be fit by reducing context\n", __func__); return; } LLAMA_LOG_INFO("%s: entire model should be fit across devices by reducing context\n", __func__); - } else { - const int64_t memory_reduction = sum_projected_used - sum_projected_used_min_ctx; - LLAMA_LOG_INFO("%s: context size reduced from %" PRIu32 " to %" PRIu32 " -> need %" PRId64 " MiB less memory in total\n", - __func__, hp_nct, cparams->n_ctx, memory_reduction/MiB); } } else { LLAMA_LOG_INFO("%s: default model context size is %" PRIu32 " which is <= the min. context size of %" PRIu32 " -> no change\n", @@ -321,28 +276,28 @@ static void llama_params_fit_impl( } if (mparams->n_gpu_layers != default_mparams.n_gpu_layers) { - throw llama_params_fit_exception("n_gpu_layers already set by user to " + std::to_string(mparams->n_gpu_layers) + ", abort"); + throw std::runtime_error("n_gpu_layers already set by user to " + std::to_string(mparams->n_gpu_layers) + ", abort"); } if (nd > 1) { if (!tensor_split) { - throw llama_params_fit_exception("did not provide a buffer to write the tensor_split to, abort"); + throw std::runtime_error("did not provide a buffer to write the tensor_split to, abort"); } if (mparams->tensor_split) { for (size_t id = 0; id < nd; id++) { if (mparams->tensor_split[id] != 0.0f) { - throw llama_params_fit_exception("model_params::tensor_split already set by user, abort"); + throw std::runtime_error("model_params::tensor_split already set by user, abort"); } } } if (mparams->split_mode == LLAMA_SPLIT_MODE_ROW) { - throw llama_params_fit_exception("changing weight allocation for LLAMA_SPLIT_MODE_ROW not implemented, abort"); + throw std::runtime_error("changing weight allocation for LLAMA_SPLIT_MODE_ROW not implemented, abort"); } } if (!tensor_buft_overrides) { - throw llama_params_fit_exception("did not provide buffer to set tensor_buft_overrides, abort"); + throw std::runtime_error("did not provide buffer to set tensor_buft_overrides, abort"); } if (mparams->tensor_buft_overrides && (mparams->tensor_buft_overrides->pattern || mparams->tensor_buft_overrides->buft)) { - throw llama_params_fit_exception("model_params::tensor_buft_overrides already set by user, abort"); + throw std::runtime_error("model_params::tensor_buft_overrides already set by user, abort"); } // step 3: iteratively fill the back to front with "dense" layers @@ -395,11 +350,6 @@ static void llama_params_fit_impl( // for the first partial layer varying parts can overflow, all further layers use LAYER_FRACTION_MOE: layer_fraction_t overflow_type = LAYER_FRACTION_MOE; - - uint32_t n_full() const { - assert(n_layer >= n_part); - return n_layer - n_part; - } }; const size_t ntbo = llama_max_tensor_buft_overrides(); @@ -423,18 +373,18 @@ static void llama_params_fit_impl( size_t itbo = 0; for (size_t id = 0; id < nd; id++) { - il0 += ngl_per_device[id].n_full(); + il0 += ngl_per_device[id].n_layer - ngl_per_device[id].n_part; for (uint32_t il = il0; il < il0 + ngl_per_device[id].n_part; il++) { if (itbo + 1 >= ntbo) { tensor_buft_overrides[itbo].pattern = nullptr; tensor_buft_overrides[itbo].buft = nullptr; itbo++; mparams.tensor_buft_overrides = tensor_buft_overrides; - throw llama_params_fit_exception("llama_max_tensor_buft_overrides() == " - + std::to_string(ntbo) + " is insufficient for model"); + throw std::runtime_error("llama_params_fit_n_tensor_buft_overrides() == " + + std::to_string(ntbo) + " is insufficient for model\n"); } tensor_buft_overrides[itbo].pattern = get_overflow_pattern(il, il == il0 ? ngl_per_device[id].overflow_type : LAYER_FRACTION_MOE); - tensor_buft_overrides[itbo].buft = il == il0 ? overflow_bufts[id] : ggml_backend_cpu_buffer_type(); + tensor_buft_overrides[itbo].buft = overflow_bufts[id]; itbo++; } il0 += ngl_per_device[id].n_part; @@ -484,9 +434,9 @@ static void llama_params_fit_impl( const dmds_t dmds_cpu_moe = llama_get_device_memory_data( path_model, mparams, cparams, devs, hp_ngl, hp_nct, hp_nex, log_level); - for (size_t id = 0; id < nd; id++) { - global_surplus_cpu_moe += dmds_cpu_moe[id].free; - global_surplus_cpu_moe -= int64_t(dmds_cpu_moe[id].mb.total()) + margins[id]; + for (const llama_device_memory_data & dmd : dmds_cpu_moe) { + global_surplus_cpu_moe += dmd.free; + global_surplus_cpu_moe -= int64_t(dmd.mb.total()) + margin; } if (global_surplus_cpu_moe > 0) { @@ -505,18 +455,24 @@ static void llama_params_fit_impl( std::vector targets; // maximum acceptable memory use per device targets.reserve(nd); for (size_t id = 0; id < nd; id++) { - targets.push_back(dmds_full[id].free - margins[id]); + targets.push_back(dmds_full[id].free - margin); LLAMA_LOG_DEBUG("%s: id=%zu, target=%" PRId64 " MiB\n", __func__, id, targets[id]/MiB); } - std::vector overflow_bufts; // which bufts the first partial layer of a device overflows to: + std::vector overflow_bufts; // which bufts the partial layers of a device overflow to: overflow_bufts.reserve(nd); - for (size_t id = 0; id < nd; id++) { - overflow_bufts.push_back(ggml_backend_cpu_buffer_type()); + for (size_t id = 0; id < nd - 1; ++id) { + overflow_bufts.push_back(ggml_backend_dev_buffer_type(devs[id + 1])); } + overflow_bufts.push_back(ggml_backend_cpu_buffer_type()); std::vector ngl_per_device(nd); std::vector mem = get_memory_for_layers(__func__, ngl_per_device, overflow_bufts); + if (hp_nex > 0) { + for (size_t id = 0; id < nd; id++) { + ngl_per_device[id].overflow_type = LAYER_FRACTION_MOE; + } + } // optimize the number of layers per device using the method of false position: // - ngl_per_device has 0 layers for each device, lower bound @@ -556,8 +512,7 @@ static void llama_params_fit_impl( std::vector ngl_per_device_test = ngl_per_device; ngl_per_device_test[id].n_layer += step_size; if (hp_nex) { - ngl_per_device_test[id].n_part += size_t(id) == nd - 1 && ngl_per_device_test[id].n_part == 0 ? - step_size - 1 : step_size; // the first layer is the output layer which must always be full + ngl_per_device_test[id].n_part += step_size; } const std::vector mem_test = get_memory_for_layers(__func__, ngl_per_device_test, overflow_bufts); @@ -606,7 +561,7 @@ static void llama_params_fit_impl( assert(id_dense_start < nd); LLAMA_LOG_INFO("%s: converting dense-only layers to full layers and filling them front-to-back with overflow to next device/system memory:\n", __func__); - for (size_t id = 0; id <= id_dense_start && id_dense_start < nd; id++) { + for (size_t id = 0; id <= id_dense_start; id++) { std::vector ngl_per_device_high = ngl_per_device; for (size_t jd = id_dense_start; jd < nd; jd++) { const uint32_t n_layer_move = jd < nd - 1 ? ngl_per_device_high[jd].n_layer : ngl_per_device_high[jd].n_layer - 1; @@ -618,8 +573,12 @@ static void llama_params_fit_impl( std::vector mem_high = get_memory_for_layers(__func__, ngl_per_device_high, overflow_bufts); if (mem_high[id] > targets[id]) { - assert(ngl_per_device_high[id].n_full() >= ngl_per_device[id].n_full()); - uint32_t delta = ngl_per_device_high[id].n_full() - ngl_per_device[id].n_full(); + assert(ngl_per_device_high[id].n_layer >= ngl_per_device_high[id].n_part); + assert(ngl_per_device[id].n_layer >= ngl_per_device[id].n_part); + assert((ngl_per_device_high[id].n_layer - ngl_per_device_high[id].n_part) + >= ngl_per_device[id].n_layer - ngl_per_device[id].n_part); + uint32_t delta = (ngl_per_device_high[id].n_layer - ngl_per_device_high[id].n_part) + - (ngl_per_device[id].n_layer - ngl_per_device[id].n_part); while (delta > 1) { uint32_t step_size = int64_t(delta) * (targets[id] - mem[id]) / (mem_high[id] - mem[id]); step_size = std::max(step_size, uint32_t(1)); @@ -635,7 +594,7 @@ static void llama_params_fit_impl( ngl_per_device_test[id].n_layer += n_convert_jd; n_converted_test += n_convert_jd; - if (ngl_per_device_test[id_dense_start_test].n_part > 0) { + if (ngl_per_device_test[id_dense_start_test].n_layer > 0) { break; } } @@ -654,8 +613,8 @@ static void llama_params_fit_impl( LLAMA_LOG_DEBUG("%s: set ngl_per_device_high[%zu].(n_layer, n_part)=(%" PRIu32 ", %" PRIu32 "), id_dense_start_high=%zu\n", __func__, id, ngl_per_device_high[id].n_layer, ngl_per_device_high[id].n_part, id_dense_start_high); } - assert(ngl_per_device_high[id].n_full() >= ngl_per_device[id].n_full()); - delta = ngl_per_device_high[id].n_full() - ngl_per_device[id].n_full(); + delta = (ngl_per_device_high[id].n_layer - ngl_per_device_high[id].n_part) + - (ngl_per_device[id].n_layer - ngl_per_device[id].n_part); } } else { ngl_per_device = ngl_per_device_high; @@ -673,19 +632,14 @@ static void llama_params_fit_impl( ngl_per_device_test[id_dense_start_test].n_part--; ngl_per_device_test[id].n_layer++; ngl_per_device_test[id].n_part++; - if (ngl_per_device_test[id_dense_start_test].n_part == 0) { + if (ngl_per_device_test[id_dense_start_test].n_layer == 0) { id_dense_start_test++; } ngl_per_device_test[id].overflow_type = LAYER_FRACTION_UP; - std::vector overflow_bufts_test = overflow_bufts; - if (id < nd - 1) { - overflow_bufts_test[id] = ggml_backend_dev_buffer_type(devs[id + 1]); - } LLAMA_LOG_DEBUG("%s: trying to fit one extra layer with overflow_type=LAYER_FRACTION_UP\n", __func__); - std::vector mem_test = get_memory_for_layers(__func__, ngl_per_device_test, overflow_bufts_test); - if (mem_test[id] < targets[id] && (id + 1 == nd || mem_test[id + 1] < targets[id + 1])) { + std::vector mem_test = get_memory_for_layers(__func__, ngl_per_device_test, overflow_bufts); + if (mem_test[id] < targets[id]) { ngl_per_device = ngl_per_device_test; - overflow_bufts = overflow_bufts_test; mem = mem_test; id_dense_start = id_dense_start_test; LLAMA_LOG_DEBUG("%s: set ngl_per_device[%zu].(n_layer, n_part, overflow_type)=(%" PRIu32 ", %" PRIu32 ", UP), id_dense_start=%zu\n", @@ -693,10 +647,9 @@ static void llama_params_fit_impl( ngl_per_device_test[id].overflow_type = LAYER_FRACTION_GATE; LLAMA_LOG_DEBUG("%s: trying to fit one extra layer with overflow_type=LAYER_FRACTION_GATE\n", __func__); - mem_test = get_memory_for_layers(__func__, ngl_per_device_test, overflow_bufts_test); - if (mem_test[id] < targets[id] && (id + 1 == nd || mem_test[id + 1] < targets[id + 1])) { + mem_test = get_memory_for_layers(__func__, ngl_per_device_test, overflow_bufts); + if (mem_test[id] < targets[id]) { ngl_per_device = ngl_per_device_test; - overflow_bufts = overflow_bufts_test; mem = mem_test; id_dense_start = id_dense_start_test; LLAMA_LOG_DEBUG("%s: set ngl_per_device[%zu].(n_layer, n_part, overflow_type)=(%" PRIu32 ", %" PRIu32 ", GATE), id_dense_start=%zu\n", @@ -705,10 +658,9 @@ static void llama_params_fit_impl( } else { ngl_per_device_test[id].overflow_type = LAYER_FRACTION_ATTN; LLAMA_LOG_DEBUG("%s: trying to fit one extra layer with overflow_type=LAYER_FRACTION_ATTN\n", __func__); - mem_test = get_memory_for_layers(__func__, ngl_per_device_test, overflow_bufts_test); - if (mem_test[id] < targets[id] && (id + 1 == nd || mem_test[id + 1] < targets[id + 1])) { + mem_test = get_memory_for_layers(__func__, ngl_per_device_test, overflow_bufts); + if (mem_test[id] < targets[id]) { ngl_per_device = ngl_per_device_test; - overflow_bufts = overflow_bufts_test; mem = mem_test; id_dense_start = id_dense_start_test; LLAMA_LOG_DEBUG("%s: set ngl_per_device[%zu].(n_layer, n_part, overflow_type)=(%" PRIu32 ", %" PRIu32 ", ATTN), id_dense_start=%zu\n", @@ -723,41 +675,30 @@ static void llama_params_fit_impl( __func__, dev_names[id].c_str(), ngl_per_device[id].n_layer, ngl_per_device[id].n_part, mem[id]/MiB, projected_margin/MiB); } - // print info for devices that were not changed during the conversion from dense only to full layers: - for (size_t id = id_dense_start + 1; id < nd; id++) { - const int64_t projected_margin = dmds_full[id].free - mem[id]; - LLAMA_LOG_INFO( - "%s: - %s: %2" PRIu32 " layers (%2" PRIu32 " overflowing), %6" PRId64 " MiB used, %6" PRId64 " MiB free\n", - __func__, dev_names[id].c_str(), ngl_per_device[id].n_layer, ngl_per_device[id].n_part, mem[id]/MiB, projected_margin/MiB); - } - set_ngl_tensor_split_tbo(ngl_per_device, overflow_bufts, *mparams); } -enum llama_params_fit_status llama_params_fit( +bool llama_params_fit( const char * path_model, struct llama_model_params * mparams, struct llama_context_params * cparams, float * tensor_split, struct llama_model_tensor_buft_override * tensor_buft_overrides, - size_t * margins, uint32_t n_ctx_min, enum ggml_log_level log_level) { + size_t margin_s, uint32_t n_ctx_min, enum ggml_log_level log_level) { const int64_t t0_us = llama_time_us(); - llama_params_fit_status status = LLAMA_PARAMS_FIT_STATUS_SUCCESS; + bool ok = true; try { - llama_params_fit_impl(path_model, mparams, cparams, tensor_split, tensor_buft_overrides, margins, n_ctx_min, log_level); + llama_params_fit_impl(path_model, mparams, cparams, tensor_split, tensor_buft_overrides, margin_s, n_ctx_min, log_level); LLAMA_LOG_INFO("%s: successfully fit params to free device memory\n", __func__); - } catch (const llama_params_fit_exception & e) { - LLAMA_LOG_WARN("%s: failed to fit params to free device memory: %s\n", __func__, e.what()); - status = LLAMA_PARAMS_FIT_STATUS_FAILURE; } catch (const std::runtime_error & e) { - LLAMA_LOG_ERROR("%s: encountered an error while trying to fit params to free device memory: %s\n", __func__, e.what()); - status = LLAMA_PARAMS_FIT_STATUS_ERROR; + LLAMA_LOG_WARN("%s: failed to fit params to free device memory: %s\n", __func__, e.what()); + ok = false; } const int64_t t1_us = llama_time_us(); LLAMA_LOG_INFO("%s: fitting params to free memory took %.2f seconds\n", __func__, (t1_us - t0_us) * 1e-6); - return status; + return ok; } struct llama_sampler_chain_params llama_sampler_chain_default_params() { struct llama_sampler_chain_params result = { - /*.no_perf =*/ true, + /*.no_perf =*/ true, }; return result; @@ -830,7 +771,7 @@ static int llama_model_load(const std::string & fname, std::vector model.t_start_us = tm.t_start_us; try { - llama_model_loader ml(fname, splits, params.use_mmap, params.use_direct_io, params.check_tensors, params.no_alloc, params.kv_overrides, params.tensor_buft_overrides); + llama_model_loader ml(fname, splits, params.use_mmap, params.check_tensors, params.no_alloc, params.kv_overrides, params.tensor_buft_overrides); ml.print_info(); diff --git a/src/models/afmoe.cpp b/src/models/afmoe.cpp index 6a752a4..0192e34 100644 --- a/src/models/afmoe.cpp +++ b/src/models/afmoe.cpp @@ -22,15 +22,8 @@ llm_build_afmoe::llm_build_afmoe(const llama_model & model, const llm_graph_para const float kq_scale = 1.0f/sqrtf(float(n_embd_head)); for (int il = 0; il < n_layer; ++il) { - const float freq_base_l = model.get_rope_freq_base (cparams, il); - const float freq_scale_l = model.get_rope_freq_scale(cparams, il); - ggml_tensor * inpSA = inpL; - // This overlaps with SWA layers in current models, so get_rope_freq_base/scale may be superfluous - const bool use_rope = hparams.n_no_rope_layer_step > 0 && - (il + 1) % hparams.n_no_rope_layer_step != 0; - // dual attention normalization (pre) cur = build_norm(inpL, model.layers[il].attn_norm, NULL, @@ -63,16 +56,19 @@ llm_build_afmoe::llm_build_afmoe(const llama_model & model, const llm_graph_para cb(Qcur, "Qcur_normed", il); cb(Kcur, "Kcur_normed", il); + // RoPE only for sliding_attention layers + const bool use_rope = hparams.n_no_rope_layer_step > 0 && + ((il + 1) % hparams.n_no_rope_layer_step) != 0; if (use_rope) { Qcur = ggml_rope_ext( ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow); cb(Qcur, "Qcur_rope", il); Kcur = ggml_rope_ext( ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow); cb(Kcur, "Kcur_rope", il); } diff --git a/src/models/bert.cpp b/src/models/bert.cpp index bca0e25..3274fa3 100644 --- a/src/models/bert.cpp +++ b/src/models/bert.cpp @@ -142,13 +142,11 @@ llm_build_bert::llm_build_bert(const llama_model & model, const llm_graph_params LLM_FFN_GELU, LLM_FFN_SEQ, il); cb(cur, "ffn_out", il); } else if (model.arch == LLM_ARCH_JINA_BERT_V2) { - const bool up_contains_gate = !model.layers[il].ffn_gate && model.layers[il].ffn_up->ne[1] != hparams.n_ff(); - auto type_op = up_contains_gate ? LLM_FFN_GEGLU : LLM_FFN_GELU; cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + model.layers[il].ffn_up, NULL, NULL, model.layers[il].ffn_gate, NULL, NULL, model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, NULL, - type_op, LLM_FFN_PAR, il); + model.layers[il].ffn_gate ? LLM_FFN_GELU : LLM_FFN_GEGLU, LLM_FFN_PAR, il); cb(cur, "ffn_out", il); } else { cur = build_ffn(cur, diff --git a/src/models/cogvlm.cpp b/src/models/cogvlm.cpp index 0ceae3a..edf0d14 100644 --- a/src/models/cogvlm.cpp +++ b/src/models/cogvlm.cpp @@ -3,14 +3,12 @@ llm_build_cogvlm::llm_build_cogvlm(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { const int64_t n_embd_head = hparams.n_embd_head_v; - const float kq_scale = 1.0f / sqrtf(float(n_embd_head)); + float kq_scale = 1.0f / sqrtf(float(n_embd_head)); GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); GGML_ASSERT(n_embd_head == hparams.n_rot); - ggml_tensor * inpL; - ggml_tensor * cur; - + ggml_tensor *inpL, *cur; inpL = build_inp_embd(model.tok_embd); ggml_tensor * inp_pos = build_inp_pos(); @@ -46,7 +44,7 @@ llm_build_cogvlm::llm_build_cogvlm(const llama_model & model, const llm_graph_pa } ggml_tensor * inpSA = inpL; - cur = build_norm(inpSA, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cur = build_norm(inpSA, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); // build self attention { diff --git a/src/models/cohere2-iswa.cpp b/src/models/cohere2-iswa.cpp index 9334b5e..b18aa8c 100644 --- a/src/models/cohere2-iswa.cpp +++ b/src/models/cohere2-iswa.cpp @@ -21,9 +21,6 @@ llm_build_cohere2_iswa::llm_build_cohere2_iswa(const llama_model & model, const for (int il = 0; il < n_layer; ++il) { const bool is_swa = hparams.is_swa(il); - // UNUSED: - // const float freq_base_l = model.get_rope_freq_base (cparams, il); - // const float freq_scale_l = model.get_rope_freq_scale(cparams, il); // norm cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM, il); diff --git a/src/models/deepseek2.cpp b/src/models/deepseek2.cpp index ca63a62..4938287 100644 --- a/src/models/deepseek2.cpp +++ b/src/models/deepseek2.cpp @@ -215,7 +215,7 @@ llm_build_deepseek2::llm_build_deepseek2(const llama_model & model, const llm_gr model.layers[il].ffn_exp_probs_b, n_expert, n_expert_used, LLM_FFN_SILU, hparams.expert_weights_norm, - hparams.expert_weights_scale, hparams.expert_weights_scale, + true, hparams.expert_weights_scale, (llama_expert_gating_func_type) hparams.expert_gating_func, il); cb(moe_out, "ffn_moe_out", il); diff --git a/src/models/exaone-moe.cpp b/src/models/exaone-moe.cpp deleted file mode 100644 index bef5b2a..0000000 --- a/src/models/exaone-moe.cpp +++ /dev/null @@ -1,146 +0,0 @@ -#include "models.h" - - -llm_build_exaone_moe::llm_build_exaone_moe(const llama_model & model, const llm_graph_params & params) : - llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_k; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_v); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn_iswa = build_attn_inp_kv_iswa(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - const int n_transformer_layers = n_layer - hparams.nextn_predict_layers; - for (int il = 0; il < n_transformer_layers; ++il) { - ggml_tensor * inpSA = inpL; - - // use RoPE for SWA layers - const bool is_local_layer = hparams.is_swa(il); - - // norm - cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - cb(Kcur, "Kcur_normed", il); - - if (is_local_layer) { - Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, rope_factors, n_rot, rope_type, n_ctx_orig, freq_base, - freq_scale, ext_factor, attn_factor, beta_fast, beta_slow); - - Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, rope_factors, n_rot, rope_type, n_ctx_orig, freq_base, - freq_scale, ext_factor, attn_factor, beta_fast, beta_slow); - } - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn_iswa, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); - cb(cur, "attn_out", il); - } - if (il == n_transformer_layers - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // norm - cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // feed-forward network - if (model.layers[il].ffn_gate_inp == nullptr) { - // dense branch - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } else { - // MoE branch - ggml_tensor * moe_out = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - model.layers[il].ffn_exp_probs_b, - n_expert, n_expert_used, - LLM_FFN_SILU, hparams.expert_weights_norm, - true, hparams.expert_weights_scale, - (llama_expert_gating_func_type) hparams.expert_gating_func, - il); - cb(moe_out, "ffn_moe_out", il); - - // FFN shared expert - { - ggml_tensor * ffn_shexp = - build_ffn(cur, - model.layers[il].ffn_up_shexp, NULL, NULL, - model.layers[il].ffn_gate_shexp, NULL, NULL, - model.layers[il].ffn_down_shexp, NULL, NULL, - NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(ffn_shexp, "ffn_shexp", il); - - cur = ggml_add(ctx0, moe_out, ffn_shexp); - cb(cur, "ffn_out", il); - } - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - cur = inpL; - - // final norm - cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); -} diff --git a/src/models/gemma-embedding.cpp b/src/models/gemma-embedding.cpp index 944c198..90a98f7 100644 --- a/src/models/gemma-embedding.cpp +++ b/src/models/gemma-embedding.cpp @@ -1,5 +1,7 @@ #include "models.h" + + llm_build_gemma_embedding::llm_build_gemma_embedding(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { const int64_t n_embd_head = hparams.n_embd_head_k; @@ -10,8 +12,10 @@ llm_build_gemma_embedding::llm_build_gemma_embedding(const llama_model & model, inpL = build_inp_embd(model.tok_embd); // important: do not normalize weights for raw embeddings input (i.e. encoded image emdeddings) - inpL = ggml_scale(ctx0, inpL, ubatch.token ? sqrtf(n_embd) : 1.0f); - cb(inpL, "inp_scaled", -1); + if (ubatch.token) { + inpL = ggml_scale(ctx0, inpL, sqrtf(n_embd)); + cb(inpL, "inp_scaled", -1); + } // inp_pos - contains the positions ggml_tensor * inp_pos = build_inp_pos(); diff --git a/src/models/gemma2-iswa.cpp b/src/models/gemma2-iswa.cpp index 7a91981..9cc59a5 100644 --- a/src/models/gemma2-iswa.cpp +++ b/src/models/gemma2-iswa.cpp @@ -19,9 +19,6 @@ llm_build_gemma2_iswa::llm_build_gemma2_iswa(const llama_model & model, const ll ggml_tensor * inp_out_ids = build_inp_out_ids(); for (int il = 0; il < n_layer; ++il) { - const float freq_base_l = model.get_rope_freq_base (cparams, il); - const float freq_scale_l = model.get_rope_freq_scale(cparams, il); - // norm cur = build_norm(inpL, model.layers[il].attn_norm, NULL, @@ -46,12 +43,12 @@ llm_build_gemma2_iswa::llm_build_gemma2_iswa(const llama_model & model, const ll Qcur = ggml_rope_ext( ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow); Kcur = ggml_rope_ext( ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow); cb(Qcur, "Qcur", il); diff --git a/src/models/gemma3.cpp b/src/models/gemma3.cpp index dec3fc4..ae60ef4 100644 --- a/src/models/gemma3.cpp +++ b/src/models/gemma3.cpp @@ -10,9 +10,10 @@ llm_build_gemma3::llm_build_gemma3(const llama_model & model, const llm_gr inpL = build_inp_embd(model.tok_embd); // important: do not normalize weights for raw embeddings input (i.e. encoded image emdeddings) - inpL = ggml_scale(ctx0, inpL, ubatch.token ? sqrtf(n_embd) : 1.0f); - cb(inpL, "inp_scaled", -1); - + if (ubatch.token) { + inpL = ggml_scale(ctx0, inpL, sqrtf(n_embd)); + cb(inpL, "inp_scaled", -1); + } // inp_pos - contains the positions ggml_tensor * inp_pos = build_inp_pos(); diff --git a/src/models/gemma3n-iswa.cpp b/src/models/gemma3n-iswa.cpp index 51acab1..a0bdd6a 100644 --- a/src/models/gemma3n-iswa.cpp +++ b/src/models/gemma3n-iswa.cpp @@ -1,5 +1,7 @@ #include "models.h" + + llm_build_gemma3n_iswa::llm_build_gemma3n_iswa(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params), model(model), @@ -13,9 +15,10 @@ llm_build_gemma3n_iswa::llm_build_gemma3n_iswa(const llama_model & model, const inpL = build_inp_embd(model.tok_embd); // important: do not normalize weights for raw embeddings input (i.e. encoded image emdeddings) - inpL = ggml_scale(ctx0, inpL, ubatch.token ? sqrtf(n_embd) : 1.0f); - cb(inpL, "inp_scaled", -1); - + if (ubatch.token) { + inpL = ggml_scale(ctx0, inpL, sqrtf(n_embd)); + cb(inpL, "inp_scaled", -1); + } // inp_pos - contains the positions ggml_tensor * inp_pos = build_inp_pos(); @@ -245,7 +248,7 @@ ggml_tensor * llm_build_gemma3n_iswa::view_2d_slice(ggml_tensor * x, int idx) { // equivalent to get_per_layer_inputs() in python code // output shape: [n_embd_altup, n_layer, n_tokens] ggml_tensor * llm_build_gemma3n_iswa::get_per_layer_inputs() { - auto inp = std::make_unique(); + auto inp = std::make_unique(); ggml_tensor * inp_per_layer; if (ubatch.token) { inp->tokens = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ubatch.n_tokens); @@ -255,20 +258,10 @@ ggml_tensor * llm_build_gemma3n_iswa::get_per_layer_inputs() { inp_per_layer = ggml_reshape_3d(ctx0, inp_per_layer, n_embd_altup, n_layer, n_tokens); inp_per_layer = ggml_scale(ctx0, inp_per_layer, sqrtf((float) n_embd_altup)); cb(inp_per_layer, "inp_per_layer_selected", -1); - res->add_input(std::move(inp)); } else { - // Vision embedding path: use padding token (ID=0) embedding - // TODO: verify if this is the correct behavior in transformers implementation - const int64_t embd_size = model.tok_embd_per_layer->ne[0]; // n_embd_altup * n_layer - - // Extract and dequantize padding token embedding (row 0) - ggml_tensor * padding = ggml_view_1d(ctx0, model.tok_embd_per_layer, embd_size, 0); - inp_per_layer = ggml_cast(ctx0, padding, GGML_TYPE_F32); - - // Reshape to [n_embd_altup, n_layer, 1] - inp_per_layer = ggml_reshape_3d(ctx0, inp_per_layer, n_embd_altup, n_layer, 1); - cb(inp_per_layer, "inp_per_layer_vision", -1); + GGML_ABORT("TODO: support embd input"); } + res->add_input(std::move(inp)); return inp_per_layer; } @@ -286,7 +279,7 @@ ggml_tensor * llm_build_gemma3n_iswa::project_per_layer_inputs(ggml_tensor * inp -1); // [n_embd_altup, n_layer, n_tokens] cb(per_layer_proj, "per_layer_proj", -1); - inp_per_layer = ggml_add(ctx0, per_layer_proj, inp_per_layer); + inp_per_layer = ggml_add(ctx0, inp_per_layer, per_layer_proj); inp_per_layer = ggml_scale(ctx0, inp_per_layer, per_layer_input_scale); cb(inp_per_layer, "inp_per_layer", -1); diff --git a/src/models/llama-iswa.cpp b/src/models/llama-iswa.cpp index 61dd2c1..03f8061 100644 --- a/src/models/llama-iswa.cpp +++ b/src/models/llama-iswa.cpp @@ -25,12 +25,8 @@ llm_build_llama_iswa::llm_build_llama_iswa(const llama_model & model, const llm_ ggml_tensor * inp_out_ids = build_inp_out_ids(); for (int il = 0; il < n_layer; ++il) { - const float freq_base_l = model.get_rope_freq_base (cparams, il); - const float freq_scale_l = model.get_rope_freq_scale(cparams, il); - ggml_tensor * inpSA = inpL; - // This overlaps with SWA layers in current models, so get_rope_freq_base/scale may be superfluous const bool use_rope = hparams.n_no_rope_layer_step > 0 && (il + 1) % hparams.n_no_rope_layer_step != 0; @@ -71,13 +67,13 @@ llm_build_llama_iswa::llm_build_llama_iswa(const llama_model & model, const llm_ if (use_rope) { Qcur = ggml_rope_ext( ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow ); Kcur = ggml_rope_ext( ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow ); } else if (inp_attn_scale) { diff --git a/src/models/llama.cpp b/src/models/llama.cpp index 42b5fcd..ab7fd5d 100644 --- a/src/models/llama.cpp +++ b/src/models/llama.cpp @@ -1,7 +1,6 @@ #include "models.h" -template -llm_build_llama::llm_build_llama(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { +llm_build_llama::llm_build_llama(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { const int64_t n_embd_head = hparams.n_embd_head_v; GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); @@ -15,14 +14,7 @@ llm_build_llama::llm_build_llama(const llama_model & model, const llm_gra // inp_pos - contains the positions ggml_tensor * inp_pos = build_inp_pos(); - using inp_attn_type = std::conditional_t; - - inp_attn_type * inp_attn = nullptr; - if constexpr (embed) { - inp_attn = build_attn_inp_no_cache(); - } else { - inp_attn = build_attn_inp_kv(); - } + auto * inp_attn = build_attn_inp_kv(); const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; @@ -153,16 +145,11 @@ llm_build_llama::llm_build_llama(const llama_model & model, const llm_gra cb(cur, "result_norm", -1); res->t_embd = cur; - if constexpr (!embed) { - // lm_head - cur = build_lora_mm(model.output, cur); + // lm_head + cur = build_lora_mm(model.output, cur); - cb(cur, "result_output", -1); - res->t_logits = cur; - } + cb(cur, "result_output", -1); + res->t_logits = cur; ggml_build_forward_expand(gf, cur); } - -template struct llm_build_llama; -template struct llm_build_llama; diff --git a/src/models/maincoder.cpp b/src/models/maincoder.cpp deleted file mode 100644 index da57308..0000000 --- a/src/models/maincoder.cpp +++ /dev/null @@ -1,117 +0,0 @@ -#include "models.h" - -llm_build_maincoder::llm_build_maincoder(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); -} diff --git a/src/models/mimo2-iswa.cpp b/src/models/mimo2-iswa.cpp deleted file mode 100644 index edc87cc..0000000 --- a/src/models/mimo2-iswa.cpp +++ /dev/null @@ -1,123 +0,0 @@ - -#include "models.h" - -llm_build_mimo2_iswa::llm_build_mimo2_iswa(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - ggml_tensor * inp_pos = build_inp_pos(); - auto * inp_attn = build_attn_inp_kv_iswa(); - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - uint32_t n_head_l = hparams.n_head(il); - uint32_t n_head_kv_l = hparams.n_head_kv(il); - const float freq_base_l = model.get_rope_freq_base(cparams, il); - const float freq_scale_l = model.get_rope_freq_scale(cparams, il); - - cur = inpL; - - // self_attention - { - cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head_k, n_head_l, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head_k, n_head_kv_l, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head_v, n_head_kv_l, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - ggml_tensor * sinks = model.layers[il].attn_sinks; - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, sinks, nullptr, 1.0f/sqrtf(float(n_embd_head_k)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // feed-forward network - if (model.layers[il].ffn_gate_inp == nullptr) { - // dense branch - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } else { - // MoE branch - cur = build_moe_ffn(cur, model.layers[il].ffn_gate_inp, model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, model.layers[il].ffn_down_exps, - model.layers[il].ffn_exp_probs_b, n_expert, n_expert_used, LLM_FFN_SILU, true, false, - 0.0, LLAMA_EXPERT_GATING_FUNC_TYPE_SIGMOID, il); - cb(cur, "ffn_moe_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); -} diff --git a/src/models/models.h b/src/models/models.h index 3a44f7f..53a5810 100644 --- a/src/models/models.h +++ b/src/models/models.h @@ -167,10 +167,6 @@ struct llm_build_exaone : public llm_graph_context { llm_build_exaone(const llama_model & model, const llm_graph_params & params); }; -struct llm_build_exaone_moe : public llm_graph_context { - llm_build_exaone_moe(const llama_model & model, const llm_graph_params & params); -}; - struct llm_build_falcon : public llm_graph_context { llm_build_falcon(const llama_model & model, const llm_graph_params & params); }; @@ -307,7 +303,6 @@ struct llm_build_llada_moe : public llm_graph_context { llm_build_llada_moe(const llama_model & model, const llm_graph_params & params); }; -template struct llm_build_llama : public llm_graph_context { llm_build_llama(const llama_model & model, const llm_graph_params & params); }; @@ -316,18 +311,10 @@ struct llm_build_llama_iswa : public llm_graph_context { llm_build_llama_iswa(const llama_model & model, const llm_graph_params & params); }; -struct llm_build_maincoder : public llm_graph_context { - llm_build_maincoder(const llama_model & model, const llm_graph_params & params); -}; - struct llm_build_mamba : public llm_graph_context_mamba { llm_build_mamba(const llama_model & model, const llm_graph_params & params); }; -struct llm_build_mimo2_iswa : public llm_graph_context { - llm_build_mimo2_iswa(const llama_model & model, const llm_graph_params & params); -}; - struct llm_build_minicpm3 : public llm_graph_context { llm_build_minicpm3(const llama_model & model, const llm_graph_params & params); }; @@ -340,6 +327,7 @@ struct llm_build_mistral3 : public llm_graph_context { llm_build_mistral3(const llama_model & model, const llm_graph_params & params); }; +template struct llm_build_modern_bert : public llm_graph_context { llm_build_modern_bert(const llama_model & model, const llm_graph_params & params); }; @@ -413,11 +401,6 @@ struct llm_build_plamo : public llm_graph_context { llm_build_plamo(const llama_model & model, const llm_graph_params & params); }; -template -struct llm_build_plamo3 : public llm_graph_context { - llm_build_plamo3(const llama_model & model, const llm_graph_params & params); -}; - struct llm_build_plm : public llm_graph_context { llm_build_plm(const llama_model & model, const llm_graph_params & params); }; @@ -470,8 +453,7 @@ private: ggml_tensor * cur, int il); - // returns pair of output and new state - std::pair build_delta_net_chunking( + ggml_tensor * build_delta_net_chunking( ggml_tensor * q, ggml_tensor * k, ggml_tensor * v, @@ -483,8 +465,7 @@ private: ggml_tensor * diag_mask, int il); - // returns pair of output and new state - std::pair build_delta_net_autoregressive( + ggml_tensor * build_delta_net_autoregressive( ggml_tensor * q, ggml_tensor * k, ggml_tensor * v, @@ -499,11 +480,6 @@ private: ggml_tensor * gate, int layer); - // returns pair of qkv, z - std::pair build_qkvz( - ggml_tensor * input, - int il); - const llama_model & model; }; diff --git a/src/models/modern-bert.cpp b/src/models/modern-bert.cpp index bb12ed8..c7809bd 100644 --- a/src/models/modern-bert.cpp +++ b/src/models/modern-bert.cpp @@ -1,6 +1,7 @@ #include "models.h" -llm_build_modern_bert::llm_build_modern_bert(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { +template +llm_build_modern_bert::llm_build_modern_bert(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { const int64_t n_embd_head = hparams.n_embd_head_v; const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); @@ -23,8 +24,13 @@ llm_build_modern_bert::llm_build_modern_bert(const llama_model & model, const ll auto * inp_attn = build_attn_inp_no_cache(); for (int il = 0; il < n_layer; ++il) { - const float freq_base_l = model.get_rope_freq_base(cparams, il); - const float freq_scale_l = model.get_rope_freq_scale(cparams, il); + float freq_base_l = 0.0f; + + if constexpr (iswa) { + freq_base_l = model.get_rope_freq_base(cparams, il); + } else { + freq_base_l = freq_base; + } cur = inpL; @@ -49,13 +55,13 @@ llm_build_modern_bert::llm_build_modern_bert(const llama_model & model, const ll // RoPE Qcur = ggml_rope_ext( ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow ); Kcur = ggml_rope_ext( ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow ); @@ -114,3 +120,7 @@ llm_build_modern_bert::llm_build_modern_bert(const llama_model & model, const ll res->t_embd = cur; ggml_build_forward_expand(gf, cur); } + +// Explicit template instantiations +template struct llm_build_modern_bert; +template struct llm_build_modern_bert; diff --git a/src/models/openai-moe-iswa.cpp b/src/models/openai-moe-iswa.cpp index dbe3ca1..9659670 100644 --- a/src/models/openai-moe-iswa.cpp +++ b/src/models/openai-moe-iswa.cpp @@ -14,9 +14,6 @@ llm_build_openai_moe_iswa::llm_build_openai_moe_iswa(const llama_model & model, ggml_tensor * inp_out_ids = build_inp_out_ids(); for (int il = 0; il < n_layer; ++il) { - const float freq_base_l = model.get_rope_freq_base (cparams, il); - const float freq_scale_l = model.get_rope_freq_scale(cparams, il); - ggml_tensor * inpSA = inpL; // norm @@ -52,13 +49,13 @@ llm_build_openai_moe_iswa::llm_build_openai_moe_iswa(const llama_model & model, Qcur = ggml_rope_ext( ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow ); Kcur = ggml_rope_ext( ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow ); diff --git a/src/models/plamo3.cpp b/src/models/plamo3.cpp deleted file mode 100644 index 55c8064..0000000 --- a/src/models/plamo3.cpp +++ /dev/null @@ -1,128 +0,0 @@ -#include "models.h" - -template -llm_build_plamo3::llm_build_plamo3(const llama_model & model, const llm_graph_params & params) : - llm_graph_context(params) { - const int64_t head_dim_q = hparams.n_embd_head_k; - const int64_t head_dim_v = hparams.n_embd_head_v; - - ggml_tensor * cur; - ggml_tensor * inpL = build_inp_embd(model.tok_embd); - ggml_tensor * inp_pos = build_inp_pos(); - - using inp_attn_type = std::conditional_t; - inp_attn_type * inp_attn = nullptr; - - if constexpr (iswa) { - inp_attn = build_attn_inp_kv_iswa(); - } else { - inp_attn = build_attn_inp_kv(); - } - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * residual = inpL; - - float freq_base_l = 0.0f; - float freq_scale_l = 0.0f; - if constexpr (iswa) { - freq_base_l = model.get_rope_freq_base (cparams, il); - freq_scale_l = model.get_rope_freq_scale(cparams, il); - } else { - freq_base_l = freq_base; - freq_scale_l = freq_scale; - } - - cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - ggml_tensor * qkv = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - - const int32_t n_head = hparams.n_head(il); - const int32_t n_head_kv = hparams.n_head_kv(il); - - const int64_t q_offset = 0; - const int64_t k_offset = head_dim_q * n_head; - const int64_t v_offset = k_offset + head_dim_q * n_head_kv; - - ggml_tensor * Qcur = ggml_view_3d(ctx0, qkv, head_dim_q, n_head, n_tokens, - head_dim_q * sizeof(float), qkv->nb[1], q_offset * ggml_element_size(qkv)); - ggml_tensor * Kcur = ggml_view_3d(ctx0, qkv, head_dim_q, n_head_kv, n_tokens, - head_dim_q * sizeof(float), qkv->nb[1], k_offset * ggml_element_size(qkv)); - ggml_tensor * Vcur = ggml_view_3d(ctx0, qkv, head_dim_v, n_head_kv, n_tokens, - head_dim_v * sizeof(float), qkv->nb[1], v_offset * ggml_element_size(qkv)); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "attn_q_norm", il); - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Kcur, "attn_k_norm", il); - - Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, - ext_factor, attn_factor, beta_fast, beta_slow); - Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, - ext_factor, attn_factor, beta_fast, beta_slow); - - const float attn_scale = 1.0f / sqrtf(float(head_dim_q)); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, attn_scale, il); - cb(cur, "attn_out", il); - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - residual = ggml_get_rows(ctx0, residual, inp_out_ids); - } - - cur = build_norm(cur, model.layers[il].attn_post_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "attn_post_norm", il); - - cur = ggml_add(ctx0, cur, residual); - cb(cur, "attn_residual", il); - - residual = cur; - - cur = build_norm(cur, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SWIGLU, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - - cur = build_norm(cur, model.layers[il].ffn_post_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "ffn_post_norm", il); - - cur = ggml_add(ctx0, cur, residual); - cb(cur, "ffn_residual", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); -} - -// Explicit template instantiations -template struct llm_build_plamo3; -template struct llm_build_plamo3; diff --git a/src/models/qwen3next.cpp b/src/models/qwen3next.cpp index 57b6659..775b313 100644 --- a/src/models/qwen3next.cpp +++ b/src/models/qwen3next.cpp @@ -86,15 +86,7 @@ llm_build_qwen3next::llm_build_qwen3next(const llama_model & model, const llm_gr ggml_build_forward_expand(gf, cur); } -// utility to get one slice from the third dimension -// input dim: [x, y, c, b] -// output dim: [x, y, 1, b] -static ggml_tensor * get_slice_2d(ggml_context * ctx0, ggml_tensor * t, int64_t c) { - return ggml_view_4d(ctx0, t, t->ne[0], t->ne[1], 1, t->ne[3], - t->nb[1], t->nb[2], t->nb[3], t->nb[2] * c); -} - -std::pair llm_build_qwen3next::build_delta_net_chunking( +ggml_tensor * llm_build_qwen3next::build_delta_net_chunking( ggml_tensor * q, ggml_tensor * k, ggml_tensor * v, @@ -195,16 +187,18 @@ std::pair llm_build_qwen3next::build_delta_net_chu beta = ggml_reshape_4d(ctx0, beta, 1, chunk_size, n_chunks, H_k * n_seqs); ggml_tensor * g_cumsum = ggml_cumsum(ctx0, g); - cb(g_cumsum, "g_cumsum", il); // shape: (chunk_size, 1, n_chunks, H_v * n_seqs) - ggml_tensor * gcs_i = g_cumsum; // ggml_reshape_4d(ctx0, g_cumsum, chunk_size, 1, n_chunks, H_v * n_seqs); + cb(g_cumsum, "g_cumsum", il); + + ggml_tensor * gcs_i = ggml_reshape_4d(ctx0, g_cumsum, chunk_size, 1, n_chunks, H_v * n_seqs); ggml_tensor * gcs_j = ggml_reshape_4d(ctx0, g_cumsum, 1, chunk_size, n_chunks, H_v * n_seqs); ggml_tensor * gcs_j_broadcast = ggml_repeat_4d(ctx0, gcs_j, chunk_size, chunk_size, n_chunks, H_v * n_seqs); ggml_tensor * decay_mask = ggml_sub(ctx0, gcs_j_broadcast, gcs_i); - cb(decay_mask, "decay_mask", il); // shape: (chunk_size, chunk_size, n_chunks, H_v * n_seqs) + + cb(decay_mask, "decay_mask", il); decay_mask = ggml_mul(ctx0, decay_mask, diag_mask); decay_mask = ggml_exp(ctx0, decay_mask); @@ -214,7 +208,8 @@ std::pair llm_build_qwen3next::build_delta_net_chu ggml_tensor * k_decay = ggml_mul(ctx0, kmulkbeta, decay_mask); ggml_tensor * attn = ggml_neg(ctx0, ggml_mul(ctx0, k_decay, causal_mask)); - cb(attn, "attn_pre_solve", il); // shape: (chunk_size, chunk_size, n_chunks, H_v * n_seqs) + + cb(attn, "attn_pre_solve", il); ggml_tensor * attn_lower = ggml_mul(ctx0, attn, causal_mask); ggml_tensor * lhs = ggml_sub(ctx0, ggml_repeat(ctx0, identity, attn_lower), attn_lower); @@ -222,7 +217,8 @@ std::pair llm_build_qwen3next::build_delta_net_chu ggml_tensor * lin_solve = ggml_solve_tri(ctx0, lhs, attn, true, true, false); attn = ggml_mul(ctx0, lin_solve, causal_mask); attn = ggml_add(ctx0, attn, identity); - cb(attn, "attn_solved", il); // shape: (chunk_size, chunk_size, n_chunks, H_v * n_seqs) + + cb(attn, "attn_solved", il); v = ggml_mul_mat(ctx0, ggml_cont(ctx0, ggml_transpose(ctx0, v_beta)), attn); @@ -230,126 +226,116 @@ std::pair llm_build_qwen3next::build_delta_net_chu ggml_tensor * gexp = ggml_exp(ctx0, g_cumsum_t); ggml_tensor * kbeta_gexp = ggml_mul(ctx0, k_beta, gexp); - cb(kbeta_gexp, "kbeta_gexp", il); // shape: (S_k, chunk_size, n_chunks, H_v * n_seqs) + + cb(kbeta_gexp, "kbeta_gexp", il); ggml_tensor * k_cumdecay = ggml_cont(ctx0, ggml_transpose(ctx0, ggml_mul_mat(ctx0, attn, ggml_cont(ctx0, ggml_transpose(ctx0, kbeta_gexp))))); - cb(k_cumdecay, "k_cumdecay", il); // shape: (chunk_size, chunk_size, n_chunks, H_v * n_seqs) - ggml_tensor * attn_kq = ggml_mul_mat(ctx0, k, q); - attn_kq = ggml_mul(ctx0, attn_kq, decay_mask); - attn_kq = ggml_mul(ctx0, attn_kq, diag_mask); - cb(attn_kq, "attn_kq", il); // shape: (chunk_size, chunk_size, n_chunks, H_v * n_seqs) + cb(k_cumdecay, "k_cumdecay", il); - - // vectorized calculation of key_gdiff - // improved from the chunked version: - // g_last = torch.clamp(g_cum[:, :, -1], max=50.0).exp().unsqueeze(-1).unsqueeze(-1) - // g_diff = torch.clamp(g_cum[:, :, -1:] - g_cum, max=50.0).exp() - // key_gdiff = key * g_diff.unsqueeze(-1) - // kgdmulvnew = (key_gdiff).transpose(-1, -2) @ v_new - // last_recurrent_state = last_recurrent_state * g_last + kgdmulvnew - - // get last element in g_cumsum along chunk_size dimension (ne0) - // example: [[x, y, z, ..., last], ...] -> [[last], ...] - ggml_tensor * g_last = ggml_view_4d(ctx0, g_cumsum, 1, 1, g_cumsum->ne[2], g_cumsum->ne[3], - g_cumsum->nb[1], g_cumsum->nb[2], g_cumsum->nb[3], - (g_cumsum->ne[0] - 1) * ggml_element_size(g_cumsum)); - g_last = ggml_cont(ctx0, g_last); - cb(g_last, "g_last", il); // shape: (1, 1, n_chunks, H_v * n_seqs) - - ggml_tensor * g_last_exp = ggml_exp(ctx0, g_last); - cb(g_last_exp, "g_last_exp", il); // shape: (1, 1, n_chunks, H_v * n_seqs) - - ggml_tensor * g_diff = ggml_neg(ctx0, ggml_sub(ctx0, g_cumsum, g_last)); - cb(g_diff, "g_diff", il); // shape: (chunk_size, 1, n_chunks, H_v * n_seqs) - - ggml_tensor * g_diff_exp = ggml_exp(ctx0, g_diff); - ggml_tensor * key_gdiff = ggml_mul(ctx0, k, g_diff_exp); - cb(key_gdiff, "key_gdiff", il); // shape: (S_k, chunk_size, n_chunks, H_v * n_seqs) - - - // state to be updated per chunk - ggml_tensor * new_state = state; // ggml_dup(ctx0, state); - cb(new_state, "new_state", il); // shape: (S_v, S_v, H_v, n_seqs) - - // shape after loop of chunks: (S_v, chunk_size, n_chunks, H_v * n_seqs) ggml_tensor * core_attn_out = nullptr; + ggml_tensor * new_state = ggml_dup(ctx0, state); + + cb(new_state, "new_state", il); for (int64_t chunk = 0; chunk < n_chunks; chunk++) { - // shape: (S_k, chunk_size, 1, H_k * n_seqs) - ggml_tensor * q_chunk = get_slice_2d(ctx0, q, chunk); // (no cont), next op: ggml_mul + auto chunkify = [=](ggml_tensor * t) { + return ggml_cont(ctx0, ggml_view_4d(ctx0, t, t->ne[0], chunk_size, 1, t->ne[3], + t->nb[1], t->nb[2], t->nb[3], t->nb[2] * chunk)); + }; - // shape: (S_v, chunk_size, 1, H_v * n_seqs) - ggml_tensor * v_chunk = get_slice_2d(ctx0, v, chunk); // (no cont), next op: ggml_repeat + auto chunkify_g = [=](ggml_tensor * t) { + return ggml_cont(ctx0, ggml_view_4d(ctx0, t, chunk_size, t->ne[1], 1, t->ne[3], + t->nb[1], t->nb[2], t->nb[3], t->nb[2] * chunk)); + }; - // shape: (chunk_size, 1, n_chunks, H_v * n_seqs) - ggml_tensor * gexp_chunk = get_slice_2d(ctx0, gexp, chunk); // (no cont), next op: ggml_mul + ggml_tensor * k_chunk = chunkify(k); + ggml_tensor * q_chunk = chunkify(q); + ggml_tensor * v_chunk = chunkify(v); - // shape: (chunk_size, 1, H_v * n_seqs) - ggml_tensor * k_cumdecay_chunk = get_slice_2d(ctx0, k_cumdecay, chunk); // (no cont), next op: ggml_mul_mat + ggml_tensor * g_cs_chunk = chunkify_g(g_cumsum); + ggml_tensor * g_cs_chunk_t = ggml_cont(ctx0, ggml_transpose(ctx0, g_cs_chunk)); + + ggml_tensor * decay_mask_chunk = chunkify(decay_mask); + ggml_tensor * k_cumdecay_chunk = chunkify(k_cumdecay); + + ggml_tensor * gexp_chunk = ggml_exp(ctx0, g_cs_chunk_t); // attn = (q_i @ k_i.transpose(-1, -2) * decay_mask[:, :, i]).masked_fill_(mask, 0) - // replaced by precomputed attn_kq - ggml_tensor * attn_chunk = get_slice_2d(ctx0, attn_kq, chunk); - cb(attn_chunk, "attn_chunk", il); + attn = ggml_mul_mat(ctx0, k_chunk, q_chunk); + attn = ggml_mul(ctx0, attn, decay_mask_chunk); + attn = ggml_mul(ctx0, attn, diag_mask); ggml_tensor * state_t = ggml_cont_4d(ctx0, ggml_permute(ctx0, new_state, 1, 0, 2, 3), S_v, S_v, 1, H_v * n_seqs); // v_prime = (k_cumdecay[:, :, i]) @ last_recurrent_state ggml_tensor * v_prime = ggml_mul_mat(ctx0, state_t, k_cumdecay_chunk); - cb(v_prime, "v_prime_chunk", il); // shape: (S_v, 1, H_v * n_seqs) // v_new = v_i - v_prime ggml_tensor * v_new = ggml_sub(ctx0, ggml_repeat(ctx0, v_chunk, v_prime), v_prime); ggml_tensor * v_new_t = ggml_cont(ctx0, ggml_transpose(ctx0, v_new)); - cb(v_new, "v_new_chunk", il); // attn_inter = (q_i * g[:, :, i, :, None].exp()) @ last_recurrent_state ggml_tensor * q_g_exp = ggml_mul(ctx0, q_chunk, gexp_chunk); ggml_tensor * attn_inter = ggml_mul_mat(ctx0, state_t, q_g_exp); - cb(attn_inter, "attn_inter_chunk", il); // core_attn_out[:, :, i] = attn_inter + attn @ v_new - ggml_tensor * v_attn = ggml_mul_mat(ctx0, v_new_t, attn_chunk); - cb(v_attn, "v_attn_chunk", il); + ggml_tensor * v_attn = ggml_mul_mat(ctx0, v_new_t, attn); ggml_tensor * core_attn_out_chunk = ggml_add(ctx0, attn_inter, v_attn); - cb(core_attn_out_chunk, "core_attn_out_chunk", il); // shape: (S_v, chunk_size, 1, H_v * n_seqs) - core_attn_out = core_attn_out == nullptr - ? core_attn_out_chunk - : ggml_concat(ctx0, core_attn_out, core_attn_out_chunk, 2); + core_attn_out = core_attn_out == nullptr ? core_attn_out_chunk : ggml_concat(ctx0, core_attn_out, core_attn_out_chunk, 1); + // g_last = torch.clamp(g_cum[:, :, -1], max=50.0).exp().unsqueeze(-1).unsqueeze(-1) + // g_diff = torch.clamp(g_cum[:, :, -1:] - g_cum, max=50.0).exp() + // key_gdiff = key * g_diff.unsqueeze(-1) // kgdmulvnew = (key_gdiff).transpose(-1, -2) @ v_new - ggml_tensor * k_gdiff = ggml_cont(ctx0, get_slice_2d(ctx0, key_gdiff, chunk)); - //ggml_tensor * kgdmulvnew = ggml_mul_mat(ctx0, k_gdiff, v_new); // this is slower on metal, why? - ggml_tensor * kgdmulvnew = ggml_mul_mat(ctx0, v_new_t, ggml_cont(ctx0, ggml_transpose(ctx0, k_gdiff))); - // last_recurrent_state = last_recurrent_state * g_last + kgdmulvnew - ggml_tensor * gexp_last_chunk = ggml_cont(ctx0, get_slice_2d(ctx0, g_last_exp, chunk)); + + ggml_tensor * g_cum_last = + ggml_cont(ctx0, ggml_view_4d(ctx0, g_cs_chunk_t, g_cs_chunk_t->ne[0], 1, g_cs_chunk_t->ne[2], g_cs_chunk_t->ne[3], + g_cs_chunk_t->nb[1], g_cs_chunk_t->nb[2], g_cs_chunk_t->nb[3], + g_cs_chunk_t->nb[0] * (g_cs_chunk_t->ne[1] - 1))); + + ggml_tensor * gexp_last = + ggml_reshape_4d(ctx0, ggml_exp(ctx0, g_cum_last), 1, 1, g_cum_last->ne[0] * g_cum_last->ne[2], g_cum_last->ne[3]); + + ggml_tensor * g_cum_last_3d = + ggml_reshape_3d(ctx0, g_cum_last, g_cum_last->ne[0], g_cum_last->ne[2], g_cum_last->ne[3]); + + ggml_tensor * g_cumsum_3d = ggml_reshape_3d(ctx0, g_cs_chunk, g_cs_chunk->ne[0], g_cs_chunk->ne[2], g_cs_chunk->ne[3]); + + ggml_tensor * g_diff = ggml_neg(ctx0, ggml_sub(ctx0, g_cumsum_3d, g_cum_last_3d)); + + ggml_tensor * g_diff_exp = ggml_exp(ctx0, g_diff); + + ggml_tensor * key_gdiff = ggml_mul(ctx0, k_chunk, + ggml_reshape_4d(ctx0, g_diff_exp, 1, g_diff_exp->ne[0], g_diff_exp->ne[1], + g_diff_exp->ne[2] * g_diff_exp->ne[3])); + + ggml_tensor * kgdmulvnew = ggml_mul_mat(ctx0, v_new_t, ggml_cont(ctx0, ggml_transpose(ctx0, key_gdiff))); + new_state = ggml_add(ctx0, - ggml_mul(ctx0, new_state, ggml_reshape_4d(ctx0, gexp_last_chunk, gexp_last_chunk->ne[0], gexp_last_chunk->ne[1], H_v, n_seqs)), + ggml_mul(ctx0, new_state, ggml_reshape_4d(ctx0, gexp_last, gexp_last->ne[0], gexp_last->ne[1], H_v, n_seqs)), ggml_reshape_4d(ctx0, kgdmulvnew, kgdmulvnew->ne[0], kgdmulvnew->ne[1], H_v, n_seqs)); } - // truncate padded tokens - ggml_tensor * output_tokens = ggml_view_4d(ctx0, core_attn_out, - S_v, n_tokens, H_v, n_seqs, - ggml_row_size(core_attn_out->type, S_v), - ggml_row_size(core_attn_out->type, S_v * chunk_size * n_chunks), - ggml_row_size(core_attn_out->type, S_v * chunk_size * n_chunks * H_v), 0); - output_tokens = ggml_cont(ctx0, output_tokens); + core_attn_out = ggml_cont_4d(ctx0, core_attn_out, S_v, chunk_size * n_chunks, H_v, n_seqs); + + ggml_tensor * output_tokens = ggml_view_4d(ctx0, core_attn_out, S_v, n_tokens, H_v, n_seqs, core_attn_out->nb[1], core_attn_out->nb[2], core_attn_out->nb[3], 0); cb(output_tokens, "output_tokens", il); - // permute back to (S_v, H_v, n_tokens, n_seqs) - output_tokens = ggml_permute(ctx0, output_tokens, 0, 2, 1, 3); - output_tokens = ggml_cont(ctx0, output_tokens); + // flatten output + ggml_tensor * flat_output = + ggml_cont_1d(ctx0, ggml_permute(ctx0, output_tokens, 0, 2, 1, 3), S_v * H_v * n_tokens * n_seqs); - return {output_tokens, new_state}; + ggml_tensor * flat_state = ggml_cont_1d(ctx0, new_state, S_v * S_v * H_v * n_seqs); + + return ggml_concat(ctx0, flat_output, flat_state, 0); } -std::pair llm_build_qwen3next::build_delta_net_autoregressive( +ggml_tensor * llm_build_qwen3next::build_delta_net_autoregressive( ggml_tensor * q, ggml_tensor * k, ggml_tensor * v, @@ -433,7 +419,11 @@ std::pair llm_build_qwen3next::build_delta_net_aut cb(core_attn_out, "output_tokens", il); cb(state, "new_state", il); - return {core_attn_out, state}; + // flatten output, no need to permute since n_tokens is 1 so [S_v, 1, H_v, n_seqs] and [S_v, H_v, 1, n_seqs] are equivalent memory-layout wise + ggml_tensor * flat_output = ggml_reshape_1d(ctx0, core_attn_out, S_v * H_v * n_tokens * n_seqs); + ggml_tensor * flat_state = ggml_reshape_1d(ctx0, state, S_v * S_v * H_v * n_seqs); + + return ggml_concat(ctx0, flat_output, flat_state, 0); } ggml_tensor * llm_build_qwen3next::build_norm_gated( @@ -533,88 +523,6 @@ ggml_tensor * llm_build_qwen3next::build_layer_attn( return cur; } -std::pair llm_build_qwen3next::build_qkvz( - ggml_tensor * input, - int il) { - const int64_t d_inner = hparams.ssm_d_inner; - const int64_t n_seqs = ubatch.n_seqs; - const int64_t head_k_dim = hparams.ssm_d_state; - const int64_t num_k_heads = hparams.ssm_n_group; - const int64_t num_v_heads = hparams.ssm_dt_rank; - const int64_t head_v_dim = d_inner / num_v_heads; - const int64_t n_seq_tokens = ubatch.n_seq_tokens; - - if (model.layers[il].wqkv) { - // optimized path - ggml_tensor * qkv_mixed = build_lora_mm(model.layers[il].wqkv, input); - qkv_mixed = ggml_reshape_3d(ctx0, qkv_mixed, qkv_mixed->ne[0], n_seq_tokens, n_seqs); - cb(qkv_mixed, "linear_attn_qkv_mixed", il); - - ggml_tensor * z = build_lora_mm(model.layers[il].wqkv_gate, input); - cb(z, "z", il); - - return { qkv_mixed, z }; - - } else { - // legacy (slower) path - ggml_tensor * mixed_qkvz = build_lora_mm(model.layers[il].ssm_in, input); - cb(mixed_qkvz, "linear_attn_mixed_qkvz", il); - - int64_t qkvz_new_dim = 2 * head_k_dim + 2 * head_v_dim * (num_v_heads / num_k_heads); - ggml_tensor * mixed_qkvz_reshaped = ggml_reshape_4d(ctx0, mixed_qkvz, qkvz_new_dim, num_k_heads, n_seq_tokens, n_seqs); - - // Split mixed_qkvz into query, key, value, z - int64_t split_sizes_qkvz[4] = { - head_k_dim, // query size - head_k_dim, // key size - head_v_dim * num_v_heads / num_k_heads, // value size - head_v_dim * num_v_heads / num_k_heads // z size - }; - - ggml_tensor * query = - ggml_view_4d(ctx0, mixed_qkvz_reshaped, split_sizes_qkvz[0], num_k_heads, n_seq_tokens, n_seqs, - mixed_qkvz_reshaped->nb[1], mixed_qkvz_reshaped->nb[2], mixed_qkvz_reshaped->nb[3], 0); - cb(query, "q", il); - - ggml_tensor * key = ggml_view_4d(ctx0, mixed_qkvz_reshaped, split_sizes_qkvz[1], num_k_heads, n_seq_tokens, n_seqs, - mixed_qkvz_reshaped->nb[1], mixed_qkvz_reshaped->nb[2], mixed_qkvz_reshaped->nb[3], - split_sizes_qkvz[0] * ggml_element_size(mixed_qkvz_reshaped)); - cb(key, "k", il); - - ggml_tensor * value = - ggml_view_4d(ctx0, mixed_qkvz_reshaped, split_sizes_qkvz[2], num_k_heads, n_seq_tokens, n_seqs, - mixed_qkvz_reshaped->nb[1], mixed_qkvz_reshaped->nb[2], mixed_qkvz_reshaped->nb[3], - (split_sizes_qkvz[0] + split_sizes_qkvz[1]) * ggml_element_size(mixed_qkvz_reshaped)); - cb(value, "v", il); - - ggml_tensor * z = ggml_view_4d(ctx0, mixed_qkvz_reshaped, split_sizes_qkvz[3], num_k_heads, n_seq_tokens, n_seqs, - mixed_qkvz_reshaped->nb[1], mixed_qkvz_reshaped->nb[2], mixed_qkvz_reshaped->nb[3], - (split_sizes_qkvz[0] + split_sizes_qkvz[1] + split_sizes_qkvz[2]) * ggml_element_size(mixed_qkvz_reshaped)); - z = ggml_cont(ctx0, z); - cb(z, "z", il); - - // After creating query, key, and value_reshaped, reshape each to flatten the head dimensions - // query: [head_k_dim, num_k_heads, n_tokens, n_seqs] -> [head_k_dim * num_k_heads, n_tokens, n_seqs] - ggml_tensor * query_flat = ggml_cont_3d(ctx0, query, head_k_dim * num_k_heads, n_seq_tokens, n_seqs); - cb(query_flat, "query_flat", il); - - // key: [head_k_dim, num_k_heads, n_tokens, n_seqs] -> [head_k_dim * num_k_heads, n_tokens, n_seqs] - ggml_tensor * key_flat = ggml_cont_3d(ctx0, key, head_k_dim * num_k_heads, n_seq_tokens, n_seqs); - cb(key_flat, "key_flat", il); - - // value_reshaped: [head_v_dim, num_v_heads, n_tokens, n_seqs] -> [head_v_dim * num_v_heads, n_tokens, n_seqs] - ggml_tensor * value_flat = ggml_cont_3d(ctx0, value, head_v_dim * num_v_heads, n_seq_tokens, n_seqs); - cb(value_flat, "value_flat", il); - - // Now concatenate along the feature dimension (dim 0) to get [conv_dim, n_tokens, n_seqs] - ggml_tensor * qkv_mixed = ggml_concat(ctx0, query_flat, key_flat, 0); - qkv_mixed = ggml_concat(ctx0, qkv_mixed, value_flat, 0); - cb(qkv_mixed, "qkv_mixed", il); - - return { qkv_mixed, z }; - } -} - ggml_tensor * llm_build_qwen3next::build_layer_attn_linear( llm_graph_input_rs * inp, ggml_tensor * cur, @@ -639,13 +547,15 @@ ggml_tensor * llm_build_qwen3next::build_layer_attn_linear( GGML_ASSERT(ubatch.n_tokens == n_seq_tokens * n_seqs); // Input projections - auto qkvz = build_qkvz(cur, il); - ggml_tensor * qkv_mixed = qkvz.first; - ggml_tensor * z = qkvz.second; + ggml_tensor * mixed_qkvz = build_lora_mm(model.layers[il].ssm_in, cur); + cb(mixed_qkvz, "linear_attn_mixed_qkvz", il); ggml_tensor * mixed_ba = build_lora_mm(model.layers[il].ssm_beta_alpha, cur); cb(mixed_ba, "linear_attn_mixed_ba", il); + int64_t qkvz_new_dim = 2 * head_k_dim + 2 * head_v_dim * (num_v_heads / num_k_heads); + ggml_tensor * mixed_qkvz_reshaped = ggml_reshape_4d(ctx0, mixed_qkvz, qkvz_new_dim, num_k_heads, n_seq_tokens, n_seqs); + // Reshape mixed_ba: [batch, seq_len, hidden_size] -> [batch, seq_len, num_k_heads, 2*num_v_heads/num_k_heads] int64_t ba_new_dim = 2 * num_v_heads / num_k_heads; ggml_tensor * mixed_ba_reshaped = ggml_reshape_4d(ctx0, mixed_ba, ba_new_dim, num_k_heads, n_seq_tokens, n_seqs); @@ -665,9 +575,8 @@ ggml_tensor * llm_build_qwen3next::build_layer_attn_linear( split_sizes_ba[0] * ggml_element_size(mixed_ba_reshaped)); cb(a, "a", il); - ggml_tensor * beta = ggml_cont_4d(ctx0, b, num_v_heads, 1, n_seq_tokens, n_seqs); - - // Reshape a to merge head dimensions: [batch, seq_len, num_k_heads, num_v_heads/num_k_heads] -> [batch, seq_len, num_v_heads] + // Reshape b and a to merge head dimensions: [batch, seq_len, num_k_heads, num_v_heads/num_k_heads] -> [batch, seq_len, num_v_heads] + ggml_tensor * beta = ggml_cont_3d(ctx0, b, num_v_heads, n_seq_tokens, n_seqs); ggml_tensor * alpha = ggml_cont_3d(ctx0, a, num_v_heads, n_seq_tokens, n_seqs); ggml_tensor * alpha_biased = ggml_add(ctx0, alpha, model.layers[il].ssm_dt); @@ -676,6 +585,48 @@ ggml_tensor * llm_build_qwen3next::build_layer_attn_linear( ggml_tensor * gate = ggml_mul(ctx0, alpha_softplus, model.layers[il].ssm_a); // -A_log.exp() * softplus cb(gate, "gate", il); + // Split mixed_qkvz into query, key, value, z + int64_t split_sizes_qkvz[4] = { + head_k_dim, // query size + head_k_dim, // key size + head_v_dim * num_v_heads / num_k_heads, // value size + head_v_dim * num_v_heads / num_k_heads // z size + }; + + ggml_tensor * query = + ggml_view_4d(ctx0, mixed_qkvz_reshaped, split_sizes_qkvz[0], num_k_heads, n_seq_tokens, n_seqs, + mixed_qkvz_reshaped->nb[1], mixed_qkvz_reshaped->nb[2], mixed_qkvz_reshaped->nb[3], 0); + cb(query, "q", il); + + ggml_tensor * key = ggml_view_4d(ctx0, mixed_qkvz_reshaped, split_sizes_qkvz[1], num_k_heads, n_seq_tokens, n_seqs, + mixed_qkvz_reshaped->nb[1], mixed_qkvz_reshaped->nb[2], mixed_qkvz_reshaped->nb[3], + split_sizes_qkvz[0] * sizeof(float)); + cb(key, "k", il); + + ggml_tensor * value = + ggml_view_4d(ctx0, mixed_qkvz_reshaped, split_sizes_qkvz[2], num_k_heads, n_seq_tokens, n_seqs, + mixed_qkvz_reshaped->nb[1], mixed_qkvz_reshaped->nb[2], mixed_qkvz_reshaped->nb[3], + (split_sizes_qkvz[0] + split_sizes_qkvz[1]) * sizeof(float)); + cb(value, "v", il); + + ggml_tensor * z = ggml_view_4d(ctx0, mixed_qkvz_reshaped, split_sizes_qkvz[3], num_k_heads, n_seq_tokens, n_seqs, + mixed_qkvz_reshaped->nb[1], mixed_qkvz_reshaped->nb[2], mixed_qkvz_reshaped->nb[3], + (split_sizes_qkvz[0] + split_sizes_qkvz[1] + split_sizes_qkvz[2]) * sizeof(float)); + cb(z, "z", il); + + // After creating query, key, and value_reshaped, reshape each to flatten the head dimensions + // query: [head_k_dim, num_k_heads, n_tokens, n_seqs] -> [head_k_dim * num_k_heads, n_tokens, n_seqs] + ggml_tensor * query_flat = ggml_cont_3d(ctx0, query, head_k_dim * num_k_heads, n_seq_tokens, n_seqs); + cb(query_flat, "query_flat", il); + + // key: [head_k_dim, num_k_heads, n_tokens, n_seqs] -> [head_k_dim * num_k_heads, n_tokens, n_seqs] + ggml_tensor * key_flat = ggml_cont_3d(ctx0, key, head_k_dim * num_k_heads, n_seq_tokens, n_seqs); + cb(key_flat, "key_flat", il); + + // value_reshaped: [head_v_dim, num_v_heads, n_tokens, n_seqs] -> [head_v_dim * num_v_heads, n_tokens, n_seqs] + ggml_tensor * value_flat = ggml_cont_3d(ctx0, value, head_v_dim * num_v_heads, n_seq_tokens, n_seqs); + cb(value_flat, "value_flat", il); + // Get convolution states from cache ggml_tensor * conv_states_all = mctx_cur->get_r_l(il); ggml_tensor * ssm_states_all = mctx_cur->get_s_l(il); @@ -686,6 +637,17 @@ ggml_tensor * llm_build_qwen3next::build_layer_attn_linear( ggml_tensor * conv_states = build_rs(inp, conv_states_all, hparams.n_embd_r(), n_seqs); cb(conv_states, "conv_states", il); + // Now concatenate along the feature dimension (dim 0) to get [conv_dim, n_tokens, n_seqs] + ggml_tensor * qkv_mixed = ggml_concat(ctx0, query_flat, key_flat, 0); + qkv_mixed = ggml_concat(ctx0, qkv_mixed, value_flat, 0); + cb(qkv_mixed, "qkv_mixed", il); + + qkv_mixed = ggml_permute(ctx0, qkv_mixed, 1, 0, 2, 3); + cb(qkv_mixed, "qkv_mixed_permuted", il); + + // Calculate the total conv dimension + int64_t qkv_dim = head_k_dim * num_k_heads * 2 + head_v_dim * num_v_heads; + // Calculate convolution kernel size ggml_tensor * conv_kernel = model.layers[il].ssm_conv1d; const int64_t conv_kernel_size = conv_kernel->ne[0]; @@ -693,9 +655,6 @@ ggml_tensor * llm_build_qwen3next::build_layer_attn_linear( conv_states = ggml_reshape_3d(ctx0, conv_states, conv_kernel_size - 1, conv_channels, n_seqs); cb(conv_states, "conv_states_reshaped", il); - qkv_mixed = ggml_permute(ctx0, qkv_mixed, 1, 0, 2, 3); - cb(qkv_mixed, "qkv_mixed_permuted", il); - ggml_tensor * conv_input = ggml_concat(ctx0, conv_states, qkv_mixed, 0); cb(conv_input, "conv_input", il); @@ -718,25 +677,26 @@ ggml_tensor * llm_build_qwen3next::build_layer_attn_linear( ggml_tensor * conv_output_proper = ggml_ssm_conv(ctx0, conv_input, conv_kernel); cb(conv_output_proper, "conv_output_raw", il); + conv_output_proper = ggml_cont(ctx0, ggml_transpose(ctx0, conv_output_proper)); + cb(conv_output_proper, "conv_output_pre_silu", il); + ggml_tensor * conv_output_silu = ggml_silu(ctx0, conv_output_proper); cb(conv_output_silu, "conv_output_silu", il); - ggml_tensor * conv_qkv_mix = conv_output_silu; - - // Calculate the total conv dimension - int64_t qkv_dim = head_k_dim * num_k_heads * 2 + head_v_dim * num_v_heads; - int64_t nb1_qkv = ggml_row_size(conv_qkv_mix->type, qkv_dim); + ggml_tensor * conv_qkv_mix = + ggml_cont_2d(ctx0, ggml_transpose(ctx0, conv_output_silu), qkv_dim, n_seq_tokens * n_seqs); + cb(conv_qkv_mix, "conv_qkv_mix", il); // Extract the convolved Q, K, V from conv_output ggml_tensor * q_conv = - ggml_view_2d(ctx0, conv_qkv_mix, head_k_dim * num_k_heads, n_seq_tokens * n_seqs, nb1_qkv, 0); + ggml_view_2d(ctx0, conv_qkv_mix, head_k_dim * num_k_heads, n_seq_tokens * n_seqs, conv_qkv_mix->nb[1], 0); cb(q_conv, "q_conv", il); ggml_tensor * k_conv = - ggml_view_2d(ctx0, conv_qkv_mix, head_k_dim * num_k_heads, n_seq_tokens * n_seqs, nb1_qkv, + ggml_view_2d(ctx0, conv_qkv_mix, head_k_dim * num_k_heads, n_seq_tokens * n_seqs, conv_qkv_mix->nb[1], head_k_dim * num_k_heads * ggml_element_size(conv_qkv_mix)); cb(k_conv, "k_conv", il); ggml_tensor * v_conv = - ggml_view_2d(ctx0, conv_qkv_mix, head_v_dim * num_v_heads, n_seq_tokens * n_seqs, nb1_qkv, + ggml_view_2d(ctx0, conv_qkv_mix, head_v_dim * num_v_heads, n_seq_tokens * n_seqs, conv_qkv_mix->nb[1], 2 * head_k_dim * num_k_heads * ggml_element_size(conv_qkv_mix)); cb(v_conv, "v_conv", il); @@ -745,6 +705,8 @@ ggml_tensor * llm_build_qwen3next::build_layer_attn_linear( k_conv = ggml_cont_4d(ctx0, k_conv, head_k_dim, num_k_heads, n_seq_tokens, n_seqs); v_conv = ggml_cont_4d(ctx0, v_conv, head_v_dim, num_v_heads, n_seq_tokens, n_seqs); + beta = ggml_cont_4d(ctx0, b, num_v_heads, 1, n_seq_tokens, n_seqs); + ggml_tensor * state = build_rs(inp, ssm_states_all, hparams.n_embd_s(), n_seqs); state = ggml_reshape_4d(ctx0, state, head_v_dim, head_v_dim * num_v_heads, 1, n_seqs); cb(state, "state_predelta", il); @@ -776,29 +738,45 @@ ggml_tensor * llm_build_qwen3next::build_layer_attn_linear( cb(v_conv, "v_conv_predelta", il); // Choose between build_delta_net_chunking, build_delta_net_recurrent, and build_delta_net_autoregressive based on n_tokens - std::pair attn_out; // pair of (output, new_state) + ggml_tensor * attn_out; if (n_seq_tokens == 1) { attn_out = build_delta_net_autoregressive(q_conv, k_conv, v_conv, gate, beta, state, il); } else { attn_out = build_delta_net_chunking(q_conv, k_conv, v_conv, gate, beta, state, causal_mask, identity, diag_mask, il); } - ggml_tensor * output = attn_out.first; - ggml_tensor * new_state = attn_out.second; - cb(output, "attn_output", il); - cb(new_state, "new_state", il); + cb(attn_out, "attn_out", il); + + // The tensors were concatenated 1d, so we need to extract them 1d as well + const int64_t output_flat_size = head_v_dim * num_v_heads * n_seq_tokens * n_seqs; + ggml_tensor * attn_out_1d = ggml_view_1d(ctx0, attn_out, output_flat_size, 0); + cb(attn_out_1d, "attn_out_1d", il); + + ggml_tensor * attn_out_final = ggml_cont_4d(ctx0, attn_out_1d, head_v_dim, num_v_heads, n_seq_tokens, n_seqs); + cb(attn_out_final, "attn_out_reshaped", il); + + // Extract the state part (second part of the concatenated tensor) + // State starts after n_tokens elements along dimension 1 + const int64_t state_flat_size = head_v_dim * head_v_dim * num_v_heads * n_seqs; + + ggml_tensor * state_1d = + ggml_view_1d(ctx0, attn_out, state_flat_size, output_flat_size * ggml_element_size(attn_out)); + cb(state_1d, "state_1d", il); // Update the recurrent states ggml_build_forward_expand(gf, - ggml_cpy(ctx0, new_state, + ggml_cpy(ctx0, state_1d, ggml_view_1d(ctx0, ssm_states_all, hparams.n_embd_s() * n_seqs, kv_head * hparams.n_embd_s() * ggml_element_size(ssm_states_all)))); + GGML_ASSERT(ggml_nelements(attn_out_1d) + ggml_nelements(state_1d) == ggml_nelements(attn_out)); + // Reshape both attn_out_final and z to 2D tensors for normalization // attn_out_final: [head_dim, n_heads, n_tokens, n_seqs] -> [n_heads * n_tokens * n_seqs, head_dim] - ggml_tensor * attn_out_2d_final = ggml_reshape_2d(ctx0, output, head_v_dim, num_v_heads * n_seq_tokens * n_seqs); + ggml_tensor * attn_out_2d_final = + ggml_cont_2d(ctx0, attn_out_final, head_v_dim, num_v_heads * n_seq_tokens * n_seqs); // z: [head_dim, n_heads, n_tokens, n_seqs] -> [n_heads * n_tokens * n_seqs, head_dim] - ggml_tensor * z_2d = ggml_reshape_2d(ctx0, z, head_v_dim, num_v_heads * n_seq_tokens * n_seqs); + ggml_tensor * z_2d = ggml_cont_2d(ctx0, z, head_v_dim, num_v_heads * n_seq_tokens * n_seqs); // Apply gated normalization: self.norm(core_attn_out, z) ggml_tensor * attn_out_norm = build_norm_gated(attn_out_2d_final, model.layers[il].ssm_norm, z_2d, il); @@ -850,6 +828,12 @@ ggml_tensor * llm_build_qwen3next::build_layer_ffn(ggml_tensor * cur, const int shared_gate = ggml_sigmoid(ctx0, shared_gate); cb(shared_gate, "shared_expert_gate_sigmoid", il); + // The gate needs to be broadcast to match the dimensions of ffn_shexp + // ffn_shexp is [n_embd, n_tokens, 1, 1] and shared_gate is [1, n_tokens, 1, 1] + // We need to repeat the gate along the feature dimension + shared_gate = ggml_repeat(ctx0, shared_gate, ffn_shexp); + cb(shared_gate, "shared_expert_gate_broadcast", il); + // Apply the gate to the shared expert output ffn_shexp = ggml_mul(ctx0, ffn_shexp, shared_gate); cb(ffn_shexp, "ffn_shexp_gated", il); diff --git a/src/models/smallthinker.cpp b/src/models/smallthinker.cpp index 4c497ca..277eec2 100644 --- a/src/models/smallthinker.cpp +++ b/src/models/smallthinker.cpp @@ -26,16 +26,10 @@ llm_build_smallthinker::llm_build_smallthinker(const llama_model & model, ggml_tensor * inp_out_ids = build_inp_out_ids(); for (int il = 0; il < n_layer; ++il) { - const float freq_base_l = model.get_rope_freq_base (cparams, il); - const float freq_scale_l = model.get_rope_freq_scale(cparams, il); - ggml_tensor * inpSA = inpL; + ggml_tensor * probs = nullptr; - // This overlaps with SWA layers in current models, so get_rope_freq_base/scale may be superfluous - const bool use_rope = hparams.n_no_rope_layer_step == n_layer || - il % hparams.n_no_rope_layer_step != 0; - - ggml_tensor * probs = build_lora_mm(model.layers[il].ffn_gate_inp, inpL); // [n_expert, n_tokens] + probs = build_lora_mm(model.layers[il].ffn_gate_inp, inpL); // [n_expert, n_tokens] cb(probs, "ffn_moe_logits", il); // norm @@ -58,11 +52,11 @@ llm_build_smallthinker::llm_build_smallthinker(const llama_model & model, Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - if (use_rope) { - Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + if (hparams.n_no_rope_layer_step == n_layer || il % hparams.n_no_rope_layer_step != 0) { + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow); - Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow); } cb(Qcur, "Qcur", il); diff --git a/src/unicode.cpp b/src/unicode.cpp index b47dcbe..bb44edf 100644 --- a/src/unicode.cpp +++ b/src/unicode.cpp @@ -964,11 +964,6 @@ std::vector unicode_regex_split(const std::string & text, const std { "\\p{P}", unicode_cpt_flags::PUNCTUATION }, { "\\p{M}", unicode_cpt_flags::ACCENT_MARK }, { "\\p{S}", unicode_cpt_flags::SYMBOL }, - { "\\p{Lu}", unicode_cpt_flags::LETTER }, // Uppercase letter - { "\\p{Ll}", unicode_cpt_flags::LETTER }, // Lowercase letter - { "\\p{Lt}", unicode_cpt_flags::LETTER }, // Titlecase letter - { "\\p{Lm}", unicode_cpt_flags::LETTER }, // Modifier letter - { "\\p{Lo}", unicode_cpt_flags::LETTER }, // Other letter }; static const std::map k_ucat_cpt = { @@ -1079,26 +1074,22 @@ std::vector unicode_regex_split(const std::string & text, const std continue; } - // Match \p{...} Unicode properties of varying lengths - if (regex_expr[i + 0] == '\\' && i + 3 < regex_expr.size() && + if (regex_expr[i + 0] == '\\' && i + 4 < regex_expr.size() && regex_expr[i + 1] == 'p' && - regex_expr[i + 2] == '{') { - // Find the closing brace - size_t closing_brace = regex_expr.find('}', i + 3); - if (closing_brace != std::string::npos && closing_brace <= i + 10) { // reasonable limit - const std::string pat = regex_expr.substr(i, closing_brace - i + 1); - if (k_ucat_enum.find(pat) != k_ucat_enum.end()) { - if (!inside) { - regex_expr_collapsed += '['; - } - regex_expr_collapsed += k_ucat_cpt.at(k_ucat_enum.at(pat)); - regex_expr_collapsed += k_ucat_map.at(k_ucat_enum.at(pat)); - if (!inside) { - regex_expr_collapsed += ']'; - } - i = closing_brace; - continue; + regex_expr[i + 2] == '{' && + regex_expr[i + 4] == '}') { + const std::string pat = regex_expr.substr(i, 5); + if (k_ucat_enum.find(pat) != k_ucat_enum.end()) { + if (!inside) { + regex_expr_collapsed += '['; } + regex_expr_collapsed += k_ucat_cpt.at(k_ucat_enum.at(pat)); + regex_expr_collapsed += k_ucat_map.at(k_ucat_enum.at(pat)); + if (!inside) { + regex_expr_collapsed += ']'; + } + i += 4; + continue; } } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e556a77..c3d9f9c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -202,26 +202,15 @@ llama_build_and_test( llama_build_and_test(test-regex-partial.cpp) if (NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "s390x") - set(MODEL_NAME "tinyllamas/stories15M-q4_0.gguf") - set(MODEL_HASH "SHA256=66967fbece6dbe97886593fdbb73589584927e29119ec31f08090732d1861739") + llama_build_and_test(test-thread-safety.cpp ARGS -hf ggml-org/models -hff tinyllamas/stories15M-q4_0.gguf -ngl 99 -p "The meaning of life is" -n 128 -c 256 -ub 32 -np 4 -t 2) else() - set(MODEL_NAME "tinyllamas/stories15M-be.Q4_0.gguf") - set(MODEL_HASH "SHA256=9aec857937849d976f30397e97eb1cabb53eb9dcb1ce4611ba8247fb5f44c65d") + llama_build_and_test(test-thread-safety.cpp ARGS -hf ggml-org/models -hff tinyllamas/stories15M-be.Q4_0.gguf -ngl 99 -p "The meaning of life is" -n 128 -c 256 -ub 32 -np 4 -t 2) endif() -set(MODEL_DEST "${CMAKE_BINARY_DIR}/${MODEL_NAME}") -add_test(NAME test-download-model COMMAND ${CMAKE_COMMAND} - -DDEST=${MODEL_DEST} - -DNAME=${MODEL_NAME} - -DHASH=${MODEL_HASH} - -P ${CMAKE_SOURCE_DIR}/cmake/download-models.cmake -) -set_tests_properties(test-download-model PROPERTIES FIXTURES_SETUP test-download-model) - -llama_build_and_test(test-thread-safety.cpp ARGS -m "${MODEL_DEST}" -ngl 99 -p "The meaning of life is" -n 128 -c 256 -ub 32 -np 4 -t 2) -set_tests_properties(test-thread-safety PROPERTIES FIXTURES_REQUIRED test-download-model) - -llama_build_and_test(test-arg-parser.cpp) +# this fails on windows (github hosted runner) due to curl DLL not found (exit code 0xc0000135) +if (NOT WIN32) + llama_build_and_test(test-arg-parser.cpp) +endif() if (NOT LLAMA_SANITIZE_ADDRESS AND NOT GGML_SCHED_NO_REALLOC) # TODO: repair known memory leaks @@ -230,14 +219,16 @@ endif() llama_build_and_test(test-gguf.cpp) llama_build_and_test(test-backend-ops.cpp) -llama_build_and_test(test-model-load-cancel.cpp LABEL "model") -llama_build_and_test(test-autorelease.cpp LABEL "model") -llama_build_and_test(test-backend-sampler.cpp LABEL "model") +llama_build_and_test(test-model-load-cancel.cpp LABEL "model") +llama_build_and_test(test-autorelease.cpp LABEL "model") # Test for state restore with fragmented KV cache # Requires a model, uses same args pattern as test-thread-safety -llama_build_and_test(test-state-restore-fragmented.cpp LABEL "model" ARGS -m "${MODEL_DEST}") -set_tests_properties(test-state-restore-fragmented PROPERTIES FIXTURES_REQUIRED test-download-model) +if (NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "s390x") + llama_build_and_test(test-state-restore-fragmented.cpp LABEL "model" ARGS -hf ggml-org/models -hff tinyllamas/stories15M-q4_0.gguf) +else() + llama_build_and_test(test-state-restore-fragmented.cpp LABEL "model" ARGS -hf ggml-org/models -hff tinyllamas/stories15M-be.Q4_0.gguf) +endif() if (NOT GGML_BACKEND_DL) # these tests use the backends directly and cannot be built with dynamic loading diff --git a/tests/test-arg-parser.cpp b/tests/test-arg-parser.cpp index 67f8ca6..1bbb745 100644 --- a/tests/test-arg-parser.cpp +++ b/tests/test-arg-parser.cpp @@ -1,6 +1,5 @@ #include "arg.h" #include "common.h" -#include "download.h" #include #include @@ -128,15 +127,6 @@ int main(void) { assert(true == common_params_parse(argv.size(), list_str_to_char(argv).data(), params, LLAMA_EXAMPLE_SPECULATIVE)); assert(params.speculative.n_max == 123); - // multi-value args (CSV) - argv = {"binary_name", "--lora", "file1.gguf,\"file2,2.gguf\",\"file3\"\"3\"\".gguf\",file4\".gguf"}; - assert(true == common_params_parse(argv.size(), list_str_to_char(argv).data(), params, LLAMA_EXAMPLE_COMMON)); - assert(params.lora_adapters.size() == 4); - assert(params.lora_adapters[0].path == "file1.gguf"); - assert(params.lora_adapters[1].path == "file2,2.gguf"); - assert(params.lora_adapters[2].path == "file3\"3\".gguf"); - assert(params.lora_adapters[3].path == "file4\".gguf"); - // skip this part on windows, because setenv is not supported #ifdef _WIN32 printf("test-arg-parser: skip on windows build\n"); @@ -173,7 +163,7 @@ int main(void) { assert(params.cpuparams.n_threads == 1010); #endif // _WIN32 - printf("test-arg-parser: test download functions\n\n"); + printf("test-arg-parser: test curl-related functions\n\n"); const char * GOOD_URL = "http://ggml.ai/"; const char * BAD_URL = "http://ggml.ai/404"; diff --git a/tests/test-backend-ops.cpp b/tests/test-backend-ops.cpp index 188ffdf..6b65f6e 100644 --- a/tests/test-backend-ops.cpp +++ b/tests/test-backend-ops.cpp @@ -402,20 +402,12 @@ static std::string var_to_str(ggml_op_pool pool) { } static std::string var_to_str(ggml_scale_mode mode) { - std::string str; - switch (mode & 0xFF) { - case GGML_SCALE_MODE_NEAREST: str = "nearest"; break; - case GGML_SCALE_MODE_BILINEAR: str = "bilinear"; break; - case GGML_SCALE_MODE_BICUBIC: str = "bicubic"; break; - default: str = std::to_string(mode); break; + switch (mode) { + case GGML_SCALE_MODE_NEAREST: return "nearest"; + case GGML_SCALE_MODE_BILINEAR: return "bilinear"; + case GGML_SCALE_MODE_BICUBIC: return "bicubic"; + default: return std::to_string(mode); } - if (mode & GGML_SCALE_FLAG_ALIGN_CORNERS) { - str += "|align_corners"; - } - if (mode & GGML_SCALE_FLAG_ANTIALIAS) { - str += "|antialias"; - } - return str; } #define VAR_TO_STR(x) (#x "=" + var_to_str(x)) @@ -454,28 +446,6 @@ static bool ggml_is_view_op(enum ggml_op op) { return op == GGML_OP_VIEW || op == GGML_OP_RESHAPE || op == GGML_OP_PERMUTE || op == GGML_OP_TRANSPOSE; } -static bool backend_has_feature(ggml_backend_t backend, const char * feature_name) { - ggml_backend_dev_t dev = ggml_backend_get_device(backend); - ggml_backend_reg_t reg = ggml_backend_dev_backend_reg(dev); - - auto get_features = (ggml_backend_get_features_t) ggml_backend_reg_get_proc_address(reg, "ggml_backend_get_features"); - if (!get_features) { - return false; - } - - const ggml_backend_feature * features = get_features(reg); - if (!features) { - return false; - } - - for (const ggml_backend_feature * f = features; f->name; ++f) { - if (strcmp(f->name, feature_name) == 0 && strcmp(f->value, "1") == 0) { - return true; - } - } - return false; -} - enum test_mode { MODE_TEST, MODE_PERF, @@ -1123,11 +1093,6 @@ struct test_case { return 1e-7; } - virtual double max_nmse_err(ggml_backend_t backend) { - GGML_UNUSED(backend); - return max_nmse_err(); - } - virtual double max_maa_err() { return 1e-4; } @@ -1136,10 +1101,6 @@ struct test_case { return max_nmse_err(); } - virtual double max_err(ggml_backend_t backend) { - return max_nmse_err(backend); - } - virtual double err(const float * a, const float * b, size_t n) { return nmse(a, b, n); } @@ -1189,7 +1150,6 @@ struct test_case { } virtual bool run_whole_graph() { return false; } - virtual std::vector fusion_test_nodes() { return {}; } ggml_cgraph * gf = nullptr; ggml_cgraph * gb = nullptr; @@ -1409,8 +1369,8 @@ struct test_case { } double err = ud->tc->err(f1.data(), f2.data(), f1.size()); - if (err > ud->tc->max_err(ud->backend1)) { - printf("[%s] ERR = %.9f > %.9f ", ggml_op_desc(t1), err, ud->tc->max_err(ud->backend1)); + if (err > ud->tc->max_err()) { + printf("[%s] ERR = %.9f > %.9f ", ggml_op_desc(t1), err, ud->tc->max_err()); //for (int i = 0; i < (int) f1.size(); i++) { // printf("%5d %9.6f %9.6f, diff = %9.6f\n", i, f1[i], f2[i], f1[i] - f2[i]); //} @@ -1423,13 +1383,7 @@ struct test_case { GGML_UNUSED(index); }; - std::vector fused_nodes_to_verify = fusion_test_nodes(); - if (fused_nodes_to_verify.size() == 0 && run_whole_graph()) { - fused_nodes_to_verify.push_back(out); - } - const bool cmp_ok = ggml_backend_compare_graph_backend(backend1, backend2, gf, callback, &ud, - run_whole_graph() ? fused_nodes_to_verify.data() : nullptr, - fused_nodes_to_verify.size()); + const bool cmp_ok = ggml_backend_compare_graph_backend(backend1, backend2, gf, callback, &ud, run_whole_graph() ? out : nullptr); ggml_backend_buffer_free(buf); @@ -3462,65 +3416,6 @@ struct test_rms_norm_mul_add : public test_case { } }; -// GGML_OP_ADD + GGML_OP_RMS_NORM (fused operation) -struct test_add_rms_norm : public test_case { - const ggml_type type; - const std::array ne; - const float eps; - const bool broadcast; - - std::string op_desc(ggml_tensor * t) override { - GGML_UNUSED(t); - return "ADD_RMS_NORM"; - } - - bool run_whole_graph() override { return true; } - - std::string vars() override { - return VARS_TO_STR4(type, ne, eps, broadcast); - } - - test_add_rms_norm(ggml_type type = GGML_TYPE_F32, - std::array ne = {64, 5, 4, 3}, - float eps = 1e-6f, bool broadcast = false) - : type(type), ne(ne), eps(eps), broadcast(broadcast) {} - - ggml_tensor * build_graph(ggml_context * ctx) override { - std::array broadcast_dims = {ne[0]*2, ne[1]*3, ne[2]*3, ne[3]*4}; - - ggml_tensor * a = ggml_new_tensor(ctx, type, 4, broadcast ? broadcast_dims.data() : ne.data()); - ggml_tensor * b = ggml_new_tensor(ctx, type, 4, ne.data()); - - ggml_set_param(a); - ggml_set_name(a, "a"); - ggml_set_param(b); - ggml_set_name(b, "b"); - - // ADD operation followed by RMS_NORM - ggml_tensor * add_result = ggml_add(ctx, a, b); - ggml_set_name(add_result, "add_result"); - - ggml_tensor * out = ggml_rms_norm(ctx, add_result, eps); - ggml_set_name(out, "out"); - - return out; - } - - void initialize_tensors(ggml_context * ctx) override { - for (ggml_tensor * t = ggml_get_first_tensor(ctx); t != NULL; t = ggml_get_next_tensor(ctx, t)) { - init_tensor_uniform(t, -10.f, 10.f); - } - } - - float grad_eps() override { - return 1.0f; - } - - bool grad_precise() override { - return true; - } -}; - // GGML_OP_SSM_CONV struct test_ssm_conv : public test_case { const ggml_type type; @@ -3717,14 +3612,6 @@ struct test_mul_mat : public test_case { return 5e-4; } - double max_nmse_err(ggml_backend_t backend) override { - // for blackwell we quantize activations to mxfp4 instead of q8_1 so we add higher tolerance - if (type_a == GGML_TYPE_MXFP4 && backend_has_feature(backend, "BLACKWELL_NATIVE_FP4")) { - return 2e-2; - } - return max_nmse_err(); - } - int64_t grad_nmax() override { return 20000; } @@ -3853,14 +3740,6 @@ struct test_mul_mat_id : public test_case { return 5e-4; } - double max_nmse_err(ggml_backend_t backend) override { - // for blackwell we quantize activations to mxfp4 instead of q8_1 so we add higher tolerance - if (type_a == GGML_TYPE_MXFP4 && backend_has_feature(backend, "BLACKWELL_NATIVE_FP4")) { - return 2e-2; - } - return max_nmse_err(); - } - uint64_t op_flops(ggml_tensor * t) override { GGML_UNUSED(t); return 2 * m * k * n * n_used; @@ -5293,8 +5172,6 @@ struct test_topk_moe : public test_case { const bool bias_probs; const MoeGatingFunc gating_func; const float scale_w; - ggml_tensor * weights {}; - ggml_tensor * selected_experts {}; test_topk_moe(std::array ne = { 10, 5, 1, 1 }, int n_expert_used = 1, @@ -5332,16 +5209,16 @@ struct test_topk_moe : public test_case { ggml_tensor * selection_probs = probs; if (bias_probs) { - ggml_tensor * exp_probs_b = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, ne[0]); + ggml_tensor * exp_probs_b = ggml_new_tensor(ctx, GGML_TYPE_F32, 4, ne.data()); ggml_set_name(exp_probs_b, "exp_probs_b"); selection_probs = ggml_add(ctx, probs, exp_probs_b); ggml_set_name(selection_probs, "selection_probs"); } - selected_experts = ggml_argsort_top_k(ctx, selection_probs, n_expert_used); // [n_expert_used, n_tokens] + ggml_tensor * selected_experts = ggml_argsort_top_k(ctx, selection_probs, n_expert_used); // [n_expert_used, n_tokens] ggml_set_name(selected_experts, "selected_experts"); - weights = ggml_get_rows(ctx, ggml_reshape_3d(ctx, probs, 1, n_expert, n_tokens), selected_experts); // [1, n_expert_used, n_tokens] + ggml_tensor * weights = ggml_get_rows(ctx, ggml_reshape_3d(ctx, probs, 1, n_expert, n_tokens), selected_experts); // [1, n_expert_used, n_tokens] ggml_set_name(weights, "weights"); if (gating_func == GATING_FUNC_SOFTMAX_WEIGHT) { @@ -5367,21 +5244,6 @@ struct test_topk_moe : public test_case { ggml_set_name(weights, "weights"); return weights; } - // Verify two outputs - std::vector fusion_test_nodes() override { return { selected_experts, weights }; } - - // allow output in arbitrary order - double err(const float * a, const float * b, size_t n) override { - std::vector a2(n); - std::vector b2(n); - for (size_t i = 0; i < n; ++i) { - a2[i] = a[i]; - b2[i] = b[i]; - } - std::sort(a2.begin(), a2.end()); - std::sort(b2.begin(), b2.end()); - return nmse(a2.data(), b2.data(), n); - } }; struct test_mul_mat_vec_fusion : public test_case { @@ -5673,16 +5535,18 @@ struct test_interpolate : public test_case { const ggml_type type; const std::array ne; const std::array ne_tgt; - const ggml_scale_mode mode = GGML_SCALE_MODE_NEAREST; + const uint32_t mode = GGML_SCALE_MODE_NEAREST; std::string vars() override { - return VARS_TO_STR4(type, ne, ne_tgt, mode); + ggml_scale_mode mode = (ggml_scale_mode)(this->mode & 0xFF); + std::string flags = (this->mode & GGML_SCALE_FLAG_ALIGN_CORNERS) ? "align_corners" : "none"; + return VARS_TO_STR5(type, ne, ne_tgt, mode, flags); } test_interpolate(ggml_type type = GGML_TYPE_F32, std::array ne = {2, 5, 7, 11}, std::array ne_tgt = {5, 7, 11, 13}, - ggml_scale_mode mode = GGML_SCALE_MODE_NEAREST) + uint32_t mode = GGML_SCALE_MODE_NEAREST) : type(type), ne(ne), ne_tgt(ne_tgt), mode(mode) {} ggml_tensor * build_graph(ggml_context * ctx) override { @@ -7482,35 +7346,28 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_softcap(GGML_TYPE_F32, {10, 10, 10, 10}, 50.0f)); test_cases.emplace_back(new test_silu_back()); - for (float eps : { 0.0f, 1e-6f, 1e-4f, 1e-1f }) { - for (uint32_t n : { 64, 1025 }) { - for (bool v : { false, true }) { - test_cases.emplace_back(new test_norm(GGML_TYPE_F32, { n, 5, 4, 3 }, v, eps)); - test_cases.emplace_back(new test_rms_norm(GGML_TYPE_F32, { n, 5, 4, 3 }, v, eps)); - } - test_cases.emplace_back(new test_rms_norm_back(GGML_TYPE_F32, { n, 5, 4, 3 }, eps)); - test_cases.emplace_back(new test_l2_norm(GGML_TYPE_F32, { n, 5, 4, 3 }, eps)); + for (float eps : {0.0f, 1e-6f, 1e-4f, 1e-1f}) { + for (bool v : {false, true}) { + test_cases.emplace_back(new test_norm (GGML_TYPE_F32, {64, 5, 4, 3}, v, eps)); + test_cases.emplace_back(new test_rms_norm(GGML_TYPE_F32, {64, 5, 4, 3}, v, eps)); } + test_cases.emplace_back(new test_rms_norm_back(GGML_TYPE_F32, {64, 5, 4, 3}, eps)); + test_cases.emplace_back(new test_l2_norm (GGML_TYPE_F32, {64, 5, 4, 3}, eps)); } // in-place tests test_cases.emplace_back(new test_rms_norm(GGML_TYPE_F32, {64, 5, 4, 3}, false, 1e-6f, true)); - for (float eps : { 0.0f, 1e-6f, 1e-4f, 1e-1f, 1.0f }) { - for (uint32_t n : { 64, 1025 }) { - test_cases.emplace_back(new test_rms_norm_mul_add(GGML_TYPE_F32, { n, 5, 4, 3 }, eps, false)); - test_cases.emplace_back(new test_rms_norm_mul_add(GGML_TYPE_F32, { n, 5, 4, 3 }, eps, true)); - test_cases.emplace_back(new test_norm_mul_add(GGML_TYPE_F32, { n, 5, 4, 3 }, eps, false)); - test_cases.emplace_back(new test_norm_mul_add(GGML_TYPE_F32, { n, 5, 4, 3 }, eps, true)); - test_cases.emplace_back(new test_add_rms_norm(GGML_TYPE_F32, { n, 5, 4, 3 }, eps, false)); - test_cases.emplace_back(new test_add_rms_norm(GGML_TYPE_F32, { n, 5, 4, 3 }, eps, true)); - } + for (float eps : {0.0f, 1e-6f, 1e-4f, 1e-1f, 1.0f}) { + test_cases.emplace_back(new test_rms_norm_mul_add(GGML_TYPE_F32, {64, 5, 4, 3}, eps, false)); + test_cases.emplace_back(new test_rms_norm_mul_add(GGML_TYPE_F32, {64, 5, 4, 3}, eps, true)); + test_cases.emplace_back(new test_norm_mul_add(GGML_TYPE_F32, {64, 5, 4, 3}, eps, false)); + test_cases.emplace_back(new test_norm_mul_add(GGML_TYPE_F32, {64, 5, 4, 3}, eps, true)); } for (uint32_t n : {1, 511, 1025, 8192, 33*512}) { for (bool multi_add : {false, true}) { test_cases.emplace_back(new test_rms_norm_mul_add(GGML_TYPE_F32, {n, 1, 1, 1}, 1e-6f, false, multi_add)); } - test_cases.emplace_back(new test_add_rms_norm(GGML_TYPE_F32, {n, 1, 1, 1}, 1e-6f, false)); } for (auto multi_add : {false, true}) { @@ -7528,6 +7385,9 @@ static std::vector> make_test_cases_eval() { } } } + + test_cases.emplace_back(new test_l2_norm(GGML_TYPE_F32, {64, 5, 4, 3}, 1e-12f)); + for (int64_t d_conv : {3, 4, 9}) { for (int64_t d_inner: {1024, 1536, 2048}) { test_cases.emplace_back(new test_ssm_conv(GGML_TYPE_F32, {d_conv, d_inner, 1, 1}, {d_conv, d_inner, 1, 1})); @@ -7561,11 +7421,6 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_mul_mat(GGML_TYPE_F16, GGML_TYPE_F16, 1700000, 96, 2592, {1, 1}, {1, 1})); test_cases.emplace_back(new test_mul_mat(GGML_TYPE_F16, GGML_TYPE_F16, 1700000, 3, 2592, {1, 1}, {1, 1})); test_cases.emplace_back(new test_mul_mat(GGML_TYPE_F16, GGML_TYPE_F16, 1700000, 1, 2592, {1, 1}, {1, 1})); - - test_cases.emplace_back(new test_mul_mat_id(GGML_TYPE_Q8_0, GGML_TYPE_F32, 128, 128, false, 8192, 2, 5120)); // Llama-4-Maverick-17B-128E-PAB-Q8_0 - test_cases.emplace_back(new test_mul_mat_id(GGML_TYPE_Q8_0, GGML_TYPE_F32, 128, 128, false, 8192, 1, 5120)); // Llama-4-Maverick-17B-128E-PAB-Q8_0 - test_cases.emplace_back(new test_mul_mat(GGML_TYPE_Q8_0, GGML_TYPE_F32, 8192, 1, 5120, {128, 1}, {1, 1})); - test_cases.emplace_back(new test_mul_mat(GGML_TYPE_Q8_0, GGML_TYPE_F32, 8192, 512, 5120, {128, 1}, {1, 1})); #endif for (ggml_type type_a : all_types) { @@ -7678,10 +7533,6 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_mul_mat(GGML_TYPE_F32, GGML_TYPE_F32, 64, 77, 77, {12,1}, {1,1})); test_cases.emplace_back(new test_mul_mat(GGML_TYPE_Q4_0, GGML_TYPE_F32, 576, 512, 576, {1,1}, {1,1})); - test_cases.emplace_back(new test_mul_mat(GGML_TYPE_Q4_0, GGML_TYPE_F32, 1, 2048, 8192, {1, 1}, {1, 1})); - for (ggml_type type_a : all_types) { - test_cases.emplace_back(new test_mul_mat(type_a, GGML_TYPE_F32, 1, 64, 256, {1, 1}, {1, 1})); - } #if 0 // test the mat-mat path for Metal @@ -7894,11 +7745,8 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_soft_max(GGML_TYPE_F32, {32, 2, 32, 1}, true, true, GGML_TYPE_F32, {1, 1}, 0.1f, 8.0f)); test_cases.emplace_back(new test_soft_max(GGML_TYPE_F32, {32, 2, 32, 1}, true, true, GGML_TYPE_F16, {1, 1}, 0.1f, 8.0f)); - test_cases.emplace_back(new test_soft_max(GGML_TYPE_F32, {200001, 2, 3, 1}, true, true, GGML_TYPE_F32, {1, 1}, 0.1f, 8.0f)); - test_cases.emplace_back(new test_soft_max(GGML_TYPE_F32, {200001, 2, 3, 1}, true, true, GGML_TYPE_F16, {1, 1}, 0.1f, 8.0f)); - test_cases.emplace_back(new test_soft_max(GGML_TYPE_F32, {200000, 1, 1, 1}, false, false, GGML_TYPE_F32, {1, 1}, 1.0f, 0.0f)); - test_cases.emplace_back(new test_soft_max(GGML_TYPE_F32, {200000, 4, 1, 1}, false, false, GGML_TYPE_F32, {1, 1}, 1.0f, 0.0f)); - test_cases.emplace_back(new test_soft_max(GGML_TYPE_F32, {643251, 3, 1, 1}, false, false, GGML_TYPE_F32, {1, 1}, 1.0f, 0.0f)); + test_cases.emplace_back(new test_soft_max(GGML_TYPE_F32, {200001, 2, 3, 1}, true, true, GGML_TYPE_F32, {1, 1}, 0.1f, 8.0f)); + test_cases.emplace_back(new test_soft_max(GGML_TYPE_F32, {200001, 2, 3, 1}, true, true, GGML_TYPE_F16, {1, 1}, 0.1f, 8.0f)); for (float max_bias : {0.0f, 8.0f}) { for (float scale : {1.0f, 0.1f}) { @@ -7927,7 +7775,6 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_rope(type, {128, 40, 2, 1}, 128, GGML_ROPE_TYPE_NORMAL, 512, fs, ef, af, ff, v, fw)); // llama 13B test_cases.emplace_back(new test_rope(type, {128, 52, 2, 1}, 128, GGML_ROPE_TYPE_NORMAL, 512, fs, ef, af, ff, v, fw)); // llama 30B test_cases.emplace_back(new test_rope(type, {128, 64, 2, 1}, 128, GGML_ROPE_TYPE_NORMAL, 512, fs, ef, af, ff, v, fw)); // llama 65B - test_cases.emplace_back(new test_rope(type, {16, 16, 8192, 1}, 16, GGML_ROPE_TYPE_NORMAL, 512, fs, ef, af, ff, v, fw)); } if (all) { @@ -7942,7 +7789,6 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_rope(type, { 80, 32, 2, 1}, 20, GGML_ROPE_TYPE_NEOX, 512, fs, ef, af, ff, v, fw)); // neox (stablelm) test_cases.emplace_back(new test_rope(type, { 80, 32, 2, 1}, 32, GGML_ROPE_TYPE_NEOX, 512, fs, ef, af, ff, v, fw)); // neox (phi-2) test_cases.emplace_back(new test_rope(type, { 80, 32, 4, 1}, 32, GGML_ROPE_TYPE_NEOX, 512, fs, ef, af, ff, v, fw)); // neox (phi-2) - test_cases.emplace_back(new test_rope(type, { 16, 16, 8192, 1}, 16, GGML_ROPE_TYPE_NEOX, 512, fs, ef, af, ff, v, fw)); } if (all) { @@ -7956,7 +7802,6 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_rope(type, {128, 28, 2, 1}, 32, GGML_ROPE_TYPE_IMROPE, 512, fs, ef, af, ff, v, fw)); test_cases.emplace_back(new test_rope(type, { 80, 16, 2, 1}, 80, GGML_ROPE_TYPE_VISION, 512, fs, ef, af, ff, v, fw)); // rope_multi,m-rope (qwen2vl ViT) test_cases.emplace_back(new test_rope(type, {128, 16, 2, 1}, 128, GGML_ROPE_TYPE_IMROPE, 512, fs, ef, af, ff, v, fw)); // rope_multi,m-rope (qwen3vl) - test_cases.emplace_back(new test_rope(type, {16, 16, 8192, 1}, 16, GGML_ROPE_TYPE_IMROPE, 512, fs, ef, af, ff, v, fw)); } test_cases.emplace_back(new test_rope(type, { 64, 128, 2, 1}, 64, GGML_ROPE_TYPE_NEOX, 512, fs, ef, af, ff, v, fw)); // neox (falcon 40B) @@ -8002,11 +7847,6 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_argsort(GGML_TYPE_F32, {2, 8, 8192, 1}, order)); // bailingmoe2 (group selection) } - for (int n = 1; n < 5; ++n) { - for (int k = 1; k <= n; ++k) { - test_cases.emplace_back(new test_top_k(GGML_TYPE_F32, {n, 2, 1, 3}, k, true)); - } - } for (int i = 0; i < 20; ++i) { for (int k : {1, 2, 3, 7, 15, 100, 500, 1023, 9999}) { if (k <= 1<> make_test_cases_eval() { test_cases.emplace_back(new test_interpolate(GGML_TYPE_F32, {5, 7, 11, 13}, {2, 5, 7, 11}, mode)); } for (ggml_scale_mode mode : {GGML_SCALE_MODE_BILINEAR, GGML_SCALE_MODE_BICUBIC}) { - test_cases.emplace_back(new test_interpolate(GGML_TYPE_F32, {2, 5, 7, 11}, {5, 7, 11, 13}, (ggml_scale_mode)(mode | GGML_SCALE_FLAG_ALIGN_CORNERS))); - test_cases.emplace_back(new test_interpolate(GGML_TYPE_F32, {1, 4, 3, 2}, {2, 8, 3, 2}, (ggml_scale_mode)(mode | GGML_SCALE_FLAG_ALIGN_CORNERS))); - test_cases.emplace_back(new test_interpolate(GGML_TYPE_F32, {4, 1, 3, 2}, {1, 1, 3, 2}, (ggml_scale_mode)(mode | GGML_SCALE_FLAG_ALIGN_CORNERS))); + test_cases.emplace_back(new test_interpolate(GGML_TYPE_F32, {2, 5, 7, 11}, {5, 7, 11, 13}, mode | GGML_SCALE_FLAG_ALIGN_CORNERS)); + test_cases.emplace_back(new test_interpolate(GGML_TYPE_F32, {1, 4, 3, 2}, {2, 8, 3, 2}, mode | GGML_SCALE_FLAG_ALIGN_CORNERS)); + test_cases.emplace_back(new test_interpolate(GGML_TYPE_F32, {4, 1, 3, 2}, {1, 1, 3, 2}, mode | GGML_SCALE_FLAG_ALIGN_CORNERS)); } test_cases.emplace_back(new test_sum()); @@ -8094,7 +7934,6 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_cumsum(GGML_TYPE_F32, { 2048, 5, 4, 3 })); test_cases.emplace_back(new test_cumsum(GGML_TYPE_F32, { 201*1204, 1, 1, 1 })); test_cases.emplace_back(new test_cumsum(GGML_TYPE_F32, { 312*1205, 1, 1, 1 })); - test_cases.emplace_back(new test_cumsum(GGML_TYPE_F32, { 20481, 4, 1, 1 })); test_cases.emplace_back(new test_xielu()); @@ -8237,7 +8076,6 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_topk_moe({71, 22, 1, 1}, 8, with_norm, bias_probs, gate, scale_w)); test_cases.emplace_back(new test_topk_moe({128, 1, 1, 1}, 128, with_norm, bias_probs, gate, scale_w)); test_cases.emplace_back(new test_topk_moe({129, 1, 1, 1}, 128, with_norm, bias_probs, gate, scale_w)); - test_cases.emplace_back(new test_topk_moe({160, 4, 1, 1}, 160, with_norm, bias_probs, gate, scale_w)); } } } @@ -8423,12 +8261,6 @@ static std::vector> make_test_cases_perf() { } } - for (int col : {8192, 16384, 32768, 65536, 131072, 262144, 524288}) { - for (int rows : {1, 4, 16}){ - test_cases.emplace_back(new test_soft_max(GGML_TYPE_F32, {col, rows, 1, 1}, false, false, GGML_TYPE_F32, {1, 1}, 1.0f, 0.0f)); - } - } - test_cases.emplace_back(new test_conv_2d_dw({512, 512, 256, 1}, {3, 3, 1, 256}, 1, 1, 1, false)); test_cases.emplace_back(new test_conv_2d_dw({512, 512, 256, 1}, {3, 3, 1, 256}, 1, 1, 1, true)); @@ -8472,9 +8304,7 @@ static std::vector> make_test_cases_perf() { test_cases.emplace_back(new test_sum(GGML_TYPE_F32, it)); } - test_cases.emplace_back(new test_argsort(GGML_TYPE_F32, {65000, 16, 1, 1})); - test_cases.emplace_back(new test_argsort(GGML_TYPE_F32, {200000, 1, 1, 1})); - test_cases.emplace_back(new test_argsort(GGML_TYPE_F32, {200000, 16, 1, 1})); + test_cases.emplace_back(new test_argsort(GGML_TYPE_F32, {65000, 16, 1, 1})); test_cases.emplace_back(new test_top_k(GGML_TYPE_F32, {2, 1, 1, 1}, 1)); for (auto k : {1, 10, 40, 400}) { @@ -8485,18 +8315,13 @@ static std::vector> make_test_cases_perf() { } } - for (auto nrows : {1, 4, 8, 16}) { - for (auto cols : {128, 1024, 4096, 8192, 16384, 32768, 65536, 131072, 200000, 2000000}) { - test_cases.emplace_back(new test_cumsum(GGML_TYPE_F32, {cols, nrows, 1, 1})); - } - } - // Examples from granite-4.0-h-1b/ggml-model-Q8_0.gguf test_cases.emplace_back(new test_ssm_conv(GGML_TYPE_F32, {515, 3328, 1, 1}, {4, 3328, 1, 1})); // prefill test_cases.emplace_back(new test_ssm_conv(GGML_TYPE_F32, {4, 3328, 1, 1}, {4, 3328, 1, 1})); // generate test_cases.emplace_back(new test_ssm_scan(GGML_TYPE_F32, 128, 64, 48, 1, 512, 1)); // prefill test_cases.emplace_back(new test_ssm_scan(GGML_TYPE_F32, 128, 64, 48, 1, 1, 1)); // generate + return test_cases; } diff --git a/tests/test-backend-sampler.cpp b/tests/test-backend-sampler.cpp deleted file mode 100644 index c10bde9..0000000 --- a/tests/test-backend-sampler.cpp +++ /dev/null @@ -1,1165 +0,0 @@ -#include "ggml.h" -#include "llama.h" -#include "llama-cpp.h" -#include "get-model.h" -#include "common.h" - -#ifdef NDEBUG -#undef NDEBUG -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -struct test_args { - std::string model; - std::string test; - std::string device = "auto"; -}; - -struct test_params { - llama_model_ptr model; -}; - -static llama_model_ptr load_model(const test_args & args) { - auto mparams = llama_model_default_params(); - - ggml_backend_dev_t devs[2] = { nullptr, nullptr }; - - if (args.device != "auto") { - if (args.device == "gpu") { - devs[0] = ggml_backend_dev_by_type(GGML_BACKEND_DEVICE_TYPE_GPU); - - if (devs[0] == nullptr) { - fprintf(stderr, "Error: GPU requested but not available\n"); - return nullptr; - } - - mparams.n_gpu_layers = 999; - } else if (args.device == "cpu") { - devs[0] = ggml_backend_dev_by_type(GGML_BACKEND_DEVICE_TYPE_CPU); - - mparams.n_gpu_layers = 0; - } else { - fprintf(stderr, "Error: invalid device '%s'\n", args.device.c_str()); - return nullptr; - } - - mparams.devices = devs; - - fprintf(stderr, "Using device: %s\n", ggml_backend_dev_name(devs[0])); - } - - llama_model_ptr res; - - res.reset(llama_model_load_from_file(args.model.c_str(), mparams)); - - if (!res) { - fprintf(stderr, "Warning: failed to load model '%s', skipping test\n", args.model.c_str()); - return nullptr; - } - - return res; -} - -struct test_context { - llama_context_ptr ctx; - - int n_vocab = 0; - - const llama_vocab * vocab = nullptr; - - std::unordered_map seq_positions; - std::unordered_map last_batch_info; - - test_context(const test_params & params, std::vector & configs, int32_t n_seq_max = -1) { - auto * model = params.model.get(); - - GGML_ASSERT(model); - GGML_ASSERT(!ctx); - - llama_context_params cparams = llama_context_default_params(); - cparams.n_ctx = 512; - cparams.n_batch = 512; - cparams.samplers = configs.data(); - cparams.n_samplers = configs.size(); - - // If n_seq_max is not specified, calculate it from configs - if (n_seq_max < 0) { - int32_t max_seq_id = 0; - for (const auto & config : configs) { - max_seq_id = std::max(config.seq_id, max_seq_id); - } - cparams.n_seq_max = max_seq_id + 1; - } else { - cparams.n_seq_max = n_seq_max; - } - - ctx.reset(llama_init_from_model(model, cparams)); - if (!ctx) { - throw std::runtime_error("failed to create context"); - } - - llama_set_warmup(ctx.get(), false); - - vocab = llama_model_get_vocab(model); - n_vocab = llama_vocab_n_tokens(vocab); - } - - bool decode(const std::map & prompts) { - GGML_ASSERT(ctx); - - last_batch_info.clear(); - llama_batch batch = llama_batch_init(512, 0, prompts.size()); - - for (const auto & [seq_id, prompt] : prompts) { - std::vector tokens; - tokens.push_back(llama_vocab_bos(vocab)); - - std::vector prompt_tokens(32); - int n_tokens = llama_tokenize(vocab, prompt.c_str(), prompt.length(), - prompt_tokens.data(), prompt_tokens.size(), - false, false); - if (n_tokens < 0) { - fprintf(stderr, "Warning: tokenization failed for seq_id %d\n", seq_id); - llama_batch_free(batch); - return false; - } - - for (int i = 0; i < n_tokens; i++) { - tokens.push_back(prompt_tokens[i]); - } - - if (seq_positions.find(seq_id) == seq_positions.end()) { - seq_positions[seq_id] = 0; - } - - int32_t start_pos = seq_positions[seq_id]; - for (size_t i = 0; i < tokens.size(); i++) { - common_batch_add(batch, tokens[i], start_pos + i, { seq_id }, i == tokens.size() - 1); - } - - seq_positions[seq_id] = start_pos + tokens.size(); - } - - - printf("Batch contents:\n"); - printf("n_tokens: %d\n", batch.n_tokens); - for (int i = 0; i < batch.n_tokens; i++) { - printf("token[%d]: tok=%-5d, pos=%d, n_seq_id=%d, seq_ids=[", i, batch.token[i], batch.pos[i], batch.n_seq_id[i]); - - for (int j = 0; j < batch.n_seq_id[i]; j++) { - printf("%d%s", batch.seq_id[i][j], j < batch.n_seq_id[i]-1 ? ", " : ""); - } - printf("], logits=%d\n", batch.logits[i]); - } - - if (llama_decode(ctx.get(), batch) != 0) { - fprintf(stderr, "Warning: llama_decode failed\n"); - llama_batch_free(batch); - return false; - } - - // Build mapping from seq id to batch token idx - for (int i = 0; i < batch.n_tokens; i++) { - if (batch.logits[i]) { - llama_seq_id seq_id = batch.seq_id[i][0]; - last_batch_info[seq_id] = i; - } - } - - llama_batch_free(batch); - return true; - } - - int32_t idx_for_seq(llama_seq_id seq_id) { - auto it = last_batch_info.find(seq_id); - if (it == last_batch_info.end()) { - fprintf(stderr, "Error: no batch index found for seq_id %d\n", seq_id); - return -1; - } - return it->second; - } - - void update_batch_info(const llama_batch & batch) { - last_batch_info.clear(); - for (int i = 0; i < batch.n_tokens; i++) { - if (batch.logits[i]) { - llama_seq_id cur_seq = batch.seq_id[i][0]; - last_batch_info[cur_seq] = i; - } - } - } - - bool decode_token(llama_token token, llama_seq_id seq_id = 0) { - GGML_ASSERT(ctx); - - llama_batch batch = llama_batch_init(1, 0, 1); - int32_t pos = seq_positions[seq_id]; - common_batch_add(batch, token, pos, { seq_id }, true); - - if (llama_decode(ctx.get(), batch) != 0) { - fprintf(stderr, "Warning: llama_decode failed for token %d in seq %d\n", token, seq_id); - llama_batch_free(batch); - return false; - } - - update_batch_info(batch); - - seq_positions[seq_id]++; - llama_batch_free(batch); - - return true; - } - - bool decode_tokens(const std::map & seq_tokens) { - GGML_ASSERT(ctx); - - llama_batch batch = llama_batch_init(seq_tokens.size(), 0, seq_tokens.size()); - - for (const auto & [seq_id, token] : seq_tokens) { - int32_t pos = seq_positions[seq_id]; - common_batch_add(batch, token, pos, { seq_id }, true); - } - - if (llama_decode(ctx.get(), batch) != 0) { - fprintf(stderr, "Warning: llama_decode failed for batch tokens\n"); - llama_batch_free(batch); - return false; - } - - for (const auto & [seq_id, _] : seq_tokens) { - seq_positions[seq_id]++; - } - - update_batch_info(batch); - - llama_batch_free(batch); - - return true; - } - - std::string token_to_piece(llama_token token, bool special) const { - std::string piece; - piece.resize(piece.capacity()); // using string internal cache, 15 bytes + '\n' - const int n_chars = llama_token_to_piece(vocab, token, &piece[0], piece.size(), 0, special); - if (n_chars < 0) { - piece.resize(-n_chars); - int check = llama_token_to_piece(vocab, token, &piece[0], piece.size(), 0, special); - GGML_ASSERT(check == -n_chars); - } else { - piece.resize(n_chars); - } - - return piece; - } -}; - -static void test_backend_greedy_sampling(const test_params & params) { - const int seq_id = 0; - - struct llama_sampler_chain_params backend_sampler_params = llama_sampler_chain_default_params(); - llama_sampler_ptr backend_sampler_chain(llama_sampler_chain_init(backend_sampler_params)); - - llama_sampler_chain_add(backend_sampler_chain.get(), llama_sampler_init_greedy()); - std::vector backend_sampler_configs = {{ seq_id, backend_sampler_chain.get() }}; - - test_context test_ctx(params, backend_sampler_configs); - - if (!test_ctx.decode({{seq_id, "Some"}})) { - GGML_ASSERT(false && "Failed to decode token"); - } - - int32_t batch_idx = test_ctx.idx_for_seq(seq_id); - - llama_token token = llama_get_sampled_token_ith(test_ctx.ctx.get(), batch_idx); - printf("greedy sampled id:%d, string:'%s'\n", token, test_ctx.token_to_piece(token, false).c_str()); - GGML_ASSERT(token >= 0 && token < test_ctx.n_vocab); - - token = llama_get_sampled_token_ith(test_ctx.ctx.get(), -1); - printf("greedy sampled id:%d, string:'%s'\n", token, test_ctx.token_to_piece(token, false).c_str()); - GGML_ASSERT(token >= 0 && token < test_ctx.n_vocab); - - for (int i = 0; i < 10; i++) { - int32_t loop_idx = test_ctx.idx_for_seq(seq_id); - llama_token token = llama_get_sampled_token_ith(test_ctx.ctx.get(), loop_idx); - printf("Generation step %d: token id:%d, string: %s\n", i, token, test_ctx.token_to_piece(token, false).c_str()); - if (!test_ctx.decode_token(token, 0)) { - GGML_ASSERT(false && "Failed to decode token"); - } - } -} - -static void test_backend_top_k_sampling(const test_params & params) { - const int seq_id = 0; - const int32_t k = 8; - struct llama_sampler_chain_params backend_chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr backend_sampler_chain(llama_sampler_chain_init(backend_chain_params)); - llama_sampler_chain_add(backend_sampler_chain.get(), llama_sampler_init_top_k(k)); - std::vector backend_sampler_configs = {{ seq_id, backend_sampler_chain.get() }}; - - test_context test_ctx(params, backend_sampler_configs); - - if (!test_ctx.decode({{seq_id, "Hello"}})) { - GGML_ASSERT(false && "Failed to decode token"); - } - - int32_t batch_idx = test_ctx.idx_for_seq(seq_id); - - float * logits = llama_get_sampled_logits_ith(test_ctx.ctx.get(), batch_idx); - uint32_t n_logits = llama_get_sampled_logits_count_ith(test_ctx.ctx.get(), batch_idx); - for (size_t i = 0; i < n_logits; ++i) { - printf("top_k logit[%zu] = %.6f\n", i, logits[i]); - } - - llama_token * candidates = llama_get_sampled_candidates_ith(test_ctx.ctx.get(), batch_idx); - uint32_t n_candidates = llama_get_sampled_candidates_count_ith(test_ctx.ctx.get(), batch_idx); - for (size_t i = 0; i < n_candidates; ++i) { - printf("top_k candidate[%zu] = %d : %s\n", i, candidates[i], - test_ctx.token_to_piece(candidates[i], false).c_str()); - } - - // Sample using CPU sampler for verification that it is possible to do hybrid - // sampling, first top_k on the backend and then dist on the CPU. - struct llama_sampler_chain_params chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr chain(llama_sampler_chain_init(chain_params)); - GGML_ASSERT(chain->iface->backend_apply != nullptr); - - llama_sampler_chain_add(chain.get(), llama_sampler_init_dist(18)); - llama_token token = llama_sampler_sample(chain.get(), test_ctx.ctx.get(), batch_idx); - GGML_ASSERT(token >= 0 && token < test_ctx.n_vocab); - - printf("backend top-k hybrid sampling test PASSED\n"); -} - -static void test_backend_temp_sampling(const test_params & params) { - { - const float temp_0 = 0.8f; - struct llama_sampler_chain_params backend_chain_params_0 = llama_sampler_chain_default_params(); - llama_sampler_ptr backend_sampler_chain_0(llama_sampler_chain_init(backend_chain_params_0)); - llama_sampler_chain_add(backend_sampler_chain_0.get(), llama_sampler_init_temp(temp_0)); - - const float temp_1 = 0.1f; - struct llama_sampler_chain_params backend_chain_params_1 = llama_sampler_chain_default_params(); - llama_sampler_ptr backend_sampler_chain_1(llama_sampler_chain_init(backend_chain_params_1)); - llama_sampler_chain_add(backend_sampler_chain_1.get(), llama_sampler_init_temp(temp_1)); - - std::vector backend_sampler_configs = { - { 0, backend_sampler_chain_0.get() }, - { 1, backend_sampler_chain_1.get() } - }; - - test_context test_ctx(params, backend_sampler_configs); - - if (!test_ctx.decode({{0, "Some where over the"}, {1, "Once upon a"}})) { - GGML_ASSERT(false && "Failed to decode token"); - } - - // Verfify sequence 0 - { - int32_t batch_idx = test_ctx.idx_for_seq(0); - int n_logits = llama_get_sampled_logits_count_ith(test_ctx.ctx.get(), batch_idx); - GGML_ASSERT(n_logits == test_ctx.n_vocab); - - // Sample from sequence 0 using CPU sampler - struct llama_sampler_chain_params chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr chain(llama_sampler_chain_init(chain_params)); - llama_sampler_chain_add(chain.get(), llama_sampler_init_dist(18)); - - llama_token token = llama_sampler_sample(chain.get(), test_ctx.ctx.get(), batch_idx); - const std::string token_str = test_ctx.token_to_piece(token, false); - printf("Sequence 0 sampled token id:%d, string: '%s'\n", token, token_str.c_str()); - GGML_ASSERT(token >= 0 && token < test_ctx.n_vocab); - } - - - // Verfify sequence 1 - { - int32_t batch_idx = test_ctx.idx_for_seq(1); - - // Sample from sequence 1 using CPU sampler - struct llama_sampler_chain_params chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr chain(llama_sampler_chain_init(chain_params)); - llama_sampler_chain_add(chain.get(), llama_sampler_init_dist(18)); - - llama_token token = llama_sampler_sample(chain.get(), test_ctx.ctx.get(), batch_idx); - const std::string token_str = test_ctx.token_to_piece(token, false); - printf("Sequence 1 sampled token id:%d, string: '%s'\n", token, token_str.c_str()); - GGML_ASSERT(token >= 0 && token < test_ctx.n_vocab); - } - } - - // lambda to testing non-positive temperature values. - auto test_argmax_temp = [&](float temp) { - printf("\nTesting temperature = %.1f\n", temp); - - int seq_id = 0; - struct llama_sampler_chain_params backend_chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr backend_sampler_chain(llama_sampler_chain_init(backend_chain_params)); - llama_sampler_chain_add(backend_sampler_chain.get(), llama_sampler_init_temp(temp)); - - std::vector backend_sampler_configs = { - { seq_id, backend_sampler_chain.get() }, - }; - - test_context test_ctx(params, backend_sampler_configs); - - if (!test_ctx.decode({{seq_id, "Once"}})) { - GGML_ASSERT(false && "Failed to decode token"); - } - - int32_t batch_idx = test_ctx.idx_for_seq(seq_id); - - uint32_t n_logits = llama_get_sampled_logits_count_ith(test_ctx.ctx.get(), batch_idx); - GGML_ASSERT(n_logits == 1); - }; - - test_argmax_temp(0.0f); - test_argmax_temp(-1.0f); - - printf("backend temp sampling test PASSED\n"); -} - -static void test_backend_temp_ext_sampling(const test_params & params) { - { - int seq_id = 0; - const float temp = 0.8f; - const float delta = 0.5f; - const float exponent = 1.5f; - struct llama_sampler_chain_params backend_chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr backend_sampler_chain(llama_sampler_chain_init(backend_chain_params)); - llama_sampler_chain_add(backend_sampler_chain.get(), llama_sampler_init_temp_ext(temp, delta, exponent)); - - std::vector backend_sampler_configs = { - { seq_id, backend_sampler_chain.get() }, - }; - - test_context test_ctx(params, backend_sampler_configs); - - if (!test_ctx.decode({{seq_id, "Once upon a"}})) { - GGML_ASSERT(false && "Failed to decode token"); - } - - // Verify sequence 0 - { - int32_t batch_idx = test_ctx.idx_for_seq(seq_id); - int n_logits = llama_get_sampled_logits_count_ith(test_ctx.ctx.get(), batch_idx); - GGML_ASSERT(n_logits == test_ctx.n_vocab); - } - } - - // lambda to testing non-positive temp/delta/exponent values. - auto test_argmax_temp = [&](float temp, float delta, float exponent) { - printf("\nTesting temperature = %.1f, delta = %1.f, exponent = %1.f\n", temp, delta, exponent); - - int seq_id = 0; - struct llama_sampler_chain_params backend_chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr backend_sampler_chain(llama_sampler_chain_init(backend_chain_params)); - llama_sampler_chain_add(backend_sampler_chain.get(), llama_sampler_init_temp_ext(temp, delta, exponent)); - - std::vector backend_sampler_configs = { - { seq_id, backend_sampler_chain.get() }, - }; - - test_context test_ctx(params, backend_sampler_configs); - - if (!test_ctx.decode({{seq_id, "Once"}})) { - GGML_ASSERT(false && "Failed to decode token"); - } - - int32_t batch_idx = test_ctx.idx_for_seq(seq_id); - - uint32_t n_logits = llama_get_sampled_logits_count_ith(test_ctx.ctx.get(), batch_idx); - - if (temp <= 0.0f && delta >= 0.0f) { - GGML_ASSERT(n_logits == 1); - } else { - GGML_ASSERT(n_logits == (uint32_t) test_ctx.n_vocab); - } - }; - - test_argmax_temp(0.0f, 0.3f, 1.0f); // Greedy (temp=0) - test_argmax_temp(-1.0f, 0.3f, 2.0f); // Greedy (temp<0) - test_argmax_temp(0.8f, 0.0f, 2.0f); // Temperature scaling - - printf("backend temp_ext sampling test PASSED\n"); -} - -static void test_backend_min_p_sampling(const test_params & params) { - const int seq_id = 0; - const float p = 0.1; - struct llama_sampler_chain_params backend_chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr backend_sampler_chain(llama_sampler_chain_init(backend_chain_params)); - llama_sampler_chain_add(backend_sampler_chain.get(), llama_sampler_init_min_p(p, 0)); - std::vector backend_sampler_configs = {{ seq_id, backend_sampler_chain.get() }}; - - test_context test_ctx(params, backend_sampler_configs); - - if (!test_ctx.decode({{seq_id, "Hello"}})) { - GGML_ASSERT(false && "Failed to decode token"); - } - - int32_t batch_idx = test_ctx.idx_for_seq(seq_id); - - float * logits = llama_get_sampled_logits_ith(test_ctx.ctx.get(), batch_idx); - uint32_t n_logits = llama_get_sampled_logits_count_ith(test_ctx.ctx.get(), batch_idx); - - // Print the logits that are above the min-p threshold - std::vector filtered_logits; - for (size_t i = 0; i < n_logits; ++i) { - if (logits[i] > -1e9f) { - filtered_logits.push_back(logits[i]); - //printf("min_p logit[%zu] = %.6f\n", i, logits[i]); - } - } - GGML_ASSERT(filtered_logits.size() < (size_t) test_ctx.n_vocab); - - // Sample using CPU sampler for verification to inspect they are reasonable - struct llama_sampler_chain_params chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr chain(llama_sampler_chain_init(chain_params)); - llama_sampler_chain_add(chain.get(), llama_sampler_init_dist(88)); - - llama_token token = llama_sampler_sample(chain.get(), test_ctx.ctx.get(), batch_idx); - const std::string token_str = test_ctx.token_to_piece(token, false); - printf("min-p cpu sampled token id:%d, string: '%s'\n", token, token_str.c_str()); - GGML_ASSERT(token >= 0 && token < test_ctx.n_vocab); - - // Decode and sampler 10 more tokens - for (int i = 0; i < 10; i++) { - int32_t loop_idx = test_ctx.idx_for_seq(seq_id); - llama_token token = llama_sampler_sample(chain.get(), test_ctx.ctx.get(), loop_idx); - printf("min-p gen step %d: token id :%5.d, string: %s\n", i, token, test_ctx.token_to_piece(token, false).c_str()); - if (!test_ctx.decode_token(token, 0)) { - GGML_ASSERT(false && "Failed to decode token"); - } - } - - printf("min-p sampling test PASSED\n"); -} - -static void test_backend_top_p_sampling(const test_params & params) { - const int seq_id = 0; - const float p = 0.9; - struct llama_sampler_chain_params backend_chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr backend_sampler_chain(llama_sampler_chain_init(backend_chain_params)); - llama_sampler_chain_add(backend_sampler_chain.get(), llama_sampler_init_top_p(p, 0)); - std::vector backend_sampler_configs = {{ seq_id, backend_sampler_chain.get() }}; - - test_context test_ctx(params, backend_sampler_configs); - - if (!test_ctx.decode({{seq_id, "Hello"}})) { - return; - } - - int32_t batch_idx = test_ctx.idx_for_seq(seq_id); - - float * logits = llama_get_sampled_logits_ith(test_ctx.ctx.get(), batch_idx); - uint32_t n_logits = llama_get_sampled_logits_count_ith(test_ctx.ctx.get(), batch_idx); - - // Print the logits that are above the min-p threshold - std::vector filtered_logits; - for (size_t i = 0; i < n_logits; ++i) { - if (logits[i] > -1e9f) { - filtered_logits.push_back(logits[i]); - } - } - GGML_ASSERT(filtered_logits.size() < (size_t) test_ctx.n_vocab); - GGML_ASSERT(filtered_logits.size() > 0); - - // Sample using CPU sampler for verification to inspect they are reasonable - struct llama_sampler_chain_params chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr chain(llama_sampler_chain_init(chain_params)); - llama_sampler_chain_add(chain.get(), llama_sampler_init_dist(88)); - - llama_token token = llama_sampler_sample(chain.get(), test_ctx.ctx.get(), batch_idx); - const std::string token_str = test_ctx.token_to_piece(token, false); - printf("top-p cpu sampled token id:%d, string: '%s'\n", token, token_str.c_str()); - GGML_ASSERT(token >= 0 && token < test_ctx.n_vocab); - - // Decode and sampler 10 more tokens - for (int i = 0; i < 10; i++) { - int32_t loop_idx = test_ctx.idx_for_seq(seq_id); - llama_token token = llama_sampler_sample(chain.get(), test_ctx.ctx.get(), loop_idx); - printf("top-p gen step %d: token id :%5.d, string: %s\n", i, token, test_ctx.token_to_piece(token, false).c_str()); - test_ctx.decode_token(token, 0); - } - - printf("top-p sampling test PASSED\n"); -} - -static void test_backend_multi_sequence_sampling(const test_params & params) { - struct llama_sampler_chain_params chain_params_0 = llama_sampler_chain_default_params(); - llama_sampler_ptr sampler_chain_0(llama_sampler_chain_init(chain_params_0)); - llama_sampler_chain_add(sampler_chain_0.get(), llama_sampler_init_greedy()); - - struct llama_sampler_chain_params chain_params_1 = llama_sampler_chain_default_params(); - llama_sampler_ptr sampler_chain_1(llama_sampler_chain_init(chain_params_1)); - llama_sampler_chain_add(sampler_chain_1.get(), llama_sampler_init_temp(0.8f)); - llama_sampler_chain_add(sampler_chain_1.get(), llama_sampler_init_greedy()); - - std::vector backend_sampler_configs = { - { 0, sampler_chain_0.get() }, - { 1, sampler_chain_1.get() } - }; - - test_context test_ctx(params, backend_sampler_configs); - - std::map prompts = { - {0, "Hello"}, - {1, "Some"} - }; - - if (!test_ctx.decode(prompts)) { - GGML_ASSERT(false && "Failed to decode token"); - } - - // Verfiy sequence 0 - { - int32_t batch_idx = test_ctx.idx_for_seq(0); - llama_token token = llama_get_sampled_token_ith(test_ctx.ctx.get(), batch_idx); - const std::string token_str = test_ctx.token_to_piece(token, false); - printf("Seq 0 sampled token id=%d, string='%s'\n", token, token_str.c_str()); - GGML_ASSERT(token >= 0 && token < test_ctx.n_vocab); - } - - // Verify sequence 1 - { - int32_t batch_idx= test_ctx.idx_for_seq(1); - llama_token token = llama_get_sampled_token_ith(test_ctx.ctx.get(), batch_idx); - const std::string token_str = test_ctx.token_to_piece(token, false); - printf("Seq 1 sampled token id=%d, string='%s'\n", token, token_str.c_str()); - GGML_ASSERT(token >= 0 && token < test_ctx.n_vocab); - } - - // Generate tokens for each sequence - printf("\nMulti-sequence generation:\n"); - for (int step = 0; step < 4; step++) { - std::map tokens; - - for (llama_seq_id seq_id : {0, 1}) { - int32_t idx = test_ctx.idx_for_seq(seq_id); - llama_token token = llama_get_sampled_token_ith(test_ctx.ctx.get(), idx); - const std::string token_str = test_ctx.token_to_piece(token, false); - printf(" Seq %d, step %d: token id=%d, string='%s'\n", seq_id, step, token, token_str.c_str()); - tokens[seq_id] = token; - } - - // Decode all tokens in a single batch - if (!test_ctx.decode_tokens(tokens)) { - GGML_ASSERT(false && "Failed to decode token"); - } - } - - printf("backend multi-sequence sampling test PASSED\n"); -} - -static void test_backend_dist_sampling(const test_params & params) { - const int seq_id = 189; - const int32_t seed = 88; - - struct llama_sampler_chain_params backend_chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr backend_sampler_chain(llama_sampler_chain_init(backend_chain_params)); - llama_sampler_chain_add(backend_sampler_chain.get(), llama_sampler_init_dist(seed)); - std::vector backend_sampler_configs = {{ seq_id, backend_sampler_chain.get() }}; - - test_context test_ctx(params, backend_sampler_configs); - - if (!test_ctx.decode({{seq_id, "Some"}})) { - GGML_ASSERT(false && "Failed to decode token"); - } - - int32_t batch_idx = test_ctx.idx_for_seq(seq_id); - llama_token token = llama_get_sampled_token_ith(test_ctx.ctx.get(), batch_idx); - printf("dist sampled id:%d, string:'%s'\n", token, test_ctx.token_to_piece(token, false).c_str()); - GGML_ASSERT(token >= 0 && token < test_ctx.n_vocab); - //GGML_ASSERT(llama_get_sampled_logits_ith(test_ctx.ctx.get(), batch_idx) == nullptr); - - token = llama_get_sampled_token_ith(test_ctx.ctx.get(), -1); - printf("dist sampled id:%d, string:'%s'\n", token, test_ctx.token_to_piece(token, false).c_str()); - GGML_ASSERT(token >= 0 && token < test_ctx.n_vocab); - - printf("backend dist sampling test PASSED\n"); -} - -static void test_backend_dist_sampling_and_cpu(const test_params & params) { - const int seq_id = 0; - const int32_t seed = 88; - - struct llama_sampler_chain_params backend_chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr backend_sampler_chain(llama_sampler_chain_init(backend_chain_params)); - llama_sampler_chain_add(backend_sampler_chain.get(), llama_sampler_init_dist(seed)); - std::vector backend_sampler_configs = {{ seq_id, backend_sampler_chain.get() }}; - - test_context test_ctx(params, backend_sampler_configs); - - if (!test_ctx.decode({{seq_id, "Some"}})) { - GGML_ASSERT(false && "Failed to decode token"); - } - - int32_t batch_idx = test_ctx.idx_for_seq(seq_id); - - // Sample using CPU sampler - struct llama_sampler_chain_params chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr chain(llama_sampler_chain_init(chain_params)); - llama_sampler_chain_add(chain.get(), llama_sampler_init_dist(18)); - - llama_token backend_token = llama_get_sampled_token_ith(test_ctx.ctx.get(), batch_idx); - llama_token cpu_token = llama_sampler_sample(chain.get(), test_ctx.ctx.get(), batch_idx); - printf("dist & cpu sampled id:%d, string:'%s'\n", cpu_token, test_ctx.token_to_piece(cpu_token, false).c_str()); - GGML_ASSERT(backend_token == cpu_token); - - printf("backend dist & cpu sampling test PASSED\n"); -} - -static void test_backend_logit_bias_sampling(const test_params & params) { - const auto * model = params.model.get(); - const auto * vocab = llama_model_get_vocab(model); - - const int seq_id = 0; - - std::vector logit_bias; - - // Get the token for the piece "World". - const std::string piece = "World"; - std::vector tokens(16); - llama_tokenize(vocab, piece.c_str(), piece.size(), tokens.data(), tokens.size(), false, false); - - llama_token bias_token = tokens[0]; - // TODO: biasing too much here makes the Vulkan sampling fail - should be investigated further - // https://github.com/ggml-org/llama.cpp/actions/runs/20894267644/job/60030252675?pr=18753#step:3:23350 - //logit_bias.push_back({ bias_token, +100.0f }); - logit_bias.push_back({ bias_token, +10.0f }); - - printf("biasing token piece '%s' -> token id %d\n", piece.c_str(), bias_token); - - struct llama_sampler_chain_params backend_chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr backend_sampler_chain(llama_sampler_chain_init(backend_chain_params)); - llama_sampler_chain_add(backend_sampler_chain.get(), llama_sampler_init_logit_bias( - llama_vocab_n_tokens(vocab), - logit_bias.size(), - logit_bias.data())); - llama_sampler_chain_add(backend_sampler_chain.get(), llama_sampler_init_dist(88)); - - std::vector backend_sampler_configs = { - { seq_id, backend_sampler_chain.get() }, - }; - - test_context test_ctx(params, backend_sampler_configs); - - if (!test_ctx.decode({{seq_id, "Hello"}})) { - GGML_ASSERT(false && "Failed to decode token"); - } - - llama_token backend_token = llama_get_sampled_token_ith(test_ctx.ctx.get(), test_ctx.idx_for_seq(seq_id)); - printf("sampled token = %d, expected = %d\n", backend_token, bias_token); - GGML_ASSERT(backend_token == bias_token); - - printf("backend logit bias sampling test PASSED\n"); -} - -// This test verifies that it is possible to have two different backend sampler, -// one that uses the backend dist sampler, and another that uses CPU dist sampler. -static void test_backend_mixed_sampling(const test_params & params) { - struct llama_sampler_chain_params chain_params_0 = llama_sampler_chain_default_params(); - llama_sampler_ptr sampler_chain_0(llama_sampler_chain_init(chain_params_0)); - llama_sampler_chain_add(sampler_chain_0.get(), llama_sampler_init_dist(88)); - - int k = 40; - struct llama_sampler_chain_params chain_params_1 = llama_sampler_chain_default_params(); - llama_sampler_ptr sampler_chain_1(llama_sampler_chain_init(chain_params_1)); - llama_sampler_chain_add(sampler_chain_1.get(), llama_sampler_init_top_k(k)); - - std::vector backend_sampler_configs = { - { 0, sampler_chain_0.get() }, - { 1, sampler_chain_1.get() } - }; - - test_context test_ctx(params, backend_sampler_configs); - - std::map prompts = { - {0, "Hello"}, - {1, "Some"} - }; - - if (!test_ctx.decode(prompts)) { - GGML_ASSERT(false && "Failed to decode token"); - } - - // Verfiy sequence 0 that used the dist backend sampler. - { - int32_t batch_idx = test_ctx.idx_for_seq(0); - llama_token token = llama_get_sampled_token_ith(test_ctx.ctx.get(), batch_idx); - const std::string token_str = test_ctx.token_to_piece(token, false); - printf("sampled token id=%d, string='%s'\n", token, token_str.c_str()); - GGML_ASSERT(token >= 0 && token < test_ctx.n_vocab); - //GGML_ASSERT(llama_get_sampled_logits_ith(test_ctx.ctx.get(), batch_idx) == nullptr); - //GGML_ASSERT(llama_get_sampled_logits_count_ith(test_ctx.ctx.get(), batch_idx) == 0); - } - - // Verfiy sequence 1 that used the top-k backend sampler. - { - int32_t batch_idx = test_ctx.idx_for_seq(1); - float * logits = llama_get_sampled_logits_ith(test_ctx.ctx.get(), batch_idx); - GGML_ASSERT(logits != nullptr); - size_t n_logits = llama_get_sampled_logits_count_ith(test_ctx.ctx.get(), batch_idx); - GGML_ASSERT(n_logits == (size_t) k); - GGML_ASSERT(llama_get_sampled_token_ith(test_ctx.ctx.get(), batch_idx) == LLAMA_TOKEN_NULL); - } - - printf("backend mixed sampling test PASSED\n"); -} - -static void test_backend_set_sampler(const test_params & params) { - const int seq_id = 0; - const int32_t seed = 88; - - struct llama_sampler_chain_params backend_chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr backend_sampler_chain(llama_sampler_chain_init(backend_chain_params)); - llama_sampler_chain_add(backend_sampler_chain.get(), llama_sampler_init_dist(seed)); - std::vector backend_sampler_configs = {{ seq_id, backend_sampler_chain.get() }}; - - test_context test_ctx(params, backend_sampler_configs); - - if (!test_ctx.decode({{seq_id, "Hello"}})) { - GGML_ASSERT(false && "Failed to decode token"); - } - - int32_t batch_idx = test_ctx.idx_for_seq(seq_id); - - // Sample using backend sampler configured above - llama_token backend_token = llama_get_sampled_token_ith(test_ctx.ctx.get(), batch_idx); - const std::string backend_token_str = test_ctx.token_to_piece(backend_token, false); - printf("dist sampled token = %d, string='%s'\n", backend_token, backend_token_str.c_str()); - - // Now clear the backend sampler for this sequence. - llama_set_sampler(test_ctx.ctx.get(), seq_id, nullptr); - printf("Cleared backend sampler for seq_id %d\n", seq_id); - - // Sample using CPU sampler - struct llama_sampler_chain_params chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr chain(llama_sampler_chain_init(chain_params)); - llama_sampler_chain_add(chain.get(), llama_sampler_init_dist(18)); - - std::map tokens = { { seq_id, backend_token}, }; - if (!test_ctx.decode_tokens(tokens)) { - GGML_ASSERT(false && "Failed to decode token"); - } - - // Should not have any sampled token or probs after clearing the backend sampler. - const int32_t idx = test_ctx.idx_for_seq(seq_id); - GGML_ASSERT(llama_get_sampled_token_ith(test_ctx.ctx.get(), idx) == LLAMA_TOKEN_NULL); - GGML_ASSERT(llama_get_sampled_probs_ith(test_ctx.ctx.get(), idx) == nullptr); - - // Sample the token using the CPU sampler chain. - llama_token token2 = llama_sampler_sample(chain.get(), test_ctx.ctx.get(), seq_id); - const std::string token2_str = test_ctx.token_to_piece(token2, false); - printf("CPU sampled token after clearing backend sampler: id=%d, string='%s'\n", token2, token2_str.c_str()); - std::map tokens2 = { { seq_id, token2}, }; - - // Set a new backend sampler for the sequence. - struct llama_sampler_chain_params new_backend_chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr new_backend_sampler_chain(llama_sampler_chain_init(new_backend_chain_params)); - llama_sampler_chain_add(new_backend_sampler_chain.get(), llama_sampler_init_top_k(20)); - llama_sampler_chain_add(new_backend_sampler_chain.get(), llama_sampler_init_dist(seed)); - llama_set_sampler(test_ctx.ctx.get(), seq_id, new_backend_sampler_chain.get()); - - if (!test_ctx.decode_tokens(tokens2)) { - GGML_ASSERT(false && "Failed to decode token"); - } - - llama_token new_backend_token = llama_get_sampled_token_ith(test_ctx.ctx.get(), test_ctx.idx_for_seq(seq_id)); - const std::string new_backend_token_str = test_ctx.token_to_piece(new_backend_token, false); - printf("dist sampled token = %d, string='%s'\n", new_backend_token, new_backend_token_str.c_str()); - - printf("backend set sampler test PASSED\n"); -} - -static void test_backend_cpu_mixed_batch(const test_params & params) { - // Sequence 0 uses backend sampling - struct llama_sampler_chain_params chain_params_0 = llama_sampler_chain_default_params(); - llama_sampler_ptr sampler_chain_0(llama_sampler_chain_init(chain_params_0)); - llama_sampler_chain_add(sampler_chain_0.get(), llama_sampler_init_dist(88)); - - std::vector backend_sampler_configs = { - { 0, sampler_chain_0.get() }, - }; - - // We need 2 sequences: seq 0 with backend sampling, seq 1 with CPU sampling - test_context test_ctx(params, backend_sampler_configs, 2); - - std::map prompts = { - {0, "Hello"}, // Will use backend sampling - {1, "Some"} // Will use CPU sampling - }; - - if (!test_ctx.decode(prompts)) { - GGML_ASSERT(false && "Failed to decode token"); - } - - // Verify sequence 0 (backend sampled) - { - int32_t batch_idx = test_ctx.idx_for_seq(0); - llama_token token = llama_get_sampled_token_ith(test_ctx.ctx.get(), batch_idx); - const std::string token_str = test_ctx.token_to_piece(token, false); - printf("Seq 0 (backend) sampled token id=%d, string='%s'\n", token, token_str.c_str()); - GGML_ASSERT(token >= 0 && token < test_ctx.n_vocab); - } - - // Verify sequence 1 (CPU sampled) - { - int32_t batch_idx = test_ctx.idx_for_seq(1); - - llama_token backend_token = llama_get_sampled_token_ith(test_ctx.ctx.get(), batch_idx); - GGML_ASSERT(backend_token == LLAMA_TOKEN_NULL); - - struct llama_sampler_chain_params chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr chain(llama_sampler_chain_init(chain_params)); - llama_sampler_chain_add(chain.get(), llama_sampler_init_greedy()); - - llama_token token = llama_sampler_sample(chain.get(), test_ctx.ctx.get(), batch_idx); - const std::string token_str = test_ctx.token_to_piece(token, false); - printf("Seq 1 (CPU) sampled token id=%d, string='%s'\n", token, token_str.c_str()); - GGML_ASSERT(token >= 0 && token < test_ctx.n_vocab); - } - - // Clear/remove the backend sampler, and sample again - { - // clear the backend sampler for seq 0 so that there are no backend - // samplers. - llama_set_sampler(test_ctx.ctx.get(), 0, nullptr); - - // Create a CPU sampler and verify we can sampler from it. - struct llama_sampler_chain_params chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr chain(llama_sampler_chain_init(chain_params)); - llama_sampler_chain_add(chain.get(), llama_sampler_init_greedy()); - - int32_t batch_idx = test_ctx.idx_for_seq(1); - llama_token token = llama_sampler_sample(chain.get(), test_ctx.ctx.get(), batch_idx); - if (!test_ctx.decode_token(token, 1)) { - GGML_ASSERT(false && "Failed to decode token"); - } - } - - // Set a backend sampler so that we can verify that it can be reset - { - struct llama_sampler_chain_params chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr sampler_chain(llama_sampler_chain_init(chain_params)); - llama_sampler_chain_add(sampler_chain.get(), llama_sampler_init_dist(88)); - - llama_set_sampler(test_ctx.ctx.get(), 0, sampler_chain.get()); - - if (!test_ctx.decode_token(3834, 0)) { - GGML_ASSERT(false && "Failed to decode token"); - } - - int32_t batch_idx = test_ctx.idx_for_seq(0); - llama_token token = llama_get_sampled_token_ith(test_ctx.ctx.get(), batch_idx); - const std::string token_str = test_ctx.token_to_piece(token, false); - printf("re-added backend sampled token id=%d, string='%s'\n", token, token_str.c_str()); - GGML_ASSERT(token >= 0 && token < test_ctx.n_vocab); - } - - printf("backend-cpu mixed batch test PASSED\n"); -} - -static void test_backend_max_outputs(const test_params & params) { - const int seq_id = 0; - const int32_t seed = 88; - - llama_sampler_chain_params backend_chain_params = llama_sampler_chain_default_params(); - llama_sampler_ptr backend_sampler_chain(llama_sampler_chain_init(backend_chain_params)); - llama_sampler_chain_add(backend_sampler_chain.get(), llama_sampler_init_dist(seed)); - std::vector backend_sampler_configs = {{ seq_id, backend_sampler_chain.get() }}; - - test_context test_ctx(params, backend_sampler_configs); - - llama_batch batch = llama_batch_init(512, 0, 1); - std::string prompt = "Hello"; - - std::vector tokens; - tokens.push_back(llama_vocab_bos(test_ctx.vocab)); - - std::vector prompt_tokens(32); - int n_tokens = llama_tokenize(test_ctx.vocab, prompt.c_str(), prompt.length(), - prompt_tokens.data(), prompt_tokens.size(), - false, false); - for (int i = 0; i < n_tokens; i++) { - tokens.push_back(prompt_tokens[i]); - } - - for (size_t i = 0; i < tokens.size(); i++) { - // set all tokens as output to trigger error - common_batch_add(batch, tokens[i], i, { seq_id }, true); - } - - printf(">>> test_max_outputs expected error start:\n"); - const int ret = llama_decode(test_ctx.ctx.get(), batch); - GGML_ASSERT(ret != 0 && "llama_decode should not succeed multiple outputs per sequence"); - printf("<<< test_max_outputs expected error end.\n"); - llama_batch_free(batch); - - printf("backend max outputs test PASSED\n"); -} - -struct backend_test_case { - std::string name; - void (*fn)(const test_params &); - bool enabled_by_default; -}; - -static const backend_test_case BACKEND_TESTS[] = { - { "greedy", test_backend_greedy_sampling, true }, - { "logit_bias", test_backend_logit_bias_sampling, true }, - { "temp", test_backend_temp_sampling, true }, - { "temp_ext", test_backend_temp_ext_sampling, true }, - { "top_k", test_backend_top_k_sampling, true }, - { "multi_sequence", test_backend_multi_sequence_sampling, true }, - { "dist", test_backend_dist_sampling, true }, - { "dist_and_cpu", test_backend_dist_sampling_and_cpu, true }, - { "set_sampler", test_backend_set_sampler, true }, - { "max_outputs", test_backend_max_outputs, true }, - { "mixed", test_backend_mixed_sampling, true }, - { "min_p", test_backend_min_p_sampling, true }, - { "cpu_mixed", test_backend_cpu_mixed_batch, true }, - { "top_p", test_backend_top_p_sampling, true }, -}; - -static test_args parse_cli(int argc, char ** argv) { - test_args out; - - for (int i = 1; i < argc; ++i) { - const char * arg = argv[i]; - - if (std::strcmp(arg, "--test") == 0) { - if (i + 1 >= argc) { - fprintf(stderr, "--test expects a value\n"); - exit(EXIT_FAILURE); - } - out.test = argv[++i]; - continue; - } - if (std::strncmp(arg, "--test=", 7) == 0) { - out.test = arg + 7; - continue; - } - if (std::strcmp(arg, "--model") == 0) { - if (i + 1 >= argc) { - fprintf(stderr, "--model expects a value\n"); - exit(EXIT_FAILURE); - } - out.model = argv[++i]; - continue; - } - if (std::strncmp(arg, "--model=", 8) == 0) { - out.model = arg + 8; - continue; - } - if (std::strcmp(arg, "--device") == 0) { - if (i + 1 >= argc) { - fprintf(stderr, "--device expects a value (cpu or gpu)\n"); - exit(EXIT_FAILURE); - } - out.device = argv[++i]; - continue; - } - if (std::strncmp(arg, "--device=", 9) == 0) { - out.device = arg + 9; - continue; - } - if (out.model.empty()) { - out.model = arg; - continue; - } - - fprintf(stderr, "Unexpected argument: %s\n", arg); - exit(EXIT_FAILURE); - } - - if (out.device != "cpu" && out.device != "gpu" && out.device != "auto") { - fprintf(stderr, "Invalid device '%s'. Must be 'cpu', 'gpu' or 'auto'\n", out.device.c_str()); - exit(EXIT_FAILURE); - } - - return out; -} - -static std::vector collect_tests_to_run(const std::string & requested) { - std::vector selected; - - if (!requested.empty()) { - for (const auto & test : BACKEND_TESTS) { - if (test.name == requested) { - selected.push_back(&test); - break; - } - } - if (selected.empty()) { - fprintf(stderr, "Unknown test '%s'. Available tests:\n", requested.c_str()); - for (const auto & test : BACKEND_TESTS) { - fprintf(stderr, " %s\n", test.name.c_str()); - } - exit(EXIT_FAILURE); - } - } else { - for (const auto & test : BACKEND_TESTS) { - if (test.enabled_by_default) { - selected.push_back(&test); - } - } - } - - if (selected.empty()) { - fprintf(stderr, "No backend sampling tests selected. Use --test= to pick one.\n"); - } - - return selected; -} - -static void run_tests(const std::vector & tests, const test_params & args) { - for (const auto & test : tests) { - fprintf(stderr, "\n=== %s ===\n", test->name.c_str()); - try { - test->fn(args); - } catch (const std::exception & e) { - fprintf(stderr, "Error running test '%s': %s\n", test->name.c_str(), e.what()); - exit(EXIT_FAILURE); - } - } -} - -int main(int argc, char ** argv) { - test_args args = parse_cli(argc, argv); - - if (args.model.empty()) { - args.model = get_model_or_exit(1, argv); - } - - { - std::ifstream file(args.model); - if (!file.is_open()) { - fprintf(stderr, "no model '%s' found\n", args.model.c_str()); - return EXIT_FAILURE; - } - } - - fprintf(stderr, "using '%s'\n", args.model.c_str()); - - llama_backend_init(); - - test_params params = { - /*.model =*/ load_model(args), - }; - - const std::vector tests = collect_tests_to_run(args.test); - if (!tests.empty()) { - run_tests(tests, params); - } - - return 0; -} diff --git a/tests/test-chat.cpp b/tests/test-chat.cpp index a07c81f..02af525 100644 --- a/tests/test-chat.cpp +++ b/tests/test-chat.cpp @@ -650,7 +650,7 @@ static void test_msgs_oaicompat_json_conversion() { "[\n" " {\n" " \"role\": \"assistant\",\n" - " \"content\": \"\",\n" + " \"content\": null,\n" " \"tool_calls\": [\n" " {\n" " \"type\": \"function\",\n" @@ -724,30 +724,6 @@ static void test_tools_oaicompat_json_conversion() { "]" ), common_chat_tools_to_json_oaicompat({special_function_tool}).dump(2)); - - { - auto tools_no_params = common_chat_tools_parse_oaicompat(json::parse( - R"([{"type": "function", "function": {"name": "test_func", "description": "A test"}}])")); - assert_equals((size_t) 1, tools_no_params.size()); - assert_equals(std::string("test_func"), tools_no_params[0].name); - assert_equals(std::string("A test"), tools_no_params[0].description); - assert_equals(std::string("{}"), tools_no_params[0].parameters); - } - { - auto tools_no_desc = common_chat_tools_parse_oaicompat(json::parse( - R"([{"type": "function", "function": {"name": "test_func", "parameters": {"type": "object"}}}])")); - assert_equals((size_t) 1, tools_no_desc.size()); - assert_equals(std::string("test_func"), tools_no_desc[0].name); - assert_equals(std::string(""), tools_no_desc[0].description); - } - { - auto tools_minimal = common_chat_tools_parse_oaicompat(json::parse( - R"([{"type": "function", "function": {"name": "test_func"}}])")); - assert_equals((size_t) 1, tools_minimal.size()); - assert_equals(std::string("test_func"), tools_minimal[0].name); - assert_equals(std::string(""), tools_minimal[0].description); - assert_equals(std::string("{}"), tools_minimal[0].parameters); - } } static void test_template_output_parsers() { @@ -930,8 +906,7 @@ static void test_template_output_parsers() { " },\n" " \"id\": \"123456789\"\n" " }\n" - " ],\n" - " \"content\": \"\"\n" + " ]\n" "}"); } { @@ -1738,8 +1713,7 @@ static void test_template_output_parsers() { " },\n" " \"id\": \"123456789\"\n" " }\n" - " ],\n" - " \"content\": \"\"\n" + " ]\n" "}", /* expect_grammar_triggered= */ false ); diff --git a/tests/test-regex-partial.cpp b/tests/test-regex-partial.cpp index 70af6d7..ffad189 100644 --- a/tests/test-regex-partial.cpp +++ b/tests/test-regex-partial.cpp @@ -232,52 +232,52 @@ static void test_regex_to_reversed_partial_regex() { printf("[%s]\n", __func__); assert_equals( - "^((?:(?:c)?b)?a)", + "((?:(?:c)?b)?a)[\\s\\S]*", regex_to_reversed_partial_regex("abc")); assert_equals( - "^(a+)", + "(a+)[\\s\\S]*", regex_to_reversed_partial_regex("a+")); assert_equals( - "^(a*)", + "(a*)[\\s\\S]*", regex_to_reversed_partial_regex("a*")); assert_equals( - "^(a?)", + "(a?)[\\s\\S]*", regex_to_reversed_partial_regex("a?")); assert_equals( - "^([a-z])", + "([a-z])[\\s\\S]*", regex_to_reversed_partial_regex("[a-z]")); assert_equals( - "^((?:\\w+)?[a-z])", + "((?:\\w+)?[a-z])[\\s\\S]*", regex_to_reversed_partial_regex("[a-z]\\w+")); assert_equals( - "^((?:a|b))", + "((?:a|b))[\\s\\S]*", regex_to_reversed_partial_regex("(?:a|b)")); assert_equals( - "^((?:(?:(?:d)?c)?b)?a)", + "((?:(?:(?:d)?c)?b)?a)[\\s\\S]*", regex_to_reversed_partial_regex("abcd")); assert_equals( - "^((?:b)?a*)", // TODO: ((?:b)?a*+).* ?? + "((?:b)?a*)[\\s\\S]*", // TODO: ((?:b)?a*+).* ?? regex_to_reversed_partial_regex("a*b")); assert_equals( - "^((?:(?:b)?a)?.*)", + "((?:(?:b)?a)?.*)[\\s\\S]*", regex_to_reversed_partial_regex(".*?ab")); assert_equals( - "^((?:(?:b)?.*)?a)", + "((?:(?:b)?.*)?a)[\\s\\S]*", regex_to_reversed_partial_regex("a.*?b")); assert_equals( - "^((?:(?:d)?(?:(?:c)?b))?a)", + "((?:(?:d)?(?:(?:c)?b))?a)[\\s\\S]*", regex_to_reversed_partial_regex("a(bc)d")); assert_equals( - "^((?:(?:(?:c)?b|(?:e)?d))?a)", + "((?:(?:(?:c)?b|(?:e)?d))?a)[\\s\\S]*", regex_to_reversed_partial_regex("a(bc|de)")); assert_equals( - "^((?:(?:(?:(?:(?:c)?b?)?b?)?b)?b)?a)", + "((?:(?:(?:(?:(?:c)?b?)?b?)?b)?b)?a)[\\s\\S]*", regex_to_reversed_partial_regex("ab{2,4}c")); } diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 518f8b9..8df3f41 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -18,13 +18,14 @@ else() add_subdirectory(gguf-split) add_subdirectory(imatrix) add_subdirectory(llama-bench) + add_subdirectory(cli) add_subdirectory(completion) add_subdirectory(perplexity) add_subdirectory(quantize) if (LLAMA_BUILD_SERVER) - add_subdirectory(cli) add_subdirectory(server) endif() + add_subdirectory(run) add_subdirectory(tokenize) add_subdirectory(tts) add_subdirectory(mtmd) diff --git a/tools/cli/README.md b/tools/cli/README.md index 3b6f070..7b8b869 100644 --- a/tools/cli/README.md +++ b/tools/cli/README.md @@ -12,7 +12,6 @@ | -------- | ----------- | | `-h, --help, --usage` | print usage and exit | | `--version` | show version and build info | -| `--license` | show source code license and dependencies | | `-cl, --cache-list` | show list of models in cache | | `--completion-bash` | print source-able bash completion script for llama.cpp | | `--verbose-prompt` | print a verbose prompt before generation (default: false) | @@ -57,23 +56,22 @@ | `-dt, --defrag-thold N` | KV cache defragmentation threshold (DEPRECATED)
(env: LLAMA_ARG_DEFRAG_THOLD) | | `-np, --parallel N` | number of parallel sequences to decode (default: 1)
(env: LLAMA_ARG_N_PARALLEL) | | `--mlock` | force system to keep model in RAM rather than swapping or compressing
(env: LLAMA_ARG_MLOCK) | -| `--mmap, --no-mmap` | whether to memory-map model. Explicitly enabling mmap disables direct-io. (if mmap disabled, slower load but may reduce pageouts if not using mlock) (default: enabled)
(env: LLAMA_ARG_MMAP) | -| `-dio, --direct-io, -ndio, --no-direct-io` | use DirectIO if available. Takes precedence over --mmap (default: enabled)
(env: LLAMA_ARG_DIO) | +| `--mmap, --no-mmap` | whether to memory-map model (if disabled, slower load but may reduce pageouts if not using mlock) (default: enabled)
(env: LLAMA_ARG_MMAP) | | `--numa TYPE` | attempt optimizations that help on some NUMA systems
- distribute: spread execution evenly over all nodes
- isolate: only spawn threads on CPUs on the node that execution started on
- numactl: use the CPU map provided by numactl
if run without this previously, it is recommended to drop the system page cache before using this
see https://github.com/ggml-org/llama.cpp/issues/1437
(env: LLAMA_ARG_NUMA) | | `-dev, --device ` | comma-separated list of devices to use for offloading (none = don't offload)
use --list-devices to see a list of available devices
(env: LLAMA_ARG_DEVICE) | | `--list-devices` | print list of available devices and exit | -| `-ot, --override-tensor =,...` | override tensor buffer type
(env: LLAMA_ARG_OVERRIDE_TENSOR) | +| `-ot, --override-tensor =,...` | override tensor buffer type | | `-cmoe, --cpu-moe` | keep all Mixture of Experts (MoE) weights in the CPU
(env: LLAMA_ARG_CPU_MOE) | | `-ncmoe, --n-cpu-moe N` | keep the Mixture of Experts (MoE) weights of the first N layers in the CPU
(env: LLAMA_ARG_N_CPU_MOE) | -| `-ngl, --gpu-layers, --n-gpu-layers N` | max. number of layers to store in VRAM, either an exact number, 'auto', or 'all' (default: auto)
(env: LLAMA_ARG_N_GPU_LAYERS) | +| `-ngl, --gpu-layers, --n-gpu-layers N` | max. number of layers to store in VRAM (default: -1)
(env: LLAMA_ARG_N_GPU_LAYERS) | | `-sm, --split-mode {none,layer,row}` | how to split the model across multiple GPUs, one of:
- none: use one GPU only
- layer (default): split layers and KV across GPUs
- row: split rows across GPUs
(env: LLAMA_ARG_SPLIT_MODE) | | `-ts, --tensor-split N0,N1,N2,...` | fraction of the model to offload to each GPU, comma-separated list of proportions, e.g. 3,1
(env: LLAMA_ARG_TENSOR_SPLIT) | | `-mg, --main-gpu INDEX` | the GPU to use for the model (with split-mode = none), or for intermediate results and KV (with split-mode = row) (default: 0)
(env: LLAMA_ARG_MAIN_GPU) | | `-fit, --fit [on\|off]` | whether to adjust unset arguments to fit in device memory ('on' or 'off', default: 'on')
(env: LLAMA_ARG_FIT) | -| `-fitt, --fit-target MiB0,MiB1,MiB2,...` | target margin per device for --fit, comma-separated list of values, single value is broadcast across all devices, default: 1024
(env: LLAMA_ARG_FIT_TARGET) | +| `-fitt, --fit-target MiB` | target margin per device for --fit option, default: 1024
(env: LLAMA_ARG_FIT_TARGET) | | `-fitc, --fit-ctx N` | minimum ctx size that can be set by --fit option, default: 4096
(env: LLAMA_ARG_FIT_CTX) | | `--check-tensors` | check model tensor data for invalid values (default: false) | -| `--override-kv KEY=TYPE:VALUE,...` | advanced option to override model metadata by key. to specify multiple overrides, either use comma-separated values.
types: int, float, bool, str. example: --override-kv tokenizer.ggml.add_bos_token=bool:false,tokenizer.ggml.add_eos_token=bool:false | +| `--override-kv KEY=TYPE:VALUE,...` | advanced option to override model metadata by key. to specify multiple overrides, either use comma-separated or repeat this argument.
types: int, float, bool, str. example: --override-kv tokenizer.ggml.add_bos_token=bool:false,tokenizer.ggml.add_eos_token=bool:false | | `--op-offload, --no-op-offload` | whether to offload host tensor operations to device (default: true) | | `--lora FNAME` | path to LoRA adapter (use comma-separated values to load multiple adapters) | | `--lora-scaled FNAME:SCALE,...` | path to LoRA adapter with user defined scaling (format: FNAME:SCALE,...)
note: use comma-separated values | @@ -113,8 +111,6 @@ | `--top-k N` | top-k sampling (default: 40, 0 = disabled)
(env: LLAMA_ARG_TOP_K) | | `--top-p N` | top-p sampling (default: 0.9, 1.0 = disabled) | | `--min-p N` | min-p sampling (default: 0.1, 0.0 = disabled) | -| `--adaptive-target N` | adaptive-p: select tokens near this probability (valid range 0.0 to 1.0; negative = disabled) | -| `--adaptive-decay N` | adaptive-p: EMA decay for adaptation; effective history length ≈ 1/(1-decay) tokens (valid range 0.0 - 0.99) | | `--top-nsigma N` | top-n-sigma sampling (default: -1.0, -1.0 = disabled) | | `--xtc-probability N` | xtc probability (default: 0.0, 0.0 = disabled) | | `--xtc-threshold N` | xtc threshold (default: 0.1, 1.0 = disabled) | @@ -138,7 +134,6 @@ | `--grammar-file FNAME` | file to read grammar from | | `-j, --json-schema SCHEMA` | JSON schema to constrain generations (https://json-schema.org/), e.g. `{}` for any JSON object
For schemas w/ external $refs, use --grammar + example/json_schema_to_grammar.py instead | | `-jf, --json-schema-file FILE` | File containing a JSON schema to constrain generations (https://json-schema.org/), e.g. `{}` for any JSON object
For schemas w/ external $refs, use --grammar + example/json_schema_to_grammar.py instead | -| `-bs, --backend-sampling` | enable backend sampling (experimental) (default: disabled)
(env: LLAMA_ARG_BACKEND_SAMPLING) | ### CLI-specific params @@ -169,19 +164,19 @@ | `-otd, --override-tensor-draft =,...` | override tensor buffer type for draft model | | `-cmoed, --cpu-moe-draft` | keep all Mixture of Experts (MoE) weights in the CPU for the draft model
(env: LLAMA_ARG_CPU_MOE_DRAFT) | | `-ncmoed, --n-cpu-moe-draft N` | keep the Mixture of Experts (MoE) weights of the first N layers in the CPU for the draft model
(env: LLAMA_ARG_N_CPU_MOE_DRAFT) | -| `--chat-template-kwargs STRING` | sets additional params for the json template parser, must be a valid json object string, e.g. '{"key1":"value1","key2":"value2"}'
(env: LLAMA_CHAT_TEMPLATE_KWARGS) | +| `--chat-template-kwargs STRING` | sets additional params for the json template parser
(env: LLAMA_CHAT_TEMPLATE_KWARGS) | | `--jinja, --no-jinja` | whether to use jinja template engine for chat (default: enabled)
(env: LLAMA_ARG_JINJA) | | `--reasoning-format FORMAT` | controls whether thought tags are allowed and/or extracted from the response, and in which format they're returned; one of:
- none: leaves thoughts unparsed in `message.content`
- deepseek: puts thoughts in `message.reasoning_content`
- deepseek-legacy: keeps `` tags in `message.content` while also populating `message.reasoning_content`
(default: auto)
(env: LLAMA_ARG_THINK) | | `--reasoning-budget N` | controls the amount of thinking allowed; currently only one of: -1 for unrestricted thinking budget, or 0 to disable thinking (default: -1)
(env: LLAMA_ARG_THINK_BUDGET) | -| `--chat-template JINJA_TEMPLATE` | set custom jinja chat template (default: template taken from model's metadata)
if suffix/prefix are specified, template will be disabled
only commonly used templates are accepted (unless --jinja is set before this flag):
list of built-in templates:
bailing, bailing-think, bailing2, chatglm3, chatglm4, chatml, command-r, deepseek, deepseek2, deepseek3, exaone3, exaone4, falcon3, gemma, gigachat, glmedge, gpt-oss, granite, grok-2, hunyuan-dense, hunyuan-moe, kimi-k2, llama2, llama2-sys, llama2-sys-bos, llama2-sys-strip, llama3, llama4, megrez, minicpm, mistral-v1, mistral-v3, mistral-v3-tekken, mistral-v7, mistral-v7-tekken, monarch, openchat, orion, pangu-embedded, phi3, phi4, rwkv-world, seed_oss, smolvlm, solar-open, vicuna, vicuna-orca, yandex, zephyr
(env: LLAMA_ARG_CHAT_TEMPLATE) | -| `--chat-template-file JINJA_TEMPLATE_FILE` | set custom jinja chat template file (default: template taken from model's metadata)
if suffix/prefix are specified, template will be disabled
only commonly used templates are accepted (unless --jinja is set before this flag):
list of built-in templates:
bailing, bailing-think, bailing2, chatglm3, chatglm4, chatml, command-r, deepseek, deepseek2, deepseek3, exaone3, exaone4, falcon3, gemma, gigachat, glmedge, gpt-oss, granite, grok-2, hunyuan-dense, hunyuan-moe, kimi-k2, llama2, llama2-sys, llama2-sys-bos, llama2-sys-strip, llama3, llama4, megrez, minicpm, mistral-v1, mistral-v3, mistral-v3-tekken, mistral-v7, mistral-v7-tekken, monarch, openchat, orion, pangu-embedded, phi3, phi4, rwkv-world, seed_oss, smolvlm, solar-open, vicuna, vicuna-orca, yandex, zephyr
(env: LLAMA_ARG_CHAT_TEMPLATE_FILE) | +| `--chat-template JINJA_TEMPLATE` | set custom jinja chat template (default: template taken from model's metadata)
if suffix/prefix are specified, template will be disabled
only commonly used templates are accepted (unless --jinja is set before this flag):
list of built-in templates:
bailing, bailing-think, bailing2, chatglm3, chatglm4, chatml, command-r, deepseek, deepseek2, deepseek3, exaone3, exaone4, falcon3, gemma, gigachat, glmedge, gpt-oss, granite, grok-2, hunyuan-dense, hunyuan-moe, kimi-k2, llama2, llama2-sys, llama2-sys-bos, llama2-sys-strip, llama3, llama4, megrez, minicpm, mistral-v1, mistral-v3, mistral-v3-tekken, mistral-v7, mistral-v7-tekken, monarch, openchat, orion, pangu-embedded, phi3, phi4, rwkv-world, seed_oss, smolvlm, vicuna, vicuna-orca, yandex, zephyr
(env: LLAMA_ARG_CHAT_TEMPLATE) | +| `--chat-template-file JINJA_TEMPLATE_FILE` | set custom jinja chat template file (default: template taken from model's metadata)
if suffix/prefix are specified, template will be disabled
only commonly used templates are accepted (unless --jinja is set before this flag):
list of built-in templates:
bailing, bailing-think, bailing2, chatglm3, chatglm4, chatml, command-r, deepseek, deepseek2, deepseek3, exaone3, exaone4, falcon3, gemma, gigachat, glmedge, gpt-oss, granite, grok-2, hunyuan-dense, hunyuan-moe, kimi-k2, llama2, llama2-sys, llama2-sys-bos, llama2-sys-strip, llama3, llama4, megrez, minicpm, mistral-v1, mistral-v3, mistral-v3-tekken, mistral-v7, mistral-v7-tekken, monarch, openchat, orion, pangu-embedded, phi3, phi4, rwkv-world, seed_oss, smolvlm, vicuna, vicuna-orca, yandex, zephyr
(env: LLAMA_ARG_CHAT_TEMPLATE_FILE) | | `--simple-io` | use basic IO for better compatibility in subprocesses and limited consoles | | `--draft, --draft-n, --draft-max N` | number of tokens to draft for speculative decoding (default: 16)
(env: LLAMA_ARG_DRAFT_MAX) | | `--draft-min, --draft-n-min N` | minimum number of draft tokens to use for speculative decoding (default: 0)
(env: LLAMA_ARG_DRAFT_MIN) | | `--draft-p-min P` | minimum speculative decoding probability (greedy) (default: 0.8)
(env: LLAMA_ARG_DRAFT_P_MIN) | | `-cd, --ctx-size-draft N` | size of the prompt context for the draft model (default: 0, 0 = loaded from model)
(env: LLAMA_ARG_CTX_SIZE_DRAFT) | | `-devd, --device-draft ` | comma-separated list of devices to use for offloading the draft model (none = don't offload)
use --list-devices to see a list of available devices | -| `-ngld, --gpu-layers-draft, --n-gpu-layers-draft N` | max. number of draft model layers to store in VRAM, either an exact number, 'auto', or 'all' (default: auto)
(env: LLAMA_ARG_N_GPU_LAYERS_DRAFT) | +| `-ngld, --gpu-layers-draft, --n-gpu-layers-draft N` | number of layers to store in VRAM for the draft model
(env: LLAMA_ARG_N_GPU_LAYERS_DRAFT) | | `-md, --model-draft FNAME` | draft model for speculative decoding (default: unused)
(env: LLAMA_ARG_MODEL_DRAFT) | | `--spec-replace TARGET DRAFT` | translate the string in TARGET into DRAFT if the draft model and main model are not compatible | | `--gpt-oss-20b-default` | use gpt-oss-20b (note: can download weights from the internet) | diff --git a/tools/completion/README.md b/tools/completion/README.md index a16be3f..3914885 100644 --- a/tools/completion/README.md +++ b/tools/completion/README.md @@ -95,7 +95,6 @@ llama-completion.exe -m models\gemma-1.1-7b-it.Q4_K_M.gguf --ignore-eos -n -1 | -------- | ----------- | | `-h, --help, --usage` | print usage and exit | | `--version` | show version and build info | -| `--license` | show source code license and dependencies | | `-cl, --cache-list` | show list of models in cache | | `--completion-bash` | print source-able bash completion script for llama.cpp | | `--verbose-prompt` | print a verbose prompt before generation (default: false) | @@ -140,23 +139,22 @@ llama-completion.exe -m models\gemma-1.1-7b-it.Q4_K_M.gguf --ignore-eos -n -1 | `-dt, --defrag-thold N` | KV cache defragmentation threshold (DEPRECATED)
(env: LLAMA_ARG_DEFRAG_THOLD) | | `-np, --parallel N` | number of parallel sequences to decode (default: 1)
(env: LLAMA_ARG_N_PARALLEL) | | `--mlock` | force system to keep model in RAM rather than swapping or compressing
(env: LLAMA_ARG_MLOCK) | -| `--mmap, --no-mmap` | whether to memory-map model. Explicitly enabling mmap disables direct-io. (if mmap disabled, slower load but may reduce pageouts if not using mlock) (default: enabled)
(env: LLAMA_ARG_MMAP) | -| `-dio, --direct-io, -ndio, --no-direct-io` | use DirectIO if available. Takes precedence over --mmap (default: enabled)
(env: LLAMA_ARG_DIO) | +| `--mmap, --no-mmap` | whether to memory-map model (if disabled, slower load but may reduce pageouts if not using mlock) (default: enabled)
(env: LLAMA_ARG_MMAP) | | `--numa TYPE` | attempt optimizations that help on some NUMA systems
- distribute: spread execution evenly over all nodes
- isolate: only spawn threads on CPUs on the node that execution started on
- numactl: use the CPU map provided by numactl
if run without this previously, it is recommended to drop the system page cache before using this
see https://github.com/ggml-org/llama.cpp/issues/1437
(env: LLAMA_ARG_NUMA) | | `-dev, --device ` | comma-separated list of devices to use for offloading (none = don't offload)
use --list-devices to see a list of available devices
(env: LLAMA_ARG_DEVICE) | | `--list-devices` | print list of available devices and exit | -| `-ot, --override-tensor =,...` | override tensor buffer type
(env: LLAMA_ARG_OVERRIDE_TENSOR) | +| `-ot, --override-tensor =,...` | override tensor buffer type | | `-cmoe, --cpu-moe` | keep all Mixture of Experts (MoE) weights in the CPU
(env: LLAMA_ARG_CPU_MOE) | | `-ncmoe, --n-cpu-moe N` | keep the Mixture of Experts (MoE) weights of the first N layers in the CPU
(env: LLAMA_ARG_N_CPU_MOE) | -| `-ngl, --gpu-layers, --n-gpu-layers N` | max. number of layers to store in VRAM, either an exact number, 'auto', or 'all' (default: auto)
(env: LLAMA_ARG_N_GPU_LAYERS) | +| `-ngl, --gpu-layers, --n-gpu-layers N` | max. number of layers to store in VRAM (default: -1)
(env: LLAMA_ARG_N_GPU_LAYERS) | | `-sm, --split-mode {none,layer,row}` | how to split the model across multiple GPUs, one of:
- none: use one GPU only
- layer (default): split layers and KV across GPUs
- row: split rows across GPUs
(env: LLAMA_ARG_SPLIT_MODE) | | `-ts, --tensor-split N0,N1,N2,...` | fraction of the model to offload to each GPU, comma-separated list of proportions, e.g. 3,1
(env: LLAMA_ARG_TENSOR_SPLIT) | | `-mg, --main-gpu INDEX` | the GPU to use for the model (with split-mode = none), or for intermediate results and KV (with split-mode = row) (default: 0)
(env: LLAMA_ARG_MAIN_GPU) | | `-fit, --fit [on\|off]` | whether to adjust unset arguments to fit in device memory ('on' or 'off', default: 'on')
(env: LLAMA_ARG_FIT) | -| `-fitt, --fit-target MiB0,MiB1,MiB2,...` | target margin per device for --fit, comma-separated list of values, single value is broadcast across all devices, default: 1024
(env: LLAMA_ARG_FIT_TARGET) | +| `-fitt, --fit-target MiB` | target margin per device for --fit option, default: 1024
(env: LLAMA_ARG_FIT_TARGET) | | `-fitc, --fit-ctx N` | minimum ctx size that can be set by --fit option, default: 4096
(env: LLAMA_ARG_FIT_CTX) | | `--check-tensors` | check model tensor data for invalid values (default: false) | -| `--override-kv KEY=TYPE:VALUE,...` | advanced option to override model metadata by key. to specify multiple overrides, either use comma-separated values.
types: int, float, bool, str. example: --override-kv tokenizer.ggml.add_bos_token=bool:false,tokenizer.ggml.add_eos_token=bool:false | +| `--override-kv KEY=TYPE:VALUE,...` | advanced option to override model metadata by key. to specify multiple overrides, either use comma-separated or repeat this argument.
types: int, float, bool, str. example: --override-kv tokenizer.ggml.add_bos_token=bool:false,tokenizer.ggml.add_eos_token=bool:false | | `--op-offload, --no-op-offload` | whether to offload host tensor operations to device (default: true) | | `--lora FNAME` | path to LoRA adapter (use comma-separated values to load multiple adapters) | | `--lora-scaled FNAME:SCALE,...` | path to LoRA adapter with user defined scaling (format: FNAME:SCALE,...)
note: use comma-separated values | @@ -219,7 +217,6 @@ llama-completion.exe -m models\gemma-1.1-7b-it.Q4_K_M.gguf --ignore-eos -n -1 | `--grammar-file FNAME` | file to read grammar from | | `-j, --json-schema SCHEMA` | JSON schema to constrain generations (https://json-schema.org/), e.g. `{}` for any JSON object
For schemas w/ external $refs, use --grammar + example/json_schema_to_grammar.py instead | | `-jf, --json-schema-file FILE` | File containing a JSON schema to constrain generations (https://json-schema.org/), e.g. `{}` for any JSON object
For schemas w/ external $refs, use --grammar + example/json_schema_to_grammar.py instead | -| `-bs, --backend-sampling` | enable backend sampling (experimental) (default: disabled)
(env: LLAMA_ARG_BACKEND_SAMPLING) | ### Completion-specific params @@ -251,8 +248,8 @@ llama-completion.exe -m models\gemma-1.1-7b-it.Q4_K_M.gguf --ignore-eos -n -1 | `--jinja, --no-jinja` | whether to use jinja template engine for chat (default: disabled)
(env: LLAMA_ARG_JINJA) | | `--reasoning-format FORMAT` | controls whether thought tags are allowed and/or extracted from the response, and in which format they're returned; one of:
- none: leaves thoughts unparsed in `message.content`
- deepseek: puts thoughts in `message.reasoning_content`
- deepseek-legacy: keeps `` tags in `message.content` while also populating `message.reasoning_content`
(default: auto)
(env: LLAMA_ARG_THINK) | | `--reasoning-budget N` | controls the amount of thinking allowed; currently only one of: -1 for unrestricted thinking budget, or 0 to disable thinking (default: -1)
(env: LLAMA_ARG_THINK_BUDGET) | -| `--chat-template JINJA_TEMPLATE` | set custom jinja chat template (default: template taken from model's metadata)
if suffix/prefix are specified, template will be disabled
only commonly used templates are accepted (unless --jinja is set before this flag):
list of built-in templates:
bailing, bailing-think, bailing2, chatglm3, chatglm4, chatml, command-r, deepseek, deepseek2, deepseek3, exaone3, exaone4, falcon3, gemma, gigachat, glmedge, gpt-oss, granite, grok-2, hunyuan-dense, hunyuan-moe, kimi-k2, llama2, llama2-sys, llama2-sys-bos, llama2-sys-strip, llama3, llama4, megrez, minicpm, mistral-v1, mistral-v3, mistral-v3-tekken, mistral-v7, mistral-v7-tekken, monarch, openchat, orion, pangu-embedded, phi3, phi4, rwkv-world, seed_oss, smolvlm, solar-open, vicuna, vicuna-orca, yandex, zephyr
(env: LLAMA_ARG_CHAT_TEMPLATE) | -| `--chat-template-file JINJA_TEMPLATE_FILE` | set custom jinja chat template file (default: template taken from model's metadata)
if suffix/prefix are specified, template will be disabled
only commonly used templates are accepted (unless --jinja is set before this flag):
list of built-in templates:
bailing, bailing-think, bailing2, chatglm3, chatglm4, chatml, command-r, deepseek, deepseek2, deepseek3, exaone3, exaone4, falcon3, gemma, gigachat, glmedge, gpt-oss, granite, grok-2, hunyuan-dense, hunyuan-moe, kimi-k2, llama2, llama2-sys, llama2-sys-bos, llama2-sys-strip, llama3, llama4, megrez, minicpm, mistral-v1, mistral-v3, mistral-v3-tekken, mistral-v7, mistral-v7-tekken, monarch, openchat, orion, pangu-embedded, phi3, phi4, rwkv-world, seed_oss, smolvlm, solar-open, vicuna, vicuna-orca, yandex, zephyr
(env: LLAMA_ARG_CHAT_TEMPLATE_FILE) | +| `--chat-template JINJA_TEMPLATE` | set custom jinja chat template (default: template taken from model's metadata)
if suffix/prefix are specified, template will be disabled
only commonly used templates are accepted (unless --jinja is set before this flag):
list of built-in templates:
bailing, bailing-think, bailing2, chatglm3, chatglm4, chatml, command-r, deepseek, deepseek2, deepseek3, exaone3, exaone4, falcon3, gemma, gigachat, glmedge, gpt-oss, granite, grok-2, hunyuan-dense, hunyuan-moe, kimi-k2, llama2, llama2-sys, llama2-sys-bos, llama2-sys-strip, llama3, llama4, megrez, minicpm, mistral-v1, mistral-v3, mistral-v3-tekken, mistral-v7, mistral-v7-tekken, monarch, openchat, orion, pangu-embedded, phi3, phi4, rwkv-world, seed_oss, smolvlm, vicuna, vicuna-orca, yandex, zephyr
(env: LLAMA_ARG_CHAT_TEMPLATE) | +| `--chat-template-file JINJA_TEMPLATE_FILE` | set custom jinja chat template file (default: template taken from model's metadata)
if suffix/prefix are specified, template will be disabled
only commonly used templates are accepted (unless --jinja is set before this flag):
list of built-in templates:
bailing, bailing-think, bailing2, chatglm3, chatglm4, chatml, command-r, deepseek, deepseek2, deepseek3, exaone3, exaone4, falcon3, gemma, gigachat, glmedge, gpt-oss, granite, grok-2, hunyuan-dense, hunyuan-moe, kimi-k2, llama2, llama2-sys, llama2-sys-bos, llama2-sys-strip, llama3, llama4, megrez, minicpm, mistral-v1, mistral-v3, mistral-v3-tekken, mistral-v7, mistral-v7-tekken, monarch, openchat, orion, pangu-embedded, phi3, phi4, rwkv-world, seed_oss, smolvlm, vicuna, vicuna-orca, yandex, zephyr
(env: LLAMA_ARG_CHAT_TEMPLATE_FILE) | | `--simple-io` | use basic IO for better compatibility in subprocesses and limited consoles | @@ -436,19 +433,6 @@ The Min-P sampling method was designed as an alternative to Top-P, and aims to e Example usage: `--min-p 0.05` -### Adaptive-P Sampling - -- `--adaptive-target N`: select tokens near this probability (valid range 0.0 to 1.0; negative = disabled) -- `--adaptive-decay N`: EMA decay for adaptation; history ≈ 1/(1-decay) tokens (valid range 0.0 - 0.99) - -Adaptive-P: Select tokens near a configurable target probability over time. - -The adaptive-p sampler transforms the token probability distribution to favor tokens that fall near a user-configurable probability target. Internally, the sampler maintains an exponential moving average of the *ORIGINAL* probabilities of selected tokens at each sampling step. It uses this EMA to compute an adapted target probability at each sampling step, thus maintaining the desired target probability over time. Only mild truncation before this sampler is recommended. It is suggested to apply min-p before adaptive-p as the only other active sampler. - -Recommended starting values: `--adaptive-target 0.55 --adaptive-decay 0.9` - -For more info, refer to: [llama.cpp#17927](https://github.com/ggml-org/llama.cpp/pull/17927) - ### Locally Typical Sampling - `--typical N`: Enable locally typical sampling with parameter p (default: 1.0, 1.0 = disabled). diff --git a/tools/completion/completion.cpp b/tools/completion/completion.cpp index a9eda11..2977051 100644 --- a/tools/completion/completion.cpp +++ b/tools/completion/completion.cpp @@ -175,10 +175,7 @@ int main(int argc, char ** argv) { struct ggml_threadpool_params tpp = ggml_threadpool_params_from_cpu_params(params.cpuparams); - if (!set_process_priority(params.cpuparams.priority)) { - LOG_ERR("%s: error: failed to set process priority\n", __func__); - return 1; - } + set_process_priority(params.cpuparams.priority); struct ggml_threadpool * threadpool_batch = NULL; if (!ggml_threadpool_params_match(&tpp, &tpp_batch)) { diff --git a/tools/fit-params/fit-params.cpp b/tools/fit-params/fit-params.cpp index f9d9cb3..2c113c4 100644 --- a/tools/fit-params/fit-params.cpp +++ b/tools/fit-params/fit-params.cpp @@ -26,16 +26,16 @@ int main(int argc, char ** argv) { llama_numa_init(params.numa); auto mparams = common_model_params_to_llama(params); auto cparams = common_context_params_to_llama(params); - const llama_params_fit_status status = llama_params_fit(params.model.path.c_str(), &mparams, &cparams, - params.tensor_split, params.tensor_buft_overrides.data(), params.fit_params_target.data(), params.fit_params_min_ctx, + const bool success = llama_params_fit(params.model.path.c_str(), &mparams, &cparams, + params.tensor_split, params.tensor_buft_overrides.data(), params.fit_params_target, params.fit_params_min_ctx, params.verbosity >= 4 ? GGML_LOG_LEVEL_DEBUG : GGML_LOG_LEVEL_ERROR); - if (status != LLAMA_PARAMS_FIT_STATUS_SUCCESS) { + if (!success) { LOG_ERR("%s: failed to fit CLI arguments to free memory, exiting...\n", __func__); exit(1); } LOG_INF("%s: printing fitted CLI arguments to stdout...\n", __func__); - common_log_flush(common_log_main()); + std::this_thread::sleep_for(10ms); // to avoid a race between stderr and stdout printf("-c %" PRIu32 " -ngl %" PRIu32, cparams.n_ctx, mparams.n_gpu_layers); size_t nd = llama_max_devices(); diff --git a/tools/llama-bench/llama-bench.cpp b/tools/llama-bench/llama-bench.cpp index aed97e7..b431c7f 100644 --- a/tools/llama-bench/llama-bench.cpp +++ b/tools/llama-bench/llama-bench.cpp @@ -334,7 +334,6 @@ struct cmd_params { std::vector> tensor_split; std::vector> tensor_buft_overrides; std::vector use_mmap; - std::vector use_direct_io; std::vector embeddings; std::vector no_op_offload; std::vector no_host; @@ -373,7 +372,6 @@ static const cmd_params cmd_params_defaults = { /* tensor_split */ { std::vector(llama_max_devices(), 0.0f) }, /* tensor_buft_overrides*/ { std::vector{ { nullptr, nullptr } } }, /* use_mmap */ { true }, - /* use_direct_io */ { true }, /* embeddings */ { false }, /* no_op_offload */ { false }, /* no_host */ { false }, @@ -451,8 +449,6 @@ static void print_usage(int /* argc */, char ** argv) { printf(" -dev, --device (default: auto)\n"); printf(" -mmp, --mmap <0|1> (default: %s)\n", join(cmd_params_defaults.use_mmap, ",").c_str()); - printf(" -dio, --direct-io <0|1> (default: %s)\n", - join(cmd_params_defaults.use_direct_io, ",").c_str()); printf(" -embd, --embeddings <0|1> (default: %s)\n", join(cmd_params_defaults.embeddings, ",").c_str()); printf(" -ts, --tensor-split (default: 0)\n"); @@ -776,13 +772,6 @@ static cmd_params parse_cmd_params(int argc, char ** argv) { } auto p = string_split(argv[i], split_delim); params.use_mmap.insert(params.use_mmap.end(), p.begin(), p.end()); - } else if (arg == "-dio" || arg == "--direct-io") { - if (++i >= argc) { - invalid_param = true; - break; - } - auto p = string_split(argv[i], split_delim); - params.use_direct_io.insert(params.use_direct_io.end(), p.begin(), p.end()); } else if (arg == "-embd" || arg == "--embeddings") { if (++i >= argc) { invalid_param = true; @@ -1019,9 +1008,6 @@ static cmd_params parse_cmd_params(int argc, char ** argv) { if (params.use_mmap.empty()) { params.use_mmap = cmd_params_defaults.use_mmap; } - if (params.use_direct_io.empty()) { - params.use_direct_io = cmd_params_defaults.use_direct_io; - } if (params.embeddings.empty()) { params.embeddings = cmd_params_defaults.embeddings; } @@ -1070,7 +1056,6 @@ struct cmd_params_instance { std::vector tensor_split; std::vector tensor_buft_overrides; bool use_mmap; - bool use_direct_io; bool embeddings; bool no_op_offload; bool no_host; @@ -1082,12 +1067,11 @@ struct cmd_params_instance { if (!devices.empty()) { mparams.devices = const_cast(devices.data()); } - mparams.split_mode = split_mode; - mparams.main_gpu = main_gpu; - mparams.tensor_split = tensor_split.data(); - mparams.use_mmap = use_mmap; - mparams.use_direct_io = use_direct_io; - mparams.no_host = no_host; + mparams.split_mode = split_mode; + mparams.main_gpu = main_gpu; + mparams.tensor_split = tensor_split.data(); + mparams.use_mmap = use_mmap; + mparams.no_host = no_host; if (n_cpu_moe <= 0) { if (tensor_buft_overrides.empty()) { @@ -1131,8 +1115,7 @@ struct cmd_params_instance { bool equal_mparams(const cmd_params_instance & other) const { return model == other.model && n_gpu_layers == other.n_gpu_layers && n_cpu_moe == other.n_cpu_moe && split_mode == other.split_mode && - main_gpu == other.main_gpu && tensor_split == other.tensor_split && - use_mmap == other.use_mmap && use_direct_io == other.use_direct_io && + main_gpu == other.main_gpu && use_mmap == other.use_mmap && tensor_split == other.tensor_split && devices == other.devices && no_host == other.no_host && vec_tensor_buft_override_equal(tensor_buft_overrides, other.tensor_buft_overrides); @@ -1170,7 +1153,6 @@ static std::vector get_cmd_params_instances(const cmd_param for (const auto & ts : params.tensor_split) for (const auto & ot : params.tensor_buft_overrides) for (const auto & mmp : params.use_mmap) - for (const auto & dio : params.use_direct_io) for (const auto & noh : params.no_host) for (const auto & embd : params.embeddings) for (const auto & nopo : params.no_op_offload) @@ -1212,7 +1194,6 @@ static std::vector get_cmd_params_instances(const cmd_param /* .tensor_split = */ ts, /* .tensor_buft_overrides = */ ot, /* .use_mmap = */ mmp, - /* .use_direct_io= */ dio, /* .embeddings = */ embd, /* .no_op_offload= */ nopo, /* .no_host = */ noh, @@ -1247,7 +1228,6 @@ static std::vector get_cmd_params_instances(const cmd_param /* .tensor_split = */ ts, /* .tensor_buft_overrides = */ ot, /* .use_mmap = */ mmp, - /* .use_direct_io= */ dio, /* .embeddings = */ embd, /* .no_op_offload= */ nopo, /* .no_host = */ noh, @@ -1282,7 +1262,6 @@ static std::vector get_cmd_params_instances(const cmd_param /* .tensor_split = */ ts, /* .tensor_buft_overrides = */ ot, /* .use_mmap = */ mmp, - /* .use_direct_io= */ dio, /* .embeddings = */ embd, /* .no_op_offload= */ nopo, /* .no_host = */ noh, @@ -1322,7 +1301,6 @@ struct test { std::vector tensor_split; std::vector tensor_buft_overrides; bool use_mmap; - bool use_direct_io; bool embeddings; bool no_op_offload; bool no_host; @@ -1360,7 +1338,6 @@ struct test { tensor_split = inst.tensor_split; tensor_buft_overrides = inst.tensor_buft_overrides; use_mmap = inst.use_mmap; - use_direct_io = inst.use_direct_io; embeddings = inst.embeddings; no_op_offload = inst.no_op_offload; no_host = inst.no_host; @@ -1420,9 +1397,9 @@ struct test { "n_ubatch", "n_threads", "cpu_mask", "cpu_strict", "poll", "type_k", "type_v", "n_gpu_layers", "n_cpu_moe", "split_mode", "main_gpu", "no_kv_offload", "flash_attn", "devices", "tensor_split", - "tensor_buft_overrides", "use_mmap", "use_direct_io", "embeddings", - "no_op_offload", "no_host", "n_prompt", "n_gen", "n_depth", - "test_time", "avg_ns", "stddev_ns", "avg_ts", "stddev_ts" + "tensor_buft_overrides", "use_mmap", "embeddings", "no_op_offload", + "no_host", "n_prompt", "n_gen", "n_depth", "test_time", + "avg_ns", "stddev_ns", "avg_ts", "stddev_ts" }; return fields; } @@ -1437,7 +1414,7 @@ struct test { return INT; } if (field == "f16_kv" || field == "no_kv_offload" || field == "cpu_strict" || field == "flash_attn" || - field == "use_mmap" || field == "use_direct_io" || field == "embeddings" || field == "no_host") { + field == "use_mmap" || field == "embeddings" || field == "no_host") { return BOOL; } if (field == "avg_ts" || field == "stddev_ts") { @@ -1510,7 +1487,6 @@ struct test { tensor_split_str, tensor_buft_overrides_str, std::to_string(use_mmap), - std::to_string(use_direct_io), std::to_string(embeddings), std::to_string(no_op_offload), std::to_string(no_host), @@ -1696,9 +1672,6 @@ struct markdown_printer : public printer { if (field == "use_mmap") { return 4; } - if (field == "use_direct_io") { - return 3; - } if (field == "test") { return 15; } @@ -1736,9 +1709,6 @@ struct markdown_printer : public printer { if (field == "use_mmap") { return "mmap"; } - if (field == "use_direct_io") { - return "dio"; - } if (field == "embeddings") { return "embd"; } @@ -1823,9 +1793,6 @@ struct markdown_printer : public printer { if (params.use_mmap.size() > 1 || params.use_mmap != cmd_params_defaults.use_mmap) { fields.emplace_back("use_mmap"); } - if (params.use_direct_io.size() > 1 || params.use_direct_io != cmd_params_defaults.use_direct_io) { - fields.emplace_back("use_direct_io"); - } if (params.embeddings.size() > 1 || params.embeddings != cmd_params_defaults.embeddings) { fields.emplace_back("embeddings"); } @@ -2070,10 +2037,7 @@ int main(int argc, char ** argv) { llama_backend_init(); llama_numa_init(params.numa); - if (!set_process_priority(params.prio)) { - fprintf(stderr, "%s: error: failed to set process priority\n", __func__); - return 1; - } + set_process_priority(params.prio); // initialize printer std::unique_ptr p = create_printer(params.output_format); diff --git a/tools/mtmd/CMakeLists.txt b/tools/mtmd/CMakeLists.txt index 751440a..317d5f1 100644 --- a/tools/mtmd/CMakeLists.txt +++ b/tools/mtmd/CMakeLists.txt @@ -27,8 +27,6 @@ add_library(mtmd models/qwen3vl.cpp models/siglip.cpp models/whisper-enc.cpp - models/mobilenetv5.cpp - models/youtuvl.cpp ) set_target_properties(mtmd PROPERTIES diff --git a/tools/mtmd/clip-graph.h b/tools/mtmd/clip-graph.h index 4c7f750..2b19157 100644 --- a/tools/mtmd/clip-graph.h +++ b/tools/mtmd/clip-graph.h @@ -32,6 +32,10 @@ struct clip_graph { const float kq_scale; const clip_flash_attn_type flash_attn_type; + // for debugging + const bool debug_graph; + std::vector & debug_print_tensors; + ggml_context_ptr ctx0_ptr; ggml_context * ctx0; ggml_cgraph * gf; diff --git a/tools/mtmd/clip-impl.h b/tools/mtmd/clip-impl.h index dd69362..a093986 100644 --- a/tools/mtmd/clip-impl.h +++ b/tools/mtmd/clip-impl.h @@ -45,14 +45,13 @@ #define KEY_SPATIAL_MERGE_SIZE "clip.vision.spatial_merge_size" #define KEY_IS_DEEPSTACK_LAYERS "clip.vision.is_deepstack_layers" -#define KEY_MM_PATCH_MERGE_TYPE "clip.vision.mm_patch_merge_type" -#define KEY_IMAGE_GRID_PINPOINTS "clip.vision.image_grid_pinpoints" -#define KEY_IMAGE_CROP_RESOLUTION "clip.vision.image_crop_resolution" -#define KEY_WIN_ATTN_PATTERN "clip.vision.n_wa_pattern" -#define KEY_WIN_ATTN_LAYER_INDEXES "clip.vision.wa_layer_indexes" -#define KEY_ATTN_WINDOW_SIZE "clip.vision.window_size" -#define KEY_MINICPMV_VERSION "clip.minicpmv_version" -#define KEY_MINICPMV_QUERY_NUM "clip.minicpmv_query_num" +#define KEY_MM_PATCH_MERGE_TYPE "clip.vision.mm_patch_merge_type" +#define KEY_IMAGE_GRID_PINPOINTS "clip.vision.image_grid_pinpoints" +#define KEY_IMAGE_CROP_RESOLUTION "clip.vision.image_crop_resolution" +#define KEY_WIN_ATTN_PATTERN "clip.vision.n_wa_pattern" +#define KEY_ATTN_WINDOW_SIZE "clip.vision.window_size" +#define KEY_MINICPMV_VERSION "clip.minicpmv_version" +#define KEY_MINICPMV_QUERY_NUM "clip.minicpmv_query_num" // audio-specific #define KEY_AUDIO_PROJ_TYPE "clip.audio.projector_type" // for models with mixed modalities @@ -154,47 +153,6 @@ #define TN_CONV_PW1 "%s.blk.%d.conv_pw1.%s" #define TN_CONV_PW2 "%s.blk.%d.conv_pw2.%s" -// mobilenetv5 (gemma3n) definitions -#define TN_MNV5_STEM_CONV "v.conv_stem.conv.weight" -#define TN_MNV5_STEM_BIAS "v.conv_stem.conv.bias" -#define TN_MNV5_STEM_BN "v.conv_stem.bn.weight" - -// Stage 0 Block (Edge Residual) -#define TN_MNV5_BLK_S0_EXP_W "v.blk.%d.%d.conv_exp.weight" -#define TN_MNV5_BLK_S0_BN1_W "v.blk.%d.%d.bn1.weight" -#define TN_MNV5_BLK_S0_PWL_W "v.blk.%d.%d.conv_pwl.weight" -#define TN_MNV5_BLK_S0_BN2_W "v.blk.%d.%d.bn2.weight" - -// Stage 1+ Block (Universal Inverted Residual) -#define TN_MNV5_BLK_DW_START_W "v.blk.%d.%d.dw_start.conv.weight" -#define TN_MNV5_BLK_DW_START_BN "v.blk.%d.%d.dw_start.bn.weight" -#define TN_MNV5_BLK_DW_MID_W "v.blk.%d.%d.dw_mid.conv.weight" -#define TN_MNV5_BLK_DW_MID_BN "v.blk.%d.%d.dw_mid.bn.weight" -#define TN_MNV5_BLK_PW_EXP_W "v.blk.%d.%d.pw_exp.conv.weight" -#define TN_MNV5_BLK_PW_EXP_BN "v.blk.%d.%d.pw_exp.bn.weight" -#define TN_MNV5_BLK_PW_PROJ_W "v.blk.%d.%d.pw_proj.conv.weight" -#define TN_MNV5_BLK_PW_PROJ_BN "v.blk.%d.%d.pw_proj.bn.weight" -#define TN_MNV5_BLK_LAYER_SCALE "v.blk.%d.%d.layer_scale.gamma" - -// Attention Components -#define TN_MNV5_ATTN_Q_W "v.blk.%d.%d.attn.query.proj.weight" -#define TN_MNV5_ATTN_K_W "v.blk.%d.%d.attn.key.proj.weight" -#define TN_MNV5_ATTN_V_W "v.blk.%d.%d.attn.value.proj.weight" -#define TN_MNV5_ATTN_O_W "v.blk.%d.%d.attn.output.proj.weight" -#define TN_MNV5_ATTN_K_DW "v.blk.%d.%d.attn.key.down_conv.weight" -#define TN_MNV5_ATTN_K_NORM "v.blk.%d.%d.attn.key.norm.weight" -#define TN_MNV5_ATTN_V_DW "v.blk.%d.%d.attn.value.down_conv.weight" -#define TN_MNV5_ATTN_V_NORM "v.blk.%d.%d.attn.value.norm.weight" -#define TN_MNV5_ATTN_NORM "v.blk.%d.%d.norm.weight" // Block norm used in attn blocks - -// MSFA -#define TN_MNV5_MSFA_FFN_EXP_W "v.msfa.ffn.pw_exp.conv.weight" -#define TN_MNV5_MSFA_FFN_EXP_BN "v.msfa.ffn.pw_exp.bn.weight" -#define TN_MNV5_MSFA_FFN_PROJ_W "v.msfa.ffn.pw_proj.conv.weight" -#define TN_MNV5_MSFA_FFN_PROJ_BN "v.msfa.ffn.pw_proj.bn.weight" -#define TN_MNV5_MSFA_NORM "v.msfa.norm.weight" - - // align x to upper multiple of n #define CLIP_ALIGN(x, n) ((((x) + (n) - 1) / (n)) * (n)) @@ -212,8 +170,6 @@ enum projector_type { PROJECTOR_TYPE_QWEN2VL, PROJECTOR_TYPE_QWEN3VL, PROJECTOR_TYPE_GEMMA3, - PROJECTOR_TYPE_GEMMA3NV, - PROJECTOR_TYPE_GEMMA3NA, PROJECTOR_TYPE_IDEFICS3, PROJECTOR_TYPE_PIXTRAL, PROJECTOR_TYPE_QWEN25VL, @@ -224,7 +180,6 @@ enum projector_type { PROJECTOR_TYPE_GLMA, PROJECTOR_TYPE_QWEN25O, // will be replaced by QWEN2A or QWEN25VL depending on clip_ctx PROJECTOR_TYPE_VOXTRAL, - PROJECTOR_TYPE_MUSIC_FLAMINGO, PROJECTOR_TYPE_LFM2, PROJECTOR_TYPE_KIMIVL, PROJECTOR_TYPE_LIGHTONOCR, @@ -232,7 +187,6 @@ enum projector_type { PROJECTOR_TYPE_JANUS_PRO, PROJECTOR_TYPE_LFM2A, PROJECTOR_TYPE_GLM4V, - PROJECTOR_TYPE_YOUTUVL, PROJECTOR_TYPE_UNKNOWN, }; @@ -246,8 +200,6 @@ static std::map PROJECTOR_TYPE_NAMES = { { PROJECTOR_TYPE_QWEN25VL, "qwen2.5vl_merger"}, { PROJECTOR_TYPE_QWEN3VL, "qwen3vl_merger"}, { PROJECTOR_TYPE_GEMMA3, "gemma3"}, - { PROJECTOR_TYPE_GEMMA3NV, "gemma3nv"}, - { PROJECTOR_TYPE_GEMMA3NA, "gemma3na"}, { PROJECTOR_TYPE_IDEFICS3, "idefics3"}, { PROJECTOR_TYPE_PIXTRAL, "pixtral"}, { PROJECTOR_TYPE_ULTRAVOX, "ultravox"}, @@ -257,7 +209,6 @@ static std::map PROJECTOR_TYPE_NAMES = { { PROJECTOR_TYPE_GLMA, "glma"}, { PROJECTOR_TYPE_QWEN25O, "qwen2.5o"}, { PROJECTOR_TYPE_VOXTRAL, "voxtral"}, - { PROJECTOR_TYPE_MUSIC_FLAMINGO, "musicflamingo"}, { PROJECTOR_TYPE_LFM2, "lfm2"}, { PROJECTOR_TYPE_KIMIVL, "kimivl"}, { PROJECTOR_TYPE_LIGHTONOCR,"lightonocr"}, @@ -265,7 +216,6 @@ static std::map PROJECTOR_TYPE_NAMES = { { PROJECTOR_TYPE_JANUS_PRO, "janus_pro"}, { PROJECTOR_TYPE_LFM2A, "lfm2a"}, { PROJECTOR_TYPE_GLM4V, "glm4v"}, - { PROJECTOR_TYPE_YOUTUVL, "youtuvl"}, }; static projector_type clip_projector_type_from_string(const std::string & str) { diff --git a/tools/mtmd/clip-model.h b/tools/mtmd/clip-model.h index d4ff915..b4c31cd 100644 --- a/tools/mtmd/clip-model.h +++ b/tools/mtmd/clip-model.h @@ -61,7 +61,6 @@ struct clip_hparams { std::unordered_set vision_feature_layer; int32_t attn_window_size = 0; int32_t n_wa_pattern = 0; - std::unordered_set wa_layer_indexes; // explicit layer indexes that use full attention (for irregular patterns like YoutuVL) // audio int32_t n_mel_bins = 0; // whisper preprocessor @@ -173,45 +172,6 @@ struct clip_layer { } }; -// Expanded MobileNetV5 block structure for Gemma3n vision encoder -struct mobilenetv5_block { - // Stage 0 (Edge Residual) - ggml_tensor * s0_conv_exp_w = nullptr; - ggml_tensor * s0_bn1_w = nullptr; - ggml_tensor * s0_conv_pwl_w = nullptr; - ggml_tensor * s0_bn2_w = nullptr; - - // Stage 1+ (Universal Inverted Residual) - ggml_tensor * dw_start_w = nullptr; - ggml_tensor * dw_start_bn_w = nullptr; - - ggml_tensor * pw_exp_w = nullptr; - ggml_tensor * pw_exp_bn_w = nullptr; - - ggml_tensor * dw_mid_w = nullptr; - ggml_tensor * dw_mid_bn_w = nullptr; - - ggml_tensor * pw_proj_w = nullptr; - ggml_tensor * pw_proj_bn_w = nullptr; - - ggml_tensor * layer_scale_w = nullptr; - - // Attention (MQA) components - ggml_tensor * attn_q_w = nullptr; - ggml_tensor * attn_k_w = nullptr; - ggml_tensor * attn_v_w = nullptr; - ggml_tensor * attn_o_w = nullptr; - - // Optional downsampling/norm in attention - ggml_tensor * attn_k_dw_w = nullptr; - ggml_tensor * attn_k_norm_w = nullptr; - ggml_tensor * attn_v_dw_w = nullptr; - ggml_tensor * attn_v_norm_w = nullptr; - - // Block norm (often present in attention blocks) - ggml_tensor * attn_norm_w = nullptr; -}; - struct clip_model { clip_modality modality = CLIP_MODALITY_VISION; projector_type proj_type = PROJECTOR_TYPE_MLP; @@ -328,23 +288,6 @@ struct clip_model { ggml_tensor * mm_input_proj_w = nullptr; ggml_tensor * mm_soft_emb_norm_w = nullptr; - // mobilenetv5 for gemma3n - std::vector mobilenet_blocks; - std::vector mobilenet_stage_ends; - ggml_tensor * mobilenet_stem_conv_w = nullptr; - ggml_tensor * mobilenet_stem_conv_b = nullptr; - ggml_tensor * mobilenet_stem_norm_w = nullptr; - ggml_tensor * mm_post_proj_norm_w = nullptr; - - // Multi-Scale Fusion Adapter (MSFA) components - ggml_tensor * msfa_concat_conv_w = nullptr; - ggml_tensor * msfa_concat_norm_w = nullptr; - ggml_tensor * msfa_ffn_expand_w = nullptr; - ggml_tensor * msfa_ffn_project_w = nullptr; - ggml_tensor * msfa_ffn_expand_bn = nullptr; - ggml_tensor * msfa_ffn_project_bn = nullptr; - - // pixtral, glm4v ggml_tensor * token_embd_img_break = nullptr; ggml_tensor * mm_patch_merger_w = nullptr; @@ -376,8 +319,7 @@ struct clip_model { bool audio_has_avgpool() const { return proj_type == PROJECTOR_TYPE_QWEN2A - || proj_type == PROJECTOR_TYPE_VOXTRAL - || proj_type == PROJECTOR_TYPE_MUSIC_FLAMINGO; + || proj_type == PROJECTOR_TYPE_VOXTRAL; } bool audio_has_stack_frames() const { diff --git a/tools/mtmd/clip.cpp b/tools/mtmd/clip.cpp index 9b076e0..3ba0823 100644 --- a/tools/mtmd/clip.cpp +++ b/tools/mtmd/clip.cpp @@ -152,14 +152,18 @@ struct clip_ctx { ggml_backend_t backend_cpu = nullptr; ggml_backend_buffer_ptr buf; - int max_nodes = 8192; ggml_backend_sched_ptr sched; clip_flash_attn_type flash_attn_type = CLIP_FLASH_ATTN_TYPE_AUTO; bool is_allocated = false; + // for debugging + bool debug_graph = false; + std::vector debug_print_tensors; + clip_ctx(clip_context_params & ctx_params) { flash_attn_type = ctx_params.flash_attn_type; + debug_graph = std::getenv("MTMD_DEBUG_GRAPH") != nullptr; backend_cpu = ggml_backend_init_by_type(GGML_BACKEND_DEVICE_TYPE_CPU, nullptr); if (!backend_cpu) { throw std::runtime_error("failed to initialize CPU backend"); @@ -200,10 +204,6 @@ struct clip_ctx { sched.reset( ggml_backend_sched_new(backend_ptrs.data(), backend_buft.data(), backend_ptrs.size(), 8192, false, true) ); - - if (ctx_params.cb_eval != nullptr) { - ggml_backend_sched_set_eval_callback(sched.get(), ctx_params.cb_eval, ctx_params.cb_eval_user_data); - } } ~clip_ctx() { @@ -239,7 +239,9 @@ clip_graph::clip_graph(clip_ctx * ctx, const clip_image_f32 & img) : n_mmproj_embd(clip_n_mmproj_embd(ctx)), eps(hparams.eps), kq_scale(1.0f / sqrtf((float)d_head)), - flash_attn_type(ctx->flash_attn_type) { + flash_attn_type(ctx->flash_attn_type), + debug_graph(ctx->debug_graph), + debug_print_tensors(ctx->debug_print_tensors) { struct ggml_init_params params = { /*.mem_size =*/ ctx->buf_compute_meta.size(), /*.mem_buffer =*/ ctx->buf_compute_meta.data(), @@ -250,11 +252,14 @@ clip_graph::clip_graph(clip_ctx * ctx, const clip_image_f32 & img) : gf = ggml_new_graph_custom(ctx0, ctx->max_nodes, false); } -void clip_graph::cb(ggml_tensor * cur, const char * name, int il) const { - if (il >= 0) { - ggml_format_name(cur, "%s-%d", name, il); - } else { - ggml_set_name(cur, name); +void clip_graph::cb(ggml_tensor * cur0, const char * name, int il) const { + if (debug_graph) { + ggml_tensor * cur = ggml_cpy(ctx0, cur0, ggml_dup_tensor(ctx0, cur0)); + std::string cur_name = il >= 0 ? std::string(name) + "_" + std::to_string(il) : name; + ggml_set_name(cur, cur_name.c_str()); + ggml_set_output(cur); + ggml_build_forward_expand(gf, cur); + debug_print_tensors.push_back(cur); } } @@ -783,10 +788,6 @@ static ggml_cgraph * clip_image_build_graph(clip_ctx * ctx, const clip_image_f32 { builder = std::make_unique(ctx, img); } break; - case PROJECTOR_TYPE_GEMMA3NV: - { - builder = std::make_unique(ctx, img); - } break; case PROJECTOR_TYPE_PIXTRAL: case PROJECTOR_TYPE_LIGHTONOCR: { @@ -817,7 +818,6 @@ static ggml_cgraph * clip_image_build_graph(clip_ctx * ctx, const clip_image_f32 case PROJECTOR_TYPE_VOXTRAL: case PROJECTOR_TYPE_QWEN2A: case PROJECTOR_TYPE_GLMA: - case PROJECTOR_TYPE_MUSIC_FLAMINGO: { builder = std::make_unique(ctx, img); } break; @@ -845,10 +845,6 @@ static ggml_cgraph * clip_image_build_graph(clip_ctx * ctx, const clip_image_f32 { builder = std::make_unique(ctx, img); } break; - case PROJECTOR_TYPE_YOUTUVL: - { - builder = std::make_unique(ctx, img); - } break; default: GGML_ABORT("missing cgraph builder"); } @@ -1145,14 +1141,6 @@ struct clip_model_loader { // test model (tinygemma3) has a different value, we optionally read it get_u32(KEY_PROJ_SCALE_FACTOR, hparams.n_merge, false); } break; - - case PROJECTOR_TYPE_GEMMA3NV: - { - // Gemma3n uses MobileNetV5 which produces 256 tokens (16x16) - // Similar configuration to Gemma3 - hparams.n_merge = 1; // MobileNetV5 handles resizing internally - get_u32(KEY_PROJ_SCALE_FACTOR, hparams.n_merge, false); - } break; case PROJECTOR_TYPE_QWEN2VL: case PROJECTOR_TYPE_QWEN25VL: case PROJECTOR_TYPE_QWEN3VL: @@ -1170,20 +1158,6 @@ struct clip_model_loader { LOG_WRN("%s: more info: https://github.com/ggml-org/llama.cpp/issues/16842\n\n", __func__); } } break; - case PROJECTOR_TYPE_YOUTUVL: - { - hparams.n_merge = 2; - get_u32(KEY_SPATIAL_MERGE_SIZE, hparams.n_merge, false); - get_u32(KEY_ATTN_WINDOW_SIZE, hparams.attn_window_size, true); - std::vector wa_layer_indexes_vec; - get_arr_int(KEY_WIN_ATTN_LAYER_INDEXES, wa_layer_indexes_vec, true); - for (auto & layer : wa_layer_indexes_vec) { - hparams.wa_layer_indexes.insert(layer); - } - // support max_height * max_width = 8000 * 8000. 8000/16/2 = 250 image tokens - hparams.set_limit_image_tokens(1, 62500); - hparams.set_warmup_n_tokens(16*16); // avoid OOM on warmup - } break; case PROJECTOR_TYPE_GLM4V: { hparams.rope_theta = 10000.0f; @@ -1202,7 +1176,6 @@ struct clip_model_loader { case PROJECTOR_TYPE_QWEN2A: case PROJECTOR_TYPE_GLMA: case PROJECTOR_TYPE_VOXTRAL: - case PROJECTOR_TYPE_MUSIC_FLAMINGO: { bool require_stack = model.proj_type == PROJECTOR_TYPE_ULTRAVOX || model.proj_type == PROJECTOR_TYPE_VOXTRAL || @@ -1252,14 +1225,7 @@ struct clip_model_loader { LOG_INF("%s: has_llava_proj: %d\n", __func__, hparams.has_llava_projector); LOG_INF("%s: minicpmv_version: %d\n", __func__, hparams.minicpmv_version); LOG_INF("%s: n_merge: %d\n", __func__, hparams.n_merge); - LOG_INF("%s: n_wa_pattern: %d\n", __func__, hparams.n_wa_pattern); - if (!hparams.wa_layer_indexes.empty()) { - LOG_INF("%s: wa_layer_indexes: ", __func__); - for (auto & layer : hparams.wa_layer_indexes) { - LOG_INF("%d ", layer); - } - LOG_INF("\n"); - } + LOG_INF("%s: n_wa_pattern: %d\n", __func__, hparams.n_wa_pattern); if (hparams.image_min_pixels > 0) { LOG_INF("%s: image_min_pixels: %d%s\n", __func__, hparams.image_min_pixels, hparams.custom_image_min_tokens > 0 ? " (custom value)" : ""); } @@ -1341,10 +1307,6 @@ struct clip_model_loader { model.position_embeddings = get_tensor(string_format(TN_POS_EMBD, prefix), false); - if (model.proj_type == PROJECTOR_TYPE_GEMMA3NV) { - hparams.n_layer = 0; // gemma3n does not use normal layer structure - } - // layers model.layers.resize(hparams.n_layer); for (int il = 0; il < hparams.n_layer; ++il) { @@ -1419,7 +1381,6 @@ struct clip_model_loader { } } - switch (model.proj_type) { case PROJECTOR_TYPE_MLP: case PROJECTOR_TYPE_MLP_NORM: @@ -1514,8 +1475,8 @@ struct clip_model_loader { model.mm_model_mlp_1_w = get_tensor(string_format(TN_GLM_ADAPTER_D_H_2_4H, "weight")); model.mm_model_mlp_2_w = get_tensor(string_format(TN_GLM_ADAPTER_GATE, "weight")); model.mm_model_mlp_3_w = get_tensor(string_format(TN_GLM_ADAPTER_D_4H_2_H, "weight")); - model.mm_boi = get_tensor(string_format(TN_TOK_GLM_BOI)); - model.mm_eoi = get_tensor(string_format(TN_TOK_GLM_EOI)); + model.mm_boi = get_tensor(string_format(TN_TOK_GLM_BOI, "weight")); + model.mm_eoi = get_tensor(string_format(TN_TOK_GLM_EOI, "weight")); } break; case PROJECTOR_TYPE_QWEN2VL: case PROJECTOR_TYPE_QWEN25VL: @@ -1532,14 +1493,6 @@ struct clip_model_loader { model.mm_1_w = get_tensor(string_format(TN_LLAVA_PROJ, 2, "weight")); model.mm_1_b = get_tensor(string_format(TN_LLAVA_PROJ, 2, "bias")); } break; - case PROJECTOR_TYPE_YOUTUVL: - { - model.mm_input_norm_w = get_tensor(TN_MM_INP_NORM); // merger.ln_q (RMS norm) - model.mm_0_w = get_tensor(string_format(TN_LLAVA_PROJ, 0, "weight")); // merger.mlp.0 - model.mm_0_b = get_tensor(string_format(TN_LLAVA_PROJ, 0, "bias")); - model.mm_1_w = get_tensor(string_format(TN_LLAVA_PROJ, 2, "weight")); // merger.mlp.2 - model.mm_1_b = get_tensor(string_format(TN_LLAVA_PROJ, 2, "bias")); - } break; case PROJECTOR_TYPE_GLM4V: { model.projection = get_tensor(TN_MM_PROJECTOR); @@ -1559,112 +1512,11 @@ struct clip_model_loader { model.mm_input_proj_w = get_tensor(TN_MM_INP_PROJ); model.mm_soft_emb_norm_w = get_tensor(TN_MM_SOFT_EMB_N); } break; - case PROJECTOR_TYPE_GEMMA3NV: - { - model.mobilenet_stem_conv_w = get_tensor(TN_MNV5_STEM_CONV, false); - model.mobilenet_stem_conv_b = get_tensor(TN_MNV5_STEM_BIAS, false); - model.mobilenet_stem_norm_w = get_tensor(TN_MNV5_STEM_BN, false); - - model.msfa_ffn_expand_w = get_tensor(TN_MNV5_MSFA_FFN_EXP_W, false); - model.msfa_ffn_expand_bn = get_tensor(TN_MNV5_MSFA_FFN_EXP_BN, false); // Consume BN if present but likely folded - model.msfa_ffn_project_w = get_tensor(TN_MNV5_MSFA_FFN_PROJ_W, false); - model.msfa_ffn_project_bn = get_tensor(TN_MNV5_MSFA_FFN_PROJ_BN, false); - - model.msfa_concat_norm_w = get_tensor(TN_MNV5_MSFA_NORM, false); - - // Dynamically load blocks stage by stage - for (int stage = 0; stage < 4; ++stage) { - int blocks_found_in_stage = 0; - - for (int blk_idx = 0; ; ++blk_idx) { - bool found_block = false; - mobilenetv5_block block; - - // 1. Check for Edge Residual (S0) - block.s0_conv_exp_w = get_tensor(string_format(TN_MNV5_BLK_S0_EXP_W, stage, blk_idx), false); - if (block.s0_conv_exp_w) { - found_block = true; - block.s0_bn1_w = get_tensor(string_format(TN_MNV5_BLK_S0_BN1_W, stage, blk_idx), false); - block.s0_conv_pwl_w = get_tensor(string_format(TN_MNV5_BLK_S0_PWL_W, stage, blk_idx), false); - block.s0_bn2_w = get_tensor(string_format(TN_MNV5_BLK_S0_BN2_W, stage, blk_idx), false); - } - // 2. Check for UIR (Universal Inverted Residual) - else { - // Check for dw_start OR pw_exp (some UIR blocks skip dw_start) - block.dw_start_w = get_tensor(string_format(TN_MNV5_BLK_DW_START_W, stage, blk_idx), false); - block.pw_exp_w = get_tensor(string_format(TN_MNV5_BLK_PW_EXP_W, stage, blk_idx), false); - - if (block.dw_start_w || block.pw_exp_w) { - found_block = true; - if (block.dw_start_w) { - block.dw_start_bn_w = get_tensor(string_format(TN_MNV5_BLK_DW_START_BN, stage, blk_idx), false); - } - if (block.pw_exp_w) { - block.pw_exp_bn_w = get_tensor(string_format(TN_MNV5_BLK_PW_EXP_BN, stage, blk_idx), false); - } - block.dw_mid_w = get_tensor(string_format(TN_MNV5_BLK_DW_MID_W, stage, blk_idx), false); - if (block.dw_mid_w) { - block.dw_mid_bn_w = get_tensor(string_format(TN_MNV5_BLK_DW_MID_BN, stage, blk_idx), false); - } - block.pw_proj_w = get_tensor(string_format(TN_MNV5_BLK_PW_PROJ_W, stage, blk_idx), false); - if (block.pw_proj_w) { - block.pw_proj_bn_w = get_tensor(string_format(TN_MNV5_BLK_PW_PROJ_BN, stage, blk_idx), false); - } - block.layer_scale_w = get_tensor(string_format(TN_MNV5_BLK_LAYER_SCALE, stage, blk_idx), false); - } - } - - // 3. Check for Attention (MQA) - // Even if UIR/Edge check failed, this might be a pure attention block - ggml_tensor* attn_q_check = get_tensor(string_format(TN_MNV5_ATTN_Q_W, stage, blk_idx), false); - if (attn_q_check) { - found_block = true; - block.attn_q_w = attn_q_check; - block.attn_k_w = get_tensor(string_format(TN_MNV5_ATTN_K_W, stage, blk_idx), false); - block.attn_v_w = get_tensor(string_format(TN_MNV5_ATTN_V_W, stage, blk_idx), false); - block.attn_o_w = get_tensor(string_format(TN_MNV5_ATTN_O_W, stage, blk_idx), false); - block.attn_k_dw_w = get_tensor(string_format(TN_MNV5_ATTN_K_DW, stage, blk_idx), false); - block.attn_k_norm_w = get_tensor(string_format(TN_MNV5_ATTN_K_NORM, stage, blk_idx), false); - block.attn_v_dw_w = get_tensor(string_format(TN_MNV5_ATTN_V_DW, stage, blk_idx), false); - block.attn_v_norm_w = get_tensor(string_format(TN_MNV5_ATTN_V_NORM, stage, blk_idx), false); - block.attn_norm_w = get_tensor(string_format(TN_MNV5_ATTN_NORM, stage, blk_idx), false); - // Note: Attention blocks also have layer_scale, load it if not already loaded by UIR check - if (!block.layer_scale_w) { - block.layer_scale_w = get_tensor(string_format(TN_MNV5_BLK_LAYER_SCALE, stage, blk_idx), false); - } - } - - if (found_block) { - model.mobilenet_blocks.push_back(block); - blocks_found_in_stage++; - } else { - // End of blocks for this stage - break; - } - } - - // Track where this stage ends in the flat vector - if (blocks_found_in_stage > 0) { - model.mobilenet_stage_ends.push_back(model.mobilenet_blocks.size() - 1); - LOG_INF("%s: Stage %d ended at global block index %zu\n", __func__, stage, model.mobilenet_blocks.size() - 1); - } - } - model.mm_input_proj_w = get_tensor(TN_MM_INP_PROJ); - model.mm_soft_emb_norm_w = get_tensor(TN_MM_SOFT_EMB_N); - } break; case PROJECTOR_TYPE_IDEFICS3: { model.projection = get_tensor(TN_MM_PROJECTOR); } break; case PROJECTOR_TYPE_LFM2: - { - model.mm_input_norm_w = get_tensor(TN_MM_INP_NORM, false); - model.mm_input_norm_b = get_tensor(TN_MM_INP_NORM_B, false); - model.mm_1_w = get_tensor(string_format(TN_LLAVA_PROJ, 1, "weight")); - model.mm_1_b = get_tensor(string_format(TN_LLAVA_PROJ, 1, "bias")); - model.mm_2_w = get_tensor(string_format(TN_LLAVA_PROJ, 2, "weight")); - model.mm_2_b = get_tensor(string_format(TN_LLAVA_PROJ, 2, "bias")); - } break; case PROJECTOR_TYPE_KIMIVL: { model.mm_input_norm_w = get_tensor(TN_MM_INP_NORM); @@ -1724,17 +1576,6 @@ struct clip_model_loader { model.mm_1_w = get_tensor(string_format(TN_MM_AUDIO_MLP, 1, "weight")); model.mm_2_w = get_tensor(string_format(TN_MM_AUDIO_MLP, 2, "weight")); } break; - case PROJECTOR_TYPE_MUSIC_FLAMINGO: - { - model.conv1d_1_w = get_tensor(string_format(TN_CONV1D, 1, "weight")); - model.conv1d_1_b = get_tensor(string_format(TN_CONV1D, 1, "bias")); - model.conv1d_2_w = get_tensor(string_format(TN_CONV1D, 2, "weight")); - model.conv1d_2_b = get_tensor(string_format(TN_CONV1D, 2, "bias")); - model.mm_1_w = get_tensor(string_format(TN_MM_AUDIO_MLP, 1, "weight")); - model.mm_1_b = get_tensor(string_format(TN_MM_AUDIO_MLP, 1, "bias")); - model.mm_2_w = get_tensor(string_format(TN_MM_AUDIO_MLP, 2, "weight")); - model.mm_2_b = get_tensor(string_format(TN_MM_AUDIO_MLP, 2, "bias")); - } break; case PROJECTOR_TYPE_INTERNVL: { model.mm_0_w = get_tensor(string_format(TN_MVLM_PROJ_MLP, 0, "weight")); @@ -1756,8 +1597,8 @@ struct clip_model_loader { model.mm_2_b = get_tensor(string_format(TN_MM_AUDIO_MLP, 2, "bias")); model.mm_norm_pre_w = get_tensor(string_format(TN_MM_NORM_PRE, "weight")); model.mm_norm_pre_b = get_tensor(string_format(TN_MM_NORM_PRE, "bias")); - model.mm_boi = get_tensor(string_format(TN_TOK_BOI)); - model.mm_eoi = get_tensor(string_format(TN_TOK_EOI)); + model.mm_boi = get_tensor(string_format(TN_TOK_BOI, "weight")); + model.mm_eoi = get_tensor(string_format(TN_TOK_EOI, "weight")); } break; case PROJECTOR_TYPE_LLAMA4: { @@ -2107,7 +1948,6 @@ struct clip_init_result clip_init(const char * fname, struct clip_context_params try { clip_model_loader loader(fname); - bool skip_audio = false; if (loader.has_vision) { ctx_vision = new clip_ctx(ctx_params); @@ -2117,14 +1957,10 @@ struct clip_init_result clip_init(const char * fname, struct clip_context_params loader.warmup(*ctx_vision); } - // TODO: we don't support audio for Gemma 3N, but GGUF contains audio tensors - // we can remove this check when we implement audio support for Gemma 3N - skip_audio = ctx_vision->model.proj_type == PROJECTOR_TYPE_GEMMA3NV; - // clip_debug_encode(ctx_vision, 24*14, 24*14, 0.5f); } - if (loader.has_audio && !skip_audio) { + if (loader.has_audio) { ctx_audio = new clip_ctx(ctx_params); loader.load_hparams(ctx_audio->model, CLIP_MODALITY_AUDIO); loader.load_tensors(*ctx_audio); @@ -2848,57 +2684,6 @@ bool clip_image_preprocess(struct clip_ctx * ctx, const clip_image_u8 * img, str // res_imgs->data[0] = *res; res_imgs->entries.push_back(std::move(img_f32)); } break; - case PROJECTOR_TYPE_YOUTUVL: - { - const int patch_size = params.patch_size; // typically 16 - const int merge_size = params.n_merge; // typically 2 - const int align_size = patch_size * merge_size; // 32 - - const int max_num_patches = params.image_max_pixels > 0 ? - params.image_max_pixels / (patch_size * patch_size) : 256; - - // Linear search for optimal scale to fit within max_num_patches - float scale = 1.0f; - int target_height = original_size.height; - int target_width = original_size.width; - - auto get_scaled_image_size = [align_size](float scale, int size) -> int { - float scaled_size = size * scale; - // Round up to nearest multiple of align_size - int aligned = static_cast(std::ceil(scaled_size / align_size)) * align_size; - // Ensure at least one patch - return std::max(align_size, aligned); - }; - - // Linear search with 0.02 step size - while (scale > 0.0f) { - target_height = get_scaled_image_size(scale, original_size.height); - target_width = get_scaled_image_size(scale, original_size.width); - - int num_patches_h = target_height / patch_size; - int num_patches_w = target_width / patch_size; - int num_patches = num_patches_h * num_patches_w; - - if (num_patches > max_num_patches) { - scale -= 0.02f; - } else { - break; - } - } - - clip_image_size new_size = {target_width, target_height}; - - // Resize the image - clip_image_u8 resized; - img_tool::resize(*img, resized, new_size, img_tool::RESIZE_ALGO_BILINEAR, false); - - // Normalize to float32 - clip_image_f32_ptr img_f32(clip_image_f32_init()); - normalize_image_u8_to_f32(resized, *img_f32, params.image_mean, params.image_std); - - // Add to results - res_imgs->entries.push_back(std::move(img_f32)); - } break; case PROJECTOR_TYPE_IDEFICS3: { @@ -2962,16 +2747,6 @@ bool clip_image_preprocess(struct clip_ctx * ctx, const clip_image_u8 * img, str res_imgs->entries.push_back(std::move(img_f32)); } break; - case PROJECTOR_TYPE_GEMMA3NV: - { - clip_image_u8 resized_image; - int sz = params.image_size; - img_tool::resize(*img, resized_image, {sz, sz}, img_tool::RESIZE_ALGO_BILINEAR, false); - clip_image_f32_ptr img_f32(clip_image_f32_init()); - normalize_image_u8_to_f32(resized_image, *img_f32, params.image_mean, params.image_std); - res_imgs->entries.push_back(std::move(img_f32)); - } break; - case PROJECTOR_TYPE_JANUS_PRO: { // Janus Pro preprocessing: pad to square with gray(127), resize to 384x384 @@ -3141,7 +2916,6 @@ int clip_n_output_tokens_x(const struct clip_ctx * ctx, struct clip_image_f32 * case PROJECTOR_TYPE_QWEN25VL: case PROJECTOR_TYPE_QWEN3VL: case PROJECTOR_TYPE_GLM4V: - case PROJECTOR_TYPE_YOUTUVL: return (img->nx / params.patch_size) / 2; default: break; @@ -3157,7 +2931,6 @@ int clip_n_output_tokens_y(const struct clip_ctx * ctx, struct clip_image_f32 * case PROJECTOR_TYPE_QWEN25VL: case PROJECTOR_TYPE_QWEN3VL: case PROJECTOR_TYPE_GLM4V: - case PROJECTOR_TYPE_YOUTUVL: return (img->ny / params.patch_size) / 2; default: break; @@ -3218,7 +2991,6 @@ int clip_n_output_tokens(const struct clip_ctx * ctx, struct clip_image_f32 * im case PROJECTOR_TYPE_QWEN25VL: case PROJECTOR_TYPE_QWEN3VL: case PROJECTOR_TYPE_GLM4V: - case PROJECTOR_TYPE_YOUTUVL: { // dynamic size (2 conv, so double patch size) int x_patch = img->nx / (params.patch_size * 2); @@ -3234,12 +3006,6 @@ int clip_n_output_tokens(const struct clip_ctx * ctx, struct clip_image_f32 * im int scale_factor = ctx->model.hparams.n_merge; n_patches /= (scale_factor * scale_factor); } break; - case PROJECTOR_TYPE_GEMMA3NV: - { - // MobileNetV5 MSFA adapter always outputs fixed 16x16 resolution - // regardless of input size (see architecture description) - n_patches = ctx->model.hparams.image_size / ctx->model.hparams.patch_size; - } break; case PROJECTOR_TYPE_LFM2: case PROJECTOR_TYPE_KIMIVL: { @@ -3265,7 +3031,6 @@ int clip_n_output_tokens(const struct clip_ctx * ctx, struct clip_image_f32 * im case PROJECTOR_TYPE_VOXTRAL: case PROJECTOR_TYPE_ULTRAVOX: case PROJECTOR_TYPE_QWEN2A: - case PROJECTOR_TYPE_MUSIC_FLAMINGO: { n_patches = img->nx; @@ -3334,6 +3099,7 @@ bool clip_image_batch_encode(clip_ctx * ctx, const int n_threads, const clip_ima } // build the inference graph + ctx->debug_print_tensors.clear(); ggml_backend_sched_reset(ctx->sched.get()); ggml_cgraph * gf = clip_image_build_graph(ctx, imgs); ggml_backend_sched_alloc_graph(ctx->sched.get(), gf); @@ -3351,6 +3117,7 @@ bool clip_image_batch_encode(clip_ctx * ctx, const int n_threads, const clip_ima const int pos_w = image_size_width / patch_size; const int pos_h = image_size_height / patch_size; + const bool use_window_attn = hparams.n_wa_pattern > 0; // for qwen2.5vl auto get_inp_tensor = [&gf](const char * name) { ggml_tensor * inp = ggml_graph_get_tensor(gf, name); @@ -3499,11 +3266,9 @@ bool clip_image_batch_encode(clip_ctx * ctx, const int n_threads, const clip_ima set_input_i32("positions", positions); } break; case PROJECTOR_TYPE_QWEN25VL: - case PROJECTOR_TYPE_YOUTUVL: { // pw * ph = number of tokens output by ViT after apply patch merger // ipw * ipw = number of vision token been processed inside ViT - const bool use_window_attn = ctx->model.proj_type == PROJECTOR_TYPE_QWEN25VL ? hparams.n_wa_pattern > 0 : !hparams.wa_layer_indexes.empty(); const int merge_ratio = 2; const int pw = image_size_width / patch_size / merge_ratio; const int ph = image_size_height / patch_size / merge_ratio; @@ -3514,7 +3279,7 @@ bool clip_image_batch_encode(clip_ctx * ctx, const int n_threads, const clip_ima std::vector inv_idx(ph * pw); if (use_window_attn) { - const int attn_window_size = hparams.attn_window_size > 0 ? hparams.attn_window_size : 112; + const int attn_window_size = 112; const int grid_window = attn_window_size / patch_size / merge_ratio; int dst = 0; // [num_vision_tokens, num_vision_tokens] attention mask tensor @@ -3631,7 +3396,6 @@ bool clip_image_batch_encode(clip_ctx * ctx, const int n_threads, const clip_ima set_input_i32("patches", patches); } break; case PROJECTOR_TYPE_GEMMA3: - case PROJECTOR_TYPE_GEMMA3NV: case PROJECTOR_TYPE_IDEFICS3: case PROJECTOR_TYPE_INTERNVL: case PROJECTOR_TYPE_QWEN2A: @@ -3639,7 +3403,6 @@ bool clip_image_batch_encode(clip_ctx * ctx, const int n_threads, const clip_ima case PROJECTOR_TYPE_ULTRAVOX: case PROJECTOR_TYPE_LFM2: case PROJECTOR_TYPE_VOXTRAL: - case PROJECTOR_TYPE_MUSIC_FLAMINGO: case PROJECTOR_TYPE_JANUS_PRO: case PROJECTOR_TYPE_COGVLM: { @@ -3703,6 +3466,18 @@ bool clip_image_batch_encode(clip_ctx * ctx, const int n_threads, const clip_ima return false; } + // print debug nodes + if (ctx->debug_graph) { + LOG_INF("\n\n---\n\n"); + LOG_INF("\n\nDebug graph:\n\n"); + for (ggml_tensor * t : ctx->debug_print_tensors) { + std::vector data(ggml_nbytes(t)); + ggml_backend_tensor_get(t, data.data(), 0, ggml_nbytes(t)); + print_tensor_shape(t); + print_tensor_data(t, data.data(), 3); + } + } + // the last node is the embedding tensor ggml_tensor * embeddings = ggml_graph_node(gf, -1); @@ -3741,19 +3516,16 @@ int clip_n_mmproj_embd(const struct clip_ctx * ctx) { case PROJECTOR_TYPE_QWEN2VL: case PROJECTOR_TYPE_QWEN25VL: case PROJECTOR_TYPE_JANUS_PRO: - case PROJECTOR_TYPE_YOUTUVL: return ctx->model.mm_1_b->ne[0]; case PROJECTOR_TYPE_QWEN3VL: // main path + deepstack paths return ctx->model.mm_1_b->ne[0] * (1 + ctx->model.n_deepstack_layers); case PROJECTOR_TYPE_GEMMA3: - case PROJECTOR_TYPE_GEMMA3NV: return ctx->model.mm_input_proj_w->ne[0]; case PROJECTOR_TYPE_IDEFICS3: return ctx->model.projection->ne[1]; case PROJECTOR_TYPE_ULTRAVOX: case PROJECTOR_TYPE_VOXTRAL: - case PROJECTOR_TYPE_MUSIC_FLAMINGO: return ctx->model.mm_2_w->ne[1]; case PROJECTOR_TYPE_INTERNVL: return ctx->model.mm_3_w->ne[1]; @@ -3778,7 +3550,6 @@ int clip_n_mmproj_embd(const struct clip_ctx * ctx) { } int clip_is_minicpmv(const struct clip_ctx * ctx) { - // TODO: remove this function if (ctx->proj_type() == PROJECTOR_TYPE_MINICPMV) { return ctx->model.hparams.minicpmv_version; } @@ -3786,14 +3557,24 @@ int clip_is_minicpmv(const struct clip_ctx * ctx) { } bool clip_is_glm(const struct clip_ctx * ctx) { - // TODO: remove this function return ctx->proj_type() == PROJECTOR_TYPE_GLM_EDGE; } +bool clip_is_mrope(const struct clip_ctx * ctx) { + return ctx->proj_type() == PROJECTOR_TYPE_QWEN2VL + || ctx->proj_type() == PROJECTOR_TYPE_QWEN25VL + || ctx->proj_type() == PROJECTOR_TYPE_QWEN3VL + || ctx->proj_type() == PROJECTOR_TYPE_GLM4V; +} + bool clip_is_llava(const struct clip_ctx * ctx) { return ctx->model.hparams.has_llava_projector; } +bool clip_is_gemma3(const struct clip_ctx * ctx) { + return ctx->proj_type() == PROJECTOR_TYPE_GEMMA3; +} + bool clip_has_vision_encoder(const struct clip_ctx * ctx) { return ctx->model.modality == CLIP_MODALITY_VISION; } @@ -3803,16 +3584,10 @@ bool clip_has_audio_encoder(const struct clip_ctx * ctx) { } bool clip_has_whisper_encoder(const struct clip_ctx * ctx) { - switch (ctx->proj_type()) { - case PROJECTOR_TYPE_ULTRAVOX: - case PROJECTOR_TYPE_QWEN2A: - case PROJECTOR_TYPE_GLMA: - case PROJECTOR_TYPE_VOXTRAL: - case PROJECTOR_TYPE_MUSIC_FLAMINGO: - return true; - default: - return false; - } + return ctx->proj_type() == PROJECTOR_TYPE_ULTRAVOX + || ctx->proj_type() == PROJECTOR_TYPE_QWEN2A + || ctx->proj_type() == PROJECTOR_TYPE_GLMA + || ctx->proj_type() == PROJECTOR_TYPE_VOXTRAL; } bool clip_encode_float_image (struct clip_ctx * ctx, int n_threads, float * img, int h, int w, float * vec) { @@ -3854,6 +3629,7 @@ const clip_hparams * clip_get_hparams(const struct clip_ctx * ctx) { // // API for debugging // + void clip_debug_encode(clip_ctx * ctx, int h, int w, float fill_value) { clip_image_f32 img; img.nx = w; @@ -3862,6 +3638,9 @@ void clip_debug_encode(clip_ctx * ctx, int h, int w, float fill_value) { for (int i = 0; i < h * w * 3; i++) { img.buf[i] = static_cast(fill_value); } + bool cur_debug_graph = ctx->debug_graph; + ctx->debug_graph = true; clip_image_encode(ctx, 1, &img, nullptr); + ctx->debug_graph = cur_debug_graph; GGML_ASSERT(img.buf.empty() && "expected, always stop here"); } diff --git a/tools/mtmd/clip.h b/tools/mtmd/clip.h index 71b5848..68a0d6e 100644 --- a/tools/mtmd/clip.h +++ b/tools/mtmd/clip.h @@ -1,7 +1,6 @@ #pragma once #include "ggml.h" -#include "mtmd.h" #include #include @@ -38,8 +37,6 @@ struct clip_context_params { int image_min_tokens; int image_max_tokens; bool warmup; - ggml_backend_sched_eval_callback cb_eval; - void * cb_eval_user_data; }; struct clip_init_result { @@ -107,9 +104,9 @@ bool clip_image_batch_encode(struct clip_ctx * ctx, int n_threads, const struct int clip_is_minicpmv(const struct clip_ctx * ctx); bool clip_is_glm(const struct clip_ctx * ctx); +bool clip_is_mrope(const struct clip_ctx * ctx); bool clip_is_llava(const struct clip_ctx * ctx); -// note for contributor: this clip_is_(model) pattern is deprecated -// do NOT add new functions like this +bool clip_is_gemma3(const struct clip_ctx * ctx); bool clip_encode_float_image (struct clip_ctx * ctx, int n_threads, float * img, int h, int w, float * vec); diff --git a/tools/mtmd/models/mobilenetv5.cpp b/tools/mtmd/models/mobilenetv5.cpp deleted file mode 100644 index 593afa1..0000000 --- a/tools/mtmd/models/mobilenetv5.cpp +++ /dev/null @@ -1,451 +0,0 @@ -#include "models.h" - -// Helpers for MobileNetV5 Blocks -// RMS Norm 2D - normalizes over channels for each spatial position -ggml_tensor * clip_graph_mobilenetv5::rms_norm_2d(ggml_tensor * inp, ggml_tensor * weight, float eps) { - // inp: [W, H, C, B] - - ggml_tensor * cur = ggml_permute(ctx0, inp, 2, 1, 0, 3); - cur = ggml_cont(ctx0, cur); - cur = ggml_rms_norm(ctx0, cur, eps); - - if (weight) { - cur = ggml_mul(ctx0, cur, weight); - } - - cur = ggml_permute(ctx0, cur, 2, 1, 0, 3); - cur = ggml_cont(ctx0, cur); - - return cur; -} - -// Conv2dSame padding - asymmetric SAME padding like PyTorch/TF -ggml_tensor* clip_graph_mobilenetv5::pad_same_2d(ggml_tensor* inp, int kernel_h, int kernel_w, int stride_h, int stride_w, int dilation_h, int dilation_w) { - const int64_t ih = inp->ne[1]; // height - const int64_t iw = inp->ne[0]; // width - - // Calculate output size (ceil division) - const int64_t oh = (ih + stride_h - 1) / stride_h; - const int64_t ow = (iw + stride_w - 1) / stride_w; - - // Calculate padding needed - const int64_t pad_h = std::max((int64_t)0, (oh - 1) * stride_h + (kernel_h - 1) * dilation_h + 1 - ih); - const int64_t pad_w = std::max((int64_t)0, (ow - 1) * stride_w + (kernel_w - 1) * dilation_w + 1 - iw); - - // Split padding asymmetrically - const int pad_h_top = pad_h / 2; - const int pad_h_bottom = pad_h - pad_h_top; - const int pad_w_left = pad_w / 2; - const int pad_w_right = pad_w - pad_w_left; - - // Apply padding if needed - // ggml_pad_ext: (ctx, tensor, lp0, rp0, lp1, rp1, lp2, rp2, lp3, rp3) - // For [W, H, C, B]: p0=width, p1=height, p2=channels, p3=batch - if (pad_h > 0 || pad_w > 0) { - inp = ggml_pad_ext(ctx0, inp, - pad_w_left, pad_w_right, // width padding (dim 0) - pad_h_top, pad_h_bottom, // height padding (dim 1) - 0, 0, // no channel padding (dim 2) - 0, 0); // no batch padding (dim 3) - } - - return inp; -} - - -// Edge Residual Block (Stage 0) -ggml_tensor * clip_graph_mobilenetv5::build_edge_residual(ggml_tensor * inp, const mobilenetv5_block & block, int stride) { - ggml_tensor * cur = inp; - - // 1. Expansion Conv (3x3) - if (stride == 2) { - // Case: Downsampling (Block 0) - // Replicates Conv2dSame(kernel=3, stride=2) - cur = pad_same_2d(cur, 3, 3, stride, stride); - cur = ggml_conv_2d_direct(ctx0, block.s0_conv_exp_w, cur, stride, stride, 0, 0, 1, 1); - } else { - // Case: Normal 3x3 Block (Block 1, 2) - // Replicates Conv2d(kernel=3, stride=1, padding=1) - cur = ggml_conv_2d_direct(ctx0, block.s0_conv_exp_w, cur, stride, stride, 1, 1, 1, 1); - } - - // BN + Activation - if (block.s0_bn1_w) cur = rms_norm_2d(cur, block.s0_bn1_w); - cur = ggml_gelu(ctx0, cur); - - // 2. Pointwise Linear Conv (1x1) - // 1x1 Convs usually have padding=0 and stride=1 - cur = ggml_conv_2d_direct(ctx0, block.s0_conv_pwl_w, cur, 1, 1, 0, 0, 1, 1); - if (block.s0_bn2_w) cur = rms_norm_2d(cur, block.s0_bn2_w); - - // 3. Residual Connection - // Only apply residual if spatial dimensions and channels match (stride 1) - if (stride == 1 && inp->ne[2] == cur->ne[2] && inp->ne[0] == cur->ne[0]) { - cur = ggml_add(ctx0, cur, inp); - } - - return cur; -} - -// Universal Inverted Residual Block (Stage 1+) -ggml_tensor * clip_graph_mobilenetv5::build_inverted_residual(ggml_tensor * inp, const mobilenetv5_block & block, int stride) { - ggml_tensor * cur = inp; - - // 1. Depthwise Start (Optional) - // NOTE: dw_start always has stride=1 (no downsampling here) - if (block.dw_start_w) { - int k = block.dw_start_w->ne[0]; // 3 or 5 - int p = k / 2; - cur = ggml_conv_2d_dw(ctx0, block.dw_start_w, cur, 1, 1, p, p, 1, 1); - if (block.dw_start_bn_w) cur = rms_norm_2d(cur, block.dw_start_bn_w); - } - - // 2. Pointwise Expansion (1x1) - if (block.pw_exp_w) { - // Standard 1x1 conv, pad=0, stride=1 - cur = ggml_conv_2d_direct(ctx0, block.pw_exp_w, cur, 1, 1, 0, 0, 1, 1); - if (block.pw_exp_bn_w) cur = rms_norm_2d(cur, block.pw_exp_bn_w); - cur = ggml_gelu(ctx0, cur); - } - - // 3. Depthwise Mid (Optional) - // NOTE: dw_mid is where downsampling happens (stride=2 for first block of stage) - if (block.dw_mid_w) { - int k = block.dw_mid_w->ne[0]; // 3 or 5 - - if (stride > 1) { - // Case: Stride 2 (Downsample) -> Use Asymmetric "Same" Padding - cur = pad_same_2d(cur, k, k, stride, stride); - cur = ggml_conv_2d_dw(ctx0, block.dw_mid_w, cur, stride, stride, 0, 0, 1, 1); // pad=0 - } else { - // Case: Stride 1 -> Use Standard Symmetric Padding - int p = k / 2; - cur = ggml_conv_2d_dw(ctx0, block.dw_mid_w, cur, stride, stride, p, p, 1, 1); - } - - if (block.dw_mid_bn_w) cur = rms_norm_2d(cur, block.dw_mid_bn_w); - cur = ggml_gelu(ctx0, cur); - } - - // 4. Pointwise Projection (1x1) - if (block.pw_proj_w) { - cur = ggml_conv_2d_direct(ctx0, block.pw_proj_w, cur, 1, 1, 0, 0, 1, 1); - if (block.pw_proj_bn_w) cur = rms_norm_2d(cur, block.pw_proj_bn_w); - } - - // Apply Layer Scaling if present - if (block.layer_scale_w) { - cur = ggml_mul(ctx0, cur, block.layer_scale_w); - } - - // 5. Residual Connection - bool same_spatial = (inp->ne[0] == cur->ne[0]) && (inp->ne[1] == cur->ne[1]); - bool same_channel = (inp->ne[2] == cur->ne[2]); - if (same_spatial && same_channel) { - cur = ggml_add(ctx0, cur, inp); - } - - return cur; -} - -// Attention Block (MQA) -ggml_tensor * clip_graph_mobilenetv5::build_mobilenet_attn(ggml_tensor * inp, const mobilenetv5_block & block) { - ggml_tensor * cur = inp; - - // Norm - if (block.attn_norm_w) { - cur = rms_norm_2d(cur, block.attn_norm_w, 1e-6f); - } - - // 1. Q Calculation - ggml_tensor * q = ggml_conv_2d_direct(ctx0, block.attn_q_w, cur, 1, 1, 0, 0, 1, 1); - - // 2. K Calculation (Downsampled) - // Uses Conv2dSame(640, 640, kernel_size=(3, 3), stride=(2, 2), groups=640) - ggml_tensor * k_inp = cur; - if (block.attn_k_dw_w) { - int k_size = block.attn_k_dw_w->ne[0]; // Usually 3 - k_inp = pad_same_2d(cur, k_size, k_size, 2, 2); // Apply SAME padding - k_inp = ggml_conv_2d_dw(ctx0, block.attn_k_dw_w, k_inp, 2, 2, 0, 0, 1, 1); // padding=0 - if (block.attn_k_norm_w) { - k_inp = rms_norm_2d(k_inp, block.attn_k_norm_w, 1e-6f); - } - } - ggml_tensor * k = ggml_conv_2d_direct(ctx0, block.attn_k_w, k_inp, 1, 1, 0, 0, 1, 1); - - // 3. V Calculation (Downsampled) - // Uses Conv2dSame(640, 640, kernel_size=(3, 3), stride=(2, 2), groups=640) - ggml_tensor * v_inp = cur; - if (block.attn_v_dw_w) { - int v_size = block.attn_v_dw_w->ne[0]; // Usually 3 - v_inp = pad_same_2d(cur, v_size, v_size, 2, 2); // Apply SAME padding - v_inp = ggml_conv_2d_dw(ctx0, block.attn_v_dw_w, v_inp, 2, 2, 0, 0, 1, 1); // padding=0 - if (block.attn_v_norm_w) { - v_inp = rms_norm_2d(v_inp, block.attn_v_norm_w, 1e-6f); - } - } - ggml_tensor * v = ggml_conv_2d_direct(ctx0, block.attn_v_w, v_inp, 1, 1, 0, 0, 1, 1); - - const int W = cur->ne[0]; const int H = cur->ne[1]; const int B = cur->ne[3]; - const int D = k->ne[2]; // Head dimension - const int n_head = q->ne[2] / D; - const int N = W * H; - - // Process Q: [W, H, D*n_head, B] -> [D, N, n_head, B] - q = ggml_reshape_3d(ctx0, q, N, D*n_head, B); - q = ggml_reshape_4d(ctx0, q, N, D, n_head, B); - q = ggml_permute(ctx0, q, 1, 0, 2, 3); // [D, N, n_head, B] - q = ggml_cont(ctx0, q); - - const int Wk = k->ne[0]; const int Hk = k->ne[1]; - const int M = Wk * Hk; - - // Process K: [Wk, Hk, D, B] -> [D, M, 1, B] - k = ggml_reshape_3d(ctx0, k, M, D, B); - k = ggml_reshape_4d(ctx0, k, M, D, 1, B); - k = ggml_permute(ctx0, k, 1, 0, 2, 3); // [D, M, 1, B] - k = ggml_cont(ctx0, k); - - // Process V: [Wk, Hk, D, B] -> [M, D, 1, B] - v = ggml_reshape_3d(ctx0, v, M, D, B); - v = ggml_reshape_4d(ctx0, v, M, D, 1, B); - v = ggml_cont(ctx0, v); // [M, D, 1, B] - - // Multi-Query Attention - float scale = 1.0f / sqrtf((float)D); - - // Step 1: Compute Q @ K.T - ggml_tensor * scores = ggml_mul_mat(ctx0, k, q); - - scores = ggml_scale(ctx0, scores, scale); - - scores = ggml_soft_max(ctx0, scores); - - ggml_tensor * kqv = ggml_mul_mat(ctx0, v, scores); - - kqv = ggml_permute(ctx0, kqv, 1, 0, 2, 3); - kqv = ggml_cont(ctx0, kqv); - - - kqv = ggml_reshape_3d(ctx0, kqv, N, D * n_head, B); - kqv = ggml_reshape_4d(ctx0, kqv, W, H, D * n_head, B); - kqv = ggml_cont(ctx0, kqv); - - // Output projection - cur = ggml_conv_2d_direct(ctx0, block.attn_o_w, kqv, 1, 1, 0, 0, 1, 1); - - // Residual & Layer Scale - if (inp->ne[0] == cur->ne[0] && inp->ne[2] == cur->ne[2]) { - if (block.layer_scale_w) { - cur = ggml_mul(ctx0, cur, block.layer_scale_w); - } - cur = ggml_add(ctx0, cur, inp); - } - - return cur; -} - -ggml_cgraph * clip_graph_mobilenetv5::build() { - ggml_tensor * inp = build_inp_raw(); - - // 1. Stem - Conv2dSame(3, 64, kernel_size=(3, 3), stride=(2, 2)) - ggml_tensor * cur = pad_same_2d(inp, 3, 3, 2, 2); // Apply SAME padding - - cur = ggml_conv_2d_direct(ctx0, model.mobilenet_stem_conv_w, cur, 2, 2, 0, 0, 1, 1); // padding=0 - if (model.mobilenet_stem_conv_b) { - cur = ggml_add(ctx0, cur, model.mobilenet_stem_conv_b); - } - if (model.mobilenet_stem_norm_w) cur = rms_norm_2d(cur, model.mobilenet_stem_norm_w); - cur = ggml_gelu(ctx0, cur); - - - // 2. Blocks - std::vector intermediate_features; - const int total_blocks = model.mobilenet_blocks.size(); - - auto is_stage_start = [&](int i) { - if (i == 0) return true; - for (int end_idx : model.mobilenet_stage_ends) { - if (i == end_idx + 1) return true; - } - return false; - }; - - auto is_fusion_point = [&](int i) { - if (model.mobilenet_stage_ends.size() >= 4) { - if (i == model.mobilenet_stage_ends[2]) return true; // End of Stage 2 - if (i == model.mobilenet_stage_ends[3]) return true; // End of Stage 3 - } else { - if (i == total_blocks - 1) return true; - } - return false; - }; - - for (int i = 0; i < total_blocks; i++) { - const auto & block = model.mobilenet_blocks[i]; - int stride = is_stage_start(i) ? 2 : 1; - - if (block.s0_conv_exp_w) cur = build_edge_residual(cur, block, stride); - else if (block.attn_q_w) cur = build_mobilenet_attn(cur, block); - else cur = build_inverted_residual(cur, block, stride); - - if (is_fusion_point(i)) { - - intermediate_features.push_back(cur); - } - } - - // 3. Multi-Scale Fusion Adapter (MSFA) - if (!intermediate_features.empty()) { - - // A. Reference Resolution: PyTorch implementation uses inputs[0] - // We assume intermediate_features[0] is the "High Resolution" target. - // In MobileNet designs, this is typically the feature map with the smallest stride (e.g. 32x32). - ggml_tensor* target_feat = intermediate_features[0]; - int high_res_w = target_feat->ne[0]; - int high_res_h = target_feat->ne[1]; - - std::vector resized_feats; - - // B. Resize inputs to match inputs[0] (High Resolution) - for (auto feat : intermediate_features) { - int feat_w = feat->ne[0]; - int feat_h = feat->ne[1]; - - // PyTorch: if feat_size < high_resolution: interpolate - if (feat_w < high_res_w || feat_h < high_res_h) { - // Calculate scale factor. - // Note: PyTorch 'nearest' works on arbitrary float scales. - // ggml_upscale generally takes integer factors or target sizes depending on helper. - // Assuming standard power-of-2 scaling (e.g. 16 -> 32 means scale=2). - int scale_w = high_res_w / feat_w; - // int scale_h = high_res_h / feat_h; - - // Safety check for non-integer scaling if strictly replicating - GGML_ASSERT(high_res_w % feat_w == 0); - - // Upsample (Nearest Neighbor) - // 2 is the scale factor - feat = ggml_upscale(ctx0, feat, scale_w, ggml_scale_mode::GGML_SCALE_MODE_NEAREST); - } - resized_feats.push_back(feat); - } - - // C. Concatenate at High Resolution (Channel Dim = 2 in ggml) - cur = resized_feats[0]; - for (size_t k = 1; k < resized_feats.size(); ++k) { - cur = ggml_concat(ctx0, cur, resized_feats[k], 2); - } - - // D. FFN (UniversalInvertedResidual) - // Structure: Expand Conv -> Norm -> GELU -> Project Conv -> Norm - - // 1. Expansion - if (model.msfa_ffn_expand_w) { - // 1x1 Conv - cur = ggml_conv_2d_direct(ctx0, model.msfa_ffn_expand_w, cur, 1, 1, 0, 0, 1, 1); - - if (model.msfa_ffn_expand_bn) { - cur = rms_norm_2d(cur, model.msfa_ffn_expand_bn); - } - - cur = ggml_gelu(ctx0, cur); - - } - - // 2. Projection (No DW because kernel_size=0) - if (model.msfa_ffn_project_w) { - // 1x1 Conv - cur = ggml_conv_2d_direct(ctx0, model.msfa_ffn_project_w, cur, 1, 1, 0, 0, 1, 1); - - // UniversalInvertedResidual typically has a norm after projection - if (model.msfa_ffn_project_bn) { - cur = rms_norm_2d(cur, model.msfa_ffn_project_bn); - } - - } - - // E. Final Downsample to Target Resolution (Output Resolution) - // PyTorch: matches self.output_resolution (e.g. 16x16) - const int target_out_res = 16; - int current_w = cur->ne[0]; - - if (current_w > target_out_res) { - int s = current_w / target_out_res; - - GGML_ASSERT(current_w % target_out_res == 0); - - // Avg Pool: Kernel=s, Stride=s - cur = ggml_pool_2d(ctx0, cur, GGML_OP_POOL_AVG, s, s, s, s, 0, 0); - - } - - // F. Final Norm - if (model.msfa_concat_norm_w) { - cur = rms_norm_2d(cur, model.msfa_concat_norm_w); - - } - } - - // 4. Gemma 3n Multimodal Projection (Embedder) - // Input: 'cur' is [Width, Height, Channels, Batch] - int W = cur->ne[0]; - int H = cur->ne[1]; - int C = cur->ne[2]; - int B = cur->ne[3]; - - GGML_ASSERT(C == hparams.n_embd); - - // 1. Permute and Flatten to [Channels, Tokens, Batch] - // PyTorch expects (Batch, Seq, Hidden), GGML usually processes (Hidden, Seq, Batch) - cur = ggml_permute(ctx0, cur, 2, 1, 0, 3); // -> [C, H, W, B] - cur = ggml_permute(ctx0, cur, 0, 2, 1, 3); // -> [C, W, H, B] - cur = ggml_cont(ctx0, cur); - cur = ggml_reshape_3d(ctx0, cur, C, W*H, B); - cur = ggml_cont(ctx0, cur); - - - // 2. FEATURE SCALING - // PyTorch: vision_outputs *= self.config.vision_config.hidden_size**0.5 - const float scale_factor = sqrtf((float)C); - cur = ggml_scale(ctx0, cur, scale_factor); - - - // 3. SOFT EMBEDDING NORM - // PyTorch: self._norm(x) * self.weight - // We must normalize regardless, then multiply if weight exists. - { - const float eps = 1e-6f; // Gemma3n uses 1e-6 - cur = ggml_rms_norm(ctx0, cur, eps); - - if (model.mm_soft_emb_norm_w) { - // Weight shape is (2048,) -> Element-wise broadcast multiply - cur = ggml_mul(ctx0, cur, model.mm_soft_emb_norm_w); - } - - } - - // 4. PROJECTION - // PyTorch: embedding_projection = nn.Linear(vision_hidden, text_hidden, bias=False) - // Weight stored as [out_features, in_features] = [text_hidden_size, vision_hidden_size] - if (model.mm_input_proj_w) { - cur = ggml_mul_mat(ctx0, model.mm_input_proj_w, cur); - } - - // 5. POST PROJECTION NORM - // PyTorch: embedding_post_projection_norm = Gemma3nRMSNorm(..., with_scale=False) - // with_scale=False means weight is registered as buffer with value 1.0 - // So output = rms_norm(x) * 1.0 = rms_norm(x), magnitude ~1 - { - const float eps = 1e-6f; - cur = ggml_rms_norm(ctx0, cur, eps); - - if (model.mm_post_proj_norm_w) { - // If weight is loaded, multiply (should be ~1.0 anyway) - cur = ggml_mul(ctx0, cur, model.mm_post_proj_norm_w); - } - } - - ggml_build_forward_expand(gf, cur); - return gf; -} diff --git a/tools/mtmd/models/models.h b/tools/mtmd/models/models.h index 9970980..8d6d4ef 100644 --- a/tools/mtmd/models/models.h +++ b/tools/mtmd/models/models.h @@ -2,11 +2,6 @@ #include "../clip-graph.h" -/* - * IMPORTANT: The mtmd module does NOT accept pull requests that are fully or predominantly AI-generated. - * We encourage human contributors to ensure the quality and reliability of the codebase. - */ - struct clip_graph_siglip : clip_graph { clip_graph_siglip(clip_ctx * ctx, const clip_image_f32 & img) : clip_graph(ctx, img) {} ggml_cgraph * build() override; @@ -27,11 +22,6 @@ struct clip_graph_qwen3vl : clip_graph { ggml_cgraph * build() override; }; -struct clip_graph_youtuvl : clip_graph { - clip_graph_youtuvl(clip_ctx * ctx, const clip_image_f32 & img) : clip_graph(ctx, img) {} - ggml_cgraph * build() override; -}; - struct clip_graph_minicpmv : clip_graph { clip_graph_minicpmv(clip_ctx * ctx, const clip_image_f32 & img) : clip_graph(ctx, img) {} ggml_cgraph * build() override; @@ -76,36 +66,3 @@ struct clip_graph_glm4v : clip_graph { clip_graph_glm4v(clip_ctx * ctx, const clip_image_f32 & img) : clip_graph(ctx, img) {} ggml_cgraph * build() override; }; - -struct clip_graph_mobilenetv5 : clip_graph { - clip_graph_mobilenetv5(clip_ctx * ctx, const clip_image_f32 & img) : clip_graph(ctx, img) {} - ggml_cgraph * build() override; - - ggml_tensor * rms_norm_2d( - ggml_tensor * inp, - ggml_tensor * weight, - float eps = 1e-6f); - - ggml_tensor* pad_same_2d( - ggml_tensor* inp, - int kernel_h, - int kernel_w, - int stride_h, - int stride_w, - int dilation_h = 1, - int dilation_w = 1); - - ggml_tensor * build_edge_residual( - ggml_tensor * inp, - const mobilenetv5_block & block, - int stride); - - ggml_tensor * build_inverted_residual( - ggml_tensor * inp, - const mobilenetv5_block & block, - int stride); - - ggml_tensor * build_mobilenet_attn( - ggml_tensor * inp, - const mobilenetv5_block & block); -}; diff --git a/tools/mtmd/models/siglip.cpp b/tools/mtmd/models/siglip.cpp index b866a11..ef094cf 100644 --- a/tools/mtmd/models/siglip.cpp +++ b/tools/mtmd/models/siglip.cpp @@ -50,15 +50,10 @@ ggml_cgraph * clip_graph_siglip::build() { const int scale_factor = model.hparams.n_merge; cur = build_patch_merge_permute(cur, scale_factor); - // projection, in LFM2-VL input norm is optional - if (model.mm_input_norm_w) { - cur = ggml_norm(ctx0, cur, 1e-5); // default nn.LayerNorm - cur = ggml_mul(ctx0, cur, model.mm_input_norm_w); - } - - if (model.mm_input_norm_b) { - cur = ggml_add(ctx0, cur, model.mm_input_norm_b); - } + // projection + cur = ggml_norm(ctx0, cur, 1e-5); // default nn.LayerNorm + cur = ggml_mul(ctx0, cur, model.mm_input_norm_w); + cur = ggml_add(ctx0, cur, model.mm_input_norm_b); cur = build_ffn(cur, model.mm_1_w, model.mm_1_b, diff --git a/tools/mtmd/models/whisper-enc.cpp b/tools/mtmd/models/whisper-enc.cpp index 2f2b127..2870d85 100644 --- a/tools/mtmd/models/whisper-enc.cpp +++ b/tools/mtmd/models/whisper-enc.cpp @@ -86,15 +86,6 @@ ggml_cgraph * clip_graph_whisper_enc::build() { FFN_GELU_ERF, -1); - } else if (proj_type == PROJECTOR_TYPE_MUSIC_FLAMINGO) { - // projector - cur = build_ffn(cur, - model.mm_1_w, model.mm_1_b, - nullptr, nullptr, - model.mm_2_w, model.mm_2_b, - FFN_GELU_ERF, - -1); - } else if (proj_type == PROJECTOR_TYPE_GLMA) { cur = ggml_norm(ctx0, cur, hparams.eps); cur = ggml_mul(ctx0, cur, model.mm_norm_pre_w); diff --git a/tools/mtmd/models/youtuvl.cpp b/tools/mtmd/models/youtuvl.cpp deleted file mode 100644 index ffbf2be..0000000 --- a/tools/mtmd/models/youtuvl.cpp +++ /dev/null @@ -1,179 +0,0 @@ -#include "models.h" - -ggml_cgraph * clip_graph_youtuvl::build() { - GGML_ASSERT(model.class_embedding == nullptr); - const int batch_size = 1; - const bool use_window_attn = !hparams.wa_layer_indexes.empty(); - const int n_pos = n_patches; - const int num_position_ids = n_pos * 4; - const int m = 2; - const int Wp = n_patches_x; - const int Hp = n_patches_y; - const int Hm = Hp / m; - const int Wm = Wp / m; - norm_type norm_t = NORM_TYPE_NORMAL; - - int mrope_sections[4] = {d_head/4, d_head/4, d_head/4, d_head/4}; - - ggml_tensor * inp = build_inp_raw(); - - // change conv3d to linear - // reshape and permute to get patches, permute from (patch_size, m, Wm, patch_size, m, Hm, C) to (C, patch_size, patch_size, m, m, Wm, Hm) - { - inp = ggml_reshape_4d( - ctx0, inp, - Wm * m * patch_size, m * patch_size, Hm, 3); - inp = ggml_permute(ctx0, inp, 1, 2, 3, 0); - inp = ggml_cont_4d( - ctx0, inp, - m * patch_size * 3, Wm, m * patch_size, Hm); - - inp = ggml_permute(ctx0, inp, 0, 2, 1, 3); - inp = ggml_cont_4d( - ctx0, inp, - m * patch_size * 3, patch_size, m, Hm * Wm); - - inp = ggml_permute(ctx0, inp, 1, 0, 2, 3); - inp = ggml_cont_4d( - ctx0, inp, - patch_size, 3, patch_size, Hm * Wm * m * m); - - inp = ggml_permute(ctx0, inp, 2, 0, 1, 3); - inp = ggml_cont_3d( - ctx0, inp, - 3*patch_size* patch_size, Hm * Wm * m * m, 1); - } - inp = ggml_mul_mat(ctx0, model.patch_embeddings_0, inp); - - if (model.patch_bias) { - inp = ggml_add(ctx0, inp, model.patch_bias); - } - - inp = ggml_reshape_2d(ctx0, inp, n_embd, n_patches); - - ggml_tensor * inpL = inp; - ggml_tensor * window_mask = nullptr; - ggml_tensor * window_idx = nullptr; - ggml_tensor * inv_window_idx = nullptr; - - ggml_tensor * positions = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, num_position_ids); - ggml_set_name(positions, "positions"); - ggml_set_input(positions); - - // pre-layernorm - if (model.pre_ln_w) { - inpL = build_norm(inpL, model.pre_ln_w, model.pre_ln_b, norm_t, eps, -1); - } - if (use_window_attn) { - inv_window_idx = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, n_pos / 4); - ggml_set_name(inv_window_idx, "inv_window_idx"); - ggml_set_input(inv_window_idx); - // mask for window attention - window_mask = ggml_new_tensor_2d(ctx0, GGML_TYPE_F32, n_pos, n_pos); - ggml_set_name(window_mask, "window_mask"); - ggml_set_input(window_mask); - - // if flash attn is used, we need to pad the mask and cast to f16 - if (flash_attn_type == CLIP_FLASH_ATTN_TYPE_ENABLED) { - window_mask = ggml_cast(ctx0, window_mask, GGML_TYPE_F16); - } - - // inpL shape: [n_embd, n_patches_x * n_patches_y, batch_size] - GGML_ASSERT(batch_size == 1); - inpL = ggml_reshape_2d(ctx0, inpL, n_embd * 4, n_patches_x * n_patches_y * batch_size / 4); - inpL = ggml_get_rows(ctx0, inpL, inv_window_idx); - inpL = ggml_reshape_3d(ctx0, inpL, n_embd, n_patches_x * n_patches_y, batch_size); - } - - // loop over layers - for (int il = 0; il < n_layer; il++) { - const auto & layer = model.layers[il]; - const bool full_attn = use_window_attn ? hparams.wa_layer_indexes.count(il) > 0 : true; - - ggml_tensor * cur = inpL; // inpL = residual, cur = hidden_states - - // layernorm1 - cur = build_norm(cur, layer.ln_1_w, layer.ln_1_b, norm_t, eps, il); - // self-attention - { - ggml_tensor * Qcur = ggml_add(ctx0, - ggml_mul_mat(ctx0, layer.q_w, cur), layer.q_b); - ggml_tensor * Kcur = ggml_add(ctx0, - ggml_mul_mat(ctx0, layer.k_w, cur), layer.k_b); - ggml_tensor * Vcur = ggml_add(ctx0, - ggml_mul_mat(ctx0, layer.v_w, cur), layer.v_b); - - Qcur = ggml_reshape_3d(ctx0, Qcur, d_head, n_head, n_patches); - Kcur = ggml_reshape_3d(ctx0, Kcur, d_head, n_head, n_patches); - Vcur = ggml_reshape_3d(ctx0, Vcur, d_head, n_head, n_patches); - - Qcur = ggml_rope_multi( - ctx0, Qcur, positions, nullptr, - d_head/2, mrope_sections, GGML_ROPE_TYPE_VISION, 32768, 10000, 1, 0, 1, 32, 1); - Kcur = ggml_rope_multi( - ctx0, Kcur, positions, nullptr, - d_head/2, mrope_sections, GGML_ROPE_TYPE_VISION, 32768, 10000, 1, 0, 1, 32, 1); - - ggml_tensor * attn_mask = full_attn ? nullptr : window_mask; - - cur = build_attn(layer.o_w, layer.o_b, - Qcur, Kcur, Vcur, attn_mask, kq_scale, il); - } - // re-add the layer input, e.g., residual - cur = ggml_add(ctx0, cur, inpL); - - inpL = cur; // inpL = residual, cur = hidden_states - - // layernorm2 - cur = build_norm(cur, layer.ln_2_w, layer.ln_2_b, norm_t, eps, il); - - // ffn - cur = build_ffn(cur, - layer.ff_up_w, layer.ff_up_b, - nullptr, nullptr, - layer.ff_down_w, layer.ff_down_b, - hparams.ffn_op, il); - - // residual 2 - cur = ggml_add(ctx0, inpL, cur); - - inpL = cur; - } - - ggml_tensor * embeddings = inpL; - if (use_window_attn) { - const int spatial_merge_unit = 4; - window_idx = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, n_pos / spatial_merge_unit); - ggml_set_name(window_idx, "window_idx"); - ggml_set_input(window_idx); - GGML_ASSERT(batch_size == 1); - embeddings = ggml_reshape_2d(ctx0, embeddings, n_embd * spatial_merge_unit, n_patches / spatial_merge_unit); - embeddings = ggml_get_rows(ctx0, embeddings, window_idx); - embeddings = ggml_reshape_3d(ctx0, embeddings, n_embd, n_patches, batch_size); - cb(embeddings, "window_order_restored", -1); - } - - // post-layernorm (part of Siglip2VisionTransformer, applied after encoder) - if (model.post_ln_w) { - embeddings = build_norm(embeddings, model.post_ln_w, model.post_ln_b, norm_t, eps, n_layer); - } - - // Now apply merger (VLPatchMerger): - // 1. Apply RMS norm (ln_q in VLPatchMerger) - embeddings = build_norm(embeddings, model.mm_input_norm_w, nullptr, NORM_TYPE_RMS, 1e-6, -1); - cb(embeddings, "merger_normed", -1); - - // 2. First reshape for spatial merge (merge 2x2 patches) - embeddings = ggml_reshape_3d(ctx0, embeddings, n_embd * 4, n_pos / 4, batch_size); - cb(embeddings, "merger_reshaped", -1); - - embeddings = build_ffn(embeddings, - model.mm_0_w, model.mm_0_b, - nullptr, nullptr, - model.mm_1_w, model.mm_1_b, - FFN_GELU, - -1); - ggml_build_forward_expand(gf, embeddings); - - return gf; -} diff --git a/tools/mtmd/mtmd-audio.cpp b/tools/mtmd/mtmd-audio.cpp index e8eef03..e991011 100644 --- a/tools/mtmd/mtmd-audio.cpp +++ b/tools/mtmd/mtmd-audio.cpp @@ -9,250 +9,207 @@ #include #include -// some of the code here is copied from whisper.cpp +// most of the code here is copied from whisper.cpp constexpr bool DEBUG = false; -void mtmd_audio_cache::fill_sin_cos_table(int n) { - sin_vals.resize(n); - cos_vals.resize(n); - for (int i = 0; i < n; i++) { - double theta = (2 * M_PI * i) / n; - sin_vals[i] = sinf(theta); - cos_vals[i] = cosf(theta); - } -} +struct mtmd_audio_mel_filters { + int32_t n_mel; + int32_t n_fft; -void mtmd_audio_cache::fill_hann_window(int length, bool periodic) { - hann_window.resize(length); - int offset = -1; - if (periodic) { - offset = 0; - } - for (int i = 0; i < length; i++) { - hann_window[i] = 0.5 * (1.0 - cosf((2.0 * M_PI * i) / (length + offset))); - } -} + std::vector data; +}; -void mtmd_audio_cache::fill_mel_filterbank_matrix(int n_mel, - int n_fft, - int sample_rate, - float fmin, - float fmax, - bool slaney_area_norm, - float scale) { - GGML_ASSERT(n_mel > 0 && n_fft > 1); - if (fmax <= 0.0f) { - fmax = 0.5f * sample_rate; - } +// note: this global cache is shared among all preprocessors +// if we want to use multiple preprocessors at the same time, +// we will need to enclose it in the preprocessor class in the future +static struct mtmd_audio_global_cache { + // precomputed sin/cos table for FFT + std::vector sin_vals; + std::vector cos_vals; - // Slaney scale (matches librosa default) - const double min_log_hz = 1000.0; - const double lin_slope = 3 / 200.; - const double min_log_mel = min_log_hz * lin_slope; - const double log_step = log(6.4) / 27.0; - auto hz_to_mel = [min_log_hz, lin_slope, log_step, min_log_mel](const double f_hz) -> double { - return (f_hz < min_log_hz) ? f_hz * lin_slope : min_log_mel + log(f_hz / min_log_hz) / log_step; - }; - auto mel_to_hz = [min_log_hz, lin_slope, log_step, min_log_mel](const double m) -> double { - return (m < min_log_mel) ? m / lin_slope : min_log_hz * exp((m - min_log_mel) * log_step); - }; + // hann window + std::vector hann_window; - // infer N_fft from n_fft_bins - const double bin_hz_step = double(sample_rate) / double(n_fft); + // mel filter bank + mtmd_audio_mel_filters filters; - // mel grid: n_mel + 2 edges - const double m_lo = hz_to_mel(fmin); - const double m_hi = hz_to_mel(fmax); - std::vector mel_pts(n_mel + 2); - for (int i = 0; i < n_mel + 2; ++i) { - mel_pts[i] = m_lo + (m_hi - m_lo) * (double(i) / (n_mel + 1)); - } - - // convert to Hz - std::vector hz_pts(n_mel + 2); - for (int i = 0; i < n_mel + 2; ++i) { - hz_pts[i] = mel_to_hz(mel_pts[i]); - } - - const int n_fft_bins = n_fft / 2 + 1; - - // filterbank - std::vector out(n_mel * n_fft_bins, 0); - for (int m = 0; m < n_mel; ++m) { - const double f_left = hz_pts[m]; - const double f_center = hz_pts[m + 1]; - const double f_right = hz_pts[m + 2]; - - const double denom_l = std::max(1e-30, f_center - f_left); - const double denom_r = std::max(1e-30, f_right - f_center); - const double enorm = slaney_area_norm ? (2.0 / std::max(1e-30, f_right - f_left)) : 1.0; - - for (int k = 0; k < n_fft_bins; ++k) { - const double f = k * bin_hz_step; - double w = 0.0; - if (f >= f_left && f <= f_center) { - w = (f - f_left) / denom_l; - } else if (f > f_center && f <= f_right) { - w = (f_right - f) / denom_r; - } - out[size_t(m) * size_t(n_fft_bins) + size_t(k)] = float(w * enorm * scale); + void fill_sin_cos_table(int n) { + sin_vals.resize(n); + cos_vals.resize(n); + for (int i = 0; i < n; i++) { + double theta = (2 * M_PI * i) / n; + sin_vals[i] = sinf(theta); + cos_vals[i] = cosf(theta); } } - filters.n_mel = n_mel; - filters.n_fft = n_fft; - filters.data = std::move(out); + void fill_hann_window(int length, bool periodic) { + hann_window.resize(length); + int offset = -1; + if (periodic) { + offset = 0; + } + for (int i = 0; i < length; i++) { + hann_window[i] = 0.5 * (1.0 - cosf((2.0 * M_PI * i) / (length + offset))); + } + } - if (DEBUG) { // debug - for (size_t i = 0; i < filters.data.size(); ++i) { - if (filters.data[i] != 0.0f) { - printf("filters[%zu] = %f\n", i, filters.data[i] * 1000.0f); + // Build mel filterbank matrix [n_mel × n_fft_bins] at runtime. + // n_fft_bins must be (N_fft / 2 + 1). Example: if N_fft=512 -> n_fft_bins=257. + void fill_mel_filterbank_matrix( + int n_mel, + int n_fft, + int sample_rate, // e.g. 16000 + float fmin = 0.0f, // e.g. 0.0 + float fmax = -1.0f, // e.g. sr/2; pass -1 for auto + bool slaney_area_norm = true, + float scale = 1.0f // optional extra scaling; use 1.0f/1000.0f to mimic your code + ) { + GGML_ASSERT(n_mel > 0 && n_fft > 1); + if (fmax <= 0.0f) { + fmax = 0.5f * sample_rate; + } + + // Slaney scale (matches librosa default) + const double min_log_hz = 1000.0; + const double lin_slope = 3 / 200.; + const double min_log_mel = min_log_hz * lin_slope; + const double log_step = log(6.4) / 27.0; + auto hz_to_mel = [min_log_hz, lin_slope, log_step, min_log_mel](const double f_hz) -> double { + return (f_hz < min_log_hz) ? f_hz * lin_slope : min_log_mel + log(f_hz / min_log_hz) / log_step; + }; + auto mel_to_hz = [min_log_hz, lin_slope, log_step, min_log_mel](const double m) -> double { + return (m < min_log_mel) ? m / lin_slope : min_log_hz * exp((m - min_log_mel) * log_step); + }; + + // infer N_fft from n_fft_bins + const double bin_hz_step = double(sample_rate) / double(n_fft); + + // mel grid: n_mel + 2 edges + const double m_lo = hz_to_mel(fmin); + const double m_hi = hz_to_mel(fmax); + std::vector mel_pts(n_mel + 2); + for (int i = 0; i < n_mel + 2; ++i) { + mel_pts[i] = m_lo + (m_hi - m_lo) * (double(i) / (n_mel + 1)); + } + + // convert to Hz + std::vector hz_pts(n_mel + 2); + for (int i = 0; i < n_mel + 2; ++i) { + hz_pts[i] = mel_to_hz(mel_pts[i]); + } + + const int n_fft_bins = n_fft / 2 + 1; + + // filterbank + std::vector out(n_mel * n_fft_bins, 0); + for (int m = 0; m < n_mel; ++m) { + const double f_left = hz_pts[m]; + const double f_center = hz_pts[m + 1]; + const double f_right = hz_pts[m + 2]; + + const double denom_l = std::max(1e-30, f_center - f_left); + const double denom_r = std::max(1e-30, f_right - f_center); + const double enorm = slaney_area_norm ? (2.0 / std::max(1e-30, f_right - f_left)) : 1.0; + + for (int k = 0; k < n_fft_bins; ++k) { + const double f = k * bin_hz_step; + double w = 0.0; + if (f >= f_left && f <= f_center) { + w = (f - f_left) / denom_l; + } else if (f > f_center && f <= f_right) { + w = (f_right - f) / denom_r; + } + out[size_t(m) * size_t(n_fft_bins) + size_t(k)] = float(w * enorm * scale); + } + } + + filters.n_mel = n_mel; + filters.n_fft = n_fft; + filters.data = std::move(out); + + if (DEBUG) { // debug + for (size_t i = 0; i < filters.data.size(); ++i) { + if (filters.data[i] != 0.0f) { + printf("filters[%zu] = %f\n", i, filters.data[i] * 1000.0f); + } } } } -} +} g_cache; -// Unified DFT implementation for both forward and inverse transforms -// Template parameters: -// Inverse: false = DFT with exp(-2πi·k·n/N), no scaling -// true = IDFT with exp(+2πi·k·n/N), scales by 1/N -// RealInput: true = input is real-valued (stride 1), avoids imaginary computations -// false = input is complex-valued (interleaved real/imag, stride 2) -template -static void dft_impl(const mtmd_audio_cache & cache, const float * in, int N, float * out) { - const int n_sin_cos_vals = cache.sin_vals.size(); - const int sin_cos_step = n_sin_cos_vals / N; - - constexpr float sign = Inverse ? 1.0f : -1.0f; - const float scale = Inverse ? (1.0f / N) : 1.0f; +// naive Discrete Fourier Transform +// input is real-valued +// output is complex-valued +static void dft(const float * in, int N, float * out) { + const int n_sin_cos_vals = g_cache.sin_vals.size(); + const int sin_cos_step = n_sin_cos_vals / N; for (int k = 0; k < N; k++) { float re = 0; float im = 0; for (int n = 0; n < N; n++) { - int idx = (k * n * sin_cos_step) % n_sin_cos_vals; - float cos_val = cache.cos_vals[idx]; - float sin_val = cache.sin_vals[idx]; - - if constexpr (RealInput) { - // Real input: in_im = 0, simplifies to: - // re += in_re * cos_val - // im += sign * in_re * sin_val - float in_re = in[n]; - re += in_re * cos_val; - im += sign * in_re * sin_val; - } else { - float in_re = in[n * 2 + 0]; - float in_im = in[n * 2 + 1]; - // (a + bi) * (cos + sign*i*sin) = (a*cos - sign*b*sin) + (sign*a*sin + b*cos)i - re += in_re * cos_val - sign * in_im * sin_val; - im += sign * in_re * sin_val + in_im * cos_val; - } + int idx = (k * n * sin_cos_step) % (n_sin_cos_vals); // t = 2*M_PI*k*n/N + re += in[n] * g_cache.cos_vals[idx]; // cos(t) + im -= in[n] * g_cache.sin_vals[idx]; // sin(t) } - out[k * 2 + 0] = re * scale; - out[k * 2 + 1] = im * scale; + out[k*2 + 0] = re; + out[k*2 + 1] = im; } } -// Cooley-Tukey FFT/IFFT unified implementation -// Template parameters: -// Inverse: false = FFT with exp(-2πi·k/N), no scaling -// true = IFFT with exp(+2πi·k/N), scales by 0.5 at each level -// RealInput: true = input is real-valued (stride 1) -// false = input is complex-valued (interleaved real/imag, stride 2) -template -static void fft_impl(const mtmd_audio_cache & cache, float * in, int N, float * out) { - const int n_sin_cos_vals = cache.sin_vals.size(); - +// Cooley-Tukey FFT +// poor man's implementation - use something better +// input is real-valued +// output is complex-valued +static void fft(float * in, int N, float * out) { + const int n_sin_cos_vals = g_cache.sin_vals.size(); if (N == 1) { out[0] = in[0]; - if constexpr (RealInput) { - out[1] = 0.0f; - } else { - out[1] = in[1]; - } + out[1] = 0; return; } const int half_N = N / 2; - if (N - half_N * 2 == 1) { - // Odd N: fall back to DFT - dft_impl(cache, in, N, out); + if (N - half_N*2 == 1) { + dft(in, N, out); return; } - // Split into even and odd - if constexpr (RealInput) { - // Real input: stride is 1, copy only real values - float * even = in + N; - for (int i = 0; i < half_N; ++i) { - even[i] = in[2 * i]; - } - float * even_fft = out + 2 * N; - fft_impl(cache, even, half_N, even_fft); - - float * odd = even; - for (int i = 0; i < half_N; ++i) { - odd[i] = in[2 * i + 1]; - } - float * odd_fft = even_fft + N; - fft_impl(cache, odd, half_N, odd_fft); - } else { - // Complex input: stride is 2, copy complex pairs - float * even = in + N * 2; - for (int i = 0; i < half_N; ++i) { - even[i * 2 + 0] = in[2 * i * 2 + 0]; - even[i * 2 + 1] = in[2 * i * 2 + 1]; - } - float * even_fft = out + 2 * N; - fft_impl(cache, even, half_N, even_fft); - - float * odd = even; - for (int i = 0; i < half_N; ++i) { - odd[i * 2 + 0] = in[(2 * i + 1) * 2 + 0]; - odd[i * 2 + 1] = in[(2 * i + 1) * 2 + 1]; - } - float * odd_fft = even_fft + N; - fft_impl(cache, odd, half_N, odd_fft); + float* even = in + N; + for (int i = 0; i < half_N; ++i) { + even[i]= in[2*i]; } + float* even_fft = out + 2 * N; + fft(even, half_N, even_fft); - float * even_fft = out + 2 * N; - float * odd_fft = even_fft + N; + float* odd = even; + for (int i = 0; i < half_N; ++i) { + odd[i] = in[2*i + 1]; + } + float* odd_fft = even_fft + N; + fft(odd, half_N, odd_fft); const int sin_cos_step = n_sin_cos_vals / N; - - constexpr float sign = Inverse ? 1.0f : -1.0f; - constexpr float scale = Inverse ? 0.5f : 1.0f; - for (int k = 0; k < half_N; k++) { - int idx = k * sin_cos_step; // t = 2*M_PI*k/N - float re = cache.cos_vals[idx]; - float im = sign * cache.sin_vals[idx]; + int idx = k * sin_cos_step; // t = 2*M_PI*k/N + float re = g_cache.cos_vals[idx]; // cos(t) + float im = -g_cache.sin_vals[idx]; // sin(t) - float re_odd = odd_fft[2 * k + 0]; - float im_odd = odd_fft[2 * k + 1]; + float re_odd = odd_fft[2*k + 0]; + float im_odd = odd_fft[2*k + 1]; - out[2 * k + 0] = scale * (even_fft[2 * k + 0] + re * re_odd - im * im_odd); - out[2 * k + 1] = scale * (even_fft[2 * k + 1] + re * im_odd + im * re_odd); + out[2*k + 0] = even_fft[2*k + 0] + re*re_odd - im*im_odd; + out[2*k + 1] = even_fft[2*k + 1] + re*im_odd + im*re_odd; - out[2 * (k + half_N) + 0] = scale * (even_fft[2 * k + 0] - re * re_odd + im * im_odd); - out[2 * (k + half_N) + 1] = scale * (even_fft[2 * k + 1] - re * im_odd - im * re_odd); + out[2*(k + half_N) + 0] = even_fft[2*k + 0] - re*re_odd + im*im_odd; + out[2*(k + half_N) + 1] = even_fft[2*k + 1] - re*im_odd - im*re_odd; } } -// Forward FFT for real input (used by mel spectrogram) -static void fft(const mtmd_audio_cache & cache, float * in, int N, float * out) { - fft_impl(cache, in, N, out); -} - -// Inverse FFT for complex input -static void ifft(const mtmd_audio_cache & cache, float * in, int N, float * out) { - fft_impl(cache, in, N, out); -} - struct filter_params { int32_t n_mel; int32_t n_fft_bins; @@ -265,27 +222,20 @@ struct filter_params { bool norm_per_feature = false; }; -static void log_mel_spectrogram_worker_thread(int ith, - const float * hann, - const std::vector & samples, - int n_samples, - int frame_size, - int frame_step, - int n_threads, - const filter_params & params, - const mtmd_audio_cache & cache, - mtmd_audio_mel & out) { +static void log_mel_spectrogram_worker_thread(int ith, const float * hann, const std::vector & samples, + int n_samples, int frame_size, int frame_step, int n_threads, + const filter_params & params, mtmd_audio_mel & out) { std::vector fft_in(frame_size * 2, 0.0); std::vector fft_out(frame_size * 2 * 2 * 2); int n_fft_bins = params.n_fft_bins; int i = ith; - const auto & filters = cache.filters; + const auto & filters = g_cache.filters; // make sure n_fft == 1 + (WHISPER_N_FFT / 2), bin_0 to bin_nyquist GGML_ASSERT(n_fft_bins == 1 + (frame_size / 2)); - GGML_ASSERT(cache.sin_vals.size() == cache.cos_vals.size()); + GGML_ASSERT(g_cache.sin_vals.size() == g_cache.cos_vals.size()); // calculate FFT only when fft_in are not all zero for (; i < std::min(n_samples / frame_step + 1, out.n_len); i += n_threads) { const int offset = i * frame_step; @@ -301,7 +251,7 @@ static void log_mel_spectrogram_worker_thread(int ith, } // FFT - fft(cache, fft_in.data(), frame_size, fft_out.data()); + fft(fft_in.data(), frame_size, fft_out.data()); // Calculate modulus^2 of complex numbers // Use pow(fft_out[2 * j + 0], 2) + pow(fft_out[2 * j + 1], 2) causes inference quality problem? Interesting. @@ -348,7 +298,6 @@ static bool log_mel_spectrogram( const int n_samples_in, const int n_threads, const filter_params & params, - const mtmd_audio_cache & cache, mtmd_audio_mel & out) { //const int64_t t_start_us = ggml_time_us(); @@ -356,9 +305,9 @@ static bool log_mel_spectrogram( int n_samples = n_samples_in; // Hann window - const float * hann = cache.hann_window.data(); - const int frame_size = (params.n_fft_bins - 1) * 2; - const int frame_step = params.hop_length; + const float * hann = g_cache.hann_window.data(); + const int frame_size = (params.n_fft_bins - 1) * 2; + const int frame_step = params.hop_length; // Padding std::vector samples_padded; @@ -386,9 +335,9 @@ static bool log_mel_spectrogram( // preemphasis if (params.preemph) { - const int pad_amount = frame_size / 2; + const int pad_amount = frame_size / 2; const float preemph = 0.97f; - float prev = samples_padded[pad_amount]; + float prev = samples_padded[pad_amount]; for (int i = pad_amount + 1; i + pad_amount < n_samples; ++i) { float cur = samples_padded[i]; samples_padded[i] = cur - preemph * prev; @@ -423,14 +372,14 @@ static bool log_mel_spectrogram( { std::vector workers(n_threads - 1); for (int iw = 0; iw < n_threads - 1; ++iw) { - workers[iw] = - std::thread(log_mel_spectrogram_worker_thread, iw + 1, hann, std::cref(samples_padded), n_samples, - frame_size, frame_step, n_threads, std::cref(params), std::cref(cache), std::ref(out)); + workers[iw] = std::thread( + log_mel_spectrogram_worker_thread, iw + 1, hann, std::cref(samples_padded), + n_samples, frame_size, frame_step, n_threads, + std::cref(params), std::ref(out)); } // main thread - log_mel_spectrogram_worker_thread(0, hann, samples_padded, n_samples, frame_size, frame_step, n_threads, params, - cache, out); + log_mel_spectrogram_worker_thread(0, hann, samples_padded, n_samples, frame_size, frame_step, n_threads, params, out); for (int iw = 0; iw < n_threads - 1; ++iw) { workers[iw].join(); } @@ -455,7 +404,7 @@ static bool log_mel_spectrogram( for (int j = 0; j < effective_n_len; ++j) { auto &value = out.data[i * out.n_len + j]; - value = (value - mean) / mstd; + value = (value - mean) / mstd; } // pad the rest with zeros @@ -501,14 +450,18 @@ static bool log_mel_spectrogram( // void mtmd_audio_preprocessor_whisper::initialize() { - cache.fill_sin_cos_table(hparams.audio_n_fft); - cache.fill_hann_window(hparams.audio_window_len, true); - cache.fill_mel_filterbank_matrix(hparams.n_mel_bins, hparams.audio_n_fft, hparams.audio_sample_rate); + g_cache.fill_sin_cos_table(hparams.audio_n_fft); + g_cache.fill_hann_window(hparams.audio_window_len, true); + g_cache.fill_mel_filterbank_matrix( + hparams.n_mel_bins, + hparams.audio_n_fft, + hparams.audio_sample_rate); } -bool mtmd_audio_preprocessor_whisper::preprocess(const float * samples, - size_t n_samples, - std::vector & output) { +bool mtmd_audio_preprocessor_whisper::preprocess( + const float * samples, + size_t n_samples, + std::vector & output) { if (n_samples == 0) { // empty audio return false; @@ -518,7 +471,7 @@ bool mtmd_audio_preprocessor_whisper::preprocess(const float * s // if input is too short, pad with zeros // this is to avoid potential issues with stage1/2 padding in log_mel_spectrogram // TODO: maybe handle this better - size_t min_samples = (size_t) hparams.audio_sample_rate * (hparams.audio_chunk_len + 1); // +1 second margin + size_t min_samples = (size_t)hparams.audio_sample_rate * (hparams.audio_chunk_len + 1); // +1 second margin if (n_samples < min_samples) { smpl.resize(min_samples, 0.0f); std::memcpy(smpl.data(), samples, n_samples * sizeof(float)); @@ -533,19 +486,22 @@ bool mtmd_audio_preprocessor_whisper::preprocess(const float * s params.hop_length = hparams.audio_hop_len; params.sample_rate = hparams.audio_sample_rate; params.center_padding = false; - params.preemph = 0.0f; // disabled + params.preemph = 0.0f; // disabled params.use_natural_log = false; params.norm_per_feature = false; - // make sure the cache is initialized - GGML_ASSERT(!cache.sin_vals.empty()); - GGML_ASSERT(!cache.cos_vals.empty()); - GGML_ASSERT(!cache.filters.data.empty()); + // make sure the global cache is initialized + GGML_ASSERT(!g_cache.sin_vals.empty()); + GGML_ASSERT(!g_cache.cos_vals.empty()); + GGML_ASSERT(!g_cache.filters.data.empty()); mtmd_audio_mel out_full; - bool ok = log_mel_spectrogram(samples, n_samples, - 4, // n_threads - params, cache, out_full); + bool ok = log_mel_spectrogram( + samples, + n_samples, + 4, // n_threads + params, + out_full); if (!ok) { return false; } @@ -556,21 +512,21 @@ bool mtmd_audio_preprocessor_whisper::preprocess(const float * s printf("output: n_mel = %d, n_len = %d\n", out_full.n_mel, out_full.n_len); } const size_t frames_per_chunk = 3000; - GGML_ASSERT((size_t) out_full.n_len > frames_per_chunk); - for (size_t off = 0; off < (size_t) out_full.n_len; off += frames_per_chunk) { - int n_len = std::min(frames_per_chunk, (size_t) out_full.n_len - off); - if ((size_t) n_len < frames_per_chunk) { - break; // last uncomplete chunk will always be a padded chunk, safe to ignore + GGML_ASSERT((size_t)out_full.n_len > frames_per_chunk); + for (size_t off = 0; off < (size_t)out_full.n_len; off += frames_per_chunk) { + int n_len = std::min(frames_per_chunk, (size_t)out_full.n_len - off); + if ((size_t)n_len < frames_per_chunk) { + break; // last uncomplete chunk will always be a padded chunk, safe to ignore } mtmd_audio_mel out_chunk; out_chunk.n_len = n_len; out_chunk.n_mel = out_full.n_mel; - out_chunk.n_len_org = out_full.n_mel; // unused + out_chunk.n_len_org = out_full.n_mel; // unused out_chunk.data.reserve(out_chunk.n_mel * out_chunk.n_len); for (int i = 0; i < out_full.n_mel; i++) { - auto src = out_full.data.begin() + i * out_full.n_len + off; + auto src = out_full.data.begin() + i*out_full.n_len + off; out_chunk.data.insert(out_chunk.data.end(), src, src + frames_per_chunk); } @@ -585,14 +541,18 @@ bool mtmd_audio_preprocessor_whisper::preprocess(const float * s // void mtmd_audio_preprocessor_conformer::initialize() { - cache.fill_sin_cos_table(hparams.audio_n_fft); - cache.fill_hann_window(hparams.audio_window_len, true); - cache.fill_mel_filterbank_matrix(hparams.n_mel_bins, hparams.audio_n_fft, hparams.audio_sample_rate); + g_cache.fill_sin_cos_table(hparams.audio_n_fft); + g_cache.fill_hann_window(hparams.audio_window_len, true); + g_cache.fill_mel_filterbank_matrix( + hparams.n_mel_bins, + hparams.audio_n_fft, + hparams.audio_sample_rate); } -bool mtmd_audio_preprocessor_conformer::preprocess(const float * samples, - size_t n_samples, - std::vector & output) { +bool mtmd_audio_preprocessor_conformer::preprocess( + const float * samples, + size_t n_samples, + std::vector & output) { // empty audio if (n_samples == 0) { return false; @@ -609,15 +569,18 @@ bool mtmd_audio_preprocessor_conformer::preprocess(const float * params.use_natural_log = true; params.norm_per_feature = true; - // make sure the cache is initialized - GGML_ASSERT(!cache.sin_vals.empty()); - GGML_ASSERT(!cache.cos_vals.empty()); - GGML_ASSERT(!cache.filters.data.empty()); + // make sure the global cache is initialized + GGML_ASSERT(!g_cache.sin_vals.empty()); + GGML_ASSERT(!g_cache.cos_vals.empty()); + GGML_ASSERT(!g_cache.filters.data.empty()); mtmd_audio_mel out_full; - bool ok = log_mel_spectrogram(samples, n_samples, - 4, // n_threads - params, cache, out_full); + bool ok = log_mel_spectrogram( + samples, + n_samples, + 4, // n_threads + params, + out_full); if (!ok) { return false; } @@ -625,106 +588,3 @@ bool mtmd_audio_preprocessor_conformer::preprocess(const float * output.push_back(std::move(out_full)); return true; } - -// -// mtmd_audio_streaming_istft implementation -// - -mtmd_audio_streaming_istft::mtmd_audio_streaming_istft(int n_fft, int hop_length) : - n_fft(n_fft), - hop_length(hop_length), - n_fft_bins(n_fft / 2 + 1), - overlap_buffer(n_fft, 0.0f), - window_sum_buffer(n_fft, 0.0f), - padding_to_remove((n_fft - hop_length) / 2), - ifft_in(n_fft * 2 * 4, 0.0f), // extra space for recursive IFFT - ifft_out(n_fft * 2 * 4, 0.0f) { - cache.fill_sin_cos_table(n_fft); - cache.fill_hann_window(n_fft, true); -} - -void mtmd_audio_streaming_istft::reset() { - std::fill(overlap_buffer.begin(), overlap_buffer.end(), 0.0f); - std::fill(window_sum_buffer.begin(), window_sum_buffer.end(), 0.0f); - padding_to_remove = (n_fft - hop_length) / 2; -} - -std::vector mtmd_audio_streaming_istft::process_frame(const float * frame_spectrum) { - std::vector output(hop_length); - - // copy frequencies - for (int j = 0; j < n_fft_bins; j++) { - ifft_in[j * 2 + 0] = frame_spectrum[j * 2 + 0]; - ifft_in[j * 2 + 1] = frame_spectrum[j * 2 + 1]; - } - - // mirror negative frequencies - for (int j = 1; j < n_fft_bins - 1; j++) { - int mirror_idx = n_fft - j; - ifft_in[mirror_idx * 2 + 0] = ifft_in[j * 2 + 0]; - ifft_in[mirror_idx * 2 + 1] = -ifft_in[j * 2 + 1]; // conjugate - } - - ifft(cache, ifft_in.data(), n_fft, ifft_out.data()); - - // update window sum and overlap buffer - for (int j = 0; j < n_fft; j++) { - window_sum_buffer[j] += cache.hann_window[j] * cache.hann_window[j]; - overlap_buffer[j] += ifft_out[j * 2] * cache.hann_window[j]; - } - - // extract hop_length samples with normalization - for (int i = 0; i < hop_length; i++) { - if (window_sum_buffer[i] > 1e-8f) { - output[i] = overlap_buffer[i] / window_sum_buffer[i]; - } else { - output[i] = overlap_buffer[i]; - } - } - - // shift buffers left by hop_length - std::copy(overlap_buffer.begin() + hop_length, overlap_buffer.end(), overlap_buffer.begin()); - std::fill(overlap_buffer.end() - hop_length, overlap_buffer.end(), 0.0f); - - std::copy(window_sum_buffer.begin() + hop_length, window_sum_buffer.end(), window_sum_buffer.begin()); - std::fill(window_sum_buffer.end() - hop_length, window_sum_buffer.end(), 0.0f); - - // Remove padding if needed - int to_remove = std::min(padding_to_remove, (int) output.size()); - padding_to_remove -= to_remove; - output.erase(output.begin(), output.begin() + to_remove); - - return output; -} - -std::vector mtmd_audio_streaming_istft::flush() { - std::vector output; - - // Extract remaining samples from overlap buffer - // Continue until we've extracted all meaningful samples - int remaining = n_fft - hop_length; - while (remaining > 0) { - int chunk_size = std::min(remaining, hop_length); - - for (int i = 0; i < chunk_size; i++) { - float sample; - if (window_sum_buffer[i] > 1e-8f) { - sample = overlap_buffer[i] / window_sum_buffer[i]; - } else { - sample = overlap_buffer[i]; - } - output.push_back(sample); - } - - // Shift buffers - std::copy(overlap_buffer.begin() + chunk_size, overlap_buffer.end(), overlap_buffer.begin()); - std::fill(overlap_buffer.end() - chunk_size, overlap_buffer.end(), 0.0f); - - std::copy(window_sum_buffer.begin() + chunk_size, window_sum_buffer.end(), window_sum_buffer.begin()); - std::fill(window_sum_buffer.end() - chunk_size, window_sum_buffer.end(), 0.0f); - - remaining -= chunk_size; - } - - return output; -} diff --git a/tools/mtmd/mtmd-audio.h b/tools/mtmd/mtmd-audio.h index 016c739..d484c9d 100644 --- a/tools/mtmd/mtmd-audio.h +++ b/tools/mtmd/mtmd-audio.h @@ -17,38 +17,6 @@ struct mtmd_audio_mel { std::vector data; }; -struct mtmd_audio_mel_filters { - int32_t n_mel; - int32_t n_fft; - - std::vector data; -}; - -// cache for audio processing, each processor instance owns its own cache -struct mtmd_audio_cache { - std::vector sin_vals; - std::vector cos_vals; - - std::vector hann_window; - - mtmd_audio_mel_filters filters; - - void fill_sin_cos_table(int n); - - void fill_hann_window(int length, bool periodic); - - // Build mel filterbank matrix [n_mel × n_fft_bins] at runtime. - // n_fft_bins must be (N_fft / 2 + 1). Example: if N_fft=512 -> n_fft_bins=257. - void fill_mel_filterbank_matrix(int n_mel, - int n_fft, - int sample_rate, // e.g. 16000 - float fmin = 0.0f, // e.g. 0.0 - float fmax = -1.0f, // e.g. sr/2; pass -1 for auto - bool slaney_area_norm = true, - float scale = 1.0f // optional extra scaling - ); -}; - struct mtmd_audio_preprocessor { const clip_hparams & hparams; @@ -63,51 +31,10 @@ struct mtmd_audio_preprocessor_whisper : mtmd_audio_preprocessor { mtmd_audio_preprocessor_whisper(const clip_ctx * ctx) : mtmd_audio_preprocessor(ctx) {} void initialize() override; bool preprocess(const float * samples, size_t n_samples, std::vector & output) override; - - private: - mtmd_audio_cache cache; }; struct mtmd_audio_preprocessor_conformer : mtmd_audio_preprocessor { mtmd_audio_preprocessor_conformer(const clip_ctx * ctx) : mtmd_audio_preprocessor(ctx) {} void initialize() override; bool preprocess(const float * samples, size_t n_samples, std::vector & output) override; - - private: - mtmd_audio_cache cache; -}; - -// -// streaming ISTFT - converts spectrogram frames back to audio one frame at a time -// -struct mtmd_audio_streaming_istft { - mtmd_audio_streaming_istft(int n_fft, int hop_length); - - // reset streaming state - void reset(); - - // process a single STFT frame (streaming) - // frame_spectrum: [n_fft_bins x 2] interleaved real/imag - // returns: up to hop_length samples - std::vector process_frame(const float * frame_spectrum); - - // flush remaining samples at end of stream - std::vector flush(); - - private: - int n_fft; - int hop_length; - int n_fft_bins; - - // Own cache for output processing - mtmd_audio_cache cache; - - // Streaming state - std::vector overlap_buffer; - std::vector window_sum_buffer; - int padding_to_remove; - - // Working buffers for IFFT - std::vector ifft_in; - std::vector ifft_out; }; diff --git a/tools/mtmd/mtmd-cli.cpp b/tools/mtmd/mtmd-cli.cpp index 054c7fa..1ba02a5 100644 --- a/tools/mtmd/mtmd-cli.cpp +++ b/tools/mtmd/mtmd-cli.cpp @@ -1,5 +1,4 @@ #include "arg.h" -#include "debug.h" #include "log.h" #include "common.h" #include "sampling.h" @@ -89,8 +88,6 @@ struct mtmd_cli_context { int n_threads = 1; llama_pos n_past = 0; - base_callback_data cb_data; - mtmd_cli_context(common_params & params) : llama_init(common_init_from_params(params)) { model = llama_init->model(); lctx = llama_init->context(); @@ -142,10 +139,6 @@ struct mtmd_cli_context { mparams.warmup = params.warmup; mparams.image_min_tokens = params.image_min_tokens; mparams.image_max_tokens = params.image_max_tokens; - if (std::getenv("MTMD_DEBUG_GRAPH") != nullptr) { - mparams.cb_eval_user_data = &cb_data; - mparams.cb_eval = common_debug_cb_eval; - } ctx_vision.reset(mtmd_init_from_file(clip_path, model, mparams)); if (!ctx_vision.get()) { LOG_ERR("Failed to load vision model from %s\n", clip_path); diff --git a/tools/mtmd/mtmd.cpp b/tools/mtmd/mtmd.cpp index 32a24bf..b9c4fa9 100644 --- a/tools/mtmd/mtmd.cpp +++ b/tools/mtmd/mtmd.cpp @@ -111,8 +111,6 @@ mtmd_context_params mtmd_context_params_default() { /* warmup */ true, /* image_min_tokens */ -1, /* image_max_tokens */ -1, - /* cb_eval */ nullptr, - /* cb_eval_user_data */ nullptr, }; return params; } @@ -148,6 +146,8 @@ struct mtmd_context { bool tok_row_end_trail = false; bool ov_img_first = false; + bool use_mrope = false; // for Qwen2VL, we need to use M-RoPE + // string template for slice image delimiters with row/col (idefics3) std::string sli_img_start_tmpl; @@ -178,8 +178,6 @@ struct mtmd_context { /* image_min_tokens */ ctx_params.image_min_tokens, /* image_max_tokens */ ctx_params.image_max_tokens, /* warmup */ ctx_params.warmup, - /* cb_eval */ ctx_params.cb_eval, - /* cb_eval_user_data */ ctx_params.cb_eval_user_data, }; auto res = clip_init(mmproj_fname, ctx_clip_params); @@ -219,6 +217,7 @@ struct mtmd_context { void init_vision() { GGML_ASSERT(ctx_v != nullptr); + use_mrope = clip_is_mrope(ctx_v); projector_type proj = clip_get_projector_type(ctx_v); int minicpmv_version = clip_is_minicpmv(ctx_v); @@ -267,7 +266,7 @@ struct mtmd_context { } // set boi/eoi - if (proj == PROJECTOR_TYPE_GEMMA3 || proj == PROJECTOR_TYPE_GEMMA3NV) { + if (proj == PROJECTOR_TYPE_GEMMA3) { // ... (image embeddings) ... img_beg = ""; img_end = ""; @@ -284,7 +283,7 @@ struct mtmd_context { // https://github.com/huggingface/transformers/blob/1cd110c6cb6a6237614130c470e9a902dbc1a4bd/docs/source/en/model_doc/pixtral.md img_end = "[IMG_END]"; - } else if (proj == PROJECTOR_TYPE_QWEN2VL || proj == PROJECTOR_TYPE_QWEN25VL || proj == PROJECTOR_TYPE_QWEN3VL || proj == PROJECTOR_TYPE_YOUTUVL) { + } else if (proj == PROJECTOR_TYPE_QWEN2VL || proj == PROJECTOR_TYPE_QWEN25VL || proj == PROJECTOR_TYPE_QWEN3VL) { // <|vision_start|> ... (image embeddings) ... <|vision_end|> img_beg = "<|vision_start|>"; img_end = "<|vision_end|>"; @@ -331,7 +330,6 @@ struct mtmd_context { case PROJECTOR_TYPE_ULTRAVOX: case PROJECTOR_TYPE_VOXTRAL: case PROJECTOR_TYPE_GLMA: - case PROJECTOR_TYPE_MUSIC_FLAMINGO: audio_preproc = std::make_unique(ctx_a); break; case PROJECTOR_TYPE_LFM2A: @@ -354,9 +352,6 @@ struct mtmd_context { // [BEGIN_AUDIO] ... (embeddings) ... aud_beg = "[BEGIN_AUDIO]"; - } else if (proj == PROJECTOR_TYPE_MUSIC_FLAMINGO) { - // ... (embeddings) ... - aud_beg = ""; } } @@ -628,7 +623,7 @@ struct mtmd_tokenizer { } mtmd_image_tokens_ptr image_tokens(new mtmd_image_tokens); - if (mtmd_decode_use_mrope(ctx)) { + if (ctx->use_mrope) { // for Qwen2VL, we need this information for M-RoPE decoding positions image_tokens->nx = clip_n_output_tokens_x(ctx->ctx_v, batch_f32.entries[0].get()); image_tokens->ny = clip_n_output_tokens_y(ctx->ctx_v, batch_f32.entries[0].get()); @@ -863,24 +858,14 @@ float * mtmd_get_output_embd(mtmd_context * ctx) { } bool mtmd_decode_use_non_causal(mtmd_context * ctx) { - switch (ctx->proj_type_v()) { - case PROJECTOR_TYPE_GEMMA3: - return true; - default: - return false; + if (ctx->ctx_v && clip_get_projector_type(ctx->ctx_v) == PROJECTOR_TYPE_GEMMA3) { + return true; } + return false; } bool mtmd_decode_use_mrope(mtmd_context * ctx) { - switch (ctx->proj_type_v()) { - case PROJECTOR_TYPE_QWEN2VL: - case PROJECTOR_TYPE_QWEN25VL: - case PROJECTOR_TYPE_QWEN3VL: - case PROJECTOR_TYPE_GLM4V: - return true; - default: - return false; - } + return ctx->use_mrope; } bool mtmd_support_vision(mtmd_context * ctx) { diff --git a/tools/mtmd/mtmd.h b/tools/mtmd/mtmd.h index a12c28e..9f7e861 100644 --- a/tools/mtmd/mtmd.h +++ b/tools/mtmd/mtmd.h @@ -27,9 +27,6 @@ * - Make sure the C API is aligned with the libllama C API (as in llama.h) * - Do not include model name (e.g., qwen, gemma) in the API, use generic terms instead * - Keep the API minimal, do not expose internal details unless necessary - * - * IMPORTANT: The mtmd module does NOT accept pull requests that are fully or predominantly AI-generated. - * We encourage human contributors to ensure the quality and reliability of the codebase. */ #ifdef LLAMA_SHARED @@ -95,10 +92,6 @@ struct mtmd_context_params { // limit number of image tokens, only for vision models with dynamic resolution int image_min_tokens; // minimum number of tokens for image input (default: read from metadata) int image_max_tokens; // maximum number of tokens for image input (default: read from metadata) - - // callback function passed over to mtmd proper - ggml_backend_sched_eval_callback cb_eval; - void * cb_eval_user_data; }; MTMD_API const char * mtmd_default_marker(void); @@ -277,12 +270,12 @@ struct bitmap { ptr.reset(mtmd_bitmap_init(nx, ny, data)); } ~bitmap() = default; - uint32_t nx() const { return mtmd_bitmap_get_nx(ptr.get()); } - uint32_t ny() const { return mtmd_bitmap_get_ny(ptr.get()); } - const unsigned char * data() const { return mtmd_bitmap_get_data(ptr.get()); } - size_t n_bytes() const { return mtmd_bitmap_get_n_bytes(ptr.get()); } - std::string id() const { return mtmd_bitmap_get_id(ptr.get()); } - void set_id(const char * id) const { mtmd_bitmap_set_id(ptr.get(), id); } + uint32_t nx() { return mtmd_bitmap_get_nx(ptr.get()); } + uint32_t ny() { return mtmd_bitmap_get_ny(ptr.get()); } + const unsigned char * data() { return mtmd_bitmap_get_data(ptr.get()); } + size_t n_bytes() { return mtmd_bitmap_get_n_bytes(ptr.get()); } + std::string id() { return mtmd_bitmap_get_id(ptr.get()); } + void set_id(const char * id) { mtmd_bitmap_set_id(ptr.get(), id); } }; struct bitmaps { @@ -306,8 +299,8 @@ struct input_chunks { input_chunks() = default; input_chunks(mtmd_input_chunks * chunks) : ptr(chunks) {} ~input_chunks() = default; - size_t size() const { return mtmd_input_chunks_size(ptr.get()); } - const mtmd_input_chunk * operator[](size_t idx) const { + size_t size() { return mtmd_input_chunks_size(ptr.get()); } + const mtmd_input_chunk * operator[](size_t idx) { return mtmd_input_chunks_get(ptr.get(), idx); } }; diff --git a/tools/quantize/quantize.cpp b/tools/quantize/quantize.cpp index 881f4b3..470dc3d 100644 --- a/tools/quantize/quantize.cpp +++ b/tools/quantize/quantize.cpp @@ -12,7 +12,6 @@ #include #include #include -#include struct quant_option { std::string name; @@ -644,11 +643,6 @@ int main(int argc, char ** argv) { return 1; } - if (std::error_code ec; std::filesystem::equivalent(fname_inp, fname_out, ec)) { - fprintf(stderr, "%s: error: input and output files are the same: '%s'\n", __func__, fname_inp.c_str()); - return 1; - } - print_build_info(); fprintf(stderr, "%s: quantizing '%s' to '%s' as %s", __func__, fname_inp.c_str(), fname_out.c_str(), ftype_str.c_str()); diff --git a/tools/run/CMakeLists.txt b/tools/run/CMakeLists.txt new file mode 100644 index 0000000..6ad7534 --- /dev/null +++ b/tools/run/CMakeLists.txt @@ -0,0 +1,23 @@ +set(TARGET llama-run) +add_executable(${TARGET} run.cpp linenoise.cpp/linenoise.cpp) + +# TODO: avoid copying this code block from common/CMakeLists.txt +set(LLAMA_RUN_EXTRA_LIBS "") +if (LLAMA_CURL) + find_package(CURL REQUIRED) + target_compile_definitions(${TARGET} PUBLIC LLAMA_USE_CURL) + include_directories(${CURL_INCLUDE_DIRS}) + set(LLAMA_RUN_EXTRA_LIBS ${LLAMA_RUN_EXTRA_LIBS} ${CURL_LIBRARIES}) +endif () + +if(LLAMA_TOOLS_INSTALL) + install(TARGETS ${TARGET} RUNTIME) +endif() + +if (CMAKE_SYSTEM_NAME MATCHES "AIX") + # AIX's flock() function comes from libbsd.a + target_link_libraries(${TARGET} PRIVATE -lbsd) +endif() + +target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT} ${LLAMA_RUN_EXTRA_LIBS}) +target_compile_features(${TARGET} PRIVATE cxx_std_17) diff --git a/tools/run/README.md b/tools/run/README.md new file mode 100644 index 0000000..5fd769b --- /dev/null +++ b/tools/run/README.md @@ -0,0 +1,52 @@ +# llama.cpp/example/run + +The purpose of this example is to demonstrate a minimal usage of llama.cpp for running models. + +```bash +llama-run granite3-moe +``` + +```bash +Description: + Runs a llm + +Usage: + llama-run [options] model [prompt] + +Options: + -c, --context-size + Context size (default: 2048) + -n, -ngl, --ngl + Number of GPU layers (default: 0) + --temp + Temperature (default: 0.8) + -v, --verbose, --log-verbose + Set verbosity level to infinity (i.e. log all messages, useful for debugging) + -h, --help + Show help message + +Commands: + model + Model is a string with an optional prefix of + huggingface:// (hf://), ollama://, https:// or file://. + If no protocol is specified and a file exists in the specified + path, file:// is assumed, otherwise if a file does not exist in + the specified path, ollama:// is assumed. Models that are being + pulled are downloaded with .partial extension while being + downloaded and then renamed as the file without the .partial + extension when complete. + +Examples: + llama-run llama3 + llama-run ollama://granite-code + llama-run ollama://smollm:135m + llama-run hf://QuantFactory/SmolLM-135M-GGUF/SmolLM-135M.Q2_K.gguf + llama-run huggingface://bartowski/SmolLM-1.7B-Instruct-v0.2-GGUF/SmolLM-1.7B-Instruct-v0.2-IQ3_M.gguf + llama-run ms://QuantFactory/SmolLM-135M-GGUF/SmolLM-135M.Q2_K.gguf + llama-run modelscope://bartowski/SmolLM-1.7B-Instruct-v0.2-GGUF/SmolLM-1.7B-Instruct-v0.2-IQ3_M.gguf + llama-run https://example.com/some-file1.gguf + llama-run some-file2.gguf + llama-run file://some-file3.gguf + llama-run --ngl 999 some-file4.gguf + llama-run --ngl 999 some-file5.gguf Hello World +``` diff --git a/tools/run/linenoise.cpp/linenoise.cpp b/tools/run/linenoise.cpp/linenoise.cpp new file mode 100644 index 0000000..9cb9399 --- /dev/null +++ b/tools/run/linenoise.cpp/linenoise.cpp @@ -0,0 +1,1995 @@ +#ifndef _WIN32 +/* + * You can find the latest source code at: + * + * http://github.com/ericcurtin/linenoise.cpp + * + * Does a number of crazy assumptions that happen to be true in 99.9999% of + * the 2010 UNIX computers around. + * + * ------------------------------------------------------------------------ + * + * Copyright (c) 2010-2023, Salvatore Sanfilippo + * Copyright (c) 2010-2013, Pieter Noordhuis + * Copyright (c) 2025, Eric Curtin + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ------------------------------------------------------------------------ + * + * References: + * - http://invisible-island.net/xterm/ctlseqs/ctlseqs.html + * - http://www.3waylabs.com/nw/WWW/products/wizcon/vt220.html + * + * Todo list: + * - Filter bogus Ctrl+ combinations. + * - Win32 support + * + * Bloat: + * - History search like Ctrl+r in readline? + * + * List of escape sequences used by this program, we do everything just + * with three sequences. In order to be so cheap we may have some + * flickering effect with some slow terminal, but the lesser sequences + * the more compatible. + * + * EL (Erase Line) + * Sequence: ESC [ n K + * Effect: if n is 0 or missing, clear from cursor to end of line + * Effect: if n is 1, clear from beginning of line to cursor + * Effect: if n is 2, clear entire line + * + * CUF (CUrsor Forward) + * Sequence: ESC [ n C + * Effect: moves cursor forward n chars + * + * CUB (CUrsor Backward) + * Sequence: ESC [ n D + * Effect: moves cursor backward n chars + * + * The following is used to get the terminal width if getting + * the width with the TIOCGWINSZ ioctl fails + * + * DSR (Device Status Report) + * Sequence: ESC [ 6 n + * Effect: reports the current cursor position as ESC [ n ; m R + * where n is the row and m is the column + * + * When multi line mode is enabled, we also use an additional escape + * sequence. However multi line editing is disabled by default. + * + * CUU (Cursor Up) + * Sequence: ESC [ n A + * Effect: moves cursor up of n chars. + * + * CUD (Cursor Down) + * Sequence: ESC [ n B + * Effect: moves cursor down of n chars. + * + * When linenoiseClearScreen() is called, two additional escape sequences + * are used in order to clear the screen and position the cursor at home + * position. + * + * CUP (Cursor position) + * Sequence: ESC [ H + * Effect: moves the cursor to upper left corner + * + * ED (Erase display) + * Sequence: ESC [ 2 J + * Effect: clear the whole screen + * + */ + +# include "linenoise.h" + +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include + +# include +# include +# include + +# define LINENOISE_DEFAULT_HISTORY_MAX_LEN 100 +# define LINENOISE_MAX_LINE 4096 +static std::vector unsupported_term = { "dumb", "cons25", "emacs" }; +static linenoiseCompletionCallback *completionCallback = NULL; +static linenoiseHintsCallback *hintsCallback = NULL; +static linenoiseFreeHintsCallback *freeHintsCallback = NULL; +static char *linenoiseNoTTY(void); +static void refreshLineWithCompletion(struct linenoiseState *ls, linenoiseCompletions *lc, int flags); +static void refreshLineWithFlags(struct linenoiseState *l, int flags); + +static struct termios orig_termios; /* In order to restore at exit.*/ +static int maskmode = 0; /* Show "***" instead of input. For passwords. */ +static int rawmode = 0; /* For atexit() function to check if restore is needed*/ +static int mlmode = 0; /* Multi line mode. Default is single line. */ +static int atexit_registered = 0; /* Register atexit just 1 time. */ +static int history_max_len = LINENOISE_DEFAULT_HISTORY_MAX_LEN; +static int history_len = 0; +static char **history = NULL; + +enum KEY_ACTION{ + KEY_NULL = 0, /* NULL */ + CTRL_A = 1, /* Ctrl+a */ + CTRL_B = 2, /* Ctrl-b */ + CTRL_C = 3, /* Ctrl-c */ + CTRL_D = 4, /* Ctrl-d */ + CTRL_E = 5, /* Ctrl-e */ + CTRL_F = 6, /* Ctrl-f */ + CTRL_H = 8, /* Ctrl-h */ + TAB = 9, /* Tab */ + CTRL_K = 11, /* Ctrl+k */ + CTRL_L = 12, /* Ctrl+l */ + ENTER = 13, /* Enter */ + CTRL_N = 14, /* Ctrl-n */ + CTRL_P = 16, /* Ctrl-p */ + CTRL_T = 20, /* Ctrl-t */ + CTRL_U = 21, /* Ctrl+u */ + CTRL_W = 23, /* Ctrl+w */ + ESC = 27, /* Escape */ + BACKSPACE = 127 /* Backspace */ +}; + +static void linenoiseAtExit(void); +int linenoiseHistoryAdd(const char *line); +#define REFRESH_CLEAN (1<<0) // Clean the old prompt from the screen +#define REFRESH_WRITE (1<<1) // Rewrite the prompt on the screen. +#define REFRESH_ALL (REFRESH_CLEAN|REFRESH_WRITE) // Do both. +static void refreshLine(struct linenoiseState *l); + +class File { + public: + FILE * file = nullptr; + + FILE * open(const std::string & filename, const char * mode) { + file = fopen(filename.c_str(), mode); + + return file; + } + + int lock() { + if (file) { + fd = fileno(file); + if (flock(fd, LOCK_EX | LOCK_NB) != 0) { + fd = -1; + + return 1; + } + } + + return 0; + } + + ~File() { + if (fd >= 0) { + flock(fd, LOCK_UN); + } + + if (file) { + fclose(file); + } + } + + private: + int fd = -1; +}; + +#if 0 +/* Debugging function. */ +__attribute__((format(printf, 1, 2))) +static void lndebug(const char *fmt, ...) { + static File file; + if (file.file == nullptr) { + file.open("/tmp/lndebug.txt", "a"); + } + + if (file.file != nullptr) { + va_list args; + va_start(args, fmt); + vfprintf(file.file, fmt, args); + va_end(args); + fflush(file.file); + } +} +#endif + +/* ========================== Encoding functions ============================= */ + +/* Get length of previous UTF8 codepoint */ +static size_t prevUtf8CodePointLen(const char * buf, int pos) { + int end = pos--; + while (pos >= 0 && ((unsigned char) buf[pos] & 0xC0) == 0x80) { + pos--; + } + return end - pos; +} + +/* Convert UTF8 to Unicode code point */ +static size_t utf8BytesToCodePoint(const char * buf, size_t len, int * cp) { + if (len) { + unsigned char byte = buf[0]; + if ((byte & 0x80) == 0) { + *cp = byte; + return 1; + } else if ((byte & 0xE0) == 0xC0) { + if (len >= 2) { + *cp = (((unsigned long) (buf[0] & 0x1F)) << 6) | ((unsigned long) (buf[1] & 0x3F)); + return 2; + } + } else if ((byte & 0xF0) == 0xE0) { + if (len >= 3) { + *cp = (((unsigned long) (buf[0] & 0x0F)) << 12) | (((unsigned long) (buf[1] & 0x3F)) << 6) | + ((unsigned long) (buf[2] & 0x3F)); + return 3; + } + } else if ((byte & 0xF8) == 0xF0) { + if (len >= 4) { + *cp = (((unsigned long) (buf[0] & 0x07)) << 18) | (((unsigned long) (buf[1] & 0x3F)) << 12) | + (((unsigned long) (buf[2] & 0x3F)) << 6) | ((unsigned long) (buf[3] & 0x3F)); + return 4; + } + } + } + return 0; +} + +/* Check if the code is a wide character */ +static const unsigned long wideCharTable[][2] = { + /* BEGIN: WIDE CHAR TABLE */ + { 0x1100, 0x115F }, + { 0x231A, 0x231B }, + { 0x2329, 0x232A }, + { 0x23E9, 0x23EC }, + { 0x23F0, 0x23F0 }, + { 0x23F3, 0x23F3 }, + { 0x25FD, 0x25FE }, + { 0x2614, 0x2615 }, + { 0x2630, 0x2637 }, + { 0x2648, 0x2653 }, + { 0x267F, 0x267F }, + { 0x268A, 0x268F }, + { 0x2693, 0x2693 }, + { 0x26A1, 0x26A1 }, + { 0x26AA, 0x26AB }, + { 0x26BD, 0x26BE }, + { 0x26C4, 0x26C5 }, + { 0x26CE, 0x26CE }, + { 0x26D4, 0x26D4 }, + { 0x26EA, 0x26EA }, + { 0x26F2, 0x26F3 }, + { 0x26F5, 0x26F5 }, + { 0x26FA, 0x26FA }, + { 0x26FD, 0x26FD }, + { 0x2705, 0x2705 }, + { 0x270A, 0x270B }, + { 0x2728, 0x2728 }, + { 0x274C, 0x274C }, + { 0x274E, 0x274E }, + { 0x2753, 0x2755 }, + { 0x2757, 0x2757 }, + { 0x2795, 0x2797 }, + { 0x27B0, 0x27B0 }, + { 0x27BF, 0x27BF }, + { 0x2B1B, 0x2B1C }, + { 0x2B50, 0x2B50 }, + { 0x2B55, 0x2B55 }, + { 0x2E80, 0x2E99 }, + { 0x2E9B, 0x2EF3 }, + { 0x2F00, 0x2FD5 }, + { 0x2FF0, 0x303E }, + { 0x3041, 0x3096 }, + { 0x3099, 0x30FF }, + { 0x3105, 0x312F }, + { 0x3131, 0x318E }, + { 0x3190, 0x31E5 }, + { 0x31EF, 0x321E }, + { 0x3220, 0x3247 }, + { 0x3250, 0xA48C }, + { 0xA490, 0xA4C6 }, + { 0xA960, 0xA97C }, + { 0xAC00, 0xD7A3 }, + { 0xF900, 0xFAFF }, + { 0xFE10, 0xFE19 }, + { 0xFE30, 0xFE52 }, + { 0xFE54, 0xFE66 }, + { 0xFE68, 0xFE6B }, + { 0xFF01, 0xFF60 }, + { 0xFFE0, 0xFFE6 }, + { 0x16FE0, 0x16FE4 }, + { 0x16FF0, 0x16FF1 }, + { 0x17000, 0x187F7 }, + { 0x18800, 0x18CD5 }, + { 0x18CFF, 0x18D08 }, + { 0x1AFF0, 0x1AFF3 }, + { 0x1AFF5, 0x1AFFB }, + { 0x1AFFD, 0x1AFFE }, + { 0x1B000, 0x1B122 }, + { 0x1B132, 0x1B132 }, + { 0x1B150, 0x1B152 }, + { 0x1B155, 0x1B155 }, + { 0x1B164, 0x1B167 }, + { 0x1B170, 0x1B2FB }, + { 0x1D300, 0x1D356 }, + { 0x1D360, 0x1D376 }, + { 0x1F004, 0x1F004 }, + { 0x1F0CF, 0x1F0CF }, + { 0x1F18E, 0x1F18E }, + { 0x1F191, 0x1F19A }, + { 0x1F200, 0x1F202 }, + { 0x1F210, 0x1F23B }, + { 0x1F240, 0x1F248 }, + { 0x1F250, 0x1F251 }, + { 0x1F260, 0x1F265 }, + { 0x1F300, 0x1F320 }, + { 0x1F32D, 0x1F335 }, + { 0x1F337, 0x1F37C }, + { 0x1F37E, 0x1F393 }, + { 0x1F3A0, 0x1F3CA }, + { 0x1F3CF, 0x1F3D3 }, + { 0x1F3E0, 0x1F3F0 }, + { 0x1F3F4, 0x1F3F4 }, + { 0x1F3F8, 0x1F43E }, + { 0x1F440, 0x1F440 }, + { 0x1F442, 0x1F4FC }, + { 0x1F4FF, 0x1F53D }, + { 0x1F54B, 0x1F54E }, + { 0x1F550, 0x1F567 }, + { 0x1F57A, 0x1F57A }, + { 0x1F595, 0x1F596 }, + { 0x1F5A4, 0x1F5A4 }, + { 0x1F5FB, 0x1F64F }, + { 0x1F680, 0x1F6C5 }, + { 0x1F6CC, 0x1F6CC }, + { 0x1F6D0, 0x1F6D2 }, + { 0x1F6D5, 0x1F6D7 }, + { 0x1F6DC, 0x1F6DF }, + { 0x1F6EB, 0x1F6EC }, + { 0x1F6F4, 0x1F6FC }, + { 0x1F7E0, 0x1F7EB }, + { 0x1F7F0, 0x1F7F0 }, + { 0x1F90C, 0x1F93A }, + { 0x1F93C, 0x1F945 }, + { 0x1F947, 0x1F9FF }, + { 0x1FA70, 0x1FA7C }, + { 0x1FA80, 0x1FA89 }, + { 0x1FA8F, 0x1FAC6 }, + { 0x1FACE, 0x1FADC }, + { 0x1FADF, 0x1FAE9 }, + { 0x1FAF0, 0x1FAF8 }, + { 0x20000, 0x2FFFD }, + { 0x30000, 0x3FFFD } + /* END: WIDE CHAR TABLE */ +}; + +static const size_t wideCharTableSize = sizeof(wideCharTable) / sizeof(wideCharTable[0]); + +static bool isWideChar(unsigned long cp) { + for (size_t i = 0; i < wideCharTableSize; i++) { + auto first_code = wideCharTable[i][0]; + auto last_code = wideCharTable[i][1]; + if (first_code > cp) { + return false; + } + if (first_code <= cp && cp <= last_code) { + return true; + } + } + return false; +} + +/* Check if the code is a combining character */ +static const unsigned long combiningCharTable[] = { + /* BEGIN: COMBINING CHAR TABLE */ + 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, 0x0308, 0x0309, 0x030A, 0x030B, 0x030C, + 0x030D, 0x030E, 0x030F, 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, 0x0318, 0x0319, + 0x031A, 0x031B, 0x031C, 0x031D, 0x031E, 0x031F, 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, + 0x0327, 0x0328, 0x0329, 0x032A, 0x032B, 0x032C, 0x032D, 0x032E, 0x032F, 0x0330, 0x0331, 0x0332, 0x0333, + 0x0334, 0x0335, 0x0336, 0x0337, 0x0338, 0x0339, 0x033A, 0x033B, 0x033C, 0x033D, 0x033E, 0x033F, 0x0340, + 0x0341, 0x0342, 0x0343, 0x0344, 0x0345, 0x0346, 0x0347, 0x0348, 0x0349, 0x034A, 0x034B, 0x034C, 0x034D, + 0x034E, 0x034F, 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, 0x0358, 0x0359, 0x035A, + 0x035B, 0x035C, 0x035D, 0x035E, 0x035F, 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, + 0x0368, 0x0369, 0x036A, 0x036B, 0x036C, 0x036D, 0x036E, 0x036F, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, + 0x0591, 0x0592, 0x0593, 0x0594, 0x0595, 0x0596, 0x0597, 0x0598, 0x0599, 0x059A, 0x059B, 0x059C, 0x059D, + 0x059E, 0x059F, 0x05A0, 0x05A1, 0x05A2, 0x05A3, 0x05A4, 0x05A5, 0x05A6, 0x05A7, 0x05A8, 0x05A9, 0x05AA, + 0x05AB, 0x05AC, 0x05AD, 0x05AE, 0x05AF, 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, + 0x05B8, 0x05B9, 0x05BA, 0x05BB, 0x05BC, 0x05BD, 0x05BF, 0x05C1, 0x05C2, 0x05C4, 0x05C5, 0x05C7, 0x0610, + 0x0611, 0x0612, 0x0613, 0x0614, 0x0615, 0x0616, 0x0617, 0x0618, 0x0619, 0x061A, 0x064B, 0x064C, 0x064D, + 0x064E, 0x064F, 0x0650, 0x0651, 0x0652, 0x0653, 0x0654, 0x0655, 0x0656, 0x0657, 0x0658, 0x0659, 0x065A, + 0x065B, 0x065C, 0x065D, 0x065E, 0x065F, 0x0670, 0x06D6, 0x06D7, 0x06D8, 0x06D9, 0x06DA, 0x06DB, 0x06DC, + 0x06DF, 0x06E0, 0x06E1, 0x06E2, 0x06E3, 0x06E4, 0x06E7, 0x06E8, 0x06EA, 0x06EB, 0x06EC, 0x06ED, 0x0711, + 0x0730, 0x0731, 0x0732, 0x0733, 0x0734, 0x0735, 0x0736, 0x0737, 0x0738, 0x0739, 0x073A, 0x073B, 0x073C, + 0x073D, 0x073E, 0x073F, 0x0740, 0x0741, 0x0742, 0x0743, 0x0744, 0x0745, 0x0746, 0x0747, 0x0748, 0x0749, + 0x074A, 0x07A6, 0x07A7, 0x07A8, 0x07A9, 0x07AA, 0x07AB, 0x07AC, 0x07AD, 0x07AE, 0x07AF, 0x07B0, 0x07EB, + 0x07EC, 0x07ED, 0x07EE, 0x07EF, 0x07F0, 0x07F1, 0x07F2, 0x07F3, 0x07FD, 0x0816, 0x0817, 0x0818, 0x0819, + 0x081B, 0x081C, 0x081D, 0x081E, 0x081F, 0x0820, 0x0821, 0x0822, 0x0823, 0x0825, 0x0826, 0x0827, 0x0829, + 0x082A, 0x082B, 0x082C, 0x082D, 0x0859, 0x085A, 0x085B, 0x0897, 0x0898, 0x0899, 0x089A, 0x089B, 0x089C, + 0x089D, 0x089E, 0x089F, 0x08CA, 0x08CB, 0x08CC, 0x08CD, 0x08CE, 0x08CF, 0x08D0, 0x08D1, 0x08D2, 0x08D3, + 0x08D4, 0x08D5, 0x08D6, 0x08D7, 0x08D8, 0x08D9, 0x08DA, 0x08DB, 0x08DC, 0x08DD, 0x08DE, 0x08DF, 0x08E0, + 0x08E1, 0x08E3, 0x08E4, 0x08E5, 0x08E6, 0x08E7, 0x08E8, 0x08E9, 0x08EA, 0x08EB, 0x08EC, 0x08ED, 0x08EE, + 0x08EF, 0x08F0, 0x08F1, 0x08F2, 0x08F3, 0x08F4, 0x08F5, 0x08F6, 0x08F7, 0x08F8, 0x08F9, 0x08FA, 0x08FB, + 0x08FC, 0x08FD, 0x08FE, 0x08FF, 0x0900, 0x0901, 0x0902, 0x093A, 0x093C, 0x0941, 0x0942, 0x0943, 0x0944, + 0x0945, 0x0946, 0x0947, 0x0948, 0x094D, 0x0951, 0x0952, 0x0953, 0x0954, 0x0955, 0x0956, 0x0957, 0x0962, + 0x0963, 0x0981, 0x09BC, 0x09C1, 0x09C2, 0x09C3, 0x09C4, 0x09CD, 0x09E2, 0x09E3, 0x09FE, 0x0A01, 0x0A02, + 0x0A3C, 0x0A41, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4C, 0x0A4D, 0x0A51, 0x0A70, 0x0A71, 0x0A75, 0x0A81, + 0x0A82, 0x0ABC, 0x0AC1, 0x0AC2, 0x0AC3, 0x0AC4, 0x0AC5, 0x0AC7, 0x0AC8, 0x0ACD, 0x0AE2, 0x0AE3, 0x0AFA, + 0x0AFB, 0x0AFC, 0x0AFD, 0x0AFE, 0x0AFF, 0x0B01, 0x0B3C, 0x0B3F, 0x0B41, 0x0B42, 0x0B43, 0x0B44, 0x0B4D, + 0x0B55, 0x0B56, 0x0B62, 0x0B63, 0x0B82, 0x0BC0, 0x0BCD, 0x0C00, 0x0C04, 0x0C3C, 0x0C3E, 0x0C3F, 0x0C40, + 0x0C46, 0x0C47, 0x0C48, 0x0C4A, 0x0C4B, 0x0C4C, 0x0C4D, 0x0C55, 0x0C56, 0x0C62, 0x0C63, 0x0C81, 0x0CBC, + 0x0CBF, 0x0CC6, 0x0CCC, 0x0CCD, 0x0CE2, 0x0CE3, 0x0D00, 0x0D01, 0x0D3B, 0x0D3C, 0x0D41, 0x0D42, 0x0D43, + 0x0D44, 0x0D4D, 0x0D62, 0x0D63, 0x0D81, 0x0DCA, 0x0DD2, 0x0DD3, 0x0DD4, 0x0DD6, 0x0E31, 0x0E34, 0x0E35, + 0x0E36, 0x0E37, 0x0E38, 0x0E39, 0x0E3A, 0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, + 0x0EB1, 0x0EB4, 0x0EB5, 0x0EB6, 0x0EB7, 0x0EB8, 0x0EB9, 0x0EBA, 0x0EBB, 0x0EBC, 0x0EC8, 0x0EC9, 0x0ECA, + 0x0ECB, 0x0ECC, 0x0ECD, 0x0ECE, 0x0F18, 0x0F19, 0x0F35, 0x0F37, 0x0F39, 0x0F71, 0x0F72, 0x0F73, 0x0F74, + 0x0F75, 0x0F76, 0x0F77, 0x0F78, 0x0F79, 0x0F7A, 0x0F7B, 0x0F7C, 0x0F7D, 0x0F7E, 0x0F80, 0x0F81, 0x0F82, + 0x0F83, 0x0F84, 0x0F86, 0x0F87, 0x0F8D, 0x0F8E, 0x0F8F, 0x0F90, 0x0F91, 0x0F92, 0x0F93, 0x0F94, 0x0F95, + 0x0F96, 0x0F97, 0x0F99, 0x0F9A, 0x0F9B, 0x0F9C, 0x0F9D, 0x0F9E, 0x0F9F, 0x0FA0, 0x0FA1, 0x0FA2, 0x0FA3, + 0x0FA4, 0x0FA5, 0x0FA6, 0x0FA7, 0x0FA8, 0x0FA9, 0x0FAA, 0x0FAB, 0x0FAC, 0x0FAD, 0x0FAE, 0x0FAF, 0x0FB0, + 0x0FB1, 0x0FB2, 0x0FB3, 0x0FB4, 0x0FB5, 0x0FB6, 0x0FB7, 0x0FB8, 0x0FB9, 0x0FBA, 0x0FBB, 0x0FBC, 0x0FC6, + 0x102D, 0x102E, 0x102F, 0x1030, 0x1032, 0x1033, 0x1034, 0x1035, 0x1036, 0x1037, 0x1039, 0x103A, 0x103D, + 0x103E, 0x1058, 0x1059, 0x105E, 0x105F, 0x1060, 0x1071, 0x1072, 0x1073, 0x1074, 0x1082, 0x1085, 0x1086, + 0x108D, 0x109D, 0x135D, 0x135E, 0x135F, 0x1712, 0x1713, 0x1714, 0x1732, 0x1733, 0x1752, 0x1753, 0x1772, + 0x1773, 0x17B4, 0x17B5, 0x17B7, 0x17B8, 0x17B9, 0x17BA, 0x17BB, 0x17BC, 0x17BD, 0x17C6, 0x17C9, 0x17CA, + 0x17CB, 0x17CC, 0x17CD, 0x17CE, 0x17CF, 0x17D0, 0x17D1, 0x17D2, 0x17D3, 0x17DD, 0x180B, 0x180C, 0x180D, + 0x180F, 0x1885, 0x1886, 0x18A9, 0x1920, 0x1921, 0x1922, 0x1927, 0x1928, 0x1932, 0x1939, 0x193A, 0x193B, + 0x1A17, 0x1A18, 0x1A1B, 0x1A56, 0x1A58, 0x1A59, 0x1A5A, 0x1A5B, 0x1A5C, 0x1A5D, 0x1A5E, 0x1A60, 0x1A62, + 0x1A65, 0x1A66, 0x1A67, 0x1A68, 0x1A69, 0x1A6A, 0x1A6B, 0x1A6C, 0x1A73, 0x1A74, 0x1A75, 0x1A76, 0x1A77, + 0x1A78, 0x1A79, 0x1A7A, 0x1A7B, 0x1A7C, 0x1A7F, 0x1AB0, 0x1AB1, 0x1AB2, 0x1AB3, 0x1AB4, 0x1AB5, 0x1AB6, + 0x1AB7, 0x1AB8, 0x1AB9, 0x1ABA, 0x1ABB, 0x1ABC, 0x1ABD, 0x1ABF, 0x1AC0, 0x1AC1, 0x1AC2, 0x1AC3, 0x1AC4, + 0x1AC5, 0x1AC6, 0x1AC7, 0x1AC8, 0x1AC9, 0x1ACA, 0x1ACB, 0x1ACC, 0x1ACD, 0x1ACE, 0x1B00, 0x1B01, 0x1B02, + 0x1B03, 0x1B34, 0x1B36, 0x1B37, 0x1B38, 0x1B39, 0x1B3A, 0x1B3C, 0x1B42, 0x1B6B, 0x1B6C, 0x1B6D, 0x1B6E, + 0x1B6F, 0x1B70, 0x1B71, 0x1B72, 0x1B73, 0x1B80, 0x1B81, 0x1BA2, 0x1BA3, 0x1BA4, 0x1BA5, 0x1BA8, 0x1BA9, + 0x1BAB, 0x1BAC, 0x1BAD, 0x1BE6, 0x1BE8, 0x1BE9, 0x1BED, 0x1BEF, 0x1BF0, 0x1BF1, 0x1C2C, 0x1C2D, 0x1C2E, + 0x1C2F, 0x1C30, 0x1C31, 0x1C32, 0x1C33, 0x1C36, 0x1C37, 0x1CD0, 0x1CD1, 0x1CD2, 0x1CD4, 0x1CD5, 0x1CD6, + 0x1CD7, 0x1CD8, 0x1CD9, 0x1CDA, 0x1CDB, 0x1CDC, 0x1CDD, 0x1CDE, 0x1CDF, 0x1CE0, 0x1CE2, 0x1CE3, 0x1CE4, + 0x1CE5, 0x1CE6, 0x1CE7, 0x1CE8, 0x1CED, 0x1CF4, 0x1CF8, 0x1CF9, 0x1DC0, 0x1DC1, 0x1DC2, 0x1DC3, 0x1DC4, + 0x1DC5, 0x1DC6, 0x1DC7, 0x1DC8, 0x1DC9, 0x1DCA, 0x1DCB, 0x1DCC, 0x1DCD, 0x1DCE, 0x1DCF, 0x1DD0, 0x1DD1, + 0x1DD2, 0x1DD3, 0x1DD4, 0x1DD5, 0x1DD6, 0x1DD7, 0x1DD8, 0x1DD9, 0x1DDA, 0x1DDB, 0x1DDC, 0x1DDD, 0x1DDE, + 0x1DDF, 0x1DE0, 0x1DE1, 0x1DE2, 0x1DE3, 0x1DE4, 0x1DE5, 0x1DE6, 0x1DE7, 0x1DE8, 0x1DE9, 0x1DEA, 0x1DEB, + 0x1DEC, 0x1DED, 0x1DEE, 0x1DEF, 0x1DF0, 0x1DF1, 0x1DF2, 0x1DF3, 0x1DF4, 0x1DF5, 0x1DF6, 0x1DF7, 0x1DF8, + 0x1DF9, 0x1DFA, 0x1DFB, 0x1DFC, 0x1DFD, 0x1DFE, 0x1DFF, 0x20D0, 0x20D1, 0x20D2, 0x20D3, 0x20D4, 0x20D5, + 0x20D6, 0x20D7, 0x20D8, 0x20D9, 0x20DA, 0x20DB, 0x20DC, 0x20E1, 0x20E5, 0x20E6, 0x20E7, 0x20E8, 0x20E9, + 0x20EA, 0x20EB, 0x20EC, 0x20ED, 0x20EE, 0x20EF, 0x20F0, 0x2CEF, 0x2CF0, 0x2CF1, 0x2D7F, 0x2DE0, 0x2DE1, + 0x2DE2, 0x2DE3, 0x2DE4, 0x2DE5, 0x2DE6, 0x2DE7, 0x2DE8, 0x2DE9, 0x2DEA, 0x2DEB, 0x2DEC, 0x2DED, 0x2DEE, + 0x2DEF, 0x2DF0, 0x2DF1, 0x2DF2, 0x2DF3, 0x2DF4, 0x2DF5, 0x2DF6, 0x2DF7, 0x2DF8, 0x2DF9, 0x2DFA, 0x2DFB, + 0x2DFC, 0x2DFD, 0x2DFE, 0x2DFF, 0x302A, 0x302B, 0x302C, 0x302D, 0x3099, 0x309A, 0xA66F, 0xA674, 0xA675, + 0xA676, 0xA677, 0xA678, 0xA679, 0xA67A, 0xA67B, 0xA67C, 0xA67D, 0xA69E, 0xA69F, 0xA6F0, 0xA6F1, 0xA802, + 0xA806, 0xA80B, 0xA825, 0xA826, 0xA82C, 0xA8C4, 0xA8C5, 0xA8E0, 0xA8E1, 0xA8E2, 0xA8E3, 0xA8E4, 0xA8E5, + 0xA8E6, 0xA8E7, 0xA8E8, 0xA8E9, 0xA8EA, 0xA8EB, 0xA8EC, 0xA8ED, 0xA8EE, 0xA8EF, 0xA8F0, 0xA8F1, 0xA8FF, + 0xA926, 0xA927, 0xA928, 0xA929, 0xA92A, 0xA92B, 0xA92C, 0xA92D, 0xA947, 0xA948, 0xA949, 0xA94A, 0xA94B, + 0xA94C, 0xA94D, 0xA94E, 0xA94F, 0xA950, 0xA951, 0xA980, 0xA981, 0xA982, 0xA9B3, 0xA9B6, 0xA9B7, 0xA9B8, + 0xA9B9, 0xA9BC, 0xA9BD, 0xA9E5, 0xAA29, 0xAA2A, 0xAA2B, 0xAA2C, 0xAA2D, 0xAA2E, 0xAA31, 0xAA32, 0xAA35, + 0xAA36, 0xAA43, 0xAA4C, 0xAA7C, 0xAAB0, 0xAAB2, 0xAAB3, 0xAAB4, 0xAAB7, 0xAAB8, 0xAABE, 0xAABF, 0xAAC1, + 0xAAEC, 0xAAED, 0xAAF6, 0xABE5, 0xABE8, 0xABED, 0xFB1E, 0xFE00, 0xFE01, 0xFE02, 0xFE03, 0xFE04, 0xFE05, + 0xFE06, 0xFE07, 0xFE08, 0xFE09, 0xFE0A, 0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E, 0xFE0F, 0xFE20, 0xFE21, 0xFE22, + 0xFE23, 0xFE24, 0xFE25, 0xFE26, 0xFE27, 0xFE28, 0xFE29, 0xFE2A, 0xFE2B, 0xFE2C, 0xFE2D, 0xFE2E, 0xFE2F, + 0x101FD, 0x102E0, 0x10376, 0x10377, 0x10378, 0x10379, 0x1037A, 0x10A01, 0x10A02, 0x10A03, 0x10A05, 0x10A06, 0x10A0C, + 0x10A0D, 0x10A0E, 0x10A0F, 0x10A38, 0x10A39, 0x10A3A, 0x10A3F, 0x10AE5, 0x10AE6, 0x10D24, 0x10D25, 0x10D26, 0x10D27, + 0x10D69, 0x10D6A, 0x10D6B, 0x10D6C, 0x10D6D, 0x10EAB, 0x10EAC, 0x10EFC, 0x10EFD, 0x10EFE, 0x10EFF, 0x10F46, 0x10F47, + 0x10F48, 0x10F49, 0x10F4A, 0x10F4B, 0x10F4C, 0x10F4D, 0x10F4E, 0x10F4F, 0x10F50, 0x10F82, 0x10F83, 0x10F84, 0x10F85, + 0x11001, 0x11038, 0x11039, 0x1103A, 0x1103B, 0x1103C, 0x1103D, 0x1103E, 0x1103F, 0x11040, 0x11041, 0x11042, 0x11043, + 0x11044, 0x11045, 0x11046, 0x11070, 0x11073, 0x11074, 0x1107F, 0x11080, 0x11081, 0x110B3, 0x110B4, 0x110B5, 0x110B6, + 0x110B9, 0x110BA, 0x110C2, 0x11100, 0x11101, 0x11102, 0x11127, 0x11128, 0x11129, 0x1112A, 0x1112B, 0x1112D, 0x1112E, + 0x1112F, 0x11130, 0x11131, 0x11132, 0x11133, 0x11134, 0x11173, 0x11180, 0x11181, 0x111B6, 0x111B7, 0x111B8, 0x111B9, + 0x111BA, 0x111BB, 0x111BC, 0x111BD, 0x111BE, 0x111C9, 0x111CA, 0x111CB, 0x111CC, 0x111CF, 0x1122F, 0x11230, 0x11231, + 0x11234, 0x11236, 0x11237, 0x1123E, 0x11241, 0x112DF, 0x112E3, 0x112E4, 0x112E5, 0x112E6, 0x112E7, 0x112E8, 0x112E9, + 0x112EA, 0x11300, 0x11301, 0x1133B, 0x1133C, 0x11340, 0x11366, 0x11367, 0x11368, 0x11369, 0x1136A, 0x1136B, 0x1136C, + 0x11370, 0x11371, 0x11372, 0x11373, 0x11374, 0x113BB, 0x113BC, 0x113BD, 0x113BE, 0x113BF, 0x113C0, 0x113CE, 0x113D0, + 0x113D2, 0x113E1, 0x113E2, 0x11438, 0x11439, 0x1143A, 0x1143B, 0x1143C, 0x1143D, 0x1143E, 0x1143F, 0x11442, 0x11443, + 0x11444, 0x11446, 0x1145E, 0x114B3, 0x114B4, 0x114B5, 0x114B6, 0x114B7, 0x114B8, 0x114BA, 0x114BF, 0x114C0, 0x114C2, + 0x114C3, 0x115B2, 0x115B3, 0x115B4, 0x115B5, 0x115BC, 0x115BD, 0x115BF, 0x115C0, 0x115DC, 0x115DD, 0x11633, 0x11634, + 0x11635, 0x11636, 0x11637, 0x11638, 0x11639, 0x1163A, 0x1163D, 0x1163F, 0x11640, 0x116AB, 0x116AD, 0x116B0, 0x116B1, + 0x116B2, 0x116B3, 0x116B4, 0x116B5, 0x116B7, 0x1171D, 0x1171F, 0x11722, 0x11723, 0x11724, 0x11725, 0x11727, 0x11728, + 0x11729, 0x1172A, 0x1172B, 0x1182F, 0x11830, 0x11831, 0x11832, 0x11833, 0x11834, 0x11835, 0x11836, 0x11837, 0x11839, + 0x1183A, 0x1193B, 0x1193C, 0x1193E, 0x11943, 0x119D4, 0x119D5, 0x119D6, 0x119D7, 0x119DA, 0x119DB, 0x119E0, 0x11A01, + 0x11A02, 0x11A03, 0x11A04, 0x11A05, 0x11A06, 0x11A07, 0x11A08, 0x11A09, 0x11A0A, 0x11A33, 0x11A34, 0x11A35, 0x11A36, + 0x11A37, 0x11A38, 0x11A3B, 0x11A3C, 0x11A3D, 0x11A3E, 0x11A47, 0x11A51, 0x11A52, 0x11A53, 0x11A54, 0x11A55, 0x11A56, + 0x11A59, 0x11A5A, 0x11A5B, 0x11A8A, 0x11A8B, 0x11A8C, 0x11A8D, 0x11A8E, 0x11A8F, 0x11A90, 0x11A91, 0x11A92, 0x11A93, + 0x11A94, 0x11A95, 0x11A96, 0x11A98, 0x11A99, 0x11C30, 0x11C31, 0x11C32, 0x11C33, 0x11C34, 0x11C35, 0x11C36, 0x11C38, + 0x11C39, 0x11C3A, 0x11C3B, 0x11C3C, 0x11C3D, 0x11C3F, 0x11C92, 0x11C93, 0x11C94, 0x11C95, 0x11C96, 0x11C97, 0x11C98, + 0x11C99, 0x11C9A, 0x11C9B, 0x11C9C, 0x11C9D, 0x11C9E, 0x11C9F, 0x11CA0, 0x11CA1, 0x11CA2, 0x11CA3, 0x11CA4, 0x11CA5, + 0x11CA6, 0x11CA7, 0x11CAA, 0x11CAB, 0x11CAC, 0x11CAD, 0x11CAE, 0x11CAF, 0x11CB0, 0x11CB2, 0x11CB3, 0x11CB5, 0x11CB6, + 0x11D31, 0x11D32, 0x11D33, 0x11D34, 0x11D35, 0x11D36, 0x11D3A, 0x11D3C, 0x11D3D, 0x11D3F, 0x11D40, 0x11D41, 0x11D42, + 0x11D43, 0x11D44, 0x11D45, 0x11D47, 0x11D90, 0x11D91, 0x11D95, 0x11D97, 0x11EF3, 0x11EF4, 0x11F00, 0x11F01, 0x11F36, + 0x11F37, 0x11F38, 0x11F39, 0x11F3A, 0x11F40, 0x11F42, 0x11F5A, 0x13440, 0x13447, 0x13448, 0x13449, 0x1344A, 0x1344B, + 0x1344C, 0x1344D, 0x1344E, 0x1344F, 0x13450, 0x13451, 0x13452, 0x13453, 0x13454, 0x13455, 0x1611E, 0x1611F, 0x16120, + 0x16121, 0x16122, 0x16123, 0x16124, 0x16125, 0x16126, 0x16127, 0x16128, 0x16129, 0x1612D, 0x1612E, 0x1612F, 0x16AF0, + 0x16AF1, 0x16AF2, 0x16AF3, 0x16AF4, 0x16B30, 0x16B31, 0x16B32, 0x16B33, 0x16B34, 0x16B35, 0x16B36, 0x16F4F, 0x16F8F, + 0x16F90, 0x16F91, 0x16F92, 0x16FE4, 0x1BC9D, 0x1BC9E, 0x1CF00, 0x1CF01, 0x1CF02, 0x1CF03, 0x1CF04, 0x1CF05, 0x1CF06, + 0x1CF07, 0x1CF08, 0x1CF09, 0x1CF0A, 0x1CF0B, 0x1CF0C, 0x1CF0D, 0x1CF0E, 0x1CF0F, 0x1CF10, 0x1CF11, 0x1CF12, 0x1CF13, + 0x1CF14, 0x1CF15, 0x1CF16, 0x1CF17, 0x1CF18, 0x1CF19, 0x1CF1A, 0x1CF1B, 0x1CF1C, 0x1CF1D, 0x1CF1E, 0x1CF1F, 0x1CF20, + 0x1CF21, 0x1CF22, 0x1CF23, 0x1CF24, 0x1CF25, 0x1CF26, 0x1CF27, 0x1CF28, 0x1CF29, 0x1CF2A, 0x1CF2B, 0x1CF2C, 0x1CF2D, + 0x1CF30, 0x1CF31, 0x1CF32, 0x1CF33, 0x1CF34, 0x1CF35, 0x1CF36, 0x1CF37, 0x1CF38, 0x1CF39, 0x1CF3A, 0x1CF3B, 0x1CF3C, + 0x1CF3D, 0x1CF3E, 0x1CF3F, 0x1CF40, 0x1CF41, 0x1CF42, 0x1CF43, 0x1CF44, 0x1CF45, 0x1CF46, 0x1D167, 0x1D168, 0x1D169, + 0x1D17B, 0x1D17C, 0x1D17D, 0x1D17E, 0x1D17F, 0x1D180, 0x1D181, 0x1D182, 0x1D185, 0x1D186, 0x1D187, 0x1D188, 0x1D189, + 0x1D18A, 0x1D18B, 0x1D1AA, 0x1D1AB, 0x1D1AC, 0x1D1AD, 0x1D242, 0x1D243, 0x1D244, 0x1DA00, 0x1DA01, 0x1DA02, 0x1DA03, + 0x1DA04, 0x1DA05, 0x1DA06, 0x1DA07, 0x1DA08, 0x1DA09, 0x1DA0A, 0x1DA0B, 0x1DA0C, 0x1DA0D, 0x1DA0E, 0x1DA0F, 0x1DA10, + 0x1DA11, 0x1DA12, 0x1DA13, 0x1DA14, 0x1DA15, 0x1DA16, 0x1DA17, 0x1DA18, 0x1DA19, 0x1DA1A, 0x1DA1B, 0x1DA1C, 0x1DA1D, + 0x1DA1E, 0x1DA1F, 0x1DA20, 0x1DA21, 0x1DA22, 0x1DA23, 0x1DA24, 0x1DA25, 0x1DA26, 0x1DA27, 0x1DA28, 0x1DA29, 0x1DA2A, + 0x1DA2B, 0x1DA2C, 0x1DA2D, 0x1DA2E, 0x1DA2F, 0x1DA30, 0x1DA31, 0x1DA32, 0x1DA33, 0x1DA34, 0x1DA35, 0x1DA36, 0x1DA3B, + 0x1DA3C, 0x1DA3D, 0x1DA3E, 0x1DA3F, 0x1DA40, 0x1DA41, 0x1DA42, 0x1DA43, 0x1DA44, 0x1DA45, 0x1DA46, 0x1DA47, 0x1DA48, + 0x1DA49, 0x1DA4A, 0x1DA4B, 0x1DA4C, 0x1DA4D, 0x1DA4E, 0x1DA4F, 0x1DA50, 0x1DA51, 0x1DA52, 0x1DA53, 0x1DA54, 0x1DA55, + 0x1DA56, 0x1DA57, 0x1DA58, 0x1DA59, 0x1DA5A, 0x1DA5B, 0x1DA5C, 0x1DA5D, 0x1DA5E, 0x1DA5F, 0x1DA60, 0x1DA61, 0x1DA62, + 0x1DA63, 0x1DA64, 0x1DA65, 0x1DA66, 0x1DA67, 0x1DA68, 0x1DA69, 0x1DA6A, 0x1DA6B, 0x1DA6C, 0x1DA75, 0x1DA84, 0x1DA9B, + 0x1DA9C, 0x1DA9D, 0x1DA9E, 0x1DA9F, 0x1DAA1, 0x1DAA2, 0x1DAA3, 0x1DAA4, 0x1DAA5, 0x1DAA6, 0x1DAA7, 0x1DAA8, 0x1DAA9, + 0x1DAAA, 0x1DAAB, 0x1DAAC, 0x1DAAD, 0x1DAAE, 0x1DAAF, 0x1E000, 0x1E001, 0x1E002, 0x1E003, 0x1E004, 0x1E005, 0x1E006, + 0x1E008, 0x1E009, 0x1E00A, 0x1E00B, 0x1E00C, 0x1E00D, 0x1E00E, 0x1E00F, 0x1E010, 0x1E011, 0x1E012, 0x1E013, 0x1E014, + 0x1E015, 0x1E016, 0x1E017, 0x1E018, 0x1E01B, 0x1E01C, 0x1E01D, 0x1E01E, 0x1E01F, 0x1E020, 0x1E021, 0x1E023, 0x1E024, + 0x1E026, 0x1E027, 0x1E028, 0x1E029, 0x1E02A, 0x1E08F, 0x1E130, 0x1E131, 0x1E132, 0x1E133, 0x1E134, 0x1E135, 0x1E136, + 0x1E2AE, 0x1E2EC, 0x1E2ED, 0x1E2EE, 0x1E2EF, 0x1E4EC, 0x1E4ED, 0x1E4EE, 0x1E4EF, 0x1E5EE, 0x1E5EF, 0x1E8D0, 0x1E8D1, + 0x1E8D2, 0x1E8D3, 0x1E8D4, 0x1E8D5, 0x1E8D6, 0x1E944, 0x1E945, 0x1E946, 0x1E947, 0x1E948, 0x1E949, 0x1E94A, 0xE0100, + 0xE0101, 0xE0102, 0xE0103, 0xE0104, 0xE0105, 0xE0106, 0xE0107, 0xE0108, 0xE0109, 0xE010A, 0xE010B, 0xE010C, 0xE010D, + 0xE010E, 0xE010F, 0xE0110, 0xE0111, 0xE0112, 0xE0113, 0xE0114, 0xE0115, 0xE0116, 0xE0117, 0xE0118, 0xE0119, 0xE011A, + 0xE011B, 0xE011C, 0xE011D, 0xE011E, 0xE011F, 0xE0120, 0xE0121, 0xE0122, 0xE0123, 0xE0124, 0xE0125, 0xE0126, 0xE0127, + 0xE0128, 0xE0129, 0xE012A, 0xE012B, 0xE012C, 0xE012D, 0xE012E, 0xE012F, 0xE0130, 0xE0131, 0xE0132, 0xE0133, 0xE0134, + 0xE0135, 0xE0136, 0xE0137, 0xE0138, 0xE0139, 0xE013A, 0xE013B, 0xE013C, 0xE013D, 0xE013E, 0xE013F, 0xE0140, 0xE0141, + 0xE0142, 0xE0143, 0xE0144, 0xE0145, 0xE0146, 0xE0147, 0xE0148, 0xE0149, 0xE014A, 0xE014B, 0xE014C, 0xE014D, 0xE014E, + 0xE014F, 0xE0150, 0xE0151, 0xE0152, 0xE0153, 0xE0154, 0xE0155, 0xE0156, 0xE0157, 0xE0158, 0xE0159, 0xE015A, 0xE015B, + 0xE015C, 0xE015D, 0xE015E, 0xE015F, 0xE0160, 0xE0161, 0xE0162, 0xE0163, 0xE0164, 0xE0165, 0xE0166, 0xE0167, 0xE0168, + 0xE0169, 0xE016A, 0xE016B, 0xE016C, 0xE016D, 0xE016E, 0xE016F, 0xE0170, 0xE0171, 0xE0172, 0xE0173, 0xE0174, 0xE0175, + 0xE0176, 0xE0177, 0xE0178, 0xE0179, 0xE017A, 0xE017B, 0xE017C, 0xE017D, 0xE017E, 0xE017F, 0xE0180, 0xE0181, 0xE0182, + 0xE0183, 0xE0184, 0xE0185, 0xE0186, 0xE0187, 0xE0188, 0xE0189, 0xE018A, 0xE018B, 0xE018C, 0xE018D, 0xE018E, 0xE018F, + 0xE0190, 0xE0191, 0xE0192, 0xE0193, 0xE0194, 0xE0195, 0xE0196, 0xE0197, 0xE0198, 0xE0199, 0xE019A, 0xE019B, 0xE019C, + 0xE019D, 0xE019E, 0xE019F, 0xE01A0, 0xE01A1, 0xE01A2, 0xE01A3, 0xE01A4, 0xE01A5, 0xE01A6, 0xE01A7, 0xE01A8, 0xE01A9, + 0xE01AA, 0xE01AB, 0xE01AC, 0xE01AD, 0xE01AE, 0xE01AF, 0xE01B0, 0xE01B1, 0xE01B2, 0xE01B3, 0xE01B4, 0xE01B5, 0xE01B6, + 0xE01B7, 0xE01B8, 0xE01B9, 0xE01BA, 0xE01BB, 0xE01BC, 0xE01BD, 0xE01BE, 0xE01BF, 0xE01C0, 0xE01C1, 0xE01C2, 0xE01C3, + 0xE01C4, 0xE01C5, 0xE01C6, 0xE01C7, 0xE01C8, 0xE01C9, 0xE01CA, 0xE01CB, 0xE01CC, 0xE01CD, 0xE01CE, 0xE01CF, 0xE01D0, + 0xE01D1, 0xE01D2, 0xE01D3, 0xE01D4, 0xE01D5, 0xE01D6, 0xE01D7, 0xE01D8, 0xE01D9, 0xE01DA, 0xE01DB, 0xE01DC, 0xE01DD, + 0xE01DE, 0xE01DF, 0xE01E0, 0xE01E1, 0xE01E2, 0xE01E3, 0xE01E4, 0xE01E5, 0xE01E6, 0xE01E7, 0xE01E8, 0xE01E9, 0xE01EA, + 0xE01EB, 0xE01EC, 0xE01ED, 0xE01EE, 0xE01EF + /* END: COMBINING CHAR TABLE */ +}; + +static const unsigned long combiningCharTableSize = sizeof(combiningCharTable) / sizeof(combiningCharTable[0]); + +static bool isCombiningChar(unsigned long cp) { + for (size_t i = 0; i < combiningCharTableSize; i++) { + auto code = combiningCharTable[i]; + if (code > cp) { + return false; + } + if (code == cp) { + return true; + } + } + return false; +} + +/* Get length of previous grapheme */ +static size_t defaultPrevCharLen(const char * buf, size_t /*buf_len*/, size_t pos, size_t * col_len) { + size_t end = pos; + while (pos > 0) { + size_t len = prevUtf8CodePointLen(buf, pos); + pos -= len; + int cp; + utf8BytesToCodePoint(buf + pos, len, &cp); + if (!isCombiningChar(cp)) { + if (col_len != NULL) { + *col_len = isWideChar(cp) ? 2 : 1; + } + return end - pos; + } + } + /* NOTREACHED */ + return 0; +} + +/* Get length of next grapheme */ +static size_t defaultNextCharLen(const char * buf, size_t buf_len, size_t pos, size_t * col_len) { + size_t beg = pos; + int cp; + size_t len = utf8BytesToCodePoint(buf + pos, buf_len - pos, &cp); + if (isCombiningChar(cp)) { + /* NOTREACHED */ + return 0; + } + if (col_len != NULL) { + *col_len = isWideChar(cp) ? 2 : 1; + } + pos += len; + while (pos < buf_len) { + int cp; + len = utf8BytesToCodePoint(buf + pos, buf_len - pos, &cp); + if (!isCombiningChar(cp)) { + return pos - beg; + } + pos += len; + } + return pos - beg; +} + +/* Read a Unicode from file. */ +static size_t defaultReadCode(int fd, char * buf, size_t buf_len, int * cp) { + if (buf_len < 1) { + return -1; + } + size_t nread = read(fd, &buf[0], 1); + if (nread <= 0) { + return nread; + } + + unsigned char byte = buf[0]; + if ((byte & 0x80) == 0) { + ; + } else if ((byte & 0xE0) == 0xC0) { + if (buf_len < 2) { + return -1; + } + nread = read(fd, &buf[1], 1); + if (nread <= 0) { + return nread; + } + } else if ((byte & 0xF0) == 0xE0) { + if (buf_len < 3) { + return -1; + } + nread = read(fd, &buf[1], 2); + if (nread <= 0) { + return nread; + } + } else if ((byte & 0xF8) == 0xF0) { + if (buf_len < 3) { + return -1; + } + nread = read(fd, &buf[1], 3); + if (nread <= 0) { + return nread; + } + } else { + return -1; + } + + return utf8BytesToCodePoint(buf, buf_len, cp); +} + +/* Set default encoding functions */ +static linenoisePrevCharLen * prevCharLen = defaultPrevCharLen; +static linenoiseNextCharLen * nextCharLen = defaultNextCharLen; +static linenoiseReadCode * readCode = defaultReadCode; + +/* Set used defined encoding functions */ +void linenoiseSetEncodingFunctions(linenoisePrevCharLen * prevCharLenFunc, linenoiseNextCharLen * nextCharLenFunc, + linenoiseReadCode * readCodeFunc) { + prevCharLen = prevCharLenFunc; + nextCharLen = nextCharLenFunc; + readCode = readCodeFunc; +} + +/* ======================= Low level terminal handling ====================== */ + +/* Enable "mask mode". When it is enabled, instead of the input that + * the user is typing, the terminal will just display a corresponding + * number of asterisks, like "****". This is useful for passwords and other + * secrets that should not be displayed. */ +void linenoiseMaskModeEnable(void) { + maskmode = 1; +} + +/* Disable mask mode. */ +void linenoiseMaskModeDisable(void) { + maskmode = 0; +} + +/* Set if to use or not the multi line mode. */ +void linenoiseSetMultiLine(int ml) { + mlmode = ml; +} + +/* Return true if the terminal name is in the list of terminals we know are + * not able to understand basic escape sequences. */ +static int isUnsupportedTerm(void) { + char *term = getenv("TERM"); + if (term == NULL) return 0; + for (size_t j = 0; j < unsupported_term.size(); ++j) { + if (!strcasecmp(term, unsupported_term[j])) { + return 1; + } + } + return 0; +} + +/* Raw mode: 1960 magic shit. */ +static int enableRawMode(int fd) { + struct termios raw; + + if (!isatty(STDIN_FILENO)) goto fatal; + if (!atexit_registered) { + atexit(linenoiseAtExit); + atexit_registered = 1; + } + if (tcgetattr(fd,&orig_termios) == -1) goto fatal; + + raw = orig_termios; /* modify the original mode */ + /* input modes: no break, no CR to NL, no parity check, no strip char, + * no start/stop output control. */ + raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON); + /* output modes - disable post processing */ + raw.c_oflag &= ~(OPOST); + /* control modes - set 8 bit chars */ + raw.c_cflag |= (CS8); + /* local modes - choing off, canonical off, no extended functions, + * no signal chars (^Z,^C) */ + raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG); + /* control chars - set return condition: min number of bytes and timer. + * We want read to return every single byte, without timeout. */ + raw.c_cc[VMIN] = 1; raw.c_cc[VTIME] = 0; /* 1 byte, no timer */ + + /* put terminal in raw mode after flushing */ + if (tcsetattr(fd,TCSAFLUSH,&raw) < 0) goto fatal; + rawmode = 1; + return 0; + +fatal: + errno = ENOTTY; + return -1; +} + +static void disableRawMode(int fd) { + /* Don't even check the return value as it's too late. */ + if (rawmode && tcsetattr(fd,TCSAFLUSH,&orig_termios) != -1) + rawmode = 0; +} + +/* Use the ESC [6n escape sequence to query the horizontal cursor position + * and return it. On error -1 is returned, on success the position of the + * cursor. */ +static int getCursorPosition(int ifd, int ofd) { + char buf[32]; + int cols, rows; + unsigned int i = 0; + + /* Report cursor location */ + if (write(ofd, "\x1b[6n", 4) != 4) return -1; + + /* Read the response: ESC [ rows ; cols R */ + while (i < sizeof(buf)-1) { + if (read(ifd,buf+i,1) != 1) break; + if (buf[i] == 'R') break; + i++; + } + buf[i] = '\0'; + + /* Parse it. */ + if (buf[0] != ESC || buf[1] != '[') return -1; + if (sscanf(buf+2,"%d;%d",&rows,&cols) != 2) return -1; + return cols; +} + +/* Try to get the number of columns in the current terminal, or assume 80 + * if it fails. */ +static int getColumns(int ifd, int ofd) { + struct winsize ws; + + if (ioctl(1, TIOCGWINSZ, &ws) == -1 || ws.ws_col == 0) { + /* ioctl() failed. Try to query the terminal itself. */ + int start, cols; + + /* Get the initial position so we can restore it later. */ + start = getCursorPosition(ifd,ofd); + if (start == -1) goto failed; + + /* Go to right margin and get position. */ + if (write(ofd,"\x1b[999C",6) != 6) goto failed; + cols = getCursorPosition(ifd,ofd); + if (cols == -1) goto failed; + + /* Restore position. */ + if (cols > start) { + char seq[32]; + snprintf(seq,32,"\x1b[%dD",cols-start); + if (write(ofd,seq,strlen(seq)) == -1) { + /* Can't recover... */ + } + } + return cols; + } else { + return ws.ws_col; + } + +failed: + return 80; +} + +/* Clear the screen. Used to handle ctrl+l */ +void linenoiseClearScreen(void) { + if (write(STDOUT_FILENO,"\x1b[H\x1b[2J",7) <= 0) { + /* nothing to do, just to avoid warning. */ + } +} + +/* Beep, used for completion when there is nothing to complete or when all + * the choices were already shown. */ +static void linenoiseBeep(void) { + fprintf(stderr, "\x7"); + fflush(stderr); +} + +/* Called by completeLine() and linenoiseShow() to render the current + * edited line with the proposed completion. If the current completion table + * is already available, it is passed as second argument, otherwise the + * function will use the callback to obtain it. + * + * Flags are the same as refreshLine*(), that is REFRESH_* macros. */ +static void refreshLineWithCompletion(struct linenoiseState *ls, linenoiseCompletions *lc, int flags) { + /* Obtain the table of completions if the caller didn't provide one. */ + linenoiseCompletions ctable; + if (lc == NULL) { + completionCallback(ls->buf, &ctable); + lc = &ctable; + } + + /* Show the edited line with completion if possible, or just refresh. */ + if (ls->completion_idx < lc->len) { + struct linenoiseState saved = *ls; + ls->len = ls->pos = strlen(lc->cvec[ls->completion_idx]); + ls->buf = lc->cvec[ls->completion_idx]; + refreshLineWithFlags(ls, flags); + ls->len = saved.len; + ls->pos = saved.pos; + ls->buf = saved.buf; + } else { + refreshLineWithFlags(ls, flags); + } + + if (lc == &ctable) { + ctable.to_free = false; + } +} + +enum ESC_TYPE { ESC_NULL = 0, ESC_DELETE, ESC_UP, ESC_DOWN, ESC_RIGHT, ESC_LEFT, ESC_HOME, ESC_END }; + +static ESC_TYPE readEscapeSequence(struct linenoiseState * l) { + /* Check if the file input has additional data. */ + struct pollfd pfd; + pfd.fd = l->ifd; + pfd.events = POLLIN; + + auto ret = poll(&pfd, 1, 1); // 1 millisecond timeout + if (ret <= 0) { // -1: error, 0: timeout + return ESC_NULL; + } + + /* Read the next two bytes representing the escape sequence. + * Use two calls to handle slow terminals returning the two + * chars at different times. */ + char seq[3]; + if (read(l->ifd, seq, 1) == -1) { + return ESC_NULL; + } + if (read(l->ifd, seq + 1, 1) == -1) { + return ESC_NULL; + } + + /* ESC [ sequences. */ + if (seq[0] == '[') { + if (seq[1] >= '0' && seq[1] <= '9') { + /* Extended escape, read additional byte. */ + if (read(l->ifd, seq + 2, 1) == -1) { + return ESC_NULL; + } + if (seq[2] == '~') { + switch (seq[1]) { + case '3': + return ESC_DELETE; + } + } + } else { + switch (seq[1]) { + case 'A': + return ESC_UP; + case 'B': + return ESC_DOWN; + case 'C': + return ESC_RIGHT; + case 'D': + return ESC_LEFT; + case 'H': + return ESC_HOME; + case 'F': + return ESC_END; + } + } + } + + /* ESC O sequences. */ + else if (seq[0] == 'O') { + switch (seq[1]) { + case 'H': + return ESC_HOME; + case 'F': + return ESC_END; + } + } + return ESC_NULL; +} + +/* This is an helper function for linenoiseEdit*() and is called when the + * user types the key in order to complete the string currently in the + * input. + * + * The state of the editing is encapsulated into the pointed linenoiseState + * structure as described in the structure definition. + * + * If the function returns non-zero, the caller should handle the + * returned value as a byte read from the standard input, and process + * it as usually: this basically means that the function may return a byte + * read from the terminal but not processed. Otherwise, if zero is returned, + * the input was consumed by the completeLine() function to navigate the + * possible completions, and the caller should read for the next characters + * from stdin. */ +static int completeLine(struct linenoiseState * ls, int keypressed, ESC_TYPE esc_type) { + linenoiseCompletions lc; + int nwritten; + char c = keypressed; + + completionCallback(ls->buf, &lc); + if (lc.len == 0) { + linenoiseBeep(); + ls->in_completion = 0; + } else { + if (c == TAB) { + if (ls->in_completion == 0) { + ls->in_completion = 1; + ls->completion_idx = 0; + } else { + ls->completion_idx = (ls->completion_idx + 1) % (lc.len + 1); + if (ls->completion_idx == lc.len) { + linenoiseBeep(); + } + } + c = 0; + } else if (c == ESC && esc_type == ESC_NULL) { + /* Re-show original buffer */ + if (ls->completion_idx < lc.len) { + refreshLine(ls); + } + ls->in_completion = 0; + c = 0; + } else { + /* Update buffer and return */ + if (ls->completion_idx < lc.len) { + nwritten = snprintf(ls->buf, ls->buflen, "%s", lc.cvec[ls->completion_idx]); + ls->len = ls->pos = nwritten; + } + ls->in_completion = 0; + } + + /* Show completion or original buffer */ + if (ls->in_completion && ls->completion_idx < lc.len) { + refreshLineWithCompletion(ls, &lc, REFRESH_ALL); + } else { + refreshLine(ls); + } + } + + return c; /* Return last read character */ +} + +/* Register a callback function to be called for tab-completion. */ +void linenoiseSetCompletionCallback(linenoiseCompletionCallback *fn) { + completionCallback = fn; +} + +/* Register a hits function to be called to show hits to the user at the + * right of the prompt. */ +void linenoiseSetHintsCallback(linenoiseHintsCallback *fn) { + hintsCallback = fn; +} + +/* Register a function to free the hints returned by the hints callback + * registered with linenoiseSetHintsCallback(). */ +void linenoiseSetFreeHintsCallback(linenoiseFreeHintsCallback *fn) { + freeHintsCallback = fn; +} + +/* This function is used by the callback function registered by the user + * in order to add completion options given the input string when the + * user typed . See the example.c source code for a very easy to + * understand example. */ +void linenoiseAddCompletion(linenoiseCompletions *lc, const char *str) { + const size_t len = strlen(str); + auto copy = std::make_unique(len + 1); + if (!copy) { + return; + } + + memcpy(copy.get(), str, len + 1); + char ** cvec = static_cast(std::realloc(lc->cvec, sizeof(char *) * (lc->len + 1))); + if (cvec == nullptr) { + return; + } + + lc->cvec = cvec; + lc->cvec[lc->len++] = copy.release(); +} + +/* Get column length from begining of buffer to current byte position */ +static size_t columnPos(const char * buf, size_t buf_len, size_t pos) { + size_t ret = 0; + size_t off = 0; + while (off < pos) { + size_t col_len; + size_t len = nextCharLen(buf, buf_len, off, &col_len); + off += len; + ret += col_len; + } + return ret; +} + +/* Helper of refreshSingleLine() and refreshMultiLine() to show hints + * to the right of the prompt. */ +static void refreshShowHints(std::string & ab, struct linenoiseState * l, int pcollen) { + char seq[64]; + size_t collen = pcollen + columnPos(l->buf, l->len, l->len); + if (hintsCallback && collen < l->cols) { + int color = -1, bold = 0; + const char *hint = hintsCallback(l->buf,&color,&bold); + if (hint) { + int hintlen = strlen(hint); + int hintmaxlen = l->cols - collen; + if (hintlen > hintmaxlen) hintlen = hintmaxlen; + if (bold == 1 && color == -1) color = 37; + if (color != -1 || bold != 0) + snprintf(seq,64,"\033[%d;%d;49m",bold,color); + else + seq[0] = '\0'; + ab.append(seq); + ab.append(hint, hintlen); + if (color != -1 || bold != 0) + ab.append("\033[0m"); + + /* Call the function to free the hint returned. */ + if (freeHintsCallback) freeHintsCallback(hint); + } + } +} + +/* Check if text is an ANSI escape sequence */ +static int isAnsiEscape(const char * buf, size_t buf_len, size_t * len) { + if (buf_len > 2 && !memcmp("\033[", buf, 2)) { + size_t off = 2; + while (off < buf_len) { + switch (buf[off++]) { + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'J': + case 'K': + case 'S': + case 'T': + case 'f': + case 'm': + *len = off; + return 1; + } + } + } + return 0; +} + +/* Get column length of prompt text */ +static size_t promptTextColumnLen(const char * prompt, size_t plen) { + char buf[LINENOISE_MAX_LINE]; + size_t buf_len = 0; + size_t off = 0; + while (off < plen) { + size_t len; + if (isAnsiEscape(prompt + off, plen - off, &len)) { + off += len; + continue; + } + buf[buf_len++] = prompt[off++]; + } + return columnPos(buf, buf_len, buf_len); +} + +/* Single line low level line refresh. + * + * Rewrite the currently edited line accordingly to the buffer content, + * cursor position, and number of columns of the terminal. + * + * Flags is REFRESH_* macros. The function can just remove the old + * prompt, just write it, or both. */ +static void refreshSingleLine(struct linenoiseState *l, int flags) { + char seq[64]; + size_t pcollen = promptTextColumnLen(l->prompt, strlen(l->prompt)); + int fd = l->ofd; + char *buf = l->buf; + size_t len = l->len; + size_t pos = l->pos; + std::string ab; + + while ((pcollen + columnPos(buf, len, pos)) >= l->cols) { + int chlen = nextCharLen(buf, len, 0, NULL); + buf += chlen; + len -= chlen; + pos -= chlen; + } + while (pcollen + columnPos(buf, len, len) > l->cols) { + len -= prevCharLen(buf, len, len, NULL); + } + + /* Cursor to left edge */ + snprintf(seq,sizeof(seq),"\r"); + ab.append(seq); + + if (flags & REFRESH_WRITE) { + /* Write the prompt and the current buffer content */ + ab.append(l->prompt); + if (maskmode == 1) { + while (len--) { + ab.append("*"); + } + } else { + ab.append(buf, len); + } + /* Show hits if any. */ + refreshShowHints(ab, l, pcollen); + } + + /* Erase to right */ + snprintf(seq,sizeof(seq),"\x1b[0K"); + ab.append(seq); + if (flags & REFRESH_WRITE) { + /* Move cursor to original position. */ + snprintf(seq, sizeof(seq), "\r\x1b[%dC", (int) (columnPos(buf, len, pos) + pcollen)); + ab.append(seq); + } + + (void) !write(fd, ab.c_str(), ab.size()); /* Can't recover from write error. */ +} + +/* Get column length from begining of buffer to current byte position for multiline mode*/ +static size_t columnPosForMultiLine(const char * buf, size_t buf_len, size_t pos, size_t cols, size_t ini_pos) { + size_t ret = 0; + size_t colwid = ini_pos; + + size_t off = 0; + while (off < buf_len) { + size_t col_len; + size_t len = nextCharLen(buf, buf_len, off, &col_len); + + int dif = (int) (colwid + col_len) - (int) cols; + if (dif > 0) { + ret += dif; + colwid = col_len; + } else if (dif == 0) { + colwid = 0; + } else { + colwid += col_len; + } + + if (off >= pos) { + break; + } + off += len; + ret += col_len; + } + + return ret; +} + +/* Multi line low level line refresh. + * + * Rewrite the currently edited line accordingly to the buffer content, + * cursor position, and number of columns of the terminal. + * + * Flags is REFRESH_* macros. The function can just remove the old + * prompt, just write it, or both. */ +static void refreshMultiLine(struct linenoiseState *l, int flags) { + char seq[64]; + size_t pcollen = promptTextColumnLen(l->prompt, strlen(l->prompt)); + int colpos = columnPosForMultiLine(l->buf, l->len, l->len, l->cols, pcollen); + int colpos2; /* cursor column position. */ + int rows = (pcollen + colpos + l->cols - 1) / l->cols; /* rows used by current buf. */ + int rpos = (pcollen + l->oldcolpos + l->cols) / l->cols; /* cursor relative row. */ + int rpos2; /* rpos after refresh. */ + int col; /* column position, zero-based. */ + int old_rows = l->oldrows; + int fd = l->ofd, j; + std::string ab; + l->oldrows = rows; + + /* First step: clear all the lines used before. To do so start by + * going to the last row. */ + if (flags & REFRESH_CLEAN) { + if (old_rows - rpos > 0) { + snprintf(seq,64,"\x1b[%dB", old_rows-rpos); + ab.append(seq); + } + + /* Now for every row clear it, go up. */ + for (j = 0; j < old_rows - 1; j++) { + snprintf(seq,64,"\r\x1b[0K\x1b[1A"); + ab.append(seq); + } + } + + if (flags & REFRESH_ALL) { + /* Clean the top line. */ + snprintf(seq,64,"\r\x1b[0K"); + ab.append(seq); + } + + /* Get column length to cursor position */ + colpos2 = columnPosForMultiLine(l->buf, l->len, l->pos, l->cols, pcollen); + + if (flags & REFRESH_WRITE) { + /* Write the prompt and the current buffer content */ + ab.append(l->prompt); + if (maskmode == 1) { + for (unsigned int i = 0; i < l->len; ++i) { + ab.append("*"); + } + } else { + ab.append(l->buf, l->len); + } + + /* Show hits if any. */ + refreshShowHints(ab, l, pcollen); + + /* If we are at the very end of the screen with our prompt, we need to + * emit a newline and move the prompt to the first column. */ + if (l->pos && l->pos == l->len && (colpos2 + pcollen) % l->cols == 0) { + ab.append("\n"); + snprintf(seq,64,"\r"); + ab.append(seq); + rows++; + if (rows > (int)l->oldrows) l->oldrows = rows; + } + + /* Move cursor to right position. */ + rpos2 = (pcollen + colpos2 + l->cols) / l->cols; /* Current cursor relative row */ + + /* Go up till we reach the expected position. */ + if (rows - rpos2 > 0) { + snprintf(seq,64,"\x1b[%dA", rows-rpos2); + ab.append(seq); + } + + /* Set column. */ + col = (pcollen + colpos2) % l->cols; + if (col) + snprintf(seq,64,"\r\x1b[%dC", col); + else + snprintf(seq,64,"\r"); + ab.append(seq); + } + + l->oldcolpos = colpos2; + + (void) !write(fd, ab.c_str(), ab.size()); /* Can't recover from write error. */ +} + +/* Calls the two low level functions refreshSingleLine() or + * refreshMultiLine() according to the selected mode. */ +static void refreshLineWithFlags(struct linenoiseState *l, int flags) { + if (mlmode) + refreshMultiLine(l,flags); + else + refreshSingleLine(l,flags); +} + +/* Utility function to avoid specifying REFRESH_ALL all the times. */ +static void refreshLine(struct linenoiseState *l) { + refreshLineWithFlags(l,REFRESH_ALL); +} + +/* Hide the current line, when using the multiplexing API. */ +void linenoiseHide(struct linenoiseState *l) { + if (mlmode) + refreshMultiLine(l,REFRESH_CLEAN); + else + refreshSingleLine(l,REFRESH_CLEAN); +} + +/* Show the current line, when using the multiplexing API. */ +void linenoiseShow(struct linenoiseState *l) { + if (l->in_completion) { + refreshLineWithCompletion(l,NULL,REFRESH_WRITE); + } else { + refreshLineWithFlags(l,REFRESH_WRITE); + } +} + +/* Insert the character 'c' at cursor current position. + * + * On error writing to the terminal -1 is returned, otherwise 0. */ +static int linenoiseEditInsert(struct linenoiseState * l, const char * cbuf, int clen) { + if (l->len + clen <= l->buflen) { + if (l->len == l->pos) { + memcpy(&l->buf[l->pos], cbuf, clen); + l->pos += clen; + l->len += clen; + ; + l->buf[l->len] = '\0'; + if ((!mlmode && promptTextColumnLen(l->prompt, l->plen) + columnPos(l->buf, l->len, l->len) < l->cols && + !hintsCallback)) { + /* Avoid a full update of the line in the + * trivial case. */ + if (maskmode == 1) { + static const char d = '*'; + if (write(l->ofd, &d, 1) == -1) { + return -1; + } + } else { + if (write(l->ofd, cbuf, clen) == -1) { + return -1; + } + } + } else { + refreshLine(l); + } + } else { + memmove(l->buf + l->pos + clen, l->buf + l->pos, l->len - l->pos); + memcpy(&l->buf[l->pos], cbuf, clen); + l->pos += clen; + l->len += clen; + l->buf[l->len] = '\0'; + refreshLine(l); + } + } + return 0; +} + +/* Move cursor on the left. */ +static void linenoiseEditMoveLeft(struct linenoiseState * l) { + if (l->pos > 0) { + l->pos -= prevCharLen(l->buf, l->len, l->pos, NULL); + refreshLine(l); + } +} + +/* Move cursor on the right. */ +static void linenoiseEditMoveRight(struct linenoiseState * l) { + if (l->pos != l->len) { + l->pos += nextCharLen(l->buf, l->len, l->pos, NULL); + refreshLine(l); + } +} + +/* Move cursor to the start of the line. */ +static void linenoiseEditMoveHome(struct linenoiseState * l) { + if (l->pos != 0) { + l->pos = 0; + refreshLine(l); + } +} + +/* Move cursor to the end of the line. */ +static void linenoiseEditMoveEnd(struct linenoiseState * l) { + if (l->pos != l->len) { + l->pos = l->len; + refreshLine(l); + } +} + +/* Substitute the currently edited line with the next or previous history + * entry as specified by 'dir'. */ +#define LINENOISE_HISTORY_NEXT 0 +#define LINENOISE_HISTORY_PREV 1 + +static void linenoiseEditHistoryNext(struct linenoiseState * l, int dir) { + if (history_len > 1) { + /* Update the current history entry before to + * overwrite it with the next one. */ + free(history[history_len - 1 - l->history_index]); + history[history_len - 1 - l->history_index] = strdup(l->buf); + /* Show the new entry */ + l->history_index += (dir == LINENOISE_HISTORY_PREV) ? 1 : -1; + if (l->history_index < 0) { + l->history_index = 0; + return; + } else if (l->history_index >= history_len) { + l->history_index = history_len-1; + return; + } + strncpy(l->buf,history[history_len - 1 - l->history_index],l->buflen); + l->buf[l->buflen-1] = '\0'; + l->len = l->pos = strlen(l->buf); + refreshLine(l); + } +} + +/* Delete the character at the right of the cursor without altering the cursor + * position. Basically this is what happens with the "Delete" keyboard key. */ +static void linenoiseEditDelete(struct linenoiseState * l) { + if (l->len > 0 && l->pos < l->len) { + int chlen = nextCharLen(l->buf, l->len, l->pos, NULL); + memmove(l->buf + l->pos, l->buf + l->pos + chlen, l->len - l->pos - chlen); + l->len -= chlen; + l->buf[l->len] = '\0'; + refreshLine(l); + } +} + +/* Backspace implementation. */ +static void linenoiseEditBackspace(struct linenoiseState * l) { + if (l->pos > 0 && l->len > 0) { + int chlen = prevCharLen(l->buf, l->len, l->pos, NULL); + memmove(l->buf + l->pos - chlen, l->buf + l->pos, l->len - l->pos); + l->pos -= chlen; + l->len -= chlen; + l->buf[l->len] = '\0'; + refreshLine(l); + } +} + +/* Delete the previous word, maintaining the cursor at the start of the + * current word. */ +static void linenoiseEditDeletePrevWord(struct linenoiseState * l) { + size_t old_pos = l->pos; + size_t diff; + + while (l->pos > 0 && l->buf[l->pos-1] == ' ') + l->pos--; + while (l->pos > 0 && l->buf[l->pos-1] != ' ') + l->pos--; + diff = old_pos - l->pos; + memmove(l->buf+l->pos,l->buf+old_pos,l->len-old_pos+1); + l->len -= diff; + refreshLine(l); +} + +/* This function is part of the multiplexed API of Linenoise, that is used + * in order to implement the blocking variant of the API but can also be + * called by the user directly in an event driven program. It will: + * + * 1. Initialize the linenoise state passed by the user. + * 2. Put the terminal in RAW mode. + * 3. Show the prompt. + * 4. Return control to the user, that will have to call linenoiseEditFeed() + * each time there is some data arriving in the standard input. + * + * The user can also call linenoiseEditHide() and linenoiseEditShow() if it + * is required to show some input arriving asynchronously, without mixing + * it with the currently edited line. + * + * When linenoiseEditFeed() returns non-NULL, the user finished with the + * line editing session (pressed enter CTRL-D/C): in this case the caller + * needs to call linenoiseEditStop() to put back the terminal in normal + * mode. This will not destroy the buffer, as long as the linenoiseState + * is still valid in the context of the caller. + * + * The function returns 0 on success, or -1 if writing to standard output + * fails. If stdin_fd or stdout_fd are set to -1, the default is to use + * STDIN_FILENO and STDOUT_FILENO. + */ +int linenoiseEditStart(struct linenoiseState *l, int stdin_fd, int stdout_fd, char *buf, size_t buflen, const char *prompt) { + /* Populate the linenoise state that we pass to functions implementing + * specific editing functionalities. */ + l->in_completion = 0; + l->ifd = stdin_fd != -1 ? stdin_fd : STDIN_FILENO; + l->ofd = stdout_fd != -1 ? stdout_fd : STDOUT_FILENO; + l->buf = buf; + l->buflen = buflen; + l->prompt = prompt; + l->plen = strlen(prompt); + l->oldcolpos = l->pos = 0; + l->len = 0; + + /* Enter raw mode. */ + if (enableRawMode(l->ifd) == -1) return -1; + + l->cols = getColumns(stdin_fd, stdout_fd); + l->oldrows = 0; + l->history_index = 0; + + /* Buffer starts empty. */ + l->buf[0] = '\0'; + l->buflen--; /* Make sure there is always space for the nullterm */ + + /* If stdin is not a tty, stop here with the initialization. We + * will actually just read a line from standard input in blocking + * mode later, in linenoiseEditFeed(). */ + if (!isatty(l->ifd)) return 0; + + /* The latest history entry is always our current buffer, that + * initially is just an empty string. */ + linenoiseHistoryAdd(""); + + if (write(l->ofd,prompt,l->plen) == -1) return -1; + return 0; +} + +const char* linenoiseEditMore = "If you see this, you are misusing the API: when linenoiseEditFeed() is called, if it returns linenoiseEditMore the user is yet editing the line. See the README file for more information."; + +static const char * handleEnterKey(struct linenoiseState * l) { + --history_len; + free(history[history_len]); + if (mlmode) { + linenoiseEditMoveEnd(l); + } + if (hintsCallback) { + /* Force a refresh without hints to leave the previous + * line as the user typed it after a newline. */ + linenoiseHintsCallback * hc = hintsCallback; + hintsCallback = NULL; + refreshLine(l); + hintsCallback = hc; + } + + return strdup(l->buf); +} + +static const char * handleCtrlCKey() { + errno = EAGAIN; + return NULL; +} + +static const char * handleCtrlDKey(struct linenoiseState * l) { + if (l->len > 0) { + linenoiseEditDelete(l); + return linenoiseEditMore; + } + + --history_len; + free(history[history_len]); + errno = ENOENT; + return NULL; +} + +static void handleCtrlTKey(struct linenoiseState * l) { + if (l->pos > 0 && l->pos < l->len) { + auto prev_chlen = prevCharLen(l->buf, l->len, l->pos, NULL); + auto curr_chlen = nextCharLen(l->buf, l->len, l->pos, NULL); + + std::string prev_char(prev_chlen, 0); + memcpy(prev_char.data(), l->buf + l->pos - prev_chlen, prev_chlen); + memmove(l->buf + l->pos - prev_chlen, l->buf + l->pos, curr_chlen); + memmove(l->buf + l->pos - prev_chlen + curr_chlen, prev_char.data(), prev_chlen); + + l->pos = l->pos - prev_chlen + curr_chlen; + if (l->pos + prev_chlen != l->len) { + l->pos += prev_chlen; + } + + refreshLine(l); + } +} + +static void handleEscapeSequence(struct linenoiseState * l, int esc_type) { + switch (esc_type) { + case ESC_NULL: + break; + case ESC_DELETE: + linenoiseEditDelete(l); + break; + case ESC_UP: + linenoiseEditHistoryNext(l, LINENOISE_HISTORY_PREV); + break; + case ESC_DOWN: + linenoiseEditHistoryNext(l, LINENOISE_HISTORY_NEXT); + break; + case ESC_RIGHT: + linenoiseEditMoveRight(l); + break; + case ESC_LEFT: + linenoiseEditMoveLeft(l); + break; + case ESC_HOME: + linenoiseEditMoveHome(l); + break; + case ESC_END: + linenoiseEditMoveEnd(l); + break; + } +} + +static void handleCtrlUKey(struct linenoiseState * l) { + l->buf[0] = '\0'; + l->pos = l->len = 0; + refreshLine(l); +} + +static void handleCtrlKKey(struct linenoiseState * l) { + l->buf[l->pos] = '\0'; + l->len = l->pos; + refreshLine(l); +} + +static const char * processInputCharacter(struct linenoiseState * l, int c, char * cbuf, int nread, int esc_type) { + switch (c) { + case ENTER: + return handleEnterKey(l); + case CTRL_C: + return handleCtrlCKey(); + case BACKSPACE: + case CTRL_H: + linenoiseEditBackspace(l); + break; + case CTRL_D: /* ctrl-d, remove char at right of cursor, or if the + line is empty, act as end-of-file. */ + return handleCtrlDKey(l); + case CTRL_T: + handleCtrlTKey(l); + break; + case CTRL_B: + linenoiseEditMoveLeft(l); + break; + case CTRL_F: + linenoiseEditMoveRight(l); + break; + case CTRL_P: + linenoiseEditHistoryNext(l, LINENOISE_HISTORY_PREV); + break; + case CTRL_N: + linenoiseEditHistoryNext(l, LINENOISE_HISTORY_NEXT); + break; + case ESC: + handleEscapeSequence(l, esc_type); + break; + default: + if (linenoiseEditInsert(l, cbuf, nread)) { + return NULL; + } + break; + case CTRL_U: /* Ctrl+u, delete the whole line. */ + handleCtrlUKey(l); + break; + case CTRL_K: /* Ctrl+k, delete from current to end of line. */ + handleCtrlKKey(l); + break; + case CTRL_A: /* Ctrl+a, go to the start of the line */ + linenoiseEditMoveHome(l); + break; + case CTRL_E: /* ctrl+e, go to the end of the line */ + linenoiseEditMoveEnd(l); + break; + case CTRL_L: /* ctrl+l, clear screen */ + linenoiseClearScreen(); + refreshLine(l); + break; + case CTRL_W: /* ctrl+w, delete previous word */ + linenoiseEditDeletePrevWord(l); + break; + } + return linenoiseEditMore; +} + +/* This function is part of the multiplexed API of linenoise, see the top + * comment on linenoiseEditStart() for more information. Call this function + * each time there is some data to read from the standard input file + * descriptor. In the case of blocking operations, this function can just be + * called in a loop, and block. + * + * The function returns linenoiseEditMore to signal that line editing is still + * in progress, that is, the user didn't yet pressed enter / CTRL-D. Otherwise + * the function returns the pointer to the heap-allocated buffer with the + * edited line, that the user should free with linenoiseFree(). + * + * On special conditions, NULL is returned and errno is populated: + * + * EAGAIN if the user pressed Ctrl-C + * ENOENT if the user pressed Ctrl-D + * + * Some other errno: I/O error. + */ +const char * linenoiseEditFeed(struct linenoiseState * l) { + /* Not a TTY, pass control to line reading without character count + * limits. */ + if (!isatty(l->ifd)) return linenoiseNoTTY(); + + int c; + int nread; + char cbuf[32]; + + nread = readCode(l->ifd, cbuf, sizeof(cbuf), &c); + if (nread <= 0) return NULL; + + auto esc_type = ESC_NULL; + if (c == ESC) { + esc_type = readEscapeSequence(l); + } + + /* Only autocomplete when the callback is set. It returns < 0 when + * there was an error reading from fd. Otherwise it will return the + * character that should be handled next. */ + if ((l->in_completion || c == 9) && completionCallback != NULL) { + c = completeLine(l, c, esc_type); + /* Read next character when 0 */ + if (c == 0) return linenoiseEditMore; + } + + return processInputCharacter(l, c, cbuf, nread, esc_type); +} + +/* This is part of the multiplexed linenoise API. See linenoiseEditStart() + * for more information. This function is called when linenoiseEditFeed() + * returns something different than NULL. At this point the user input + * is in the buffer, and we can restore the terminal in normal mode. */ +void linenoiseEditStop(struct linenoiseState *l) { + if (!isatty(l->ifd)) return; + disableRawMode(l->ifd); + printf("\n"); +} + +/* This just implements a blocking loop for the multiplexed API. + * In many applications that are not event-driven, we can just call + * the blocking linenoise API, wait for the user to complete the editing + * and return the buffer. */ +static const char *linenoiseBlockingEdit(int stdin_fd, int stdout_fd, char *buf, size_t buflen, const char *prompt) +{ + struct linenoiseState l; + + /* Editing without a buffer is invalid. */ + if (buflen == 0) { + errno = EINVAL; + return NULL; + } + + linenoiseEditStart(&l,stdin_fd,stdout_fd,buf,buflen,prompt); + const char *res; + while((res = linenoiseEditFeed(&l)) == linenoiseEditMore); + linenoiseEditStop(&l); + return res; +} + +/* This special mode is used by linenoise in order to print scan codes + * on screen for debugging / development purposes. It is implemented + * by the linenoise_example program using the --keycodes option. */ +void linenoisePrintKeyCodes(void) { + char quit[4]; + + printf("Linenoise key codes debugging mode.\n" + "Press keys to see scan codes. Type 'quit' at any time to exit.\n"); + if (enableRawMode(STDIN_FILENO) == -1) return; + memset(quit,' ',4); + while(1) { + char c; + int nread; + + nread = read(STDIN_FILENO,&c,1); + if (nread <= 0) continue; + memmove(quit,quit+1,sizeof(quit)-1); /* shift string to left. */ + quit[sizeof(quit)-1] = c; /* Insert current char on the right. */ + if (memcmp(quit,"quit",sizeof(quit)) == 0) break; + + printf("'%c' %02x (%d) (type quit to exit)\n", isprint((int) c) ? c : '?', (int) c, (int) c); + printf("\r"); /* Go left edge manually, we are in raw mode. */ + fflush(stdout); + } + disableRawMode(STDIN_FILENO); +} + +/* This function is called when linenoise() is called with the standard + * input file descriptor not attached to a TTY. So for example when the + * program using linenoise is called in pipe or with a file redirected + * to its standard input. In this case, we want to be able to return the + * line regardless of its length (by default we are limited to 4k). */ +static char *linenoiseNoTTY(void) { + char *line = NULL; + size_t len = 0, maxlen = 0; + + while(1) { + if (len == maxlen) { + if (maxlen == 0) maxlen = 16; + maxlen *= 2; + char *oldval = line; + line = (char*) realloc(line,maxlen); + if (line == NULL) { + if (oldval) free(oldval); + return NULL; + } + } + int c = fgetc(stdin); + if (c == EOF || c == '\n') { + if (c == EOF && len == 0) { + free(line); + return NULL; + } else { + line[len] = '\0'; + return line; + } + } else { + line[len] = c; + len++; + } + } +} + +/* The high level function that is the main API of the linenoise library. + * This function checks if the terminal has basic capabilities, just checking + * for a blacklist of stupid terminals, and later either calls the line + * editing function or uses dummy fgets() so that you will be able to type + * something even in the most desperate of the conditions. */ +const char *linenoise(const char *prompt) { + char buf[LINENOISE_MAX_LINE]; + + if (!isatty(STDIN_FILENO)) { + /* Not a tty: read from file / pipe. In this mode we don't want any + * limit to the line size, so we call a function to handle that. */ + return linenoiseNoTTY(); + } else if (isUnsupportedTerm()) { + size_t len; + + printf("%s",prompt); + fflush(stdout); + if (fgets(buf,LINENOISE_MAX_LINE,stdin) == NULL) return NULL; + len = strlen(buf); + while(len && (buf[len-1] == '\n' || buf[len-1] == '\r')) { + len--; + buf[len] = '\0'; + } + return strdup(buf); + } else { + const char *retval = linenoiseBlockingEdit(STDIN_FILENO,STDOUT_FILENO,buf,LINENOISE_MAX_LINE,prompt); + return retval; + } +} + +/* This is just a wrapper the user may want to call in order to make sure + * the linenoise returned buffer is freed with the same allocator it was + * created with. Useful when the main program is using an alternative + * allocator. */ +void linenoiseFree(void *ptr) { + if (ptr == linenoiseEditMore) return; // Protect from API misuse. + free(ptr); +} + +/* ================================ History ================================= */ + +/* Free the history, but does not reset it. Only used when we have to + * exit() to avoid memory leaks are reported by valgrind & co. */ +static void freeHistory(void) { + if (history) { + int j; + + for (j = 0; j < history_len; j++) + free(history[j]); + free(history); + } +} + +/* At exit we'll try to fix the terminal to the initial conditions. */ +static void linenoiseAtExit(void) { + disableRawMode(STDIN_FILENO); + freeHistory(); +} + +/* This is the API call to add a new entry in the linenoise history. + * It uses a fixed array of char pointers that are shifted (memmoved) + * when the history max length is reached in order to remove the older + * entry and make room for the new one, so it is not exactly suitable for huge + * histories, but will work well for a few hundred of entries. + * + * Using a circular buffer is smarter, but a bit more complex to handle. */ +int linenoiseHistoryAdd(const char *line) { + char *linecopy; + + if (history_max_len == 0) return 0; + + /* Initialization on first call. */ + if (history == NULL) { + history = (char**) malloc(sizeof(char*)*history_max_len); + if (history == NULL) return 0; + memset(history,0,(sizeof(char*)*history_max_len)); + } + + /* Don't add duplicated lines. */ + if (history_len && !strcmp(history[history_len-1], line)) return 0; + + /* Add an heap allocated copy of the line in the history. + * If we reached the max length, remove the older line. */ + linecopy = strdup(line); + if (!linecopy) return 0; + if (history_len == history_max_len) { + free(history[0]); + memmove(history,history+1,sizeof(char*)*(history_max_len-1)); + history_len--; + } + history[history_len] = linecopy; + history_len++; + return 1; +} + +/* Set the maximum length for the history. This function can be called even + * if there is already some history, the function will make sure to retain + * just the latest 'len' elements if the new history length value is smaller + * than the amount of items already inside the history. */ +int linenoiseHistorySetMaxLen(int len) { + char **new_ptr; + + if (len < 1) return 0; + if (history) { + int tocopy = history_len; + + new_ptr = (char**) malloc(sizeof(char*)*len); + if (new_ptr == NULL) return 0; + + /* If we can't copy everything, free the elements we'll not use. */ + if (len < tocopy) { + int j; + + for (j = 0; j < tocopy-len; j++) free(history[j]); + tocopy = len; + } + memset(new_ptr,0,sizeof(char*)*len); + memcpy(new_ptr,history+(history_len-tocopy), sizeof(char*)*tocopy); + free(history); + history = new_ptr; + } + history_max_len = len; + if (history_len > history_max_len) + history_len = history_max_len; + return 1; +} + +/* Save the history in the specified file. On success 0 is returned + * otherwise -1 is returned. */ +int linenoiseHistorySave(const char *filename) { + mode_t old_umask = umask(S_IXUSR|S_IRWXG|S_IRWXO); + File file; + file.open(filename, "w"); + umask(old_umask); + if (file.file == NULL) { + return -1; + } + chmod(filename,S_IRUSR|S_IWUSR); + for (int j = 0; j < history_len; ++j) { + fprintf(file.file, "%s\n", history[j]); + } + + return 0; +} + +/* Load the history from the specified file. If the file does not exist + * zero is returned and no operation is performed. + * + * If the file exists and the operation succeeded 0 is returned, otherwise + * on error -1 is returned. */ +int linenoiseHistoryLoad(const char *filename) { + File file; + file.open(filename, "r"); + char buf[LINENOISE_MAX_LINE]; + if (file.file == NULL) { + return -1; + } + + while (fgets(buf, LINENOISE_MAX_LINE, file.file) != NULL) { + char *p; + + p = strchr(buf,'\r'); + if (!p) p = strchr(buf,'\n'); + if (p) *p = '\0'; + linenoiseHistoryAdd(buf); + } + return 0; +} +#endif diff --git a/tools/run/linenoise.cpp/linenoise.h b/tools/run/linenoise.cpp/linenoise.h new file mode 100644 index 0000000..9823ca3 --- /dev/null +++ b/tools/run/linenoise.cpp/linenoise.h @@ -0,0 +1,137 @@ +/* linenoise.h -- VERSION 1.0 + * + * Guerrilla line editing library against the idea that a line editing lib + * needs to be 20,000 lines of C++ code. + * + * See linenoise.cpp for more information. + * + * ------------------------------------------------------------------------ + * + * Copyright (c) 2010-2023, Salvatore Sanfilippo + * Copyright (c) 2010-2013, Pieter Noordhuis + * Copyright (c) 2025, Eric Curtin + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __LINENOISE_H +#define __LINENOISE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include /* For size_t. */ +#include + +extern const char * linenoiseEditMore; + +/* The linenoiseState structure represents the state during line editing. + * We pass this state to functions implementing specific editing + * functionalities. */ +struct linenoiseState { + int in_completion; /* The user pressed TAB and we are now in completion + * mode, so input is handled by completeLine(). */ + size_t completion_idx; /* Index of next completion to propose. */ + int ifd; /* Terminal stdin file descriptor. */ + int ofd; /* Terminal stdout file descriptor. */ + char * buf; /* Edited line buffer. */ + size_t buflen; /* Edited line buffer size. */ + const char * prompt; /* Prompt to display. */ + size_t plen; /* Prompt length. */ + size_t pos; /* Current cursor position. */ + size_t oldcolpos; /* Previous refresh cursor column position. */ + size_t len; /* Current edited line length. */ + size_t cols; /* Number of columns in terminal. */ + size_t oldrows; /* Rows used by last refreshed line (multiline mode) */ + int history_index; /* The history index we are currently editing. */ +}; + +struct linenoiseCompletions { + size_t len = 0; + char ** cvec = nullptr; + bool to_free = true; + + ~linenoiseCompletions() { + if (!to_free) { + return; + } + + for (size_t i = 0; i < len; ++i) { + free(cvec[i]); + } + + free(cvec); + } +}; + +/* Non blocking API. */ +int linenoiseEditStart(struct linenoiseState * l, int stdin_fd, int stdout_fd, char * buf, size_t buflen, + const char * prompt); +const char * linenoiseEditFeed(struct linenoiseState * l); +void linenoiseEditStop(struct linenoiseState * l); +void linenoiseHide(struct linenoiseState * l); +void linenoiseShow(struct linenoiseState * l); + +/* Blocking API. */ +const char * linenoise(const char * prompt); +void linenoiseFree(void * ptr); + +/* Completion API. */ +typedef void(linenoiseCompletionCallback)(const char *, linenoiseCompletions *); +typedef const char *(linenoiseHintsCallback) (const char *, int * color, int * bold); +typedef void(linenoiseFreeHintsCallback)(const char *); +void linenoiseSetCompletionCallback(linenoiseCompletionCallback *); +void linenoiseSetHintsCallback(linenoiseHintsCallback *); +void linenoiseSetFreeHintsCallback(linenoiseFreeHintsCallback *); +void linenoiseAddCompletion(linenoiseCompletions *, const char *); + +/* History API. */ +int linenoiseHistoryAdd(const char * line); +int linenoiseHistorySetMaxLen(int len); +int linenoiseHistorySave(const char * filename); +int linenoiseHistoryLoad(const char * filename); + +/* Other utilities. */ +void linenoiseClearScreen(void); +void linenoiseSetMultiLine(int ml); +void linenoisePrintKeyCodes(void); +void linenoiseMaskModeEnable(void); +void linenoiseMaskModeDisable(void); + +/* Encoding functions. */ +typedef size_t(linenoisePrevCharLen)(const char * buf, size_t buf_len, size_t pos, size_t * col_len); +typedef size_t(linenoiseNextCharLen)(const char * buf, size_t buf_len, size_t pos, size_t * col_len); +typedef size_t(linenoiseReadCode)(int fd, char * buf, size_t buf_len, int * c); + +void linenoiseSetEncodingFunctions(linenoisePrevCharLen * prevCharLenFunc, linenoiseNextCharLen * nextCharLenFunc, + linenoiseReadCode * readCodeFunc); + +#ifdef __cplusplus +} +#endif + +#endif /* __LINENOISE_H */ diff --git a/tools/run/run.cpp b/tools/run/run.cpp new file mode 100644 index 0000000..b90a725 --- /dev/null +++ b/tools/run/run.cpp @@ -0,0 +1,1408 @@ +#include "chat.h" +#include "common.h" +#include "llama-cpp.h" +#include "log.h" + +#include "linenoise.cpp/linenoise.h" + +#define JSON_ASSERT GGML_ASSERT +#include + +#if defined(_WIN32) +# define WIN32_LEAN_AND_MEAN +# ifndef NOMINMAX +# define NOMINMAX +# endif +# include +# include +#else +# include +# include +# include +#endif + +#if defined(LLAMA_USE_CURL) +# include +#else +# include "http.h" +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) || defined(_WIN32) +[[noreturn]] static void sigint_handler(int) { + printf("\n" LOG_COL_DEFAULT); + exit(0); // not ideal, but it's the only way to guarantee exit in all cases +} +#endif + +GGML_ATTRIBUTE_FORMAT(1, 2) +static int printe(const char * fmt, ...) { + va_list args; + va_start(args, fmt); + const int ret = vfprintf(stderr, fmt, args); + va_end(args); + + return ret; +} + +static std::string strftime_fmt(const char * fmt, const std::tm & tm) { + std::ostringstream oss; + oss << std::put_time(&tm, fmt); + + return oss.str(); +} + +class Opt { + public: + int init(int argc, const char ** argv) { + ctx_params = llama_context_default_params(); + model_params = llama_model_default_params(); + context_size_default = ctx_params.n_batch; + n_threads_default = ctx_params.n_threads; + ngl_default = model_params.n_gpu_layers; + common_params_sampling sampling; + temperature_default = sampling.temp; + + if (argc < 2) { + printe("Error: No arguments provided.\n"); + print_help(); + return 1; + } + + // Parse arguments + if (parse(argc, argv)) { + printe("Error: Failed to parse arguments.\n"); + print_help(); + return 1; + } + + // If help is requested, show help and exit + if (help) { + print_help(); + return 2; + } + + ctx_params.n_batch = context_size >= 0 ? context_size : context_size_default; + ctx_params.n_ctx = ctx_params.n_batch; + ctx_params.n_threads = ctx_params.n_threads_batch = n_threads >= 0 ? n_threads : n_threads_default; + model_params.n_gpu_layers = ngl >= 0 ? ngl : ngl_default; + temperature = temperature >= 0 ? temperature : temperature_default; + + return 0; // Success + } + + llama_context_params ctx_params; + llama_model_params model_params; + std::string model_; + std::string chat_template_file; + std::string user; + bool use_jinja = false; + int context_size = -1, ngl = -1, n_threads = -1; + float temperature = -1; + bool verbose = false; + + private: + int context_size_default = -1, ngl_default = -1, n_threads_default = -1; + float temperature_default = -1; + bool help = false; + + bool parse_flag(const char ** argv, int i, const char * short_opt, const char * long_opt) { + return strcmp(argv[i], short_opt) == 0 || strcmp(argv[i], long_opt) == 0; + } + + int handle_option_with_value(int argc, const char ** argv, int & i, int & option_value) { + if (i + 1 >= argc) { + return 1; + } + + option_value = std::atoi(argv[++i]); + + return 0; + } + + int handle_option_with_value(int argc, const char ** argv, int & i, float & option_value) { + if (i + 1 >= argc) { + return 1; + } + + option_value = std::atof(argv[++i]); + + return 0; + } + + int handle_option_with_value(int argc, const char ** argv, int & i, std::string & option_value) { + if (i + 1 >= argc) { + return 1; + } + + option_value = argv[++i]; + + return 0; + } + + int parse_options_with_value(int argc, const char ** argv, int & i, bool & options_parsing) { + if (options_parsing && (strcmp(argv[i], "-c") == 0 || strcmp(argv[i], "--context-size") == 0)) { + if (handle_option_with_value(argc, argv, i, context_size) == 1) { + return 1; + } + } else if (options_parsing && + (strcmp(argv[i], "-n") == 0 || strcmp(argv[i], "-ngl") == 0 || strcmp(argv[i], "--ngl") == 0)) { + if (handle_option_with_value(argc, argv, i, ngl) == 1) { + return 1; + } + } else if (options_parsing && (strcmp(argv[i], "-t") == 0 || strcmp(argv[i], "--threads") == 0)) { + if (handle_option_with_value(argc, argv, i, n_threads) == 1) { + return 1; + } + } else if (options_parsing && strcmp(argv[i], "--temp") == 0) { + if (handle_option_with_value(argc, argv, i, temperature) == 1) { + return 1; + } + } else if (options_parsing && strcmp(argv[i], "--chat-template-file") == 0) { + if (handle_option_with_value(argc, argv, i, chat_template_file) == 1) { + return 1; + } + use_jinja = true; + } else { + return 2; + } + + return 0; + } + + int parse_options(const char ** argv, int & i, bool & options_parsing) { + if (options_parsing && (parse_flag(argv, i, "-v", "--verbose") || parse_flag(argv, i, "-v", "--log-verbose"))) { + verbose = true; + } else if (options_parsing && strcmp(argv[i], "--jinja") == 0) { + use_jinja = true; + } else if (options_parsing && parse_flag(argv, i, "-h", "--help")) { + help = true; + return 0; + } else if (options_parsing && strcmp(argv[i], "--") == 0) { + options_parsing = false; + } else { + return 2; + } + + return 0; + } + + int parse_positional_args(const char ** argv, int & i, int & positional_args_i) { + if (positional_args_i == 0) { + if (!argv[i][0] || argv[i][0] == '-') { + return 1; + } + + ++positional_args_i; + model_ = argv[i]; + } else if (positional_args_i == 1) { + ++positional_args_i; + user = argv[i]; + } else { + user += " " + std::string(argv[i]); + } + + return 0; + } + + int parse(int argc, const char ** argv) { + bool options_parsing = true; + for (int i = 1, positional_args_i = 0; i < argc; ++i) { + int ret = parse_options_with_value(argc, argv, i, options_parsing); + if (ret == 0) { + continue; + } else if (ret == 1) { + return ret; + } + + ret = parse_options(argv, i, options_parsing); + if (ret == 0) { + continue; + } else if (ret == 1) { + return ret; + } + + if (parse_positional_args(argv, i, positional_args_i)) { + return 1; + } + } + + if (model_.empty()) { + return 1; + } + + return 0; + } + + void print_help() const { + printf( + "Description:\n" + " Runs a llm\n" + "\n" + "Usage:\n" + " llama-run [options] model [prompt]\n" + "\n" + "Options:\n" + " -c, --context-size \n" + " Context size (default: %d)\n" + " --chat-template-file \n" + " Path to the file containing the chat template to use with the model.\n" + " Only supports jinja templates and implicitly sets the --jinja flag.\n" + " --jinja\n" + " Use jinja templating for the chat template of the model\n" + " -n, -ngl, --ngl \n" + " Number of GPU layers (default: %d)\n" + " --temp \n" + " Temperature (default: %.1f)\n" + " -t, --threads \n" + " Number of threads to use during generation (default: %d)\n" + " -v, --verbose, --log-verbose\n" + " Set verbosity level to infinity (i.e. log all messages, useful for debugging)\n" + " -h, --help\n" + " Show help message\n" + "\n" + "Commands:\n" + " model\n" + " Model is a string with an optional prefix of \n" + " huggingface:// (hf://), modelscope:// (ms://), ollama://, https:// or file://.\n" + " If no protocol is specified and a file exists in the specified\n" + " path, file:// is assumed, otherwise if a file does not exist in\n" + " the specified path, ollama:// is assumed. Models that are being\n" + " pulled are downloaded with .partial extension while being\n" + " downloaded and then renamed as the file without the .partial\n" + " extension when complete.\n" + "\n" + "Examples:\n" + " llama-run llama3\n" + " llama-run ollama://granite-code\n" + " llama-run ollama://smollm:135m\n" + " llama-run hf://QuantFactory/SmolLM-135M-GGUF/SmolLM-135M.Q2_K.gguf\n" + " llama-run " + "huggingface://bartowski/SmolLM-1.7B-Instruct-v0.2-GGUF/SmolLM-1.7B-Instruct-v0.2-IQ3_M.gguf\n" + " llama-run ms://QuantFactory/SmolLM-135M-GGUF/SmolLM-135M.Q2_K.gguf\n" + " llama-run " + "modelscope://bartowski/SmolLM-1.7B-Instruct-v0.2-GGUF/SmolLM-1.7B-Instruct-v0.2-IQ3_M.gguf\n" + " llama-run https://example.com/some-file1.gguf\n" + " llama-run some-file2.gguf\n" + " llama-run file://some-file3.gguf\n" + " llama-run --ngl 999 some-file4.gguf\n" + " llama-run --ngl 999 some-file5.gguf Hello World\n", + context_size_default, ngl_default, temperature_default, n_threads_default); + } +}; + +struct progress_data { + size_t file_size = 0; + std::chrono::steady_clock::time_point start_time = std::chrono::steady_clock::now(); + bool printed = false; +}; + +static int get_terminal_width() { +#if defined(_WIN32) + CONSOLE_SCREEN_BUFFER_INFO csbi; + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); + return csbi.srWindow.Right - csbi.srWindow.Left + 1; +#else + struct winsize w; + ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); + return w.ws_col; +#endif +} + +class File { + public: + FILE * file = nullptr; + + FILE * open(const std::string & filename, const char * mode) { + file = ggml_fopen(filename.c_str(), mode); + + return file; + } + + int lock() { + if (file) { +# ifdef _WIN32 + fd = _fileno(file); + hFile = (HANDLE) _get_osfhandle(fd); + if (hFile == INVALID_HANDLE_VALUE) { + fd = -1; + + return 1; + } + + OVERLAPPED overlapped = {}; + if (!LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY, 0, MAXDWORD, MAXDWORD, + &overlapped)) { + fd = -1; + + return 1; + } +# else + fd = fileno(file); + if (flock(fd, LOCK_EX | LOCK_NB) != 0) { + fd = -1; + + return 1; + } +# endif + } + + return 0; + } + + std::string to_string() { + fseek(file, 0, SEEK_END); + const size_t size = ftell(file); + fseek(file, 0, SEEK_SET); + std::string out; + out.resize(size); + const size_t read_size = fread(&out[0], 1, size, file); + if (read_size != size) { + printe("Error reading file: %s", strerror(errno)); + } + + return out; + } + + ~File() { + if (fd >= 0) { +# ifdef _WIN32 + if (hFile != INVALID_HANDLE_VALUE) { + OVERLAPPED overlapped = {}; + UnlockFileEx(hFile, 0, MAXDWORD, MAXDWORD, &overlapped); + } +# else + flock(fd, LOCK_UN); +# endif + } + + if (file) { + fclose(file); + } + } + + private: + int fd = -1; +# ifdef _WIN32 + HANDLE hFile = nullptr; +# endif +}; + +class HttpClient { + public: + int init(const std::string & url, const std::vector & headers, const std::string & output_file, + const bool progress, std::string * response_str = nullptr) { + if (std::filesystem::exists(output_file)) { + return 0; + } + + std::string output_file_partial; + + if (!output_file.empty()) { + output_file_partial = output_file + ".partial"; + } + + if (download(url, headers, output_file_partial, progress, response_str)) { + return 1; + } + + if (!output_file.empty()) { + try { + std::filesystem::rename(output_file_partial, output_file); + } catch (const std::filesystem::filesystem_error & e) { + printe("Failed to rename '%s' to '%s': %s\n", output_file_partial.c_str(), output_file.c_str(), e.what()); + return 1; + } + } + + return 0; + } + +#ifdef LLAMA_USE_CURL + + ~HttpClient() { + if (chunk) { + curl_slist_free_all(chunk); + } + + if (curl) { + curl_easy_cleanup(curl); + } + } + + private: + CURL * curl = nullptr; + struct curl_slist * chunk = nullptr; + + int download(const std::string & url, const std::vector & headers, const std::string & output_file, + const bool progress, std::string * response_str = nullptr) { + curl = curl_easy_init(); + if (!curl) { + return 1; + } + + progress_data data; + File out; + if (!output_file.empty()) { + if (!out.open(output_file, "ab")) { + printe("Failed to open file for writing\n"); + + return 1; + } + + if (out.lock()) { + printe("Failed to exclusively lock file\n"); + + return 1; + } + } + + set_write_options(response_str, out); + data.file_size = set_resume_point(output_file); + set_progress_options(progress, data); + set_headers(headers); + CURLcode res = perform(url); + if (res != CURLE_OK){ + printe("Fetching resource '%s' failed: %s\n", url.c_str(), curl_easy_strerror(res)); + return 1; + } + + return 0; + } + + void set_write_options(std::string * response_str, const File & out) { + if (response_str) { + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, capture_data); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, response_str); + } else { + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, out.file); + } + } + + size_t set_resume_point(const std::string & output_file) { + size_t file_size = 0; + if (std::filesystem::exists(output_file)) { + file_size = std::filesystem::file_size(output_file); + curl_easy_setopt(curl, CURLOPT_RESUME_FROM_LARGE, static_cast(file_size)); + } + + return file_size; + } + + void set_progress_options(bool progress, progress_data & data) { + if (progress) { + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L); + curl_easy_setopt(curl, CURLOPT_XFERINFODATA, &data); + curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, update_progress); + } + } + + void set_headers(const std::vector & headers) { + if (!headers.empty()) { + if (chunk) { + curl_slist_free_all(chunk); + chunk = 0; + } + + for (const auto & header : headers) { + chunk = curl_slist_append(chunk, header.c_str()); + } + + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); + } + } + + CURLcode perform(const std::string & url) { + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https"); + curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L); +#ifdef _WIN32 + curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); +#endif + return curl_easy_perform(curl); + } + +#else // LLAMA_USE_CURL is not defined + +#define curl_off_t long long // temporary hack + + private: + // this is a direct translation of the cURL download() above + int download(const std::string & url, const std::vector & headers_vec, const std::string & output_file, + const bool progress, std::string * response_str = nullptr) { + try { + auto [cli, url_parts] = common_http_client(url); + + httplib::Headers headers; + for (const auto & h : headers_vec) { + size_t pos = h.find(':'); + if (pos != std::string::npos) { + headers.emplace(h.substr(0, pos), h.substr(pos + 2)); + } + } + + File out; + if (!output_file.empty()) { + if (!out.open(output_file, "ab")) { + printe("Failed to open file for writing\n"); + return 1; + } + if (out.lock()) { + printe("Failed to exclusively lock file\n"); + return 1; + } + } + + size_t resume_offset = 0; + if (!output_file.empty() && std::filesystem::exists(output_file)) { + resume_offset = std::filesystem::file_size(output_file); + if (resume_offset > 0) { + headers.emplace("Range", "bytes=" + std::to_string(resume_offset) + "-"); + } + } + + progress_data data; + data.file_size = resume_offset; + + long long total_size = 0; + long long received_this_session = 0; + + auto response_handler = + [&](const httplib::Response & response) { + if (resume_offset > 0 && response.status != 206) { + printe("\nServer does not support resuming. Restarting download.\n"); + out.file = freopen(output_file.c_str(), "wb", out.file); + if (!out.file) { + return false; + } + data.file_size = 0; + } + if (progress) { + if (response.has_header("Content-Length")) { + total_size = std::stoll(response.get_header_value("Content-Length")); + } else if (response.has_header("Content-Range")) { + auto range = response.get_header_value("Content-Range"); + auto slash = range.find('/'); + if (slash != std::string::npos) { + total_size = std::stoll(range.substr(slash + 1)); + } + } + } + return true; + }; + + auto content_receiver = + [&](const char * chunk, size_t length) { + if (out.file && fwrite(chunk, 1, length, out.file) != length) { + return false; + } + if (response_str) { + response_str->append(chunk, length); + } + received_this_session += length; + + if (progress && total_size > 0) { + update_progress(&data, total_size, received_this_session, 0, 0); + } + return true; + }; + + auto res = cli.Get(url_parts.path, headers, response_handler, content_receiver); + + if (data.printed) { + printe("\n"); + } + + if (!res) { + auto err = res.error(); + printe("Fetching resource '%s' failed: %s\n", url.c_str(), httplib::to_string(err).c_str()); + return 1; + } + + if (res->status >= 400) { + printe("Fetching resource '%s' failed with status code: %d\n", url.c_str(), res->status); + return 1; + } + + } catch (const std::exception & e) { + printe("HTTP request failed: %s\n", e.what()); + return 1; + } + return 0; + } + +#endif // LLAMA_USE_CURL + + static std::string human_readable_time(double seconds) { + int hrs = static_cast(seconds) / 3600; + int mins = (static_cast(seconds) % 3600) / 60; + int secs = static_cast(seconds) % 60; + + if (hrs > 0) { + return string_format("%dh %02dm %02ds", hrs, mins, secs); + } else if (mins > 0) { + return string_format("%dm %02ds", mins, secs); + } else { + return string_format("%ds", secs); + } + } + + static std::string human_readable_size(curl_off_t size) { + static const char * suffix[] = { "B", "KB", "MB", "GB", "TB" }; + char length = sizeof(suffix) / sizeof(suffix[0]); + int i = 0; + double dbl_size = size; + if (size > 1024) { + for (i = 0; (size / 1024) > 0 && i < length - 1; i++, size /= 1024) { + dbl_size = size / 1024.0; + } + } + + return string_format("%.2f %s", dbl_size, suffix[i]); + } + + static int update_progress(void * ptr, curl_off_t total_to_download, curl_off_t now_downloaded, curl_off_t, + curl_off_t) { + progress_data * data = static_cast(ptr); + if (total_to_download <= 0) { + return 0; + } + + total_to_download += data->file_size; + const curl_off_t now_downloaded_plus_file_size = now_downloaded + data->file_size; + const curl_off_t percentage = calculate_percentage(now_downloaded_plus_file_size, total_to_download); + std::string progress_prefix = generate_progress_prefix(percentage); + + const double speed = calculate_speed(now_downloaded, data->start_time); + const double tim = (total_to_download - now_downloaded) / speed; + std::string progress_suffix = + generate_progress_suffix(now_downloaded_plus_file_size, total_to_download, speed, tim); + + int progress_bar_width = calculate_progress_bar_width(progress_prefix, progress_suffix); + std::string progress_bar; + generate_progress_bar(progress_bar_width, percentage, progress_bar); + + print_progress(progress_prefix, progress_bar, progress_suffix); + data->printed = true; + + return 0; + } + + static curl_off_t calculate_percentage(curl_off_t now_downloaded_plus_file_size, curl_off_t total_to_download) { + return (now_downloaded_plus_file_size * 100) / total_to_download; + } + + static std::string generate_progress_prefix(curl_off_t percentage) { + return string_format("%3ld%% |", static_cast(percentage)); + } + + static double calculate_speed(curl_off_t now_downloaded, const std::chrono::steady_clock::time_point & start_time) { + const auto now = std::chrono::steady_clock::now(); + const std::chrono::duration elapsed_seconds = now - start_time; + return now_downloaded / elapsed_seconds.count(); + } + + static std::string generate_progress_suffix(curl_off_t now_downloaded_plus_file_size, curl_off_t total_to_download, + double speed, double estimated_time) { + const int width = 10; + return string_format("%*s/%*s%*s/s%*s", width, human_readable_size(now_downloaded_plus_file_size).c_str(), + width, human_readable_size(total_to_download).c_str(), width, + human_readable_size(speed).c_str(), width, human_readable_time(estimated_time).c_str()); + } + + static int calculate_progress_bar_width(const std::string & progress_prefix, const std::string & progress_suffix) { + int progress_bar_width = get_terminal_width() - progress_prefix.size() - progress_suffix.size() - 3; + if (progress_bar_width < 1) { + progress_bar_width = 1; + } + + return progress_bar_width; + } + + static std::string generate_progress_bar(int progress_bar_width, curl_off_t percentage, + std::string & progress_bar) { + const curl_off_t pos = (percentage * progress_bar_width) / 100; + for (int i = 0; i < progress_bar_width; ++i) { + progress_bar.append((i < pos) ? "█" : " "); + } + + return progress_bar; + } + + static void print_progress(const std::string & progress_prefix, const std::string & progress_bar, + const std::string & progress_suffix) { + printe("\r" LOG_CLR_TO_EOL "%s%s| %s", progress_prefix.c_str(), progress_bar.c_str(), progress_suffix.c_str()); + } + // Function to write data to a file + static size_t write_data(void * ptr, size_t size, size_t nmemb, void * stream) { + FILE * out = static_cast(stream); + return fwrite(ptr, size, nmemb, out); + } + + // Function to capture data into a string + static size_t capture_data(void * ptr, size_t size, size_t nmemb, void * stream) { + std::string * str = static_cast(stream); + str->append(static_cast(ptr), size * nmemb); + return size * nmemb; + } + +}; + +class LlamaData { + public: + llama_model_ptr model; + llama_sampler_ptr sampler; + llama_context_ptr context; + std::vector messages; // TODO: switch to common_chat_msg + std::list msg_strs; + std::vector fmtted; + + int init(Opt & opt) { + model = initialize_model(opt); + if (!model) { + return 1; + } + + context = initialize_context(model, opt); + if (!context) { + return 1; + } + + sampler = initialize_sampler(opt); + + return 0; + } + + private: + int download(const std::string & url, const std::string & output_file, const bool progress, + const std::vector & headers = {}, std::string * response_str = nullptr) { + HttpClient http; + if (http.init(url, headers, output_file, progress, response_str)) { + return 1; + } + + return 0; + } + + // Helper function to handle model tag extraction and URL construction + std::pair extract_model_and_tag(std::string & model, const std::string & base_url) { + std::string model_tag = "latest"; + const size_t colon_pos = model.find(':'); + if (colon_pos != std::string::npos) { + model_tag = model.substr(colon_pos + 1); + model = model.substr(0, colon_pos); + } + + std::string url = base_url + model + "/manifests/" + model_tag; + + return { model, url }; + } + + // Helper function to download and parse the manifest + int download_and_parse_manifest(const std::string & url, const std::vector & headers, + nlohmann::json & manifest) { + std::string manifest_str; + int ret = download(url, "", false, headers, &manifest_str); + if (ret) { + return ret; + } + + manifest = nlohmann::json::parse(manifest_str); + + return 0; + } + + int dl_from_endpoint(std::string & model_endpoint, std::string & model, const std::string & bn) { + // Find the second occurrence of '/' after protocol string + size_t pos = model.find('/'); + pos = model.find('/', pos + 1); + std::string hfr, hff; + std::vector headers = { "User-Agent: llama-cpp", "Accept: application/json" }; + std::string url; + + if (pos == std::string::npos) { + auto [model_name, manifest_url] = extract_model_and_tag(model, model_endpoint + "v2/"); + hfr = model_name; + + nlohmann::json manifest; + int ret = download_and_parse_manifest(manifest_url, headers, manifest); + if (ret) { + return ret; + } + + hff = manifest["ggufFile"]["rfilename"]; + } else { + hfr = model.substr(0, pos); + hff = model.substr(pos + 1); + } + + url = model_endpoint + hfr + "/resolve/main/" + hff; + + return download(url, bn, true, headers); + } + + int modelscope_dl(std::string & model, const std::string & bn) { + std::string model_endpoint = "https://modelscope.cn/models/"; + return dl_from_endpoint(model_endpoint, model, bn); + } + + int huggingface_dl(std::string & model, const std::string & bn) { + std::string model_endpoint = get_model_endpoint(); + return dl_from_endpoint(model_endpoint, model, bn); + } + + int ollama_dl(std::string & model, const std::string & bn) { + const std::vector headers = { "Accept: application/vnd.docker.distribution.manifest.v2+json" }; + if (model.find('/') == std::string::npos) { + model = "library/" + model; + } + + auto [model_name, manifest_url] = extract_model_and_tag(model, "https://registry.ollama.ai/v2/"); + nlohmann::json manifest; + int ret = download_and_parse_manifest(manifest_url, {}, manifest); + if (ret) { + return ret; + } + + std::string layer; + for (const auto & l : manifest["layers"]) { + if (l["mediaType"] == "application/vnd.ollama.image.model") { + layer = l["digest"]; + break; + } + } + + std::string blob_url = "https://registry.ollama.ai/v2/" + model_name + "/blobs/" + layer; + + return download(blob_url, bn, true, headers); + } + + int github_dl(const std::string & model, const std::string & bn) { + std::string repository = model; + std::string branch = "main"; + const size_t at_pos = model.find('@'); + if (at_pos != std::string::npos) { + repository = model.substr(0, at_pos); + branch = model.substr(at_pos + 1); + } + + const std::vector repo_parts = string_split(repository, "/"); + if (repo_parts.size() < 3) { + printe("Invalid GitHub repository format\n"); + return 1; + } + + const std::string & org = repo_parts[0]; + const std::string & project = repo_parts[1]; + std::string url = "https://raw.githubusercontent.com/" + org + "/" + project + "/" + branch; + for (size_t i = 2; i < repo_parts.size(); ++i) { + url += "/" + repo_parts[i]; + } + + return download(url, bn, true); + } + + int s3_dl(const std::string & model, const std::string & bn) { + const size_t slash_pos = model.find('/'); + if (slash_pos == std::string::npos) { + return 1; + } + + const std::string bucket = model.substr(0, slash_pos); + const std::string key = model.substr(slash_pos + 1); + const char * access_key = std::getenv("AWS_ACCESS_KEY_ID"); + const char * secret_key = std::getenv("AWS_SECRET_ACCESS_KEY"); + if (!access_key || !secret_key) { + printe("AWS credentials not found in environment\n"); + return 1; + } + + // Generate AWS Signature Version 4 headers + // (Implementation requires HMAC-SHA256 and date handling) + // Get current timestamp + const time_t now = time(nullptr); + const tm tm = *gmtime(&now); + const std::string date = strftime_fmt("%Y%m%d", tm); + const std::string datetime = strftime_fmt("%Y%m%dT%H%M%SZ", tm); + const std::vector headers = { + "Authorization: AWS4-HMAC-SHA256 Credential=" + std::string(access_key) + "/" + date + + "/us-east-1/s3/aws4_request", + "x-amz-content-sha256: UNSIGNED-PAYLOAD", "x-amz-date: " + datetime + }; + + const std::string url = "https://" + bucket + ".s3.amazonaws.com/" + key; + + return download(url, bn, true, headers); + } + + std::string basename(const std::string & path) { + const size_t pos = path.find_last_of("/\\"); + if (pos == std::string::npos) { + return path; + } + + return path.substr(pos + 1); + } + + int rm_until_substring(std::string & model_, const std::string & substring) { + const std::string::size_type pos = model_.find(substring); + if (pos == std::string::npos) { + return 1; + } + + model_ = model_.substr(pos + substring.size()); // Skip past the substring + return 0; + } + + int resolve_model(std::string & model_) { + int ret = 0; + if (string_starts_with(model_, "file://") || std::filesystem::exists(model_)) { + rm_until_substring(model_, "://"); + + return ret; + } + + const std::string bn = basename(model_); + if (string_starts_with(model_, "hf://") || string_starts_with(model_, "huggingface://") || + string_starts_with(model_, "hf.co/")) { + rm_until_substring(model_, "hf.co/"); + rm_until_substring(model_, "://"); + ret = huggingface_dl(model_, bn); + } else if (string_starts_with(model_, "ms://") || string_starts_with(model_, "modelscope://")) { + rm_until_substring(model_, "://"); + ret = modelscope_dl(model_, bn); + } else if ((string_starts_with(model_, "https://") || string_starts_with(model_, "http://")) && + !string_starts_with(model_, "https://ollama.com/library/")) { + ret = download(model_, bn, true); + } else if (string_starts_with(model_, "github:") || string_starts_with(model_, "github://")) { + rm_until_substring(model_, "github:"); + rm_until_substring(model_, "://"); + ret = github_dl(model_, bn); + } else if (string_starts_with(model_, "s3://")) { + rm_until_substring(model_, "://"); + ret = s3_dl(model_, bn); + } else { // ollama:// or nothing + rm_until_substring(model_, "ollama.com/library/"); + rm_until_substring(model_, "://"); + ret = ollama_dl(model_, bn); + } + + model_ = bn; + + return ret; + } + + // Initializes the model and returns a unique pointer to it + llama_model_ptr initialize_model(Opt & opt) { + ggml_backend_load_all(); + resolve_model(opt.model_); + printe("\r" LOG_CLR_TO_EOL "Loading model"); + llama_model_ptr model(llama_model_load_from_file(opt.model_.c_str(), opt.model_params)); + if (!model) { + printe("%s: error: unable to load model from file: %s\n", __func__, opt.model_.c_str()); + } + + printe("\r" LOG_CLR_TO_EOL); + return model; + } + + // Initializes the context with the specified parameters + llama_context_ptr initialize_context(const llama_model_ptr & model, const Opt & opt) { + llama_context_ptr context(llama_init_from_model(model.get(), opt.ctx_params)); + if (!context) { + printe("%s: error: failed to create the llama_context\n", __func__); + } + + return context; + } + + // Initializes and configures the sampler + llama_sampler_ptr initialize_sampler(const Opt & opt) { + llama_sampler_ptr sampler(llama_sampler_chain_init(llama_sampler_chain_default_params())); + llama_sampler_chain_add(sampler.get(), llama_sampler_init_min_p(0.05f, 1)); + llama_sampler_chain_add(sampler.get(), llama_sampler_init_temp(opt.temperature)); + llama_sampler_chain_add(sampler.get(), llama_sampler_init_dist(LLAMA_DEFAULT_SEED)); + + return sampler; + } +}; + +// Add a message to `messages` and store its content in `msg_strs` +static void add_message(const char * role, const std::string & text, LlamaData & llama_data) { + llama_data.msg_strs.push_back(std::move(text)); + llama_data.messages.push_back({ role, llama_data.msg_strs.back().c_str() }); +} + +// Function to apply the chat template and resize `formatted` if needed +static int apply_chat_template(const struct common_chat_templates * tmpls, LlamaData & llama_data, const bool append, bool use_jinja) { + common_chat_templates_inputs inputs; + for (const auto & msg : llama_data.messages) { + common_chat_msg cmsg; + cmsg.role = msg.role; + cmsg.content = msg.content; + inputs.messages.push_back(cmsg); + } + inputs.add_generation_prompt = append; + inputs.use_jinja = use_jinja; + + auto chat_params = common_chat_templates_apply(tmpls, inputs); + // TODO: use other params for tool calls. + auto result = chat_params.prompt; + llama_data.fmtted.resize(result.size() + 1); + memcpy(llama_data.fmtted.data(), result.c_str(), result.size() + 1); + return result.size(); +} + +// Function to tokenize the prompt +static int tokenize_prompt(const llama_vocab * vocab, const std::string & prompt, + std::vector & prompt_tokens, const LlamaData & llama_data) { + const bool is_first = llama_memory_seq_pos_max(llama_get_memory(llama_data.context.get()), 0) == -1; + int n_tokens = prompt.size() + 2 * is_first; + prompt_tokens.resize(n_tokens); + n_tokens = llama_tokenize(vocab, prompt.c_str(), prompt.size(), + prompt_tokens.data(), prompt_tokens.size(), + is_first, /*parse_special =*/true); + if (n_tokens == std::numeric_limits::min()) { + printe("tokenization failed: input too large\n"); + return -1; + } + if (n_tokens < 0) { + prompt_tokens.resize(-n_tokens); + int check = llama_tokenize(vocab, prompt.c_str(), prompt.size(), + prompt_tokens.data(), prompt_tokens.size(), + is_first, /*parse_special =*/true); + if (check != -n_tokens) { + printe("failed to tokenize the prompt (size mismatch)\n"); + return -1; + } + n_tokens = check; + } else { + prompt_tokens.resize(n_tokens); + } + return n_tokens; +} + +// Check if we have enough space in the context to evaluate this batch +static int check_context_size(const llama_context_ptr & ctx, const llama_batch & batch) { + const int n_ctx = llama_n_ctx(ctx.get()); + const int n_ctx_used = llama_memory_seq_pos_max(llama_get_memory(ctx.get()), 0); + if (n_ctx_used + batch.n_tokens > n_ctx) { + printf(LOG_COL_DEFAULT "\n"); + printe("context size exceeded\n"); + return 1; + } + + return 0; +} + +// convert the token to a string +static int convert_token_to_string(const llama_vocab * vocab, const llama_token token_id, std::string & piece) { + char buf[256]; + int n = llama_token_to_piece(vocab, token_id, buf, sizeof(buf), 0, true); + if (n < 0) { + printe("failed to convert token to piece\n"); + return 1; + } + + piece = std::string(buf, n); + return 0; +} + +static void print_word_and_concatenate_to_response(const std::string & piece, std::string & response) { + printf("%s", piece.c_str()); + fflush(stdout); + response += piece; +} + +// helper function to evaluate a prompt and generate a response +static int generate(LlamaData & llama_data, const std::string & prompt, std::string & response) { + const llama_vocab * vocab = llama_model_get_vocab(llama_data.model.get()); + + std::vector tokens; + if (tokenize_prompt(vocab, prompt, tokens, llama_data) < 0) { + return 1; + } + + // prepare a batch for the prompt + llama_batch batch = llama_batch_get_one(tokens.data(), tokens.size()); + llama_token new_token_id; + while (true) { + check_context_size(llama_data.context, batch); + if (llama_decode(llama_data.context.get(), batch)) { + printe("failed to decode\n"); + return 1; + } + + // sample the next token, check is it an end of generation? + new_token_id = llama_sampler_sample(llama_data.sampler.get(), llama_data.context.get(), -1); + if (llama_vocab_is_eog(vocab, new_token_id)) { + break; + } + + std::string piece; + if (convert_token_to_string(vocab, new_token_id, piece)) { + return 1; + } + + print_word_and_concatenate_to_response(piece, response); + + // prepare the next batch with the sampled token + batch = llama_batch_get_one(&new_token_id, 1); + } + + printf(LOG_COL_DEFAULT); + return 0; +} + +static int read_user_input(std::string & user_input) { + static const char * prompt_prefix_env = std::getenv("LLAMA_PROMPT_PREFIX"); + static const char * prompt_prefix = prompt_prefix_env ? prompt_prefix_env : "> "; +#ifdef WIN32 + printf("\r" LOG_CLR_TO_EOL LOG_COL_DEFAULT "%s", prompt_prefix); + + std::getline(std::cin, user_input); + if (std::cin.eof()) { + printf("\n"); + return 1; + } +#else + std::unique_ptr line(const_cast(linenoise(prompt_prefix)), free); + if (!line) { + return 1; + } + + user_input = line.get(); +#endif + + if (user_input == "/bye") { + return 1; + } + + if (user_input.empty()) { + return 2; + } + +#ifndef WIN32 + linenoiseHistoryAdd(line.get()); +#endif + + return 0; // Should have data in happy path +} + +// Function to generate a response based on the prompt +static int generate_response(LlamaData & llama_data, const std::string & prompt, std::string & response, + const bool stdout_a_terminal) { + // Set response color + if (stdout_a_terminal) { + printf(LOG_COL_YELLOW); + } + + if (generate(llama_data, prompt, response)) { + printe("failed to generate response\n"); + return 1; + } + + // End response with color reset and newline + printf("\n%s", stdout_a_terminal ? LOG_COL_DEFAULT : ""); + return 0; +} + +// Helper function to apply the chat template and handle errors +static int apply_chat_template_with_error_handling(const common_chat_templates * tmpls, LlamaData & llama_data, const bool append, int & output_length, bool use_jinja) { + const int new_len = apply_chat_template(tmpls, llama_data, append, use_jinja); + if (new_len < 0) { + printe("failed to apply the chat template\n"); + return -1; + } + + output_length = new_len; + return 0; +} + +// Helper function to handle user input +static int handle_user_input(std::string & user_input, const std::string & user) { + if (!user.empty()) { + user_input = user; + return 0; // No need for interactive input + } + + return read_user_input(user_input); // Returns true if input ends the loop +} + +static bool is_stdin_a_terminal() { +#if defined(_WIN32) + HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); + DWORD mode; + return GetConsoleMode(hStdin, &mode); +#else + return isatty(STDIN_FILENO); +#endif +} + +static bool is_stdout_a_terminal() { +#if defined(_WIN32) + HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); + DWORD mode; + return GetConsoleMode(hStdout, &mode); +#else + return isatty(STDOUT_FILENO); +#endif +} + +// Function to handle user input +static int get_user_input(std::string & user_input, const std::string & user) { + while (true) { + const int ret = handle_user_input(user_input, user); + if (ret == 1) { + return 1; + } + + if (ret == 2) { + continue; + } + + break; + } + + return 0; +} + +// Reads a chat template file to be used +static std::string read_chat_template_file(const std::string & chat_template_file) { + File file; + if (!file.open(chat_template_file, "r")) { + printe("Error opening chat template file '%s': %s", chat_template_file.c_str(), strerror(errno)); + return ""; + } + + return file.to_string(); +} + +static int process_user_message(const Opt & opt, const std::string & user_input, LlamaData & llama_data, + const common_chat_templates_ptr & chat_templates, int & prev_len, + const bool stdout_a_terminal) { + add_message("user", opt.user.empty() ? user_input : opt.user, llama_data); + int new_len; + if (apply_chat_template_with_error_handling(chat_templates.get(), llama_data, true, new_len, opt.use_jinja) < 0) { + return 1; + } + + std::string prompt(llama_data.fmtted.begin() + prev_len, llama_data.fmtted.begin() + new_len); + std::string response; + if (generate_response(llama_data, prompt, response, stdout_a_terminal)) { + return 1; + } + + if (!opt.user.empty()) { + return 2; + } + + add_message("assistant", response, llama_data); + if (apply_chat_template_with_error_handling(chat_templates.get(), llama_data, false, prev_len, opt.use_jinja) < 0) { + return 1; + } + + return 0; +} + +// Main chat loop function +static int chat_loop(LlamaData & llama_data, const Opt & opt) { + int prev_len = 0; + llama_data.fmtted.resize(llama_n_ctx(llama_data.context.get())); + std::string chat_template; + if (!opt.chat_template_file.empty()) { + chat_template = read_chat_template_file(opt.chat_template_file); + } + + common_chat_templates_ptr chat_templates = common_chat_templates_init(llama_data.model.get(), chat_template); + static const bool stdout_a_terminal = is_stdout_a_terminal(); + while (true) { + // Get user input + std::string user_input; + if (get_user_input(user_input, opt.user) == 1) { + return 0; + } + + const int ret = process_user_message(opt, user_input, llama_data, chat_templates, prev_len, stdout_a_terminal); + if (ret == 1) { + return 1; + } else if (ret == 2) { + break; + } + } + + return 0; +} + +static void log_callback(const enum ggml_log_level level, const char * text, void * p) { + const Opt * opt = static_cast(p); + if (opt->verbose || level == GGML_LOG_LEVEL_ERROR) { + printe("%s", text); + } +} + +static std::string read_pipe_data() { + std::ostringstream result; + result << std::cin.rdbuf(); // Read all data from std::cin + return result.str(); +} + +static void ctrl_c_handling() { +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) + struct sigaction sigint_action; + sigint_action.sa_handler = sigint_handler; + sigemptyset(&sigint_action.sa_mask); + sigint_action.sa_flags = 0; + sigaction(SIGINT, &sigint_action, NULL); +#elif defined(_WIN32) + auto console_ctrl_handler = +[](DWORD ctrl_type) -> BOOL { + return (ctrl_type == CTRL_C_EVENT) ? (sigint_handler(SIGINT), true) : false; + }; + SetConsoleCtrlHandler(reinterpret_cast(console_ctrl_handler), true); +#endif +} + +int main(int argc, const char ** argv) { + ctrl_c_handling(); + Opt opt; + const int ret = opt.init(argc, argv); + if (ret == 2) { + return 0; + } else if (ret) { + return 1; + } + + if (!is_stdin_a_terminal()) { + if (!opt.user.empty()) { + opt.user += "\n\n"; + } + + opt.user += read_pipe_data(); + } + + llama_log_set(log_callback, &opt); + LlamaData llama_data; + if (llama_data.init(opt)) { + return 1; + } + + if (chat_loop(llama_data, opt)) { + return 1; + } + + return 0; +} diff --git a/tools/server/CMakeLists.txt b/tools/server/CMakeLists.txt index a39b4c5..ae1a497 100644 --- a/tools/server/CMakeLists.txt +++ b/tools/server/CMakeLists.txt @@ -38,6 +38,14 @@ set(TARGET_SRCS server-http.h server-models.cpp server-models.h + server-task.cpp + server-task.h + server-queue.cpp + server-queue.h + server-common.cpp + server-common.h + server-context.cpp + server-context.h ) set(PUBLIC_ASSETS index.html.gz diff --git a/tools/server/README.md b/tools/server/README.md index 9fe8938..1ae5eae 100644 --- a/tools/server/README.md +++ b/tools/server/README.md @@ -33,7 +33,6 @@ For the ful list of features, please refer to [server's changelog](https://githu | -------- | ----------- | | `-h, --help, --usage` | print usage and exit | | `--version` | show version and build info | -| `--license` | show source code license and dependencies | | `-cl, --cache-list` | show list of models in cache | | `--completion-bash` | print source-able bash completion script for llama.cpp | | `--verbose-prompt` | print a verbose prompt before generation (default: false) | @@ -74,23 +73,22 @@ For the ful list of features, please refer to [server's changelog](https://githu | `-ctv, --cache-type-v TYPE` | KV cache data type for V
allowed values: f32, f16, bf16, q8_0, q4_0, q4_1, iq4_nl, q5_0, q5_1
(default: f16)
(env: LLAMA_ARG_CACHE_TYPE_V) | | `-dt, --defrag-thold N` | KV cache defragmentation threshold (DEPRECATED)
(env: LLAMA_ARG_DEFRAG_THOLD) | | `--mlock` | force system to keep model in RAM rather than swapping or compressing
(env: LLAMA_ARG_MLOCK) | -| `--mmap, --no-mmap` | whether to memory-map model. Explicitly enabling mmap disables direct-io. (if mmap disabled, slower load but may reduce pageouts if not using mlock) (default: enabled)
(env: LLAMA_ARG_MMAP) | -| `-dio, --direct-io, -ndio, --no-direct-io` | use DirectIO if available. Takes precedence over --mmap (default: enabled)
(env: LLAMA_ARG_DIO) | +| `--mmap, --no-mmap` | whether to memory-map model (if disabled, slower load but may reduce pageouts if not using mlock) (default: enabled)
(env: LLAMA_ARG_MMAP) | | `--numa TYPE` | attempt optimizations that help on some NUMA systems
- distribute: spread execution evenly over all nodes
- isolate: only spawn threads on CPUs on the node that execution started on
- numactl: use the CPU map provided by numactl
if run without this previously, it is recommended to drop the system page cache before using this
see https://github.com/ggml-org/llama.cpp/issues/1437
(env: LLAMA_ARG_NUMA) | | `-dev, --device ` | comma-separated list of devices to use for offloading (none = don't offload)
use --list-devices to see a list of available devices
(env: LLAMA_ARG_DEVICE) | | `--list-devices` | print list of available devices and exit | -| `-ot, --override-tensor =,...` | override tensor buffer type
(env: LLAMA_ARG_OVERRIDE_TENSOR) | +| `-ot, --override-tensor =,...` | override tensor buffer type | | `-cmoe, --cpu-moe` | keep all Mixture of Experts (MoE) weights in the CPU
(env: LLAMA_ARG_CPU_MOE) | | `-ncmoe, --n-cpu-moe N` | keep the Mixture of Experts (MoE) weights of the first N layers in the CPU
(env: LLAMA_ARG_N_CPU_MOE) | -| `-ngl, --gpu-layers, --n-gpu-layers N` | max. number of layers to store in VRAM, either an exact number, 'auto', or 'all' (default: auto)
(env: LLAMA_ARG_N_GPU_LAYERS) | +| `-ngl, --gpu-layers, --n-gpu-layers N` | max. number of layers to store in VRAM (default: -1)
(env: LLAMA_ARG_N_GPU_LAYERS) | | `-sm, --split-mode {none,layer,row}` | how to split the model across multiple GPUs, one of:
- none: use one GPU only
- layer (default): split layers and KV across GPUs
- row: split rows across GPUs
(env: LLAMA_ARG_SPLIT_MODE) | | `-ts, --tensor-split N0,N1,N2,...` | fraction of the model to offload to each GPU, comma-separated list of proportions, e.g. 3,1
(env: LLAMA_ARG_TENSOR_SPLIT) | | `-mg, --main-gpu INDEX` | the GPU to use for the model (with split-mode = none), or for intermediate results and KV (with split-mode = row) (default: 0)
(env: LLAMA_ARG_MAIN_GPU) | | `-fit, --fit [on\|off]` | whether to adjust unset arguments to fit in device memory ('on' or 'off', default: 'on')
(env: LLAMA_ARG_FIT) | -| `-fitt, --fit-target MiB0,MiB1,MiB2,...` | target margin per device for --fit, comma-separated list of values, single value is broadcast across all devices, default: 1024
(env: LLAMA_ARG_FIT_TARGET) | +| `-fitt, --fit-target MiB` | target margin per device for --fit option, default: 1024
(env: LLAMA_ARG_FIT_TARGET) | | `-fitc, --fit-ctx N` | minimum ctx size that can be set by --fit option, default: 4096
(env: LLAMA_ARG_FIT_CTX) | | `--check-tensors` | check model tensor data for invalid values (default: false) | -| `--override-kv KEY=TYPE:VALUE,...` | advanced option to override model metadata by key. to specify multiple overrides, either use comma-separated values.
types: int, float, bool, str. example: --override-kv tokenizer.ggml.add_bos_token=bool:false,tokenizer.ggml.add_eos_token=bool:false | +| `--override-kv KEY=TYPE:VALUE,...` | advanced option to override model metadata by key. to specify multiple overrides, either use comma-separated or repeat this argument.
types: int, float, bool, str. example: --override-kv tokenizer.ggml.add_bos_token=bool:false,tokenizer.ggml.add_eos_token=bool:false | | `--op-offload, --no-op-offload` | whether to offload host tensor operations to device (default: true) | | `--lora FNAME` | path to LoRA adapter (use comma-separated values to load multiple adapters) | | `--lora-scaled FNAME:SCALE,...` | path to LoRA adapter with user defined scaling (format: FNAME:SCALE,...)
note: use comma-separated values | @@ -130,8 +128,6 @@ For the ful list of features, please refer to [server's changelog](https://githu | `--top-k N` | top-k sampling (default: 40, 0 = disabled)
(env: LLAMA_ARG_TOP_K) | | `--top-p N` | top-p sampling (default: 0.9, 1.0 = disabled) | | `--min-p N` | min-p sampling (default: 0.1, 0.0 = disabled) | -| `--adaptive-target N` | adaptive-p: select tokens near this probability (valid range 0.0 to 1.0; negative = disabled) | -| `--adaptive-decay N` | adaptive-p: EMA decay for adaptation; effective history length ≈ 1/(1-decay) tokens (valid range 0.0 - 0.99) | | `--top-nsigma N` | top-n-sigma sampling (default: -1.0, -1.0 = disabled) | | `--xtc-probability N` | xtc probability (default: 0.0, 0.0 = disabled) | | `--xtc-threshold N` | xtc threshold (default: 0.1, 1.0 = disabled) | @@ -155,7 +151,6 @@ For the ful list of features, please refer to [server's changelog](https://githu | `--grammar-file FNAME` | file to read grammar from | | `-j, --json-schema SCHEMA` | JSON schema to constrain generations (https://json-schema.org/), e.g. `{}` for any JSON object
For schemas w/ external $refs, use --grammar + example/json_schema_to_grammar.py instead | | `-jf, --json-schema-file FILE` | File containing a JSON schema to constrain generations (https://json-schema.org/), e.g. `{}` for any JSON object
For schemas w/ external $refs, use --grammar + example/json_schema_to_grammar.py instead | -| `-bs, --backend-sampling` | enable backend sampling (experimental) (default: disabled)
(env: LLAMA_ARG_BACKEND_SAMPLING) | ### Server-specific params @@ -192,11 +187,11 @@ For the ful list of features, please refer to [server's changelog](https://githu | `--webui, --no-webui` | whether to enable the Web UI (default: enabled)
(env: LLAMA_ARG_WEBUI) | | `--embedding, --embeddings` | restrict to only support embedding use case; use only with dedicated embedding models (default: disabled)
(env: LLAMA_ARG_EMBEDDINGS) | | `--rerank, --reranking` | enable reranking endpoint on server (default: disabled)
(env: LLAMA_ARG_RERANKING) | -| `--api-key KEY` | API key to use for authentication, multiple keys can be provided as a comma-separated list (default: none)
(env: LLAMA_API_KEY) | +| `--api-key KEY` | API key to use for authentication (default: none)
(env: LLAMA_API_KEY) | | `--api-key-file FNAME` | path to file containing API keys (default: none) | | `--ssl-key-file FNAME` | path to file a PEM-encoded SSL private key
(env: LLAMA_ARG_SSL_KEY_FILE) | | `--ssl-cert-file FNAME` | path to file a PEM-encoded SSL certificate
(env: LLAMA_ARG_SSL_CERT_FILE) | -| `--chat-template-kwargs STRING` | sets additional params for the json template parser, must be a valid json object string, e.g. '{"key1":"value1","key2":"value2"}'
(env: LLAMA_CHAT_TEMPLATE_KWARGS) | +| `--chat-template-kwargs STRING` | sets additional params for the json template parser
(env: LLAMA_CHAT_TEMPLATE_KWARGS) | | `-to, --timeout N` | server read/write timeout in seconds (default: 600)
(env: LLAMA_ARG_TIMEOUT) | | `--threads-http N` | number of threads used to process HTTP requests (default: -1)
(env: LLAMA_ARG_THREADS_HTTP) | | `--cache-reuse N` | min chunk size to attempt reusing from the cache via KV shifting (default: 0)
[(card)](https://ggml.ai/f0.png)
(env: LLAMA_ARG_CACHE_REUSE) | @@ -212,8 +207,8 @@ For the ful list of features, please refer to [server's changelog](https://githu | `--jinja, --no-jinja` | whether to use jinja template engine for chat (default: enabled)
(env: LLAMA_ARG_JINJA) | | `--reasoning-format FORMAT` | controls whether thought tags are allowed and/or extracted from the response, and in which format they're returned; one of:
- none: leaves thoughts unparsed in `message.content`
- deepseek: puts thoughts in `message.reasoning_content`
- deepseek-legacy: keeps `` tags in `message.content` while also populating `message.reasoning_content`
(default: auto)
(env: LLAMA_ARG_THINK) | | `--reasoning-budget N` | controls the amount of thinking allowed; currently only one of: -1 for unrestricted thinking budget, or 0 to disable thinking (default: -1)
(env: LLAMA_ARG_THINK_BUDGET) | -| `--chat-template JINJA_TEMPLATE` | set custom jinja chat template (default: template taken from model's metadata)
if suffix/prefix are specified, template will be disabled
only commonly used templates are accepted (unless --jinja is set before this flag):
list of built-in templates:
bailing, bailing-think, bailing2, chatglm3, chatglm4, chatml, command-r, deepseek, deepseek2, deepseek3, exaone3, exaone4, falcon3, gemma, gigachat, glmedge, gpt-oss, granite, grok-2, hunyuan-dense, hunyuan-moe, kimi-k2, llama2, llama2-sys, llama2-sys-bos, llama2-sys-strip, llama3, llama4, megrez, minicpm, mistral-v1, mistral-v3, mistral-v3-tekken, mistral-v7, mistral-v7-tekken, monarch, openchat, orion, pangu-embedded, phi3, phi4, rwkv-world, seed_oss, smolvlm, solar-open, vicuna, vicuna-orca, yandex, zephyr
(env: LLAMA_ARG_CHAT_TEMPLATE) | -| `--chat-template-file JINJA_TEMPLATE_FILE` | set custom jinja chat template file (default: template taken from model's metadata)
if suffix/prefix are specified, template will be disabled
only commonly used templates are accepted (unless --jinja is set before this flag):
list of built-in templates:
bailing, bailing-think, bailing2, chatglm3, chatglm4, chatml, command-r, deepseek, deepseek2, deepseek3, exaone3, exaone4, falcon3, gemma, gigachat, glmedge, gpt-oss, granite, grok-2, hunyuan-dense, hunyuan-moe, kimi-k2, llama2, llama2-sys, llama2-sys-bos, llama2-sys-strip, llama3, llama4, megrez, minicpm, mistral-v1, mistral-v3, mistral-v3-tekken, mistral-v7, mistral-v7-tekken, monarch, openchat, orion, pangu-embedded, phi3, phi4, rwkv-world, seed_oss, smolvlm, solar-open, vicuna, vicuna-orca, yandex, zephyr
(env: LLAMA_ARG_CHAT_TEMPLATE_FILE) | +| `--chat-template JINJA_TEMPLATE` | set custom jinja chat template (default: template taken from model's metadata)
if suffix/prefix are specified, template will be disabled
only commonly used templates are accepted (unless --jinja is set before this flag):
list of built-in templates:
bailing, bailing-think, bailing2, chatglm3, chatglm4, chatml, command-r, deepseek, deepseek2, deepseek3, exaone3, exaone4, falcon3, gemma, gigachat, glmedge, gpt-oss, granite, grok-2, hunyuan-dense, hunyuan-moe, kimi-k2, llama2, llama2-sys, llama2-sys-bos, llama2-sys-strip, llama3, llama4, megrez, minicpm, mistral-v1, mistral-v3, mistral-v3-tekken, mistral-v7, mistral-v7-tekken, monarch, openchat, orion, pangu-embedded, phi3, phi4, rwkv-world, seed_oss, smolvlm, vicuna, vicuna-orca, yandex, zephyr
(env: LLAMA_ARG_CHAT_TEMPLATE) | +| `--chat-template-file JINJA_TEMPLATE_FILE` | set custom jinja chat template file (default: template taken from model's metadata)
if suffix/prefix are specified, template will be disabled
only commonly used templates are accepted (unless --jinja is set before this flag):
list of built-in templates:
bailing, bailing-think, bailing2, chatglm3, chatglm4, chatml, command-r, deepseek, deepseek2, deepseek3, exaone3, exaone4, falcon3, gemma, gigachat, glmedge, gpt-oss, granite, grok-2, hunyuan-dense, hunyuan-moe, kimi-k2, llama2, llama2-sys, llama2-sys-bos, llama2-sys-strip, llama3, llama4, megrez, minicpm, mistral-v1, mistral-v3, mistral-v3-tekken, mistral-v7, mistral-v7-tekken, monarch, openchat, orion, pangu-embedded, phi3, phi4, rwkv-world, seed_oss, smolvlm, vicuna, vicuna-orca, yandex, zephyr
(env: LLAMA_ARG_CHAT_TEMPLATE_FILE) | | `--prefill-assistant, --no-prefill-assistant` | whether to prefill the assistant's response if the last message is an assistant message (default: prefill enabled)
when this flag is set, if the last message is an assistant message then it will be treated as a full message and not prefilled

(env: LLAMA_ARG_PREFILL_ASSISTANT) | | `-sps, --slot-prompt-similarity SIMILARITY` | how much the prompt of a request must match the prompt of a slot in order to use that slot (default: 0.10, 0.0 = disabled) | | `--lora-init-without-apply` | load LoRA adapters without applying them (apply later via POST /lora-adapters) (default: disabled) | @@ -225,7 +220,7 @@ For the ful list of features, please refer to [server's changelog](https://githu | `--draft-p-min P` | minimum speculative decoding probability (greedy) (default: 0.8)
(env: LLAMA_ARG_DRAFT_P_MIN) | | `-cd, --ctx-size-draft N` | size of the prompt context for the draft model (default: 0, 0 = loaded from model)
(env: LLAMA_ARG_CTX_SIZE_DRAFT) | | `-devd, --device-draft ` | comma-separated list of devices to use for offloading the draft model (none = don't offload)
use --list-devices to see a list of available devices | -| `-ngld, --gpu-layers-draft, --n-gpu-layers-draft N` | max. number of draft model layers to store in VRAM, either an exact number, 'auto', or 'all' (default: auto)
(env: LLAMA_ARG_N_GPU_LAYERS_DRAFT) | +| `-ngld, --gpu-layers-draft, --n-gpu-layers-draft N` | number of layers to store in VRAM for the draft model
(env: LLAMA_ARG_N_GPU_LAYERS_DRAFT) | | `-md, --model-draft FNAME` | draft model for speculative decoding (default: unused)
(env: LLAMA_ARG_MODEL_DRAFT) | | `--spec-replace TARGET DRAFT` | translate the string in TARGET into DRAFT if the draft model and main model are not compatible | | `-mv, --model-vocoder FNAME` | vocoder model for audio generation (default: unused) | @@ -784,8 +779,7 @@ By default, it is read-only. To make POST request to change global properties, y "modalities": { "vision": false }, - "build_info": "b(build number)-(build commit hash)", - "is_sleeping": false + "build_info": "b(build number)-(build commit hash)" } ``` @@ -794,7 +788,6 @@ By default, it is read-only. To make POST request to change global properties, y - `model_path` - the path to model file (same with `-m` argument) - `chat_template` - the model's original Jinja2 prompt template - `modalities` - the list of supported modalities -- `is_sleeping` - sleeping status, see [Sleeping on idle](#sleeping-on-idle) ### POST `/props`: Change server global properties. @@ -1493,7 +1486,6 @@ The precedence rule for preset options is as follows: We also offer additional options that are exclusive to presets (these aren't treated as command-line arguments): - `load-on-startup` (boolean): Controls whether the model loads automatically when the server starts -- `stop-timeout` (int, seconds): After requested unload, wait for this many seconds before forcing termination (default: 10) ### Routing requests @@ -1582,7 +1574,8 @@ Payload: ```json { - "model": "ggml-org/gemma-3-4b-it-GGUF:Q4_K_M" + "model": "ggml-org/gemma-3-4b-it-GGUF:Q4_K_M", + "extra_args": ["-n", "128", "--top-k", "4"] } ``` @@ -1637,12 +1630,9 @@ The server supports an automatic sleep mode that activates after a specified per When the server enters sleep mode, the model and its associated memory (including the KV cache) are unloaded from RAM to conserve resources. Any new incoming task will automatically trigger the model to reload. -The sleeping status can be retrieved from the `GET /props` endpoint (or `/props?model=(model_name)` in router mode). - Note that the following endpoints are exempt from being considered as incoming tasks. They do not trigger model reloading and do not reset the idle timer: - `GET /health` - `GET /props` -- `GET /models` ## More examples diff --git a/tools/server/public/index.html.gz b/tools/server/public/index.html.gz index a3fcf8dcdbecf36207a3baa28b8efbc20b92a3ac..b5266edee70c73d2b3a987dc31b8febdeff4ba9b 100644 GIT binary patch delta 1298425 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%0DJWf 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�MC-2OoKEgcR-`R@Gnkdvb%b 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�RSev%ljJ!TPD!AfCC&so_6ILM zH}zKQ*E|A^w3LGyDPd6c3N(Vh;GnVw!YH(Nn|u_3*PYWNTfmptRbkAgqKt_W^k|Di zGA+;VmeV$KT1B`EGFX@U^#&UXFNrvxIS%XdPve&$_69D0_ip^AYg*Rjp#eSPcq3+= zHu;_Njv2D&UD()Q(x%s~(+PKS-wfWAHV3Z45%?QwokI@=?a!M`o@R#F0uRBmCWo-j zQ=aU6q>I2E&AT<}VCa`z8)m9S2MDRH+tr_wbs^}k3eZ(14#<&gQ~8x4*}{RyPgvkN zQ1pXzU!Zk=;8(aaQR=xmgy(A4JXdG#xq3#=)!Nh2RR8TIb zh&geK=a4IeM+}|;6s%NVAb<$u4i(@H;H};Q*2;B%m^VP2dkbh!t?$t53#+eeCM($r z%sVD0>4BG(fU%{7JW%v5;LGCmLB4T+rA|!Tcg3WQn8%S@6v@hUE;@57R7v@#L(|n)2S2iD$XdC{4lm zTXIK#5cRJ?*J)Qa=|nFst<--6tx7*DS~vmta;;~Z&9J8_`k$0`I90ADwR;|#Cz{($ z#6~XO@#HQNRXd-8adN>nh-Yxw?jtXG>G)0TKDN1dmhy__pNXXa@v~`-tA$~yDS;ii zWN|`4I5BDp5<+*OzEL>$RZoeq{jc$idLMAos{%Obf6qE+iot{k2LXkHrP!CW6Jl(h zngJT*e>!w`4kOg⪚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 z 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�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


^cyQW^o-xi{1I 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�zH1^oArj1x0Dq-;OG<$z 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˪Ih*IaNY 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 z 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

J=a6jh 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%0DI)-A~yR5~qKHmgrCn0wI`c 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%0AJI&H9+*K2$miWA6r<%DOW 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 r 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 D6SesnC-9ikw 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

ILg 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

? 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%0D}ecH9>!uiHpa~ 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

b-E`pu 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�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

25N13$!q@vXuG)XvrS6#`fR` zYuz?H@bREbrC~C~bO6g7p~Lm$^DZFV{_0hiTXY5*f6+>}J$f=bnj3<@h-3>edo!WK zqer}htcw^AySqPg)Ek}4yu2m&Vz<;77x^8*AHNU%MxWObh$)X?7&p0Yq3q93c-@1+?r1XXQTx}E)i7$8J9P#qe=*#*pfE;Qx-PIadzgwSEZ|VW0_I;j z46YSGX|VyvA$WG7A3@6jw|tHPn~M8Y2bW5D9$diB#UC^Rqd#3ixJHSmOR9&ER4>Br z)2HC&((FYWm;W1+k^-&MaZ3Q*nZROhzga<2LXunnz@-im^Xu2>0bAfbbYo6|sg?aSCLD!sD(S^S$U@^aG^gF>s|u z&C9TgN*Ew*D!)efaETQSpJo^*N?M3K)Eq4C)71}v|CF~T&S{sBYwde57egnDuV7VP zeARmT`0>);4C)@N+HMk$nNwy;~te6w3d`_>nIG4m&u2u$j@u7S158v%lOo}e>#_Z z&ynu~9+I>Oc=>OnUBx#j7B5$?MG((@iD}-gnl9WFHqIg94wDtXcs9R;A&TF$Ang8( z(g#=TpaDUPuj8_jPr%>`v01M`jA*e>GNm?7i)LUInGuxL6~?1=mp3dk)m=XhEuh1}7L3 zM#W3i>cYnsI{q`pm?z-+XE46AxZzAJgm~gvwZF3)!P@tp^Vz6v0c}sMqoL75+Y_ zW*C1@9z8mK^l0bNqc^?Tf0Ky0B%Rsbz%Il4m@@&DD6A!x9y5# zgDR#V)DtA@p!IK9>e$$}2JmUlU`d(Jgk*X<>xWHN$cyA8ehHy#eeBB_Az4r1n`Y$m z1S%!^m(pwnTkafriv+K#g!Q}x+?_Mhx2j~%^JF`?+$>M9h9>Rze?4cUZo)ax>SdxO zIh)vt@eWU7!Evb1?TL@!D#p-z-nksS$5}~LN8|g2zb<_LSKJGDHd8OCXCv@Ti~FJV zd(qRpi}fgr^d)D~&z3Wr1#H;XKe9ggC+gib4D(g%CZVyrUQM6~uQMp3pzl#~-de>_ zC-k@V8E|Slf78W16Bid~*9(z86lhQD=d7@Upslk#+JaS9VSjuCv#f_GSB4yf zt;5oakZG4m*O|QqDpR|(f|b^^J}3`u7sb}6enx93obB(ZP{t@$%uY1yw?QK}NiA1G zbOj4bZx%YhfhuaW8nrDm* zLH7u|MLc;klmL)h{~BXqHZhHC6-Zty`yI3M(#XjwkKB_x!LYffOyv7DglkRX3co4@ z75>##_ZAvl(Y8u`z@61+!yZPXRr0s+Ojq5 z1GX!f=5fANe_}wtK?%?gz-Prxc2~Fj8nJ70jP@9E^8dft9Vn>Z9%P%@2W${XBgPQj zK-kXLy}j81BnR0ZWJUe#5E^;js1^=G$lCVFbv7^HpD zHo2j$E!hnfb~lU5QOa5?oTzp=ahznzgOJMhQSY0Zf3+njLg(ggj{resy{0T2c8f+T zHAB(eg&I-Yc_pj;Iv@OCv8STKsJ=xBYGO#L(oDolMazRXioS%ClDgVKp24gd#v-yZ z4P9Qz%>y;ygc>B~_M&MmvGrF?U6_eN9kDI27gsb&jKX6LTsA;ld!0C`0%xh)pB)D`)ZL$ochWm69kTo)y%RQN)H&j14OP<0e7L9*` zWhSGIxK2b%B^JR1_Eoe`LI)JRs>sq4Q}Vds~dOT{gFI(9^;o zegqj^g+^`+u5U&IpD^soJ)+`5hGPJCh>B)5hPBXN;2}0HPDa5lIp2}jVyV%&xG++X0;mMedbQ<<|!i7(#u1Uf|*6DSo3B9pzI>+F=rq&rJ%d>rfy!#&6 zG?{0E>FyiP!ok-gi#%*+?WV7nfHfAFT!1~v}w8k(N(BHqdI`|Ds@avbu z!DVZ}(Gi*)A(g!AscAKo%<5yu2THS~nfl6~vT_UZTJt)i8r30wHE@hq|AliRuD!4Z zc(=Is(Mf8Pr!15dFa!S_e=qx=;WWc-IVosL7MOmU@_E0|A2`j)1>9T@OxA8@JM_j; z^CW@LlAn=JPG(cw$)`BWFAZd~uoSz)h4szVwKwZoumDX!vcH>ZnNKmJ51fu^{Lq4K zmTy#rT{!CPcHc7l^t=WY0E0NR)cZ-CSe}oDlpRCCs;2p9W4Pc(;+lI;*W0TQFC5|!;hG?K!4pkC_1MeK|Jnly{=vi0K!Q5B$XSj2gj~`iut#MphgPTVkO}V^eot;(fS5SGsn-S zOyrL5h3D;^1$rv^dF~q+^EbO+x6K1I!tlWT;PzLu-2-!eOMh9!=FNKU`xap&L>o9> zu@7cJ-KKRWlIUy&;0?F6mIIEpzRgAUIe>1I2c2Srik(I+%b@X4rU5wkx?`baI% z%g@|ZtmX)^IK<#wP#=EcORkOz9D_6`%tEUOF3_aRFwPuy?qEFi!bHdS*kPx9?lSVFp6|`& z5e-28$N`*ZhTXeXGz`Y3m7PWn!^#?lRWl6p`|4t9&wo!0=9JxxdeXuEuN<&A0&2Py zL>$VA(4^AsSFxBSa(Lp;hNX?xnUZyrUV+$Oeg!MssfvrHM!jv$<UfmMQf+E2TG z#3SIB5Pv1dMb=&R)4yp9!}FHy8$lrpq0Rp2~`T7C}Bz5 z!EAy|Dzh0KnX-)&+W}grqjH%1h}#FS539CsWJ0aV!k8ApH%5^&$%9>zrUM{W9FoLA zI*}8Qb#uoV_iyG-kC_e#7E?iJ&WjhEkin7%h$Ps6r|j^fM?xYuVV-(@%cMCP(L)!T z=6@`TLl;N>Kv5Uz0UxuE*TF}qev;r3BF4wC_lyqByrLATDlR1%pSlslbg`dQf3lgX znJNXiD<6vlLQMxsX}sJE3S=IbF_qk(pp`4+3_-wkpqN*>n5(LJY*IExGyo-Z%i|wA z%j3B@;GQN-g&kHN)59JSWl|y)#wo*D=6`9!3#Qg!loiYhTj0NoMW%-!eLRyFCH(MY z@gt^H6$1yunut*f%k{Q=XqE&M6!n;30#<@WwrvMV<-oz=gZt9?s3&+PkTer9!DM;> z=7Cj{-lbr{j(|2WeJXKRcOR5-L+>~#@6mKLDQzwyd8XhLQx4Hd;Zcwt4sdM>6+ zGFn)(f)lLpGp@vLvJ%f~R${*Rq_*lU-K_iIG7i`QyWt*NSaC*Fzb@w2YaFn@Xj97# zamO(R(YGFB*LF_PM946RlEJQcHGfrPHYF)-ckd9HWiVUR3gat{d70)ON{}<>f}Srp z%SaMC?cp8>6&SB^=S3ewPIuP$`NyUHcLd6v122=mo!%x`TvKUPe()O}N+2@`E1qJVq}lG?D|w_~2z5iG;DlK4+$DBG!1YTgiGN)<(fDK3 z`)FmOVJ`(K`B6A|4-XzMS&85Le^b?t?-iW&i|thm!Rp?TCM%A$Tb zo_#mYe(S>B6u@?HN-W7pcqdVU{%=tNRsECn8_sD+y`*Rcjs z54~(IXrXVDRoo;`a=W|+MO}^uh!vAOegjos^tc7pUG#XFKoMpe>DS-V$5S|f+9O0# z+4gBWa&d^aWv<4ER<~K4t4lQ$ui!Lul9`ey9zH*9TY$?WTrRknjdEC8}#^@F#9OmzJtsf=4!JCd%nJR;e^1f%!} zcowIS&%^6ne{ck3WiUof141O>?(-g}{lXQ0)Vx7KK7X~*Dg**Yv_dg@(XoK1`laSA zu(f$d6O!t=ifDKw{8s%!B#x#F%@hpM{QXmmXMm9C2DP!s_DAju1Rg#Qfn?QwTYG-XZne-6Mq_N0W+pMZu%aM8 zaN7g3E5x>Gzb;QRsOt4MSHY4${08)6j* zX-JXiw>hJ}{EiZCK?D6Ymyf(qwo~(~6kNh&5dZ?SGP{3$;3ok!2T%Uhfp)t)9$a4I zNWc`M@)PjY^lz0q>HN1g+aOzKJfeR-0-Fd?Fxf!f5uy}Y`H|dWvHu}ccQ@IX*+ok*97e#ybzQ^NL?`=IX#B}In;z0Y)i~Oe^fb!EY zpDWBZVO(@&cY^d9;kT{Ge$}lvBNNQn){+je0uHAYpRX1Ds<8&*=hQWoc#ip_<2NNn zw^&5Ub1*K|kJh-@pdkS7xY2?(G`3?vlGLt2ODVc=v!voXO0fwT-0F zQ{5%k-b9MlNCgKO1(pi=d zZWGap-iZx_B^T>9%h2nebSA^=7MP2pazi6(V-ju&007)Nhxfb+=5hcri-mn}zhAN7 zwxyx*j!@W33W{^;-(%u_Io*Br(U@tvg7jh(~w7l=Kv`3f4{@OJCn zn~fb0`4K!Wfx;_%57-UB9TBn|shDI~;LAEggBL7EbcCL-|pEUR2x`(#0odbcF`?W{^r( zolp)R9>=G2^zmrY!#$i#mKBr^Ny!tuz{EtyTWJMHf&OY!C^*3MEpS_T=(!#rEGryk%8YsIR;2B z#0rS|R4XxrxGe2xfTHf1W(h@gq^rPSm6ERXE~3hRqat_)It)RF#Z%IPLfCeZtXM!W zwk85;h^mc)OZrJv5m^jwIK?1z81y8zAT{yD;%)Q+hXOIufFOP4g+cXT5~Hh}Wcqre z^r%pTuQeEA#cOS3YmEY^|3Npyh;!ZK0e$bcIrH@Q-JvOM9fybb-Q$8-%=jQEy60GdWXPLg*} zQ&qS^u>ajXtS1p~122YeKP> z3=`Li6<~uT#fO_1$yq{M)#<}AN32PMrrsFjjYWMASYY(*qj^)P2r@yM+#$S!fycl) zvrr(cB9p6~1UZpYHw+eoXv_Zhp{gVjjy7*Z!XI7GP~+F^od8a=*9TR6Y_g`6mPN6D zNk9^@vc$H{?J7khpP0Ul6%5==?#2AjjK4$G%C5nl4vTePgg4dh3T7J^ad*^$W39wd z#_bA+A(!hVg%phziZVR|fPz6&boRTDP{`Y5-jZbEoed|a=#J356Lkr4UaUQgBCL(f zav`;sR}qc@Bqn}4)ltk=X1m!0U9U@jC=Bc>u*Q3mP`!y&D{#67^k=BBihS-dlue*} zk%b4P2nBvy(dF#6fx`vM3Sz}H9@PVYf|Q})9z7Zf+^o19NF2M!dcSh0pxn2?()<7O z(dCynP=yTzm##tlW**~w*zTXSh5*DzLg1H)?!w>CoYThyA?|U{1sa3EjpY}Aqi*HJ zC^u8VJyeXeXu?U$lnHNXClKd4GC6SJ*clv}7TL41D=Kt^fV1~}NW`28nE8-VXD99{ zNBJEvw$VpEdVl#FuW>23XcRrBqRL>5lHTk~u@Ya=?&IRO3v7AB#byy9W+EiVSi~K{ z^^b)0z5(N{m*JqAw)0&T6;l9z819hR!owiilycw}JvfNVj)(#?Vad-;oKj9_qq8O^Lba4QX4gRX0=uRK3lQNN_SEqqqm&cu>D5gC{1TVN zkp^TSEN!yWTIb=)g0c;hQIfxa)spak6qy8RQXkmLE^@zcmr0TaEPn!{Jt!PuCoVR3 zWmck~7m#>K$bicN?$qfwz<_9QNmOrDiHq7PWu=5g@13G zt@}-=lo8Kr5gtRl75*SaiSj3t2uw`}(U5wk;MG8@!;<0@FpQW2RKpCfqt8fvFNB(V zbf=;arQDJvMu-&87QV~({wcu>`C^yd=6<813cApKLXO0(T z0@YTvUE>tG0aJ{c0)Ey#XCf~$Atog+#6Mnop1G>%Y9PA%On-=GOs2OA8>JW%5rQUo+xwX$`saCt! zX+NWf1;k_wRhfYqlnU{*bRg(mzpqIoOS^T~quAcbY!yVZ<>bkCW6***Tfr6pR*d5* z$b0vg2hZt~pntcL6wFR^{}p1#STKKARaTg*^eQ1~quaVl?}ECme3^+`*qRXsN$9R4 z2$Wm0{N2fz!B&S~qS#Nk#?+|^-T(A|rYWTDTC6K%P~tM4AA2aQS0cX(tSy--i8jjk z*yOQpw~t!+Z~h>=6%5FnuT(DBmW?6YovC4!B5`wfGk@f)Kg)PlSW@Nwz2>b^iPy~$ zsQ^s0Fv`5@=gHLlh+Dug3R8d1pj|A0AHV|J%ZMH694N0~1HlCC)X-tf!P2^)H!%4ga!?)C4SjneU=vtU$~3FJ|BsCc4lnD8 z1|APZ-3`aD>4*j-Yw!&BL-Evd$b6P4G4gbw>kAeBCJAlpM@hrGa_TG6EVvzP!sIm0 z5x+0zx+s^wl?Fr;<%B1mc=E-craJWnNF`0|`igUx7M2Dc2pAlaaTGreMwdL61|kEu zoeP&?mIhgWpOy-xR*`r{!neRk@NUx34EkXDmg=oNjgontrJUF0( zP~G-|M6jqrB*on(QNxbVDi7#F67>yO>&@=(?>E)~aec`!`sbbQoIM<5BMIyS-6oh@D5enW z>jkUg%MW%PQr`c zighpw_wI!i-ae1*waN9hTq|5wj_HKG zF4{dpZ6kvOychDY$-5+sqfo^=sX_wQcaHU1+*p*@_98LYFx`lkPc`;%Y4Kuyz%^Ds zfL0R<=s;x+<<+~<<>V5>9sHTn(RYeJn|ihZ&`Avvu-qcgO9YX zzuz3{1qK-*;lQbq&RjH(zDC$&tS7t~qLAYeG|AeBx4gybvA`=%yK#b;j~L{N0f1Np z=bU!`&uxOx8fVUR!G8}B*YIA;JU1tU-Bdt5!dMlkpbz%o?u`$3f_QtwIzUFrqSoWN zqNmb2*b>1x3vhwgNDo`FsY4<}S1|e9K&@~g0}F1_~S4u3V85Rpr*H|Vt8885uvc=h@X{=a+peCy5DcBba(H22l8B62m7 zQRD5bjzKcD0gr((SiCTrK~@i4O$qnFQ(LI4iq!)-g4?A)Ohw^*#67vHLcgC@)ikw9 zuv#6A$zLP727gpxSZWb6MQ9s2gq^`L;lM*8Z-uj5b-fo2n^!@ZeqB?-b+V3ajgUGt zgEKemt(?BnSQnVpH8?PQ_ZYh=gXF~#0rdU_>18G<=ixc?W8W9~eYv#h4#T8NaY2L` zYKaG{3>S}E3M1)W!{vk8D%&jx)M1|$>8Jn%;}|&QEq{ASp<90(Z`-rVZEM69k}iDh z_jcs9*U2yqL19MiEC(CO%LtRw4qo@acS)KNLl$qTx?TS z9<0-Bg@45Z5?UWBzMZmxqGf7fqzh{nHnWq9DO|qTwxQM()}S_F>X^@ny=>oLrjCY%JT|)-20!JJLim0-4&RRL4^QEo1BD7 z@%&CiWW@AVRYbOXh})N~%v6}@K~UlcESW-Di&`OUs?A?}6>^6}nlMctj1wil6Gpel z?AIPDD&OY#SK^6O@M5@s2{Xnt^Gq~9xVWS#Rn4u<)8n(HEZ?`ngu8Co71bul*Yb9G zFas8srOIzaKjH89axjlwm&u(5A%CkuH)7TKIWU3%X`af>$)NA|fydmbAg4B(kznz{ zcnymSi2iB&BCIV>XiPtNl#Xqx$S5EW#bfxfBpIJ)$G0@%p7<@`;AwPY-v7f)xvj=`*RE5|L}M` zx3IMI_JaB-*SBESIr9}Dprjaemf0yR_QQGZSYiUxvz>SChjZ%$Ife@6Z!nF<^ z1ua8U(}b^g-@eh5PS!Bofq#QIdPwXC|NoI^LzSW1X{SR!uce>kP!qGTQMr{FV5vHn zvmYR1j*>`oLK;@D$wogk4FUp_7uvC_={>pcCG4g=1uG3r|wXsKf^?IhaE4fQ4{{JAYJvb}6+N3&RcO zB$@$Ri#D}xDvvb?xR<4QSd`;mxNNmUlN4CViuRQ&FSF5sA1~(!y=@>*7CBz|cJTtZ z#=m6^x0?*_ynh8vHOQ*k1*YyT4zPtpxPyH>ZQ=hh*-gnL4JYK<+*n#zB4$2V(qfuV zgC6{`GFnyLUVes)Uw<*dSzm?E6bVR*auV<*aQyh#Ulk|4ZC(gb=LK$s;uKtHl!li? zfr~SX0$F2#Dpqk?txd|whJL3ImjM{^?oIfJyi9)cn?K5O3go0B@qNX~ORmm0XRHZMrOmLx5 z@YL6PqCCAhdx$_CNUl`Bm zqgF5W3}|Tdp$PHg35o1u4*!(}L2xs5gdBw{jEc%Ifq(KOa8+7}GPv#b{L)IJ(Hia- zz8q*zma9e^p^JQ1-THwR4tZ;E2YGxU{<@z-#3*yttjYq&zdZ>!>hVdExu z40mt0wamM7!-F+hTqwp2!0STNh{m#-nB;Z~4!dw4{`z%@UC|&MGDc5+whu`CJ8K@IsTQ0PhgbHq%PvQu=tCf zkzjKWSSDXd5?Tk;=`~g%2n_TJ(rw%ULtwyKxqC;CF)aLi5$5eJt#Qci9Bk4T^&nZ) zaOMwg+XIg3c+fp#c(Ddz&p>!L_(=1_VI<|pozCpDywlK%z*1#A_&iH4-M=cf15LVY z#eZca#Yf8)94!Cb?s2BL!ILvdR&quv4i_qTH{*u@Hh6ox1Uy6Aa9uW{XNz8)$mNTY z$JKB8X04fX0kq1l!v*2HIv%hsxW#D6)?P7c}=%;)SpICCQ6&n=-3y<)$bHxnSP z!exL1Al5Ke4@NK#P(3&2MZqCO2Iw4x39ayKChHJ~6hu)zXQERQr-$qV_y>h9F2i8H`^eM*&JQa+nUV#;3H2d9K+d6#h1VmH=AfjvK5Ij zv~@8ASz`Roisf#^FqZ=bT;o4L7k`A5e*1meYhu& z@Ytt;8)Gx#x(HQxAABHPqMDEYw)hxfdd$RX60R3{7!HRk6=ENea*6>B`E%G=c(bwj zb1RB*u}4=O#plG=-SuB~;SN5Kt_RQV`8G_IBMWryWxY{9(5=Rh5a>iU#_f#M|j^o5_|*dD!Z z+_QIE@Alrs>0c$o@^X89y*M;yB4dh%bv^$2JQ=v1f9$PpC*N0-@6R{3p95Ys`u;ij z{%-5duf-ZplKP*c{G@rCNq+%_N&h|R9ZP?;wHYVaPI3n=Z=B>Zsef0h{EP$;{n1NkHWTG_yWx;rj(tn{$x8^@4o!%J0 zaimv6I7@|avO?eEa@-k70EcuB7_K(C2#F|&zxFC8@&yhp0mw2P21`rdXfnecQqBGq zQGCeKm0p^Eku(%|9dMiSFl6#%My(%D-D3$HZFnf!*BfJ5$!ta_)zF6l2A-y^{oPZyrjS7--gof*R_J~rm?_kdxOu+kt>l)vgxh+qJWn$2-2Xg7sY=3gas zQfEm16R>lWFCl-^^dKw*2J^8}J`9Cx4mtDPT<1u;epJvUG=Gt|hL0w%UF3b%!<#Y@ zf+V1NDxv^J98g1uZ=#XvOi4q4exx&fvix3tfFY-qCI&2kR_fqOmuQL>@@p2ECGfq4 z-em$rD^5T1xuDF^4R1?C3`Tw*h(oYj5NXp6-Vr8D9n1I5Hp@R^_#dwUgtby zg~))naKeM3pnr>scx>wcA^?YN8pgBKh1<%Vcy3_Y{bB$=O>w^eKshitLjHa&B42aE z`~@zU{QE0_$nYP|&f^vw-oN}wBquWMtckxj*I>Ny4X zINZhQCR&`hQ%JqDf%3pNvMjI)b^3{iCu>lApNT#T;|?4zJHk>+THIM6ZqnDXuEn0Q zoQ~=YyJnwaG~(~Mb?Nib7|UiG%qI-N4-3iM27fb7B==0lRz74qwD|S*5mI$=LpVjH zGmmFJ!hwE%UhvW8;a4#1&!5N{*lf-`p{jvN5ARBPgqys!Mr&@bYivSO|0j#=hjLR! z_ixJZPc+3N2_yq1Yu9fWlZBnFHybY?i;t2(%`<{7rx8a3K*|@ZJFnMENqd0Qhp4uY zc7JXC{rVduCPLaC{EOhU$qfr9PR$Hx2ksz%Cw>HJCpJ}@e`9k84DwyMF}i)qY0|to zbL&lA8{x`wUePzZ;vI)IB?b^0S7`azJsH3-B0_(hqJ4e=CGl?{)1TGE=NLrt>tc2c zQYe3(;txQE(k-xP)peO2Tlrjke79+Xw12O=nV=tIxxkXJ+PkHLIeWKs0P-O3o>rs- zJrC(%i4mPCllV;O*_m=?XUfSflv;KWVF@KCNS7zbS@X$+)E~0t=mhDamid$BlO8@f z&*1dtJf}B^haJh1hRKG)6WuZdHQ?3ZnVux~c!GHjPsbepo($-173PG|0O>Nzw>U1f4D7s+RX?F| z$EQN@B`Y?gJwmitFymynJ%0=Z{O6PO;YDqZw0wI+YBS_x8r5J$sltmiU36fD_U5nH zg7}F!XgT+rTCIAH=v7sYK=Z>|q?=P1IQy!LF{ak;PJ8dQ7AoQz!~YK56GHUAH2>X! z=`qX_)Q2MRxJt=Lq|EM6qHQ`vSf#@f(OTYY;%?J9z%ItW2(V0(C4VlG7b=m;v8P$_ zPdmvaydVInG~z9HTfz{0D)(Gbjni}Mu6}t4^nyYc0U(1N3;QK^7k@Qs-)PrcH~0h{ zbf&ui?jeZc2@-FbcoYsBE5Fng1u0WR5lX23jSPZmks~UxqX~?XCfzsNn}a-+$|`7` zciMiYcA2t&puUh{f`4eu6?1=gwbyBOm>p;92NZKnjynt5P35rT{Ys>(xOb~o|HJGE`7Y{ubjn@m>172>$vZ%oF+*>B}O zECRhJ5XsF!CAB=cKKXmr$iDp%FJ?qX1>N-Z^=0eHlTV*MEq{Fa4zV9kpFD*HBC|BU z&Aug)O3@Y!I&7MP&6wpE9J^rnwKTKTc=l~}^dpewL6+#1;20R!2y89;zKsx(r?>tz zugnYH9o{yc9f2E7&zPc%K<7#YtkAo-Ek*|heSo}&LElX-b!5CQIq-W>PZn?ZVqOQm zV_G)XQNHkkY<~e4(+lbw|t1A#Q{0eh|=J98cJNjWXt z$SwtG9XdT+`0xaBb#`cOeYU%SoOV)Z6$KUN)N>Zq)LI1I)DGn;eN3rKXAQxEdwal+vn=xebx~3a5*bd*^ z>|&9_X@B*bo6qjvnA>k54DtdI zCV$+m1X(MsV{@cwtHWC0wzBk+LQCx9)!G-b%oXuM)xf2!h{?^d%imzaFK1{T(n1Be z15OIefj;xfEd0zBLLY$}QBN!$w)40iUC}eLU@3z0!EB93FcNW$=aGS(=0f1a0%7)O zzhEoIy?S-qIDm~C4cH*soxo=b2xna|K!1#~QXUgVRWhq(f}COSMxPkWnguDEfEt=0 z%nUa?aiEhf0u-?~I`??HGz@ef{>XkpxXsXsig|JV>?ST5fLKYnRrF;c=JumbYEW&H|ky{0&ECL)%DUnM?v3mxJ;lpVu z;KcTu1cfcQLq^pRK7&$V10JYNb$duRu&s+1qX}*d&*^s_v(S+mF=e9j+XKG`H!`Kf znCxp;5*3e{lC^B_cxdkKxp!7X4u2OMe+4SII~>nJ-iaa|yPfkDjbHJ71C7cUE@z#V zKpWC-3H1tsYylkf)UDE&n#6Oy@MiHqsjQsOwfQI?P2Vg9ACbMK;6DIMf z<5H9;57R7bi8tXIUD!|rn;$S7)CraiTM;UPAMtNw*Ggm`8UxYH3-&>Fn$T;S#I0xO z?#!ww7?1|an_*`lCTLLs0ew9P;5A!#U&xw#BVK=A7J9z*{FMa$@xrtX(TCcG(33Fk z2S-6N^FvK8qSfeiT#;+^_kV)+p0EJ+X204!h zECCSzK7zyUEqtqvsigtQ0dnFGH$-oBOBgAhpz`SZ74LpXI00X0?n>@Cq0%SnMZbPU z`0DWF<2jLajDNiYFr{emiN!giXqrH-;uhM&@fioC=Mp*Lb@L2X^E_*Ci7pgqtJzR9 zDyAUf_s`_chN5_Y3yhRWMl6UFI54AxljSDNyv{tTz@P7wt&|Ah8FVMEAgWE}PZ&RNy zcl^{qh+++HuwivYW3VQmjJYV_UiAP@XO!3D_-y}!=DQ(r!C~a=4~Z0dL8Jf=8D7%t zrhVp8h3Y+9BUgZ^Dv~ScDhkq&vp^r^zNT@lStG!*-U#kL=N}0ziu#jBRF$-zCXbM8gdE}^%8^E}$8?J0Y zJ=cf~2OD$w{gFL}70eqOPR`;Y<{`U13H>VEQc}v1_gYX$RFP}(7A)p}Vf;IMdOV%8CQQ^vT3t#{Z}KIV6swPjl@8~eJ3i; z(bUp$F!<4{fq^g3&jM-_L zNoyJX*4$B762*3_Xu2szmy`?LqmJW)9?kYG@KZW0P*UTW) z3Sw#Taku$oX))+>qzZ}30-;CfNmr3{I>*MDPM4L!fgqb`4y~p8WcG6DF(84yeqDmX zzWW5cXN=7=ob5fiCm}(ZK_G}90KvTg z*e2Pz{4tjzxCSbJ)`gwU5y4Cp%B5RRbm2ja0>d(_Qf3POqcZF!r9`gR66lNk5$3HF zzKENM-V+F{3|mwfJJF;pmA1R0sKV_C{W;QJBPK(e{*|1!yAdL$iSw%)g0+LH^R3t!X;Gu5KNk+faLkSbq#u-lwdJqKWa8ogh@@;QF)4^8(@d<6HIzsv?>&Z(20?&886fxo!ji)9U;116%X+On zoZ$`tD9MgH)m65LJDvILv(G+zuN9C`4u2!81YkIhS|^7T-rr%vLi$CycmV?u&tUEH zsEaSj>VCR+W-WCj9jbsYW9i);ce7;M^BYh0YcM@7}#ZtSO>`sJ^{vmdLNfCdth^+s#1N##TjsuYG!|C zV87se%;vnb`WbuyC0dtfixewH@wI=}+TM*fWxt(S9iqy1)_N4*JZ_)UD41sS1@Mf- z=P(!O+EnL|=Qd_BtIFaEvxvHBr6fB~B|WZw-A+EQ?c}rA$zHdbzAiuZE_aDAYW4Pd zim*`CyJ{t}mGiS8sj+{&tg-)9o1%YmF^_}C@}kR_%g|?M@e~H#Q?-ts+gim1PS(St z)>Bx3rXZ@kSvzX%z(r;6JT7*Rx?d3Yx^YO8z#&Znhm7Gx5Uc>8t3sSdTYplT$X3v3^3llE|>P+7c1@hOCk-vU-DQ7U^ zd?&jEKT!JBhVvoy2q+Z0XEc3eV>?;$p80q^7MDT31{OIZ^V{=BZYS1fx{8H|!*2U$ z@;2JTcLQ3I?HOEj`~e*VPdNp`Br~Q2q7l|i9w}xoop-dcxNy8gmyo^&7k|2LcL@Eo zEWQTL#CJM<1hJ?Xt+#WMu!)RA$tn&Q#@Q_PIWA7(y< z10H?3%<(ueQzACdY@Mm=2!G>6GMlF%Gh4(6VmUoxgfLO9HZf)i%bhCaA!WooEOJp* z&z6$)7RNsZbQoL?>fwnBq%3AABXq?gLz$SWlOXnBAS+v>QsZN^Na3tP31Hl52Y1x8 zmYCGw4Nxpe3ejFFX3`x*Q%Wu+!$=oX$*X5*>^wbAfMLgw-I66?g@4G1Ey{Sb{&(hC z|Ho*k=tG9>Z>Kb5l54=oX6FOxrDMRiX4xLMBZmY!Xl8_WuNX|QZDBR3s&Zmh3$=#b zoW8FGa~jqy4pstqXOQ$QL_+12@P%tBr|_ymRTxXs!kG~S9=^k3S%#SM)pnp(vd_x&Oe?^r7c8N zlAs6r^!`Umstyzn%Jy;AA;a+sYu50E_;7%o4ee~4E`Pv0(j6v=KxP)xgO)ovUexP`QMqi9cDOIGF5GC}rvC0!tC$;h* zz(Z{{s)k)yu30Dv0WjsHH8@^pkLfyF1pEoaQmU2+d;uEI0a)(D!7}(|1=hFO;^NP& zgkU>D;7tLjM%{mDB+ufryhQNsfd>=|gH7mEgRN!}@Y=DjtDQ>da80z%1P>4ToguuCj+4~ajrhL2iLM`85n zK@4vpYHNKr4y%NNixt@IpA?>*;)6Sxb71pY3kO8-E6sl@QQ-OVLKcgNQfT==iGwIb zhmh10?|wQEGtdkh`#c`I=X$b_DZA7N)e)AZG_G-PJrox9;;M9&@J*6E0g6yelrY9{%<)FL zMP<70c6*I%T#mA_2w$ntc=|c290{t>?~M`{P+5O!!CfN}x+A!$n6FjiZ2#<`p26X4 zb2rFHI3?Y;#pG^MH+cyn#EY+dRrM_yNAHNEw-?|r(#E;W8VBdasLOq;51>A){#jfU zK!8+U%4G?*n;$)*(Am(vVhdr4_=HY+Sl%f$24qzx@YbWOZS`bEBc6$aX~`K)q!uBq zKw*DE+Ci)OER@IJTf8m1Xv~2W6Y*6=hSq^K^k0112$y0#ZS32R!*@W{ z&JP_^pBwn5a9>EX!`yR6KnU9=^|!P2#BJ-SbZhLl;vV{x9T^s2T}DK3)b+dbp+nWF z^o6y-nRySSN_KtiGjKrW-%R6ZKI0Ih6mQj!|Ibf;s=YiQQ3WE(?S2LynC2ak3?rmq-0C^BUTprIa2pidVSOB%*Zy-67A&Iab0MW=GfdlTKJsczQ*g)Q}qcgx@ zm9_=^vrJ>H!_ASnB0j{BfcT+9`!($1PXW~a^9~64NgErv^y+5D@ed^BQjm*R4;d6M zrj&J3bm`rnvb%_-lDqG+y9RN*`X+z7J20{@1)0Gb$sTfEbX-&%g)NU(=RxWuYcx`vtCJ`vr4_{pz;Ci^vX z`GU4Q+=2Tt3#)Jy!4`;tLZm#vz4YMQN7NbYpZfFA^c?KuD6lBO4CrnZbey+NCMpl! zk?3E!Gs-*$*<+;P1Nf)tYjpny{<5Jn!`9damu|)eO9x(#H0~3*H6IFa?W51E?D9y9Zxv|Gx3yZ6De;T#S4%tF<*=w}m{4 zLFY;7`!E~E-u+pr-9jA}BnFWkQxZu)Ux}zsVCyo0W`uum7^bOz@$(7S(@!Kp|fDyZExnI_?qc~V+qjGY5l!6d>Gy*iGbvT~3r zAjD*eu$tqTBMmu8Th4mZR|bg!n5=ic_7j6!qq>FwHhSHJWE#U%CR%bTP@Hn{Wo*&b%__?GzeI^dS3LBS_Mg>{R%cKr4@g~PLsfrN-)Sj zuw-yTOag`+;4V;ORZJvxqPM1N{pxwni7c~;_^KXazAc|UTkbQNbe7xdaTXnqC~8BP zZV2zOp5cmkXe2!LGWu8Avzze>qd(MMv3p`~Lu7<|H+KN)#5sY%?>oe_lL>GIb!xuI4t*SXBsCh0oQZ$?SGSh_ps<2=HE;+!e=#wFoOs z+DIS4b+h+c@H(rOf-o2*fD&`S1hj}$Df8Ca{_fu=f4|!Q=ijf^;STHw@B^H>6F=Ax z;0I5pdz+gP1CB})b3$JMdbzV#jT7L)MjmAqp^AkTS}msG)BruSPJb-{~nWTMp^%A zG%uK62)-WlJ4;EI7Ise9W`QR3r-?UrpL%G8NfBT`aUF?Mp> z7^uUPN9;eK_$#~GzzI8{i7S8yf{#u2#;N{PL0DD|erB~_H1WBT$M_nY8A4MMTvPI1 z!nhZAuH$vD#_br^{P+O*ZD(Y6!wUAfF~eSj%yUe-IWl@S#w3}ud!UwG<2_(xz*l6S zPjGYlbn`1f@WU;TKWDJp4e^dC?ANUmp^3X_w%50A5O0Iu{pMhOYjT=#Xu=X~t0agp zoO{laAi^^U(0a~0=eGgi{QDp8IN|LU28R9ck>X&#@0VZ71{)4{tb^6FXQmL>+8s*z zua}6*1|xr6-vrq`ic0wMa^5}_L-t0&ilQP?EU$wg9+ftVA5fyElqi9bw}QPl&^OP} z#Y|Pc>vsvDy?q}SgZPQ}OETONv6VEf0-cAvi#k_$vqg9;GpF>U$L8`ddIfay06U%@ zc$imCdfXY_c|D#EsQ;%g`Mn}>SHz%iy}AnI`{f9&Wv%;3Z_*W)GRp=ye|CaILc;A-VzN_;IL}OY?-RcB=?N z7I2vrm^*CJJp0#7nknedCcntEsTdDXA@4DnlpD+^lc3k+)L(NrQuq9ZT^^s+tt6>n11)K8PlD?1l~2jf5|b8K+(Z9AzkZ+ zbqC}6rfU3lFt8_84<`CWvvSl=^sDNJ|9@nE@W}3Es`N*X>_UwWQiJ>OeL=A?EU%w0 zttoLBOw3$_+GEaGD3+KiGgtTVv5r&pw z)9SHlr`^1m!4}CVerjeZb()eX~o;k>TsjWD}Ag=umve6=eLSl)_{^2s0nyq{15i;vy1Jnv2Oo3=873K*3D8-3n>r6XY zXKLQ$gu_7@!>#Ev0eLg$MJ}R?--JIasFaAy2fW9sSeEJ)uJ~Hz3Riq7bOa+-g7$C$ z?V%6vBhwx(p5Xt@&FDD&0ZYF5;;423$ebeWwy*sYM4+UuZ{QYks%^K`IWfV9vTX#o z*(Gdtf7wB&%kzhYyN;sPM-o@vDV0F24#}1|Pug%ujixg3f_d74d;5Ho5!@h2Y9{rA?pD%~-lptoe$-Bp z8W?D06Y-%FqqcoY2L+XLCU~dRo9IXF$xl@-7iqmp7*uvz3D5uSI|0UFh^68C-)vJJ(MbL2>MyG-yK6Nx0*vAYW4Z}hxg-ek{2(G!+vh3P&Glh9}=n`^>= z0$#5S5`;dk+#Ng{UiX2`)Y{%(fDJj9e?UXV0|pCd{@iz{%=CAcxH|vtcIz6hg*b&6 zTyK%;XG;G&!L=dThCM-qJogIM*fHI4H}RuV4Qrt>u;RrNh8!FAWD7j3jEmoWFeX~& z&3o*c6HcY%s|~nHt>68AeGd+(m6*$svfowi7$6h4Wr4b5@wTM1qoSX1+(iz=e>sj$ z1A;mi0l3%N`-8xY2U;a{-3%_6@bDuABz9BvbI(}EvZ=RQ?edy=?WJxLz)1NuZI-N; zF%>SuL7mJ}?GB&7L8Jelozyy~f3KX$nW0Z5Ndm8FxUV3y%GeKr`vb!>HDkB>Oje* z(rA<3U}E0>@FB*aW`rE&fyA@j-2F(;=(p_w$&#fq`@+|ZIJmIF06a=|f2Gq1`E~*u z4;lU#sFy89xR2#~AJg_`4aTo@QSM;|VL>p@J2YyMWOEhn_2Lnz!}|Hvx36A=mmBDN zrMi}yJ}?0tLQP{+VwcZdy#-0&)4fi|No%}6{ICR3bUNnHFsdaVlLIl(N-5scu{O8n+v(Ai~i&##k_ZAe6+Je%K`nGx3F+!uj^Q;}_qr2ew~7 zOiR@$QJ`9_Vf*3hSFe9~%>fvKe`XlPcmTe}+xEjEY|o$*UdV z8AOxrIuviiGbu@mW1{7hgTvPB>u|uQ`2w0CQEQSf>8odJ18a(*JbcyW7B znvFpaq>~cf-KDva499c;N{}(c1xPfb5ggGB|FZ-11~u}lQZEk}W5TX)2T;n`^%L#- zK~2{?OyMB*Ro(}1*${?Ri4-tH=9+lg%Swb8tpf8WL|DF>e<0+xL!f|QAKGiizJ~FHq{0{CP z=;r`AX>)=ze;11ffrT*@AR%9lRpBsq`+2hi^XbI^y35t2(JwK!ouF}aOG(qBn>2We zJ9^_y=}@qk|271Jc<`4=@q zH&!a%T50G~fg*Lg|G-#RQ}#{+u_PKnf;CRgq=vJHe@CyrfBr4@O4GhnV;91?(H~C+ z|6pGNUt|Jh;th~kXH$e;INp7JTPS<9>wdm&ZFxx87Rc=sKfWFIt?#d(h*Adymm4(D zuurJW8K`3h#+v_G&nIUj?Q!iHE9Rr#JkYK9Gk&`NA&D6I}h*VuOve&J&H z@c7NMmq*_}J3c%+dhzW0?+Hhk-u&kIpM94UyS9)a_=_QOzqwdDA*?92LYsta8MQl` z+#$(@+~px$xJyVCxTp&{%&W;8iHvC6p3lxPe;~zr1$Y%pO*dW1w|>Jy;Pi=Ilv9<2 zFo?!)Nt9=A$7_CY77lTxZ5p=>;N3lGP8v9;RhUtREyf}hlan~UB@=B|Br0FNQ8&(5 zKD{v~t@-6k(@P4tFxA=u0tY84ouJ~>CbHdVPUe&?B$X6wVS?@IVhP|+QZNGmnv>GJ zf08AsC1qQjW?r~c$R3}*3L8z)AWTSMTB~F!#*0)N&Te6l>KYD{3mIKnR>D%>#fofk z$(Z<=Ji(o-aEEMRayQ^%K$8z)(8;GRa7w04+nHf2smtALV4~n*duQkUGeA->gjYi7 zwUSM*eG_7@i&!|m0*it*#o!77H4=uWf7%}kTexLQ@T3Ka2XHAMCv`#N$fYOPz5Iuj z&W^N80#~A?{)8>s4Qx_K%_&6{c4?&jG^kV`y08}E?Rdk|#3ww(0 z0!sw(?ZpJ~7DVh0O%S?w&`RCn0zFB^#sz>%Mk9dC z0R*5kLV$0y)6#zkX5Vpk4~p>hcxrLjiD=Pb|HJe6YVuSH0G_qk^yctgx5E<}irwAP zXy6gj+X);)p7)L*O@$vBFaOl-UjM+7$hjG&KvfgF3sbSFl~vywA?@~ke=9UGFhaY4 zspq%VE;<#KYM8?6XPo|p0)=;UXV|^ag-RLk8BB^1{#?cTvAxQ@M*$2Z8EB?~o-`>X z3i5oTi$Pj(e=`i*?kSFO&S%&{y7gL<=H|_C*6pbw>8!%|phOWXNM}lm3*_hyHbZUkLvxdME!vcKQ_}B5C4{8DI1*ST+jC;~ zoM8lqvM-7)4{zdNg}0N_og6S~QL=_1nZGB1k{_I;f>7qK5s~tPe-kt;$o#$My!pXN zf)$@QNBMiNd9yA_%y7dvO-8T>`p6(IJvMts<>-|oq~(WhGD<7J_)0_60ms}PnT>c4 zlqU{Y2DqUc>zI>_jkR0DQH3EKBRo0HSA!_EMlYUCdVX6GyiK*yzTg@B_Bx?XB@eju zVMTGoB;1hRnm!v2f5&gTLyH z83FnoRz5}qrAR7u{o(@KddbjV@E&+CF_h?yeBWM#Rn8U(e=We>>Nr`c5KvGkegG7K zy_bjkcB~l<(36OA87Bh`oJ1Fzt^~C@zU@lz)%F2T~oyhJKSg zG2tn56wci8cgr^0>fMXG`eW?# z=VGSL6cfegHB(wtjSBL=0FH=5asTBgc5CZ0kHI#Jw~6J)_Q($%pgJpYwttEfUbsHb z0ip`JTB3cp7N_f4+>g{~+rlX^A-u3^+ICGU{-`X29xF*{+8@t`7k};&uuJTpD#Hsq zw7fN;UlKw>rgv<&R+Pong80sKBE=2U1;GathVkd07x2Mc0G4vaa#92fN7)K07IUF0 zU9j(hO{9x+Cf%3Bk3@wED@`Jjx8plhimG1OiLZ#36W*zm%s$PE!Z|F`y1=Zbmnqx^ zCNcB?$3X{zwQgq%ab4XmBh66KrDK!ldX(>w8hf@=#F{?72GU%eiH|r$Hof2Z?0z4Y zfZPTn1e4wHXqTtl22KoVHwJa;ix2(!uWwX`mbP&M=AG(fWS;gKBWK~y^a``{Zto&Cd~=P^JI#yrtqz!EZq)9f`alzpc21l9 z^{rWI_eE%E`Mc!ZhF0!m*l3PV(+?Tri7(Y6D4NFNM4ID9bC{*VxXmPgO-&2DG4onj zLP=H|6rD6x&>UK#suIY&UF&TCXMAJOV3(-f1}=YneWoNYLeGK!&wsv!Sz!D&zl%^%lt3sOZd591TpP+n095oKl@AKjE#wSe zU{~$R`bO}z<4%P*)0kW0C@P;6u_$ zHs3sd`5j2?;vG9~p$M|k29gGtTV=3``0uyGHGVo9y@pTXU`m!*GEwwePn`q|fuet* z+3V<6{K!q}a|5o7`LLKWUBDZ-rD)M{2JD+FH5hK95%>oBPey=+3v( z=oYCP4NOAUD_7(jWE%vfHC4c+JEcY#rTEMtV{a1L=?H%d->3w&ItaS?IEevQy}MsG zbK$K#7vZ^NjCHj7ySvp{DIPW*r7M5`=YK;_0&0t|0N5ah_vr#0-vpr|-?m+VE-A>Y zkbEeFpWLdOCHlOJ4TT@4(=}Y#!=2+1a|DgW;1kkmeVs>)nbI2rR4BH0LH%aPQz^f#w zyKKUZP3rCP2qvc302SIOT11+~(YT>EWGy6{(%rs+-isf#IkVxsRUAppCSU5>2;i8x zc3{ro0JDN(!VWMwDIvFXb%uWzu~1jxUaB3#G^6fSVr-QVahg>)6uFXzXZY?eDHdHB z!~Bl>^|YJ9mep{`(?K0l`c@wXfhnaeod_0>5B=no3%Ov43rlW`4hB;3cz$(7N5V?O z=YGlWq_CK18=40N+ii(K*DiwhBM>E01ygh+BP?tZUO`Kt z7`5x>c)_|Eu(+nR>*jRfx*1`+Ot#7HVDXH`?25EyKCjz=y9lEhuouc4Ry8a%_ReMO zEms_yb2lI?$l*hX)v8Pam7VOJTk~8{X%iL#k9_-IqR(@Ie*J&u@ZkB;^H(ohJKg4& zdpF~wzy6sKL0H&-#xd@*b4*$E@B?_h_Qw|wehe@C_<)A$2j^J2N1&NyhTV&YrXY}W zvXB67qg5aLh)1=bW=ly;0m3`=shEQ!YAygsvMeEP3ut&~Fms*~7rZYXDM_zuml5J- zjOe%_sq0ni96x^|8*4ZC1p)~C!X1##=r1_O%P+a}sIey3fGKmt`;J8=U`M}tg$M-l z{_(fQD`tN~X6KJ!1)PEa5Zr&D{R874$o|Omhxcu7F>3wMe_pp9`Oki<-@&rI$$zi& zSlf4qw0#e6X0I5IXty2yACc98jbwna@BS4|yr%(dCokJC8|nXS#>QhmRl7>q`J@yf zp`l#&!}Ue*F|-XgoP{MguLVPaxruffm#xtjdB-m|F2Fr~xzQI>#vyw8s0FzRa|_}p8=XzC zO9S!rJd)ppZnZ=YTFvvVQR7+b4F4Xt4pa*OwaL5IGyk0_e>Ubyb$rx7SGwzm56sTy zG4g+R+W0bmP#y|j%1}Tv6%uG7fhH2z!4QAS$KB&ocZ^ycB-_%2Swm77qX>&@iedE;z-{fXRo{e0`uK59`rOdmy=QP)OjB%FT` z_*_Cm;VeOC59TpbMmZ}|w(gzZW^0F=<0S2)&0$QNUS4@4lrz~b6`x6dwShz*$3(x{ zK(dcbP+)bC3Weu*$|{BD^QwzdNNH-S{HR>zU$i`EBG^R}#kS5AfH=8aR0BW39ZD#G zO4H1@oh6%su}20=flv(_L-3C;es_P{J^AvKP7xb)l>+xRuNzk*}o2|#| znrru@jcM&ke9uqYo1RE}Q<4FGhdw@#o8ckAJ?$43cl!l^Q2SL##7?H(Gw?JP%K-(O zDBn{SvKdN-^U%CxxM7L%SE*!t-ydqp_)AO1Us|$?L~?0+MgWpY1fITQb4P#wGAa#W z6>6M_`Vh`cxhh*~?2XW+B>Vt17IO{v2#>nH1wvEQEZqFE;>E9$7YBSYm7fM_n0>zU zxZ?YrKUC$kQ?s+f?mb53v$$1nsEi8Jh>x)8JK>lI-tquWv%H z$?;N$K7}3`Vk-7eL%^A~{B!(PX@j-CU0mi*l*<7*MeDtM-I=F;TztdUVEGDghiqEv-l)*08E)cDF+hI%KA66W< z;~|_p;7bjAirOC`A9sWGihvT%8ocTpO7Nv?nJL*C4g-as(RlIcQMF=(NQ1}mW<`CE`im2a_3#d{PK6{%4o zdU6zmb-7X;hW9Mr)1X~fwDJY_d<$FoJcs>oAsSA?Dw}G8Ho$*BU!9)PqJM+6`VOP9 zBB7!rHLjE@Nm^K^(6J&}gPTsWa@7?Ja~!f$<~)8va$r-xTt6V2a+|kfYFKzQHLvia zFWpvfnV=ZnnAxB-`o4sX!0ZSxBG6ut1si9kF$p`4gsa|pkvu$ik1Mf zOpA@AQbyi3tATozE zAUP!O=yx``RrREmk zm?&U_aJ-YJnZL!P^{t{GTy;S)BO1+eq9L{Lyyy@&x1^ku_^MR@Vp-#R=6+#p1%O|r zC{7Q#f#ZK<5a=h#-Of5}kC>OG70<##u-HQ4LV9AL2Tv?n3)$61>pNi|2dJ#>zU=Tv z?RUHSV{ny_;5@D%!NJT(NN_L^VT|GrWSOW7Gt3p7WlJSIhyy_8YyCzKL#{D?(%WB~ zw)!YbZ+(}}KfqwbjUi6-=rofM*^j``yS3fm|4o1Y=X4KgpNoArO`J6)GN_&L&!BT) zH5uW*D?trQ-^F_)Ey)P0I14i(kuXS!$wnwe;;&FDJ|$T=%G_@C0@Rla#138U2BMVP z;@QDsfIBoXhC5J52UH*U;^rf>lJNnc%?4B^_}+pr;3P5ng}sAU&3m}3DBjYgQwN;UM=VVBbG7*PhM>({TZ289rkjmv<52H+x`QEZ zZz8bT9vo#KjKT*8=?A0Dv+%*Q*2y`{WCySZox-3iHZxoVs%*?=t}4$O$CVR`-yVPB z12_)&33WQw0n?Zbarh7De3`%{Ql`m-!p3p}`bT@exwG4Z?X}-Jxga6S1ya+++uS4L z0XaRcWz3EmmyNU2R&TGz`G{J>=rwNiI2G3}o3MEealvijnOvARATUmgs+im8Kuqc$ zgZ;wxI3Vybf|WFW@I;Vf1L~LXY>tjODons8IG?@@!4W)|Rd z6YRhQ00~y!F)kQARDQc)4+7{Y6nXv|77w_iY6v+((2AZ1!TuqW{uJnnW{Q*>*i+yy zU=ad7198)sec z35O(17?T_I$6~7`0?s6I5XV||!-h)(_;J?hF6%C?dh>!eFZ8A=86g`iRA~W5jXqph z08a@|9m#}iCrbeL*8Slwngf3Yf-_u8?{wf~9A6B&AiMY5AK-kE3s#)YNy~n{2k9J_RBiI%;r=P8RH0l%(s%k^#E63utT{cJH=ZgXWGG31&?~ zc$~;-V`(o)LKrKIxV>N@2aZ-lPIx7}cg}aw9y@`V*i#9{VyEEYF4BJ&u?eiLqPU=~ zyX)E`ykt#)3@YJ}Hq}FU+Krvy{7ve1&l4>L%Au}Acu0d z)PIU!{Ly>bS?6mMyB&Yk<#6|cK?ycE=mYO{oS}|5s%thbnoZ7P-80Gekkk;^PdoHw zRN-@j+0nx|AQ_jAGGC>?ON0T}p zVs8(}`nU&-+rp){f>;^GvL77EelS+JlU3Nkas`G&*3C}IHAc;veqXotGqG82(sa2o zZs3X=`*u?em>WP=)WXj~(WiAwjY@YIW2A^NLpXk+S4=yMAvo9E%mwT%}r?8j{!7pDaT|jH6_~6)Cy;?i&)8deO zp;PKG_X4R?2H+V$@}FO{AaN@nm0>@_BR~mUMx_~%%fY&Tsrp$oQ%zqBTfp=pP-)K zOx{~)uf#66z`P~Y5FF}PDdN7{anS0v8Z89h z?mYY|#M+?r(wd2R&IaMuqfJ;k*&Z07*l~XteI@KC;dsa7r~`IDp%IuLV9sC!Fjfb5 z2u^>F7Du1sUj%Z%{B(PPt3>a;3m7ZrtY1ozzr1|Fx*ubOh4!*rY7N2_a()uPt0CF? zDPNko-^+?1B<;SBPD&9q(6nd{z#k-*_H3!(2GknRO09J-yipKo^~&zaz-+9|wC{gC z-OVo^Z?FHJ|14;`WwXAn$Xc5R=j3x+$kyX{J}O;0ADuu4xE~1;JSl-NGS6Q_E*ch2 zZfr*weOgLD50<#43B|B!`B?HB7k~@Mve=kyUD&}$IL5J5!pBT!*<$kCX6bT`uu6+;HJBq`c&gvQD@e!Zn| zmWwrT2c8nra#hLQOXXwWmJ0;*fA>QexrES(2`a!P#4{He#5aSA4%}cu)ZMfVzzRTP!h$t$ zd|y?Qa4_M={ZfYDW-?j^@i*-c+gVhB03&AT)4~83`*Il^VAGEfU5HgM=zeQKb(ZR% zbp)phD)iE7DACslbVYZdqUC@15^Woim@k9N$yoKrS;R(T@824b1TEHmC#}n zRIF-fH+vV=V~vWqYDEa;`y{usepdm5nB&@(U(j}dHBg%O8wl|ns@i{q;Wnr;_=3cr z$`X;Kn>?|Wl@!Z3t@T^oh%(JF;|&05qodFvTqBq*O`0iI>guxqaa23XEa;vVlmgo6 zMUIT`$;vCAR1^Lnx1E zuW2E)`~ZK%cE&6;e&wr+^=m5f{U4{)4`_`95H38RbOtMd| zi3s3Hc{8OS+x5nb_a){f=rGekD6Yd z6|C%>`uE?(BjW|BE(a3ombe_|)7r3qFGqqEaHYfcdDpQ!SAhsse8~_{NA1Z^0W}Fd z!f{pt;RdO71dUuk6|nlU3evu)`kd)~Cmauoy(N${Gkx)9zjJ zQ3PIhPLFH>Ut(8x zpRD+%g$0wBN-&eRZ-_XbIS%XdFXERs_XaM1k8b>iYg*Rjp#eSPcq3+=Hu=5tjv2D& zUD()Q(x%s~(;0Vie;T|iZ4O+8Bk(uWI)@$#+MhR>Jk1QT1s;NBO%7q5r##vHOc#NB zns;l`!O$q5|76`-q39FQZ~rt&L8vV{YYpRmAlpy&tbzCas) zz^`y;qSSMB2+!4yd9KdfbM=CrtHGNDk$oH8%?TXU)^^~JxpA}E-Vr3WsU~ zX5k+=Ligkvu0QhovXZU9ykl~b9(Y*^ z7+Xrn14XY7U%sb6q0CuP{((}#p>NM5Oda1%KP;^m7?`y$n>3%nOW=NA=!!lA<}8>z z(a56Ug2rYF<`)qmOC%-8g70oHEN3f-xXkhwPtNMBDeqmGc##{8(iDupC3ggWQU4lr zopxn|PW0l^O8rOBs`Rs>g%f};H+r_&2z#2M|4C_wQ{`$>yXT>KqOsFJY~6j^D)YW1EW?DX&=mnOF)CKbzLLS{Rm^64;ST7AF*h6Qiae zA#@k&YxVB7SOAzROu@un9_Al^?DgH0!`)zP!|J|94QfmWg_7mRr8K6P_r$cx5 zC_-%>WMHJvIB09|MvoP5v<6Q!n9<9CqK60q3K?g`6@MXRw~ru)#||ZbdRYM_dR7S~ zdal*1f)Zu@6z1+(1|{l;-C5iI12COw+k#@BqH>9rO~~|jZv&tA5t{SYZRltmKWZeU z{}(p2F(FA=2Wj_%O2`X14g&-@-eC1#1n}CiL#_%iS45lI%B!tFZLfu+7%x|ox z0IIk&GJ*HIJLDF)WL$1~9wf9k=i{{#hhwV_DfOchCz-2>!)?Bs`7G5?zR(ULL z>cZsJK7tqgL2KmIK6-MnccdX@?+_Ds#Pl!WCm=Z-X_Xsivh-cLf00hUDBBNV^7<$x zz=l+D<;Ph0;AQ`;a*=0GRGPuh3M*H-9v13a)sH#9R&ea@EXErXUu%|{)E2+B~0x#RgH zh{G^lEyNc-z*~kd3>t>GvY-iB-2N2HjfO-DjdO9I=Fj1G5f&Z;Qs^#d& zTcMaQEeI)sZNSwopwr@xEHmzo33ez^F{xZ~beo15Od7C%g{bfU+1GUV$5M>)m|D6f zXE1x2I-OAbo^-Ll*ACKGIJeWc++ijv;%d<9MzDT4uY#gs`JzS>eQ%xCQS6nce;Ytr ztelY!B*`k|!{yKNDQ54$lu}NMtcgV_q74OCdv|!QXbN)#f&D}qPuqxF}l>9V4KoDmr5?Wti5RXO#EQth1m5BVVK+W**33 z4|F=F-(Yc0ud+Z4j{>o)wqOL=g$0Dz)i}EvCNDlXd;ap};hVD;&))p``ODT9dH9sO z_y^B)`kT`>_YM4O$U-Q#V0Vc>gWL#<1x>d3HDEMbd(Yd% zT;z?5Rw=rbx%Yoa$w*18igpg`hdR&)p;QQCM~vjBHbOV&q5^V^)o;{=sVkp~RZVBA zLNZ@}V_CBYKoi8tX$V?;5IoVVa>}59EDm|i<}MBZMDRpwqtJ?#g%cv3HL?~9k3FJI z>Jk)9SON%&&%dnz_uNgq_{k;aNTN6Zb!%U3vj0GC`zZg^5l=SQHkyZf2pdUNrIJM^Nm4#108uQ_O2yl;D^lZcfMq5vC}{3&P!( ze1EY4C=-CW5w1|g(%^$+D0_cqjgW}0`UWX2rL4@dPM$Fy)PeD;OP>s2+TcBW(hIe2 zftq+ol?Ac#VVu^wdL~)l7AC5zP&K($HOrh5lv_y5KOU@5B`I*6&<45@&JxBjWw*&kcF?cg#EEB(DrnoLw8HorV@8bWXz)OU(+9}UT}?T(`)KB)0sOxWqs zB+tqM!~UvX^7@GMRR)Y6e@0=jmgH^bPHNcdt+??fUsJImTK2f zVRb2|QD$vXXVE*ZPr=DTXf*5$VdAF-BpUn3iiJY4Ff0@cch8E2#>vyDub9N6VHDjf z5Sq+uK_b~;`(?e%b*LpeT0+fI-zA~#2i7}o;K%V; ztMyENG~X}ziz=^Vee`A0ElqUYcnez!blq?Z_*r&suYOe;E9uMj(&Mxwo(?~#PV*0; zWFhnP!|FW#7|M*Q|D`QsEojHSeC$ue-JT%Ky}jI$$ur^0%FA4k0fdUsJ@b_6L)&8L9D-skh8E`VIZj)Xk#fPrKs zl{oH(3!CP`Bun#5&VMsii@8J}xI(sn>vylrfPoS$=Z;Qw2JNrH28tjFDd~i+G6^D2 zf4q-u9|gyCDCoJ1IXeKp-EL@@?*R^FM?JuCKqaI%i#)*Fl^)=KCQKt@+kG9qEvD6E zYEX=q)5)qg6`?U}iSio}>qFW`O^wgZX(T0vn`@_((;e^kz<#IF-`pX=+b?J_{{h*q zzy1@R5$2%>i#&Wc^tTu%;1k*AQ7w&zu4(+N6KVdq&iEh`$AHtaDqU&W)8H33d8HH&$6<$ah;68dI0d&3M-7Ya(p^ z%ZE3RO|a99uF(l>AM9XeZH&FVLy1X3^Fa{nh;=cfHSXuXX~W(L5lK6UG_s%0-NSmX zog+d7N85ydf)%m^AfSf5POy9eqR)>o@|5n{{3%D zJRW-~wpR{#kQYmwl2l15Otuh38tRNO0Osz8x~lRtf;tpd_z!Dz>OH`})A50+ZsWt_ z_i7Fo<7t_sf8tOWg&Y9#%gL3=VZcC_&O+7%++$w(vD2W&l%_PG43=Y)m!ibAbUc;6Zq^&lVsuWbSXf1ZAHTX%Pfitf!EE3``FYRjc%F_LQe}#k7z5)aW zDo!QBf`u`TX^*iWsWi>SLK2{qK$Hd>U(A2M&$EYf&N~SlC#(Ce)m1Cz)jOPVpMCb( z!?UYYe}0+v7S<7p5a+76Rb-9$KEa8Ht}f*i(RHR&T^M%5A22k&4b*a{L_|H{n zrBdXyM|qilAuU6+jqqf^)-^xIZ1cFuv2n#wXS~a;&d2Upne3pMVWDqk-m3;tx4cbN zcW1e94vlV{xQzaq8Mc_wL1p91#BZZ4C@tsWf0e{)g`|5_a?bGK3&6%1r@JbTzCY@V z_i|s{yF4`R`|mU~4ynQPZ)3+FrbzIYeY50NeKF zW2D`XEX~ras=+MejmxFD1#T*k=&){=0`Vq!n5{cNw6+c*LF?n@nz_SzdqN&%&o~&8 z5nH}8LiovCg}lQRd2gkVY}iybPO6bfe_$oqtX+=;HISmOe;;$-TK%3)T-p#YFsuy- zVZdaTBv?^I;l3sQpd2eXQOkc}~++H{}Tl+HZqHJqON(Z+iX>-!BnZz8hPx1{gBXG9y zF;d@;Qr5shnIsug+zf-GgmQBa3h8m&!pvG|NbfO_{zHNUoeDdcjd?1w*WvPP6(FfV zAt_(kjCg9WEI)42IQB$&Io z_lhZyCFLA50{V4fqF1bweYNo7-PV5?A|EO(GxCSSP)Rf2$8tLy|RG zZ-x;3kP@Q(xUb2rO}es}9JFf)hdVe?yp}dx7Qy7Ho-@g>9|ifBNrSCLoJKcZ5FjK+OqaVX%^^KrA#BqRO%_(OE?FZMn0#^9aGBSpL{ZO#^_0QEo8Tn^lkNH z^# zY^>rJW@GhXf1dg>-}xNkb9{);r4)Y6xkMRx`pVae*HIn5xA|u1;z@B4}P4i4@Z==1*D2jO;!}AUBw1 zhPkpJ2!CH*P$7f&G4l-`Bd<-S3T=F=Bt`r}Z3k&7f9E|(RZG~{!FC;qG3!@{=xyM# zD|KY_Zk1;t$NM~82Vrox`Q7^N0BpKL#^Y~!*u>O>Pm<&vdDnEZ){q_C&)A@RB z7cE@)8?tYNW*yi=3L9SMF-{&k%@E&zjOveZnwh32%Tq+_A0Nt2(Q0nAHaEqnVzeK! z6ra|He>2_+n0^|Fuc|=Lsg%Z~xR7{cqTN&$>#A&Ea3efoJfKI2auCaP;Qqcns^W|WSle_vXT>9mbxn+b&bmx35 z;8j@5$jMjlF9Ewh#85fC4>%r>>jxYIWXBk=-%U^A<&fF-7n;7$4`;PHKfYEeOL&w#3p{z?3-z#^Az9_Eabj?S}(! zz!}XNwlo~|VQHCbK>d)4{m^XX4+1y@ST_pY3(cvEYBDq^CUjlFnp$D|NDDu1wLo`0*nh0L0_v?m*u=|DGdK9ha8(kk9h&m~=Oe85pbR_1nkeS_i3H9#cSi z`)+4@x3&A`_2Tc;#Tn#< zaOxeBx(HZ=mBT#Q;G#orQb35|zSOQK#5IHRx|Nj2)16SBQktCagz|81B<1BqiXE5X zTB&To13?_E9X*xL*R!`j6#-b&_C>{%o49ARV;>RP+(eYBsX?ZquK1| zN4Vo7Jgp|&j%vU1ge$52;YFyqsV%dywW^OpuFERzhy5V-xc(HWf6VhssOv2`tD5U> z)Zb_4`Yb#^%H%Qlzyc(pF&M!@a~hy+m056nz%1@S3dO0S>-*P88x<<>a?GBYEiBW9 ze@&}t)Xq1YvisdB+qCh35i%|Or^}#)2Mkjw2#)(Av0H*c0hj6#GOb!rWWj+=lU2=K z09R;^SX?+9GzdQCf0<)JMTYEZCx?LWwi<5fVIsLf+Jg@>vYd|CZNxVu4=B7ApTI8* zK<<6~K|zEJsK9C}_wRs@ydX_wpTK2g!QADt!vRBUdmz3<9xPe`Oyzh>X@b#Dm*xYO zEi-~sB!Q9^Fzoa9TTJP_cX6G~ISow5s%+E94wX+{opqj4f8eBB^B$v$T*l+0kC^=z zfNIzpUqVOuj#L<8q-P}$Mp2$N_zUs{&Hy6`Ln{k18P>ai;$&ST%b{9qDueo^3}350 z`6Bq63|LNryOYnw?T<7EH{X$Dc-f?1dD8VaG`X5RP42&WyS2T$_gi6IN($^d2Hqr@ z-e0Ck<7bRxe}0LDx@P(^T1DS>i++KgTK+4LeJjytq3xpP9SZoUIfsXR$Dj|f*&6g= zw*rUuEWx2Y$>7i;n@=SU?deP$T1;LMfmU|+uB7CWJ1S9slGDlEzqq0I#hB_}#d z4h^68;?9*_p@grW;lPeLD*+?AQwU~8#>zRQGj^i1lbIrBVr$*ru`dn=`cf#bQb%P& z1QlhYf8(Tv1skybax>TbZM8ZY2$F!vT_vc@*pqTn)}$zjq0-yIYQGw()(ny$LFGlT z)RW`5Gg;pIx(EQ~-9%>8d=IcmW_u|P>D)XAvsq{*PA*Q-J}2T!VlxG|;?%ktJ41Fp z3%fQ!6v&9|e+qsrqtrKR14bPprj`QOz`P1)e<9lT@SVBv;?o(3w#<*02sZJUD#Yy-pp9)C1JBtA_jWFv5=%8y8+ca9r*!HhCq7615~>Hh-wU=n_>` z>N=m=$pogr>+|*%%rK2da4$sM=6SpI45>dsJBkp z)s? zmo*XsTHc8gKGW)QsYkbDp8Bz=Q#5r7kI^ZbIzE6MqlbSUH`|-54b9f1FRkLG5rBs6 zwFMZ7+{37Vz!O%^wa#f=XD5wo1$R!M)4cAFpCer& zknfEnNx}{8dm=cl+yF;kyeM|myRDV@$2_NhOlKZVea;P~*@P=YtNGk~e`;ErE$mP% zd~?U4sE%>ZN**+lyMso!pSkOq5w<;vAz1%J%nJfAd(`i{?Hm`?>iPl^yB8|6G6JZYTe0?t{vnO16uGe;HY9 z;*uS2$Y1TaTmp*b1%6K-JouT@{ouhq{#-qH@DzV`b-XIaNvBXK@w~Z@K0mGRH(#K? zKZ~2Ir#vuR?zr61veDAyF+G}myj$Hy?+ztkiI?zdfRlwbSp$}!dS-sI;X@oyn*;pI~UPbS(FWsm=_Jukfo5 zZn_zldlZAzwxYT7Nk-#2&0wSq;|M-J->D$#`m_7MvQPCte;$8Sa4j0kcmrKvZJ~`z zP{DX(BeG`8^MV8~fiWL7Yo~MqU04fm!CMS2VqTDrCY52Y1TWQ>VrpW?-b@J{wUBW#K%Qv5y`@DExz zvf7@9duffie|knzi{CrKy(4URN3s9l^ir20l!!~%e(F7nubn;t)liwIle&Lh-=F#G=ezMOG_BRke8MZ%t=P4R-h34!Z z)}JHS%^rq+_i$l)5D5C|(hd-@kfi46!t?s}V)MC6f1O*+6Et5(QcMB0*28W1U>$57 zE-re?W;$v)MG=5M5N+i^TI>t=vEDqQCQ(?RX)j5DMZKgjV+ztEGX^Wr`DL%GMNc+1 zV47C#qxiq|!Fu9YtHa7D>v9&x5Mh1HC)qm~K7PD*2#sLiD{wxdCz<{Ri|XUI4b8Z@ z_UO?=e^`JML8_t}DZR#j@$y3OEp+51h71~}C;BI?*G|~(&EZkK+Yc|E&vpXNWuYb*Hiq`5tiQ27`CKcK6w+_pd1g!NDg1 z1&16;+oP!5n{yw}aPFN$KtJz!WW07#f9}B+)SNrTf>i7D>O9}gk4?{TD|-fY76!^j zeu_k5Xr6o`YG;4GOv8bD%6jw%bn^5X3}_rz7|@RNZ8#l`pFwTE$4-I_PjK&9`@D~y zP3ruib_5U`u77oc)dL z^Y{IO9YgGF-Jt#Fz4jPzS2~)MzE+nXLE4FnCnt@`VJHf4=TK{`z}W|45#+5|U!5jj z9pS5PbZI(H9_{cEi(4o!>cimD)Lxu07UdM_*rtv-G4cmOCD zf6s_=YoWFcCX6(4dkeL{Ep6kJ5Lm&SEf1ld)BMwJb$DZn6)#|3`eU2EK2e`$ErPnV&f&Ik#v#Wc)7PdZ9k6w4jY;jEN$9FO#R>2=pYNO>cwD#KJ$zl>ljxpQZ*p)|-<1fQW^4Uwp?O~4U1*-x z_j&b{S6f=3zeUJ~iaPL0CU)pKVuzk1OXc(Axcj2Hb?}^xea?pe%wJS|;5Ys(oUUup z<*`K8g!+s6&xj>@f9|nFq5TK;5V1ruf)R|Rn35jC+fah}eqC)CB96UtY(YKizCzb=xH=59D*3kj_|4Vq>jRgRdn2!L=iW$Yy zVzc%dEf%qNhUbLUqmnOW{Gp2a^rMewqL!YCt_O>OKEpI^e>c}atKs(c!#CjHP@Y&zi z{{Fo_<&`~O{a#;?AGS7v=oU_D-Dc}@@kMt5o{5EnAQ&m@KS9^e4o(&q51ZYE+=he>ZJ%q&Kz>fgaPVrgYiU2dw3yim3^!;K2!ayXV{s;rHqPvD3 z9!B6sP%+s%XtZ9G)K{D>d)H@XY0bapvX9q6+o&oA*qVf>z<^s5ETVJZ5%*5$U%Djd z#bAEt%gotBTp~&UzcPOh;f~d_0FB2S@@4b5j_MUe`Dy~l^B^iARC)55Dv2}ZWT$(npJfgC) zr=gI_fBAq*P02L$Z5sO4d!W@$;5|{3wh1(0_C5b)19UUL+-VDxJzvGKK^cU24iN|p z({N8dNhc05(&kW;j8T4(wZI=ao{$#5o2Q#=T~Mdtb&t~;Y#L!oT~UxP0O_c_0FUvc zmIc~BMu&0p>xd#^ayA-%l&RerjX*W;cOicdfBM~fF!6IV8xr}i=mWwd7*s}$G2E2F z90mvxB=4ur7-53g`3Jx_0QC*tD5G6v* zesv@@z_7L6Z1ugE;NRoYZ+uuWOZpa0Dhl@K1|6DwD(4llc z6s#B94^Lt;;v?G{Lr(85G>)taZyo=AbJ9t;L^2O>O_K1EyPCcUGae&lA zhJgcg8T*^bC+q&w0wc|7tMZy|?f&$7Yj6J@7VTI0P8XmZ-b|f5Kl5 zV=(&kjJb0~p%So|1OYgq**YA9s0$nQrMHc5%%^J-&Ie>qNEESGEHq=iVCK-dY++11 zp|#@v)?h+~P-7x*0-09M#_jRzVeZK)pJ+@?Wn#9{G$8p*RTaLiUzV`L9AVWVE_l0A zp&vlG-C1rG%I@jNjJfCK^}=T7fQh5J!zf;_M%D$qyBnjMJFX^bTH5J z(7n~Yh0N%lic$WBbGRt6)t4aTy~`#yq5g1b0LHb1O2>2ce{a2cO($tke?tG{6EJ?0 zVMMUCLr1b8O^FitWs;->q#2tb`-pnh{0VKa#rOHMG$xqQ3bf{pDoJ+|yFlo%eNaZo zUl@VQm^lIbdQY9(6~s(l&BKaWY+Gny{sr*8+zX*HTFbmC-hrsHzTR4=Po@uyjSIU}ahegD-5_TH9v5Bw7}ODeIv;Q)vqkI~n z)_!SR(VrA3lxs-egMr3n!9d}h57_#s%gGru9oIo)Uj*M43iMov2lkj1Gd}+p1p-ku zvI+g11SvI3f|M|A;Ck*njh{g>okx;?c|U+(NiON-c86=Df7~B`Ab3V1G3_w=tbZzU zKpU_}E>tr0$rr@)qVzb%o4>ABM)x+pCi2%|wC@&n+NNyLOB;r)im6zEXZa!7T*e?! z_{Xah)@6|EZC6q~+m8x1QBtW|szOa=NuPj;EIBt!!31<;s?f^xm^RfH`m1Img&hWL3Z-^7Iz?F>ZZ;BR)M& z2O+hZWLw~kWs!86@;%&UzPAQvC|PV7asEu1Euu3JKCH=9r<#$W?_e zMS}BGrZXvj!a8ijQGOcMtYMndEd89xTL<|8*wDT>Y2F zpC~wkOpoaM25m?e2^}dO`5mS99wmf12+!-Zm`Y{mgP*40z20F6P_)fl10>y7+6gl1 zLgcx*(fuIzfn()!!wVA}>08%aiAZuju<;0?pK*wP#Gz+YFg7Cj*1cCRm$8iaTsNN) zSe*Nkt_}#_-hB{NZZpz^%Y^32}yQ@59ouf$dDJ?e_>^0ZFEJZ)^7+cI6MipRiFIF8BC)@pJhz^Fz%on-5z5M${o- zhNUf1+wg7ea-*~t6$A$vLqA*!)gcDJ=nmmX5T|r0=E==@S;E61r$VZNUmvWDBk*uZ z;EJsn2&;s{3~Y@X+H95> zW6XjYniK>sOMZj|4=zC5g$0LnK9()@mUcrHL7pk|Yluxo;L=^&8-V=1y%8AgFKDkw z6Mv||ZZNIN7~a1CErLAZ#wdayH^n*ZmK0VmCrt=Oiuzg)B<$w1*y1D2t?N01#6*XG z1KxQb{vaR-PQVvjj z{wYQ?{n&N;L2gQu##9ZYqI)E)!NUW8H)Es9a?79+rm`IEK}rXYw9m-`4FlTJBe;=G zi$Yt~ZL)}Z6I-tr;DNp@ybSv^sM&%!(HrmIGOf2h31#U={V~iN?ao;bs>7#mUfK3( zS|iB-Ozq)3%$S`XBqk^)g9IcN-P2RjENwh4MWy0MA@QFJrk?rF_v`xrt1t$CV?WJ(mGFxA52NscK&7j+8@N(uqeQe4PI zDLeCZe+2-C1x*bOs=}G^JIah$B zI~?OXTA@qJQJVO&gX-r3&$E{~DhDioBx^k?)*K7CXk%|fL%Ecw9*wQv_oZLbF^5Y^ zc-`vir>y}Yt;%$9av)yeUZ-s$6i&du}= z>%l=;jKpJ<-(Uf&67gv#cxLn-A9ncglV^zNU?jX(XNc}FL>2Lymq@rwlTO3jqzd|HH`-CqF{aWfQ(z`)>6+ zcECO4S0BOe{aD5cNEdSP2|+|WT}?tuB}d!aneBJRaVU}T2I|A%IOz8yGL}Wm3phY9@+HQxPCoY-x29{laBj{(7 zXzL!9MvqIwsMwbVqOC1l&6fu5R1&V8Cr?Xfk#F2R4*T@(qX*x5V;^VEK2G#-by|!h zl~(Yf1I)l@p3Q@!nwH^zo^!+^^)KnKjXoxFTQTrIjrH#fY&&&eepldo`WtHtn1M0= zOahe806Yu;Bl-{vr{CpS@{qWspI_?ORMUa1FBD?`fm_^Z|285F0N8|iQybY!@N58fP= zwx7n@wst4CZ+o_XZcK`{*4lhctkH4%786btG5JgAB7u7*L$0>{cQ1Li&37=#{ge~S z4Z%e5AQEYOve20>zkT}bXz$I@cB^%?|9W>1Ox*xZlGjaIACPn7)Em|gGRl5BR}OZz}%Nr$kcl`cu|?~6(Onx`lr6XezjRsWf5XE z^m(1<X2uD5i>5v>hpTW%W{Q8&r3m!r>!H3#IXgfH)l3(ddPs=P79$y? z=y46e79UoBZ@#@gMrh9brdl~gvL3XLp=kqF1I+9dSleP2wobqwBlah8^4N3i?9&qL zY=rifU}qoe+$7l91(yOCTTz2jt~q+6wq_) z>%cC+kFe2(v6xyr;O9_iJABcRYHAY+!*RZN)yKmci&H;WaHg>lsp0}&CqSdCRDVq8 z>C6Jv$F!ICE(awOH2)Au_WFE0loF#*ytOc}S+vTZH5cq_?0 zEE$)V6VlFlFDWtDHt=P>Oy0%Bj|o)R^RAAf+llQ|AH4F9#tM_+6|) zyTU@06a_NiUM>x%K_Z$DmlQAuB^=%u(kYB8SiOMciEIg>BC8@GXq7xms}BOg=mwWn zFb5xh^LWWq(*pOEKyL0soPR)?)*(tJ3n~9B|?r6$(25sw_$8Upw+FXz;tfK z#D-Vb?U>lOlVW1O9>NumUU>ARtM5B+k^E?SeC&6^;^`P#~)DR393j}x) zpUZCZ03L;}hfu06!>l)M1m>@EH^8A2IEXW%3UuesQlG#njRrk%ic^|@ zO-HJb<&YqGpsPHX**?3WxnC;=1806WqnKtJ1Yn^E-X+KvX1fInp?>It0KmNbZWfZL z0RgPrmA6zwY$ms?@y~*=z;@9c+QjWGz!UT_9f@I1-?Z=DWO>HL@d}=cFswA`*ZKO* z>m5sY<-TMgoa@XML406uN&%kXEGZIy9-(RS)MKIn8eD-@r3g z_O|V%2oJCU=E=%gU?42Fd)mCxPQE-o8zQZS3j1Z5OpHfCLnLYgv1j+XJ6D%LGY30= z`(4RmLXkJ#$-^gS+@aEwJkAlpSAZdhqj%;Y1JhwUKhDNEq`x;tEUA-WlF=_E4yZkD zXMXo_yti>Z_i%_4!~7U}6qe)g{21yejTLoGD1daWSZPbqeM%x-dLvlF zU@h&#?Z6pbAFurb(u-dG2H9l-EdiE)`uQb8?qe4BOMwqsnr=K=fs3%+Yj(08>mt$R zd1yD`q1~|hNGUqCh?0)#tFx%Q6;m-DQy(V7C_s^HMpY^FQ;%#!6?d@O@GuqB<3usb zpnARQo$df~{Qdv=_PX`x=3r&%$HT>MfqfJy_J|aFMqq>UWoXVOwIdysvbFAVC3 z3+2RXaU+s1W}cXkg5ne`p}5L|<5dkh|H<%@p=0e+U7t|(A`Gv`$+Q?Y+=5~0cwnAv ziR&AT$?Z!E(qaf*!e<~oQ?Ftod+b@el;cpT?wfDqI#AY>AJ*mdxW?wqDFzmDIfIsd zh0x{*m8fU~vtRbJPm#Nne*=wwrZ7pa>)=UOfTjrR>Q0=i&(R7o*-%x&oxHCQ$D!nz zJPdAf*Zu6_3(6K#b_#TJnstLGZW0d6SyX<^Uk}j}dO{S+Wn8}P30MN4BI$W74VfXV zr1~(~94G=*?hJ$+GY7S@3TeFc8e^3fZy>^PRzfd^{P>bjIEA}0Wu+~DA<~?*72G2s zZMAdKR*!?CFIVMD%9n^ zxhWO8Qy0bJeq_>P*mq96X3eQkzVF0yQ0cw{p7sU%j;VQ|^)agzbn3>t0EOYL%t>n$ zPUg;_jvi1YO*s-&RzA0XQH0D(YN7Ae?63$dIF z#3zV??#XEa`hQGPl;~LneX3;kbAD+&#fobhyqA(@gpF+utMko?80{_?E92d>cKd5k z3OdUI_)>?f>LAVn;5bW8~mEeJ!w zJ)GP4tXVvPLcrbZvS$cLq13guN0aBt*lOICSKaMX3C2iMjLKkw6r^ETW0iHJ^@gME zC;a;(#AiWEns?V1HzIv^%0(vn_T&+}iUy`Hih(JE=y|GB@s; zL*oyvQ2Ju}s<_L4@=WejtkZ0iL>R;5?K{-SF^5_@zxro>;~@Z<@0=C*5L&PEXD`)X z-oWn(p6qe8Qf`5wm9{q=$#s#G875`n23Pr+d;BCULqC00z6w6x?d2P!@_@9-8{hM| z0^6Z>FA_C@taI@|`QXy;eQfeL)s-C#ldXSNvyA4wS)rAGVKM3pVLxKZSWI2;DbH)>*g&!3da8FSo1cm<)$K2p2kVHR*0C+?F;BrIlDWvSW~Xw} z;W}1(P%RQ(ficvS5!bnIrGlLZ=|MC(XT^}<|E}5qK$sn!rOvAF@3L!6JX8mJ9PzeM zR?%4Pu2P%JGWxcDWcZz6w6EeG;QUHLvNLKJ;R+YMUU$4VeA3gqVB(vB{9!{Cp@09u37@z53XGfKv7T+BRW&s_;259T)$=Eg!nV)25v-0J z7U=z>U@8=Bei#PJ@W%0-*q0GLez7gSbBG*}6P%4VuahZYqAYoghy!!qQg6&I40=~6 zhq;-feb5>JBdrH;aB;w5M?g7n-9TZmV3oM2#gzBboj9@S_Co#tCf0Pa;Y7OtHb*rMxh-5G|AxX=)hCP4|8|)@_U zKUnU0Bgxr3%Pa~*qT=d~)O#)KQXk~p2#u=Fh6au5o1HWE6ETiR0ZtW=tPyM5QBy(KwG1;Nxq1q@rP5*6Pb7rhFlZLQ%yH< z9I{Q^?}ITj7K^ceN{2pgW63Q`gs^og_%E6Hb#-NBVRZ9v?QGeJhOdax7uPW7J8k0fu;I^2yib@$;hh4WH>{HaNkgQO8+^ytX1t>bwzSLGQZx##Nd?^}K$rs&EToY*9oY}z+W&Cjt3^oInP z?L$x?g1pd3Y?CMx6bMt9Z^AgBD=o(QM)NoqXIemr_8a=Q8LFc}1NbPSoA*bHi{ac2 zLcrN|cIV-L0m%r(zIPku6nDU%{UNb!@gaDyei*Vd51Q}!?C281lv&+3nBX=hm@fJG z3C4bwzx@Ftg@E}UQe1Ul?_;z*qUWKgxHtuB0)d5T9&_p8Lj5^nl4#^?x42U#v>vFu zgp>9c&_Wm#q#K=9(!zkWknB1M6my^2gTRxdeM~-oDGCs$UzmH|PZ48^k~%l@?_q3? zaP);0Ce!PJ9jEs;+P3M1&x%uZ2nM;+^p?@ZjOiU=dLJ57IHhcIlHBSv?}A}t~U@tZ7OociWD!qKDP=2 z&p%UthF|fJkP3LDI2PWZlRJ@oXb;c z3%-zRe*eN&HF`JAKOQ3n?gE$~pW-{^ECmsNk6D(&J)u70K`;aI9o&(Fg}16ifp#vv ztMXUYa5VykJ^{FnhgX83KAdc`CxW-mR4NcV3E}|VGV_NLBt=4&=ZqJtiy74Z;+O&_ zGtC9%iJ6BCe1*#_SzRB$&^5}DbLtiC)LU{XurT>r63Ws;|bgRsJN(CgFk&jI}X-!n<#~C;10MdGPM1CynVPub6$MarKCo|2Szg z_1P~WnCwaYCz+mKha+^x(>k0@>jJUx0$QcU#bw=+xdH_uPTA=y%rm-ub1 zX|(uI1_X}K@T2L&LkXSy^hDBsErXrF7ktpKUknW&;#Kcr+Q1p>0$OF^aoB`AoQKhq z`kS|{2AqvSQ-EES18M`1C%_yWe;kg8D<~MkGClj9%l0i4j8 zHLJ0+${X6{#xLFa+ujJkt2}c*8?;Xw-=d)Y6?J5hLlXmCATh7jWs zN8-~e9&0P&&A}x?V^z%)PxOrrc+OcHO8dr(i+V_bv7;$lknZAqirB&7rD$#&({{b3 z_K99srh{1g5`5SAxLOZdq(-M--y2SWM`Z+lc3D@R24Z;L9-lQnKB{wtHqI~Vzw}1O zbe{P1658!SV{}>f1idGJ`*l!P;pcPLX`FV@b@+V5(MiF;Bf0_fGQJOXpK5ew8&k)V)8wiUWg^; z-tmt$c#?ZGdIAc6EIU)^s=DuSsSzd$_5r4GWc5uT9m9QD?Jm?jjxh$CJ!pLOmfeA4 zgXD@fMDExH=BK_VDF1Xr#fcmu5Z_S`hP!^m8(U+^IBfa6FC?!+wy!&v>}yQXjnGc9 zamyG0Q9!Q0;P9)zo~?4@!w_;9h$OiTaf3{Z5H|-gFY&Osx{e(6f1`DzA%4@sMiIvCAQ%D4(NIuvAjx=JYV;b!^$o4_zZKOfY zAl1l6P&1r^+6X8!G`D~8&kI-x?@85jkb)hoKTN{!tF;RR6Rs{l%4SPXr(zVR0-)tS z6`9fRWAytN{V+M}{g)0!2N-{YTj7?Nf4qn+1-Z?!svH+BB33z|&^MhTB7GcXY5~`t za%aApwF05pLH~^KCk5|eZaJeyNq;4T6<8?6S4VgHxxM`M^-uKD z%XoZbi7{r#{vz5E)R!@+i;?+vpe}o#X|{{>HJM3YfwKOgl;ua&Ql@`KTNU|AAUs6@ zklhZ$W;`u0UDDaDq%lSWO&Mu?!)!?949sU;itx!NGs~Kqk-Y)QPjCbB5~=I+=fAB0 z^)232#k|~xdcr6XN<^bUc;^Y=O@vPbkY^So(Y^}b5Y8@v&1x&?A5|9!nJFQj8w4k1 zSawB^WvhZ{sx!TOZ|8qv3_(P4Fz_xTkPs!Wc^Z_f!?79LBZfi<&|{Xcw%-?sjwPTD zG>8<0g7Os94iuyk843HnEU!q*VDAKCkF6&nI5v?$Uq6GsB2_`iz!;$B_`-ku4*~u+ zC%|8O$8Sq0P;P%62}%)vJq`YQ2@U?b^W?2r&^}(m29$u$4WNJ8NGvzX;N{rIsI$}d z&BG6?59ypZ7{9MypNVJ({5LvyDh0ub?w^J2D`DeO);%dfD!W%>{nIf81v+HlQj}aF z-T&`n8t}6adHnDl?B0S=|5vvafP<(=n>_xCHiMk9s&q*>#()lqvaqZe8!Lh*B{?#W zm`<5~BiRV=Oc#H(Sr1t{ItfGR*|6J~d;6xfhtyz6m+QyF?x#jBGc%03hGWH%2>e5< zXzkIXx zbmwWwm)Uf9RiEy@{>km>zjtX*pZ02S**hSj5V^h%bF?;JCb*UHG3t2}Ff-u*2yY!? z^<|6Fr6lbuDUiwi@-HRDPQ2I)7E9m~7ReD-Po7+9IM1;(f1VVCEmsQ~r3HyXqO>He z5|$KRNQ!?Nc~N~9rA{|2Oqp|`q`sD(|V??2Ywaet`nLBwVJxZhAU_WU&b^Oxkt9%cD)hx2p5`;ur+mTyo3;EZ4oRGQ!A_Gn!%zWJh!$!P&CoIr z*E)X$MJft59?8}vwbu@a!-n#;rrLr1(s9F=1Mvp)<%T_HpPs)e$?!=r*&yT^yd#qn z#0v%-p_C(to$WDoDe+e$JftCv4sr3<@)+vHN$p|nKmYUde?FXl2tCOV;KUYRVLsUd z{DYFz`j(5QNhcCYJcy^ffe{8cIw5IzB|Cp9)OwN?ONt37rOCalu`0KCg5}D5Vba1j z;Xfz3;8AiDZeqN*3CGcTd)n>} z(3c=e2NZv1eebI9qfh@(G;IzoLmbItZJ3p)K+x5)W-6WA6md?!~^Bw@L>_e~*_)rp{xv*aif@ zOST6lVF+3q0^ev`HkS{^hfta576kWd;R-`W9bUEto|9a4Gk2qLa0rz%Zqm+5pc?)K zAblUn(L(Pw^>(Ar;C}o-mj>?VE;4m+anpw1s1 zKc+CLfVoX}q;Syn-9)ys%H1UMH1hAHaS2BY2*lb3z;Njm^)zX3(sl|pFjWMsHxgOL z1nd}*P%98~8}tOpsn*l-F#QRU&en;S9n)dNoT&fKz|t!RWb$8y3re!0qPQZ5xT1B; z=-m}GI!-AcfzLWuK^p%mCC42O36Yg!dNt8vRb|>NQP!xfs#yKOVWvab?XJjnilT}5 z0y+Zq@D7UVMs??IQK0s zMrxS7mQ4pWf6-0Dd3*I>n%cK)P3h?5M>Dgspc%8FR3TNy=E*13^oS}T$L zEh1ZPeH2c1sd#6njDj`Vqp7Wxuz}EH1THImbUav-=vR7Oi%F#y`*~g%chXpxN?8#UQw1e^DWtGS`6u7q|9Lz}AxXo7|KX zpcFFmbC=}xTkJ!=ca(iL9-=|HT3zvsF!H_q*3sKHFJB(*zTVq;_siDHCV*2N>OOt` zYU>|ITYGyuuioypn%}ROkI^L}iGB0((}+i~(1n9xT%*UocNwu>TGTos6BL^>$4s&^ ziw=L`f84_pmM;%2AT`7SKsE{2?bmb7@E%(>y|~b&4q3?ex;UnAp};B&_Sw6-)I}5x z12^~D%vOxc8J)yS$Yh9+$1%(Y(Y6$(EgW_7(uYeWmB&G&*plZeDnzXD>^hEOpBima z!LEExgGw%awQ8Fv6?^}voLdlct9uI!gRp~%en8JLX(}q-t$w}wZfd|Y-dRPstol&r+-4x}f>o$W9k(#djSr~~ilw~`o&Yh%k zM+Uta4@F5JLwX}lTnUrE1N%=7iK_0%xVo1Nbn$s2;#WKjqImF|xAd+WIs1FJzBd-% ze~9A?8>Yu{rh0&2kMwF^6s(Y!FxuNc% zosxIM!KN0RUVpQk|m@rP{=1-jWD zyHSh9LJ|@ZvLrx~Ssl!!x!=?@G)Usv_L0sjobN9pvns2)8exxTXZM`>j73*fR%TXY zWMtgq<;+u3xmdnxB@Ds+&+7?d=8reT=HaUp-WwCaiB15x$T58UQvH&%*2!CnnB6_B~`ckTCa8;Fs|K_a}ubd zcYgd{@d*^_B28(SWfh{XDKA8qIBl?LO?oczk(IIRm71|ElwvnK3|{j*w4~1Q<3rR@ z@$re&5InX=Oo%bpW^=Gm=aLuzf8enB<3M@s?C}oU63rli_H^9;1LhKvX?R>D_3SKa zX6Dq~uh2Yt@#FN?EhXTNUvhA~-E1rnXX(OO5FyY4+GcHO1vi3U=tS>$!kk>yW`rbk zxeXpU$gKl7vym9UIS2Om)-IhFLwkDs^EG3|q_%I!do;W|;u%I5a_DT#e>ol}DcsLS z);kgAEC4QWHZh%@axG`~xkKtC8G1MIb2F9b51sqwE38QzBrx9yFvqhwVhnRUJ+lf- z&EGZ0M!uMh@~{Nxh9m4M3~4x@PJa?#n0yZRZ4On0WQYob5a%y$5Z^U8^n}4xB(}&4MwqP=}R_laq=1%3mXQ-*8 ztFwa=PyJz=Z`ik<)qTR<>L+LyRhBIo>&DAw*b+wm2iB(+>;rTD1LPxL?>gc!NF|n^ z<7i%U`5fu)Z zkNyg#gDea&PUa7?7Wq6rFa1}~!zyRi@i#LA{7toVPF}kLn+=93MaoU$)~{GEN;H{s z?AW-Mhh|-I+DIPUfB$ieO}dWbU-Mq}GdgOa5MdxfA=wN0tv{LJ8DfIU>1lmgHIu#k z2=xbLrb-83j2vNEyXbZ=n9H+OAOB@SyefMbVxY_t{ zd?ugwP$P>&5cwknt>mYapOxteTxJ7)>fEQgqW%10b*5X5$KGA&#tAvgaAXRAF5r#?-?uws;JgRr>6@es_`iMHvfL0ejw?l-#DkI=I60Y!HA(}j7 zF2J>Tb=6W0udaH+7jqCIfPrXWVpmsx(9xxB$g+h}fAOuoyQP~}C-w13ytjD#Ztc9a z&WoOKQ~g;O^Z5^iF(=(iFAyVgTbFuBDdrfJ+j^~_XSV)He&_jJ6?i}G*g3U${L&Ra z7Vdl6TKqY(8{siY@p?-qZs=*v{G5^d;+H5iEgt`Rv>lF`*896zpJD1B{zl0C+sniC zW5t#^f015X+s?k24@s+myskVPaO>yCU{YJb;kJh=66L@;S&@X~X-^=}WzX*Obh z%k9QtcjE5I&cyd4eg0cJ0{?rRiPMu^R6oj&(%GEYVjV^Z>1P2Z?!_M)o*FS;_9m== zzvt>}JbZAQ5gz{AShk!`!2$D*dFm@FcTs7z=b|++rMYjm_E#b&RP3ggHz3{N$&a_10{pr>PoX~Aw!=eyszZ>9l0DaL!NMY0a#U2WFk`uJY7|e+*Ib zc1-_hQ;yWP@+v1*b+c9pQDIa#e|YM`?1>WRDZizp#9sS_#g3@}zmodK0EuBDO1YT? z7CDc`KF$IQCa%mKK9$Mb%i0K=i+lbz4}#YV$_*KMS|o8u@|xAiFM3vq!_aW;hi^1I z4GsI>>hU-!VvM6z$Cq}G%c>`fA<1qvWh5W zL;aYE%)+>p5rgz`{diGCQ30R4FGf5IBYt|q=irQnXKc8m|MZ2^pC7fz>w!)51W{(X zPj)BbfT!mkwU!={drz@Gq)8N4O1iov-Yz=~!EM=g5%^WnyQmzC6a^54?2*%q%uUfn}4LfZcAx*t1Xhuw945Q@JbTQH)d8ej3V?LV5n`7&9~Qj zqyn0QLGzUQ_7(GCcAk$~aDIy4%hLz({?t>PTwbp{{n(yYlJxE)e~83PulY2p#6MYI zOR&~Id55pZrdX+<#cQs7`j`pV>aq@@VnFV?(ihK;2{O5z0#6M=#O3^|J6K>FTu3jG za2H=i)08#QbX&Hji&m@oevB(&BdTdPXtbD=GaIbX{|+py!_h9 z;*PmOA!*7MN5&KKe_%?T?N3KX*&q0zO9*}3K7NWx>}~sb^YK{rh(B+~rVv=WBQxz; z-q)|W_J<|f%=2)Lhg!H#VKc{$P2ieVK2$}!G+GVR7oKQw>cdfUKKr8Z7W&#-kp{{sP0P@UKDkiU!m{l?MFA8jED)f^p(3vZbWM z->koVLwQGlr{UR$c29feGY>z6hwrEi7oI+`H_7j@f8TsEHg(*A&{^HK_jj`9c?a#0 zCe`ogcMe~;$VRe&tDS7dnyJ6dPJ2(^wx}LeJL~jCbFp~0SQZ1+k}|RBIf%;GOFs5* zjJ?~-w#@vog_9puH;ducsC{Nnv})GNUZ?#EM~}$CVi&mtk1y47PgpW!Mg8S>HU&oZ zDZKM3f4sig6vF89`eL%C(9!cILy{@3H@UiMo1?w*-4aEdeCNK`Q`YZWGouMm1$@^w zA+^>MN5;==2c`r6pi(ClwpH~_n(u_5VM8&^&qf+_{W8Uc_rATnV{Mrscw)ECJMGo@ zc&5{SEg-P`&zoR_*8jP!KjbV~|BBM)?vG#tfB)3WBvmB&9@3z0Su7ob@A=^^b`A8t zhLA5?tT0|rxH^nd7c08e%ht+Bb=EVaQr0nPyiMsT*wB)-AGR*6FdxmofU zfBY?=rQu|@svo530dD$NZQdK)NOcC>95o{uV$Q3*?04x|v9F#q>396Daw9{I-uD85 z0%Gyn=#!b=2VOB$Wp+Y%L1ve?E(H;OK*P!(*%7JYlb&0%HT_@@3W@l*KZ!)zdXVDx z>Zv-uHqT~9XeC;nu-((|gmPmo{s`STeP zVDOxe9s@4?Sf%CMBe3`%+VkuLFq2LqnPM{t)9p8Cam2t=0a-yoki${3BIy(|rJ*1Q zYZ#aIq)%k8@6$&Zik-t=@doUWZh5F2`+t{zTT7{j5~(7(kX=o=e34b27g7g1!>BdbOuL-{Oz59Tq4XAQkq80c(i( zKh4poUBaKROZ<@WLzS1=cOqTdZceh_8Fd6n_*Xbn&`9W7ki9Ph=W(U;CPlZ?dUT77 z2RPzQSz;|Kv)H#YqBz%2R0Ck}WdBo$YJ`nri4hD|V5`kQV~mb2>iYw8e`(aG_~!ik z^cM8NKGD<(q|JRY*5Y4COR^v@If~;!uic5z9yJk#wB%=+t~bV}Uvl8LD1ck)#^{TB zna@OG>V&Q7r--Sor_E34dpXa05qMrHe8inj&o-ZpwPu@3Vd(>@c@N9Wry`+UqJ!fP z^a?VBzh7&eR=;$cD=Lpde*u7xzS}okftcE-4CohbX|7kEM$^;Tfc7!ivnH%8-|2)Z z5sa*bblW3c<*J*wgWZQ>gopf4aUK5bO#C>qzCE$s#eJIB%;(XZ9(;6U;2~DY&4KZ) zZXW#C2;9fLTosm??D33LM4oXw# zDpvO4M8CUsat)kZm73T+cYMNLjnQP--5qb%f8bN995b130o&^PZ-RehUW2yswKw@Zpi@tR0uR;y1 zhJOY%PKKh!zXl!ff5cWQN4JD|X|R#|9Q{+I)5FXhZ{3}|$Gv*wIZTnK^bt82NlOme zJ23B!95XSphyzB0kyT@#2scMGuak)#eSa%9q;}OXBfv@5j2$IA_WH#Ak@bUPxuyPT z92&%&?I9FN7?Cf^w`tSrU(?O{03Q8wfXz_nL)X`~dbG1&e`k>jmRW6?U}V32mkEWh z9axmmCPBCApgBPi0lG8!LqLI=CG=nUG8WdL&T6eS=vTR4*ien^enxU`tUGp3-cF`R z;I{OZ(NyzIdr36aSgq2k{X))N;f(yP`q-bk62Gd8AI{#@GM}X}>Yi6e8Jt=5Sv=b9 zp}7Z3t}3i)e~Hb@4wQD=y{F6OmjS2gX+oHBDv7>#=po~^$=l|&mOj~DC%WQ z-bR}&CiZK`o^A0AWxd@wY_EoA>+Kz}((Ac8CZa?W7Y%ga|;sIxM(bwKa!&HBC^=eOevBNnd$;J^C4x?c+Mz3@_g{*Ds;oTeA@nyt6$Gt?D!x> zs7C*k=~>BI7A54nKakJm1LlsX8|9;D%tyV3&Ge7jAtQgu(pLVqXW`qD7W%}cs7rMo z^1W6df9fUndd+p}75-lFTuPil+@B}9^~9^~a8$#Y3M@F0`1~(E6`-A{fES6;b zSAlyAHvfAU2d)BHN8_O?h~`Er#Ya#*O4>75ba~VFnlsRcxLFY9vUN%432Gh=N6n>S zs0nliQFChbE&68D2<#@Rb|u(zeZcWiwN|fsfA@Q?wxSbt`$)*~SaO@8If^_f^a29S zc$*88&2t2L)?Nxdo;AhN?2s+nZ*Vn9JWxRUKQ7dby19+GLdBsE3T=c*00v z2aRn%J-rt7mTYI6B%?W3P;Uuo#=7LQYq8EwP&{D+d;f>9F2N~bNiy(s@Jzb*eL%Cn zf8T=;`p^46(!PT1IS1iLwm67n`ogVDct!x(^eXzM)+&a#sAt;Dc0k0lgnph2_&c?T zcrgqSp+vT(TT&~^&W)-rtoD|#_O@1gOSrVk!)^E&3GAWGYP9IlW;Mr%x9y8Csb}qN z;nEVXJPWTpOVtHSXbVWPt#7`_SU0G1fAOl$gC)*`XQA8K_FQ;2-(FR>WwNMlKLy(L zsh%LuW%CZ#CD6Md$aA1y6q9WlYVsJfkBisS7m%^mg^mk@{d=HbpFN|`-Y&FT$=uiT z&$ey7^p9<8V3y2m#%2ameEoWXkZv<#?GilSDe%1Bk@o(dM*FyL9BmI-KgzOYe~h`R zF$0CgKj{y!@pLZ?Z?Iod?iM*g`{r=76?V}*A9KC5RcsrW9v5$qpny?%z!pXO^1X7T za+OLGTBEkO94<&l{?#Ru;3YihxoGv}Tk^byc~35)b82$ycxwve_X`q`_xS2O67OVD>=X33;cS*rdL_=z^RwG z_cgy4YG!gTIEslcw$B0n>JYpeApCiuR)-wFgd`5oFh*>pI%mX^@7GJz|y9t20qBPAI< zK2dPZ+P3*A0W)rDr6CQoZU*HZ2dC+WNxw`UN^+w7LL`p(6$^Aeg4ioxr&S5-cK_f4Z)oT$rnCLgX&4 zQ~iY#quA(_y|cNR#xZmhXn9E;;$O7B))f-q+EuHeEilFH8AUY1@Ntd&mj^C1D*qxoaKp)`lc*AEe43)jc>GJMI^p?iUfX}IRA>mS|SMuyjyc%hOYrp~pC^Ny#%V~;cUrOsSDS1@(nyIYuH zww&OL{30Gc0{!I0Bv$}j zdu2`kf8#5F-u+*^0^0o5r@HqS!9F1*)lo_`Mr{kaRc%^4@s=s=tF}#_UAtnYK9-x4 zQ5S<)jH@qU;WSyY@L_22M{XKH@D2Wl+RV7xW@ks*zS^>{5ToVG;QJWjXgmFhHo7+W z*wmAPW<1Ji24=_S@*M2lm2X2W&3K}JM0A34e<2;>zYy8=io4v5s8#efl+z#1Cc%?F zh~Na~oBJ}Vft}-1PT#_BIUhYZcMLPa1;udHc3ANzd}{|t;Y;W)A*nARTL)jlTvBp} zz~9}q5az2XbkFI&Aw4Cjf_DiHGuJp9YPm~3X?T_dpR~suC+3Z&^-MH8FC|-)rT^Ra zf85ml{m5s;b!RIDoId}#X&cs6@my+o1JhrKxZO^GcKhxRQ941vt~5fMa0L_V2WMRa z|DZ0xVPEd#{trePcAz<_dZATo*UvQ-CNT5mPinv1H6Q;|K7H$te>#Zr9nm4qN3ab* z79q{&44+`^I|T>u#?%>IoaNJF8kT@?e{egd*^V#cDSe%HAm?u4FJ7kYjT&nHayT*P z(Y2>3&;Pq0rcf>;%`Z`X*=Ee$+BhBmDR8Quc|82*A9)ON!xN8|H$CuZT7TXR0JZE( zCrA~CU4bM69(FqFKx_HeiJrpxhMnQ&Pi+pdIG-_ewmxGRje30Swh2vr4P`l9e`{KW z@ND*!YxFCwp^_jJOip6ND+1KKo1EN&%Yk>1pLesyw_ki8!;ywTXtfHV;c%yE749`V zidLl^RmC)(563hf7ML~!QD`%WC~3e#ihiXB0ZUJ)iJkPft(c^EAE{HK+-no&0$MBu z$ggrD&dXrq0H3p<0RepGH|#qDe^5^LvnpRy0Gm9Okp1ngRcxc-+bhu)7<)qO!nGvk z9|hgp6m;_f-P_E}V&X2O7Q~Tri1FiDt`B5TP6Cgf1n~8rVb0* zvZ^{PXvu~sv{ExljY8`hHCa$US>Z=lKgDS5LG_k&MX7pAIg^uMZN)gm5=R(1FX9e2d{a1hm#@7=XlnHc zL$=i`W*>7eyy3_&3~{f@YZMAOio6XdQsPE&RB`ThRh?hwssdknaXnwUadW~1M%Jbn=e}jkLJ_I(%*IgCswOXKcQGy{jWCDU+t<6h`~ z_-i&=>VRT5D%{oIexLGU=D+Ns2uo_plSXbct1p3vh~RBkf)<_x^sL$szxQZrR8GQ?T`w&w<>M< z>QU<=UV|xkN?f*{i7fz78=d^tQbwxFPiNe_%HmL~+G$3h~%>?)OyGVjf<2V7b_o;lf7V$5)@h(|W~ z2EM2~C~e>N1u{W>gRs-uoYPB{7S#>jUV`DOv>Dj(ZJeFws(>w#fHr)=d`%0{gf^b8 zf3Itvm5D@Kd}vLpGSz6~C;PP0Dw2_Q*h5c~t@AXNW0_*(l((R7Bce{p=342oN{!k? z7QCx2Qk5#TQR010$~-Vkn9%2BLeJm6T9~w)yX2Z_eVz&#ggLQxw@D%431&j-;%myC zS`U~nMIvp5 zE;h0q%k_TRx`6k{){i$YTQ+U~28<8VydxuSvoftUd;qMDC5-ESK{S0-2&T={4$n74 z3-VO@QdJ047Ady(fedg@lyi!-`}tec=GZ*wkR2F8mAsd6EN2JVMs}9rMr#Lne@xSr z65PB4N_!0Up&ocY1+!|Fkd~~Hl1dp&jJXq~o`DJJ+3iNLELP1#)Srw95u8kd-2)K% z#1pOQt7NSlW!cHQER!`ur+OrO*dr)&C_u$ zd2(^j_I?C%=_h$G<;XZO!X#B2e}`g9I0)}>j>A=@&5)PQHGZn;`h$9}Zkq8&F(bkqHf%;>kE>VGgn23^#kw4dRj0-tfq=MTpe-FSvB_MlB zMawBZa=c-wq^T%@HP$i~TZZy5XZc;#r64ypBWFr|>t@A{h=moMeXZRP@Uhwh8KuPI zzKA<;leBZ%xzj2==d~NKvT37k4i@wzgPX$u%+O1qtM{^F->jgxS@Mgk{)2g8Q1Sy$ zF8M%E)p=G*pmU|FmILW+xYn$iVv0Z9>GvMg@5 z*~5pOt{5z5t!Fz2J#y7=XBQdAZtTly{zgA3`n?kde%7u~ETl^5)y{B=_AUAKE0uSV zkC2ICLcJ|>#XJ5Y-fA5W1tn}2yczcKZ z@Rl%zn2Nx9VMmW3o^7LNvoq@Vzx_ToMGT)8uOn}#PbQ=hR2>Wg2N`By4DQXT5Y(r2CI>>yaBIIK9s zKebY&als_Uh9Bx1vLg>xNe@F=xzDr+=POy+UMql; zYAQLOD%&vV5ps;@#oy#!)>FNy$1F71cqgO2ygWNNyhlfQfgH1-LXgLTqha<=^&>v> z#y|t?aeB7e{>-=20H?QXYrOp_OOc4kQ}j$QC85FLc>8Iof59#dp3-1ZsuVwQFc#I< zBnTxO1a>I2M9GHCc$Sf|y6TmCVGD3`eN66o`96p{h1@~|TO#oKQ(fkWK>GD-fXS-V zHDR&@V#Tg-`mG*U7p=4|upzh8L@NR;GQ-MBU-T@`+Nd34htLaRR8)MhhRzM1+c~LA ztB%A%6CT$Vf9Tt3BriUSo26xZqu%^ZSnK~OCEpaGMEdD2Ul~l|) zbJNX^07t^M%_K9b&wgtd9ft02V!BAQc+H(E%|*h)f1OkaumhRZ+H8ciVUzCsRqGRL zbTEwg!hph93O33mK(vO`Mj2qZQVjmp*y=I@YjY4KLCy4lsCD2l^yDZCBdvwP^HdEE zg-@c9r?op7e_Ac^;_@m=-ZBa0bbnWLKa>v_!UvIJ*Ne?V#*fYp*U?~ub$;t1!gBaI z-lbMnf5;kZ$6CC4&_10SqyD4SWyxn2htDy7ZRONz)YBcv(L7eMX#Ga`w{UyAXYpr# zt^2XJIO7A*we-Qot13l z^SkYXyvWO1T;Ch1cw*&srvXZ~Z9h`BBvb@5e}zm%A5*Af@=EMfy~^*7j+UyQd5$GB z#3gUWbyD?PA3Mmm2knQHR>{*Lc(tkor4EEr-LdizW-(YjBXhQU1L$Y#i~cz%(q*GT z4ucB8uNzd=+6Km4tBjd^*6)A&+r-3#r6_LUaOOC0HNw5W=_-En@A(9FzcGOqkDtyw zfBLYBWKuho-M?@u6q~wsDqc~kI)l^d0vw&3^;WG60ZUL^;Cv}=F0O)Qj&^k$_hM>| zL@esBog)z0AELQW?l+1>qon7x6ID&G>NJm4RrX*og$80u%&{HwRBw={dgDR79SP3{ z>8fvzYX0uZ#z)QC(@lS4os|6XCTn%ge{Sqmc#s;Eg=$sjYzKMrN^A#|KVc4(K$2>} zc8KK1bCQKWNTGhn;NDOiKe;jk@@_N`-Imq!W_iB9b4OWA^r}mxt;SrhcjCV(US-{( z#WroOm}S?aN|&8J+~{4DZb91(3KzX+6g+Exsk}}>JZm^vxu022$y2T{5AOPjf187; z__W`B>Oo${P#8ar;*Az$>Q|C9aUIRi^dOEWUs|ly0P~fU5Zu6b)DOxHj!2K?&6wI|HzyS3g!OBY zk)zsWaRFDCGv>z6mPes-9S(n|e=aqRfnfP~$8o&l(DWcQ4LDe8d=MKSM0l2kA7g07 zzTE15{d!9>6?|&fN<&_mDgW1}krUZIK-qn;NR07=##v*!xNL<6eRz@MzCHAx@qsr@ z-ii;XHnnB9^+QZT?jiGjGp$-VI(mf9e@ErxDH%388g!{vdre)T1U!A!e?N+K*(Svt zW9ZD&kB?0ssdSrpwjbGNJvwPq!P9DSFz!|M;%WQQ2{hC0WN&^hX7U7wg*cHnKclgD z^K<)d&gHp#R5QOcSRTcWSQd<~%@|cgimyhv}d$slT zYf@-#<>OVt+8Tb1j^@2Be`L#JUlssXXx?7FA_lnhR8-v3kV-GLJa!{kE@ykN^38>n zy^rl>{?S)y;+R&8FUdcn8$ZL9-N^*bi{bm(0&rYz=iFL6M;0C|Pc3kkl;+tl+N~^n zyxFAtKIwB!y01w`YIBa2E{T{g_{9VP*YthaLNQ-JfXWMVRzFU3fA2xJGquM|Z!M3G z`Yb_@=5l-a>sR0Z#r#Yu6Q^~DiH!};N(36R+Wf}rNLc0{f8%{w-ep5K>#t97vI~IS z?_8p2EK{+h^i7JimX|^u-pc7O8aJjn3FIE*bWv;$pn1;f@!1O>IYiE{!mFVo?L#Jm z8f7wE0?Yh&JNymle>~$f(Re1?1mXJ2RRt4@NpF@WedfS49L}5Uc$4@+oD%U7=R~vL z?l(8UU{pNOi2J64v*kul6GyxZSCgFm^T2Ox7z_>>W+4+0qQBHu{Gf7u$zt+)1#GnK zYd;T~3rO*7=ms!QR@N}11;Hep__Um8T6SB`BK+cCF+|iFf2CF^1_bFSTcIf9LiI`3 z@9t7%-&-+!0tHKT%dx zFo6R=f8N@eq^2_mgGy~CFGz1@U|db`BEf;#4xuT#C-jE?dgY^UrUJH)<4zBAUe8g3 zo5kn8E#Xg}e~(X+2nZB9!p{eF9WyY~6!6nYVn#ixkt8v|dQU6z>`*?$0ESIkT<{o^ zNFI@UP9$#e@}f^j*82isbGF9OJ)ZsND}592Z}sy#X7(?(Zg{bvcMH<^FGKS73W~S< zU~g)C93)f&NTE$(Wf>X3^G2w z0=P?uf7&!a=1~r>ONB}rn8U401B;hyU*L~}VEUMk0}i{V3u_Ba6JVaao7s>R|k^94-p-y9dz zEQaluM(u0RK4T^;`%D`pat-1W0c~F=?)jJ_f4VUzyreht6V*|0NqgRp*2J;BAYLO& zff)eb+0^EyiYW5S?zUgtcja7MfSi8&BTTmW%vGsF zo5~B=3X$cj_&RCBGx~Xl!9*W_p0lNpe`==)w-zws6q`2iDv=&87-z9ett}1@-VmKy zjt`ej>f-L$mt~PfQa-2==V89d19P}gVh+d0_r{i;GBOJ>dqp|!IdLk@1uaHA?8e5H z+Y6=)Fe87q>6!T3K3EV%0;}Qp0+sr>@Pi%#cl@ z2(4t-3{W^P&hzjF+dxhC+Mm^n9o0Ifr*0v1>`fk-j%sXD_Uoy!a3U{H8fTZ#L>-QP ztd@KAQ3cFcn2uc%j1EalAG9cA*Qa{Q#029-@>`5#RC++bgMtrvyAbixe_lc`@E|VL z5Q_7a!Ghx-&8bKFz9*3>uECC56f0jsIUlum&^jDi06)ej5k4z$ku??-OzlPfpB=f6 zHh1NAp^Di2Tn=UMGK^fkCmzlZ31ty>H{YUvQS)#)V@3VBHjg89?tC7@)d$zHoA*GT|CLY#FJ)W&6AW_dpq4=&%fU~31 z#Tp!Du5Oq;+GTE#c@Et+4x)HplZHr#3(no>3udHq<%|i()RL+If3f3AAA<*5?2uFr z_5ee=JsDZQ93jz`WQaox|Ig z_s-7FPxsdw2{n2We}q`bi7QplGy5HMgOIR7jz_>qNFYb|q)RQQ_>_z%ssKr{rK7o! zmL$gJyG`1zffL_oV%~l)r?Ly;QI~mPkJudZi794AoJ=n8+Ux~2Q027U_pfm%O3ZFA z`<>G>+fI+za=rFK`J2Os7X7Q>Tp3EXf1>KSG~&(S05?;5fAyEkUyt({m*!GxHg>g* zBN)!O$A?Xu!I+FU2)x)r0$^)SvwZ5~4Xsu>hJtI6&dI=Hed1)ctu!6+$~Ya8c&wh{ zb+CD+T)s8RNaMuY{c(3$K@PvlzR)kJQJyF-%CMJRbj)8X@N&7iCut!8`9iig9jN+V z;y7z3VGgcFeVuYBTuyr6X|eQCKUteascJjW@pmrdfWdP#DMLj z41Mj~DO7jfnAf}gYxg`ESEs$y`_>Z1h4|Rs)Li2-f0FL%`sH6K&K#=@z#(Uc$j5|B zV*gIuH4STZ7%BJc8w+kr;Zns0L=;I*?czQKlS&`pj0*lrjJ4aF?iU*&*?P@$vF3@m z$O5Llq{{bt#V<;QdWCS&r|DlxGo!FvI-!XBLxz|_=qUWk3s&b2lCE#b<+foFT!)h~ zlm_93e;L#8Qc0gWo1Qjs;V7tPhI~+DtI$|GCKvscFQ=u5j@^fQV=V-Uz2Z$DHNDVV zd! zOF&x>pd73LK+7qb5&d~RJfuW7WEln)RKpTXe_bf8KnKJqfhRpnzJ*!v?ZbeT;KXoX z<#>?;%P`|x&_X9w1{a42tDNIgqG}3S!iAO$R_JaEs8WLNTUZu}N&P2+zqcTDLtvha z^!^_u6G&pzvPO_d8y*fp9YaT5_3Nz5_{j zqocR~H)R8RCtr>69c%r^?fZ7iSo>b8qKnCVsekuaQ+syUSG|((aW$U7?~tC8kjN zUi(>x$C3v5ardLXh#&Xt&MNLZoby`WY+mdFMJUh^6)LA}z1O~V>scrJR5eL=e}X>_ zGuL@OgAu+-w8dHH%BlqzKOR*N|3YW|yDap3%-~A)b?d;7_`^zrE zmK!GtCvZ0a+OkruJ7oWJci_!a?AwIW=GW9m%}%yYT0|Ulj?OXFXXah3tQGHwww{A2 z!U8X+y6iytOXtkLu259Tgp!y@e}uA$?yoS`sty$bP{|)ca?5wsbruqPkQw;LX$AEmUA(Q zC#-cYuMUF0@{J7&_ybe?Bo9CdQAj7Z;WZ~~FMGb3llS1K(ssp>5W2M+f8*nQw!>EL z-7vCXo&x4UwO0@nvHen~7K0j(tb33uguwdGo*_!#mSSXM?Fgq8tpGDbJeQFJ($~uVq1p1#lvJ^Z@w4{8=A>E{XL^2R?U}ez1()zMIH)f|F@KoG8vvTz z2^%E2qsinp#Ke63q?avNzJmf9Z0$pbS3`?}jH(m5cttyEdZX8>!Y~&*tUGtNv4o}t z-LO;K)ww}rC0WPW0lE!{QamxFpe^v}+^UI1X5~#sB&KLv@+N>EDB1>;jyj93y%@C` zC#Re3y@I;{PYNkJTb|lF3V+rGj)U^JV_>2Trg%*R-j??vtWy&cdm=(#zwV)W^0PrDHSmIHOVS!2KY!?Px~1&R#Dt#m zu&0fgDbIRhL=FOpXmWs5a3(A`H@`jIPm!XftGMdM#YH+7yrPoV!jkifuQtw9k?iuR zxJH~Rc4iCu>U00l$yOHFY8=FFKT1ItF`)Q_4?%n8gg81c^}`TTxAJ+aXfcN2dw(Z0Cs&?~Sh zMloQ)0ERn9D-#nKsS4y1L3T)mQH8T^q=68@i3r6PawZMgs-UvEEpVHgLX1)>AwxDX z0nKsfqt>yX1yUt!{&T4_K6IOK9|<6|&jPtmmP2;~-R>Mk+J6YAB$kOSSTxj&-cYMI zwRucx6@oeLJb)JqaB;7=Hl|%?dW4OE>+j>0-G8tk1j*96O! zr8*lX<`t-faj;)PBi`M!Geyi6pf#|$ z9TrrW6E~LG;HATFn4K{_evMo4o}6w%gaLNSF6PH|-G50{=_FnAK-ZR2mZ?9z(AtEa zX{B2?cz1MkIflWfuLd^%;Ij0+1K(BSfdI(k-anTybeL#sWBlpY!A1zKO;oYx80{+S zS?H#6bM=F}x9?0>xvZ3HOFX>>N8D@bRVjx<6ZwH^O@s8Vj+|71w;LFax}jmhbIRE# zEQ?G81Ai9P(a}NcDa=C|jR%`x+mnnReKpa@zrh3g2riZEXPI_E_JwH;a_xF1hCM zC#{mLdOX4FY|s@E;=Bc08ac*6F=WWs*>ubUaevI>76ZAvBXY;+I>y*78G#YWB>oz} zmMmQPUQNM;O(U6~-~sU;#%9kUr&rnb{1GY{wh-!sgU3Wgki}_OCtcbxUyZZe&B!jH zUmv>EN7=!MK~|VyZ+;@vT6K7o9U9lc$UQuU@Dv@^!~W4=52!WN!xkCOahZgZ{d5uE01plu_{C!9}q!}d$vdaz0rz@Wz{jDLz; zBp}zLJ@cDmd)a|dJ4FIJQea9;MQEXh>nets(Mz}5)i&V+x6zkc=;0~K(T-EbI~f{O zobbDZpJ&@$;()&RKh$4@h@5Px+) zZ1M0oTxH;%-8s6I)_p&C*~ovZ4t$`k&MY3(zL(8wu@G7e4Hy^`G1UGzVzem z?|Ql-O>N=9Qgn3dR{jnsHZhT3xdOzyN2V~+mKw? zzRZ;?x)C;A)U4Po{g7QfIkfR}E-t;-aAB?&I&#$H=u*#)E^!=B)>fY#Fd`2KivnXlONrP)F)BQ<#ag_`v!Cnpf)Ij zd$u)8H4G3NVSUjdDu4K#(3hq7l7$Hwq;gi9>H}S^ZD4xtTXz3s9>Y{1b^4C#&gn|~ zQ7BZ6q{Kiz(T&m3VzY?-se07Oi=Pmbh ze+L(0*%oJN{E{#xly{>&yL>m5(3&XSko3QZ~~QB|*;M?)UZU?f;kz z_WSd(V*1HRk$7t-ckxBfJwKr07Jf_En?(`fb^clk654S56sY)4ho;*agPUEdV!Q~@ zj7sx`wvvZQBhFtO)uq#iKIc&(Qt*dhm+8AL5$kw0aevn$pc>G3s;uWv<7IptJs!j3 zco`oHZR{a~h6`e-ScIulct%)UxaJKxW(OzzmR(pw{~0<&v~!R>IH$Ms2Yrn|1`jm} zQ;JP0GEAbH--`@4A|>2SxIoU_>O8pYOmB4*{k7kL3*GNLc%#r4L_x(Wtn7C_@&UM? z@FRlG?tc;?qd%I>-CR*C3PFE&5M0!+o?SJU6kn3@FKg=ac0m7=rfsYLqSFQ;Y@&2( zlNScOkToc#{Gm}aRn|}3ypBVzjNGWXMr1@DL@Nvn#<93LA}o@KY7B-+JQ(qciU!ku z$rli#fTD5;e2Qr3Z5u_CR8ejat<_i+UMHLy^?!p_oKwyx*F8*)AD2A>v9}ar>=!TG zwqPo(^cA;nzgufJd$2}%ocpR3t1Ee;m~2>hN3QnBAvvd{zBG&;lIFh4Q7X$-^vH2@ zmCLL#N16*hZiybe*K|E5-qg_x*npXn;c5FxJ{Bj#C4b?38l^HX9k-$risun%Z;9l$ z5PuAXf)zdw(4rVD(rj2H1`geO;|*o%P>vdMfpGF9VHUaI)^F0~?&i8fgJBG;;JP_L zL_!9-o1%SleRB1PlkG%tMw)PbV_F0#LUkH@P4K*60W6{uom-7gdaxZ%zt%+y^R?AB zRI>5duP(H9Xf#uGlEEkY)X82slwQ~uZGU36)=xJhPO8R1%+hb`&yPg_c(%Rs^{blk z5ky2;VY5zKH^RCWPy9*Ee_X|NPS`naW=rAD^`E2jdTV zs`&Yz^9;UJ8BRldMo0Axr#cH|54`hWVq#do)0Tp%Ncn;Ar8R(uOlK`K*GqMpTjz9(@6)4YqU%)>sP;vAZe zBUlYq3qRDZ)01QpMAPk-rf=&Aw2jqUp4p>pNx$+yNDn<`e* z(N0xb^E0QIhXT(oqhsPt*WG=LcpJ^dN=~?>XHFDCHLf~HA5aqR`jiq+p`vJIKxQRu z67e$;pFaxT#jPg_50`~gREhj6cf~jDXoH#v7xmm!*(dNz4kzees2L5z(0>Xs1k(ku zjq%GF{>b@izZvnh2;ec2>be2b&!lF;j@KAR6vr!t8E@tk5J>{XMiu`Hmzssi9THSq zT49BIF=6TCiY=q`IwkPfwGxpeqr*v}K)sUF+?nHVp7J=OV%RJ5z5u z4|4y6@o`-L>_g)lMJFq7;1f;s44;lCX!vm_Y+zAq+^i_5H0XU8vVUIWQwq8-_FVbS z)fixluHx||=STr6u%|Ory9vsLh5W_fX@R;W`g;tnjWpt6WkBYV9Wa^SxjqsIUEN}I zv0UXNY>@=)2=QcY%~7V3E*3VmK|!oK_K64muWdml%dO*q& zc*v5E9>;9qBmj-~W4Dl*lkV(!>`<2F7c6A9l6#w|cB4cieSZ?)&X2-7grK_;rZ~4- zY-H{PRAYO`jfuzXg1?sBNr^$;0fBrKYUgj1$X&?+?#EIOYKzuME7hS3CqI|F@)pl3{;krY&A9CR|l)mT6UpQFA&ki zV=K^C`jnWw&q>3NHGB@!ZKT^Z__d5<7qP~b)?P8tbV)6&bJ4s-@U0K6ws?IdD8B-uaB6!gZN;)_uQM z-w9FNmAf+K=Y2VYFaFuW83+z2?PJG?%0@0zgnweImvR^#YQGV2d-g7D!M5ilY6M%;poKThtQowk_kGjI@gCF%TW7Ks~W@^fyxpyGwFsz zo6{CF$u^uacDWH#`<)0byd-J_|6~L>T(*hQlqmnfbZ(ImBOS9MSaw{lRSpdI2w0@r z9)B%{$S_Lz)DThSwoyi>OG*A^$e*2%8zdE_2J>0UMv>>UwBsY;TN*9O3l_`|9xfL5 zC~*^|q0-{jEM8nLSJH-<)j}$*Bv)xRo?^`+$FI#{WD{eV5l&@sCMS(zpRiMrMjJ+( zj&pJKTNA8;g8bwE^N^592hS)+w|a#9Z-0)2ZmSw(3rgyaZ^A6egHQ)DqKXV+K3Lef zmQHQpONyQrhCpVa447C)qRMs4`#2?%ZoB_OUzMg1t@$c)sw7|KnJF;ctD@?=qnb}k z?1n==t$(9WTPJw=X+;{i!J1XnMgvR6nf(%Xg60=n9f*f7-N0ug4y0x2yih9jhkq)S zYCmSCas-vFE$sAiBJ=(jmZ+Ffz0<}G1rNgJUW~j~R!8&nkl8%1IdsD%H7Dd<>Yp`ZjWG)sh-$`YdXz@ee16s1(HVcf7Pumqnfk|R?5ADPCwl<(rj>t zUwRddvaSmHi26Y{;${-)Ol6;&Owl8J>a=jF@v%^e7~7F*CKNuW<$OM~@W+~L@&gRu&7ov=)_wlL|I^hHbe9BuwDZ|CA2 z#gU}@e+B7qS;=ZZn7w=M)noeb@OZp~1*~T@9%Pmyqz1PPEi4JiM&f_Jzb_*4RaMGJoQWFB)u4HlQ%7>l(~@xOm0Qhm$Rw`0+ju^Kjw2W^6x9_8u}~ z3=;649fMe{To*a{Q*2-nV$VEyJlVTWv7oPxZ~S45w{e@pqA|GQ(L>9MPs39$dMx#w zMUTT^c+tC8cX-*8wr>6*qY5AX>=jyc(82Qtz>ofU121TAV1LujcZ8dv8CUZ_)WX#~ z5zRou>Q~Fwc~Z6MWABKzkB_=tOg@Fd9;UJ0yOntis`Z-D?ys^DdpYmROYegfKi&KTmWf$l&+$P^@cgl>Q+@; zJfQ|DWbId+WG~K=#JS9G2rsF^;W*MDQjkPfSFi)+UyD6fG6R!ubzk<>@>2o^cS@M7 z<7WYB^axs^BKjy`6{BAn85ccE=%c#gu9I4uPKr&GHGlm(^pO0}&b{G#47Qn%&B&8R zMgL+fl~t7`GGODaq$hLfJKuJW)dUTj`6G2z{=WDGH-Iycn>-crbpLe!T}_oVr1K># z1x^t3OSgK5PKTKGM?nKs*#s)l+*=Pw>arfRtv;NH!OR76wHElcDR*ey+1(xxa_L@; ziutx#D1X}A{J;8N@w~8@E0ZAfslnoTnWd|Q8sOr5%RzI?64r1Zc*SAtzj=L(82wR+ zckyf~AmakH_6T+Ok$im{5cQl)-o4rXm3#o)Q*(K|52IZ2hYIr@pBqZse^|kClxb^3 z0jj@l?+yUPsd-oNI%03Z!cw(w8%O_A6~*)|Tz_VnBV~H}B=8t{UkD9^YXR)IkS=E| z$M=v=hwXc`M6N79UcS#(~81!zOx)M@ar9m-EH95{it5Tc^e>L|C#I(DxeIzb2W1ZaO^;Hc7nQm@)vOGpq=r&W4@ zi4=48xtK-9ZF1aOI&$w?S*n$|LieM~-|12n)72KxmT3j>NUrDA0E0-QW`9&Nq?I_g6sQ@mq7?7Zl7xv92g#oL;noY! zGhjOrES(PzR%|MWC{lbMX@v^MS`DzkW;W~|BECw@azabi71)@RIz)i8sFpI?)Y2Jk zC`_uwnUcYjQxR)a448iPBZQ+Re^{$v1?w7rikHuF$9Ln!>uFKD1XHGXeA=6YR(~vs z@MO?dPX(B_yFd9{kuQzkMb_8--KI+Uonbu^uEeQg7CuV17{`v|op*qdUw>aCC4QM4 zyq~M}?vZqYvhQ$-EZc@?s!wL9%^cRcniGE{8M(5rJTc}EI+r%0P_3Q7bJdKHL~wMH zC#=L7;+z*Yism>RbA3p8JO!>D3h9#0@ zdtI3KkIxGyZ<2-S2Y+c8>Qb6Xd)uBOla0*MPAXc;!xpDf*4r$wyldr49+Y?#7SQ#k~D_0>pN z+FE0G8FneNr{`*o(J6n6H_$=4TcugI1{&CcF1iSrI<4N$P+2{->=}xSN3k)&HhzGF zkZ|p$87KP}^8gR_0@c1&SVB8>^pICqu2s7m=(lE$wRXwem7~Bq4Dizjc+~|$hU&)lAKqX%C3U} zh06&&F8dbfj*7rE-3^U^f`nlz5+T%_kN}y!Qww@iS;D&k-W4I@`H(p8LAhEGZy1bC z79Qp7SA;0mXa7(%bALPntg2kw+Y$6f2Tu$h9O$tfB+zY{U7=MgwUI(0>xvDYR9B3# z)E{QN;tIWjjpGXlP+HiYE0jYpDCxJ_xujUl6KF#a%HK7=EWudwegaba1XIjV8u?HQ zBaf3WG}*{(det+udxmL#vzb{Ys#VQow7>aWv))c%CekM+ZGVHN5R~2>B;@trv%CW& z%rM|XjB9ZOw3D|{@Z1t(>?^3n^-`ZVof%@|LhB6G0CIPZ+&SMe3I|SocFP*v3k(H* zKMvIwU78z~L626j&Tu15LAB}coiQX68x<9@m=gC7&jr3@LLi}q3AC90)s4@6SViBn zwa$$Wtm(Y`Vt>G~tt~H-rA_AtZ3?ug>|33d0hjExtV#8A^X3KJO5CCNKrMILN7I%E z8jBE}z8T&+v40FSp?S~}=|3XN8QpG=6RXJ3gDfa$Zm&4*`c45p55}FZgPoZpI%Tw; zTYHw55t`JydjRm>B)pr`6&3$#>IPn(5csm)W20f1*?)sgjfpQB;DIi}Sv&U?;snrN zX@fBRMS$!|`C&^p1bA2PSPZ|;yF+iUFbmAsMJiq>v&VR$;~7O9vF%=`fRgrqsM^Rc zgZ;!|=U`srDlm9Y55oNMdFpU79&E$cn}*Da8MeQrl{;rEk^9oQGkeecyV;<+PwsW6 zo2s^#{eN%tTC}-8==wpHKR4<8G4E7NMnkWr+CHJd4?HkTk{zdX+W?a;kwNiDmGu2r z73h1OI4G@O+)O)@_cQ^cWRWI7#Fl9S3v`QYJwhwEX!PU0WpkcZ0JD4O0e3<_hzGY? z0Tc_S6o?HdY?q5*YOWEKF8WuENo7p@JwxMDyni<`pSL8;e>@<*k?M=qSl(Xj{@=5= zEULY;y$mi{0>`oFLDMt{&Wz(}N`xvahR>C52ptAhE8!`{&xvRQ3!)gddWuF=D4xZI z+gI=)DSv4h(kh`Kr;0i`HmIq=i4z5@z55?)|*3@_>4Gd?^x14IrC0er@$ zIW%&-&d&aLpsv^56_LP>)z&-FR?@W$#!lVWnXDF`b33qcYnFp|>Zqj)8x$ zzN5QWkdzR=I9x$nz`kS{F}bYyimW2gTYqy+(I8)vPKVnOWdx%hzcUwl499~X-_L&f z4mP|^g*?h1kjRJSm`)@ogis2UtzdKoOYSXyvCIdm-N5Ky4t_sRqH7Yi=2<}p2w=n4 z3Qr(h2SALQ&x%8vZeCXxpMtOmKC@IUh~~J%K;z7Rz|QK3=&O_vGu$TW&PJ&`{QIICq=p73rz^6%}9ewRjKbzE%TI`p~}5 z?`mvr!6zCExGW0($=2wN8-KR^*A#@9{8@-J^uHb2k3r22=~xnOi_3GUe?2*-y>6&z zJH9=Kq9*o6DQZc6@VxbY>)6THw~%x_h%Zy!b9-KMQ7-m61e`)P-^%?SAm3$BXoy1r zD$;}Un0*2D#DY@?7bZbZCg2nUJLsD3BeItCoDJJmor1X>28JeSOpZwMSUq@n*P6tS=Pt#RaWOgA{HH z7s$Ajms?)m*nj=VVEI=CqJGxIdpu?B%f*A2<~spWfqn7>rhCtFR+g?NgwKnQ2?&^d zSKL{Y403y(z!FR1xid6i)ZYQ>}y(K56`Gl7kIQ?-&!B@3`Yz=;zK=a z{tJK7<)^bX9BJj&sB+*||D|^;M*8n(O<{DIH5&STQ}}x;Y{{m}!>&(xkmz=2+dLsD z&G%qgMQsMoVOfk_(x`l zLLZpW9PTuu^~YjMRyP^?#IwO1NrVy;PSb05Hc-X8q)V? zi6^7RS&C>dVX8vq<8UPZj}}u!!anV?Iy(*Tmw!RSdmaMkqT=G+srYwyDM&4z- z7OZy_uEWKs01^%|BCtnTOXj8rD#M0tnL|&i~TMklm)S?AR4?aBrk;)nb zy8l8>W&fs_gm|w=cbk=G9x|*v7qEC0ZRWguBoW;aH0nak)0SG5JUAA88hTVYo(Peh zSu4Str@I2yLW!nBib`Xp0?wkOH-GI|V_=vo39Z|wGiI<^KvwqlEYkoBk?ivweoGKz z7+(x+Y==GbSH=Z9*Xcq}9?mdX4NbM-HDR$6{RuN~h6K~L517x+JgN((WlD+MC77(U zdF+7C4XE-SfVl#&Q>4~t7wS}!FIZ>snGAViW-G3UNZ^mZF5lMc&Y|Zu*&WFDp;n*0^+o|f0nPcp%AV*ay4fT*;is05Jg7hesO%$nept> z>9sw#2ADSf{F?DM5z5UMzkfY4-&-N3A641MWkQa-fq0okVd+AK(Pk7~SH>Wq)V1j+ zA5YVs!$Ne_7M=y8haNOASxIN9$*5-Aq4&C^ks9Wwf z;UYO6={cM&)$@!6ct~Ai{&J0HlTb!~F>dMrnw#WzD0I_4=&Ax5Uw?v@_~~Ohp3#_X zj%yllUm>)VLH0!8zK9jTv~b)&3r`dxuCV(cHcD!#j3DRE2cx@}Vw%zTX zO;+S3Ega1cHo~1a#dD??kkgNin1aeU`DWPrCA8G5D{8L#)5t)M#xyK%mgNRq zPQA;fO~giutA3%%_nQ^HjzsJ+-zfofw)vu>3@L`)J)=Vgl7H*m1C7M-L3Gg@S!i}% z06D2B5{REqehMlYe>^NSdiBcAY%f_w&(%r%?ky%u@rxVN-5j zgcGrlHQ7D($>_*+59DbsS-v|Nr0CR#lUMtASyZaMf?3&w1Ua1)qq_fk;$9zo!GC?f zz5L6~_Ug?$_6fe9XV@Lo3r z@-cm76CnM5F3;pvDh+;sGIVnCXS^0Ryn(A}pZ|W=Z2>E*eR?EM%#YKythKr5fv&P7 zd(BIa+W9jNN#WouMgPrzBFe6H6*jk={y2S=QlBW>nt$ZfxkA3GE@O zIxkU(W60f=`|m})^n$3#hevkhP^ zWxz0(EOH!AYn3P_>=gWD^trx7vszQ9^G zfp|mQ2&AqlW#og%WRptfQvr7HlHG6KJ^uRA;eXQI(Mk7oSFWlQmD)#S17z1$FOfT$ z6wsa)JvV6{xXQV@zMW?|>;<~)kXlb9#Fv4rFw-7;e-)AD&k!uIlr5P2cG*SFnFW+= zb|7o>#RPO)qau=uDv?Ytw~CUa2yaSif-+9x3dr$`k;SE+f4y1;=Ag&>HnOQcD%L5E zBYz1oNB2ft`2nqo4yjTqsTUjq;J1^Go9q&(TT1+pp48^!spz8X$A?*f+VyngW1JI$ zrABL1Few6{^tk*X?kfsj%4kem|Js{ zA_nx1Hzz)%Zph6!%8xkePO6h*)ciS;+<$ZVx;ZlP`dWEHmIvmiQn_lQnoHjv_adaL znZo5=P+iWOV8W5t~>N9GN5}{!ZT?9DlG6 za3I0)7Ku3&Cs^GxFDrOnGIL|jx{b2cgcM`ym2hFoi@fKz+z(==d%uKcZ{D{b13CDqnNu#|tEwu|BbZnDCh^;BUm^JNcw1G>zNDk{wgh|o`r#eg`A$H>TPOek z>KozGQXm-gUq<@^8{Y*Z(I6(2z&vliQ*{<4pW9+htOo_snjQ&ra{k#^EF6bc1DJM z2MZ>uPU0g{o*D&Eo}L`Agi*y_O~%VNh({uk4g4M;oBiX_czJEjKch4$S$|}13g7!4 zn<`D{`Np|2TCD9ow_Fwuti?q@N{cm8T2N=H>sh>3_hk}9_W}c-rCZY5l&ldB{>`}m zjg{RpZF2bC-jUO+9btb|9_ZE()agYbF8Q#^y_FjUy7J19Q-1gxmSASYyr1y;d5lHn?60N_)56f;F)#c?`kx#t zfx)EmALN7UzMfIX553p<#)1SYr4f^L*Ifh-EQzWOq=Xm{{wm=$lYihBlBD_R-z!m( zGK)CHB~QnCfl*XO49~`l&Gnmy_nF0xp3JOc8D@o{*YNL{ig3p%9yz* z=spY_7M~4ga^dCgoAknXwY0>$k%h1n!>ghvcnNT^OBjv~BpUw$JzIC@iF&{3TdhxGit-|y(=_VNZF@TVRNG30cgF-b zn2tpt36sO}1cpG-;=Frx2Wf?QJMy#>--an`xn_@oe`S4aPoL{*jN=+GML|!@9Yx3s?}}i+uq~$) z5YzQdLqsxzh?9au`u>dR83W1+!H;F&8?kS<5`}IHTjE+VEab67%-HSm(A+SXs8y+d>Jljv_(-I!nKJ3bqk6nxIJaag7Mtl3Dd&nDyJv#|lUBXT~NIOrUw=E#@L z53CssSYv2Du;FWEH1lCs@`~p`N!QGZd>vqV-TRW#&8AYDy315yQ$EZU;8h>Xfe!qp~*o-sGFutX!;D)0oL}?=X1%|JFEB%IhnH?Y(MKPmT z&;pgqXljjxsCy!^cQ%WOe3YEo`<5-Ux9q?87Asydpl z8q=;@8imZfzi34nTvh;~LnLL>n>WX^X|>8W_-3S{3&JaB(tk7j&8fCDVuqSgte;c& zUgj}2qRAOoBg?;(l6WmsNld59gT6jc|NP#1Ir)(hy(V4g8m8tG+zrt{dlU7|FRx9d z=q=h8(~&eQ^gsGm8d5v0`7L)ox?dXZay!c4@0tUwfEQEUuEY;HBxTO}QC~Gbo=h2J z^8wTkWqA!hmw!c9Jz82PH=_%Fly=HG5TSvYV%2S~rdUYkJo)KjGETiFOA()lGZ%A+ zPdQ|XK;Cs!AXQvX3dNx?ZZ@xS44`7cu)G1-!8*%=l?V%*Y*f`dnU7#~bQ!h< zw>3nT=aFX#QX;%Y>#vxfF`3sLWCYOt!eN=gtdWuiGGu&{;q;psmmazYI0b!F_$@Y< zTe=4)e{9!$G5hjY5*^y_xsZB~pS=eZg`eK;*f34$1)0b3KIpNfBGy#r?YJq2h{Lpx zX^<<=Q52bBJ@WRl_No{4yObiOWGdjA*%Orur4F`!Tym)RZFFv@%qksG<;DDP(ZAe?A4he{+1Ywfr8d((Ui|U+tevZ{H#f4U#4O zcnfZ_lY6fPqvYP(D-X=I|HJL8uMS`HXLVtDtgT@f9r&Fw*QOHB{o(e?4~Ji@-d;JAbj4xKGH(PuHY4Rn%w^pwlvbG3=R#8yRLan3h5nW?IwK$)^DGJ`Ka8MhnV(c=%>=f#VrIA_dVNPTqlyMkROel}Z~IPw)l|WVHy^BqJR%3vp!0 z3|510DoZbndymO|zxabP6( z`$<$G7l2tJB(fVK*#uB3wuU1qf6lX`=Ml{9PEk4D{LERoX6`xz!a#rHTgv%<#6z>Q zx&zVH(9j1WIJH;{CI~AZJ(-v1BA_w&Pmpe6VlUC)raICve|n6 zT8WNO#?&RVwzMChK^3*u>LN z>tM+kw8@9Tm#S=tFJ8;o$ORft@p+Bc9h@^={Fpk*r8s1Ds-VomC-$l_IccwgN}YyP zf(Gp^I>lhN=Avxpf0I-pRvbgEafU&u50$ZsIR}2DbD)NKuzeaFqE+^akiPF#7WLJ#s zCC;py>sxr|e?{$us!gmb@~b#CBj1PzDDVVZOf8%89tR9TF@$xSM`h1*dwtE)SeMc@e$lk>M^EYxrSqk5_u&q|hSDRVZ>~I{a1-deR73JRP z&r@x@Y#uub?>i!dt85(pt=c$}-eCIh;M%WHSGV3B1iyR#MwfNK2Ot90mzS5o2Pc2Q zRdr0;-YPjJ;A3s#ev(TIF?KN}$;|mO6SJrioYu!2=WmN`FVPqphg!*`taNNxIZav%owYg0j0PJKt$Ejpo4mC#h& zZZ(PDuiEIrtY9|q(@8)(5`AnlO6h-LbP#5}p^abXou_O8>1_@tFWON63~S=(;x3Zc~)&c?C9WhzIw5@18ps*cy@V{x#VceKSzIMoN_3o zkY|;)oVGa`o164@kc_V^2S-c;g<;QqJQXO>o|7n7S)@7kE<+!o-<0Qh;778q*(ot+$5E>(TFaigrKl-89Kvdzcz{Udaj@w~L; z?1IWP7n*g+HrRXnkM12(UXQ4LZ-+rEnF6cCnMmT^VRuk^Q6`PjSedfT=$bEeY}PwA zOdmHc2QOC%VS0sZaXn}>FnKy(Oz+4xGjD&n4=iwJDb_AT zSE-}4O!AgxU($}%ST<;Vq)GL@bj3arKpW+}_1k6G!hvwQfxWVbU$~vUu9c0TiA5?F z*RPZ;rt{V#A|8e;T^V~OKEYa6V#Z~;133rk&C+nD4$J+{O3~sp)*Z-&miVdlk^EGM ze1ED4@hrg#ixAsE|x zOG|u-uC&jUtHRg@=Cl$DV+?S%SY)S@5l|MJqm0rh_+0azf`0`zY#UC8F@wodz4G4i9zNku1TzZrJXyh5)YC`cegdySC> zDTN^WpYxYYZ~cR4@5#y678d;70U!=8*7nuG68}GL79$R>hFa0}1vpy=TjVrnBh-pE zuD!?tQ2xY}BbaMI|D^1WE4NqnZhZ0l>W8%-)>d!77F`o_^7eoKuos;H#T_C0{hZ|81`tt1`zNo+O!1DE2lEui91(+wp2K%5RrA_`m(0Wm9)HjL zIuu5`k*(K=iCcAuw&ZRS$%9qfHdA50_gOojzsaFgy#-I3ynT1}Yp@!K!IvetV-k-n zeadVjKW8&McF?WxY%%R3NbB(BW<))6a`mF$9lt*TJ~4cG{3b<7cYa_xZ|vk8-No># zt&XuQ``v&KM_vDh>1o#PP5@p&p})PF2ZsjQ<%vXfklVApzq zQO50P>;M;wmx{#)9e-JnIHqSj-2OfhL-l{Vy7~vMzVf6B&i^Y3P^#dxllnB`ZW3$h z!~1!dEbm;OgX%oub5mRbJDL3z^1a7ARAVkLe1YQ_bsB(0csA zrh;}F{(|_W4glJxnMIbCgafw@gHr&)pS}t z=h2}A0p8i_mAHUtb%SDZ*i{@$opki%w$L{dKGV~kebRlyb!6oHyCH&Xq}6jKBS&KjdyxH#7HG1P{ zn-lxoa zh*;u8ldm&87Uvd9rt;s@ROy-Ws2xic=ffK*sg>I#k+-U{ za8>&R)qjdl6|{AGvm^DfrFDd5%CGa9QCA__<`=(4^=Tx>N82DTqT%T>(#C8`v_jtZ zPUGU&I7ma;lY7NpC$>ae03MomslX{PENS1mRBcTFWo5VPtNF1!HslTLUNR=b421nJ66cQ>TQzJC{8 zeCbt^RkWJ?wk#9n0dsFw%CbMCSJhe@Zj#ml!iN71V=+F zvwypF^UiqrjiQ)06;^+-4O=BY_%+Dy;L#KWhdGTz)7dVh1UjOooyh>G1CFs7aJID5 z-;RH}cn&2D|87IBak%~A8>PiJ8No+(iV_^FUt)?8*US@PUyOORaxvZ+JNx^-%nXNY zh=+>sJlqgtBT{~Kt(vW0g>@q2;wfu*P=C3W4n3Bvk!?^aB63rTViiW4PqcnimWpPv zW@aWkT0L|lj$>Jlbj}meIe)fU(vV>LR{Tnb@vwdZH4xOyOwc8b`0Dr-d4JuMpEG=X zgyNGnwPfYTp_Jsa6DpXD^7g0B9-^4&29Q*d?^5lJ8%R2RFe{I?^&eNxrj^>ZvVZad zXR1t}1Bw@&W*c+XqbMg}<3LeluovwXK5a_(lR7iQ2F9$^s?`BqYpRq^?Y6+{M0T0h z;i8Uiap9Z#!Xyg_9h=6rtmU}Lbk<>E@1JE(6zwS0`*HLF>zM8Nj}D}DzqzY_5AJg0 zEt;~oM4q1lH)SnjS|zvqh3}X9dP7p{U<+vZ`&n z@L@^U`ndhyxN&~i_~AD80G+nu-`kcs&+I?ihlPh`oj?|5d93%oL`LwSM;Zrv%iO+k z`*wCYu<({|7jFZbw+t`Vu4vNgm$}LZ8-Jx+&JE$tCr7$#eabKuy>v2>o2fEffee!r zKm+j<9vF`tZDYy$?4>cGlK~^u@W^V=-5_;6sOM*$p5C8udKXK;)qoVElTHsas?PwRv1t}HT{dR6e|+Lz@*MS=i;Tz2%@}&P6A~JK1-~)(ti-NWHo>Vxe!rJ z9dM+*mwLXjWPK%=%YeH|b~8F-PsOw4Oy)4vp}1|^UA0+v5fF;AwD@y88{5Q-gzuwbf)bE@y)YvYGy!m)7Jy$7KYjwSF%Kb*dLwGp39K%sNN zEsot+M6>8PXbf^0x_|c(6a?66_B0R(r${%!D+*o&$PNNXbze;1ytzgLv)@vjRoIcS z`&xBoN1ox@#3md!r;4djM7R4UklkR2mw>60mhzG2QQWk4$HeqHdoQYn2-FOuqiFr$ zGyR1ehT1_<;WS&tj-wlcdbt}&Mhd+HD9e3Q5sW8eeEo(*4wp;L2P}U%C?d`=b{a;{ zVOoxf5acgFM*m>Zt5&buJx%+?r zkBH?T9Us3dyLx;5=1pPoyEAR$nmko8phC*JC+u4NAYp8Lmt?RtlFmu)q^cqR>J}Yk zgB&W5$|o>^!NQE=&0>G-%&=+7ljU7D6$Hi&!N#QHnWlhPE%_XDzdTiYyQ5xs)Sqzo z)rhv$jimuMoA!k46qF{t&@E_vu`;=uzJF_K_adKQnjXbaYHrw&6;AQaJ zUlI3*&3NEJY2Ql0m_tP(6zco45zDNkllWbYrfWOx)Hqm%+=1@yXrIUe4hhmpdyft! zxT7kIF?~oBv=rP|)LsDt24_l_8| zCxm)1>OnVy!2j)4D+uwo-LrvWi;HQn4K(5L=?a|bz9twG87Vkb0ELmEsyc=ontP~N zK-wI=W{nX5%1sqVZfHN6m(f>e35UIwGt^OCraAk^VVnl?%@5;$t=Wg~vb_?CL-ben znFSAT1CUSLyfPRN>`Q&)B#DGz7sjOguJk>uwzQe>PRzsH-oFhXYm{RdSBYnmC%X(u zcpO%tDiLvETgY+$ydArO}C zUpNguQa@SmDOi1a8vRMdit+v%+z%oGRpHi1>ce@&P_pDIrgBC0TJYWgI3t>87@+3ZSQf8mX!^J0X? zF&EVTmrd4irCF~BHWGeI^yg}wh=&JJI68)9AZ9~sZ$YScXZ&UQ7CAjx&|GlZ%k+Oi z+a3!##Z>djL#=IqN&-E*}F$Zu-CRm$_iU;bDgOockMLOGt4`wC`8!l?Um7+tu zO=U)Orh~@KNiJ;MoXIm!3<(_n)t7&4W>}eo0V~*y;@KUgp$TogaRc5dB=@ml8X1o4rpA9#h&y<# zUeSmd^_MOp*A}ql(^7y^)fZIb&7c3wh*L147gMGyNXd^C#ypc|0}Rrl+s3U7taupR z*KsXwiro8Xb!=QQfu2>0ztKPlMOIi8L0>M)YzOf*C!+1IjV1wW^4D@Ij)@*$!yBvm zw^CdlMg=%ihd}Y2flxT)+Aw$ESO*3^z(L zj=UASUioIOp7fXFo#B1zx+utE%Y#9T>hBq zov-&_^^5|l(ecS640{_Ptm}-tR861XibiUb8gNaf#XKfmnXzF)v(!8BwoF|uEhDe$ z3Qp=n3DZ;Qv+2>j>Z)yReG9QzQQ77*QCQ3PH8I;-(lxPw+wO~FaeSFcZ-3GKTNdU% zr7?S&x~bOmUHSTUB13w~v{~y`2o;O#v{ql zTGpg947d9_-S0w&t@tvXr}M?E8&&8^J#&_)47*1?={5F@t&>EYldf2HUzFT)Y$ z@W$+ta+qVW_Vo6WSj`@aPQ*M9+97TpcV=%~jJr2rRLWTxlC8cq_kXlE%e0ylrT*Y7 z^KV6Os}Qslay{+dO5|yP(8~B(HM{wQgo-4$AJ1mXrkPDSyhC`tko#alTopU_LmCZf0)IAs@ykj9%2$~i#RX9gxp`IDBx=UGld6=n zXc7qWTx0@SBm3oBC4V8*rJ{+?QbG=ob=dqkD3<^s{56Tfoc_AHVoC1Z^QnRY$S0#> zHZ@x`w?27p+$f*%sHm8;;HK#m1>&2=sa~mKs?a^0(Nhoe4Z_qUW{S|m2b!3^8KGMK zF}EuL_zab^XI*WN^SuGnLdo=n<<-h(Cv6^e#I-Xy52?3*34geZ=K+y`vs|~DGD)JR zl$A|_iDKbG!pN&4cnxN)=2oe!`F68+8Scu~hcJeM(pZL1CU026cE(RB5j`xewEhB# zupmY`05iLS(=*1qE)<&NBzDEr#e)HL(e=Wc3oK`!p$!h`eLaeG&JXHd0$wF8Q)ljE z;TnuaN81dEiGKy+MqJKfCD$#A6xLr&NzCRmCFjUE^U7~P_Sd@B&f=_0s%`b#z5&If zLoMk&lHs8S&I&RKD$b^>-cH zZAYKSFYyANN7}^Ymq6GDCVx>%Dd-4|1~*i)3F?z6)pe#S0TAEd_9vql(PkFu^UK+- zYx+9H`+sWTQDi4c1`nR7NBVjBZ(${>~b(xA>_WQF{v3FUs%EYkXCVSqTZzl zUp6j3ua)y@oY>Obi4$8B87CuKk9S4(^kV%?ETm>;4o#u(jZt9=r+-7_EA-fhhscZG zu~YSyM8ANUYWk+_uKVbs@f_{8E-cU}0B=wVIO+R`m^ywYH!>AR&dA#8nj-r;pX>CM z+}yb$2&|wCv`&$ps0#WN&MN5&s!hgO_WAhO&ABoLz39h)=cc806hi$f>1IEMVIelT z|GhrmL(j)hLQnNZrGM!yxyaJ(BujZN9mT1{jM81O*JxoS?b2jC77ddT<_AjJIM&7X zWSIt1Q-$0p+Z%YD*x%S2P|HNsZqoDW3Q$R>A}O=d1`W-ra}1iI;B3-L7C1OVry^Sh znYv;0l29;4izXe;Q_^rG^<);NObVBIuM)lo=i9z-ZliRGYJW#_(Qo6Y1L;?;Lxi0e zh|){yBIl#>otr=6JyG_f0reL4YY~+jU)YRu$Bi4j0_VyZSz?sZMiyVLpxNn)!fc+{ z9pbU02cN_nieBC*`7@Q~ZW0Lq z0i2fH1v#?m>1^xz6or=QcYn6`boQKFG|#JYy0l53CPuyd=472w$D-Odl8?B7&LuN2 zi|1VOMt&H!n+A=L0o%dQE(dI4W#@V)0U55?QS9&BZ7EjT`T0;ol~c4;^HXv}IWgMF z`JpQQ!HS1}rU3V_AQz3Pz3gcuCrr(7QLOSkO?j|<>BA7>y49Ui@_jnBLBR81~IbXoQyu(@!&H1!9T1<|_AB zHKl31YFlwBokw88;Jv1bzu24!-ywL1Y)Zgq7O2&jdU8(CVb zR7puHf#7W%k{EDwtefZi$}(9Zxkdr-mD?8k>_Rd(cV;ywSF8>q3EL-}aL;IY?$v?D z6c1fqKzz;{UV-GypBWOOk7RPGPniG6<_{%*0k2I_b=s#32bB+LoQ+W=g^Wl%g(oX^ zj18yDwgm5lq@}YVg&H+X&5buKS8>le~Ksfv{yfqr8s_%>LREr zDz^=(ZJw%*rD2ta!8tefcRZku!G6~|0WqXtj;7zh_G?qhmRMvRHl7T+h`98)v`YSe z0)_FF3uXg7S7ij@uKJEu*A2hEhyP|JKI`Uowtuq*5XXN{6@AVf7c(Tb3oonVJbmt}e(_8e5qXP(Aq%?)Y} z0Yl9S>M)C==fwGe;U2%l;awAR)& z3tGnUC|Z^~&hO?dXc*;QuYOKnG%u4}&EZ)XdLI+FpKdJs{G!J89~utmqC&Xp{>cY1 zyJL1pZOD7$2aK~Ye-wgvgdpjEriDXm;e)Mj8X1T$Rx_193U)Kj1RkJE{Lv+27BYXd zHZl9K1$x*p(XrtF6xS8i8d5Q?hyo>v$y`e=h3g+x06*Z+4E8$vAYHS0|GR z#tBq;oRZak^4Hc(ELk3)y~rFLJ_h^2k$6ee`wy}n=Y3`yRX^_2SN}DC?;QSX{#v1- zI|&<#3R-U$|Bt#aZExbr*8P5eg;98jjLQaxPHrQo&?O8G9fmN4q>UqFNwy0lmC%6a z``hpPuC>P+WRslJ&$<0{u&Qd;u05{3#&>zN28Zh61*!GTmgEwquY6o+Q+Rd3v!NrB zG+XKen1c`7l9yemi@f819JaaW=V zMOWP1*n83yKT(HKii{}m+UQIKd-M_VOwXSpA`_7iF!4)NL*(uu+G30aLZibvOul6T zKS%dxz_2%_F6fvAscst=70x(R6kzT3~*INzbu3T zc1Emc*AmWFXYDoWHlu(VbcK`LzZ}~K(CtqFk&R7>J|7?m1ZKsmfd62m3{;&7<1Ku{ ztB=4?8KeXksQ>)ZAbmQWRsa^nQaZ?xuu6d!yfq&%azY6>4Nfq|&a>VN#KA8;>`gL~ z6!8o=C)6RSCJbyF<5dfw5BPim-T)!NF8MMp&~ICV%_K`#1Lzo@ z!8U8-7Pejvest;Eae=phVL*oi7y!V&G4~zyAH*k$T8D{#hx#Oh6=(QTl!NGimc3{W zX)6!k{?Q@DOVCaM8!Dj;9LlGzql=(2V{Ou`%Y6C;5-x5a@{-Bluzl_%$(_dH%wN33yA)bnB z+Y-{azu6LhT9E71$!_umF$5|J3~w!^|JX$I8{F)L6anrUoKIzO@w&Krag)dh1Q~B2 zR5E;nuaxYP4$ICG7Mv^s3wnv~DI)@kMnE3iMkuw8ZVD^v9hB&FS~QZ2&chnXrHCa- za$$2bh+W>AdJPSBt^mf6APB)4P;x18eGb~{!nxXiJTSs)XxWHO4#5pIIb3Ug59Y<< z&|862{P~25DTt5}sEjJQF(-7lE)W(G8%-19?Fkg1!aah-6|{={&TU4|1R5Tplf@57 zMm#2*f|iO7Hb#!EZVvin^NQ$4I^Afzh?f6KfZNfNP$HdP3I&xujyjDc{@RH;8sGfjaO} zSkjDh{O(+a}5{npr)-is-Zv)f>KLA$-<{v-qxC4l>?XM*>hB5SE z>*}u-{k(&nRpe&B%nX4W448|gBrUN4`_{65;+F;_ zxGDI|@I>MKXy3!2Q&tq!JtolF+hIqSj1&296K0RN9(n z-3e^P0V$^=&tj}}%g|%K0V8J&e1^Uj>4s1Y$RA+fs9X>XC8i1Ik&G!eV^Xm&jDM-& zhQY17`Qm9$pq2PQ{*Cxdk|V``{ok9i9>l1a2I}MZgb>D&(ap&2p=93QL*x}A<@bkN zMNC$yh4=}s$lvp{nUUGFpxp-MCIaoos#c8UFQB1ce%#oMJ^kL`y=G$@&U~ls|GmYc2bB@(gvV^xa_tNp-%K}Vo$B8%&{&OLahLg=Uxh7{xmShJ&G5C`m~25 zBl<(&W}nsnF{^+bgS zIZtssoZkZiLpivMF)C{swI2Y9$-8_cj;vXZK}u{y@ncn0-G-Hak2*?OSgtCgC46pl zh`+Vl*m1u8g8d-Q=?%&#Z>aTYpQb+c@{ z_Peu<)Z6ksqBORyT?2Nx<^#v|bBgB`z2O20!DHDMod(xBi5)0;f!W&Yu^W>)OERr9`{!O6n8nnT`@@B>WcE2oHa45z;JBkAI?~FF^ca zj85p<<3%r|D%#pqsK>Bb95_OwMKDB_Bmt8x1;onoo1o!F15+3m2PPfZA&@sf)fD&5 zHfN|{i@?k->s0tRp+R7Bp%3s# zdzyKmfV3xnDf2~yHb{Hm(uf;mOhHUNQD5g@gmv-sRr;P zGNRPv=NC#+cqyC7;$HTKQQ;I`ggO1E0oJ+fo29gWFJdFs$m+&>uu=XHRdVr1 zqHHv!uT;0Ve}WHYjMO|aU~0=N^eh|XAQk42ureD1Spz#95>mu}Ck@3jYZO@fs`F=N zsEk7-Ehga#;;Vci9F?5&0r>I3R5a3{Es(PIvx9}XW)ybR=fM0|o}(!1mrvMON*Y0Z z^pD?vU9#5ScVktZ_@Q}B5K#i%%)c2Algfu97=qmNr)_;zry>pzHqLT{a9Xiq)? z4c<9Q9?E|F4gIfnB#gM@PSEMFc!~WB3r2}^e6|{S5%GUkH4kzg>0KPr(Ix)|7EUC}l(mZB&qJF-lFn9ORZfa%oybz80l$4{`ML4u-H0wTr- zpmLHz)a8}?Z9~=z99&d|23lH?qA-|Fih(9<-cl@0up5#p0RoN8$-s)0#AEU`X48Ew zHRCP3NtkCzY33|K!VELR1td`n)QCR5_*YY_QnW@NTI<>iZ#W=Cyp>>f+c|uh!g@J;8-kO>;);coOp_FBDAf$0tL!?_(>w{uDp75 z|KYn=Pu@I|7O40Nv|JgtFl=rnC0{&$`Ui$Zm&gUy6Ik<-Y0ONmthOK{xLrVaEKBWb zebD)7tbH1+HAJ>Is&^v!Rx}jqc-uOEITg_c*f&3J@aY$-$js`#P%c&4>SA6$dPojY z&=xHSaAP9s*lG*llKf$kN_u2ZI5kO8mkHce9>TU(!b}EO5uldPg+dVyy&cp&9hD)% zQPD5(nL~Vrwn)PSoGp#GmZ;TWELfZlR*sMYLB^nyy|J~?+HHTUeVjWN1&rT+x41Vt z!<=&=;5XO|J#%6--t>+c<0$pJJvTdUU%ckKg7m4!c@v7?+dr?*Dvj*bo!^oE zi^E@;s9o&`TSSG2hECuYFh5X##?rsxC2W&0E*woa_NcO!?`mi>bkfpLc%Ty9!2%x= zSp{ynAqu7Ao8=X3ulON9475!cPAC;oU5wxHI|WqBVEr;Ou8hxMx{g(%Ta9rD7$&o; ze?^397X=28ETHzswhm|uOxU;wqZOtvUjdNs@MHtp-NDM?d_IA0b}xf}Z^Oy0?>_Z= zpPp&vf2`oTIRiLh2`nUNAa&8iQ+K;jz}Sryodl$&T7WB5VAsYyN2L}Wf%vl)Bw;m} zNI8=ARQ1p?-{u_m0$;xW)UUzmt^a<7>hphqJ^fUlosY-{4J8!3{s6?8Ibu$ z9EE<8a$l<0OHv)6kSnV@3acXo9C8h4vrIiUe}L_;(+v|S!*cw8E|q}0=Z4q4=v6VM z$T){i)d=av_fWY#EZ%r@PA^!{1fbTw6e7$;NK7_Y;6X3 z+!@Kz*SdqtPdwoW05wbbUb+MYFP>S7Y4zOdTbR!ym}$v~60Di?^D@^%FGiAJ0qMdK zCMiJ*Ysh3)DWaa+yhPFa^f2c=I7&Xp0|H`sb_~dxg0k&@#sKy>I|}Bl>SvM;NqoA@ z_&%T`sft?QAXTo)o4@t~2|7Tg;z_QGQEa%6vbkV-d^ct*C9X^3Imuz+K3i!xB?h#h z%*%lRKA@ev)0-b_tfi7_8gg;g5Y$gvj`0x`C!2D3ehijR1ZuDpiv8x|cr~Pwv3CeQ z)q6xc3VpwS0w`Zb8>MCy#?WACa>8srUm3@>vcC^6XCl8@cY;K*ys$R$FINtnw&_3s zi!AYSuT$HO=z;4>WoUubITi9KKErlC--Q~Hc#q3}rm#~AI%#C}V+J_+y^W%BVKOS? zHM!(mNxo%&=F#P-bVmxdKo+E@XBM5YwX=}Tj&YLdZtd*PlMMJ&7O%0jbEpL@ykl$U z<3P!S?`@zhpg3;({BI;}S<-2Rv2&<^{w&5Y;H;3JBA&Xg`?JV)-;9PGsh*_Y2-@?I z3LpW0mm$D}J*!kK@yAt2Ful{Gb(b_=mZq~R7h=np)a-Io`BF+OI(gGUZ$WAc-w3^7 zXzyc;L2!^70u~;e%I1Z4j=HcmgHYM*U(sEF%OJ&iaDO(*Ks4b(;6Cm7&(aa2DT64A zxuyt(am@g=aHfNLHr6rb)af&?(^$Y@IEspY%n!b>23$|yv)o%nMKT9k3sJ}!2qzQ3 zSTz0RSYtd#)VBtPn>mgyobx^SX8}%j3)on%ktg3TUgXWMUc7#_&Hf$ayG_Rl}H~?$|!E2Q$Hwr3$ z<(610!B5w4UAzt=M+{H%&PW+J5RzFBTrXA|0%05r>h8r(b75qYcyJTFNEz(zaa~!7 zmepGXbf5~sGUb8(u~fg_KziZmoq*@1{X;D;Azv+tzoT+>>EYa5l(QwpE8;feGw`}u zNbOjQa37KiCXp#gvz#Qq+n9=Kdk z6)}UxPtsPIDxjWPZC(AtYF_y}-!(OeGv#c~&%>a%L?_}I%BJTKm8m}%z{TYoTydo(iSh2LF0gY`C;H~0nnp`dSw;_To9;67adY4FevzSR<6XCnia-$Qj2L`+)*#?ZG^+8pL8HZK+`Lp? zeT{Zm86=;oHaJOb#D9k6U3DnX13=M<aaPw6R4%UAX~I;#l}u2v%x59 z+Cy86*Ia&SX_omfMoxfFlGRMWl>~T`!B=-Wv#QL^>ZUWg6R4<0lB=lD2Dsl*rn?VD z!z+F=ulPAX&%i973Yvm{y*?W3eabYShAT32myxO{3n@|XZlFIhzBh3Tgt-YTQXa;q zMG6zhldJnpwif23BKZJS-EbgOt02mP=>d~OZ4rYX1gJ?p2Ks*d7=;vw*P(g&gl@R3 ziK&#uoMah5X4`t9@1){PtY5Bx++TpdS*_80KganB%q zRYa*$u8&fCm>`1@UJ)}Yvo+AFAbo>R`)@E$OBPV?=8n*IK-k!fXGg#^$>$g5^6cMu z{}+a;5#SCnzA}z~;K>pfF=nGIOy~u;V=Naw9`P!CFy0 zgVe7BAs%2lN;N>wwD92$=rn@y1k>BlXxrn>3)+t{TjWBB|HwpR0{PCVM=%_wxit4O zS#ZMxO|XC2Sn&@lwth3&DfoA263C<>lcyKEJ{kz78+8(YIzMNRFUZr*H3Y7vmBB19I~n(?DhS$RvqT@!Ec&IIYx0>k9j5^ZucD#! zs1+!^0aB$)&9f~SFT#smB(q8PDD0O9O;<}+&=AZG)86?OAnB%Q0U)r8E%+^L0sP0c z1%BRt(E8;P4_`vbzDd>doi0!6b1q-~g#278Nxx-Pt&W5mNJSOzDsQ*t2sIO1TH zI$&ZxY}?k5QAY^iIZSfMGSduNpVx_mUC*F@oQ2J+^TH<}8%oxL z$~@LZxe%ML4-HcicHk5Nvhai^*?a(hJ4Zf}*P6d9cwo+%F%n@siJrmH=Xmt;HnZq* z0%9ltydSw>!#hu_!#n5aa>^6@LQK62tta{YNysQTCdBmUr)l2pBcO8r0J8jeU_`uT zGk&Z2aUp#vmPUhcXyjw8g&BB=$i=`pi1L)Xaf6MMpR~B)kT&1{xB$OD9qh+{&MWpV z%2kgo3LyMz{!G8C-L_TMOi~$FVS-l=vGoInz_>>Io?G|-pY{a{hmMr6G|l)f;)7m- zue6#gp-Ij~3FFcqN;-O58mriR29Df|w&hZs@97aN1kVwiv32z0bL-H01bC01%s`Bp(4<@)OJv=JpH(N5ZyzZeYm_EED50rlUD(vWp~s z$Ax`?=Vho(d0e=5exQZ>uTRGF?y-3SEVGfOy2=(t0k@58rS(!=HE6p4x+_H<+*E>O)#Il3fC)ghh8y zMBKEocItRCc&8 z2uHUE(Wt$_bv$ejaL0}DeO$9Cq;LA<~nPWBUdA~X5v_TU0zkeqfU zfit=dnQaBg=3C<*zx)0N1eK3hPhm)>w?=ckhFg>?)VsR5i3IH?|H9Ij-y)7;*MfFc9( z;%<7Tb-#W4^Ld+EyN4?ciky7L2Q3I4gU`ThA1 z|461g|K#;QcW?Y~=X~?Ke|Df8I345y^5NKx5X^w-l(Yc3k>|sI2Vm%CElA|{cNJ^$>cgjw^8kGdj6dDs3}wAK zzOW1Qey{`T8y^vhk_vYyD)+b7dpZtu*@{YZ7~ZK1+Az z2`S@lQn$h}Vi;zuZtFE^M>?;0!Ij&}G19poY5&uX^f0|Q#7Ltd)gzr_q-)96-eUOa zp$>Y+{ZklqH0Azq815i&w59QmcR@ads`n?P1`LmV30h?#@lm&fSo&CTuP*5xr zgM*e?S1M`@j-#N(MY_wU@!J{F8;VgqSQQvwN?vrfokB|euVcU{`mRL4`DY}8rRPVBhbcq;+xFQv zgLDDo*O=+PSGU9?qTWK5!041l?)qDPwDeEXZ2p zQbDCtQz>*g!@*m-#bBOClqI@G4v~NwTi;~q(<1{auGpy8Dkzh36cG=?0Fr+!SC1&p6kf2_)aFm-k zkZ=QFXpJ%33=v7Cy3sTgWQESp{yQ-}SrOGmtHFh6npE*wZGQBk;e(!yNvX>`hpB71 z-T@Ye4={_(A#GE7;(;pM#?u_*J21-8)r$`}q1@LhYAnuwO?-lnXNTE7`PVSsC44^> z0jW6i40X|uKAkl`d~*wqyYpMnNK;F=6#^;NK$%t*zRE|e|FBt#p2@FWksP*YEn*Qe{Sgvy z_l5{}zh8BKiq(xyF`g-yMKep#+(SiosI>+Mm&`zQt=6wj2YYb&IMmcbE{0PZr7sJ+ z613I~q*3cdv@WXB&fNLA%Qe>QCK=AOOuR*e`2`_#zuQ@>yNZ@zFJbbj(BPq4MeW8beBV^f1!(nkMNxt6tW(P|b2FP1b0s&=H_kWYCBeNf1ySY?yN2*T;H z0jzU4_ek-uD1dJ)DabA*GZ}0nT4oByT0%se>nJweRdj-GX6Y}eqXHJ=vW;FfIKrW+ zDooISu1tq8UR@;twSrVF4WPe5VXX!4)o)Fle06KY?J_L4i>m1}d+Y1S$kG))2UDsm z^D<&0tH0`G-a*K0D5$1hP&I8ZWF>BcfwLR{&XQocOO8@(2{S+A?w9Oyrf zoS!QXMg7ru6^aT%CQjY`<}AH8b14%=t?c!GHU@j2>YqBcQQxN$mG6T$oW}1@Nh+u{ z`iRpRtHlegU%S$vvAJ}mWrpjJf;ER$0&QMB<-Ui*#p-Ws`<$ouU?7b9oCkfDWhVMB zqfa&}Z$i@peUY)qSb!wPyok%lgZLKSTS{4~DdCc#EPhi5_7cI*t=novb97u)7BQiJ z+7TaIxt&GPXZEscRj+sq)v`XG8AZ_R;HX1>G=+RI_y)l2_KY%W%1Sb9VjfEzS3D-* zaa|Sp<&u%@d0topm<#==v!~e+ zuwevr1J;m2Z6gSOL9M@J3`p{ZZ3j)Vegw6JU;We*F zY2U5xBGsRm^ytKHT#RmgoWX~a&WY*US5J+ItA22}rs$fb{k$h0_vY!N;XqLnyWX85 z+c>0KD8zsbyX?{r=raHif^q5;gzYDbfF?I`o_JsUX&@FI!!KVID-qg+OXLbo(tgcMpgN5U%4~zWN zZ7WFP(B{@Exr=EU1V~Ic*ub1rH?rAS(l2jKmA7bss>5SritW}LOy+4rhKDz7RBx&c zfso>va>U2NA#L8~nScbf8)U778wZh<5D~wcSptDh3^b8IZz~FVVr)f!afo<~&q6p} zD$7iqzMFtdB~=j|9kJIyPo#DmSd@lo?h^dLLS_7jawfi4&}amya`frTiRTTwvgI0Y z@8r7%0I|3aEo`SWA9I5v*KNR_-&R%ABXFvI1w1h-bf|+63SllTqD6sD8pXaTW`0v8 zvs`m#TC_+DV>4WB4_iBb06##$zeBjCkuLPpdwn^3kPflAum{G>TmNRE6RnIu8&EGg zSgpp}@h9-v;}wNpkxy1@Fp2|)UfrLLFkjW+w){A#-E#~F3w3-;7l04byiDzR0o#oE{+nFce};lA7^^6p zz-DgW*I;7ROQ`Hr$wNbUiZuek1M&T-enfLJjdtX%&296&*!Q_sYwhJeT74*q6`20& z&Mwtiqb4Q8#W4^W%?OZ7S{F-%phNNDFGFdGs3RVOwmJ^A;%x?a6y|_}FF&7Y+>H>z zvRcIw6h=O@RzR`^$0OV;f9}XLYO)M?Rie>o8)<;4f(m}74ukpD&Y#`&)7$HJcj3;N zG&%u1^R3R>tpmNqIAA>$5f=m721Xjn>aY(+8x zG_Zo7;JJnQ6|CM``)zgUT01WB!NoYNIt3svPSE#?>WvAvSgzK7>)S6I?IFe?uWP!o z-Bght+HTISQvC?>($OiF3@S$$p;kVND}U6_sO>XH zM!9aJywti21%s+*w(7hvIQ>2l2nVyD8PWuuMyYQ2lgqdif64__=cZ~Dqp{D;zE}v_ zM(t6YcZ7MsSBUQ=mD|0jH*u?qmS&ssrCh7``1{&g5t(t3&7uy(M|=5W>h1)!`=;%? zn_H*kw{I5Kw&^}|*2%8+GB%t-A!J{z`32G-whXFW3QbwkjISK8;s-&?XwffyuQ+bS z&ss+@@R;F{f5HaBs$7fx^q9+ddSY#NMLUcpsyIq*#%arM@)0^@Z=YC7Sy~uIVO8on zCtWw1r~M_BW3^`INk7G*&<>s!jt}ipk;1tZC#ZN!-j;xM6s|aw!l_wWzm7{q4b`vu zl|+?uZNFpYyQAb!G#!r(azw)w^lkzC#Du%nsJ#rIj5N(oOTw%?k#I2h#pTT|!6@#QI=+onV9aPM||-g>uv zQ6?ENv(1MTS6!OhLvfbuX(0;6%KL-PXL6JysnVBo%BJU3c-yP=w4xk4Bnm9*Nv zhv+&2ixCN<*ROzL3qLr-!7SFh8Ygo+e}9Xnwfgo-`U|KNfUQ9J`$k@q5m75#dEO3c>`3#mAB@O1m?80mgugt^Hf4~~z z=`h!vqr-F3;kl>7Sb#fop~KTkIy@D)>!DlvdTE_Xgk69p$f1J;j7Ee7DGxz$9P(y} zC*q*vChbX2Ezt zZU@{D(?Of&!AvW?q-BFk4{9@m|4;6P4YJMYl}CWZdfwF`PkTG|5{c&^e~_pFRNwEX z##IB=EH&&A5)8!WFueyjoX~UR#*M?+w`6sz-_FxMUTOta!*U3uRC}Rbl_+SYbXa^P z4u%!OB1AmCtZ{w7C@=wiCa*jEHmiaFuM!SPM5bxCl_5d9JC8WNWz{+zX6(3?U0jCZ z5aSUR@usar$C zDm|4815y9_6bNBdz{tb^@gsRRFO5xFcp6HoCV_}^2~6nUNzHx8eC((2>pQtiM+}5J z?}^PuNIPLHX3c%)c!Nj#1I$MBP{0>vkX6AA;GZG?!Iq<(-qJ5m^P^@Tt z^|k%jkLw^keT>S4MjQZB30tM-N~8y-RHu>xsz-=hN(D z6X$wmSA$HSFKxgKB_fGkG2IeONt2NwW>!s7hD$_t)kr@|Kbas~ zk_@l5b@Ue|V1%GFv+8HWs*(INuvKteTvKv18|DYhV#%-z;{l*I(4F(*|uMcA|7 zdsM$LlGna1e*|}tUqKW0Jfg$J)&ai#+6vq00YoFY;Tlu7$Q~uHm!7HG5-`8kM;p!n z;r6y_O}DwBkv5vgvP#!YPf(&L^!hTSHaBkA1L73~oxxPrKkgek8Xep+>6-tHThqF* z73SH7Dg|8sK8~&bOrJunTEK9)+SIZIRs);+Kh&bje+eW8a%8-^gCn!jgg;u{>L5dm zb+WWezQcN|r_2#7tIMFQV~)at?6mKsFN3+P@>g4;s&NT1n~c8XR^4QAx;D zc=C`O8gOgtFcKeqCSflzOs#J*)t{l;U(9KU6jd#qSeNM72q1pU?v$XNifj!a@4Q%0 z5l}`ge<}kOtxB=>qgJ<8DHT>OEQU0TRjY1MNzAiN5RK@H8nGdiG~^X9Y!WJ>Fd*g; z6)n!W&mWu%TW!BsZ47%Nja?)#1y)N5ly73sG*uOPSyNrhVE{BdwFsLEt^jeeOq1q6MVdq zy)VhQ&V>iG0Md|mL$kCtBC7~Tt|Y6v)?g(z#E^n>odCv-8AxC?hmWn%BqAy<`(WQm&x?6VcobxX`o1}>QRn-Sp zf6K6zE`$t-An1#=89v!(wq^-wcUj}gC#twRywc1?zGTt1zUr$3C4t~ISWN?30|%st%D%+1t4_osuEzf0Vk!uimNP5FHFz)Swhuze*oo!EMQ!?@}0^)Gb(%H;y@keMn!l*s|~+go2?wL zYO^7oL0=LFMnVM<2S&oCcjHFp@51%IU#luXJ~5|`u3tukG73sTT=(IFOZd0yAV78q z0)+|lW5C}fL4HnaS;tn**1!{a>W(l70N5Af)@)z)t?H=CDVsH2t_QC=f1#yU%j5u! zz_eP%%h^|5TZjLptn1-Yjm4pe9eeFFt-5N{nO|ho8d`z^f1EOhJcQ5E zW%22r`6Z`lK_iT*IfV6FZgh}C+4%4{;!$}>*At82xQj`WQVgXN-HUV@(1t)tEsS)x zglLu3Ep{>N)GcDZ|&td>A?-hrB4LHzrlE&Ewb zL$s{3Wy{*H-C$|k2=w9f z!f~ZA_`GM@$b1EoyvpsB%lS&BLkjN*vH*C;frEEs0%i%uUJx0@f2AZ_$SElrp&Upj zLwGybBi6vTn{Y7&fLp|&^6h56wuT4_SDoDUs{ym3QAmaRt1Vwq=snRK7OL|r%#&}0kg<1S71Iu z?GwH!U}Xi=PPYz-f4=FN9b53m4U#^I)aR%25|jesCmqgCFInKUS_C*d@ZoVdJBwD& z+WIPwO`u3j6Ctz)a>=*hvbS8fEEH>zfP0)(A-WFCRn*AUP!gAs^edp>mODt7s3bBR%@*P2DI_(?f?IQqqyjAlkre?e*h@4E?U;QY>%(h8GqFQ ziV&%*?K&ePbkcjY8u%>-Z;kp!cx9sB7S>?a!*479$>!{*gnh0*;BXk7)jC-WFLs4I zAJQjbpZ~xE!FnVZhyNvtDghv=H@m}Cpw8@WjqDhhGdevahij=#PqCK{*A9&~vS@X; zUrhF}Pb2@Be*!m~dB%0G(x&ddypJz0tH#+(du#i~aBj`i9auh{nfg)MDVnLH8{>8- zGE;|Ff7wheU#K!u`v(Oxb=;;}GxZ~(toy(TRe_yQdYnXDkT9+w`-S92Z7e_;^ zMq#DfT*Z~(K`-moG=*V~-}%psfcZ?pveUV`rKn@=Jv2MJ_8mC0v(qwGna!3+PnPQ_*u<G1iUv*L1_M5RaO zct`eAzgOBzcL>O+?4u>6ObL`V%2aEN_#b^pXrM#Ccvvi!o)T)%xRhSQT=pN`ua~ND zN((2@Ia?jDrSot`u~bmH>q9h_Z}upAf7PDd(GsgsYb+^k{;QZ@#XF&}`2(GzP>q^6 zDh3a^II6Pqo--PB)xE&RPKB&f^saSkyUf}O`+`ALl>S=r%&uw5Hzpf6_~a z)&Ob#ILtS=UY13M?$;Sy%DV+Nw8|w=ZGWlVx>wW0|2OFw|B`}Vl=teE7C@DMRXo;z z{}KinskY-mQ+e4^VsO?KbmeY|1P&`UHASsdDTo(!Ks;6Yb9rGnG&Ql(01H!r+4i9= zt3%28G&rG4o2kXk{}t*fI-LbIe??2_*9G9hdqupF3W$~%bEo>XBJK;`p_!oyF(5WS z5TT_EiBw~$u=x-QmI^@~2o=cAmsBF=0e~op^)!@}8TPRLkVRD2P>Z#yDo-?=;G|UuqJUVs>^Ji)?I5$+^zV1U()pE#P^0jgWkv!Ed~4q(D4qF z4s^y^I=bcGic3as1D&utw4IFamEN~ywE|cPVB6^p;wp-FeI=#xS`D}jxE7ClCviQc z+rFam8)nT-PdXzc=Fb4|h=lmM;G%oMYKzPI3ibe7>0jkl{E|HPf5maO0qnBhG0wH_ z#rS?)Md2M^ndwe6qviW?WrcT0W01-p$K#YPprAXO z@fP3hA+2~0Qvx%a%167gmaTT3+}tKEP0~%mvYxsl>7@B^W|3gEE^MEdAc$< zO|Lh<{qfqpl^+SuEJ#%AvtbShYaZF_yxF)X&->Yz6+yiO+Vya7yxz-)ixJ>F1`0_6 zFxK(<;rh-${y90`UCBTsXY0fzfgVV(TL%60JIBM7$?^L4e=C!d^*bxG!!Gbh*JmT( zKp>wa`jL;p zf5Sj6jY;^G+8lFu0WtZGaGO)T?FP)=@9KS;9)2DSaa6q#CKC^F%w_s;F(H!bK<5_`fx-rUbU8GNR~_T%*4VvS~FhDW$Uz8Y&|V9aJG1`@7w=xZkEsK&JpzL;OK)X~wKs6j zmw1E9epaT7xGbL|<7X~@y@%ishTqwi796vUzT z1zYvuV84sghHV1cxeW@012_T%eb^;5Fa%LX(=n;&YC)$mz=*kb6AUW-JW#{#)(d!6 zaFu7=BFUtAfIjfFo&P+@4i5QQm801G*C6NUe|Uy?0%8g_`7SPG|8XWD__z)~F&#$# zFeH<`ygTg^GON_EKqx5`-4J?3m8|%I$pV0M$n~Sp{)zxE_erZ~oE~&Ne8Fbu*CiP^ ziB*hmX@EwG36-zyq zf208S=W}>O5Y9PF2UO8Kjy86HiQe_mu23YFYvRB_2D-R7((_C>}av$Dv{7tA}0b?da{Y8SWG$XyzR%08xy#s^RK_jJ5~KNy?HEW zzczUWnD)l6B$R~HFSNDX)Sbt>P8H+Ue<6V0WEn!^jQukzCMRy(XHHX`mpvraW|;Xn z$22b{n##a~JqlS`gnG?qMk%5ZCa-J-m?$i2gW$s5%-#0ods$267Ndup*oDv=)kR?2 z)CbVuOTMj8M4)>6w&r?p36Tt5O4u$bNyz3ad-CL z|050iy{oIdu~;vr_^$&vo1R9>@3N+gGaqMUfN4>?q>?TtnBnRWAMR zenQp&dw|^HFX`YEPhO^oLw>A#wvSGOc)^qFA_etL?U7JhsN2=5}&Mq-p&EF#3RY;15^3$o2k3 zGK97S49;t;Bizi7s6i2qwbcN}`8~We<|ot$B3A|+0oNx`*Ko*0FrZ z@~VNFir?TPi7O2oM+Yl@TpwUZaH+}Y#P@o4_ zLVD^8OTVtaYrfOz>vd%_RE;Na63Lc^k2qYH4M7EzJOgOWvw#%&YN5TqbOuAB*?L2$ zpRD(QY*y6*ke+U>-#F*=D)=@wror~WwrOEGH)*M~x(+ADZ9NzKuCgedG z3`!OLvt5S$t|q_2bsV*PoTK<=^5Oc~o5{rrYzzItbbX4BLLl19=MY}k$51=1jE>j4 z3s6s}#MX}}b72MVu3!^P_aU{fA7=eN@byBuiz0F#$X@Gv!^IThe-zTdU@+Sac+Ai8 zDQcZl_M*hUl25ul=!n*TxD8*b#sx~^Jm)rQw{eNoG0An1a3sONZfhi;lb`j5h#8IK zkL1Z}asnCb7swOLW$kG7{1j5Bn@LSFG$w;(3N(Dtm;IpV*l<=ZGZ9}hnTc$Ah|_eZ zp>}EDNQ_1F!H>P{e;}jYzp)1m|DZc=Abi7qBI|^o&@UjM`qW2S*slo#A7?DVz3~Rl zn<;X4AagV+;}x96#5mid|aqK zZpkugv&RUT$?&f)KMhxy8DO+@%FOy>rgG63jX|;lUz1(zH`F;@Z8y;v{4p=|2M_|O z|AE{;XKt3cf9%_U(AY3!87;|jYwx68Z06S2R|E<$aPQGzbs!0l0jny2{%6b{WINdn zJ1N8HC%Afg{AXIh;L6wu*_R9^Py#?PXCsBKxME1D!xaO&;tS0m&7;SEYrps3|E-=# zcImHo6a1w1D19{G&wc2pAd95aQ(i%h*3ZYole8AKkD{@g~$z%AjYd|UX>JuSOH{4;ZH}_6aW|2(yx>Po;#lSwGq9<9E3C^aWQBx z6JDbqyT6Z~@@Uyxq{RH|B#-X~Bn`|NKm7Qv)l}r2t;cuMO*xIm>8;EPy18qwR&Tz)h4e-Plo{jiJiYbj``OJ~(2(8wv-$pJduRQdTQ}doe}A;Q z)_lLSgA7T?lhj$?U3+pTZ$-~0F9o^Pz)Y=3*+kgJAVHO}AT z`>VS*+wWJ;cmBNC+Fe~+y#>zp)}K3D?`ONHeuAw1{qVm&K!4V_)qvux zagz}wu$CbLq?eB5u!^Sb$R^-Q_nmynk= zf6wUFXCl?DrJpV4g}l3s64a85?+VTe=o22L|988MyBfT@-FmcUFZ>3h%89SPOwXVI zAGG#h>!x}ZK>+p~aAWb=t>e!dlUx-lJ+Q##bTXqOuV{A^{$~E(AiJ#&zrX)ZZ3jr6*=Y1F2#B)e1ze-$Z;1Wg=?rF& zrx(LPd)h*xN-0k4@vUk$X>Wlfd+r@5<8*-G_W%>a!XByVT+LT0#Ah@(V1>c9!jnoy z7XEz(I$Zn)mGr~?)scQHfBH#Xvy^EO?FUwwSr_0x`Vzbc{Yh;{AAWuL^bz!+P1kq$ zMdNEj=g=FTN7|+ye0A-D!a+7vkf^P^-DT)79HmFuTvT+#Q;&e`5V z<}5!=IaNkw_4aQ1J3^#SVQM-}-`=&oI6r@TH|d??RPWzP78H`!e<2NZ@E?xR#zrU) z^}$v$CzGf!d#6zI0!Ry7S}26YSrh$IJ`|SJ`nF&>tIdtxEJ-(rn9r0$au`jEK-xmK z5NdQWYT)M}ams?9(@930VvN(C4ZSg<60p`!&6{-agmO}1R^%sekSZ$6P*?7&v8ACm zmeNf8X|)&*Y7?0+e>Q;81~Lb|s#fLVR3$kD#BltyFOnScQ^U2w$1dh;`hD<9Gw+~d z8#nL+x*ZBWVN->cjUB~8I;P-w7&(UsTi)D1Bpa9j>2 z?o%E~3cMIl>spc$szd;+J$)fKB@XzFK(c=|ICykC!Mz5LR7+@0IAxi_RWY|8;JYMw zq*uC-CM}E0f5xDQVQ>?W8H7^9LIFLIsTQgq_d&zO&R5&wk0VD5GD@zJup2GLX^OVr z+PS~}@7-Go+z>vjBe{5if}lp%(>+;UvPvAW2Gy~;l=JhV3g$0#PV1`Z+&Ji*IhVve z(QiBGV*AOB(R<+wHf6^~ENR(n4D@c8(qx6L|IUfrm zASg0^jWhM}ht9M&7{>R&bjLSfwlt?pbX%6P-dY@snOH9N23UpzO#1*g0oDL_}ucOJYxa z$pjoHf5Y-30t6@#5=h84VE+62Jo{3$tGgv|E;DDX_pF(iR(ExEU3cy4v-bug;Eu=@ zoM27F@WzK*xt-yrB|p=<0`rO5yp;ULluqMs%PQv8pIBq3z1TSG^ZxE2w{w5orM^%v zynT92lezzb>hQhR!e7*~rXRTnRIcj9RHr0-e;f{jNFJ-z<1>Dx*rT`-lS{tp>vYOB zBU<&x_?XT)@&ilv1Pc#s-0Pmui&F09iS28aWVyyNrd7eO>EEWG!jGx8nA+}i(c4d- z(Vxe?vu<%K_n8yZ(2(O1ljizI+E-KpWVnUv>U07_S;+OKfRsy+goaY1M-8u-CGl;L11m^; zrFd=1ez`;*Dr*zH?!$Hsl;mtQ-8%}ye=fh%Yy6SMQ-0-EWM{DWdb*kFNO#6l9fW)* zSN5L5e;jifXMK2-d#DlD%I%WGRvzXr>4SPZk?070c-K0=5bee$^uO;f!l}0znX2=P zd$5NUD(!*r5P`cUHVIiTuuUmB7jklaH8k#X?d}5;_D~JAqR68J4)lN;}Y^5*LY|+k~8s%WO@>lQ%Lp%D+>hkDgUA<0_~>A8jqK!`|@&oFaJ~_%74OLJbhDY7Bg_D zIdsyP4Mq&*F8WQRv&$vj+Jr1Gf4QXHlr&Ump!SY4)+gu~GDLVg@boCB=>dbx-WP=r zEIkwoBM3O5vP)q|JgM-3)*K6$HDl0@t6z|pj_oBIxPIFPbkg4UJH+A8dp3mnBS(-< zfNIpdu!z6&Vd!GL+OKA=G;LX>-Ye&`ZGh?Ngo(=&BFW(N9+)n>Osp0he`*uAMUN{r zikgsz()Qb8y9}qwZ-*!d>bmTebf@}~KcFmNusRoP)1@;t2t(S10}QffEVe%M_s@>n ziw{mdV)cmIi2ZPfgvI*+Gy?Am_g7%z^NCw_+l$&fgek!_ti1@o8EE@jXo~!Q1(hFx zU~R&J3qJ=$L5;gOht!Vze^x(>x`j%Sp+NK$FL9FeeuQ{?|NeiiEJD?A@ujcn5AcB- zefVl|y11^Fo_I0Qrw>BE)Uq=)-|44=9=UEIP;1CDpgz3JO0X7_SmxW6_bAE;=F~2f zyuYp?LuV3}B`MX`MMsDOa__I*K2u3@JQa6J%9HkuOKb62=iSYAq%%4Iz7zcu$xDU}~E5Cpod`K_o_g ziFB%4w(LvvZnCfT)-kGfY5Bjd)5ol@q)wD?h2tUT9;F(@HXriH zCD+z?7ru!c_FLbMf15_$tOOW680BpA%xtZ=@waf+)Vh7u`-teg;D_-Og4^_wycA-l zp6#V4l9M$xtp>~avt=l~wFm)E8+ElP{&oj+iO8a!1ZcgM#{0UAU-72KK{#VzSd20= z7^B-1e}mxuib8sV#7}wiedN`51~b!ZeerjsGRYI$<$FFt-gY$Wc2 z-HY=!a|02-Q9(u)x}f_tm!R!;emtTao;nXbOOC` z1x#@=e-@H~l@D$=(Iyl`F3lh?oWi$)U0Au4&gdY>jbP-I@d{-qxJ!}KAsuNuAHzZO zLp*5Y{8&e8(_!%a1rCD_4qI{;KmbvO22rXY|G;FtJzTpzUc232yWKUK#|0z=lK~Na z=3%ZkAp*mNP%1+IZclDjUO&heMrCA4uY;EBf17F#Oz|5y)6a}P>GKlWh36tRiaolA z5PN*-^{%3d2{+)!+X5J&(zub5GEEd&=JxO&e7HoMQOh^n_&zSKCjftVny?>$<5ecj zeuF%h3udwcmUw&ePC+7W!=;?V6mVw;tvz%-StIZhrWG2&S=|bDxAPV@VDn$y9gOyV zfAu%7=ye%Xzat$AqO8ksr_p%OlK5bBZAc0xPOo<2Igy>J#2W6`wUa6}9wJ+|~Xunm<}umEu2=4mHSIyyK2RTNfP607TP zb?z3vw4Bt?3%6`&!_K^6W4Clz76>dTe+i;GhOVx+ze$OO1KIBgz|Pmuufd}XAzLB| zyyzXAt=w&T^1Up2kcp;;TceZaw;qWLDeaoYQ|$#mCLOQ5t54;F`WW(mLjinr_S^bl zdmRGzYJYVE8GF1sSsl0=m=4^Y58PCc4Qwtetg@|wwn7V(^S z{pm}7RjLrutEA9MrDSJ$8!BUpBmq(UfpC=Qgw{po%s2iO4sNIfaihbrlKGk4G#nMs=z^R%9zE`R7xrrp60{oV)qT!at4Y^=jSnC3Qkox~Q(+m#kRe@9;zkH|EX zzPL}a5J>}_kWm>p{R@+{acYjkOmd19LiwH$KiqDDTtUemj@EJlc9Ekkyn0_q?9vh% zi4$E{C`5G8BaERtu-6@D8|B9UZ&xrSg?%62W7A!81ePtezbAa5bzJ5NzQi&GV8xPp z012#M8R(6l*p2n|q$@}@f4zoemuiynT<0zM@=DvPb`K2B*}5xFWW4aK{6u3>{S#cF z|IK<9r7FjROQ^V{FepNxDRwvcs5ae`3>@e?M#4kwPj&$QC(*5KI9*5m{Bp*dTTU@FiZ5--FnfgkXaWGx=`^1>i?qj$gyHol7HGQOVvvp6|pc3 zcd3^6K@Qbi2LsvBATjjshZcQZX%W;EfacgoQIxRjT>2Noe`-jPDvQVck1Sp5vXY}m zlr^b%gh&5)GE@D?>}cyb9M;+xVKB-0NzP>UAFy-U$tV=5sw98`~rgYC0qq=VRT0lB>|Q+0#@SZu-1Sw zA?Q;4CH$Nde}>$hD|X-to$;=nUC9klR^Rsd#huDM&jyR@2RrSP9fZ*%l_4aZ_S?x7eUI|y{%y6M?6eO;t#>N5KD(~g zZG9+}e<7QeJ8_a5^fy;p+wslTqJJ&EAc4`9PqZ$F(A^^%w#^}9q8i3_^EW#yT6SGH zKPEesa}=~xwRU$pKhQHa6EC_n+dTgG<?;m!B(Iz7C?F@zk)6_)Cg6|7Cjrjf1^Lh^(d>$r8MZMwG zP;pp2zZ3*G<~Dw|_40)=0J-@4>8#?lqW>&>O&f}WS&w%&fB2?W$4>>>SLZu@UD$qpe?xawV-XCjPok~re{VF7VgD+7)#}onQ5LQ4j9gyT&sC-KOe#|m(SE)y z%-hNu^Oh~(JmA3trqMQ)QNCZC@@1^7CIdYba#=q}McWns^$udv?YL6|>4y8eeLaRk zDk=C9BP}HM3f8{-k(~ZG^ssjjheD%d-4R~6!sJ&6zwac=dzI{h8^!#~f7VRFTAbwf zwVlBjgk@8HKxxA`V8S$g#*C%+p!S649g-BSy3)m2xqst|I}KvH*=GB9vg8 zF<^k;fwwt2vJNpXnOMlnfB$l^jDznWojAB|rN*VZtQf{uSQ&$Ux%?b$Ygj_LIpO=3 zBL@}~t`;4zvU>Xt^+W#tC@&ykeMcK zfuKkpN9pwE-Tv8xAqg z(Ixcq1Zcuo@ko^@aN2P#z8qIt~S~5lU zJXF^8$`GMfsZ8gysX7?I!i<*{0=PgcjG&m+v23aoPCk{9e=I8=dBuauLXyqXJUck4 zWEgXiP$6`DTA?6yS|f)zT6+7hL4+iCZoSGqt+HA!)VpW(?)OgMqOBGS2@J$vNwO)Us;n>aACaG;)yPZ2v@K7|jJ z`Xb4vjf0EhQyiY5Dq5H-b>VQ#i@+JbS}oAcG(TWif2~y@D`RF2euy{J0P{9B*CU*& zqD_VB|Hq4{d`zz)+L_whG^cB|anp}iwja`F7h_O+3!CvK^+3Q#uECW@tE=TF8m8>_ zzPmA9E-JV(k)apcP^iyZvM|;w_AcH=GLP7dx=fpZ{AI@$Z;BXXbUP z{=H+kIe!c{|L`%CZW()No47Jc*V7C2N39&Pp@wwC79Rs<+D#@&^8+0L5llk@xt&%A zf7ro;#qfgMxOQSynEOx6>(lx3`t;A4*McSgZL?dMyo$KQN&L*|FWYp(MKEhZqg4K% znARr^l6#oeCzQ?qT_mqE&VilxNU3Dyz2tC4_9Y(z3SGT$*K)^i|5+|9}9S z{cOyEz9})4?B3RczsIapQQgVhe^c)PN??hpnlzzSWbGxK4|EFo?0&)3lqe z`@~$0$mAiemKh%yUW+>o-|;s9T<>Wi`kj9<$Q@ZB08H_?hs?X;5(|7#O{KcN{xy`T z#Dpgn1y>v2`WI7=Ei$bbGka-PuZU^>*y26hT*U~QwPNr*eHZ-y9(*a^e}u`7Ubr?) z*o!i#O3^HDm&$h-EaYIAbRMz3?ZrEH2!2D9o;!DB1?%OYci7#dsZOwzq&j%CqEr4C zox`P8`OXdAqt50|ngc9u8!+b4Xh~7O184vYc2+=RNC9GuKL;FINg5`d8cHr>Szng7 zVNXVUiV@#K>IUA~@8C_je>#?Dhj?}@vvC+_L#_c!!MfT^D~7d=nK@`3L%Vzw>!1hS z^E2cf(KoOwthhAb5ZNmls!x;sBc6J_YX~x&vSak7WvO+bl&rMjqoOfRS6mr;VP*V7 zSB4QSSsZp9*GKR4k6s@)Tnu66eKDlP}o*l@X=%h7IIX5<^=BNct7W|WP9sjT?KZsK<#iaoNk!h+v zOgZ#5RxhU7Y0A$|Z!+b>KYYp?(*pixvQRFHRBfOPTQ^-4 zP6x7v)*db_kZk;?f62qy>3@biR;!&vU`yF?KuXqk- z3sD=Y+U%PuZljajAcV|bG9PdEKC#M?W=!1rVB_A_3`cN})s7_};TD{RTSv^KB0WK5 z6R^injr-3fkcxBo+MNPw2B=m&1ON)A`lNlClI`a`e|V)?`ad#s-r}iHA?)}wPr-fL z-AD550MC$10lQnzvHI>ti~WS+tGPQ%OZ&_cRh~||L#L;gasV*!cMYqUE`$xp2Gd>C zGm*SwBBU6Ui6b1ODqNzpnhCz@#@ z5)yUCe+b{oC`U35@`^rzv^u^T0GtU90^*~c9khWR14#ii(%%IHmh~t%u8TKfRv?M> z>iqpa94%Gy3E5o79fBTp#h)Q%dny9|1iZVN9a69n;m1TlE8|l@zj`(vom&8Vs;)$_ zk@|FjqnkOVu#8A+3RVsw#T!Mi+x3yd`;mXSe}t@xr#}KKLa%wy+R7$@bYcjjie6uG3WG$YW)UUFytevS zh@o8pQPA3jglB9Q1vE||^Qd+Nkrn9f@_$#YX9&#!Wz)^7fw1m8m{6~-T05sXyOYZS zgzQNTGyI8$h6Ox7YnbKULc=PHH)8B-JLRvm6X`iNLL2mmWcn@UD$ALnbig!XD^I>8 zN-&hWUOiUpyORv@g^@Vf^9JI<(o*-{bSSC38M)N$FcLx1P~*t%B1u|qmCh#H<$t+l zx=7D~Q4axR%no7_9=9xD7vXL0kz>n+P`GU`BMDv9fQ z`?k~>t}_76l-9jIYJ>A|iEIyS`2buqnzlCf6m9DODnc#{8o1wub|*5WcFE87>R{ED&+i z;I*M5_i?;t1P^X7f(JH&xB9-S>~(6O{6pa6T(Cmgxwz~TLSKLKs{3kLz<-~flZh=h z9~@-tG{UAwW?^t$gR&NljjAGfF1{K8w{yQo?K)4RoF^OnDyo#gF-Ea1Bjw!2n8L()g z1^gnmWvXC&)p}ojuhvY)xqqY|048w$@U>uw!5SEUhc@9+Zr)zg*vm)Ku6+LLyEj{) zPUj_sw4!@#GH7ecQDlh1SFOzkiV7MUYPLbelAlk`(yBqqH3(5nsi6uo^5*5sjqiT~ z5L_a8SFNYj@pK9{?f~}ZD~~N*8w2i~;C{%}g6|5#1mjKdiwMUYbAOkpdGo6Eq3oqB zJHc7XphDhrR`BW53zBo3Ea@$vka{!gg!?bT=55R1E;4iPXz|^)z&I`bD!bxGQea(35XRVR6I zlxf;uj7GmsZVmds_J3}jkEY1g{GKTgrB_U$0;UsfIy=HWR(Ffo53<`OMg`&$Q>$4n zid$$CFuQc1ZZUHlSoq#}f;27r*zZgRf7D|kYxphXIXDOD9<*=$7qqSb!ax=UAT|J` z^nviy{mxVJ-a1RZa2CKg0Gu6xnXRpxt$v-NtJdSj;#;H?*nj6A`1h){F@xt=TGB<* z?SShT&u27<5`_a8Fj1zk1J4(hkqoO#VM4{%42}+B$J4gp;c~fA zC^yP-YZr76cwi<91J`HP`-AX4+#Ul+*V;lKr={@-OjfoJ_$_oCY9VxdFLs>a%4Ns* zQpeG;Y3vwM4}a#4?RTcL8it&OsT@wg+_8K%^{-mfl0N!Yo*_^(oLHeW(FM$n;yeb9 z58onVdjG2RvH4s8*@o5x?g@`cd!&|v8Q?5806yLmNQC|X2|WT0E=dqDArsp-Usl4I z3Z4x|in7Yaf3!hhl(V9=f2RfET>+=@ZFMOwT} zp+~@M>)ATtN-J6g)=xGIKZaRd7z8#5gAKi&W^J=cn98|}qs4g3O^C7U#Q2Ff+6z<{ zaU)f9FujhhJIM5dt6pcsOkW#v`dgo6W#knBmetP{?oQNL_B~1Uo^3&f2R?GE7f1oK zN|`-n6@S#0Cm_1k_qBruEQ_4gpB}y0+Is!!)8^9`Paki6+Isrq*2ecwHyU`C6(3@* z>0(&di1{YklW?$p{ru^RC!0^Vc!XpHbLAw3>|@7uJW^%yxSG>L-y7^hXSbd7#awQTCs+XVc7M>QrD278P1&ssvk!hLkr)5NM~7^$BEf2DfarfGk@7w1{@L+I+~=&bOKnb0F%E|X|lbsqkdS5 zCkCs7%3nz0Pn@e<8Ah-8-Kxrb?N_J3l7o>8)S~Hwl@9?5{*)>CTStFd*B+hB=$at1 z&+gjXZd59zX`%J8x(fx5QhL$)JW;Svk4U>rI5!$*~>>m&uVt>&y zXi{l-P#w%ape4^wb4x%)q$MHKWkwjjEJqc?965@%9knG2d8vOWpTP*QDHcJTWl7Vq z2pNPLb8zPSy>}qOdcHG94E(!;ndVnBQIHk*NDnNwG-ZK(sZUF#Jt);a2qtU}`{!C5 zP@-rdmGPn-p;8`nG9iLM0!h$234cD0%tUAP0SFN50j<$gqFp4PX11%0cw6xSNp^#U z16V1_=4xHZY;g3awvuol$gu~+l@q(cOQh&`|eNq{C)XqZhu7lJbneh zO8YzkpR@tjeBKN{YCiAX&Ajq;eXGywj3-i9h6n^hNX?)_c7rvyoD`@&W!uVu-bMy$qT~V zvf*)b!`1>bjbA?YB+i&dt>F+Y1QTl;8VtnhgG979;K!6^IP&_N!%-njl_HZ2mTz{W*EH!7u<|GZh zZa>KH10N24P1@*F!KC8SdOoR4N*t+>M1&&v+4{7G`YJ66)^LG7!chiE|KV_Zxp#M* z7xX)KlzMd9xfI->my`B`-v1ELK^%zN?}y<4d=NURnS{6$H55g*g^B=|^Ij z?p;|D7U3lXq6A*+$bV{8IKrE*;dj9yfLZi3{Q;w%>W(S^u{egA z7ZS`Ov~XyJv}S09bS!Lq6WR~Dvbayl@kWAoD&hL!ur5}_gfnQrL2Kd8Vt`*rc;Z>4 zyck7U_3e2MHaxvu-cCqPRkZ0j$Wjg-g-L_UeVE<<4wED`>VLI^Zm7>c{RFy;a%;=A&8=grrDKh4jtxUJQq5tTQom3!a}n0peBA+$z8C8UPE(YzFqh#-&g!`wKHq zscFo#L@?M(&M~4uC>2`=&@v|cO!f?m&MHLR4ah0PsPg+vE(ao!ztvO$z7NBdtz9J4 z%*aM`4YZbQo)VqWpfIzaz7P{UR?dBD-Y2!9RQLbr-gDZv$rt^|@!2@aW? zihF3IPbBi8YEr>688IjbZjY*7C~|%aTwv_>H3{MHP3PUDo;T{7fw$>K||BlMn=8hBiW|H zI{hNH-G9(#`02;KgmX~^k9}Tg0o0+zN0mEr#-bQV%|%S;6(Dk96J(e!^%Hl@x{O@| zpsmueE+G+ZI-+(-%KAEXR8my zISuze^7IS$>Aohn*DPsUVu58tG3lQqal6%T>i|L#3pjAe;C8F)_oQ~a35QX=i5A+e zvES0>Ev}hUFV4V<1aB>;EJVsFn!u>uzYMbxxJxLLVmK#T_RPp+I*$G=TiU} z2SD_~$I^?UMitUvck{g2{SNc&IX4gXyMLdp%HY>?8f{Rw?fyFqJB%5;IEN0khh%KH zGu4apwZTJJ3#JbVJ^R)2-s))Ougl}r!OGv3r}+0SPG&gX<5b9A6d7wh4~yh>Q7J9B zIf%;CxbCxiAHN#k`^b=YTt4I_ug-DvTyLJ^<~eR+i~k^2%M61q9|}TkkmvGey?-H4 zKKnqaouD)iI5``_sBQ^pTrBE*k4cZaq#yOJI%F$<9aP7!XryULc zHt+gXu>8~21WWq1@o~a0-PuUNFE8=HFh*Oicj~u+Mk?2v(_NI4v>1{sQT#{<24t9-2V}fBR@|LYMg}h~R3dtj`;w)qUl1P@XfNmJ@)T z4FP1uOiGMUfAR*Yrw;*4zB}rU5gbDNtAU}j5+9iCJS?N5u?Aaj0Es{lw`T?}Hx{0W z)|x(1ixX%v%dfS;4&GU>cM{s|ufzyQX?8P2 zfZ8LudL6J605={|4b6WQ7k4g*tqu7M5L+MVDlljjCwDINt_}JO=-tNARu|E^cn5hD z9P;N61ONQv5kGMXn>d7Qr8QVi`AEZqIcS#>hj=zRJiG=lv!j_s>wmZ<+LJl&-A9r6 zP@0rFY)QYIjdroC)I#8!xuCJY74*WEbXd(aUJVaryMIG^wzfYyw#4ZX7em)KS9+78 zpo+O-I+sT3alZsIXLX1jp|kZ&3}t`bh@E_6fLvL&4w9QXDJ%9Ewz>dKc_R?4Txnd~ z8fT*KG?yUQ4Zag_vVSBQfhWJkj|omq0JA^1F$9Pg+#O6UxJ$1aiiqCO%gB!z;J@%^ zKoah~v)9wJ39Oq@Usrh)E8t)rZt!eQ{gv%JXFOVgMm3f#R4|6S+f=Rrc6LE`VsmBd z=#HEw>a9^NS%(~nJOrfcLIV+q*1RTh`yww^gMJET^ZNVJhJX6O2~;~*t{QCrF~+>A z%FTn6S9?Qt!HP<(;RR2^cZEFLP0Ce2CrU!1EFaSeSgcBM9yG57_@%^@G!Y4T#+(S( z1x*Litwgj&{A`5`EeZT2WuFSlvUzKhlOq0bRRxYrH*z&JPPitkW}~=%%^BQJ^PHB}iNre)L%y2Aq){yhAsb z&bg_G07zfaP+z}c{8&w#Eg8sy#V8-=>??HWT|j?45L`nG>15_``~}E%mBuVB!4F{0 z^Lcj&()f3#_lfG7&F@OeAJ-Y%KI+a<~yD*XMZL8+DSpRki-Vsy014f*+t+i zQoI7ORRT!Rs&#d&fP)E^9sOf06Hjf%8iWsULpUW9Kh*NghAZAJJex4z?$dv4zjR)uhmH6EOrkH?0#7g`UuK-XkK;|d1vA-c zNI}SIX6?p}dbvUN6lx)E82BC*#LENzW(O~saerac#Nl(wh?zM1_=w!pUTM>c0?B+r zD&@soeEA$|@3~6FE(;c)?b7A%68MeJHrtY)am4Xsv`9I^pAkRcJxZ5^M3fq#1S`FM(!pr?kXh}=9YS5S{5)2>WW=d#MY z(Lu(#P*Z271bG>2iQ`+>bkuUJH7XYD_0LIq5sb|)hKE}X5_>fBSKg3&zfH)Wt1JKk z3T?^(l2y(Jk@*a7VdUj(uuwQo=aIszA%y=F;(>YTln1Ps@HDOd+#iM^-jo~fPKHdPZIH8*&%V?%WW}Q$(a)+dA zBg6chi8FeWi#t^C+~P+t=MHGnv@+>b;}M^&&bxPQZ<78MH^ z1Gy-)_PXI#%$9@>4Z?a<6SMR@0oAUGJXzaNk#q#$nxk9eDQoc8bDO4{QhJ}()V%Y} zIBqL(^A^LmO`9AJp#oQ%d-p!`R3`Y&+<2iPE$}sspw^+b3XLSh@-Yt+rs@C$YOZa((dFk=7jNzSBaquKChp^Rs1ewqE{4^8s&V*b#*C@gq2 z1Kwv1VBHdS6A1feagl~BKLJX0Y7_XphMhBwo~tNgt-+|;u*sq8EKd=BPE?h%xe-+q zR6y#^M$^5c6r|iB);dVO2K^_sm&EWjnDvTw-#`)H)V0tz9C+6cWPf9qZm32M&6P3r zbNcA9hbX`Gk0XN{n zZ;(>YxN&H&AkKmal}dx&#}lY{B9lH}(AT#dr7v>czm1LmEG@$gG#N?bHZNhrpK-SR z(aikeV6+P?VBVq2+JBS&1j*rL3}1B5p%GqR7Z&qn_r(0XzMfCszowg)C)c(>AXlPD zcc4+GzXW(exCijxt|6eT-Nq}U&U@o+8@;AN%6F+TD+?d>faKE$Herg>pwwHIv1iop zBb`2_C4W#@AJHP9pcZFGNMvd$F1(q9dChMkKDl+>h~n&^&wo#p5pGW%;FV;Kne-i? zIJd%l1qzR!#x^2=!y`8$39P&i8%%Q#6V%7f@&m1@u^edJwH*}~KRotXlfJ?4+|oyD zUB7F&3x4-TwPCo3&@>7U?5^CP|f)ngwZxO>FXqB!WIr0Xgr z#V^N6*Ln}e*19kOG=cY`FY_%I1V{91+5tLp{UnY{&E`8`YZro>9zv5J2(=}`ZT>*; zkc<_6`t&aWm2Z5g)?jtF@@acdGs!|zOVrC+(1wVMDB~!rOU&t#9@{guSFb}+XtCV zyN%#>ff0L0d2a3Yaq}aR@RLCI8i<1pbmyNir#I6X)N#b>8y~L&w7T&D4lNuZYqt-% zyrcyg!haZnHEwDfs-BjOW_v9zlE=kD=oGoSorcYmSo0g!G}$n^fc!u&lNL9XgT zV!XW*={!y@4v*t;`#p?{9JAEo%ck-TswH+zIal6258)&~5~!acPS?@BcOih8!IUq$ zuvQ_$4>Uo?sf{=lo)BC*y2uo|ZBac5V3x~CoPUa7jT?O(L>x_3z^lw_(o?@WUj%Z{ zlM*or5;O)-cBM!6ulFD%TofzrvAf{1Ubbfs z1C36=)?(*xE~pYzhQLlf3ky)R#4o2H6?f_*;Q~~SC@;b-#LaL|w}u3|sXZ*u z5demyc%!Hb8IL}m!;Om`du^s|!Ll34vWv}JL{WrMY?_D_Q1>3T1jKxPO{6 zB$YSwC6zZ>QVCAt*U27rSL;$&m&F6~$4mnm6Fd_nv&uimzGT)JugiUNG4hGcY&4xt zj8Cug%SD}$RmQkdtH}49eVFAy)><^t)7gr%*5wJ23SpI^2O9MU#^;F&1Z>Wm3vgBc z(38LBvLTMNW*V^EAWDM-6LF?rUVo5eng%3i!-*W2{AlL6BEvr#>OfhYIUFN~&7wc^ zkI6XLJR#xSm``S8RPd9zFDEl0UDL@dKm25_9jbHA(DKOqW)2Z+9JOW=Rt$#cV0@E_ zPh(XTQd87%Lqby}8eJh8eGrYV5RLxK9E^aK2#IYj(#H3LP~0H;%Yf43YJcSle2Y*; zk_z)U_n-D2Ho$Xxwc^#|HM-i@e@iVFJI0m!U4%d$(#=_DNg>=M2RbZqD)b2S$)L!S zE)tJ~WuMX?mDxcIWH&vflV|cG6zTzQ@0w)hB*T9@-VXC;31n~eg@DO_#c=Z6nH$y& zTBl&ZrN>sa_XI#eN7SjxpMR9jbE#?~r=f##CcW$(kAO~;tpkv@wDZ`ysH!Mb0|KE5 z0v+p5^oxSdSS=RXBN)u69X!R1kNe2$$E)Qk-cI5 zz9FpP3o)qVHA@v6;)Sd6L|!X=V8wk+R$GWvvZ21RRTzzXK12DQ0Dnd(@~X>U%;IIC zPBOJ7b-~SDf}U~%T!%d!>VqUlCmr7qYr>XWRPGE?QToKB*K@Tl3zy0tt1_(NSScue z!yLpCo>xh{^|K=3dUL#pfwHp929W%>=0*kE(Dkb?%{R^i+PH^Mg~{2*u#e0yI1;`l zE@ZMSG`HF}FV?}@8GjTErJJWN>gu=<@6zPgRG#WJqEy{%EJ|m#`Ges`5gCuUu?=r@QgV;POy!%rRN9f_4xqk-BE}m_cPcRN-<0$Tl ztJv8xxOHg&CYa|%Y@8aTb_RUgk=s~x;)^Jt!#kOKr>>> zb$l4FiSeb2a7+fb^*O_rbk*#b=Y9F=i>gom2#o`R#%SA%09avdfoWGXbcAPIH3it- zIx^4HMg%~27Jm{08ED??gbVP;(<9Dn5eUua0t48 zE{ao%(2V}oQyA*-ww%E6Shs^S7CQb4_hm)A5pjr(C{w00z>_RW&D%RF zQ7T{bXWZL0S*b`O3R!8-W;36;H5H5HS9TSPCkL%awOddKsCOPFV1}mUhxwY89~w0+ zU?Fc{>zx(aUemM8wv^7$w={IDVzG?1m9|Tn)qkXPF$z*wzchWKriBR@Bf$VTTN_j8 zWZhbk?0MI|NB^)FW?TX8KvaU5?)OdRQP@89r>R@!BIOX&US%`N5Wm9A++c!!rUQY? zCl>+-RRUIclNf9mS>HzQM(2+@J=9uVJq>cH#V8dbjo7VzpSF=Z+1Mr9GlO-gC zyMKJFlgcEjdQa0NzDZ9)M*nA}72}*HQ;Zk>W&rLt%*ddyI>7S zf0{$fjjMSLM&n>G`cO1Ns5W6~oh*knQh(F7rzP#=`iI#%^rEJMT!(rJ_4h1Q7TC2W z8hz7L?L(p=Hqqke`;P@XWDE+N)QK=erZGLA!hR^&Q?M!9@Xx9vVZz>R{e0(gc(r=x z^17l|Kbs0-_)IZV1^$EqMpQV=L`+oxN~4^s9YX@SO_Z5w6PLeQ0*(28ypnv-t zo)DeN3+73#>2&U*_Uz|dWcsuk#`_MK?BDRMFZF3WOTr_F_FZ9Df)lY(hi?=c;@5py zz!xV8)~NLsP-4V$9v8yrrN(0o?5Y>T^@Hgd%yOVAvc}-Wc60ceHv} z6+V+@44+x0IRVQ`MO4Kh7qYqtjeh{z*z(1RLHAZl3k?~A(SF}!h#KPk&X*TgS0|E> zc(*%Vm0VNAMcY|gdb$1FVMGWuo2%sxETH(zzO{7BN z%pttrLeHOI3*Q?u3OJd^?!dmT#M}oQ<$xuOZ#~^u{s!HX31~0NpB7mxrhjadY^^N5 z{>A^ayK8vYS{5L-k;5#shmoE#UiRYB66TEQD%486Fg{vZk`X9JvdpHVUL@=xr)z|&9#p8A=-@Ja@JN;k(zBA=ylj1HoTw@%JNrheVXFS7TeN`ALxKm zfo;`0S0^8TZd|P43;KfIm|0$Qy0cd{$zz`{H*XE>3pu26#xvOo%h>&3%KQzS=yc#w zR9@n%1NvGRCT0ehF$o04hxajF>j4DD@cAJVH@Fa&CbX1eW6J=>Y3y_ zGC5AF*X{07++egvBTD9Hzc~SpG10mop;B3s?O|(z?(9zo0JDH&&Gh8?!K=}$-iH@> zmst6#`uh%{(SrXgMS!Z>8&069cs}f(^}7S9>9Hy=_5p;NFbKOmmO3~DY3AX{#73%$ ze7wfi_4cb#1*u3npntLk+Jg#sYCO|`g?x1Rfx?_qwHD`sUZkLX%j8M9n2QEEMcl4ILMugT!K@Bqkre;P*EMsl z;V}{pSEj0o>qNB4bd66$7vBe`n$AkNI-R}qjP*_w;~AM=+DnQXQGapR6MwUaP0)PjysPyrrV2m z?o5zu5wGG(KB1SIA(7as7-j&bDueEqL`mf+7sEPxC>sW@K3MeuY8sU4K*Y{Bbr=S3 zPZje7Vtq~WkwqKOEvb`w%s-FCIeRAu^c}YjRbK?fFn<^Lt_U+vAyw6n|f~T<%UbK)K!>-^yCI_VQNiqoAvyh0o=*`N%U< z$8rrG8-H7^A3gO7+y`XjKC|O92fFHp@rLa{m*1evZyLI6pHVaxkF0H_9PP_*T2I&& z_{zPhH+p6(enXFDY^D4HO+5SaI+#EA&lVEu zJ(SJ!jcli%u${iK?R3#OqvDO1FFXBb^n~f*@qbHuJVE+bKF9GkfPF)?=z%ummY`9- zPO9`F7ed#-M_sMKd7$3|W<6@2)dR#tKzAYG3v9^OkURO#7igFyd&xRITFc`Pg-sflN zhktZ-nYow-J&-)Hi^L{_glaec!A{rOn)Eh5@-ehG+FTCgPc3P&6n1BF41n)ESa%t)D@}@Rw*xC(@ z%s|=lc=S_@hDLI+RXMY{p#mVf4b~wjbcRCzLoexcF!Rq12R4qsR zgA{^TDGr{5#R407aX9YDZk}R!?%8(T@8C_jI*@0_cm^wm+&S#*+OwzfY!lC(+HQK> zw3!g0BPmdtHqvIpM&e<9zP#IdiWRaGJ~qHE;wF%FAzR>au>$iLysX!Iip-go)qmgtx>qDuL8j6hQ(NxYt+i8an$t5OpN)W zPzf}@a`jml8`9d(frR^m(0`UrhZMimP32!l`Ymb8x@X3KjU>nHmo5Os!|1`HiR=m^ zvyhHF|B@lu@O|I}CBWL!lJX0cw=$5v&Ghm(Y}NI9&{!i<29}{2Z8T>}E3MX+`7bEy zS^zzgf^kWj16*7R=y*oDXaco_Q>lYu%mLw`EsU-K$*iZLx;UtbUVqj{TJB7+LI)ZP z&=fO!GH^VH4N-eK^HIc6$~aHgjE*8X$#ZuL}40Ys4yQ$12lP_ET41s%6~R&BW`eo^(hKfS)V3n z3jq{!{Db+psSyN}9$V$G#6bNx{MCoa-8L~|%a=kH0+}dC-pr9FCe{54*+}D-Xoqj~ z%5&f8Ewa6pXB_jEtb%F_ilu?7b??@y*4vF>o4*TaE(xa~4>2QoZyn-EpahHU;kphd zi4wAU`n5>D2Y)L0ia_%>$h@tS%8e`p|8tJRm5c=iT$;abDBJ2gNs9GD4)Q2`%MA@m z?Z$1GDOi03b5(rhrxz|V7S2&3WsW*~CT~tV2b4EA4a zrsCL!J}Js8YT(u#3?G(^=?A5D_ow z+@(bb08AQ^LtPdIdmu^@yT+Q?sTwQuqS?KvJy3rb$&e+lxnT~P0ZDvPq zYB2|zFMpVs8*RzLP6?mDWM-@@aLmG3?kR7jnHM?1Qk8)}P|1(gW0Ld`a4t2c3QKU3fjVWP1nD-_v}(d@%PM zMHx6uEt3JqzYj2wK@MURp1PU+#>(ijAlUw%|%1z2l?VF$|_nj^aySy<6F zD4wM=BWr2ZXCfUI(QjT(2)hBZpwkY!!*;f^296L_RSg^()WwGhxeyuk|Ht09Ftv4T z>HZZ%JRT7?j(w(1-8;hDDuRh2PEO*0v5AW!l8`{h62cO)g)#sAe&6cV-K+OQfb*!S zJAX-4jCObL-u+m;UcDaL0+&xR z8`&O)w`)FhqUymti)l}SdT#?mf33zH=t{7Za_Ef z&@sQU$!netZ+U=+aU+cdCr-qrj!`83dQ?&*;@+rzJ{>S=c2SoYlb`zVf7Bp;9}~uI z#+Oq?VXsr`An|?7*4gXOoyO@0OCkLKf@GYEVC_ec!lRBmjVQTJHtYFzv?&rA`t2-5(S4?$*#UEB&z8= zIYXB~lyS)h`s3Eoqm3PVMP68%Lx067#3Y^7xfX64LD_buv6HK{q*i<6&r@L}jQ{we zZQV&>ZCUTd9;Yj)UKMceZ85|wyhL}IRGD1u!E`%7GOA>!Np3lu*@UI<1l(f}Ak@R> z5vk8uH&%nsLTCL2?=cvI$Sma;p_LO-0FqENhTFl&5^*>7=I%DmAYfirUdJHIu;?Yb6}KwN_ix#=f1>H&x4f~4DaI; zE%1HLl|}tHqy5m$BRZjkf=%n{x_Nc$wP=+)SV%-Yjx4|S1&Oq7qoF=q%zs>*eHn96lYe8u z2K|94Anuf*=EfV?;_X;uSu`-dQ-d(Q!Gi1pMp0_GT&4&yx011IbN5(?xWC}0vDE$T zl17ONT6H;5L12T(7vjrTa3-~p>lYv4FF)^Q7vyNGkoi~K`z($TPjULg4Hj0He~#Y* z7cD63R83ga9tQ7(D1V}rJQK>&TXavjwW6+mcL^=?w|6=!1%>;FLqG37}B~l+sq*GNe zjdG5!uWw}tW)m~S$4EmGQ|k51{xjPC@Ocz6gWe~o|# zm)ivJ5KmshLA}Ezjsv{Y9B--tE$fa@ccPljPM{IA>rQlunFqnHz!U)Ks6w;Z5zQu? zUZ{9AAKF#uJh9N}dU6Wb?>UBIrv^HqVby*KoyVMgfX)#PRdWQ8jnIi3s{oxJ7u?}Q z7~T6_Fj|JS+B=&s$D0ls1$%~We~mHrSrxPiSQQ|r&p&;XSKI-7frU1@Q;f#C6V#1l zE8SjK<1vOd;*R#S5g_H%^zl(4#aX~Aq)2lazzHCwqI&}=qtLH2i)PmzQu@G%%{~lh zBcynHXt#=++xc6#9Mkj_Yy{*gXeY*i6{gJ`_WCe>%{s&U$M(hPL)=Ydf3F7myFJgg z&)sjBTAUqc`}zb&U}RT$Gi4~0#?>5-yq8U6TFW-JbDX$7ROk8~`O|bC$=o+_|I3l! zA8=)E6xZ1tFM?T`pe=-fWw`hrH{lhJf@KrYV$vZrlXv#9QU-KTKo}sgr48+V9w(RR z8ay0v+herw78z2EIlS`&f8H^1^rz>;0iqPHEi)vSaXf|pXmzW{rd1o`jIDTCj9cPm z*azWnY&9sgx;ImV+Vp*cp%mriAFcL@QH?q`-MIe=KnWQZe_{?aE!!G>ET3ldv6Da3}!VPL##VH!4reu^Jh+vf7(twjeZZacPtBMl9h*XTYn5&G5t7zI#FiRMwn){YsxRbWFg8< zueG_++}mjOTKH#kV_jOgwU(c{{K3p*XS?}sd)<2w>FOLB!<1(_2pAIRQnuap%XR}} zY&%ec(R8<#XjWmZfjGxfjxG^Nf3x8lj6rZoY)pJ0Zd%2D za7LeHE}z{Je8!r%z1eVk6On>Ife$JN?DI&m(<6_V9>Mzyxa$!`Cd7LRZ*GXUc>$R$ zLFXvpES6i+b5r_+orUxXtmOKHw*vdL-MyB%I9=i#;S6A9l*wUlPBM4;o9$}^`PQKp zs|0gixNhONe=mi-)rtS$#cDg#Ud=b>n1TZ#>=y6B+(|;W{usG$`Y4aU1|U0A9&BEZ z@nA!x01`Upb2pb5N{EfwUYp&2z^IZoQSQ{tQX zDcNTJnD{pCtJl{$0~`w~Poy(<5SsnB)5Ep=^lJu{?Y7n)H-SXWCj~dM&1zK}9}=do zh~|gwygj`<>*|*JyOJw86BO`)P6IN5&I!!Z$z`*hFSk3>@em5T zFrfk-*Xt4X&LZsf%rF^1#O>tqbq=`gB04EpQoszDo+}tRAkGvcKkz#z_Cx`5G3!Uy}RJJrXe_bq+=Ek)SwL?Bez6xUwiO=zKTu!c! z{ysHBHOq()MC~Rn#W=}k*Q{rT&>4IYZkW|mr!VR(-)gmHI5WGg)-k6E4Ajrw9vwF2 z7k&^YZ6dtw#)Ai=C;2}~ibn|6rPyc#r*SNqiFQ@6Jtb07Zvhb zf6Oggzh}pq+EZ!kPO)|5o)G~~p*XDaEteDtF$LJ~MeYg&klY;^=ZkgP;sx%c2LMs- zgeMc%yk1(r>`_GpP;~#Yb7?B<;x!i zy^rT(QabHY0}M8g!D{MKA$;yIz9iA6e|!L?e*Wk>2eZnQJAiA@87Oy;0IsL4Vj$c4h)8*7RC#0dGz}1HeXH@xtobtwFo3ys#u;gB^jyWrJ2Jf4)|F zY08x*peU>+43*4Oe(Lub{z-CuR?Ndzr<2&c%j)ie9XB7{?Y7}`UjCYtvoY>j=gr5M z>SJ8Y_+PMi!oCaNguqP6(0+k4Kchnv0`|uH3Zk}D&-xd>9iWQmherx{b!>V7inUwU zgsZUOx*8p*@Xyya`0wh7|E_$qfBEpzvoAni?$=sJf1r{3;o1q`gHHGtz3>lO@DJKFPg|-Y2$lE$8B=T7N3zB++y4s3U z29+3pT*PKTGKfv!4<*QiB7&JB0^&7nHzJ@RaJqvDy>mgC8}u>J1QbE1f8;%6IMhjj zPh;8>@@ZljXps3cgssEPGhT*v1K6dntXn5PYB?rLg_bQA1ldc4mR%OQ_;1@@GBx4g zmI3+$Bbkj3SM6i}aP5@;fSvHt+UO9VtA(~sZ_JnjOe{an5c&yPAq9NFUd%1Tf-vsZv0Y>&!KF2TC;m_mjSq@#q z@!QT}hM+3j?qN$FUgXcRm-$?pu5D-U&3mgm+4CHljThPb>?NaqEDawDEIxPuMzX!K zq+tc$;|A{eg9qtqqnF0}Cofvhn%gVd-;+n#r~IJB()VjGn(x#L*o_b;ePceD;n#NBG4fbLWr92qIFlo0N^r(CONeB-fA`=4xJd@b$3&nK7-uKh zC__jI9oam8JLViWpyp5{1a_@QOWRk>LBn(UEN>tc5Kq>CQ8VrMkOor23^EKf+GBxc z4<5X7pWMO8f_m5MAKvHCQNiy4pI;9x-a}o7Z{zRdLrDL4|CvNGeukik2BN}eny;=8 z8UF~%YUB=hf1f{nkNC3?-Uy5c0Ho7;k0CdXZq#W`P0{N@|XleV4~e?!@HxWE#N5y26up+3(b2op=bVt znh8G#7tN(V$Q!^!Ubg#`KmC+^lT$~k(+R@ee#%}$f3URGj}O=E2p=C(Gg?@S7jd)_ z7y4jDMdH4S!~XO%Wr1Jn@_x!2FXOPV6f`{83%3?ME|^`25KNlP{}y;uamcw`RuO|X zaiT{;PjAh8nHj(T7=!X$^qykga1NM3rQ|~PuyFOq>=8nq=z_dP{2mm)<~m&Ts;B>w zSxG)&f7=i8PhNJHX&3R-a`PY`YXeM``L+)HzLqwRnARfz{1^3tzlc&N(P<%rCzz|A zw`)^nl=4D|{wQeiD#u!BW1~a*msNvpZo8bgSU#rJeG14?uIkktNdj&M zfhrfVT@Kq{2oevRB~%=N5Nhha3tgwJKCJv7j)&0XHftAPLR}HBkMqtQ;xXO2SYAHcv;Q zeZ~=JLHKg2?-lU6&VF){PTXCC>a#^7y;79KpWE9-1F;v83M0mZr@~Y);*P+PCj?d~ zf0HLIL|kA)o?uUioaIzPf*r!&A+doVLvpd*{HG1M=a{aD$_yGwBv>E1-*D)1!Znd! zr2nUe`1i4@ikszm1pSxOsQ_^Y4R3t+*u49w@UG--X_~e`LhdJMgJn2yqp81Hk#=$% zi9esOJ+2#rFK`1J#evb+DwhM3;s-tAboISA~f6NwZcrbQNR%)_iIMS_uRk`L#{3nQ>aXl-C1-@nNnsEH!w1#f1YSK zK!^z#R3hd!6qz(#Aso+}9dxyIogewr?n^LqPAH&2oQ^0Y&MZQKLiL#ENccz!lehsq zc48FbIlVnSge=*8dn|kmqOCiSIYP`Qy`{8rV<#3DrN^zjzdED#ayRd<&A`5`_bKXZ zW&I5C<(La9_AQK3x$jV1?tA3>m;8kY6Mr7!xMNZ{c^UY@eDfH$*m2kDBX2l^a1f%o$7viwgVB8N6 z!&3U9Cnf#(adDW9O?;=(L884%+||JwPEcrUwjNQh>X!gjK&rosvR2x2VOs8uMq{h4 z?=9c=8d{p3n=telJ=thMzuX)>g#gzWG z4&T?IOW`1B4MKbbZiC98)Pjkk$it^(5%9O~0A5)Hy+Iv$jqu5}2y$-I4kCQROALMQUPAgpsM#<=K;qJ=M-0z$nDV$8LFj_+Odj3L@chC( zV-5K9(mm-~0KEIH9W2N{zHU6DmHL0@&)fXddbYaVjJ;}ai25?edZO(M*Y>5feX;t| zwdE&#*D!~1a0d5Lp&;!K?SW(>72RiZCl)x}XmcK1*;?Y zVf?W-*@Q6CSZOYQ<&!{|Zl1&3${p*T_q79NaQ8%z1kci3r3L&HvUKrI0f@?tGj{%~ z7%wHABPYEZY@uh!sD5;zqgYbW%nYXy#JiLJ3sR1jQRmu!Y2hKDO?reW*#>efUwdi_b&6!?ARSFy`FQb){ z_>LlA1_L}vmf?`k0#=^xd;b<&GP)L$jJgy6XH!sB&H%!`%w#eaHx%RxK*F|jDyflo z<}iEn#qYv+T(oECmESISlG(r#?k`QB5SousXfxZKbnM*%$2 zYUCmu67p#RvkpwrBS7!b;%Hs`wXnRf!tr)}BPhGY#QSq&oK4VS4en ze4iYQr%e{Y+K%YM|Z>9|sPpwzy`tQePENSmI z2iG~)7r4{etTzTNPE{8Zsz&$Y8?J$`)AdB9{`#iv`PC)pbC)#9-C+71Z+#FtPAm(i zIoxEBbHAbiE?UuG%m&ceOrf*Eis_v9bIgtsPOxH5ph57QPjf}YO{f4|x~*cd zZn7cZx68U(qB)a#alhbxQ8?E01X{vL0<~noP8l4Dguy{0mnDq|Cx2o_|9#${U^Fc( z>|mwoR$DTcK-_oMMdOF_m2aj{9d}tov!(IFOO{+x5upaptUtz++Bl;!K}4rq4Fm;* z`V+}DIII>5CWwG09~#0Pd2X`uuVZA;CM0UaB#;BO$_!HgOgm@bY z9S}Uoo=p3q2}l#FxS|Ed(bjE(70f*Ei;aGSUKC!UkkoZ71*;g->Z#lyT|B&GMAkZm_bpTtr)!Q;!HWe;VSChBaH|X^5CM)Wx$vo_(@{P#J1CMKGRR z40)?LU3EiBr(g%Y20gFtY1{AQ0NbbZGin%wXhqZ^R0+%ImbIN<6eyp%GbJCxsY)k| z;{|6SI3Lh>1MIvf1LU6+nsnk_k#J#<*!}#uiy-^)s5+wGwsaU5qLJ_h6}_9}CmAn%CqKk)q#>!FS!deJ5#wC&+6_$oUHqKYUmo1P88h`5n4h)=llhs2Z zh(q3%%5Fa4b9zdrezN004dRY|XMLFznqWnR z9-$tu%0_@V!BKVMCqF~*R?0Xl@S1{;2sa1zGC>HG7@dr$JTYpMA{7S_555h|mtcGw zstNg23>C$Fvg~>y#C)ao_OOYK)p$WiT?(gOB!y|r1afOmLq04dogAD&8-rMfczVY< zj!!R}WssD0J_cPLccR;4m&}m}BmwJ}@sS7?e{*S@d4ye0CUBLHqF#NDm z3Qjx)-yM%b!(#QV0-=n0^yJ6(uN0Tfk_b-&A zK>|_F+)#dcXn{|K7DSu;+k!*_)gv|2xJmMy_`dT^4Mu{Nm33*2QumF|pPz4lyY*G^ zsuYZfyFvx7EgLvSr$nAv%s)6CM_{YH0TN%_@9K%#NYvoReFjHNY8g3xDE{|I96?JjyRo zR?Ct~nXYbB3@N*!#|%f%8;$_(oq9Wevh+Zhk`n>}wR`Q!9%h1TCyI^0iC#Sn5tl*u z(8ZaP+g-0lN6n~0D_69h3_5_ZXrYF-Xh^*rvpacyzFsrnLZ2XY1knAlf>i*h{&n8v ziG~Ic_v_gb?)sPdY0~^rzR%!R(30S9+p^JXjoB&^J;GST)Hr5(t#Q1{s5c#dR>3c9 zH@_mU@nd^(GB|6ljaHY>=l7OZ*G~M8Bmbkr9|**93M+%t@$i@i5Qv2^Y{2l4msF3P z&%h>h^KtDrqFp}xt-xyF!U`PI)E$Cf7{rvboP%Itaf!h;JvxGryFPDC5#tz1uwlPV zF-NyftbC;Aac}MaAa>5<-hZusTobMy1KR-Lx;Vo%%MN^mo}s(Ky(q6wvCoi(BpI}h z>Zi`MH^E6nzURvW@=ml zI6;I69?HB$CwJ!(6ob_S;r3;}^k`Y-tU{Hc)FNc@akp~r*$>VJx5?apMeHt3a9}g2 z?W?AgycMF*O6+0U7e2m**L~ONSE=j-_t7Gg+U3=VaG$iy!fymm!NdBD5kI#OW)P-L zPp?3uI!t!A#XwL$45qjV#vEb3muqm?12oKZM6QMCox0 zIHQYVxi1k=J%yh+RIKuUOb>Vb#8#&3BqKv(IOgS@^({ErJ%o`KV2hzBLE$8Q#q7-Q zF^y=eLPDqb_WJYCUW8gNuse{4-*t0jAiFxPaSnLoBK!6xI8Rcr(t(Nz8K|H^JPb zET*xn^7c?*O?n>&-QLgOZHI!FiP6J1whKI{eACY=M*M2@zQzTYq0>iZGFNYZ)6mQJ zug&N?i^{pxj((= zD|QH=JRMJN7?f#K*TD_Lu#HxhjV!d8m%Wz=GJn1}?8GL4@kWcFn~eFYT^o3SsiSMF zB{`i;rTB8#T5@24-52CIb7>MFjGA-_AObVgdvtFVRV)Ej{`p9VoDxC zoXKTrCWhc`Ycmo+P!GYZaf-r2M)qq3Q2?1&tiH{$w1E|Vh`I}tgDWqMq6+@|E`;7A z4S$lyzkU~*zXc<$#{H`~;+JRl?qBWT@5*mPSm8_X7dPKsd73|d_)qwAN3$fRVe_V6 zv@5L`0Yato3%|)Q@W9Xf#&9)U&#j2yc1e3o?mmai!^cC(9_V#giMS?LCKwTQq{b_P zyAyR~+&Xx6UYsKK^IQ`a&@kb_11>u4cz^lpSbq6)u@gcWHsl9j5PMGFX7k7xHOO`+ zjO)YslYHmFgZaZt{8iTV`X@wOM2+SNz!fF5zV3G)zx@EUXoRBZbLz@YP?j1<$Cgw4gPk4hW04D4WtmeuUcEx9;z0Kx;zJvFu*fAbN zAc@~Xf;vX=hIAl94^e&Y%^BAu!@o#%g@2Ks3IFocY(g#yGB+-9g52Jv(0R|7o0$k3 ze?Kcsr>Q%^>qxyHmDq+Qaj+!{F%io-JcCSLrCmB}3RrDGytff77X-Sr@i4Em^G-+* zC3otKOXIRbWuuBJaY5ycMRrpAqNbI4b6yN|PhmDDl04~z+){7OfrFCAYe!`ye@j4{ zNNR~`KnGo_(P-p_<|e@X%9U=vi*jG=e<|kTage^Sk*M`167$CeGB3CAH#-l(+fFWb zAu!1(7Iv%YUn_cB_}b#P%)-Rf8a@@l%hC>kI-5PZXpQ2gyo7ESo34oo5DB*^{j%@sLx{mB5o?MSJ|8nYRQZG8x+Kp^Y+^omE*Ric zzw@u#eMe$Vl|OW9Kjhk&FTqj_U-HRh)6W!qI%Pv!59dPK_*p4ff9!+#*n$1n2l?319X@6Qp@|gf(x0}^&c+v;QU|&^{#YIZWC}@x zT54&Ab0ovLB&tr*s{YEf!1HpSNb_q_t7NU%$i$Kc&Y$G4HK|-?bRTIm zE8aOCrlyCe!&04xXipwx_tyUL=+S>bDTkZ~4tFg>P2h*RoPClNcVA65A!MAZRb?(y zU9u41!W%!y3piBQP~_b0mCNhj%0nq=L1iRYN4d_^1r#C1l&Fe#vMylYbYG zGJnwv6`z2>&o@etP*?yGi&i9$jub$t1q04OXMju$AQaB)lm3chxtLtjEF?|mf+mp! zOj1^Olv>^cPXUbmXi74V=lQgvCRZYK2s~6tBXg!Ya;83pGo|^$7z@jdCmv!wP{MyD zm4eFk7!8j!sYsZbB=5GsTb@Bp0)McNH3`5z%9uAIv+Y%e#_CkG9g(AW!+eY8(dKQG zIQF6HAZ>YITROCs;3q`+REO2%*g2(4P{%yF2j!{P#yI585~q@RjMI;&>k`s5D97~| zu*N}yF9Bs}|EA)fD8J{tWgGwf=(u;Xaxc`rX{@n24n^BN{=d@D52&WMwSRJV(p$yA z%}H=OU!+HfyQ0z0H0z~8f~>7`k}QD(f~ExW;F=hi*dR>YI<+B{B2leEYpIxOuTJ}u zz7vz?A>*y4%BiR>W*DyPoC${$oRi~HCGwpG$z6*hj~o=$R_0|O-l)+IUBoh@1dT(C z8l|l29;eBGn-gA&?8`4iNPkIh>orGT&@8yHlONlcQwFV*EOO~=d_aznl{H9(#c7ws zMJFRxHm;Tu6J=l}1;-V&$*(Sf5^+K7ld2P&>3$b`7=pvYTEfvyi;)bDHAFV zTlrjnqV}t-^*dUefb@t7NTJ-b2}pIEw@4YPEq`+)i1!+_oAU13 z_Z&`@x%-TjkplTPh7uJhihKRmbR{G~FVGc9fv&6d>y0{6F50h&aJcqiQX1D zeHctG;0m$@iv#lzmDN_goB#aZ@J}fk#XC^g~?t$)MeriM$^Ag|L>JQk^U%UhU?!#buzoATq3nCsDhAl#z#*jxqy z(j;9Zh#*C?L)gQ>G|h^Lt7C-7?weAPD=h~3JR}kw=gEdt*gB^bw^MBR8=dNP-X6O;GX)k@#P=79SBwkk9r?9-P%i@cf zM&6tw+!W%-Nwm1I_gGMWU;mb1?G?O-xY3T8#C&Qhv@i*&plOIUA<|KjmkbJmVzo_3 z_B{-XY3-3@{=0Cw{4Ss&xnNXoN#(cx=G^Do<2jP-ba0juzsGk(q{va%uFO%#v~y7U zxU_R}mVes6`hTiNmAloC<29tv9q?jpzdeL0lBoX`UHfCIhZHzXk0`YD|2k>_Uas1G zEZL9KCM*PbNB3HcU6lHXkBckubRBoyI3WxL(mw6Ak9T1&+C6nhyRxd3L0LjDg+}hp zw9MvGuI$riR`!Eb$}8U5G3l-<%F|@~G0}hFd9@cj-ha*9H(lkV?4DED_-*XbYz@Kj=sF^$h~&5jkoYEE%gY?qDq z+=V$V!xBNS?f3JyuVM0hl)XDgb~HTQM-0)UYzI$2;t7OkM=Z47?H^{(_VWYesp*20 zgOvb+Tz{U*4d61An21Z#WRx4h$R;2SGEQQV@F%8lQ5&|k+4-8!7VV3eNI4dsz%+{4 z+vM*W1m_+jm`r>4S{vYt-XP#IFYRhxNY7dOf#+cPkZjs%xa4)0m~zE? z@AEydDV=d=Jok6Sy-~5D-W1!m;qq8-i1#-bj(>8>%QiJ|A+f#~&!~Cb;ZSR7cG4&% z-A)H}!7klZqTIc+Aqik@dg<6AO)>4dJ4?IM^{eg>X1GRAR_v1IdF)cFe-_lCeu3R5Bp@wR_70C7JnGaWfgXo4Fqv^`*jlUaArg3~~#x`(soZgd(`^$tsltZ4n zml3517Jtw$n1VJ2z=Cft1FE#RuVVcin+FBU)@ zDSzvUVSCfDC6CNy+m&F{P6Nw}G(^s}2xl%xO~A8>gIVL0^xo(lf{;^mMYs z+N(cn4y1~B1*)Z`^<*&7;+8sfjz+lT3nwQfFj#mx7KQ$$u!z%U;#Z;|fsZSycs^>Sc~>n9Z^Ye60aR z5iF#N(}g>^r-5~-rsT102}a$qcRusA*w-nZ)FQo#N|h+TGhytm;Ke4dFc5A^f_Z>NMi6Sb z@%ee5(GvOV2mT7dM^D8n9@-E6#)rkXZ6A2shL=jWMD1{i1yll^_3f{XoNYp4?Jk!- zypfF8yY@~9TGUukmZjxwZ346=rGFcZt5m%kuU(~=0vtj96}>CG?Cmvp#h!v~pc;Kc z0(<+o4{6^iC?_rHRUCBii{5fgZxzjJ)t?}8r-X(S5imLr%>9S;ere;^Ru_>y5VRl|t%*q64lFf5Va?-{IB)FB2}83X_> z!}U^c@mMK^2cXj1GTTi-9r-8&jznuL@qL6c^}k;;qFe9b`9w_qo;jCzeqjMf$ftY< zFHC3Mq~rMe{&c0{6UE6n)j4kC0xeFK%X6+NW`9G}kkFz=MYhCH zUiJ#oEDhE+gz95}IVS?u5fy0VL*T`@Zl(kOrM1U5_Y~*o`#L(Z$2ywmCm91pw7;}#iS7(+85);t2XAv8+2h?0imF|PX+BZ(`0y6LT1{_MSk(?zhCI8hY; zTq+(Nq4)<^{1{$7vF3y|-&NJTJ4X%SDU|G-W0&En2orzZi^&i>LJ)9!!(St~o8Tu{ zH2H4SxjY8%8DWL-{%$%o(i#|*Kq*I^L4H1eMie#`{{U$V&Tz(f$z&lGf}5XK?RKj= zsbXPDJULiprJcmIfgtTk5FA8%fvqIkBxJjUlGRw+>ClR-lq`zA%{e<;9o!!W$IV)R z=Z3jxJnIs$WCSMr*>$toKF5n-=6%0A$Crbu2t9v4Xozx=e3OBoAE@c2asr41;!U$* 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

OeA`&E!1C>A=j~4`x^TsD|$(I<@ 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%0DE~RLLh0?<13v56j%5LO<&GI8h6Nd{tx*F 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%0D;-)DcHo4a3I!Pozo`ycpf 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

!^Pljv#H=gVgw&!^Lt!O4@+~ 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

Y|8XJwICP<0m$V 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

UjRz=; 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%0DGne@d?YG&%p%?N_I#ioongqP-{ZNEtlC<>_ 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 diff --git a/tools/server/server-common.cpp b/tools/server/server-common.cpp index 16b0db2..b02afae 100644 --- a/tools/server/server-common.cpp +++ b/tools/server/server-common.cpp @@ -1,10 +1,10 @@ #include "common.h" -#include "download.h" #include "log.h" #include "llama.h" #include "mtmd.h" #include "mtmd-helper.h" #include "chat.h" +#include "arg.h" // for common_remote_get_content; TODO: use download.h only #include "base64.hpp" #include "server-common.h" @@ -779,7 +779,7 @@ static void handle_media( // download remote image // TODO @ngxson : maybe make these params configurable common_remote_params params; - params.headers.push_back({"User-Agent", "llama.cpp/" + build_info}); + params.headers.push_back("User-Agent: llama.cpp/" + build_info); params.max_size = 1024 * 1024 * 10; // 10MB params.timeout = 10; // seconds SRV_INF("downloading image from '%s'\n", url.c_str()); @@ -1385,21 +1385,16 @@ json format_response_rerank( std::vector get_token_probabilities(llama_context * ctx, int idx) { std::vector cur; - const auto * logits = llama_get_logits_ith(ctx, idx); - const llama_token * sampled_ids = llama_get_sampled_candidates_ith(ctx, idx); - const int n_logits = llama_get_sampled_logits_count_ith(ctx, idx); + const llama_model * model = llama_get_model(ctx); + const llama_vocab * vocab = llama_model_get_vocab(model); - cur.resize(n_logits); - if (sampled_ids) { - for (int i = 0; i < n_logits; i++) { - cur[i] = llama_token_data{sampled_ids[i], logits[i], 0.0f}; - } - } else { - for (llama_token token_id = 0; token_id < n_logits; token_id++) { - cur[token_id] = llama_token_data{token_id, logits[token_id], 0.0f}; - } + const int n_vocab = llama_vocab_n_tokens(vocab); + + cur.resize(n_vocab); + for (llama_token token_id = 0; token_id < n_vocab; token_id++) { + cur[token_id] = llama_token_data{token_id, logits[token_id], 0.0f}; } // sort tokens by logits diff --git a/tools/server/server-context.cpp b/tools/server/server-context.cpp index 62b12b5..a132b87 100644 --- a/tools/server/server-context.cpp +++ b/tools/server/server-context.cpp @@ -4,6 +4,7 @@ #include "server-task.h" #include "server-queue.h" +#include "arg.h" #include "common.h" #include "llama.h" #include "log.h" @@ -15,6 +16,7 @@ #include #include #include +#include #include // fix problem with std::min and std::max @@ -45,6 +47,26 @@ enum server_state { SERVER_STATE_READY, // Server is ready and model is loaded }; +static bool server_task_type_need_embd(server_task_type task_type) { + switch (task_type) { + case SERVER_TASK_TYPE_EMBEDDING: + case SERVER_TASK_TYPE_RERANK: + return true; + default: + return false; + } +} + +static bool server_task_type_need_logits(server_task_type task_type) { + switch (task_type) { + case SERVER_TASK_TYPE_COMPLETION: + case SERVER_TASK_TYPE_INFILL: + return true; + default: + return false; + } +} + struct server_slot { int id; @@ -59,8 +81,6 @@ struct server_slot { common_speculative * spec = nullptr; - // TODO: move members that belong to the task (such as `generated_text`, `has_new_line`) to task_results_state - // see https://github.com/ggml-org/llama.cpp/pull/18283#issuecomment-3710175837 std::unique_ptr task; std::unique_ptr task_prev; // used for debugging @@ -127,17 +147,6 @@ struct server_slot { return res; } - void prompt_clear(bool allow_processing) { - if (!allow_processing) { - GGML_ASSERT(!is_processing()); - } - - SLT_INF(*this, "clearing prompt with %zu tokens\n", prompt.tokens.size()); - - llama_memory_seq_rm(llama_get_memory(ctx), id, -1, -1); - prompt.tokens.clear(); - } - std::vector lora; int32_t alora_invocation_start = -1; @@ -146,7 +155,7 @@ struct server_slot { common_sampler_ptr smpl; - llama_token sampled; // in speculative mode, this is the last accepted token + llama_token sampled; // in speculative mode, this is the last accepted token llama_tokens drafted; // stats @@ -158,7 +167,7 @@ struct server_slot { double t_prompt_processing; // ms double t_token_generation; // ms - std::function callback_on_release; + std::function callback_on_release; // Speculative decoding stats int32_t n_draft_total = 0; // Total draft tokens generated @@ -187,46 +196,30 @@ struct server_slot { n_draft_total = 0; n_draft_accepted = 0; - task_prev = std::move(task); task.reset(); - - llama_set_sampler(ctx, id, nullptr); + task_prev.reset(); // clear alora start alora_invocation_start = -1; } - void init_sampler() const { - common_sampler_reset(smpl.get()); + bool need_embd() const { + GGML_ASSERT(task); - if (!task->need_sampling()) { - return; - } + return server_task_type_need_embd(task->type); + } - const int64_t t_start = ggml_time_us(); + bool need_logits() const { + GGML_ASSERT(task); - int n_text = 0; - - for (int i = 0; i < (int) prompt.tokens.size(); i++) { - const llama_token id = prompt.tokens[i]; - - if (id != LLAMA_TOKEN_NULL) { - common_sampler_accept(smpl.get(), id, false); - n_text++; - } - } - - SLT_INF(*this, "init sampler, took %0.2f ms, tokens: text = %d, total = %d\n", - (ggml_time_us() - t_start) / 1000.0, n_text, (int) prompt.tokens.size()); + return server_task_type_need_logits(task->type); } // if the context does not have a memory module then all embeddings have to be computed within a single ubatch // also we cannot split if the pooling would require any past tokens bool can_split() const { - GGML_ASSERT(task); - return - !task->need_embd() || + !need_embd() || (llama_get_memory(ctx) && llama_pooling_type(ctx) == LLAMA_POOLING_TYPE_LAST); } @@ -267,13 +260,10 @@ struct server_slot { SLT_WRN(*this, "%s", "slot is not processing\n"); return; } - generated_token_probs.push_back(token); } int get_n_draft_max() const { - GGML_ASSERT(task); - if (!can_speculate()) { return 0; } @@ -298,23 +288,27 @@ struct server_slot { return n_draft_max; } + // note: a slot can also be either a parent or a child + bool is_parent() const { + return is_processing() && task->n_children > 0; + } + + bool is_child() const { + return is_processing() && task->id_parent >= 0; + } + void release() { if (is_processing()) { GGML_ASSERT(task); SLT_INF(*this, "stop processing: n_tokens = %d, truncated = %d\n", prompt.n_tokens(), truncated); - t_last_used = ggml_time_us(); + t_last_used = ggml_time_us(); t_token_generation = (ggml_time_us() - t_start_generation) / 1e3; - state = SLOT_STATE_IDLE; - // do not keep context of the child slots - the parent's context is enough - if (task->is_child()) { - prompt_clear(false); - } - - reset(); + task_prev = std::move(task); + task.reset(); callback_on_release(id); } @@ -433,22 +427,14 @@ struct server_slot { } void copy_state_to(server_slot & other) const { - GGML_ASSERT(state == SLOT_STATE_DONE_PROMPT); - - llama_memory_seq_rm(llama_get_memory(ctx), other.id, -1, -1); - llama_memory_seq_cp(llama_get_memory(ctx), id, other.id, -1, -1); - + llama_memory_seq_rm(llama_get_memory(ctx), other.id, 0, -1); + llama_memory_seq_cp(llama_get_memory(ctx), id, other.id, 0, -1); other.n_decoded = n_decoded; other.n_remaining = n_remaining; other.i_batch = i_batch; - - other.t_start_process_prompt = t_start_process_prompt; - other.t_prompt_processing = t_prompt_processing; other.n_prompt_tokens_cache = n_prompt_tokens_cache; other.n_prompt_tokens_processed = n_prompt_tokens_processed; - other.prompt = prompt.clone(); - other.init_sampler(); } }; @@ -761,8 +747,6 @@ private: } slots.clear(); - - // initialize slots for (int i = 0; i < params_base.n_parallel; i++) { server_slot slot; @@ -794,8 +778,8 @@ private: SLT_INF(slot, "new slot, n_ctx = %d\n", slot.n_ctx); - slot.callback_on_release = [this](int slot_id) { - queue_tasks.pop_deferred_task(slot_id); + slot.callback_on_release = [this](int) { + queue_tasks.pop_deferred_task(); }; slot.reset(); @@ -909,9 +893,9 @@ private: return true; } - server_slot * get_slot_by_id(int id_slot) { + server_slot * get_slot_by_id(int id) { for (server_slot & slot : slots) { - if (slot.id == id_slot) { + if (slot.id == id) { return &slot; } } @@ -1011,7 +995,7 @@ private: ret->prompt_save(*prompt_cache); if (!ret->prompt_load(*prompt_cache, task.tokens)) { - ret->prompt_clear(false); + clear_slot(*ret); } prompt_cache->update(); @@ -1023,6 +1007,15 @@ private: return ret; } + void clear_slot(server_slot & slot) const { + GGML_ASSERT(!slot.is_processing()); + + SLT_WRN(slot, "clearing slot with %zu tokens\n", slot.prompt.tokens.size()); + + llama_memory_seq_rm(llama_get_memory(ctx), slot.id, -1, -1); + slot.prompt.tokens.clear(); + } + // return true if at least one slot has been cleared // TODO: improve logic // - smarter decision which slot to clear (LRU or longest prompt?) @@ -1043,7 +1036,7 @@ private: if (slot.prompt.n_tokens() > 0) { SRV_WRN("purging slot %d with %zu tokens\n", slot.id, slot.prompt.tokens.size()); - slot.prompt_clear(false); + clear_slot(slot); res = true; @@ -1069,6 +1062,8 @@ private: } bool launch_slot_with_task(server_slot & slot, server_task && task) { + slot.reset(); + // process per-request lora adapters if (!task.params.lora.empty()) { auto task_loras = construct_lora_list(task.params.lora); @@ -1142,7 +1137,7 @@ private: SLT_DBG(slot, "launching slot : %s\n", safe_json_to_str(slot.to_json()).c_str()); // initialize samplers - if (task.need_sampling()) { + { slot.smpl.reset(common_sampler_init(model, task.params.sampling)); if (slot.smpl == nullptr) { @@ -1151,28 +1146,7 @@ private: return false; } - const bool need_logits = task.params.sampling.n_probs > 0; - - bool backend_sampling = true; - - backend_sampling &= task.params.sampling.backend_sampling; - - // TODO: speculative decoding requires multiple samples per batch - not supported yet - backend_sampling &= !(slot.ctx_dft && task.params.speculative.n_max > 0); - - // TODO: getting post/pre sampling logits is not yet supported with backend sampling - backend_sampling &= !need_logits; - - // TODO: tmp until backend sampling is fully implemented - if (backend_sampling) { - llama_set_sampler(ctx, slot.id, common_sampler_get(slot.smpl.get())); - } else { - llama_set_sampler(ctx, slot.id, nullptr); - } - SLT_INF(slot, "sampler chain: %s\n", common_sampler_print(slot.smpl.get()).c_str()); - } else { - slot.smpl.reset(); } // initialize draft batch @@ -1185,11 +1159,12 @@ private: slot.task = std::make_unique(std::move(task)); - slot.state = slot.task->is_child() + slot.state = slot.is_child() ? SLOT_STATE_WAIT_OTHER // wait for the parent to process prompt : SLOT_STATE_STARTED; - SLT_INF(slot, "processing task, is_child = %d\n", slot.task->is_child()); + SLT_INF(slot, "%s", "processing task\n"); + return true; } @@ -1509,9 +1484,9 @@ private: res->n_tokens = slot.task->n_tokens(); res->res_type = slot.task->params.res_type; - const int n_embd_out = llama_model_n_embd_out(model); + const int n_embd = llama_model_n_embd(model); - std::vector embd_res(n_embd_out, 0.0f); + std::vector embd_res(n_embd, 0.0f); for (int i = 0; i < batch.n_tokens; ++i) { if (!batch.logits[i] || batch.seq_id[i][0] != slot.id) { @@ -1528,18 +1503,18 @@ private: if (embd == nullptr) { SLT_ERR(slot, "failed to get embeddings, token = %d, seq_id = %d\n", batch.token[i], batch.seq_id[i][0]); - res->embedding.push_back(std::vector(n_embd_out, 0.0f)); + res->embedding.push_back(std::vector(n_embd, 0.0f)); continue; } // normalize only when there is pooling if (llama_pooling_type(slot.ctx) != LLAMA_POOLING_TYPE_NONE) { - common_embd_normalize(embd, embd_res.data(), n_embd_out, slot.task->params.embd_normalize); + common_embd_normalize(embd, embd_res.data(), n_embd, slot.task->params.embd_normalize); res->embedding.push_back(embd_res); break; } - res->embedding.emplace_back(embd, embd + n_embd_out); + res->embedding.emplace_back(embd, embd + n_embd); } SLT_DBG(slot, "%s", "sending embeddings\n"); @@ -1584,7 +1559,9 @@ private: // tokenize the input if it's set by CLI, return false on error bool tokenize_cli_input(server_task & task) { - GGML_ASSERT(task.cli_input != nullptr); + if (task.cli_input == nullptr) { + return true; // nothing to do + } try { auto & opt = oai_parser_opt; common_chat_templates_inputs inputs; @@ -1618,64 +1595,6 @@ private: return true; } - std::vector get_free_slots(size_t n_slots_needed, int exclude_id_slot) { - std::vector free_slots; - for (auto & slot : slots) { - if (!slot.is_processing() && slot.id != exclude_id_slot) { - free_slots.push_back(&slot); - } - if (free_slots.size() >= n_slots_needed) { - break; - } - } - return free_slots; - } - - // launch multiple slots for parent + child tasks - bool launch_slots_with_parent_task(server_slot & parent_slot, std::vector & child_slots, server_task && parent_task) { - GGML_ASSERT(!parent_slot.is_processing()); - GGML_ASSERT(parent_task.is_parent()); - GGML_ASSERT(child_slots.size() == parent_task.child_tasks.size()); - - int id_parent = parent_task.id; - - SRV_INF("launching slots for parent task id_task = %d with %zu child tasks\n", id_parent, parent_task.child_tasks.size()); - - // to be called in case of failure to release all launched slots - auto release_slots = [this, id_parent]() { - for (auto & slot : slots) { - if (slot.is_processing() && ( - slot.task->id == id_parent || - slot.task->id_parent == id_parent - )) { - slot.release(); - } - } - }; - - // launch all child tasks first - size_t idx = 0; - GGML_ASSERT(child_slots.size() == parent_task.child_tasks.size()); - for (auto * slot : child_slots) { - int id_child = parent_task.child_tasks[idx].id; - if (!launch_slot_with_task(*slot, std::move(parent_task.child_tasks[idx]))) { - SRV_ERR("failed to launch slot with child task, id_task = %d\n", id_child); - release_slots(); - return false; - } - idx++; - } - - // finally, launch the parent task - if (!launch_slot_with_task(parent_slot, std::move(parent_task))) { - SRV_ERR("failed to launch slot with task, id_task = %d\n", id_parent); - release_slots(); - return false; - } - - return true; - } - void process_single_task(server_task && task) { switch (task.type) { case SERVER_TASK_TYPE_COMPLETION: @@ -1683,55 +1602,31 @@ private: case SERVER_TASK_TYPE_EMBEDDING: case SERVER_TASK_TYPE_RERANK: { - // special case: if input is provided via CLI, tokenize it first - // otherwise, no need to tokenize as it's already done inside the HTTP thread - if (task.cli_input != nullptr) { - if (!tokenize_cli_input(task)) { - break; - } + if (!tokenize_cli_input(task)) { + break; } const int id_slot = task.id_slot; - const int id_task = task.id; - server_slot * slot = id_slot != -1 - ? get_slot_by_id(id_slot) - : get_available_slot(task); - - // - // slot scheduling logic - // + server_slot * slot = id_slot != -1 ? get_slot_by_id(id_slot) : get_available_slot(task); if (slot == nullptr) { // if no slot is available, we defer this task for processing later - SRV_DBG("no slot is available, defer task, id_task = %d\n", id_task); + SRV_DBG("no slot is available, defer task, id_task = %d\n", task.id); queue_tasks.defer(std::move(task)); break; } if (slot->is_processing()) { // if requested slot is unavailable, we defer this task for processing later - SRV_DBG("requested slot is unavailable, defer task, id_task = %d\n", id_task); + SRV_DBG("requested slot is unavailable, defer task, id_task = %d\n", task.id); queue_tasks.defer(std::move(task)); break; } - if (task.is_parent()) { - // try getting free slots for all child tasks - size_t n_child_tasks = task.child_tasks.size(); - std::vector child_slots = get_free_slots(n_child_tasks, slot->id); - if (child_slots.size() < n_child_tasks) { - SRV_DBG("not enough free slots for child tasks, n_free = %zu, n_children = %zu, defer task, id_task = %d\n", child_slots.size(), n_child_tasks, id_task); - queue_tasks.defer(std::move(task)); - break; - } - if (!launch_slots_with_parent_task(*slot, child_slots, std::move(task))) { - SRV_ERR("failed to launch slot with parent task, id_task = %d\n", id_task); - break; // drop the task - } - } else if (!launch_slot_with_task(*slot, std::move(task))) { - SRV_ERR("failed to launch slot with task, id_task = %d\n", id_task); - break; // drop the task + if (!launch_slot_with_task(*slot, std::move(task))) { + SRV_ERR("failed to launch slot with task, id_task = %d\n", task.id); + break; } } break; case SERVER_TASK_TYPE_CANCEL: @@ -1905,7 +1800,7 @@ private: // Erase token cache const size_t n_erased = slot->prompt.tokens.size(); - slot->prompt_clear(false); + clear_slot(*slot); auto res = std::make_unique(); res->id = task.id; @@ -2000,7 +1895,7 @@ private: GGML_ABORT("not supported by multimodal"); } - if (slot.task->is_parent() || slot.task->is_child()) { + if (slot.is_parent() || slot.is_child()) { send_error(slot, "context shift cannot be used for shared prompt", ERROR_TYPE_SERVER); slot.release(); continue; @@ -2139,12 +2034,6 @@ private: continue; } - // check if this is a child slot - if (slot.state == SLOT_STATE_WAIT_OTHER) { - SLT_DBG(slot, "%s", "waiting for parent slot to complete\n"); - continue; - } - // this slot still has a prompt to be processed if (slot.state == SLOT_STATE_PROCESSING_PROMPT || slot.state == SLOT_STATE_STARTED) { const auto & input_tokens = slot.task->tokens; @@ -2187,7 +2076,7 @@ private: } // TODO: support memory-less logits computation - if (slot.task->need_logits() && !llama_get_memory(ctx)) { + if (slot.need_logits() && !llama_get_memory(ctx)) { send_error(slot, "the current context does not logits computation. skipping", ERROR_TYPE_SERVER); slot.release(); continue; @@ -2424,12 +2313,6 @@ private: slot.n_prompt_tokens_processed = 0; slot.prompt.tokens.keep_first(n_past); - - // send initial 0% progress update if needed - // this is to signal the client that the request has started processing - if (slot.task->params.stream && slot.task->params.return_progress) { - send_partial_response(slot, {}, true); - } } if (!slot.can_split()) { @@ -2447,7 +2330,7 @@ private: if (!llama_memory_seq_rm(llama_get_memory(ctx), slot.id, p0, -1)) { SLT_WRN(slot, "failed to truncate tokens with position >= %d - clearing the memory\n", p0); - slot.prompt_clear(true); + clear_slot(slot); // there is no common part left slot.n_prompt_tokens_cache = 0; @@ -2526,7 +2409,7 @@ private: cur_tok, slot.prompt.tokens.pos_next(), { slot.id }, - slot.task->need_embd()); + slot.need_embd()); slot.prompt.tokens.push_back(cur_tok); slot.n_prompt_tokens_processed++; @@ -2547,6 +2430,16 @@ private: GGML_ASSERT(batch.n_tokens > 0); + common_sampler_reset(slot.smpl.get()); + + // Process all prompt tokens through sampler system + for (int i = 0; i < slot.task->n_tokens(); ++i) { + llama_token id = input_tokens[i]; + if (id != LLAMA_TOKEN_NULL) { + common_sampler_accept(slot.smpl.get(), id, false); + } + } + // extract the logits only for the last token batch.logits[batch.n_tokens - 1] = true; @@ -2555,8 +2448,6 @@ private: SLT_INF(slot, "prompt done, n_tokens = %d, batch.n_tokens = %d\n", slot.prompt.n_tokens(), batch.n_tokens); - slot.init_sampler(); - const auto pos_min = llama_memory_seq_pos_min(llama_get_memory(ctx), slot.id); const auto pos_max = llama_memory_seq_pos_max(llama_get_memory(ctx), slot.id); @@ -2603,6 +2494,11 @@ private: } } + if (batch.n_tokens == 0) { + SRV_WRN("%s", "no tokens to decode\n"); + return; + } + SRV_DBG("decoding batch, n_tokens = %d\n", batch.n_tokens); if (slot_batched) { @@ -2616,11 +2512,7 @@ private: slot_batched->lora[alora_disabled_id].scale = alora_scale; } - llama_set_embeddings(ctx, slot_batched->task->need_embd()); - } - - if (batch.n_tokens == 0) { - SRV_WRN("%s", "no tokens to decode\n"); + llama_set_embeddings(ctx, slot_batched->need_embd()); } int32_t i_next = 0; @@ -2674,7 +2566,7 @@ private: // note: it's complicated to keep track of how much of the current batch has been // processed before the error occurred, so we simply clear the entire context - slot.prompt_clear(false); + clear_slot(slot); } } @@ -2698,30 +2590,31 @@ private: // on successful decode, restore the original batch size n_batch = llama_n_batch(ctx); - // handle `n_cmpl > 1` tasks - when the main prompt is processed, activate all child tasks too + // technically, measuring the time here excludes the sampling time for the last batch + // but on the other hand, we don't want to do too many system calls to measure the time, so it's ok + const int64_t t_current = ggml_time_us(); + for (auto & slot : slots) { - if (slot.state == SLOT_STATE_DONE_PROMPT && slot.task->is_parent()) { - std::vector children; + // may need to copy state to other slots + if (slot.state == SLOT_STATE_DONE_PROMPT && slot.is_parent()) { + std::vector child_slots; for (auto & other : slots) { if (other.state == SLOT_STATE_WAIT_OTHER && slot.task->id == other.task->id_parent) { - children.push_back(&other); + child_slots.push_back(&other); } } - // all children slots should already launched by launch_slots_with_parent_task() - // copy state to the child slots - for (auto & child : children) { - SLT_INF(slot, " - copying state to child %d\n", child->id); - - GGML_ASSERT(child->state == SLOT_STATE_WAIT_OTHER); - - slot.copy_state_to(*child); - child->state = SLOT_STATE_DONE_PROMPT; + // we can only proceed if all child slots are having the correct tasks + if (child_slots.size() == slot.task->n_children) { + // copy state to the child slots + for (auto & child : child_slots) { + SLT_INF(slot, "copying state to child %d\n", child->id); + slot.copy_state_to(*child); + child->state = SLOT_STATE_DONE_PROMPT; + } } } - } - for (auto & slot : slots) { // optionally send prompt processing progress if (slot.state == SLOT_STATE_PROCESSING_PROMPT || slot.state == SLOT_STATE_DONE_PROMPT) { if (slot.task->params.stream && slot.task->params.return_progress) { @@ -2749,8 +2642,6 @@ private: continue; // continue loop of slots } - GGML_ASSERT(slot.task->need_sampling()); - // prompt evaluated for next-token prediction slot.state = SLOT_STATE_GENERATING; } else if (slot.state != SLOT_STATE_GENERATING) { @@ -2769,9 +2660,6 @@ private: common_sampler_accept(slot.smpl.get(), id, true); - // here we have synchronized the llama_context (due to the sampling above), so we can do time measurement - const int64_t t_current = ggml_time_us(); - slot.n_decoded += 1; if (slot.n_decoded == 1) { @@ -2808,15 +2696,13 @@ private: continue; } - const size_t n_draft = slot.drafted.size(); + size_t n_draft = slot.drafted.size(); // the accepted tokens from the speculation const auto ids = common_sampler_sample_and_accept_n(slot.smpl.get(), ctx, slot.i_batch_dft, slot.drafted); slot.i_batch_dft.clear(); slot.drafted.clear(); - const int64_t t_current = ggml_time_us(); - slot.n_decoded += ids.size(); slot.t_token_generation = std::max(1, t_current - slot.t_start_generation) / 1e3; @@ -2898,12 +2784,6 @@ server_response_reader server_context::get_response_reader() { server_context_meta server_context::get_meta() const { auto tool_use_src = common_chat_templates_source(impl->chat_templates.get(), "tool_use"); - - auto bos_id = llama_vocab_bos(impl->vocab); - auto eos_id = llama_vocab_eos(impl->vocab); - auto bos_token_str = bos_id != LLAMA_TOKEN_NULL ? common_token_to_piece(impl->ctx, bos_id, true) : ""; - auto eos_token_str = eos_id != LLAMA_TOKEN_NULL ? common_token_to_piece(impl->ctx, eos_id, true) : ""; - return server_context_meta { /* build_info */ build_info, /* model_name */ impl->model_name, @@ -2918,8 +2798,8 @@ server_context_meta server_context::get_meta() const { /* chat_template */ common_chat_templates_source(impl->chat_templates.get()), /* chat_template_tool_use */ tool_use_src ? tool_use_src : "", - /* bos_token_str */ bos_token_str, - /* eos_token_str */ eos_token_str, + /* bos_token_str */ common_token_to_piece(impl->ctx, llama_vocab_bos(impl->vocab), true), + /* eos_token_str */ common_token_to_piece(impl->ctx, llama_vocab_eos(impl->vocab), true), /* fim_pre_token */ llama_vocab_fim_pre(impl->vocab), /* fim_sub_token */ llama_vocab_fim_suf(impl->vocab), /* fim_mid_token */ llama_vocab_fim_mid(impl->vocab), @@ -2992,9 +2872,7 @@ std::unique_ptr server_routes::handle_completions_impl( // Everything else, including multimodal completions. inputs = tokenize_input_prompts(ctx_server.vocab, ctx_server.mctx, prompt, true, true); } - - // tasks.reserve(inputs.size()); // TODO: this is inaccurate due to child tasks - + tasks.reserve(inputs.size()); for (size_t i = 0; i < inputs.size(); i++) { server_task task = server_task(type); @@ -3013,11 +2891,13 @@ std::unique_ptr server_routes::handle_completions_impl( task.params.oaicompat_cmpl_id = completion_id; task.params.oaicompat_model = meta->model_name; - // prepare child tasks if (task.params.n_cmpl > 1) { - int n_children = task.params.n_cmpl - 1; - for (int j = 0; j < n_children; j++) { - task.add_child(task.id, rd.get_new_id()); + task.n_children = task.params.n_cmpl - 1; + for (size_t j = 0; j < task.n_children; j++) { + server_task child = task.create_child( + task.id, + rd.get_new_id()); + tasks.push_back(std::move(child)); } } @@ -3066,22 +2946,19 @@ std::unique_ptr server_routes::handle_completions_impl( // in streaming mode, the first error must be treated as non-stream response // this is to match the OAI API behavior // ref: https://github.com/ggml-org/llama.cpp/pull/16486#discussion_r2419657309 - auto first_result = rd.next(req.should_stop); + server_task_result_ptr first_result = rd.next(req.should_stop); if (first_result == nullptr) { - GGML_ASSERT(req.should_stop()); return res; // connection is closed - } - - if (first_result->is_error()) { + } else if (first_result->is_error()) { res->error(first_result->to_json()); return res; + } else { + GGML_ASSERT( + dynamic_cast(first_result.get()) != nullptr + || dynamic_cast(first_result.get()) != nullptr + ); } - GGML_ASSERT( - dynamic_cast(first_result.get()) != nullptr || - dynamic_cast (first_result.get()) != nullptr - ); - // next responses are streamed // to be sent immediately json first_result_json = first_result->to_json(); @@ -3137,7 +3014,6 @@ std::unique_ptr server_routes::handle_completions_impl( auto result = rd.next(req.should_stop); if (result == nullptr) { SRV_DBG("%s", "stopping streaming due to should_stop condition\n"); - GGML_ASSERT(req.should_stop()); return false; // should_stop condition met } @@ -3221,11 +3097,6 @@ void server_routes::init_routes() { // get the result auto result = res->rd.next(req.should_stop); - if (!result) { - // connection was closed - GGML_ASSERT(req.should_stop()); - return res; - } if (result->is_error()) { res->error(result->to_json()); @@ -3326,11 +3197,6 @@ void server_routes::init_routes() { // get the result auto result = res->rd.next(req.should_stop); - if (!result) { - // connection was closed - GGML_ASSERT(req.should_stop()); - return res; - } if (result->is_error()) { res->error(result->to_json()); @@ -3837,12 +3703,7 @@ void server_routes::init_routes() { } // get the result - auto result = rd.next(req.should_stop); - if (!result) { - // connection was closed - GGML_ASSERT(req.should_stop()); - return res; - } + server_task_result_ptr result = rd.next(req.should_stop); if (result->is_error()) { res->error(result->to_json()); @@ -3871,12 +3732,7 @@ void server_routes::init_routes() { } // get the result - auto result = rd.next(req.should_stop); - if (!result) { - // connection was closed - GGML_ASSERT(req.should_stop()); - return res; - } + server_task_result_ptr result = rd.next(req.should_stop); if (result->is_error()) { res->error(result->to_json()); @@ -3909,12 +3765,7 @@ std::unique_ptr server_routes::handle_slots_save(const ser rd.post_task(std::move(task)); } - auto result = rd.next(req.should_stop); - if (!result) { - // connection was closed - GGML_ASSERT(req.should_stop()); - return res; - } + server_task_result_ptr result = rd.next(req.should_stop); if (result->is_error()) { res->error(result->to_json()); @@ -3945,12 +3796,7 @@ std::unique_ptr server_routes::handle_slots_restore(const rd.post_task(std::move(task)); } - auto result = rd.next(req.should_stop); - if (!result) { - // connection was closed - GGML_ASSERT(req.should_stop()); - return res; - } + server_task_result_ptr result = rd.next(req.should_stop); if (result->is_error()) { res->error(result->to_json()); @@ -3972,12 +3818,7 @@ std::unique_ptr server_routes::handle_slots_erase(const se rd.post_task(std::move(task)); } - auto result = rd.next(req.should_stop); - if (!result) { - // connection was closed - GGML_ASSERT(req.should_stop()); - return res; - } + server_task_result_ptr result = rd.next(req.should_stop); if (result->is_error()) { res->error(result->to_json()); diff --git a/tools/server/server-models.cpp b/tools/server/server-models.cpp index 803cb02..08a0da5 100644 --- a/tools/server/server-models.cpp +++ b/tools/server/server-models.cpp @@ -21,13 +21,11 @@ #ifdef _WIN32 #include -#include #else #include #include #include #include -extern char **environ; #endif #if defined(__APPLE__) && defined(__MACH__) @@ -36,8 +34,6 @@ extern char **environ; #include #endif -#define DEFAULT_STOP_TIMEOUT 10 // seconds - #define CMD_ROUTER_TO_CHILD_EXIT "cmd_router_to_child:exit" #define CMD_CHILD_TO_ROUTER_READY "cmd_child_to_router:ready" @@ -101,49 +97,6 @@ static void unset_reserved_args(common_preset & preset, bool unset_model_args) { } } -#ifdef _WIN32 -static std::string wide_to_utf8(const wchar_t * ws) { - if (!ws || !*ws) { - return {}; - } - - const int len = static_cast(std::wcslen(ws)); - const int bytes = WideCharToMultiByte(CP_UTF8, 0, ws, len, nullptr, 0, nullptr, nullptr); - if (bytes == 0) { - return {}; - } - - std::string utf8(bytes, '\0'); - WideCharToMultiByte(CP_UTF8, 0, ws, len, utf8.data(), bytes, nullptr, nullptr); - - return utf8; -} -#endif - -static std::vector get_environment() { - std::vector env; - -#ifdef _WIN32 - LPWCH env_block = GetEnvironmentStringsW(); - if (!env_block) { - return env; - } - for (LPWCH e = env_block; *e; e += wcslen(e) + 1) { - env.emplace_back(wide_to_utf8(e)); - } - FreeEnvironmentStringsW(env_block); -#else - if (environ == nullptr) { - return env; - } - for (char ** e = environ; *e != nullptr; e++) { - env.emplace_back(*e); - } -#endif - - return env; -} - void server_model_meta::update_args(common_preset_context & ctx_preset, std::string bin_path) { // update params unset_reserved_args(preset, false); @@ -162,11 +115,14 @@ void server_model_meta::update_args(common_preset_context & ctx_preset, std::str server_models::server_models( const common_params & params, int argc, - char ** argv) + char ** argv, + char ** envp) : ctx_preset(LLAMA_EXAMPLE_SERVER), base_params(params), - base_env(get_environment()), base_preset(ctx_preset.load_from_args(argc, argv)) { + for (char ** env = envp; *env != nullptr; env++) { + base_env.push_back(std::string(*env)); + } // clean up base preset unset_reserved_args(base_preset, true); // set binary path @@ -247,14 +203,13 @@ void server_models::load_models() { // convert presets to server_model_meta and add to mapping for (const auto & preset : final_presets) { server_model_meta meta{ - /* preset */ preset.second, - /* name */ preset.first, - /* port */ 0, - /* status */ SERVER_MODEL_STATUS_UNLOADED, - /* last_used */ 0, - /* args */ std::vector(), - /* exit_code */ 0, - /* stop_timeout */ DEFAULT_STOP_TIMEOUT, + /* preset */ preset.second, + /* name */ preset.first, + /* port */ 0, + /* status */ SERVER_MODEL_STATUS_UNLOADED, + /* last_used */ 0, + /* args */ std::vector(), + /* exit_code */ 0 }; add_model(std::move(meta)); } @@ -272,20 +227,6 @@ void server_models::load_models() { } } - // handle custom stop-timeout option - for (auto & [name, inst] : mapping) { - std::string val; - if (inst.meta.preset.get_option(COMMON_ARG_PRESET_STOP_TIMEOUT, val)) { - try { - inst.meta.stop_timeout = std::stoi(val); - } catch (...) { - SRV_WRN("invalid stop-timeout value '%s' for model '%s', using default %d seconds\n", - val.c_str(), name.c_str(), DEFAULT_STOP_TIMEOUT); - inst.meta.stop_timeout = DEFAULT_STOP_TIMEOUT; - } - } - } - // load any autoload models std::vector models_to_load; for (const auto & [name, inst] : mapping) { @@ -421,7 +362,7 @@ void server_models::unload_lru() { int64_t lru_last_used = ggml_time_ms(); size_t count_active = 0; { - std::unique_lock lk(mutex); + std::lock_guard lk(mutex); for (const auto & m : mapping) { if (m.second.meta.is_active()) { count_active++; @@ -435,13 +376,6 @@ void server_models::unload_lru() { if (!lru_model_name.empty() && count_active >= (size_t)base_params.models_max) { SRV_INF("models_max limit reached, removing LRU name=%s\n", lru_model_name.c_str()); unload(lru_model_name); - // wait for unload to complete - { - std::unique_lock lk(mutex); - cv.wait(lk, [this, &lru_model_name]() { - return mapping[lru_model_name].meta.status == SERVER_MODEL_STATUS_UNLOADED; - }); - } } } @@ -502,83 +436,38 @@ void server_models::load(const std::string & name) { // start a thread to manage the child process // captured variables are guaranteed to be destroyed only after the thread is joined - inst.th = std::thread([this, name, child_proc = inst.subproc, port = inst.meta.port, stop_timeout = inst.meta.stop_timeout]() { - FILE * stdin_file = subprocess_stdin(child_proc.get()); - FILE * stdout_file = subprocess_stdout(child_proc.get()); // combined stdout/stderr - - std::thread log_thread([&]() { - // read stdout/stderr and forward to main server log - // also handle status report from child process - bool state_received = false; // true if child state received - if (stdout_file) { - char buffer[4096]; - while (fgets(buffer, sizeof(buffer), stdout_file) != nullptr) { - LOG("[%5d] %s", port, buffer); - if (!state_received && std::strstr(buffer, CMD_CHILD_TO_ROUTER_READY) != nullptr) { - // child process is ready - this->update_status(name, SERVER_MODEL_STATUS_LOADED, 0); - state_received = true; - } + inst.th = std::thread([this, name, child_proc = inst.subproc, port = inst.meta.port]() { + // read stdout/stderr and forward to main server log + bool state_received = false; // true if child state received + FILE * p_stdout_stderr = subprocess_stdout(child_proc.get()); + if (p_stdout_stderr) { + char buffer[4096]; + while (fgets(buffer, sizeof(buffer), p_stdout_stderr) != nullptr) { + LOG("[%5d] %s", port, buffer); + if (!state_received && std::strstr(buffer, CMD_CHILD_TO_ROUTER_READY) != nullptr) { + // child process is ready + this->update_status(name, SERVER_MODEL_STATUS_LOADED); + state_received = true; } - } else { - SRV_ERR("failed to get stdout/stderr of child process for name=%s\n", name.c_str()); } - }); - - std::thread stopping_thread([&]() { - // thread to monitor stopping signal - auto is_stopping = [this, &name]() { - return this->stopping_models.find(name) != this->stopping_models.end(); - }; - { - std::unique_lock lk(this->mutex); - this->cv_stop.wait(lk, is_stopping); - } - SRV_INF("stopping model instance name=%s\n", name.c_str()); - // send interrupt to child process - fprintf(stdin_file, "%s\n", CMD_ROUTER_TO_CHILD_EXIT); - fflush(stdin_file); - // wait to stop gracefully or timeout - int64_t start_time = ggml_time_ms(); - while (true) { - std::unique_lock lk(this->mutex); - if (!is_stopping()) { - return; // already stopped - } - int64_t elapsed = ggml_time_ms() - start_time; - if (elapsed >= stop_timeout * 1000) { - // timeout, force kill - SRV_WRN("force-killing model instance name=%s after %d seconds timeout\n", name.c_str(), stop_timeout); - subprocess_terminate(child_proc.get()); - return; - } - this->cv_stop.wait_for(lk, std::chrono::seconds(1)); - } - }); - + } else { + SRV_ERR("failed to get stdout/stderr of child process for name=%s\n", name.c_str()); + } // we reach here when the child process exits - // note: we cannot join() prior to this point because it will close stdin_file - if (log_thread.joinable()) { - log_thread.join(); - } - - // stop the timeout monitoring thread - { - std::lock_guard lk(this->mutex); - stopping_models.erase(name); - cv_stop.notify_all(); - } - if (stopping_thread.joinable()) { - stopping_thread.join(); - } - - // get the exit code int exit_code = 0; subprocess_join(child_proc.get(), &exit_code); subprocess_destroy(child_proc.get()); - - // update status and exit code - this->update_status(name, SERVER_MODEL_STATUS_UNLOADED, exit_code); + // update PID and status + { + std::lock_guard lk(mutex); + auto it = mapping.find(name); + if (it != mapping.end()) { + auto & meta = it->second.meta; + meta.exit_code = exit_code; + meta.status = SERVER_MODEL_STATUS_UNLOADED; + } + cv.notify_all(); + } SRV_INF("instance name=%s exited with status %d\n", name.c_str(), exit_code); }); @@ -599,14 +488,22 @@ void server_models::load(const std::string & name) { cv.notify_all(); } +static void interrupt_subprocess(FILE * stdin_file) { + // because subprocess.h does not provide a way to send SIGINT, + // we will send a command to the child process to exit gracefully + if (stdin_file) { + fprintf(stdin_file, "%s\n", CMD_ROUTER_TO_CHILD_EXIT); + fflush(stdin_file); + } +} + void server_models::unload(const std::string & name) { std::lock_guard lk(mutex); auto it = mapping.find(name); if (it != mapping.end()) { if (it->second.meta.is_active()) { SRV_INF("unloading model instance name=%s\n", name.c_str()); - stopping_models.insert(name); - cv_stop.notify_all(); + interrupt_subprocess(it->second.stdin_file); // status change will be handled by the managing thread } else { SRV_WRN("model instance name=%s is not loaded\n", name.c_str()); @@ -621,8 +518,7 @@ void server_models::unload_all() { for (auto & [name, inst] : mapping) { if (inst.meta.is_active()) { SRV_INF("unloading model instance name=%s\n", name.c_str()); - stopping_models.insert(name); - cv_stop.notify_all(); + interrupt_subprocess(inst.stdin_file); // status change will be handled by the managing thread } // moving the thread to join list to avoid deadlock @@ -636,15 +532,16 @@ void server_models::unload_all() { } } -void server_models::update_status(const std::string & name, server_model_status status, int exit_code) { - std::unique_lock lk(mutex); - auto it = mapping.find(name); - if (it != mapping.end()) { - auto & meta = it->second.meta; - meta.status = status; - meta.exit_code = exit_code; +void server_models::update_status(const std::string & name, server_model_status status) { + // for now, we only allow updating to LOADED status + if (status != SERVER_MODEL_STATUS_LOADED) { + throw std::runtime_error("invalid status value"); + } + auto meta = get_meta(name); + if (meta.has_value()) { + meta->status = status; + update_meta(name, meta.value()); } - cv.notify_all(); } void server_models::wait_until_loaded(const std::string & name) { @@ -671,7 +568,6 @@ bool server_models::ensure_model_loaded(const std::string & name) { load(name); } - // for loading state SRV_INF("waiting until model name=%s is fully loaded...\n", name.c_str()); wait_until_loaded(name); @@ -704,10 +600,7 @@ server_http_res_ptr server_models::proxy_request(const server_http_req & req, co req.path, req.headers, req.body, - req.should_stop, - base_params.timeout_read, - base_params.timeout_write - ); + req.should_stop); return proxy; } @@ -902,7 +795,7 @@ void server_models_routes::init_routes() { res_err(res, format_error_response("model is not found", ERROR_TYPE_INVALID_REQUEST)); return res; } - if (!model->is_active()) { + if (model->status != SERVER_MODEL_STATUS_LOADED) { res_err(res, format_error_response("model is not loaded", ERROR_TYPE_INVALID_REQUEST)); return res; } @@ -995,18 +888,13 @@ server_http_proxy::server_http_proxy( const std::string & path, const std::map & headers, const std::string & body, - const std::function should_stop, - int32_t timeout_read, - int32_t timeout_write - ) { + const std::function should_stop) { // shared between reader and writer threads auto cli = std::make_shared(host, port); auto pipe = std::make_shared>(); // setup Client cli->set_connection_timeout(0, 200000); // 200 milliseconds - cli->set_write_timeout(timeout_read, 0); // reversed for cli (client) vs srv (server) - cli->set_read_timeout(timeout_write, 0); this->status = 500; // to be overwritten upon response this->cleanup = [pipe]() { pipe->close_read(); diff --git a/tools/server/server-models.h b/tools/server/server-models.h index a397abd..3e1868c 100644 --- a/tools/server/server-models.h +++ b/tools/server/server-models.h @@ -9,7 +9,6 @@ #include #include #include -#include /** * state diagram: @@ -57,7 +56,6 @@ struct server_model_meta { int64_t last_used = 0; // for LRU unloading std::vector args; // args passed to the model instance, will be populated by render_args() int exit_code = 0; // exit code of the model instance process (only valid if status == FAILED) - int stop_timeout = 0; // seconds to wait before force-killing the model instance during shutdown bool is_active() const { return status == SERVER_MODEL_STATUS_LOADED || status == SERVER_MODEL_STATUS_LOADING; @@ -85,10 +83,6 @@ private: std::condition_variable cv; std::map mapping; - // for stopping models - std::condition_variable cv_stop; - std::set stopping_models; - common_preset_context ctx_preset; common_params base_params; @@ -105,7 +99,7 @@ private: void add_model(server_model_meta && meta); public: - server_models(const common_params & params, int argc, char ** argv); + server_models(const common_params & params, int argc, char ** argv, char ** envp); void load_models(); @@ -125,7 +119,7 @@ public: void unload_all(); // update the status of a model instance (thread-safe) - void update_status(const std::string & name, server_model_status status, int exit_code); + void update_status(const std::string & name, server_model_status status); // wait until the model instance is fully loaded (thread-safe) // return when the model is loaded or failed to load @@ -147,8 +141,8 @@ struct server_models_routes { common_params params; json webui_settings = json::object(); server_models models; - server_models_routes(const common_params & params, int argc, char ** argv) - : params(params), models(params, argc, argv) { + server_models_routes(const common_params & params, int argc, char ** argv, char ** envp) + : params(params), models(params, argc, argv, envp) { if (!this->params.webui_config_json.empty()) { try { webui_settings = json::parse(this->params.webui_config_json); @@ -183,10 +177,7 @@ public: const std::string & path, const std::map & headers, const std::string & body, - const std::function should_stop, - int32_t timeout_read, - int32_t timeout_write - ); + const std::function should_stop); ~server_http_proxy() { if (cleanup) { cleanup(); diff --git a/tools/server/server-queue.cpp b/tools/server/server-queue.cpp index a2a026a..9a6ba56 100644 --- a/tools/server/server-queue.cpp +++ b/tools/server/server-queue.cpp @@ -74,26 +74,11 @@ int server_queue::get_new_id() { return new_id; } -void server_queue::pop_deferred_task(int id_slot) { +void server_queue::pop_deferred_task() { std::unique_lock lock(mutex_tasks); if (!queue_tasks_deferred.empty()) { - // try to find a task that uses the specified slot - bool found = false; - for (auto it = queue_tasks_deferred.begin(); it != queue_tasks_deferred.end(); ++it) { - if (it->id_slot == id_slot) { - QUE_DBG("pop deferred task (use slot %d), id_task = %d\n", id_slot, it->id); - queue_tasks.emplace_front(std::move(*it)); - queue_tasks_deferred.erase(it); - found = true; - break; - } - } - // if not tasks found using the slot, just pop the first deferred task (default behavior) - if (!found) { - QUE_DBG("pop deferred task, id_task = %d\n", queue_tasks_deferred.front().id); - queue_tasks.emplace_front(std::move(queue_tasks_deferred.front())); - queue_tasks_deferred.pop_front(); - } + queue_tasks.emplace_front(std::move(queue_tasks_deferred.front())); + queue_tasks_deferred.pop_front(); } time_last_task = ggml_time_ms(); condition_tasks.notify_one(); @@ -232,12 +217,12 @@ void server_response::add_waiting_task_id(int id_task) { waiting_task_ids.insert(id_task); } -void server_response::add_waiting_task_ids(const std::unordered_set & id_tasks) { +void server_response::add_waiting_tasks(const std::vector & tasks) { std::unique_lock lock(mutex_results); - for (const auto & id_task : id_tasks) { - RES_DBG("add task %d to waiting list. current waiting = %d (before add)\n", id_task, (int) waiting_task_ids.size()); - waiting_task_ids.insert(id_task); + for (const auto & task : tasks) { + RES_DBG("add task %d to waiting list. current waiting = %d (before add)\n", task.id, (int) waiting_task_ids.size()); + waiting_task_ids.insert(task.id); } } @@ -342,7 +327,6 @@ void server_response::terminate() { void server_response_reader::post_task(server_task && task, bool front) { GGML_ASSERT(id_tasks.empty() && "post_task() can only be called once per reader"); - GGML_ASSERT(!task.is_parent() && "not supported, use post_tasks() instead"); task.index = 0; id_tasks.insert(task.id); states.push_back(task.create_state()); @@ -354,18 +338,11 @@ void server_response_reader::post_tasks(std::vector && tasks, bool GGML_ASSERT(id_tasks.empty() && "post_tasks() can only be called once per reader"); id_tasks = server_task::get_list_id(tasks); states.reserve(tasks.size()); - size_t index = 0; - for (auto & task : tasks) { - task.index = index++; - states.push_back(task.create_state()); - // for child tasks - for (auto & child_task : task.child_tasks) { - child_task.index = index++; - states.push_back(child_task.create_state()); - } + for (size_t i = 0; i < tasks.size(); i++) { + tasks[i].index = i; + states.push_back(tasks[i].create_state()); } - GGML_ASSERT(states.size() == id_tasks.size()); - queue_results.add_waiting_task_ids(id_tasks); + queue_results.add_waiting_tasks(tasks); queue_tasks.post(std::move(tasks), front); } diff --git a/tools/server/server-queue.h b/tools/server/server-queue.h index 164f09b..3798aa2 100644 --- a/tools/server/server-queue.h +++ b/tools/server/server-queue.h @@ -44,8 +44,7 @@ public: int get_new_id(); // Call when the state of one slot is changed, it will move one task from deferred to main queue - // prioritize tasks that use the specified slot (otherwise, pop the first deferred task) - void pop_deferred_task(int id_slot); + void pop_deferred_task(); // if sleeping, request exiting sleep state and wait until it is done // returns immediately if not sleeping @@ -125,7 +124,7 @@ public: // add the id_task to the list of tasks waiting for response void add_waiting_task_id(int id_task); - void add_waiting_task_ids(const std::unordered_set & id_tasks); + void add_waiting_tasks(const std::vector & tasks); // when the request is finished, we can remove task associated with it void remove_waiting_task_id(int id_task); diff --git a/tools/server/server-task.cpp b/tools/server/server-task.cpp index 35ec7ad..22f5b20 100644 --- a/tools/server/server-task.cpp +++ b/tools/server/server-task.cpp @@ -78,7 +78,6 @@ json task_params::to_json(bool only_metrics) const { {"speculative.p_min", speculative.p_min}, {"timings_per_token", timings_per_token}, {"post_sampling_probs", post_sampling_probs}, - {"backend_sampling", sampling.backend_sampling}, {"lora", lora}, }; } @@ -137,7 +136,6 @@ json task_params::to_json(bool only_metrics) const { {"speculative.p_min", speculative.p_min}, {"timings_per_token", timings_per_token}, {"post_sampling_probs", post_sampling_probs}, - {"backend_sampling", sampling.backend_sampling}, {"lora", lora}, }; } @@ -160,7 +158,6 @@ task_params server_task::params_from_json_cmpl( defaults.n_keep = params_base.n_keep; defaults.n_predict = params_base.n_predict; defaults.n_cache_reuse = params_base.n_cache_reuse; - defaults.cache_prompt = params_base.cache_prompt; defaults.antiprompt = params_base.antiprompt; // enabling this will output extra debug information in the HTTP responses from the server @@ -170,7 +167,7 @@ task_params server_task::params_from_json_cmpl( params.stream = json_value(data, "stream", false); auto stream_opt = json_value(data, "stream_options", json::object()); params.include_usage = json_value(stream_opt, "include_usage", false); - params.cache_prompt = json_value(data, "cache_prompt", defaults.cache_prompt); + params.cache_prompt = json_value(data, "cache_prompt", true); params.return_tokens = json_value(data, "return_tokens", false); params.return_progress = json_value(data, "return_progress", false); params.n_predict = json_value(data, "n_predict", json_value(data, "max_tokens", defaults.n_predict)); @@ -204,12 +201,9 @@ task_params server_task::params_from_json_cmpl( params.sampling.mirostat = json_value(data, "mirostat", defaults.sampling.mirostat); params.sampling.mirostat_tau = json_value(data, "mirostat_tau", defaults.sampling.mirostat_tau); params.sampling.mirostat_eta = json_value(data, "mirostat_eta", defaults.sampling.mirostat_eta); - params.sampling.adaptive_target = json_value(data, "adaptive_target", defaults.sampling.adaptive_target); - params.sampling.adaptive_decay = json_value(data, "adaptive_decay", defaults.sampling.adaptive_decay); params.sampling.seed = json_value(data, "seed", defaults.sampling.seed); params.sampling.n_probs = json_value(data, "n_probs", defaults.sampling.n_probs); params.sampling.min_keep = json_value(data, "min_keep", defaults.sampling.min_keep); - params.sampling.backend_sampling = json_value(data, "backend_sampling", defaults.sampling.backend_sampling); params.post_sampling_probs = json_value(data, "post_sampling_probs", defaults.post_sampling_probs); params.speculative.n_min = json_value(data, "speculative.n_min", defaults.speculative.n_min); @@ -817,15 +811,6 @@ json server_task_result_cmpl_final::to_json_anthropic() { msg.content = content; } - // thinking block comes first (Anthropic extended thinking format) - if (!msg.reasoning_content.empty()) { - content_blocks.push_back({ - {"type", "thinking"}, - {"thinking", msg.reasoning_content}, - {"signature", ""} // empty signature for local models (no cryptographic verification) - }); - } - if (!msg.content.empty()) { content_blocks.push_back({ {"type", "text"}, @@ -874,57 +859,20 @@ json server_task_result_cmpl_final::to_json_anthropic_stream() { stop_reason = oaicompat_msg.tool_calls.empty() ? "end_turn" : "tool_use"; } - bool has_thinking = !oaicompat_msg.reasoning_content.empty(); - bool has_text = !oaicompat_msg.content.empty(); + bool has_text = !oaicompat_msg.content.empty(); size_t num_tool_calls = oaicompat_msg.tool_calls.size(); - // content block indices: thinking (0) -> text (0 or 1) -> tool_use (n+) - size_t thinking_block_index = 0; - size_t text_block_index = has_thinking ? 1 : 0; - - bool thinking_block_started = false; - bool text_block_started = false; + bool text_block_started = false; std::unordered_set tool_calls_started; for (const auto & diff : oaicompat_msg_diffs) { - // handle thinking/reasoning content - if (!diff.reasoning_content_delta.empty()) { - if (!thinking_block_started) { - events.push_back({ - {"event", "content_block_start"}, - {"data", { - {"type", "content_block_start"}, - {"index", thinking_block_index}, - {"content_block", { - {"type", "thinking"}, - {"thinking", ""} - }} - }} - }); - thinking_block_started = true; - } - - events.push_back({ - {"event", "content_block_delta"}, - {"data", { - {"type", "content_block_delta"}, - {"index", thinking_block_index}, - {"delta", { - {"type", "thinking_delta"}, - {"thinking", diff.reasoning_content_delta} - }} - }} - }); - } - - // handle regular text content if (!diff.content_delta.empty()) { if (!text_block_started) { events.push_back({ {"event", "content_block_start"}, {"data", { {"type", "content_block_start"}, - {"index", text_block_index}, + {"index", 0}, {"content_block", { {"type", "text"}, {"text", ""} @@ -938,7 +886,7 @@ json server_task_result_cmpl_final::to_json_anthropic_stream() { {"event", "content_block_delta"}, {"data", { {"type", "content_block_delta"}, - {"index", text_block_index}, + {"index", 0}, {"delta", { {"type", "text_delta"}, {"text", diff.content_delta} @@ -947,9 +895,8 @@ json server_task_result_cmpl_final::to_json_anthropic_stream() { }); } - // handle tool calls if (diff.tool_call_index != std::string::npos) { - size_t content_block_index = (has_thinking ? 1 : 0) + (has_text ? 1 : 0) + diff.tool_call_index; + size_t content_block_index = (has_text ? 1 : 0) + diff.tool_call_index; if (tool_calls_started.find(diff.tool_call_index) == tool_calls_started.end()) { const auto & full_tool_call = oaicompat_msg.tool_calls[diff.tool_call_index]; @@ -985,42 +932,18 @@ json server_task_result_cmpl_final::to_json_anthropic_stream() { } } - // close content blocks in order - if (has_thinking) { - // Anthropic API requires a signature_delta before closing thinking blocks - // We use an empty signature since we can't generate a cryptographic signature for local models - events.push_back({ - {"event", "content_block_delta"}, - {"data", { - {"type", "content_block_delta"}, - {"index", thinking_block_index}, - {"delta", { - {"type", "signature_delta"}, - {"signature", ""} - }} - }} - }); - events.push_back({ - {"event", "content_block_stop"}, - {"data", { - {"type", "content_block_stop"}, - {"index", thinking_block_index} - }} - }); - } - if (has_text) { events.push_back({ {"event", "content_block_stop"}, {"data", { {"type", "content_block_stop"}, - {"index", text_block_index} + {"index", 0} }} }); } for (size_t i = 0; i < num_tool_calls; i++) { - size_t content_block_index = (has_thinking ? 1 : 0) + (has_text ? 1 : 0) + i; + size_t content_block_index = (has_text ? 1 : 0) + i; events.push_back({ {"event", "content_block_stop"}, {"data", { @@ -1228,10 +1151,11 @@ json server_task_result_rerank::to_json() { json server_task_result_cmpl_partial::to_json_anthropic() { json events = json::array(); bool first = (n_decoded == 1); - // use member variables to track block state across streaming calls - // (anthropic_thinking_block_started, anthropic_text_block_started) + bool text_block_started = false; if (first) { + text_block_started = false; + events.push_back({ {"event", "message_start"}, {"data", { @@ -1253,69 +1177,28 @@ json server_task_result_cmpl_partial::to_json_anthropic() { }); } - // content block indices: thinking (0) -> text (0 or 1) -> tool_use (n+) - size_t thinking_block_index = 0; - // use anthropic_has_reasoning (set in update()) to know if ANY reasoning was generated - size_t text_block_index = anthropic_has_reasoning ? 1 : 0; - - // use local copies of streaming state (copied from task_result_state in update()) - // these reflect the state BEFORE this chunk was processed - bool thinking_started = anthropic_thinking_block_started; - bool text_started = anthropic_text_block_started; - for (const auto & diff : oaicompat_msg_diffs) { - // handle thinking/reasoning content - if (!diff.reasoning_content_delta.empty()) { - if (!thinking_started) { - events.push_back({ - {"event", "content_block_start"}, - {"data", { - {"type", "content_block_start"}, - {"index", thinking_block_index}, - {"content_block", { - {"type", "thinking"}, - {"thinking", ""} - }} - }} - }); - thinking_started = true; - } - - events.push_back({ - {"event", "content_block_delta"}, - {"data", { - {"type", "content_block_delta"}, - {"index", thinking_block_index}, - {"delta", { - {"type", "thinking_delta"}, - {"thinking", diff.reasoning_content_delta} - }} - }} - }); - } - - // handle regular text content if (!diff.content_delta.empty()) { - if (!text_started) { + if (!text_block_started) { events.push_back({ {"event", "content_block_start"}, {"data", { {"type", "content_block_start"}, - {"index", text_block_index}, + {"index", 0}, {"content_block", { {"type", "text"}, {"text", ""} }} }} }); - text_started = true; + text_block_started = true; } events.push_back({ {"event", "content_block_delta"}, {"data", { {"type", "content_block_delta"}, - {"index", text_block_index}, + {"index", 0}, {"delta", { {"type", "text_delta"}, {"text", diff.content_delta} @@ -1324,10 +1207,8 @@ json server_task_result_cmpl_partial::to_json_anthropic() { }); } - // handle tool calls if (diff.tool_call_index != std::string::npos) { - // use anthropic_has_reasoning for thinking block count (persists across calls) - size_t content_block_index = (anthropic_has_reasoning ? 1 : 0) + (text_started ? 1 : 0) + diff.tool_call_index; + size_t content_block_index = (text_block_started ? 1 : 0) + diff.tool_call_index; if (!diff.tool_call_delta.name.empty()) { events.push_back({ diff --git a/tools/server/server-task.h b/tools/server/server-task.h index 11943ee..687770d 100644 --- a/tools/server/server-task.h +++ b/tools/server/server-task.h @@ -96,10 +96,6 @@ struct task_result_state { std::string generated_text; // append new chunks of generated text here std::vector generated_tool_call_ids; - // for Anthropic API streaming: track content block state across chunks - bool anthropic_thinking_block_started = false; - bool anthropic_text_block_started = false; - task_result_state(const common_chat_syntax & oaicompat_chat_syntax) : oaicompat_chat_syntax(oaicompat_chat_syntax) {} @@ -121,10 +117,8 @@ struct server_task { int id_slot = -1; // used by parallel sampling (multiple completions from same prompt) - int id_parent = -1; - // temporary store of child tasks for scheduling - // note: accessing to elements is invalid after the task is moved to server_slot - std::vector child_tasks; + size_t n_children = 0; // number of tasks reusing this prompt + int id_parent = -1; // used by SERVER_TASK_TYPE_INFERENCE task_params params; @@ -158,36 +152,6 @@ struct server_task { return tokens.size(); } - bool need_embd() const { - switch (type) { - case SERVER_TASK_TYPE_EMBEDDING: - case SERVER_TASK_TYPE_RERANK: - return true; - default: - return false; - } - } - - bool need_logits() const { - switch (type) { - case SERVER_TASK_TYPE_COMPLETION: - case SERVER_TASK_TYPE_INFILL: - return true; - default: - return false; - } - } - - bool need_sampling() const { - switch (type) { - case SERVER_TASK_TYPE_COMPLETION: - case SERVER_TASK_TYPE_INFILL: - return true; - default: - return false; - } - } - static task_params params_from_json_cmpl( const llama_vocab * vocab, const common_params & params_base, @@ -199,30 +163,18 @@ struct server_task { std::unordered_set ids(tasks.size()); for (size_t i = 0; i < tasks.size(); i++) { ids.insert(tasks[i].id); - for (auto & child : tasks[i].child_tasks) { - ids.insert(child.id); - } } return ids; } - void add_child(int id_parent, int id_child) { + server_task create_child(int id_parent, int id_child) const { server_task copy; - copy.id = id_child; copy.id_parent = id_parent; copy.params = params; copy.type = type; copy.tokens = tokens.clone(); - copy.id_slot = -1; // child tasks cannot specify slot - - // use different sampling seed for each child - // note: https://github.com/ggml-org/llama.cpp/pull/18700#discussion_r2675115723 - if (copy.params.sampling.seed != LLAMA_DEFAULT_SEED) { - copy.params.sampling.seed += (uint32_t)child_tasks.size() + 1; - } - - child_tasks.push_back(std::move(copy)); + return copy; } // the task will be moved into queue, then onto slots @@ -230,14 +182,6 @@ struct server_task { task_result_state create_state() const { return task_result_state(params.oaicompat_chat_syntax); } - - bool is_parent() const { - return child_tasks.size() > 0; - } - - bool is_child() const { - return id_parent != -1; - } }; struct result_timings { @@ -393,12 +337,6 @@ struct server_task_result_cmpl_partial : server_task_result { std::vector oaicompat_msg_diffs; // to be populated by update() bool is_updated = false; - // for Anthropic API: track if any reasoning content has been generated - bool anthropic_has_reasoning = false; - // Streaming state copied from task_result_state for this chunk - bool anthropic_thinking_block_started = false; - bool anthropic_text_block_started = false; - virtual bool is_stop() override { return false; // in stream mode, partial responses are not considered stop } @@ -408,22 +346,6 @@ struct server_task_result_cmpl_partial : server_task_result { virtual void update(task_result_state & state) override { is_updated = true; state.update_chat_msg(content, true, oaicompat_msg_diffs); - // track if the accumulated message has any reasoning content - anthropic_has_reasoning = !state.chat_msg.reasoning_content.empty(); - - // Copy current state for use in to_json_anthropic() (reflects state BEFORE this chunk) - anthropic_thinking_block_started = state.anthropic_thinking_block_started; - anthropic_text_block_started = state.anthropic_text_block_started; - - // Pre-compute state updates based on diffs (for next chunk) - for (const auto & diff : oaicompat_msg_diffs) { - if (!diff.reasoning_content_delta.empty() && !state.anthropic_thinking_block_started) { - state.anthropic_thinking_block_started = true; - } - if (!diff.content_delta.empty() && !state.anthropic_text_block_started) { - state.anthropic_text_block_started = true; - } - } } json to_json_non_oaicompat(); diff --git a/tools/server/server.cpp b/tools/server/server.cpp index 1d9abf6..0fbc7b6 100644 --- a/tools/server/server.cpp +++ b/tools/server/server.cpp @@ -66,7 +66,7 @@ static server_http_context::handler_t ex_wrapper(server_http_context::handler_t }; } -int main(int argc, char ** argv) { +int main(int argc, char ** argv, char ** envp) { // own arguments required by this example common_params params; @@ -126,7 +126,7 @@ int main(int argc, char ** argv) { if (is_router_server) { // setup server instances manager try { - models_routes.emplace(params, argc, argv); + models_routes.emplace(params, argc, argv, envp); } catch (const std::exception & e) { LOG_ERR("%s: failed to initialize router models: %s\n", __func__, e.what()); return 1; diff --git a/tools/server/tests/unit/test_chat_completion.py b/tools/server/tests/unit/test_chat_completion.py index d56a930..64f3158 100644 --- a/tools/server/tests/unit/test_chat_completion.py +++ b/tools/server/tests/unit/test_chat_completion.py @@ -434,8 +434,8 @@ def test_context_size_exceeded_stream(): @pytest.mark.parametrize( "n_batch,batch_count,reuse_cache", [ - (64, 4, False), - (64, 2, True), + (64, 3, False), + (64, 1, True), ] ) def test_return_progress(n_batch, batch_count, reuse_cache): @@ -462,18 +462,10 @@ def test_return_progress(n_batch, batch_count, reuse_cache): res = make_cmpl_request() last_progress = None total_batch_count = 0 - for data in res: cur_progress = data.get("prompt_progress", None) if cur_progress is None: continue - if total_batch_count == 0: - # first progress report must have n_cache == n_processed - assert cur_progress["total"] > 0 - assert cur_progress["cache"] == cur_progress["processed"] - if reuse_cache: - # when reusing cache, we expect some cached tokens - assert cur_progress["cache"] > 0 if last_progress is not None: assert cur_progress["total"] == last_progress["total"] assert cur_progress["cache"] == last_progress["cache"] @@ -481,7 +473,6 @@ def test_return_progress(n_batch, batch_count, reuse_cache): total_batch_count += 1 last_progress = cur_progress - # last progress should indicate completion (all tokens processed) assert last_progress is not None assert last_progress["total"] > 0 assert last_progress["processed"] == last_progress["total"] @@ -491,22 +482,17 @@ def test_return_progress(n_batch, batch_count, reuse_cache): def test_chat_completions_multiple_choices(): global server server.start() - # make sure cache can be reused across multiple choices and multiple requests - # ref: https://github.com/ggml-org/llama.cpp/pull/18663 - for _ in range(2): - res = server.make_request("POST", "/chat/completions", data={ - "max_tokens": 8, - "n": 2, - "messages": [ - {"role": "system", "content": "Book"}, - {"role": "user", "content": "What is the best book"}, - ], - # test forcing the same slot to be used - # the scheduler should not be locked up in this case - "id_slot": 0, - }) - assert res.status_code == 200 - assert len(res.body["choices"]) == 2 - for choice in res.body["choices"]: - assert "assistant" == choice["message"]["role"] - assert choice["finish_reason"] == "length" + res = server.make_request("POST", "/chat/completions", data={ + "max_tokens": 8, + "n": 2, + "messages": [ + {"role": "system", "content": "Book"}, + {"role": "user", "content": "What is the best book"}, + ], + }) + assert res.status_code == 200 + assert len(res.body["choices"]) == 2 + for choice in res.body["choices"]: + assert "assistant" == choice["message"]["role"] + assert match_regex("Suddenly", choice["message"]["content"]) + assert choice["finish_reason"] == "length" diff --git a/tools/server/tests/unit/test_compat_anthropic.py b/tools/server/tests/unit/test_compat_anthropic.py index e16e023..e0a0035 100644 --- a/tools/server/tests/unit/test_compat_anthropic.py +++ b/tools/server/tests/unit/test_compat_anthropic.py @@ -805,92 +805,3 @@ def test_anthropic_vs_openai_different_response_format(): assert "input_tokens" in anthropic_res.body["usage"] assert "completion_tokens" in openai_res.body["usage"] assert "output_tokens" in anthropic_res.body["usage"] - - -# Extended thinking tests with reasoning models - -@pytest.mark.slow -@pytest.mark.parametrize("stream", [False, True]) -def test_anthropic_thinking_with_reasoning_model(stream): - """Test that thinking content blocks are properly returned for reasoning models""" - global server - server = ServerProcess() - server.model_hf_repo = "bartowski/DeepSeek-R1-Distill-Qwen-7B-GGUF" - server.model_hf_file = "DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf" - server.reasoning_format = "deepseek" - server.jinja = True - server.n_ctx = 8192 - server.n_predict = 1024 - server.server_port = 8084 - server.start(timeout_seconds=600) # large model needs time to download - - if stream: - res = server.make_stream_request("POST", "/v1/messages", data={ - "model": "test", - "max_tokens": 1024, - "thinking": { - "type": "enabled", - "budget_tokens": 500 - }, - "messages": [ - {"role": "user", "content": "What is 2+2?"} - ], - "stream": True - }) - - events = list(res) - - # should have thinking content block events - thinking_starts = [e for e in events if - e.get("type") == "content_block_start" and - e.get("content_block", {}).get("type") == "thinking"] - assert len(thinking_starts) > 0, "Should have thinking content_block_start event" - assert thinking_starts[0]["index"] == 0, "Thinking block should be at index 0" - - # should have thinking_delta events - thinking_deltas = [e for e in events if - e.get("type") == "content_block_delta" and - e.get("delta", {}).get("type") == "thinking_delta"] - assert len(thinking_deltas) > 0, "Should have thinking_delta events" - - # should have signature_delta event before thinking block closes (Anthropic API requirement) - signature_deltas = [e for e in events if - e.get("type") == "content_block_delta" and - e.get("delta", {}).get("type") == "signature_delta"] - assert len(signature_deltas) > 0, "Should have signature_delta event for thinking block" - - # should have text block after thinking - text_starts = [e for e in events if - e.get("type") == "content_block_start" and - e.get("content_block", {}).get("type") == "text"] - assert len(text_starts) > 0, "Should have text content_block_start event" - assert text_starts[0]["index"] == 1, "Text block should be at index 1 (after thinking)" - else: - res = server.make_request("POST", "/v1/messages", data={ - "model": "test", - "max_tokens": 1024, - "thinking": { - "type": "enabled", - "budget_tokens": 500 - }, - "messages": [ - {"role": "user", "content": "What is 2+2?"} - ] - }) - - assert res.status_code == 200 - assert res.body["type"] == "message" - - content = res.body["content"] - assert len(content) >= 2, "Should have at least thinking and text blocks" - - # first block should be thinking - thinking_blocks = [b for b in content if b.get("type") == "thinking"] - assert len(thinking_blocks) > 0, "Should have thinking content block" - assert "thinking" in thinking_blocks[0], "Thinking block should have 'thinking' field" - assert len(thinking_blocks[0]["thinking"]) > 0, "Thinking content should not be empty" - assert "signature" in thinking_blocks[0], "Thinking block should have 'signature' field (Anthropic API requirement)" - - # should also have text block - text_blocks = [b for b in content if b.get("type") == "text"] - assert len(text_blocks) > 0, "Should have text content block" diff --git a/tools/server/tests/unit/test_completion.py b/tools/server/tests/unit/test_completion.py index 2a98060..ef1757d 100644 --- a/tools/server/tests/unit/test_completion.py +++ b/tools/server/tests/unit/test_completion.py @@ -393,12 +393,12 @@ def test_completion_unified(n_ctx, n_slots, n_predict_vals, expected_success): for res, n_predict, expect_ok in zip(results, n_predict_vals, expected_success): if expect_ok: assert res.status_code == 200 - - # note: https://github.com/ggml-org/llama.cpp/pull/18700#issuecomment-3728695581 - if res.status_code == 200: assert "content" in res.body if "timings" in res.body: assert res.body["timings"]["predicted_n"] == n_predict + else: + assert res.status_code == 500 + assert "content" not in res.body @pytest.mark.parametrize( diff --git a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte index 27ab975..fd2f7f6 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte @@ -10,11 +10,21 @@ import { INPUT_CLASSES } from '$lib/constants/input-classes'; import { SETTING_CONFIG_DEFAULT } from '$lib/constants/settings-config'; import { config } from '$lib/stores/settings.svelte'; - import { modelOptions, selectedModelId } from '$lib/stores/models.svelte'; + import { modelsStore, modelOptions, selectedModelId } from '$lib/stores/models.svelte'; import { isRouterMode } from '$lib/stores/server.svelte'; import { chatStore } from '$lib/stores/chat.svelte'; import { activeMessages } from '$lib/stores/conversations.svelte'; - import { MimeTypeText } from '$lib/enums'; + import { + FileTypeCategory, + MimeTypeApplication, + FileExtensionAudio, + FileExtensionImage, + FileExtensionPdf, + FileExtensionText, + MimeTypeAudio, + MimeTypeImage, + MimeTypeText + } from '$lib/enums'; import { isIMEComposing, parseClipboardContent } from '$lib/utils'; import { AudioRecorder, @@ -51,6 +61,7 @@ let audioRecorder: AudioRecorder | undefined; let chatFormActionsRef: ChatFormActions | undefined = $state(undefined); let currentConfig = $derived(config()); + let fileAcceptString = $state(undefined); let fileInputRef: ChatFormFileInputInvisible | undefined = $state(undefined); let isRecording = $state(false); let message = $state(''); @@ -93,6 +104,40 @@ return null; }); + // State for model props reactivity + let modelPropsVersion = $state(0); + + // Fetch model props when active model changes (works for both MODEL and ROUTER mode) + $effect(() => { + if (activeModelId) { + const cached = modelsStore.getModelProps(activeModelId); + if (!cached) { + modelsStore.fetchModelProps(activeModelId).then(() => { + modelPropsVersion++; + }); + } + } + }); + + // Derive modalities from active model (works for both MODEL and ROUTER mode) + let hasAudioModality = $derived.by(() => { + if (activeModelId) { + void modelPropsVersion; // Trigger reactivity on props fetch + return modelsStore.modelSupportsAudio(activeModelId); + } + + return false; + }); + + let hasVisionModality = $derived.by(() => { + if (activeModelId) { + void modelPropsVersion; // Trigger reactivity on props fetch + return modelsStore.modelSupportsVision(activeModelId); + } + + return false; + }); + function checkModelSelected(): boolean { if (!hasModelSelected) { // Open the model selector @@ -103,12 +148,42 @@ return true; } + function getAcceptStringForFileType(fileType: FileTypeCategory): string { + switch (fileType) { + case FileTypeCategory.IMAGE: + return [...Object.values(FileExtensionImage), ...Object.values(MimeTypeImage)].join(','); + + case FileTypeCategory.AUDIO: + return [...Object.values(FileExtensionAudio), ...Object.values(MimeTypeAudio)].join(','); + + case FileTypeCategory.PDF: + return [...Object.values(FileExtensionPdf), ...Object.values(MimeTypeApplication)].join( + ',' + ); + + case FileTypeCategory.TEXT: + return [...Object.values(FileExtensionText), MimeTypeText.PLAIN].join(','); + + default: + return ''; + } + } + function handleFileSelect(files: File[]) { onFileUpload?.(files); } - function handleFileUpload() { - fileInputRef?.click(); + function handleFileUpload(fileType?: FileTypeCategory) { + if (fileType) { + fileAcceptString = getAcceptStringForFileType(fileType); + } else { + fileAcceptString = undefined; + } + + // Use setTimeout to ensure the accept attribute is applied before opening dialog + setTimeout(() => { + fileInputRef?.click(); + }, 10); } async function handleKeydown(event: KeyboardEvent) { @@ -268,7 +343,13 @@ }); - +

void; + onFileUpload?: (fileType?: FileTypeCategory) => void; } let { @@ -26,6 +27,10 @@ ? 'Text files and PDFs supported. Images, audio, and video require vision models.' : 'Attach files'; }); + + function handleFileUpload(fileType?: FileTypeCategory) { + onFileUpload?.(fileType); + }
@@ -56,7 +61,7 @@ onFileUpload?.()} + onclick={() => handleFileUpload(FileTypeCategory.IMAGE)} > @@ -76,7 +81,7 @@ onFileUpload?.()} + onclick={() => handleFileUpload(FileTypeCategory.AUDIO)} > @@ -93,7 +98,7 @@ onFileUpload?.()} + onclick={() => handleFileUpload(FileTypeCategory.TEXT)} > @@ -104,7 +109,7 @@ onFileUpload?.()} + onclick={() => handleFileUpload(FileTypeCategory.PDF)} > diff --git a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte index dde9bda..730c348 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte @@ -24,7 +24,7 @@ isRecording?: boolean; hasText?: boolean; uploadedFiles?: ChatUploadedFile[]; - onFileUpload?: () => void; + onFileUpload?: (fileType?: FileTypeCategory) => void; onMicClick?: () => void; onStop?: () => void; } diff --git a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormFileInputInvisible.svelte b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormFileInputInvisible.svelte index d758822..52f3913 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormFileInputInvisible.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormFileInputInvisible.svelte @@ -1,14 +1,35 @@
- {#if hasPromptStats || isLive} + {#if hasPromptStats} -

- {isGenerationDisabled - ? 'Generation (waiting for tokens...)' - : 'Generation (token output)'} -

+

Generation (token output)

- {#if activeView === ChatMessageStatsView.GENERATION && hasGenerationStats} + {#if activeView === ChatMessageStatsView.GENERATION} = autoMicOnEmpty: false, // make sure these default values are in sync with `common.h` samplers: 'top_k;typ_p;top_p;min_p;temperature', - backend_sampling: false, temperature: 0.8, dynatemp_range: 0.0, dynatemp_exponent: 1.0, @@ -58,8 +57,6 @@ export const SETTING_CONFIG_INFO: Record = { 'When copying a message with text attachments, combine them into a single plain text string instead of a special format that can be pasted back as attachments.', samplers: 'The order at which samplers are applied, in simplified way. Default is "top_k;typ_p;top_p;min_p;temperature": top_k->typ_p->top_p->min_p->temperature', - backend_sampling: - 'Enable backend-based samplers. When enabled, supported samplers run on the accelerator backend for faster sampling.', temperature: 'Controls the randomness of the generated text by affecting the probability distribution of the output tokens. Higher = more random, lower = more focused.', dynatemp_range: diff --git a/tools/server/webui/src/lib/hooks/use-processing-state.svelte.ts b/tools/server/webui/src/lib/hooks/use-processing-state.svelte.ts index c06cf28..a861f23 100644 --- a/tools/server/webui/src/lib/hooks/use-processing-state.svelte.ts +++ b/tools/server/webui/src/lib/hooks/use-processing-state.svelte.ts @@ -1,27 +1,10 @@ import { activeProcessingState } from '$lib/stores/chat.svelte'; import { config } from '$lib/stores/settings.svelte'; -export interface LiveProcessingStats { - tokensProcessed: number; - totalTokens: number; - timeMs: number; - tokensPerSecond: number; - etaSecs?: number; -} - -export interface LiveGenerationStats { - tokensGenerated: number; - timeMs: number; - tokensPerSecond: number; -} - export interface UseProcessingStateReturn { readonly processingState: ApiProcessingState | null; getProcessingDetails(): string[]; getProcessingMessage(): string; - getPromptProgressText(): string | null; - getLiveProcessingStats(): LiveProcessingStats | null; - getLiveGenerationStats(): LiveGenerationStats | null; shouldShowDetails(): boolean; startMonitoring(): void; stopMonitoring(): void; @@ -46,7 +29,6 @@ export interface UseProcessingStateReturn { export function useProcessingState(): UseProcessingStateReturn { let isMonitoring = $state(false); let lastKnownState = $state(null); - let lastKnownProcessingStats = $state(null); // Derive processing state reactively from chatStore's direct state const processingState = $derived.by(() => { @@ -64,34 +46,6 @@ export function useProcessingState(): UseProcessingStateReturn { } }); - // Track last known processing stats for when promptProgress disappears - $effect(() => { - if (processingState?.promptProgress) { - const { processed, total, time_ms, cache } = processingState.promptProgress; - const actualProcessed = processed - cache; - const actualTotal = total - cache; - - if (actualProcessed > 0 && time_ms > 0) { - const tokensPerSecond = actualProcessed / (time_ms / 1000); - lastKnownProcessingStats = { - tokensProcessed: actualProcessed, - totalTokens: actualTotal, - timeMs: time_ms, - tokensPerSecond - }; - } - } - }); - - function getETASecs(done: number, total: number, elapsedMs: number): number | undefined { - const elapsedSecs = elapsedMs / 1000; - const progressETASecs = - done === 0 || elapsedSecs < 0.5 - ? undefined // can be the case for the 0% progress report - : elapsedSecs * (total / done - 1); - return progressETASecs; - } - function startMonitoring(): void { if (isMonitoring) return; isMonitoring = true; @@ -105,25 +59,28 @@ export function useProcessingState(): UseProcessingStateReturn { const currentConfig = config(); if (!currentConfig.keepStatsVisible) { lastKnownState = null; - lastKnownProcessingStats = null; } } function getProcessingMessage(): string { - if (!processingState) { + const state = processingState; + if (!state) { return 'Processing...'; } - switch (processingState.status) { + switch (state.status) { case 'initializing': return 'Initializing...'; case 'preparing': - if (processingState.progressPercent !== undefined) { - return `Processing (${processingState.progressPercent}%)`; + if (state.progressPercent !== undefined) { + return `Processing (${state.progressPercent}%)`; } return 'Preparing response...'; case 'generating': - return ''; + if (state.tokensDecoded > 0) { + return `Generating... (${state.tokensDecoded} tokens)`; + } + return 'Generating...'; default: return 'Processing...'; } @@ -174,76 +131,8 @@ export function useProcessingState(): UseProcessingStateReturn { } function shouldShowDetails(): boolean { - return processingState !== null && processingState.status !== 'idle'; - } - - /** - * Returns a short progress message with percent - */ - function getPromptProgressText(): string | null { - if (!processingState?.promptProgress) return null; - - const { processed, total, cache } = processingState.promptProgress; - - const actualProcessed = processed - cache; - const actualTotal = total - cache; - const percent = Math.round((actualProcessed / actualTotal) * 100); - const eta = getETASecs(actualProcessed, actualTotal, processingState.promptProgress.time_ms); - - if (eta !== undefined) { - const etaSecs = Math.ceil(eta); - return `Processing ${percent}% (ETA: ${etaSecs}s)`; - } - - return `Processing ${percent}%`; - } - - /** - * Returns live processing statistics for display (prompt processing phase) - * Returns last known stats when promptProgress becomes unavailable - */ - function getLiveProcessingStats(): LiveProcessingStats | null { - if (processingState?.promptProgress) { - const { processed, total, time_ms, cache } = processingState.promptProgress; - - const actualProcessed = processed - cache; - const actualTotal = total - cache; - - if (actualProcessed > 0 && time_ms > 0) { - const tokensPerSecond = actualProcessed / (time_ms / 1000); - - return { - tokensProcessed: actualProcessed, - totalTokens: actualTotal, - timeMs: time_ms, - tokensPerSecond - }; - } - } - - // Return last known stats if promptProgress is no longer available - return lastKnownProcessingStats; - } - - /** - * Returns live generation statistics for display (token generation phase) - */ - function getLiveGenerationStats(): LiveGenerationStats | null { - if (!processingState) return null; - - const { tokensDecoded, tokensPerSecond } = processingState; - - if (tokensDecoded <= 0) return null; - - // Calculate time from tokens and speed - const timeMs = - tokensPerSecond && tokensPerSecond > 0 ? (tokensDecoded / tokensPerSecond) * 1000 : 0; - - return { - tokensGenerated: tokensDecoded, - timeMs, - tokensPerSecond: tokensPerSecond || 0 - }; + const state = processingState; + return state !== null && state.status !== 'idle'; } return { @@ -252,9 +141,6 @@ export function useProcessingState(): UseProcessingStateReturn { }, getProcessingDetails, getProcessingMessage, - getPromptProgressText, - getLiveProcessingStats, - getLiveGenerationStats, shouldShowDetails, startMonitoring, stopMonitoring diff --git a/tools/server/webui/src/lib/services/chat.ts b/tools/server/webui/src/lib/services/chat.ts index 02fc638..c03b764 100644 --- a/tools/server/webui/src/lib/services/chat.ts +++ b/tools/server/webui/src/lib/services/chat.ts @@ -86,7 +86,6 @@ export class ChatService { dry_penalty_last_n, // Other parameters samplers, - backend_sampling, custom, timings_per_token, // Config options @@ -118,8 +117,7 @@ export class ChatService { role: msg.role, content: msg.content })), - stream, - return_progress: stream ? true : undefined + stream }; // Include model in request if provided (required in ROUTER mode) @@ -160,8 +158,6 @@ export class ChatService { : samplers; } - if (backend_sampling !== undefined) requestBody.backend_sampling = backend_sampling; - if (timings_per_token !== undefined) requestBody.timings_per_token = timings_per_token; if (custom) { @@ -275,7 +271,7 @@ export class ChatService { onReasoningChunk?: (chunk: string) => void, onToolCallChunk?: (chunk: string) => void, onModel?: (model: string) => void, - onTimings?: (timings?: ChatMessageTimings, promptProgress?: ChatMessagePromptProgress) => void, + onTimings?: (timings: ChatMessageTimings, promptProgress?: ChatMessagePromptProgress) => void, conversationId?: string, abortSignal?: AbortSignal ): Promise { @@ -370,13 +366,11 @@ export class ChatService { onModel?.(chunkModel); } - if (promptProgress) { - ChatService.notifyTimings(undefined, promptProgress, onTimings); - } - - if (timings) { + if (timings || promptProgress) { ChatService.notifyTimings(timings, promptProgress, onTimings); - lastTimings = timings; + if (timings) { + lastTimings = timings; + } } if (content) { @@ -774,11 +768,10 @@ export class ChatService { timings: ChatMessageTimings | undefined, promptProgress: ChatMessagePromptProgress | undefined, onTimingsCallback: - | ((timings?: ChatMessageTimings, promptProgress?: ChatMessagePromptProgress) => void) + | ((timings: ChatMessageTimings, promptProgress?: ChatMessagePromptProgress) => void) | undefined ): void { - if (!onTimingsCallback || (!timings && !promptProgress)) return; - + if (!timings || !onTimingsCallback) return; onTimingsCallback(timings, promptProgress); } } diff --git a/tools/server/webui/src/lib/stores/chat.svelte.ts b/tools/server/webui/src/lib/stores/chat.svelte.ts index 879b2f3..0108894 100644 --- a/tools/server/webui/src/lib/stores/chat.svelte.ts +++ b/tools/server/webui/src/lib/stores/chat.svelte.ts @@ -303,17 +303,11 @@ class ChatStore { const currentConfig = config(); const outputTokensMax = currentConfig.max_tokens || -1; - // Note: for timings data, the n_prompt does NOT include cache tokens const contextUsed = promptTokens + cacheTokens + predictedTokens; const outputTokensUsed = predictedTokens; - // Note: for prompt progress, the "processed" DOES include cache tokens - // we need to exclude them to get the real prompt tokens processed count - const progressCache = promptProgress?.cache || 0; - const progressActualDone = (promptProgress?.processed ?? 0) - progressCache; - const progressActualTotal = (promptProgress?.total ?? 0) - progressCache; const progressPercent = promptProgress - ? Math.round((progressActualDone / progressActualTotal) * 100) + ? Math.round((promptProgress.processed / promptProgress.total) * 100) : undefined; return { @@ -330,7 +324,6 @@ class ChatStore { topP: currentConfig.top_p ?? 0.95, speculative: false, progressPercent, - promptProgress, promptTokens, promptMs, cacheTokens @@ -541,7 +534,7 @@ class ChatStore { conversationsStore.updateMessageAtIndex(idx, { toolCalls: streamedToolCallContent }); }, onModel: (modelName: string) => recordModel(modelName), - onTimings: (timings?: ChatMessageTimings, promptProgress?: ChatMessagePromptProgress) => { + onTimings: (timings: ChatMessageTimings, promptProgress?: ChatMessagePromptProgress) => { const tokensPerSecond = timings?.predicted_ms && timings?.predicted_n ? (timings.predicted_n / timings.predicted_ms) * 1000 @@ -1039,7 +1032,7 @@ class ChatStore { }); }, - onTimings: (timings?: ChatMessageTimings, promptProgress?: ChatMessagePromptProgress) => { + onTimings: (timings: ChatMessageTimings, promptProgress?: ChatMessagePromptProgress) => { const tokensPerSecond = timings?.predicted_ms && timings?.predicted_n ? (timings.predicted_n / timings.predicted_ms) * 1000 @@ -1461,8 +1454,6 @@ class ChatStore { if (hasValue(currentConfig.dry_penalty_last_n)) apiOptions.dry_penalty_last_n = Number(currentConfig.dry_penalty_last_n); if (currentConfig.samplers) apiOptions.samplers = currentConfig.samplers; - if (currentConfig.backend_sampling) - apiOptions.backend_sampling = currentConfig.backend_sampling; if (currentConfig.custom) apiOptions.custom = currentConfig.custom; return apiOptions; diff --git a/tools/server/webui/src/lib/stores/settings.svelte.ts b/tools/server/webui/src/lib/stores/settings.svelte.ts index cda940b..e163833 100644 --- a/tools/server/webui/src/lib/stores/settings.svelte.ts +++ b/tools/server/webui/src/lib/stores/settings.svelte.ts @@ -294,14 +294,15 @@ class SettingsStore { * This sets up the default values from /props endpoint */ syncWithServerDefaults(): void { - const propsDefaults = this.getServerDefaults(); - - if (Object.keys(propsDefaults).length === 0) { - console.warn('No server defaults available for initialization'); + const serverParams = serverStore.defaultParams; + if (!serverParams) { + console.warn('No server parameters available for initialization'); return; } + const propsDefaults = this.getServerDefaults(); + for (const [key, propsValue] of Object.entries(propsDefaults)) { const currentValue = getConfigValue(this.config, key); diff --git a/tools/server/webui/src/lib/types/api.d.ts b/tools/server/webui/src/lib/types/api.d.ts index 714509f..e5fde24 100644 --- a/tools/server/webui/src/lib/types/api.d.ts +++ b/tools/server/webui/src/lib/types/api.d.ts @@ -149,7 +149,6 @@ export interface ApiLlamaCppServerProps { reasoning_in_content: boolean; thinking_forced_open: boolean; samplers: string[]; - backend_sampling: boolean; 'speculative.n_max': number; 'speculative.n_min': number; 'speculative.p_min': number; @@ -187,7 +186,6 @@ export interface ApiChatCompletionRequest { }>; stream?: boolean; model?: string; - return_progress?: boolean; // Reasoning parameters reasoning_format?: string; // Generation parameters @@ -213,7 +211,6 @@ export interface ApiChatCompletionRequest { dry_penalty_last_n?: number; // Sampler configuration samplers?: string[]; - backend_sampling?: boolean; // Custom parameters (JSON string) custom?: Record; timings_per_token?: boolean; @@ -314,7 +311,6 @@ export interface ApiSlotData { reasoning_in_content: boolean; thinking_forced_open: boolean; samplers: string[]; - backend_sampling: boolean; 'speculative.n_max': number; 'speculative.n_min': number; 'speculative.p_min': number; @@ -345,7 +341,6 @@ export interface ApiProcessingState { tokensPerSecond?: number; // Progress information from prompt_progress progressPercent?: number; - promptProgress?: ChatMessagePromptProgress; promptTokens?: number; promptMs?: number; cacheTokens?: number; diff --git a/tools/server/webui/src/lib/types/settings.d.ts b/tools/server/webui/src/lib/types/settings.d.ts index 38b3047..40de98b 100644 --- a/tools/server/webui/src/lib/types/settings.d.ts +++ b/tools/server/webui/src/lib/types/settings.d.ts @@ -43,7 +43,6 @@ export interface SettingsChatServiceOptions { dry_penalty_last_n?: number; // Sampler configuration samplers?: string | string[]; - backend_sampling?: boolean; // Custom parameters custom?: string; timings_per_token?: boolean; @@ -52,7 +51,7 @@ export interface SettingsChatServiceOptions { onReasoningChunk?: (chunk: string) => void; onToolCallChunk?: (chunk: string) => void; onModel?: (model: string) => void; - onTimings?: (timings?: ChatMessageTimings, promptProgress?: ChatMessagePromptProgress) => void; + onTimings?: (timings: ChatMessageTimings, promptProgress?: ChatMessagePromptProgress) => void; onComplete?: ( response: string, reasoningContent?: string, diff --git a/tools/server/webui/src/lib/utils/clipboard.ts b/tools/server/webui/src/lib/utils/clipboard.ts index 940e64c..91e8ea7 100644 --- a/tools/server/webui/src/lib/utils/clipboard.ts +++ b/tools/server/webui/src/lib/utils/clipboard.ts @@ -65,7 +65,10 @@ export async function copyCodeToClipboard( successMessage = 'Code copied to clipboard', errorMessage = 'Failed to copy code' ): Promise { - return copyToClipboard(rawCode, successMessage, errorMessage); + const doc = new DOMParser().parseFromString(rawCode, 'text/html'); + const decodedCode = doc.body.textContent ?? rawCode; + + return copyToClipboard(decodedCode, successMessage, errorMessage); } /** diff --git a/tools/server/webui/src/lib/utils/file-type.ts b/tools/server/webui/src/lib/utils/file-type.ts index 9a9996d..ff7ed6b 100644 --- a/tools/server/webui/src/lib/utils/file-type.ts +++ b/tools/server/webui/src/lib/utils/file-type.ts @@ -195,28 +195,9 @@ export function getFileTypeByExtension(filename: string): string | null { } export function isFileTypeSupported(filename: string, mimeType?: string): boolean { - // Images are detected and handled separately for vision models - if (mimeType) { - const category = getFileTypeCategory(mimeType); - if ( - category === FileTypeCategory.IMAGE || - category === FileTypeCategory.AUDIO || - category === FileTypeCategory.PDF - ) { - return true; - } - } - - // Check extension for known types (especially images without MIME) - const extCategory = getFileTypeCategoryByExtension(filename); - if ( - extCategory === FileTypeCategory.IMAGE || - extCategory === FileTypeCategory.AUDIO || - extCategory === FileTypeCategory.PDF - ) { + if (mimeType && getFileTypeCategory(mimeType)) { return true; } - // Fallback: treat everything else as text (inclusive by default) - return true; + return getFileTypeByExtension(filename) !== null; } diff --git a/tools/server/webui/src/lib/utils/index.ts b/tools/server/webui/src/lib/utils/index.ts index 588167b..ab60061 100644 --- a/tools/server/webui/src/lib/utils/index.ts +++ b/tools/server/webui/src/lib/utils/index.ts @@ -76,6 +76,7 @@ export { isFileTypeSupportedByModel, filterFilesByModalities, generateModalityErrorMessage, + generateModalityAwareAcceptString, type ModalityCapabilities } from './modality-file-validation'; diff --git a/tools/server/webui/src/lib/utils/modality-file-validation.ts b/tools/server/webui/src/lib/utils/modality-file-validation.ts index 136c084..e3c00f9 100644 --- a/tools/server/webui/src/lib/utils/modality-file-validation.ts +++ b/tools/server/webui/src/lib/utils/modality-file-validation.ts @@ -4,7 +4,17 @@ */ import { getFileTypeCategory } from '$lib/utils'; -import { FileTypeCategory } from '$lib/enums'; +import { + FileExtensionAudio, + FileExtensionImage, + FileExtensionPdf, + FileExtensionText, + MimeTypeAudio, + MimeTypeImage, + MimeTypeApplication, + MimeTypeText, + FileTypeCategory +} from '$lib/enums'; /** Modality capabilities for file validation */ export interface ModalityCapabilities { @@ -160,3 +170,29 @@ export function generateModalityErrorMessage( * @param capabilities - The modality capabilities to check against * @returns Accept string for HTML file input element */ +export function generateModalityAwareAcceptString(capabilities: ModalityCapabilities): string { + const { hasVision, hasAudio } = capabilities; + + const acceptedExtensions: string[] = []; + const acceptedMimeTypes: string[] = []; + + // Always include text files and PDFs + acceptedExtensions.push(...Object.values(FileExtensionText)); + acceptedMimeTypes.push(...Object.values(MimeTypeText)); + acceptedExtensions.push(...Object.values(FileExtensionPdf)); + acceptedMimeTypes.push(...Object.values(MimeTypeApplication)); + + // Include images only if vision is supported + if (hasVision) { + acceptedExtensions.push(...Object.values(FileExtensionImage)); + acceptedMimeTypes.push(...Object.values(MimeTypeImage)); + } + + // Include audio only if audio is supported + if (hasAudio) { + acceptedExtensions.push(...Object.values(FileExtensionAudio)); + acceptedMimeTypes.push(...Object.values(MimeTypeAudio)); + } + + return [...acceptedExtensions, ...acceptedMimeTypes].join(','); +} diff --git a/tools/server/webui/src/lib/utils/process-uploaded-files.ts b/tools/server/webui/src/lib/utils/process-uploaded-files.ts index 0342dce..f00116c 100644 --- a/tools/server/webui/src/lib/utils/process-uploaded-files.ts +++ b/tools/server/webui/src/lib/utils/process-uploaded-files.ts @@ -1,4 +1,5 @@ import { isSvgMimeType, svgBase64UrlToPngDataURL } from './svg-to-png'; +import { isTextFileByName } from './text-files'; import { isWebpMimeType, webpBase64UrlToPngDataURL } from './webp-to-png'; import { FileTypeCategory } from '$lib/enums'; import { modelsStore } from '$lib/stores/models.svelte'; @@ -83,6 +84,17 @@ export async function processFilesToChatUploaded( } results.push({ ...base, preview }); + } else if ( + getFileTypeCategory(file.type) === FileTypeCategory.TEXT || + isTextFileByName(file.name) + ) { + try { + const textContent = await readFileAsUTF8(file); + results.push({ ...base, textContent }); + } catch (err) { + console.warn('Failed to read text file, adding without content:', err); + results.push(base); + } } else if (getFileTypeCategory(file.type) === FileTypeCategory.PDF) { // Extract text content from PDF for preview try { @@ -117,14 +129,8 @@ export async function processFilesToChatUploaded( const preview = await readFileAsDataURL(file); results.push({ ...base, preview }); } else { - // Fallback: treat unknown files as text - try { - const textContent = await readFileAsUTF8(file); - results.push({ ...base, textContent }); - } catch (err) { - console.warn('Failed to read file as text, adding without content:', err); - results.push(base); - } + // Other files: add as-is + results.push(base); } } catch (error) { console.error('Error processing file', file.name, error); diff --git a/tools/server/webui/src/routes/+layout.svelte b/tools/server/webui/src/routes/+layout.svelte index 095827b..a14dfb6 100644 --- a/tools/server/webui/src/routes/+layout.svelte +++ b/tools/server/webui/src/routes/+layout.svelte @@ -119,7 +119,7 @@ $effect(() => { const serverProps = serverStore.props; - if (serverProps) { + if (serverProps?.default_generation_settings?.params) { settingsStore.syncWithServerDefaults(); } }); diff --git a/tools/server/webui/tests/stories/ChatForm.stories.svelte b/tools/server/webui/tests/stories/ChatForm.stories.svelte index 18319e8..fe6f14b 100644 --- a/tools/server/webui/tests/stories/ChatForm.stories.svelte +++ b/tools/server/webui/tests/stories/ChatForm.stories.svelte @@ -65,7 +65,10 @@ await expect(textarea).toHaveValue(text); const fileInput = document.querySelector('input[type="file"]'); - await expect(fileInput).not.toHaveAttribute('accept'); + const acceptAttr = fileInput?.getAttribute('accept'); + await expect(fileInput).toHaveAttribute('accept'); + await expect(acceptAttr).not.toContain('image/'); + await expect(acceptAttr).not.toContain('audio/'); // Open file attachments dropdown const fileUploadButton = canvas.getByText('Attach files'); diff --git a/tools/tts/README.md b/tools/tts/README.md index 48302c0..557014a 100644 --- a/tools/tts/README.md +++ b/tools/tts/README.md @@ -4,7 +4,7 @@ This example demonstrates the Text To Speech feature. It uses a [outeai](https://www.outeai.com/). ## Quickstart -If you have built llama.cpp with SSL support you can simply run the +If you have built llama.cpp with `-DLLAMA_CURL=ON` you can simply run the following command and the required models will be downloaded automatically: ```console $ build/bin/llama-tts --tts-oute-default -p "Hello world" && aplay output.wav diff --git a/vendor/cpp-httplib/CMakeLists.txt b/vendor/cpp-httplib/CMakeLists.txt index 172b925..8f0d15d 100644 --- a/vendor/cpp-httplib/CMakeLists.txt +++ b/vendor/cpp-httplib/CMakeLists.txt @@ -1,5 +1,4 @@ set(TARGET cpp-httplib) -license_add_file("cpp-httplib" "LICENSE") find_package(Threads REQUIRED) @@ -9,7 +8,7 @@ if (NOT MSVC) target_compile_options(${TARGET} PRIVATE -w) endif() -target_link_libraries(${TARGET} PRIVATE Threads::Threads) +target_link_libraries (${TARGET} PRIVATE Threads::Threads) if (WIN32 AND NOT MSVC) target_link_libraries(${TARGET} PRIVATE ws2_32) @@ -68,8 +67,6 @@ if (LLAMA_BUILD_BORINGSSL) set(BUILD_SHARED_LIBS ${SAVED_BUILD_SHARED_LIBS}) set(BUILD_TESTING ${SAVED_BUILD_TESTING}) - license_add_file("BoringSSL" "${boringssl_SOURCE_DIR}/LICENSE") - set(CPPHTTPLIB_OPENSSL_SUPPORT TRUE) target_link_libraries(${TARGET} PUBLIC ssl crypto) @@ -111,8 +108,6 @@ elseif (LLAMA_BUILD_LIBRESSL) set(BUILD_SHARED_LIBS ${SAVED_BUILD_SHARED_LIBS}) set(BUILD_TESTING ${SAVED_BUILD_TESTING}) - license_add_file("LibreSSL" "${libressl_SOURCE_DIR}/COPYING") - set(CPPHTTPLIB_OPENSSL_SUPPORT TRUE) target_link_libraries(${TARGET} PUBLIC ssl crypto) diff --git a/vendor/cpp-httplib/httplib.cpp b/vendor/cpp-httplib/httplib.cpp index d707e65..b86e6a2 100644 --- a/vendor/cpp-httplib/httplib.cpp +++ b/vendor/cpp-httplib/httplib.cpp @@ -9,7 +9,7 @@ namespace httplib { namespace detail { bool is_hex(char c, int &v) { - if (isdigit(c)) { + if (0x20 <= c && isdigit(c)) { v = c - '0'; return true; } else if ('A' <= c && c <= 'F') { @@ -49,90 +49,6 @@ std::string from_i_to_hex(size_t n) { return ret; } -std::string compute_etag(const FileStat &fs) { - if (!fs.is_file()) { return std::string(); } - - // If mtime cannot be determined (negative value indicates an error - // or sentinel), do not generate an ETag. Returning a neutral / fixed - // value like 0 could collide with a real file that legitimately has - // mtime == 0 (epoch) and lead to misleading validators. - auto mtime_raw = fs.mtime(); - if (mtime_raw < 0) { return std::string(); } - - auto mtime = static_cast(mtime_raw); - auto size = fs.size(); - - return std::string("W/\"") + from_i_to_hex(mtime) + "-" + - from_i_to_hex(size) + "\""; -} - -// Format time_t as HTTP-date (RFC 9110 Section 5.6.7): "Sun, 06 Nov 1994 -// 08:49:37 GMT" This implementation is defensive: it validates `mtime`, checks -// return values from `gmtime_r`/`gmtime_s`, and ensures `strftime` succeeds. -std::string file_mtime_to_http_date(time_t mtime) { - if (mtime < 0) { return std::string(); } - - struct tm tm_buf; -#ifdef _WIN32 - if (gmtime_s(&tm_buf, &mtime) != 0) { return std::string(); } -#else - if (gmtime_r(&mtime, &tm_buf) == nullptr) { return std::string(); } -#endif - char buf[64]; - if (strftime(buf, sizeof(buf), "%a, %d %b %Y %H:%M:%S GMT", &tm_buf) == 0) { - return std::string(); - } - - return std::string(buf); -} - -// Parse HTTP-date (RFC 9110 Section 5.6.7) to time_t. Returns -1 on failure. -time_t parse_http_date(const std::string &date_str) { - struct tm tm_buf; - - // Create a classic locale object once for all parsing attempts - const std::locale classic_locale = std::locale::classic(); - - // Try to parse using std::get_time (C++11, cross-platform) - auto try_parse = [&](const char *fmt) -> bool { - std::istringstream ss(date_str); - ss.imbue(classic_locale); - - memset(&tm_buf, 0, sizeof(tm_buf)); - ss >> std::get_time(&tm_buf, fmt); - - return !ss.fail(); - }; - - // RFC 9110 preferred format (HTTP-date): "Sun, 06 Nov 1994 08:49:37 GMT" - if (!try_parse("%a, %d %b %Y %H:%M:%S")) { - // RFC 850 format: "Sunday, 06-Nov-94 08:49:37 GMT" - if (!try_parse("%A, %d-%b-%y %H:%M:%S")) { - // asctime format: "Sun Nov 6 08:49:37 1994" - if (!try_parse("%a %b %d %H:%M:%S %Y")) { - return static_cast(-1); - } - } - } - -#ifdef _WIN32 - return _mkgmtime(&tm_buf); -#else - return timegm(&tm_buf); -#endif -} - -bool is_weak_etag(const std::string &s) { - // Check if the string is a weak ETag (starts with 'W/"') - return s.size() > 3 && s[0] == 'W' && s[1] == '/' && s[2] == '"'; -} - -bool is_strong_etag(const std::string &s) { - // Check if the string is a strong ETag (starts and ends with '"', at least 2 - // chars) - return s.size() >= 2 && s[0] == '"' && s.back() == '"'; -} - size_t to_utf8(int code, char *buff) { if (code < 0x0080) { buff[0] = static_cast(code & 0x7F); @@ -252,15 +168,6 @@ bool FileStat::is_dir() const { return ret_ >= 0 && S_ISDIR(st_.st_mode); } -time_t FileStat::mtime() const { - return ret_ >= 0 ? static_cast(st_.st_mtime) - : static_cast(-1); -} - -size_t FileStat::size() const { - return ret_ >= 0 ? static_cast(st_.st_size) : 0; -} - std::string encode_path(const std::string &s) { std::string result; result.reserve(s.size()); @@ -302,149 +209,6 @@ std::string file_extension(const std::string &path) { bool is_space_or_tab(char c) { return c == ' ' || c == '\t'; } -template -bool parse_header(const char *beg, const char *end, T fn); - -template -bool parse_header(const char *beg, const char *end, T fn) { - // Skip trailing spaces and tabs. - while (beg < end && is_space_or_tab(end[-1])) { - end--; - } - - auto p = beg; - while (p < end && *p != ':') { - p++; - } - - auto name = std::string(beg, p); - if (!detail::fields::is_field_name(name)) { return false; } - - if (p == end) { return false; } - - auto key_end = p; - - if (*p++ != ':') { return false; } - - while (p < end && is_space_or_tab(*p)) { - p++; - } - - if (p <= end) { - auto key_len = key_end - beg; - if (!key_len) { return false; } - - auto key = std::string(beg, key_end); - auto val = std::string(p, end); - - if (!detail::fields::is_field_value(val)) { return false; } - - if (case_ignore::equal(key, "Location") || - case_ignore::equal(key, "Referer")) { - fn(key, val); - } else { - fn(key, decode_path_component(val)); - } - - return true; - } - - return false; -} - -bool parse_trailers(stream_line_reader &line_reader, Headers &dest, - const Headers &src_headers) { - // NOTE: In RFC 9112, '7.1 Chunked Transfer Coding' mentions "The chunked - // transfer coding is complete when a chunk with a chunk-size of zero is - // received, possibly followed by a trailer section, and finally terminated by - // an empty line". https://www.rfc-editor.org/rfc/rfc9112.html#section-7.1 - // - // In '7.1.3. Decoding Chunked', however, the pseudo-code in the section - // doesn't care for the existence of the final CRLF. In other words, it seems - // to be ok whether the final CRLF exists or not in the chunked data. - // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.1.3 - // - // According to the reference code in RFC 9112, cpp-httplib now allows - // chunked transfer coding data without the final CRLF. - - // RFC 7230 Section 4.1.2 - Headers prohibited in trailers - thread_local case_ignore::unordered_set prohibited_trailers = { - "transfer-encoding", - "content-length", - "host", - "authorization", - "www-authenticate", - "proxy-authenticate", - "proxy-authorization", - "cookie", - "set-cookie", - "cache-control", - "expect", - "max-forwards", - "pragma", - "range", - "te", - "age", - "expires", - "date", - "location", - "retry-after", - "vary", - "warning", - "content-encoding", - "content-type", - "content-range", - "trailer"}; - - case_ignore::unordered_set declared_trailers; - auto trailer_header = get_header_value(src_headers, "Trailer", "", 0); - if (trailer_header && std::strlen(trailer_header)) { - auto len = std::strlen(trailer_header); - split(trailer_header, trailer_header + len, ',', - [&](const char *b, const char *e) { - const char *kbeg = b; - const char *kend = e; - while (kbeg < kend && (*kbeg == ' ' || *kbeg == '\t')) { - ++kbeg; - } - while (kend > kbeg && (kend[-1] == ' ' || kend[-1] == '\t')) { - --kend; - } - std::string key(kbeg, static_cast(kend - kbeg)); - if (!key.empty() && - prohibited_trailers.find(key) == prohibited_trailers.end()) { - declared_trailers.insert(key); - } - }); - } - - size_t trailer_header_count = 0; - while (strcmp(line_reader.ptr(), "\r\n") != 0) { - if (line_reader.size() > CPPHTTPLIB_HEADER_MAX_LENGTH) { return false; } - if (trailer_header_count >= CPPHTTPLIB_HEADER_MAX_COUNT) { return false; } - - constexpr auto line_terminator_len = 2; - auto line_beg = line_reader.ptr(); - auto line_end = - line_reader.ptr() + line_reader.size() - line_terminator_len; - - if (!parse_header(line_beg, line_end, - [&](const std::string &key, const std::string &val) { - if (declared_trailers.find(key) != - declared_trailers.end()) { - dest.emplace(key, val); - trailer_header_count++; - } - })) { - return false; - } - - if (!line_reader.getline()) { return false; } - } - - return true; -} - std::pair trim(const char *b, const char *e, size_t left, size_t right) { while (b + left < e && is_space_or_tab(b[left])) { @@ -516,42 +280,6 @@ void split(const char *b, const char *e, char d, size_t m, } } -bool split_find(const char *b, const char *e, char d, size_t m, - std::function fn) { - size_t i = 0; - size_t beg = 0; - size_t count = 1; - - while (e ? (b + i < e) : (b[i] != '\0')) { - if (b[i] == d && count < m) { - auto r = trim(b, e, beg, i); - if (r.first < r.second) { - auto found = fn(&b[r.first], &b[r.second]); - if (found) { return true; } - } - beg = i + 1; - count++; - } - i++; - } - - if (i) { - auto r = trim(b, e, beg, i); - if (r.first < r.second) { - auto found = fn(&b[r.first], &b[r.second]); - if (found) { return true; } - } - } - - return false; -} - -bool split_find(const char *b, const char *e, char d, - std::function fn) { - return split_find(b, e, d, (std::numeric_limits::max)(), - std::move(fn)); -} - stream_line_reader::stream_line_reader(Stream &strm, char *fixed_buffer, size_t fixed_buffer_size) : strm_(strm), fixed_buffer_(fixed_buffer), @@ -1138,7 +866,6 @@ int getaddrinfo_with_timeout(const char *node, const char *service, return ret; #elif TARGET_OS_MAC - if (!node) { return EAI_NONAME; } // macOS implementation using CFHost API for asynchronous DNS resolution CFStringRef hostname_ref = CFStringCreateWithCString( kCFAllocatorDefault, node, kCFStringEncodingUTF8); @@ -2165,27 +1892,6 @@ bool zstd_decompressor::decompress(const char *data, size_t data_length, } #endif -std::unique_ptr -create_decompressor(const std::string &encoding) { - std::unique_ptr decompressor; - - if (encoding == "gzip" || encoding == "deflate") { -#ifdef CPPHTTPLIB_ZLIB_SUPPORT - decompressor = detail::make_unique(); -#endif - } else if (encoding.find("br") != std::string::npos) { -#ifdef CPPHTTPLIB_BROTLI_SUPPORT - decompressor = detail::make_unique(); -#endif - } else if (encoding == "zstd" || encoding.find("zstd") != std::string::npos) { -#ifdef CPPHTTPLIB_ZSTD_SUPPORT - decompressor = detail::make_unique(); -#endif - } - - return decompressor; -} - bool is_prohibited_header_name(const std::string &name) { using udl::operator""_t; @@ -2222,6 +1928,53 @@ const char *get_header_value(const Headers &headers, return def; } +template +bool parse_header(const char *beg, const char *end, T fn) { + // Skip trailing spaces and tabs. + while (beg < end && is_space_or_tab(end[-1])) { + end--; + } + + auto p = beg; + while (p < end && *p != ':') { + p++; + } + + auto name = std::string(beg, p); + if (!detail::fields::is_field_name(name)) { return false; } + + if (p == end) { return false; } + + auto key_end = p; + + if (*p++ != ':') { return false; } + + while (p < end && is_space_or_tab(*p)) { + p++; + } + + if (p <= end) { + auto key_len = key_end - beg; + if (!key_len) { return false; } + + auto key = std::string(beg, key_end); + auto val = std::string(p, end); + + if (!detail::fields::is_field_value(val)) { return false; } + + if (case_ignore::equal(key, "Location") || + case_ignore::equal(key, "Referer")) { + fn(key, val); + } else { + fn(key, decode_path_component(val)); + } + + return true; + } + + return false; +} + bool read_headers(Stream &strm, Headers &headers) { const auto bufsiz = 2048; char buf[bufsiz]; @@ -2273,18 +2026,10 @@ bool read_content_with_length(Stream &strm, size_t len, ContentReceiverWithProgress out) { char buf[CPPHTTPLIB_RECV_BUFSIZ]; - detail::BodyReader br; - br.stream = &strm; - br.content_length = len; - br.chunked = false; - br.bytes_read = 0; - br.last_error = Error::Success; - size_t r = 0; while (r < len) { auto read_len = static_cast(len - r); - auto to_read = (std::min)(read_len, CPPHTTPLIB_RECV_BUFSIZ); - auto n = detail::read_body_content(&strm, br, buf, to_read); + auto n = strm.read(buf, (std::min)(read_len, CPPHTTPLIB_RECV_BUFSIZ)); if (n <= 0) { return false; } if (!out(buf, static_cast(n), r, len)) { return false; } @@ -2344,35 +2089,125 @@ template ReadContentResult read_content_chunked(Stream &strm, T &x, size_t payload_max_length, ContentReceiverWithProgress out) { - detail::ChunkedDecoder dec(strm); + const auto bufsiz = 16; + char buf[bufsiz]; - char buf[CPPHTTPLIB_RECV_BUFSIZ]; + stream_line_reader line_reader(strm, buf, bufsiz); + + if (!line_reader.getline()) { return ReadContentResult::Error; } + + unsigned long chunk_len; size_t total_len = 0; + while (true) { + char *end_ptr; - for (;;) { - size_t chunk_offset = 0; - size_t chunk_total = 0; - auto n = dec.read_payload(buf, sizeof(buf), chunk_offset, chunk_total); - if (n < 0) { return ReadContentResult::Error; } + chunk_len = std::strtoul(line_reader.ptr(), &end_ptr, 16); - if (n == 0) { - if (!dec.parse_trailers_into(x.trailers, x.headers)) { - return ReadContentResult::Error; - } - return ReadContentResult::Success; - } + if (end_ptr == line_reader.ptr()) { return ReadContentResult::Error; } + if (chunk_len == ULONG_MAX) { return ReadContentResult::Error; } + if (chunk_len == 0) { break; } + + // Check if adding this chunk would exceed the payload limit if (total_len > payload_max_length || - payload_max_length - total_len < static_cast(n)) { + payload_max_length - total_len < chunk_len) { return ReadContentResult::PayloadTooLarge; } - if (!out(buf, static_cast(n), chunk_offset, chunk_total)) { + total_len += chunk_len; + + if (!read_content_with_length(strm, chunk_len, nullptr, out)) { return ReadContentResult::Error; } - total_len += static_cast(n); + if (!line_reader.getline()) { return ReadContentResult::Error; } + + if (strcmp(line_reader.ptr(), "\r\n") != 0) { + return ReadContentResult::Error; + } + + if (!line_reader.getline()) { return ReadContentResult::Error; } } + + assert(chunk_len == 0); + + // NOTE: In RFC 9112, '7.1 Chunked Transfer Coding' mentions "The chunked + // transfer coding is complete when a chunk with a chunk-size of zero is + // received, possibly followed by a trailer section, and finally terminated by + // an empty line". https://www.rfc-editor.org/rfc/rfc9112.html#section-7.1 + // + // In '7.1.3. Decoding Chunked', however, the pseudo-code in the section + // does't care for the existence of the final CRLF. In other words, it seems + // to be ok whether the final CRLF exists or not in the chunked data. + // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.1.3 + // + // According to the reference code in RFC 9112, cpp-httplib now allows + // chunked transfer coding data without the final CRLF. + if (!line_reader.getline()) { return ReadContentResult::Success; } + + // RFC 7230 Section 4.1.2 - Headers prohibited in trailers + thread_local case_ignore::unordered_set prohibited_trailers = { + // Message framing + "transfer-encoding", "content-length", + + // Routing + "host", + + // Authentication + "authorization", "www-authenticate", "proxy-authenticate", + "proxy-authorization", "cookie", "set-cookie", + + // Request modifiers + "cache-control", "expect", "max-forwards", "pragma", "range", "te", + + // Response control + "age", "expires", "date", "location", "retry-after", "vary", "warning", + + // Payload processing + "content-encoding", "content-type", "content-range", "trailer"}; + + // Parse declared trailer headers once for performance + case_ignore::unordered_set declared_trailers; + if (has_header(x.headers, "Trailer")) { + auto trailer_header = get_header_value(x.headers, "Trailer", "", 0); + auto len = std::strlen(trailer_header); + + split(trailer_header, trailer_header + len, ',', + [&](const char *b, const char *e) { + std::string key(b, e); + if (prohibited_trailers.find(key) == prohibited_trailers.end()) { + declared_trailers.insert(key); + } + }); + } + + size_t trailer_header_count = 0; + while (strcmp(line_reader.ptr(), "\r\n") != 0) { + if (line_reader.size() > CPPHTTPLIB_HEADER_MAX_LENGTH) { + return ReadContentResult::Error; + } + + // Check trailer header count limit + if (trailer_header_count >= CPPHTTPLIB_HEADER_MAX_COUNT) { + return ReadContentResult::Error; + } + + // Exclude line terminator + constexpr auto line_terminator_len = 2; + auto end = line_reader.ptr() + line_reader.size() - line_terminator_len; + + parse_header(line_reader.ptr(), end, + [&](const std::string &key, const std::string &val) { + if (declared_trailers.find(key) != declared_trailers.end()) { + x.trailers.emplace(key, val); + trailer_header_count++; + } + }); + + if (!line_reader.getline()) { return ReadContentResult::Error; } + } + + return ReadContentResult::Success; } bool is_chunked_transfer_encoding(const Headers &headers) { @@ -2388,13 +2223,27 @@ bool prepare_content_receiver(T &x, int &status, std::string encoding = x.get_header_value("Content-Encoding"); std::unique_ptr decompressor; - if (!encoding.empty()) { - decompressor = detail::create_decompressor(encoding); - if (!decompressor) { - // Unsupported encoding or no support compiled in - status = StatusCode::UnsupportedMediaType_415; - return false; - } + if (encoding == "gzip" || encoding == "deflate") { +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + decompressor = detail::make_unique(); +#else + status = StatusCode::UnsupportedMediaType_415; + return false; +#endif + } else if (encoding.find("br") != std::string::npos) { +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + decompressor = detail::make_unique(); +#else + status = StatusCode::UnsupportedMediaType_415; + return false; +#endif + } else if (encoding == "zstd") { +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + decompressor = detail::make_unique(); +#else + status = StatusCode::UnsupportedMediaType_415; + return false; +#endif } if (decompressor) { @@ -2480,7 +2329,7 @@ bool read_content(Stream &strm, T &x, size_t payload_max_length, int &status, ssize_t write_request_line(Stream &strm, const std::string &method, const std::string &path) { std::string s = method; - s += ' '; + s += " "; s += path; s += " HTTP/1.1\r\n"; return strm.write(s.data(), s.size()); @@ -2489,7 +2338,7 @@ ssize_t write_request_line(Stream &strm, const std::string &method, ssize_t write_response_line(Stream &strm, int status) { std::string s = "HTTP/1.1 "; s += std::to_string(status); - s += ' '; + s += " "; s += httplib::status_message(status); s += "\r\n"; return strm.write(s.data(), s.size()); @@ -2752,8 +2601,8 @@ bool redirect(T &cli, Request &req, Response &res, auto ret = cli.send(new_req, new_res, error); if (ret) { - req = std::move(new_req); - res = std::move(new_res); + req = new_req; + res = new_res; if (res.location.empty()) { res.location = location; } } @@ -2764,9 +2613,9 @@ std::string params_to_query_str(const Params ¶ms) { std::string query; for (auto it = params.begin(); it != params.end(); ++it) { - if (it != params.begin()) { query += '&'; } + if (it != params.begin()) { query += "&"; } query += encode_query_component(it->first); - query += '='; + query += "="; query += encode_query_component(it->second); } return query; @@ -2799,38 +2648,6 @@ void parse_query_text(const std::string &s, Params ¶ms) { parse_query_text(s.data(), s.size(), params); } -// Normalize a query string by decoding and re-encoding each key/value pair -// while preserving the original parameter order. This avoids double-encoding -// and ensures consistent encoding without reordering (unlike Params which -// uses std::multimap and sorts keys). -std::string normalize_query_string(const std::string &query) { - std::string result; - split(query.data(), query.data() + query.size(), '&', - [&](const char *b, const char *e) { - std::string key; - std::string val; - divide(b, static_cast(e - b), '=', - [&](const char *lhs_data, std::size_t lhs_size, - const char *rhs_data, std::size_t rhs_size) { - key.assign(lhs_data, lhs_size); - val.assign(rhs_data, rhs_size); - }); - - if (!key.empty()) { - auto dec_key = decode_query_component(key); - auto dec_val = decode_query_component(val); - - if (!result.empty()) { result += '&'; } - result += encode_query_component(dec_key); - if (!val.empty() || std::find(b, e, '=') != e) { - result += '='; - result += encode_query_component(dec_val); - } - } - }); - return result; -} - bool parse_multipart_boundary(const std::string &content_type, std::string &boundary) { auto boundary_keyword = "boundary="; @@ -3023,7 +2840,7 @@ bool parse_accept_header(const std::string &s, return; } - entries.push_back(std::move(accept_entry)); + entries.push_back(accept_entry); }); // Return false if any invalid entry was found @@ -3040,8 +2857,8 @@ bool parse_accept_header(const std::string &s, // Extract sorted media types content_types.reserve(entries.size()); - for (auto &entry : entries) { - content_types.push_back(std::move(entry.media_type)); + for (const auto &entry : entries) { + content_types.push_back(entry.media_type); } return true; @@ -3052,7 +2869,7 @@ public: FormDataParser() = default; void set_boundary(std::string &&boundary) { - boundary_ = std::move(boundary); + boundary_ = boundary; dash_boundary_crlf_ = dash_ + boundary_ + crlf_; crlf_dash_boundary_ = crlf_ + dash_ + boundary_; } @@ -3525,9 +3342,9 @@ std::string make_content_range_header_field( std::string field = "bytes "; field += std::to_string(st); - field += '-'; + field += "-"; field += std::to_string(ed); - field += '/'; + field += "/"; field += std::to_string(content_length); return field; } @@ -3904,7 +3721,7 @@ bool parse_www_authenticate(const Response &res, static_cast(m.length(2))) : s.substr(static_cast(m.position(3)), static_cast(m.length(3))); - auth[std::move(key)] = std::move(val); + auth[key] = val; } return true; } @@ -3917,7 +3734,7 @@ class ContentProviderAdapter { public: explicit ContentProviderAdapter( ContentProviderWithoutLength &&content_provider) - : content_provider_(std::move(content_provider)) {} + : content_provider_(content_provider) {} bool operator()(size_t offset, size_t, DataSink &sink) { return content_provider_(offset, sink); @@ -3927,189 +3744,8 @@ private: ContentProviderWithoutLength content_provider_; }; -// NOTE: https://www.rfc-editor.org/rfc/rfc9110#section-5 -namespace fields { - -bool is_token_char(char c) { - return std::isalnum(c) || c == '!' || c == '#' || c == '$' || c == '%' || - c == '&' || c == '\'' || c == '*' || c == '+' || c == '-' || - c == '.' || c == '^' || c == '_' || c == '`' || c == '|' || c == '~'; -} - -bool is_token(const std::string &s) { - if (s.empty()) { return false; } - for (auto c : s) { - if (!is_token_char(c)) { return false; } - } - return true; -} - -bool is_field_name(const std::string &s) { return is_token(s); } - -bool is_vchar(char c) { return c >= 33 && c <= 126; } - -bool is_obs_text(char c) { return 128 <= static_cast(c); } - -bool is_field_vchar(char c) { return is_vchar(c) || is_obs_text(c); } - -bool is_field_content(const std::string &s) { - if (s.empty()) { return true; } - - if (s.size() == 1) { - return is_field_vchar(s[0]); - } else if (s.size() == 2) { - return is_field_vchar(s[0]) && is_field_vchar(s[1]); - } else { - size_t i = 0; - - if (!is_field_vchar(s[i])) { return false; } - i++; - - while (i < s.size() - 1) { - auto c = s[i++]; - if (c == ' ' || c == '\t' || is_field_vchar(c)) { - } else { - return false; - } - } - - return is_field_vchar(s[i]); - } -} - -bool is_field_value(const std::string &s) { return is_field_content(s); } - -} // namespace fields - } // namespace detail -const char *status_message(int status) { - switch (status) { - case StatusCode::Continue_100: return "Continue"; - case StatusCode::SwitchingProtocol_101: return "Switching Protocol"; - case StatusCode::Processing_102: return "Processing"; - case StatusCode::EarlyHints_103: return "Early Hints"; - case StatusCode::OK_200: return "OK"; - case StatusCode::Created_201: return "Created"; - case StatusCode::Accepted_202: return "Accepted"; - case StatusCode::NonAuthoritativeInformation_203: - return "Non-Authoritative Information"; - case StatusCode::NoContent_204: return "No Content"; - case StatusCode::ResetContent_205: return "Reset Content"; - case StatusCode::PartialContent_206: return "Partial Content"; - case StatusCode::MultiStatus_207: return "Multi-Status"; - case StatusCode::AlreadyReported_208: return "Already Reported"; - case StatusCode::IMUsed_226: return "IM Used"; - case StatusCode::MultipleChoices_300: return "Multiple Choices"; - case StatusCode::MovedPermanently_301: return "Moved Permanently"; - case StatusCode::Found_302: return "Found"; - case StatusCode::SeeOther_303: return "See Other"; - case StatusCode::NotModified_304: return "Not Modified"; - case StatusCode::UseProxy_305: return "Use Proxy"; - case StatusCode::unused_306: return "unused"; - case StatusCode::TemporaryRedirect_307: return "Temporary Redirect"; - case StatusCode::PermanentRedirect_308: return "Permanent Redirect"; - case StatusCode::BadRequest_400: return "Bad Request"; - case StatusCode::Unauthorized_401: return "Unauthorized"; - case StatusCode::PaymentRequired_402: return "Payment Required"; - case StatusCode::Forbidden_403: return "Forbidden"; - case StatusCode::NotFound_404: return "Not Found"; - case StatusCode::MethodNotAllowed_405: return "Method Not Allowed"; - case StatusCode::NotAcceptable_406: return "Not Acceptable"; - case StatusCode::ProxyAuthenticationRequired_407: - return "Proxy Authentication Required"; - case StatusCode::RequestTimeout_408: return "Request Timeout"; - case StatusCode::Conflict_409: return "Conflict"; - case StatusCode::Gone_410: return "Gone"; - case StatusCode::LengthRequired_411: return "Length Required"; - case StatusCode::PreconditionFailed_412: return "Precondition Failed"; - case StatusCode::PayloadTooLarge_413: return "Payload Too Large"; - case StatusCode::UriTooLong_414: return "URI Too Long"; - case StatusCode::UnsupportedMediaType_415: return "Unsupported Media Type"; - case StatusCode::RangeNotSatisfiable_416: return "Range Not Satisfiable"; - case StatusCode::ExpectationFailed_417: return "Expectation Failed"; - case StatusCode::ImATeapot_418: return "I'm a teapot"; - case StatusCode::MisdirectedRequest_421: return "Misdirected Request"; - case StatusCode::UnprocessableContent_422: return "Unprocessable Content"; - case StatusCode::Locked_423: return "Locked"; - case StatusCode::FailedDependency_424: return "Failed Dependency"; - case StatusCode::TooEarly_425: return "Too Early"; - case StatusCode::UpgradeRequired_426: return "Upgrade Required"; - case StatusCode::PreconditionRequired_428: return "Precondition Required"; - case StatusCode::TooManyRequests_429: return "Too Many Requests"; - case StatusCode::RequestHeaderFieldsTooLarge_431: - return "Request Header Fields Too Large"; - case StatusCode::UnavailableForLegalReasons_451: - return "Unavailable For Legal Reasons"; - case StatusCode::NotImplemented_501: return "Not Implemented"; - case StatusCode::BadGateway_502: return "Bad Gateway"; - case StatusCode::ServiceUnavailable_503: return "Service Unavailable"; - case StatusCode::GatewayTimeout_504: return "Gateway Timeout"; - case StatusCode::HttpVersionNotSupported_505: - return "HTTP Version Not Supported"; - case StatusCode::VariantAlsoNegotiates_506: return "Variant Also Negotiates"; - case StatusCode::InsufficientStorage_507: return "Insufficient Storage"; - case StatusCode::LoopDetected_508: return "Loop Detected"; - case StatusCode::NotExtended_510: return "Not Extended"; - case StatusCode::NetworkAuthenticationRequired_511: - return "Network Authentication Required"; - - default: - case StatusCode::InternalServerError_500: return "Internal Server Error"; - } -} - -std::string to_string(const Error error) { - switch (error) { - case Error::Success: return "Success (no error)"; - case Error::Unknown: return "Unknown"; - case Error::Connection: return "Could not establish connection"; - case Error::BindIPAddress: return "Failed to bind IP address"; - case Error::Read: return "Failed to read connection"; - case Error::Write: return "Failed to write connection"; - case Error::ExceedRedirectCount: return "Maximum redirect count exceeded"; - case Error::Canceled: return "Connection handling canceled"; - case Error::SSLConnection: return "SSL connection failed"; - case Error::SSLLoadingCerts: return "SSL certificate loading failed"; - case Error::SSLServerVerification: return "SSL server verification failed"; - case Error::SSLServerHostnameVerification: - return "SSL server hostname verification failed"; - case Error::UnsupportedMultipartBoundaryChars: - return "Unsupported HTTP multipart boundary characters"; - case Error::Compression: return "Compression failed"; - case Error::ConnectionTimeout: return "Connection timed out"; - case Error::ProxyConnection: return "Proxy connection failed"; - case Error::ConnectionClosed: return "Connection closed by server"; - case Error::Timeout: return "Read timeout"; - case Error::ResourceExhaustion: return "Resource exhaustion"; - case Error::TooManyFormDataFiles: return "Too many form data files"; - case Error::ExceedMaxPayloadSize: return "Exceeded maximum payload size"; - case Error::ExceedUriMaxLength: return "Exceeded maximum URI length"; - case Error::ExceedMaxSocketDescriptorCount: - return "Exceeded maximum socket descriptor count"; - case Error::InvalidRequestLine: return "Invalid request line"; - case Error::InvalidHTTPMethod: return "Invalid HTTP method"; - case Error::InvalidHTTPVersion: return "Invalid HTTP version"; - case Error::InvalidHeaders: return "Invalid headers"; - case Error::MultipartParsing: return "Multipart parsing failed"; - case Error::OpenFile: return "Failed to open file"; - case Error::Listen: return "Failed to listen on socket"; - case Error::GetSockName: return "Failed to get socket name"; - case Error::UnsupportedAddressFamily: return "Unsupported address family"; - case Error::HTTPParsing: return "HTTP parsing failed"; - case Error::InvalidRangeHeader: return "Invalid Range header"; - default: break; - } - - return "Invalid"; -} - -std::ostream &operator<<(std::ostream &os, const Error &obj) { - os << to_string(obj); - os << " (" << static_cast::type>(obj) << ')'; - return os; -} - std::string hosted_at(const std::string &hostname) { std::vector addrs; hosted_at(hostname, addrs); @@ -4143,7 +3779,7 @@ void hosted_at(const std::string &hostname, auto dummy = -1; if (detail::get_ip_and_port(addr, sizeof(struct sockaddr_storage), ip, dummy)) { - addrs.emplace_back(std::move(ip)); + addrs.push_back(ip); } } } @@ -4683,67 +4319,6 @@ ssize_t Stream::write(const std::string &s) { return write(s.data(), s.size()); } -// BodyReader implementation -ssize_t detail::BodyReader::read(char *buf, size_t len) { - if (!stream) { - last_error = Error::Connection; - return -1; - } - if (eof) { return 0; } - - if (!chunked) { - // Content-Length based reading - if (bytes_read >= content_length) { - eof = true; - return 0; - } - - auto remaining = content_length - bytes_read; - auto to_read = (std::min)(len, remaining); - auto n = stream->read(buf, to_read); - - if (n < 0) { - last_error = stream->get_error(); - if (last_error == Error::Success) { last_error = Error::Read; } - eof = true; - return n; - } - if (n == 0) { - // Unexpected EOF before content_length - last_error = stream->get_error(); - if (last_error == Error::Success) { last_error = Error::Read; } - eof = true; - return 0; - } - - bytes_read += static_cast(n); - if (bytes_read >= content_length) { eof = true; } - return n; - } - - // Chunked transfer encoding: delegate to shared decoder instance. - if (!chunked_decoder) { chunked_decoder.reset(new ChunkedDecoder(*stream)); } - - size_t chunk_offset = 0; - size_t chunk_total = 0; - auto n = chunked_decoder->read_payload(buf, len, chunk_offset, chunk_total); - if (n < 0) { - last_error = stream->get_error(); - if (last_error == Error::Success) { last_error = Error::Read; } - eof = true; - return n; - } - - if (n == 0) { - // Final chunk observed. Leave trailer parsing to the caller (StreamHandle). - eof = true; - return 0; - } - - bytes_read += static_cast(n); - return n; -} - namespace detail { void calc_actual_timeout(time_t max_timeout_msec, time_t duration_msec, @@ -4820,10 +4395,7 @@ ssize_t SocketStream::read(char *ptr, size_t size) { } } - if (!wait_readable()) { - error_ = Error::Timeout; - return -1; - } + if (!wait_readable()) { return -1; } read_buff_off_ = 0; read_buff_content_size_ = 0; @@ -4832,11 +4404,6 @@ ssize_t SocketStream::read(char *ptr, size_t size) { auto n = read_socket(sock_, read_buff_.data(), read_buff_size_, CPPHTTPLIB_RECV_FLAGS); if (n <= 0) { - if (n == 0) { - error_ = Error::ConnectionClosed; - } else { - error_ = Error::Read; - } return n; } else if (n <= static_cast(size)) { memcpy(ptr, read_buff_.data(), static_cast(n)); @@ -4848,15 +4415,7 @@ ssize_t SocketStream::read(char *ptr, size_t size) { return static_cast(size); } } else { - auto n = read_socket(sock_, ptr, size, CPPHTTPLIB_RECV_FLAGS); - if (n <= 0) { - if (n == 0) { - error_ = Error::ConnectionClosed; - } else { - error_ = Error::Read; - } - } - return n; + return read_socket(sock_, ptr, size, CPPHTTPLIB_RECV_FLAGS); } } @@ -5020,22 +4579,19 @@ bool RegexMatcher::match(Request &request) const { return std::regex_match(request.path, request.matches, regex_); } -// Enclose IPv6 address in brackets if needed -std::string prepare_host_string(const std::string &host) { +std::string make_host_and_port_string(const std::string &host, int port, + bool is_ssl) { + std::string result; + // Enclose IPv6 address in brackets (but not if already enclosed) if (host.find(':') == std::string::npos || (!host.empty() && host[0] == '[')) { // IPv4, hostname, or already bracketed IPv6 - return host; + result = host; } else { // IPv6 address without brackets - return "[" + host + "]"; + result = "[" + host + "]"; } -} - -std::string make_host_and_port_string(const std::string &host, int port, - bool is_ssl) { - auto result = prepare_host_string(host); // Append port if not default if ((!is_ssl && port == 80) || (is_ssl && port == 443)) { @@ -5047,29 +4603,6 @@ std::string make_host_and_port_string(const std::string &host, int port, return result; } -// Create "host:port" string always including port number (for CONNECT method) -std::string -make_host_and_port_string_always_port(const std::string &host, int port) { - return prepare_host_string(host) + ":" + std::to_string(port); -} - -template -bool check_and_write_headers(Stream &strm, Headers &headers, - T header_writer, Error &error) { - for (const auto &h : headers) { - if (!detail::fields::is_field_name(h.first) || - !detail::fields::is_field_value(h.second)) { - error = Error::InvalidHeaders; - return false; - } - } - if (header_writer(strm, headers) <= 0) { - error = Error::Write; - return false; - } - return true; -} - } // namespace detail // HTTP server implementation @@ -5161,7 +4694,7 @@ bool Server::set_mount_point(const std::string &mount_point, if (stat.is_dir()) { std::string mnt = !mount_point.empty() ? mount_point : "/"; if (!mnt.empty() && mnt[0] == '/') { - base_dirs_.push_back({std::move(mnt), dir, std::move(headers)}); + base_dirs_.push_back({mnt, dir, std::move(headers)}); return true; } } @@ -5477,7 +5010,7 @@ bool Server::write_response_core(Stream &strm, bool close_connection, { detail::BufferStream bstrm; if (!detail::write_response_line(bstrm, res.status)) { return false; } - if (header_writer_(bstrm, res.headers) <= 0) { return false; } + if (!header_writer_(bstrm, res.headers)) { return false; } // Flush buffer auto &data = bstrm.get_buffer(); @@ -5570,13 +5103,7 @@ bool Server::read_content(Stream &strm, Request &req, Response &res) { strm, req, res, // Regular [&](const char *buf, size_t n) { - // Limit decompressed body size to payload_max_length_ to protect - // against "zip bomb" attacks where a small compressed payload - // decompresses to a massive size. - if (req.body.size() + n > payload_max_length_ || - req.body.size() + n > req.body.max_size()) { - return false; - } + if (req.body.size() + n > req.body.max_size()) { return false; } req.body.append(buf, n); return true; }, @@ -5659,39 +5186,10 @@ bool Server::read_content_core( // RFC 7230 Section 3.3.3: If this is a request message and none of the above // are true (no Transfer-Encoding and no Content-Length), then the message // body length is zero (no message body is present). - // - // For non-SSL builds, peek into the socket to detect clients that send a - // body without a Content-Length header (raw HTTP over TCP). If there is - // pending data that exceeds the configured payload limit, treat this as an - // oversized request and fail early (causing connection close). For SSL - // builds we cannot reliably peek the decrypted application bytes, so keep - // the original behaviour. -#if !defined(CPPHTTPLIB_OPENSSL_SUPPORT) && !defined(_WIN32) - if (!req.has_header("Content-Length") && - !detail::is_chunked_transfer_encoding(req.headers)) { - socket_t s = strm.socket(); - if (s != INVALID_SOCKET) { - // Peek up to payload_max_length_ + 1 bytes. If more than - // payload_max_length_ bytes are pending, reject the request. - size_t to_peek = - (payload_max_length_ > 0) - ? (std::min)(payload_max_length_ + 1, static_cast(4096)) - : 1; - std::vector peekbuf(to_peek); - ssize_t n = ::recv(s, peekbuf.data(), to_peek, MSG_PEEK); - if (n > 0 && static_cast(n) > payload_max_length_) { - // Indicate failure so connection will be closed. - return false; - } - } - return true; - } -#else if (!req.has_header("Content-Length") && !detail::is_chunked_transfer_encoding(req.headers)) { return true; } -#endif if (!detail::read_content(strm, req, payload_max_length_, res.status, nullptr, out, true)) { @@ -5709,7 +5207,7 @@ bool Server::read_content_core( return true; } -bool Server::handle_file_request(Request &req, Response &res) { +bool Server::handle_file_request(const Request &req, Response &res) { for (const auto &entry : base_dirs_) { // Prefix match if (!req.path.compare(0, entry.mount_point.size(), entry.mount_point)) { @@ -5730,20 +5228,6 @@ bool Server::handle_file_request(Request &req, Response &res) { res.set_header(kv.first, kv.second); } - auto etag = detail::compute_etag(stat); - if (!etag.empty()) { res.set_header("ETag", etag); } - - auto mtime = stat.mtime(); - - auto last_modified = detail::file_mtime_to_http_date(mtime); - if (!last_modified.empty()) { - res.set_header("Last-Modified", last_modified); - } - - if (check_if_not_modified(req, res, etag, mtime)) { return true; } - - check_if_range(req, etag, mtime); - auto mm = std::make_shared(path.c_str()); if (!mm->is_open()) { output_error_log(Error::OpenFile, &req); @@ -5773,79 +5257,6 @@ bool Server::handle_file_request(Request &req, Response &res) { return false; } -bool Server::check_if_not_modified(const Request &req, Response &res, - const std::string &etag, - time_t mtime) const { - // Handle conditional GET: - // 1. If-None-Match takes precedence (RFC 9110 Section 13.1.2) - // 2. If-Modified-Since is checked only when If-None-Match is absent - if (req.has_header("If-None-Match")) { - if (!etag.empty()) { - auto val = req.get_header_value("If-None-Match"); - - // NOTE: We use exact string matching here. This works correctly - // because our server always generates weak ETags (W/"..."), and - // clients typically send back the same ETag they received. - // RFC 9110 Section 8.8.3.2 allows weak comparison for - // If-None-Match, where W/"x" and "x" would match, but this - // simplified implementation requires exact matches. - auto ret = detail::split_find(val.data(), val.data() + val.size(), ',', - [&](const char *b, const char *e) { - return std::equal(b, e, "*") || - std::equal(b, e, etag.begin()); - }); - - if (ret) { - res.status = StatusCode::NotModified_304; - return true; - } - } - } else if (req.has_header("If-Modified-Since")) { - auto val = req.get_header_value("If-Modified-Since"); - auto t = detail::parse_http_date(val); - - if (t != static_cast(-1) && mtime <= t) { - res.status = StatusCode::NotModified_304; - return true; - } - } - return false; -} - -bool Server::check_if_range(Request &req, const std::string &etag, - time_t mtime) const { - // Handle If-Range for partial content requests (RFC 9110 - // Section 13.1.5). If-Range is only evaluated when Range header is - // present. If the validator matches, serve partial content; otherwise - // serve full content. - if (!req.ranges.empty() && req.has_header("If-Range")) { - auto val = req.get_header_value("If-Range"); - - auto is_valid_range = [&]() { - if (detail::is_strong_etag(val)) { - // RFC 9110 Section 13.1.5: If-Range requires strong ETag - // comparison. - return (!etag.empty() && val == etag); - } else if (detail::is_weak_etag(val)) { - // Weak ETags are not valid for If-Range (RFC 9110 Section 13.1.5) - return false; - } else { - // HTTP-date comparison - auto t = detail::parse_http_date(val); - return (t != static_cast(-1) && mtime <= t); - } - }; - - if (!is_valid_range()) { - // Validator doesn't match: ignore Range and serve full content - req.ranges.clear(); - return false; - } - } - - return true; -} - socket_t Server::create_server_socket(const std::string &host, int port, int socket_flags, @@ -6113,13 +5524,10 @@ void Server::apply_ranges(const Request &req, Response &res, res.set_header("Transfer-Encoding", "chunked"); if (type == detail::EncodingType::Gzip) { res.set_header("Content-Encoding", "gzip"); - res.set_header("Vary", "Accept-Encoding"); } else if (type == detail::EncodingType::Brotli) { res.set_header("Content-Encoding", "br"); - res.set_header("Vary", "Accept-Encoding"); } else if (type == detail::EncodingType::Zstd) { res.set_header("Content-Encoding", "zstd"); - res.set_header("Vary", "Accept-Encoding"); } } } @@ -6178,7 +5586,6 @@ void Server::apply_ranges(const Request &req, Response &res, })) { res.body.swap(compressed); res.set_header("Content-Encoding", content_encoding); - res.set_header("Vary", "Accept-Encoding"); } } } @@ -6256,10 +5663,6 @@ Server::process_request(Stream &strm, const std::string &remote_addr, Request req; req.start_time_ = std::chrono::steady_clock::now(); - req.remote_addr = remote_addr; - req.remote_port = remote_port; - req.local_addr = local_addr; - req.local_port = local_port; Response res; res.version = "HTTP/1.1"; @@ -6505,6 +5908,7 @@ ClientImpl::ClientImpl(const std::string &host, int port, const std::string &client_cert_path, const std::string &client_key_path) : host_(detail::escape_abstract_namespace_unix_domain(host)), port_(port), + host_and_port_(detail::make_host_and_port_string(host_, port, is_ssl())), client_cert_path_(client_cert_path), client_key_path_(client_key_path) {} ClientImpl::~ClientImpl() { @@ -6603,26 +6007,6 @@ bool ClientImpl::create_and_connect_socket(Socket &socket, return true; } -bool ClientImpl::ensure_socket_connection(Socket &socket, Error &error) { - return create_and_connect_socket(socket, error); -} - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT -bool SSLClient::ensure_socket_connection(Socket &socket, Error &error) { - if (!ClientImpl::ensure_socket_connection(socket, error)) { return false; } - - if (!proxy_host_.empty() && proxy_port_ != -1) { return true; } - - if (!initialize_ssl(socket, error)) { - shutdown_socket(socket); - close_socket(socket); - return false; - } - - return true; -} -#endif - void ClientImpl::shutdown_ssl(Socket & /*socket*/, bool /*shutdown_gracefully*/) { // If there are any requests in flight from threads other than us, then it's @@ -6735,7 +6119,7 @@ bool ClientImpl::send_(Request &req, Response &res, Error &error) { } if (!is_alive) { - if (!ensure_socket_connection(socket_, error)) { + if (!create_and_connect_socket(socket_, error)) { output_error_log(error, &req); return false; } @@ -6753,11 +6137,9 @@ bool ClientImpl::send_(Request &req, Response &res, Error &error) { } } - if (!proxy_host_.empty() && proxy_port_ != -1) { - if (!scli.initialize_ssl(socket_, error)) { - output_error_log(error, &req); - return false; - } + if (!scli.initialize_ssl(socket_, error)) { + output_error_log(error, &req); + return false; } } #endif @@ -6830,343 +6212,6 @@ Result ClientImpl::send_(Request &&req) { #endif } -void ClientImpl::prepare_default_headers(Request &r, bool for_stream, - const std::string &ct) { - (void)for_stream; - for (const auto &header : default_headers_) { - if (!r.has_header(header.first)) { r.headers.insert(header); } - } - - if (!r.has_header("Host")) { - if (address_family_ == AF_UNIX) { - r.headers.emplace("Host", "localhost"); - } else { - r.headers.emplace( - "Host", detail::make_host_and_port_string(host_, port_, is_ssl())); - } - } - - if (!r.has_header("Accept")) { r.headers.emplace("Accept", "*/*"); } - - if (!r.content_receiver) { - if (!r.has_header("Accept-Encoding")) { - std::string accept_encoding; -#ifdef CPPHTTPLIB_BROTLI_SUPPORT - accept_encoding = "br"; -#endif -#ifdef CPPHTTPLIB_ZLIB_SUPPORT - if (!accept_encoding.empty()) { accept_encoding += ", "; } - accept_encoding += "gzip, deflate"; -#endif -#ifdef CPPHTTPLIB_ZSTD_SUPPORT - if (!accept_encoding.empty()) { accept_encoding += ", "; } - accept_encoding += "zstd"; -#endif - r.set_header("Accept-Encoding", accept_encoding); - } - -#ifndef CPPHTTPLIB_NO_DEFAULT_USER_AGENT - if (!r.has_header("User-Agent")) { - auto agent = std::string("cpp-httplib/") + CPPHTTPLIB_VERSION; - r.set_header("User-Agent", agent); - } -#endif - } - - if (!r.body.empty()) { - if (!ct.empty() && !r.has_header("Content-Type")) { - r.headers.emplace("Content-Type", ct); - } - if (!r.has_header("Content-Length")) { - r.headers.emplace("Content-Length", std::to_string(r.body.size())); - } - } -} - -ClientImpl::StreamHandle -ClientImpl::open_stream(const std::string &method, const std::string &path, - const Params ¶ms, const Headers &headers, - const std::string &body, - const std::string &content_type) { - StreamHandle handle; - handle.response = detail::make_unique(); - handle.error = Error::Success; - - auto query_path = params.empty() ? path : append_query_params(path, params); - handle.connection_ = detail::make_unique(); - - { - std::lock_guard guard(socket_mutex_); - - auto is_alive = false; - if (socket_.is_open()) { - is_alive = detail::is_socket_alive(socket_.sock); -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - if (is_alive && is_ssl()) { - if (detail::is_ssl_peer_could_be_closed(socket_.ssl, socket_.sock)) { - is_alive = false; - } - } -#endif - if (!is_alive) { - shutdown_ssl(socket_, false); - shutdown_socket(socket_); - close_socket(socket_); - } - } - - if (!is_alive) { - if (!ensure_socket_connection(socket_, handle.error)) { - handle.response.reset(); - return handle; - } - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - if (is_ssl()) { - auto &scli = static_cast(*this); - if (!proxy_host_.empty() && proxy_port_ != -1) { - if (!scli.initialize_ssl(socket_, handle.error)) { - handle.response.reset(); - return handle; - } - } - } -#endif - } - - transfer_socket_ownership_to_handle(handle); - } - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - if (is_ssl() && handle.connection_->ssl) { - handle.socket_stream_ = detail::make_unique( - handle.connection_->sock, handle.connection_->ssl, read_timeout_sec_, - read_timeout_usec_, write_timeout_sec_, write_timeout_usec_); - } else { - handle.socket_stream_ = detail::make_unique( - handle.connection_->sock, read_timeout_sec_, read_timeout_usec_, - write_timeout_sec_, write_timeout_usec_); - } -#else - handle.socket_stream_ = detail::make_unique( - handle.connection_->sock, read_timeout_sec_, read_timeout_usec_, - write_timeout_sec_, write_timeout_usec_); -#endif - handle.stream_ = handle.socket_stream_.get(); - - Request req; - req.method = method; - req.path = query_path; - req.headers = headers; - req.body = body; - - prepare_default_headers(req, true, content_type); - - auto &strm = *handle.stream_; - if (detail::write_request_line(strm, req.method, req.path) < 0) { - handle.error = Error::Write; - handle.response.reset(); - return handle; - } - - if (!detail::check_and_write_headers(strm, req.headers, header_writer_, - handle.error)) { - handle.response.reset(); - return handle; - } - - if (!body.empty()) { - if (strm.write(body.data(), body.size()) < 0) { - handle.error = Error::Write; - handle.response.reset(); - return handle; - } - } - - if (!read_response_line(strm, req, *handle.response) || - !detail::read_headers(strm, handle.response->headers)) { - handle.error = Error::Read; - handle.response.reset(); - return handle; - } - - handle.body_reader_.stream = handle.stream_; - - auto content_length_str = handle.response->get_header_value("Content-Length"); - if (!content_length_str.empty()) { - handle.body_reader_.content_length = - static_cast(std::stoull(content_length_str)); - } - - auto transfer_encoding = - handle.response->get_header_value("Transfer-Encoding"); - handle.body_reader_.chunked = (transfer_encoding == "chunked"); - - auto content_encoding = handle.response->get_header_value("Content-Encoding"); - if (!content_encoding.empty()) { - handle.decompressor_ = detail::create_decompressor(content_encoding); - } - - return handle; -} - -ssize_t ClientImpl::StreamHandle::read(char *buf, size_t len) { - if (!is_valid() || !response) { return -1; } - - if (decompressor_) { return read_with_decompression(buf, len); } - auto n = detail::read_body_content(stream_, body_reader_, buf, len); - - if (n <= 0 && body_reader_.chunked && !trailers_parsed_ && stream_) { - trailers_parsed_ = true; - if (body_reader_.chunked_decoder) { - if (!body_reader_.chunked_decoder->parse_trailers_into( - response->trailers, response->headers)) { - return n; - } - } else { - detail::ChunkedDecoder dec(*stream_); - if (!dec.parse_trailers_into(response->trailers, response->headers)) { - return n; - } - } - } - - return n; -} - -ssize_t ClientImpl::StreamHandle::read_with_decompression(char *buf, - size_t len) { - if (decompress_offset_ < decompress_buffer_.size()) { - auto available = decompress_buffer_.size() - decompress_offset_; - auto to_copy = (std::min)(len, available); - std::memcpy(buf, decompress_buffer_.data() + decompress_offset_, to_copy); - decompress_offset_ += to_copy; - return static_cast(to_copy); - } - - decompress_buffer_.clear(); - decompress_offset_ = 0; - - constexpr size_t kDecompressionBufferSize = 8192; - char compressed_buf[kDecompressionBufferSize]; - - while (true) { - auto n = detail::read_body_content(stream_, body_reader_, compressed_buf, - sizeof(compressed_buf)); - - if (n <= 0) { return n; } - - bool decompress_ok = - decompressor_->decompress(compressed_buf, static_cast(n), - [this](const char *data, size_t data_len) { - decompress_buffer_.append(data, data_len); - return true; - }); - - if (!decompress_ok) { - body_reader_.last_error = Error::Read; - return -1; - } - - if (!decompress_buffer_.empty()) { break; } - } - - auto to_copy = (std::min)(len, decompress_buffer_.size()); - std::memcpy(buf, decompress_buffer_.data(), to_copy); - decompress_offset_ = to_copy; - return static_cast(to_copy); -} - -void ClientImpl::StreamHandle::parse_trailers_if_needed() { - if (!response || !stream_ || !body_reader_.chunked || trailers_parsed_) { - return; - } - - trailers_parsed_ = true; - - const auto bufsiz = 128; - char line_buf[bufsiz]; - detail::stream_line_reader line_reader(*stream_, line_buf, bufsiz); - - if (!line_reader.getline()) { return; } - - if (!detail::parse_trailers(line_reader, response->trailers, - response->headers)) { - return; - } -} - -// Inline method implementations for `ChunkedDecoder`. -namespace detail { - -ChunkedDecoder::ChunkedDecoder(Stream &s) : strm(s) {} - -ssize_t ChunkedDecoder::read_payload(char *buf, size_t len, - size_t &out_chunk_offset, - size_t &out_chunk_total) { - if (finished) { return 0; } - - if (chunk_remaining == 0) { - stream_line_reader lr(strm, line_buf, sizeof(line_buf)); - if (!lr.getline()) { return -1; } - - char *endptr = nullptr; - unsigned long chunk_len = std::strtoul(lr.ptr(), &endptr, 16); - if (endptr == lr.ptr()) { return -1; } - if (chunk_len == ULONG_MAX) { return -1; } - - if (chunk_len == 0) { - chunk_remaining = 0; - finished = true; - out_chunk_offset = 0; - out_chunk_total = 0; - return 0; - } - - chunk_remaining = static_cast(chunk_len); - last_chunk_total = chunk_remaining; - last_chunk_offset = 0; - } - - auto to_read = (std::min)(chunk_remaining, len); - auto n = strm.read(buf, to_read); - if (n <= 0) { return -1; } - - auto offset_before = last_chunk_offset; - last_chunk_offset += static_cast(n); - chunk_remaining -= static_cast(n); - - out_chunk_offset = offset_before; - out_chunk_total = last_chunk_total; - - if (chunk_remaining == 0) { - stream_line_reader lr(strm, line_buf, sizeof(line_buf)); - if (!lr.getline()) { return -1; } - if (std::strcmp(lr.ptr(), "\r\n") != 0) { return -1; } - } - - return n; -} - -bool ChunkedDecoder::parse_trailers_into(Headers &dest, - const Headers &src_headers) { - stream_line_reader lr(strm, line_buf, sizeof(line_buf)); - if (!lr.getline()) { return false; } - return parse_trailers(lr, dest, src_headers); -} - -} // namespace detail - -void -ClientImpl::transfer_socket_ownership_to_handle(StreamHandle &handle) { - handle.connection_->sock = socket_.sock; -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - handle.connection_->ssl = socket_.ssl; - socket_.ssl = nullptr; -#endif - socket_.sock = INVALID_SOCKET; -} - bool ClientImpl::handle_request(Stream &strm, Request &req, Response &res, bool close_connection, Error &error) { @@ -7182,11 +6227,9 @@ bool ClientImpl::handle_request(Stream &strm, Request &req, if (!is_ssl() && !proxy_host_.empty() && proxy_port_ != -1) { auto req2 = req; - req2.path = "http://" + - detail::make_host_and_port_string(host_, port_, false) + - req.path; + req2.path = "http://" + host_and_port_ + req.path; ret = process_request(strm, req2, res, close_connection, error); - req = std::move(req2); + req = req2; req.path = req_save.path; } else { ret = process_request(strm, req, res, close_connection, error); @@ -7210,7 +6253,7 @@ bool ClientImpl::handle_request(Stream &strm, Request &req, } if (300 < res.status && res.status < 400 && follow_location_) { - req = std::move(req_save); + req = req_save; ret = redirect(req, res, error); } @@ -7238,7 +6281,7 @@ bool ClientImpl::handle_request(Stream &strm, Request &req, Response new_res; ret = send(new_req, new_res, error); - if (ret) { res = std::move(new_res); } + if (ret) { res = new_res; } } } } @@ -7471,11 +6514,42 @@ bool ClientImpl::write_request(Stream &strm, Request &req, } } - std::string ct_for_defaults; - if (!req.has_header("Content-Type") && !req.body.empty()) { - ct_for_defaults = "text/plain"; + if (!req.has_header("Host")) { + // For Unix socket connections, use "localhost" as Host header (similar to + // curl behavior) + if (address_family_ == AF_UNIX) { + req.set_header("Host", "localhost"); + } else { + req.set_header("Host", host_and_port_); + } } - prepare_default_headers(req, false, ct_for_defaults); + + if (!req.has_header("Accept")) { req.set_header("Accept", "*/*"); } + + if (!req.content_receiver) { + if (!req.has_header("Accept-Encoding")) { + std::string accept_encoding; +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + accept_encoding = "br"; +#endif +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + if (!accept_encoding.empty()) { accept_encoding += ", "; } + accept_encoding += "gzip, deflate"; +#endif +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + if (!accept_encoding.empty()) { accept_encoding += ", "; } + accept_encoding += "zstd"; +#endif + req.set_header("Accept-Encoding", accept_encoding); + } + +#ifndef CPPHTTPLIB_NO_DEFAULT_USER_AGENT + if (!req.has_header("User-Agent")) { + auto agent = std::string("cpp-httplib/") + CPPHTTPLIB_VERSION; + req.set_header("User-Agent", agent); + } +#endif + }; if (req.body.empty()) { if (req.content_provider_) { @@ -7491,6 +6565,15 @@ bool ClientImpl::write_request(Stream &strm, Request &req, req.set_header("Content-Length", "0"); } } + } else { + if (!req.has_header("Content-Type")) { + req.set_header("Content-Type", "text/plain"); + } + + if (!req.has_header("Content-Length")) { + auto length = std::to_string(req.body.size()); + req.set_header("Content-Length", length); + } } if (!basic_auth_password_.empty() || !basic_auth_username_.empty()) { @@ -7537,41 +6620,18 @@ bool ClientImpl::write_request(Stream &strm, Request &req, query_part = ""; } - // Encode path part. If the original `req.path` already contained a - // query component, preserve its raw query string (including parameter - // order) instead of reparsing and reassembling it which may reorder - // parameters due to container ordering (e.g. `Params` uses - // `std::multimap`). When there is no query in `req.path`, fall back to - // building a query from `req.params` so existing callers that pass - // `Params` continue to work. + // Encode path and query auto path_with_query = path_encode_ ? detail::encode_path(path_part) : path_part; - if (!query_part.empty()) { - // Normalize the query string (decode then re-encode) while preserving - // the original parameter order. - auto normalized = detail::normalize_query_string(query_part); - if (!normalized.empty()) { path_with_query += '?' + normalized; } - - // Still populate req.params for handlers/users who read them. - detail::parse_query_text(query_part, req.params); - } else { - // No query in path; parse any query_part (empty) and append params - // from `req.params` when present (preserves prior behavior for - // callers who provide Params separately). - detail::parse_query_text(query_part, req.params); - if (!req.params.empty()) { - path_with_query = append_query_params(path_with_query, req.params); - } + detail::parse_query_text(query_part, req.params); + if (!req.params.empty()) { + path_with_query = append_query_params(path_with_query, req.params); } // Write request line and headers detail::write_request_line(bstrm, req.method, path_with_query); - if (!detail::check_and_write_headers(bstrm, req.headers, header_writer_, - error)) { - output_error_log(error, &req); - return false; - } + header_writer_(bstrm, req.headers); // Flush buffer auto &data = bstrm.get_buffer(); @@ -9036,9 +8096,7 @@ bool SSLSocketStream::wait_writable() const { ssize_t SSLSocketStream::read(char *ptr, size_t size) { if (SSL_pending(ssl_) > 0) { - auto ret = SSL_read(ssl_, ptr, static_cast(size)); - if (ret == 0) { error_ = Error::ConnectionClosed; } - return ret; + return SSL_read(ssl_, ptr, static_cast(size)); } else if (wait_readable()) { auto ret = SSL_read(ssl_, ptr, static_cast(size)); if (ret < 0) { @@ -9063,12 +8121,9 @@ ssize_t SSLSocketStream::read(char *ptr, size_t size) { } } assert(ret < 0); - } else if (ret == 0) { - error_ = Error::ConnectionClosed; } return ret; } else { - error_ = Error::Timeout; return -1; } } @@ -9444,8 +8499,7 @@ bool SSLClient::connect_with_proxy( start_time, [&](Stream &strm) { Request req2; req2.method = "CONNECT"; - req2.path = - detail::make_host_and_port_string_always_port(host_, port_); + req2.path = host_and_port_; if (max_timeout_msec_ > 0) { req2.start_time_ = std::chrono::steady_clock::now(); } @@ -9472,7 +8526,7 @@ bool SSLClient::connect_with_proxy( close_socket(socket); // Create a new socket for the authenticated CONNECT request - if (!ensure_socket_connection(socket, error)) { + if (!create_and_connect_socket(socket, error)) { success = false; output_error_log(error, nullptr); return false; @@ -9485,8 +8539,7 @@ bool SSLClient::connect_with_proxy( start_time, [&](Stream &strm) { Request req3; req3.method = "CONNECT"; - req3.path = detail::make_host_and_port_string_always_port( - host_, port_); + req3.path = host_and_port_; req3.headers.insert(detail::make_digest_authentication_header( req3, auth, 1, detail::random_string(10), proxy_digest_auth_username_, proxy_digest_auth_password_, @@ -10371,13 +9424,6 @@ Result Client::Options(const std::string &path, const Headers &headers) { return cli_->Options(path, headers); } -ClientImpl::StreamHandle -Client::open_stream(const std::string &method, const std::string &path, - const Params ¶ms, const Headers &headers, - const std::string &body, const std::string &content_type) { - return cli_->open_stream(method, path, params, headers, body, content_type); -} - bool Client::send(Request &req, Response &res, Error &error) { return cli_->send(req, res, error); } diff --git a/vendor/cpp-httplib/httplib.h b/vendor/cpp-httplib/httplib.h index 613020d..c9bd9fd 100644 --- a/vendor/cpp-httplib/httplib.h +++ b/vendor/cpp-httplib/httplib.h @@ -1,15 +1,15 @@ // // httplib.h // -// Copyright (c) 2026 Yuji Hirose. All rights reserved. +// Copyright (c) 2025 Yuji Hirose. All rights reserved. // MIT License // #ifndef CPPHTTPLIB_HTTPLIB_H #define CPPHTTPLIB_HTTPLIB_H -#define CPPHTTPLIB_VERSION "0.30.1" -#define CPPHTTPLIB_VERSION_NUM "0x001E01" +#define CPPHTTPLIB_VERSION "0.28.0" +#define CPPHTTPLIB_VERSION_NUM "0x001C00" /* * Platform compatibility check @@ -205,10 +205,7 @@ #pragma comment(lib, "ws2_32.lib") -#ifndef _SSIZE_T_DEFINED using ssize_t = __int64; -#define _SSIZE_T_DEFINED -#endif #endif // _MSC_VER #ifndef S_ISREG @@ -841,50 +838,6 @@ struct Response { std::string file_content_content_type_; }; -enum class Error { - Success = 0, - Unknown, - Connection, - BindIPAddress, - Read, - Write, - ExceedRedirectCount, - Canceled, - SSLConnection, - SSLLoadingCerts, - SSLServerVerification, - SSLServerHostnameVerification, - UnsupportedMultipartBoundaryChars, - Compression, - ConnectionTimeout, - ProxyConnection, - ConnectionClosed, - Timeout, - ResourceExhaustion, - TooManyFormDataFiles, - ExceedMaxPayloadSize, - ExceedUriMaxLength, - ExceedMaxSocketDescriptorCount, - InvalidRequestLine, - InvalidHTTPMethod, - InvalidHTTPVersion, - InvalidHeaders, - MultipartParsing, - OpenFile, - Listen, - GetSockName, - UnsupportedAddressFamily, - HTTPParsing, - InvalidRangeHeader, - - // For internal use only - SSLPeerCouldBeClosed_, -}; - -std::string to_string(Error error); - -std::ostream &operator<<(std::ostream &os, const Error &obj); - class Stream { public: virtual ~Stream() = default; @@ -903,11 +856,6 @@ public: ssize_t write(const char *ptr); ssize_t write(const std::string &s); - - Error get_error() const { return error_; } - -protected: - Error error_ = Error::Success; }; class TaskQueue { @@ -925,7 +873,6 @@ class ThreadPool final : public TaskQueue { public: explicit ThreadPool(size_t n, size_t mqr = 0) : shutdown_(false), max_queued_requests_(mqr) { - threads_.reserve(n); while (n) { threads_.emplace_back(worker(*this)); n--; @@ -1014,21 +961,27 @@ using ErrorLogger = std::function; using SocketOptions = std::function; +namespace detail { + +bool set_socket_opt_impl(socket_t sock, int level, int optname, + const void *optval, socklen_t optlen); +bool set_socket_opt(socket_t sock, int level, int optname, int opt); +bool set_socket_opt_time(socket_t sock, int level, int optname, time_t sec, + time_t usec); + +} // namespace detail + void default_socket_options(socket_t sock); const char *status_message(int status); -std::string to_string(Error error); - -std::ostream &operator<<(std::ostream &os, const Error &obj); - std::string get_bearer_token_auth(const Request &req); namespace detail { class MatcherBase { public: - MatcherBase(std::string pattern) : pattern_(std::move(pattern)) {} + MatcherBase(std::string pattern) : pattern_(pattern) {} virtual ~MatcherBase() = default; const std::string &pattern() const { return pattern_; } @@ -1098,10 +1051,11 @@ private: std::regex regex_; }; -int close_socket(socket_t sock); - ssize_t write_headers(Stream &strm, const Headers &headers); +std::string make_host_and_port_string(const std::string &host, int port, + bool is_ssl); + } // namespace detail class Server { @@ -1252,11 +1206,7 @@ private: bool listen_internal(); bool routing(Request &req, Response &res, Stream &strm); - bool handle_file_request(Request &req, Response &res); - bool check_if_not_modified(const Request &req, Response &res, - const std::string &etag, time_t mtime) const; - bool check_if_range(Request &req, const std::string &etag, - time_t mtime) const; + bool handle_file_request(const Request &req, Response &res); bool dispatch_request(Request &req, Response &res, const Handlers &handlers) const; bool dispatch_request_for_content_reader( @@ -1340,6 +1290,48 @@ private: detail::write_headers; }; +enum class Error { + Success = 0, + Unknown, + Connection, + BindIPAddress, + Read, + Write, + ExceedRedirectCount, + Canceled, + SSLConnection, + SSLLoadingCerts, + SSLServerVerification, + SSLServerHostnameVerification, + UnsupportedMultipartBoundaryChars, + Compression, + ConnectionTimeout, + ProxyConnection, + ResourceExhaustion, + TooManyFormDataFiles, + ExceedMaxPayloadSize, + ExceedUriMaxLength, + ExceedMaxSocketDescriptorCount, + InvalidRequestLine, + InvalidHTTPMethod, + InvalidHTTPVersion, + InvalidHeaders, + MultipartParsing, + OpenFile, + Listen, + GetSockName, + UnsupportedAddressFamily, + HTTPParsing, + InvalidRangeHeader, + + // For internal use only + SSLPeerCouldBeClosed_, +}; + +std::string to_string(Error error); + +std::ostream &operator<<(std::ostream &os, const Error &obj); + class Result { public: Result() = default; @@ -1398,87 +1390,6 @@ private: #endif }; -struct ClientConnection { - socket_t sock = INVALID_SOCKET; -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - SSL *ssl = nullptr; -#endif - - bool is_open() const { return sock != INVALID_SOCKET; } - - ClientConnection() = default; - - ~ClientConnection() { -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - if (ssl) { - SSL_free(ssl); - ssl = nullptr; - } -#endif - if (sock != INVALID_SOCKET) { - detail::close_socket(sock); - sock = INVALID_SOCKET; - } - } - - ClientConnection(const ClientConnection &) = delete; - ClientConnection &operator=(const ClientConnection &) = delete; - - ClientConnection(ClientConnection &&other) noexcept - : sock(other.sock) -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - , - ssl(other.ssl) -#endif - { - other.sock = INVALID_SOCKET; -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - other.ssl = nullptr; -#endif - } - - ClientConnection &operator=(ClientConnection &&other) noexcept { - if (this != &other) { - sock = other.sock; -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - ssl = other.ssl; -#endif - other.sock = INVALID_SOCKET; -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - other.ssl = nullptr; -#endif - } - return *this; - } -}; - -namespace detail { - -struct ChunkedDecoder; - -struct BodyReader { - Stream *stream = nullptr; - size_t content_length = 0; - size_t bytes_read = 0; - bool chunked = false; - bool eof = false; - std::unique_ptr chunked_decoder; - Error last_error = Error::Success; - - ssize_t read(char *buf, size_t len); - bool has_error() const { return last_error != Error::Success; } -}; - -inline ssize_t read_body_content(Stream *stream, BodyReader &br, char *buf, - size_t len) { - (void)stream; - return br.read(buf, len); -} - -class decompressor; - -} // namespace detail - class ClientImpl { public: explicit ClientImpl(const std::string &host); @@ -1493,43 +1404,6 @@ public: virtual bool is_valid() const; - struct StreamHandle { - std::unique_ptr response; - Error error = Error::Success; - - StreamHandle() = default; - StreamHandle(const StreamHandle &) = delete; - StreamHandle &operator=(const StreamHandle &) = delete; - StreamHandle(StreamHandle &&) = default; - StreamHandle &operator=(StreamHandle &&) = default; - ~StreamHandle() = default; - - bool is_valid() const { - return response != nullptr && error == Error::Success; - } - - ssize_t read(char *buf, size_t len); - void parse_trailers_if_needed(); - Error get_read_error() const { return body_reader_.last_error; } - bool has_read_error() const { return body_reader_.has_error(); } - - bool trailers_parsed_ = false; - - private: - friend class ClientImpl; - - ssize_t read_with_decompression(char *buf, size_t len); - - std::unique_ptr connection_; - std::unique_ptr socket_stream_; - Stream *stream_ = nullptr; - detail::BodyReader body_reader_; - - std::unique_ptr decompressor_; - std::string decompress_buffer_; - size_t decompress_offset_ = 0; - }; - // clang-format off Result Get(const std::string &path, DownloadProgress progress = nullptr); Result Get(const std::string &path, ContentReceiver content_receiver, DownloadProgress progress = nullptr); @@ -1623,15 +1497,6 @@ public: Result Options(const std::string &path, const Headers &headers); // clang-format on - // Streaming API: Open a stream for reading response body incrementally - // Socket ownership is transferred to StreamHandle for true streaming - // Supports all HTTP methods (GET, POST, PUT, PATCH, DELETE, etc.) - StreamHandle open_stream(const std::string &method, const std::string &path, - const Params ¶ms = {}, - const Headers &headers = {}, - const std::string &body = {}, - const std::string &content_type = {}); - bool send(Request &req, Response &res, Error &error); Result send(const Request &req); @@ -1727,7 +1592,6 @@ protected: }; virtual bool create_and_connect_socket(Socket &socket, Error &error); - virtual bool ensure_socket_connection(Socket &socket, Error &error); // All of: // shutdown_ssl @@ -1754,6 +1618,7 @@ protected: // Socket endpoint information const std::string host_; const int port_; + const std::string host_and_port_; // Current open socket Socket socket_; @@ -1852,8 +1717,6 @@ private: Response &res) const; bool write_request(Stream &strm, Request &req, bool close_connection, Error &error); - void prepare_default_headers(Request &r, bool for_stream, - const std::string &ct); bool redirect(Request &req, Response &res, Error &error); bool create_redirect_client(const std::string &scheme, const std::string &host, int port, Request &req, @@ -1884,8 +1747,6 @@ private: std::chrono::time_point start_time, std::function callback); virtual bool is_ssl() const; - - void transfer_socket_ownership_to_handle(StreamHandle &handle); }; class Client { @@ -2004,16 +1865,6 @@ public: Result Options(const std::string &path, const Headers &headers); // clang-format on - // Streaming API: Open a stream for reading response body incrementally - // Socket ownership is transferred to StreamHandle for true streaming - // Supports all HTTP methods (GET, POST, PUT, PATCH, DELETE, etc.) - ClientImpl::StreamHandle open_stream(const std::string &method, - const std::string &path, - const Params ¶ms = {}, - const Headers &headers = {}, - const std::string &body = {}, - const std::string &content_type = {}); - bool send(Request &req, Response &res, Error &error); Result send(const Request &req); @@ -2176,7 +2027,6 @@ public: private: bool create_and_connect_socket(Socket &socket, Error &error) override; - bool ensure_socket_connection(Socket &socket, Error &error) override; void shutdown_ssl(Socket &socket, bool shutdown_gracefully) override; void shutdown_ssl_impl(Socket &socket, bool shutdown_gracefully); @@ -2313,6 +2163,82 @@ inline void default_socket_options(socket_t sock) { 1); } +inline const char *status_message(int status) { + switch (status) { + case StatusCode::Continue_100: return "Continue"; + case StatusCode::SwitchingProtocol_101: return "Switching Protocol"; + case StatusCode::Processing_102: return "Processing"; + case StatusCode::EarlyHints_103: return "Early Hints"; + case StatusCode::OK_200: return "OK"; + case StatusCode::Created_201: return "Created"; + case StatusCode::Accepted_202: return "Accepted"; + case StatusCode::NonAuthoritativeInformation_203: + return "Non-Authoritative Information"; + case StatusCode::NoContent_204: return "No Content"; + case StatusCode::ResetContent_205: return "Reset Content"; + case StatusCode::PartialContent_206: return "Partial Content"; + case StatusCode::MultiStatus_207: return "Multi-Status"; + case StatusCode::AlreadyReported_208: return "Already Reported"; + case StatusCode::IMUsed_226: return "IM Used"; + case StatusCode::MultipleChoices_300: return "Multiple Choices"; + case StatusCode::MovedPermanently_301: return "Moved Permanently"; + case StatusCode::Found_302: return "Found"; + case StatusCode::SeeOther_303: return "See Other"; + case StatusCode::NotModified_304: return "Not Modified"; + case StatusCode::UseProxy_305: return "Use Proxy"; + case StatusCode::unused_306: return "unused"; + case StatusCode::TemporaryRedirect_307: return "Temporary Redirect"; + case StatusCode::PermanentRedirect_308: return "Permanent Redirect"; + case StatusCode::BadRequest_400: return "Bad Request"; + case StatusCode::Unauthorized_401: return "Unauthorized"; + case StatusCode::PaymentRequired_402: return "Payment Required"; + case StatusCode::Forbidden_403: return "Forbidden"; + case StatusCode::NotFound_404: return "Not Found"; + case StatusCode::MethodNotAllowed_405: return "Method Not Allowed"; + case StatusCode::NotAcceptable_406: return "Not Acceptable"; + case StatusCode::ProxyAuthenticationRequired_407: + return "Proxy Authentication Required"; + case StatusCode::RequestTimeout_408: return "Request Timeout"; + case StatusCode::Conflict_409: return "Conflict"; + case StatusCode::Gone_410: return "Gone"; + case StatusCode::LengthRequired_411: return "Length Required"; + case StatusCode::PreconditionFailed_412: return "Precondition Failed"; + case StatusCode::PayloadTooLarge_413: return "Payload Too Large"; + case StatusCode::UriTooLong_414: return "URI Too Long"; + case StatusCode::UnsupportedMediaType_415: return "Unsupported Media Type"; + case StatusCode::RangeNotSatisfiable_416: return "Range Not Satisfiable"; + case StatusCode::ExpectationFailed_417: return "Expectation Failed"; + case StatusCode::ImATeapot_418: return "I'm a teapot"; + case StatusCode::MisdirectedRequest_421: return "Misdirected Request"; + case StatusCode::UnprocessableContent_422: return "Unprocessable Content"; + case StatusCode::Locked_423: return "Locked"; + case StatusCode::FailedDependency_424: return "Failed Dependency"; + case StatusCode::TooEarly_425: return "Too Early"; + case StatusCode::UpgradeRequired_426: return "Upgrade Required"; + case StatusCode::PreconditionRequired_428: return "Precondition Required"; + case StatusCode::TooManyRequests_429: return "Too Many Requests"; + case StatusCode::RequestHeaderFieldsTooLarge_431: + return "Request Header Fields Too Large"; + case StatusCode::UnavailableForLegalReasons_451: + return "Unavailable For Legal Reasons"; + case StatusCode::NotImplemented_501: return "Not Implemented"; + case StatusCode::BadGateway_502: return "Bad Gateway"; + case StatusCode::ServiceUnavailable_503: return "Service Unavailable"; + case StatusCode::GatewayTimeout_504: return "Gateway Timeout"; + case StatusCode::HttpVersionNotSupported_505: + return "HTTP Version Not Supported"; + case StatusCode::VariantAlsoNegotiates_506: return "Variant Also Negotiates"; + case StatusCode::InsufficientStorage_507: return "Insufficient Storage"; + case StatusCode::LoopDetected_508: return "Loop Detected"; + case StatusCode::NotExtended_510: return "Not Extended"; + case StatusCode::NetworkAuthenticationRequired_511: + return "Network Authentication Required"; + + default: + case StatusCode::InternalServerError_500: return "Internal Server Error"; + } +} + inline std::string get_bearer_token_auth(const Request &req) { if (req.has_header("Authorization")) { constexpr auto bearer_header_prefix_len = detail::str_len("Bearer "); @@ -2346,6 +2272,55 @@ Server::set_idle_interval(const std::chrono::duration &duration) { return *this; } +inline std::string to_string(const Error error) { + switch (error) { + case Error::Success: return "Success (no error)"; + case Error::Unknown: return "Unknown"; + case Error::Connection: return "Could not establish connection"; + case Error::BindIPAddress: return "Failed to bind IP address"; + case Error::Read: return "Failed to read connection"; + case Error::Write: return "Failed to write connection"; + case Error::ExceedRedirectCount: return "Maximum redirect count exceeded"; + case Error::Canceled: return "Connection handling canceled"; + case Error::SSLConnection: return "SSL connection failed"; + case Error::SSLLoadingCerts: return "SSL certificate loading failed"; + case Error::SSLServerVerification: return "SSL server verification failed"; + case Error::SSLServerHostnameVerification: + return "SSL server hostname verification failed"; + case Error::UnsupportedMultipartBoundaryChars: + return "Unsupported HTTP multipart boundary characters"; + case Error::Compression: return "Compression failed"; + case Error::ConnectionTimeout: return "Connection timed out"; + case Error::ProxyConnection: return "Proxy connection failed"; + case Error::ResourceExhaustion: return "Resource exhaustion"; + case Error::TooManyFormDataFiles: return "Too many form data files"; + case Error::ExceedMaxPayloadSize: return "Exceeded maximum payload size"; + case Error::ExceedUriMaxLength: return "Exceeded maximum URI length"; + case Error::ExceedMaxSocketDescriptorCount: + return "Exceeded maximum socket descriptor count"; + case Error::InvalidRequestLine: return "Invalid request line"; + case Error::InvalidHTTPMethod: return "Invalid HTTP method"; + case Error::InvalidHTTPVersion: return "Invalid HTTP version"; + case Error::InvalidHeaders: return "Invalid headers"; + case Error::MultipartParsing: return "Multipart parsing failed"; + case Error::OpenFile: return "Failed to open file"; + case Error::Listen: return "Failed to listen on socket"; + case Error::GetSockName: return "Failed to get socket name"; + case Error::UnsupportedAddressFamily: return "Unsupported address family"; + case Error::HTTPParsing: return "HTTP parsing failed"; + case Error::InvalidRangeHeader: return "Invalid Range header"; + default: break; + } + + return "Invalid"; +} + +inline std::ostream &operator<<(std::ostream &os, const Error &obj) { + os << to_string(obj); + os << " (" << static_cast::type>(obj) << ')'; + return os; +} + inline size_t Result::get_request_header_value_u64(const std::string &key, size_t def, size_t id) const { @@ -2446,20 +2421,16 @@ namespace detail { #if defined(_WIN32) inline std::wstring u8string_to_wstring(const char *s) { - if (!s) { return std::wstring(); } - - auto len = static_cast(strlen(s)); - if (!len) { return std::wstring(); } - - auto wlen = ::MultiByteToWideChar(CP_UTF8, 0, s, len, nullptr, 0); - if (!wlen) { return std::wstring(); } - std::wstring ws; - ws.resize(wlen); - wlen = ::MultiByteToWideChar( - CP_UTF8, 0, s, len, - const_cast(reinterpret_cast(ws.data())), wlen); - if (wlen != static_cast(ws.size())) { ws.clear(); } + auto len = static_cast(strlen(s)); + auto wlen = ::MultiByteToWideChar(CP_UTF8, 0, s, len, nullptr, 0); + if (wlen > 0) { + ws.resize(wlen); + wlen = ::MultiByteToWideChar( + CP_UTF8, 0, s, len, + const_cast(reinterpret_cast(ws.data())), wlen); + if (wlen != static_cast(ws.size())) { ws.clear(); } + } return ws; } #endif @@ -2468,8 +2439,6 @@ struct FileStat { FileStat(const std::string &path); bool is_file() const; bool is_dir() const; - time_t mtime() const; - size_t size() const; private: #if defined(_WIN32) @@ -2480,9 +2449,6 @@ private: int ret_ = -1; }; -std::string make_host_and_port_string(const std::string &host, int port, - bool is_ssl); - std::string trim_copy(const std::string &s); void divide( @@ -2703,25 +2669,6 @@ private: std::string growable_buffer_; }; -bool parse_trailers(stream_line_reader &line_reader, Headers &dest, - const Headers &src_headers); - -struct ChunkedDecoder { - Stream &strm; - size_t chunk_remaining = 0; - bool finished = false; - char line_buf[64]; - size_t last_chunk_total = 0; - size_t last_chunk_offset = 0; - - explicit ChunkedDecoder(Stream &s); - - ssize_t read_payload(char *buf, size_t len, size_t &out_chunk_offset, - size_t &out_chunk_total); - - bool parse_trailers_into(Headers &dest, const Headers &src_headers); -}; - class mmap { public: mmap(const char *path); @@ -2749,669 +2696,59 @@ private: // NOTE: https://www.rfc-editor.org/rfc/rfc9110#section-5 namespace fields { -bool is_token_char(char c); -bool is_token(const std::string &s); -bool is_field_name(const std::string &s); -bool is_vchar(char c); -bool is_obs_text(char c); -bool is_field_vchar(char c); -bool is_field_content(const std::string &s); -bool is_field_value(const std::string &s); +inline bool is_token_char(char c) { + return std::isalnum(c) || c == '!' || c == '#' || c == '$' || c == '%' || + c == '&' || c == '\'' || c == '*' || c == '+' || c == '-' || + c == '.' || c == '^' || c == '_' || c == '`' || c == '|' || c == '~'; +} + +inline bool is_token(const std::string &s) { + if (s.empty()) { return false; } + for (auto c : s) { + if (!is_token_char(c)) { return false; } + } + return true; +} + +inline bool is_field_name(const std::string &s) { return is_token(s); } + +inline bool is_vchar(char c) { return c >= 33 && c <= 126; } + +inline bool is_obs_text(char c) { return 128 <= static_cast(c); } + +inline bool is_field_vchar(char c) { return is_vchar(c) || is_obs_text(c); } + +inline bool is_field_content(const std::string &s) { + if (s.empty()) { return true; } + + if (s.size() == 1) { + return is_field_vchar(s[0]); + } else if (s.size() == 2) { + return is_field_vchar(s[0]) && is_field_vchar(s[1]); + } else { + size_t i = 0; + + if (!is_field_vchar(s[i])) { return false; } + i++; + + while (i < s.size() - 1) { + auto c = s[i++]; + if (c == ' ' || c == '\t' || is_field_vchar(c)) { + } else { + return false; + } + } + + return is_field_vchar(s[i]); + } +} + +inline bool is_field_value(const std::string &s) { return is_field_content(s); } } // namespace fields } // namespace detail -namespace stream { - -class Result { -public: - Result() : chunk_size_(8192) {} - - explicit Result(ClientImpl::StreamHandle &&handle, size_t chunk_size = 8192) - : handle_(std::move(handle)), chunk_size_(chunk_size) {} - - Result(Result &&other) noexcept - : handle_(std::move(other.handle_)), buffer_(std::move(other.buffer_)), - current_size_(other.current_size_), chunk_size_(other.chunk_size_), - finished_(other.finished_) { - other.current_size_ = 0; - other.finished_ = true; - } - - Result &operator=(Result &&other) noexcept { - if (this != &other) { - handle_ = std::move(other.handle_); - buffer_ = std::move(other.buffer_); - current_size_ = other.current_size_; - chunk_size_ = other.chunk_size_; - finished_ = other.finished_; - other.current_size_ = 0; - other.finished_ = true; - } - return *this; - } - - Result(const Result &) = delete; - Result &operator=(const Result &) = delete; - - // Check if the result is valid (connection succeeded and response received) - bool is_valid() const { return handle_.is_valid(); } - explicit operator bool() const { return is_valid(); } - - // Response status code - int status() const { - return handle_.response ? handle_.response->status : -1; - } - - // Response headers - const Headers &headers() const { - static const Headers empty_headers; - return handle_.response ? handle_.response->headers : empty_headers; - } - - std::string get_header_value(const std::string &key, - const char *def = "") const { - return handle_.response ? handle_.response->get_header_value(key, def) - : def; - } - - bool has_header(const std::string &key) const { - return handle_.response ? handle_.response->has_header(key) : false; - } - - // Error information - Error error() const { return handle_.error; } - Error read_error() const { return handle_.get_read_error(); } - bool has_read_error() const { return handle_.has_read_error(); } - - // Streaming iteration API - // Call next() to read the next chunk, then access data via data()/size() - // Returns true if data was read, false when stream is exhausted - bool next() { - if (!handle_.is_valid() || finished_) { return false; } - - if (buffer_.size() < chunk_size_) { buffer_.resize(chunk_size_); } - - ssize_t n = handle_.read(&buffer_[0], chunk_size_); - if (n > 0) { - current_size_ = static_cast(n); - return true; - } - - current_size_ = 0; - finished_ = true; - return false; - } - - // Pointer to current chunk data (valid after next() returns true) - const char *data() const { return buffer_.data(); } - - // Size of current chunk (valid after next() returns true) - size_t size() const { return current_size_; } - - // Convenience method: read all remaining data into a string - std::string read_all() { - std::string result; - while (next()) { - result.append(data(), size()); - } - return result; - } - -private: - ClientImpl::StreamHandle handle_; - std::string buffer_; - size_t current_size_ = 0; - size_t chunk_size_; - bool finished_ = false; -}; - -// GET -template -inline Result Get(ClientType &cli, const std::string &path, - size_t chunk_size = 8192) { - return Result{cli.open_stream("GET", path), chunk_size}; -} - -template -inline Result Get(ClientType &cli, const std::string &path, - const Headers &headers, size_t chunk_size = 8192) { - return Result{cli.open_stream("GET", path, {}, headers), chunk_size}; -} - -template -inline Result Get(ClientType &cli, const std::string &path, - const Params ¶ms, size_t chunk_size = 8192) { - return Result{cli.open_stream("GET", path, params), chunk_size}; -} - -template -inline Result Get(ClientType &cli, const std::string &path, - const Params ¶ms, const Headers &headers, - size_t chunk_size = 8192) { - return Result{cli.open_stream("GET", path, params, headers), chunk_size}; -} - -// POST -template -inline Result Post(ClientType &cli, const std::string &path, - const std::string &body, const std::string &content_type, - size_t chunk_size = 8192) { - return Result{cli.open_stream("POST", path, {}, {}, body, content_type), - chunk_size}; -} - -template -inline Result Post(ClientType &cli, const std::string &path, - const Headers &headers, const std::string &body, - const std::string &content_type, size_t chunk_size = 8192) { - return Result{cli.open_stream("POST", path, {}, headers, body, content_type), - chunk_size}; -} - -template -inline Result Post(ClientType &cli, const std::string &path, - const Params ¶ms, const std::string &body, - const std::string &content_type, size_t chunk_size = 8192) { - return Result{cli.open_stream("POST", path, params, {}, body, content_type), - chunk_size}; -} - -template -inline Result Post(ClientType &cli, const std::string &path, - const Params ¶ms, const Headers &headers, - const std::string &body, const std::string &content_type, - size_t chunk_size = 8192) { - return Result{ - cli.open_stream("POST", path, params, headers, body, content_type), - chunk_size}; -} - -// PUT -template -inline Result Put(ClientType &cli, const std::string &path, - const std::string &body, const std::string &content_type, - size_t chunk_size = 8192) { - return Result{cli.open_stream("PUT", path, {}, {}, body, content_type), - chunk_size}; -} - -template -inline Result Put(ClientType &cli, const std::string &path, - const Headers &headers, const std::string &body, - const std::string &content_type, size_t chunk_size = 8192) { - return Result{cli.open_stream("PUT", path, {}, headers, body, content_type), - chunk_size}; -} - -template -inline Result Put(ClientType &cli, const std::string &path, - const Params ¶ms, const std::string &body, - const std::string &content_type, size_t chunk_size = 8192) { - return Result{cli.open_stream("PUT", path, params, {}, body, content_type), - chunk_size}; -} - -template -inline Result Put(ClientType &cli, const std::string &path, - const Params ¶ms, const Headers &headers, - const std::string &body, const std::string &content_type, - size_t chunk_size = 8192) { - return Result{ - cli.open_stream("PUT", path, params, headers, body, content_type), - chunk_size}; -} - -// PATCH -template -inline Result Patch(ClientType &cli, const std::string &path, - const std::string &body, const std::string &content_type, - size_t chunk_size = 8192) { - return Result{cli.open_stream("PATCH", path, {}, {}, body, content_type), - chunk_size}; -} - -template -inline Result Patch(ClientType &cli, const std::string &path, - const Headers &headers, const std::string &body, - const std::string &content_type, size_t chunk_size = 8192) { - return Result{cli.open_stream("PATCH", path, {}, headers, body, content_type), - chunk_size}; -} - -template -inline Result Patch(ClientType &cli, const std::string &path, - const Params ¶ms, const std::string &body, - const std::string &content_type, size_t chunk_size = 8192) { - return Result{cli.open_stream("PATCH", path, params, {}, body, content_type), - chunk_size}; -} - -template -inline Result Patch(ClientType &cli, const std::string &path, - const Params ¶ms, const Headers &headers, - const std::string &body, const std::string &content_type, - size_t chunk_size = 8192) { - return Result{ - cli.open_stream("PATCH", path, params, headers, body, content_type), - chunk_size}; -} - -// DELETE -template -inline Result Delete(ClientType &cli, const std::string &path, - size_t chunk_size = 8192) { - return Result{cli.open_stream("DELETE", path), chunk_size}; -} - -template -inline Result Delete(ClientType &cli, const std::string &path, - const Headers &headers, size_t chunk_size = 8192) { - return Result{cli.open_stream("DELETE", path, {}, headers), chunk_size}; -} - -template -inline Result Delete(ClientType &cli, const std::string &path, - const std::string &body, const std::string &content_type, - size_t chunk_size = 8192) { - return Result{cli.open_stream("DELETE", path, {}, {}, body, content_type), - chunk_size}; -} - -template -inline Result Delete(ClientType &cli, const std::string &path, - const Headers &headers, const std::string &body, - const std::string &content_type, - size_t chunk_size = 8192) { - return Result{ - cli.open_stream("DELETE", path, {}, headers, body, content_type), - chunk_size}; -} - -template -inline Result Delete(ClientType &cli, const std::string &path, - const Params ¶ms, size_t chunk_size = 8192) { - return Result{cli.open_stream("DELETE", path, params), chunk_size}; -} - -template -inline Result Delete(ClientType &cli, const std::string &path, - const Params ¶ms, const Headers &headers, - size_t chunk_size = 8192) { - return Result{cli.open_stream("DELETE", path, params, headers), chunk_size}; -} - -template -inline Result Delete(ClientType &cli, const std::string &path, - const Params ¶ms, const std::string &body, - const std::string &content_type, - size_t chunk_size = 8192) { - return Result{cli.open_stream("DELETE", path, params, {}, body, content_type), - chunk_size}; -} - -template -inline Result Delete(ClientType &cli, const std::string &path, - const Params ¶ms, const Headers &headers, - const std::string &body, const std::string &content_type, - size_t chunk_size = 8192) { - return Result{ - cli.open_stream("DELETE", path, params, headers, body, content_type), - chunk_size}; -} - -// HEAD -template -inline Result Head(ClientType &cli, const std::string &path, - size_t chunk_size = 8192) { - return Result{cli.open_stream("HEAD", path), chunk_size}; -} - -template -inline Result Head(ClientType &cli, const std::string &path, - const Headers &headers, size_t chunk_size = 8192) { - return Result{cli.open_stream("HEAD", path, {}, headers), chunk_size}; -} - -template -inline Result Head(ClientType &cli, const std::string &path, - const Params ¶ms, size_t chunk_size = 8192) { - return Result{cli.open_stream("HEAD", path, params), chunk_size}; -} - -template -inline Result Head(ClientType &cli, const std::string &path, - const Params ¶ms, const Headers &headers, - size_t chunk_size = 8192) { - return Result{cli.open_stream("HEAD", path, params, headers), chunk_size}; -} - -// OPTIONS -template -inline Result Options(ClientType &cli, const std::string &path, - size_t chunk_size = 8192) { - return Result{cli.open_stream("OPTIONS", path), chunk_size}; -} - -template -inline Result Options(ClientType &cli, const std::string &path, - const Headers &headers, size_t chunk_size = 8192) { - return Result{cli.open_stream("OPTIONS", path, {}, headers), chunk_size}; -} - -template -inline Result Options(ClientType &cli, const std::string &path, - const Params ¶ms, size_t chunk_size = 8192) { - return Result{cli.open_stream("OPTIONS", path, params), chunk_size}; -} - -template -inline Result Options(ClientType &cli, const std::string &path, - const Params ¶ms, const Headers &headers, - size_t chunk_size = 8192) { - return Result{cli.open_stream("OPTIONS", path, params, headers), chunk_size}; -} - -} // namespace stream - -namespace sse { - -struct SSEMessage { - std::string event; // Event type (default: "message") - std::string data; // Event payload - std::string id; // Event ID for Last-Event-ID header - - SSEMessage() : event("message") {} - - void clear() { - event = "message"; - data.clear(); - id.clear(); - } -}; - -class SSEClient { -public: - using MessageHandler = std::function; - using ErrorHandler = std::function; - using OpenHandler = std::function; - - SSEClient(Client &client, const std::string &path) - : client_(client), path_(path) {} - - SSEClient(Client &client, const std::string &path, const Headers &headers) - : client_(client), path_(path), headers_(headers) {} - - ~SSEClient() { stop(); } - - SSEClient(const SSEClient &) = delete; - SSEClient &operator=(const SSEClient &) = delete; - - // Event handlers - SSEClient &on_message(MessageHandler handler) { - on_message_ = std::move(handler); - return *this; - } - - SSEClient &on_event(const std::string &type, MessageHandler handler) { - event_handlers_[type] = std::move(handler); - return *this; - } - - SSEClient &on_open(OpenHandler handler) { - on_open_ = std::move(handler); - return *this; - } - - SSEClient &on_error(ErrorHandler handler) { - on_error_ = std::move(handler); - return *this; - } - - SSEClient &set_reconnect_interval(int ms) { - reconnect_interval_ms_ = ms; - return *this; - } - - SSEClient &set_max_reconnect_attempts(int n) { - max_reconnect_attempts_ = n; - return *this; - } - - // State accessors - bool is_connected() const { return connected_.load(); } - const std::string &last_event_id() const { return last_event_id_; } - - // Blocking start - runs event loop with auto-reconnect - void start() { - running_.store(true); - run_event_loop(); - } - - // Non-blocking start - runs in background thread - void start_async() { - running_.store(true); - async_thread_ = std::thread([this]() { run_event_loop(); }); - } - - // Stop the client (thread-safe) - void stop() { - running_.store(false); - client_.stop(); // Cancel any pending operations - if (async_thread_.joinable()) { async_thread_.join(); } - } - -private: - // Parse a single SSE field line - // Returns true if this line ends an event (blank line) - bool parse_sse_line(const std::string &line, SSEMessage &msg, int &retry_ms) { - // Blank line signals end of event - if (line.empty() || line == "\r") { return true; } - - // Lines starting with ':' are comments (ignored) - if (!line.empty() && line[0] == ':') { return false; } - - // Find the colon separator - auto colon_pos = line.find(':'); - if (colon_pos == std::string::npos) { - // Line with no colon is treated as field name with empty value - return false; - } - - auto field = line.substr(0, colon_pos); - std::string value; - - // Value starts after colon, skip optional single space - if (colon_pos + 1 < line.size()) { - auto value_start = colon_pos + 1; - if (line[value_start] == ' ') { value_start++; } - value = line.substr(value_start); - // Remove trailing \r if present - if (!value.empty() && value.back() == '\r') { value.pop_back(); } - } - - // Handle known fields - if (field == "event") { - msg.event = value; - } else if (field == "data") { - // Multiple data lines are concatenated with newlines - if (!msg.data.empty()) { msg.data += "\n"; } - msg.data += value; - } else if (field == "id") { - // Empty id is valid (clears the last event ID) - msg.id = value; - } else if (field == "retry") { - // Parse retry interval in milliseconds - try { - retry_ms = std::stoi(value); - } catch (...) { - // Invalid retry value, ignore - } - } - // Unknown fields are ignored per SSE spec - - return false; - } - - // Main event loop with auto-reconnect - void run_event_loop() { - auto reconnect_count = 0; - - while (running_.load()) { - // Build headers, including Last-Event-ID if we have one - auto request_headers = headers_; - if (!last_event_id_.empty()) { - request_headers.emplace("Last-Event-ID", last_event_id_); - } - - // Open streaming connection - auto result = stream::Get(client_, path_, request_headers); - - // Connection error handling - if (!result) { - connected_.store(false); - if (on_error_) { on_error_(result.error()); } - - if (!should_reconnect(reconnect_count)) { break; } - wait_for_reconnect(); - reconnect_count++; - continue; - } - - if (result.status() != 200) { - connected_.store(false); - // For certain errors, don't reconnect - if (result.status() == 204 || // No Content - server wants us to stop - result.status() == 404 || // Not Found - result.status() == 401 || // Unauthorized - result.status() == 403) { // Forbidden - if (on_error_) { on_error_(Error::Connection); } - break; - } - - if (on_error_) { on_error_(Error::Connection); } - - if (!should_reconnect(reconnect_count)) { break; } - wait_for_reconnect(); - reconnect_count++; - continue; - } - - // Connection successful - connected_.store(true); - reconnect_count = 0; - if (on_open_) { on_open_(); } - - // Event receiving loop - std::string buffer; - SSEMessage current_msg; - - while (running_.load() && result.next()) { - buffer.append(result.data(), result.size()); - - // Process complete lines in the buffer - size_t line_start = 0; - size_t newline_pos; - - while ((newline_pos = buffer.find('\n', line_start)) != - std::string::npos) { - auto line = buffer.substr(line_start, newline_pos - line_start); - line_start = newline_pos + 1; - - // Parse the line and check if event is complete - auto event_complete = - parse_sse_line(line, current_msg, reconnect_interval_ms_); - - if (event_complete && !current_msg.data.empty()) { - // Update last_event_id for reconnection - if (!current_msg.id.empty()) { last_event_id_ = current_msg.id; } - - // Dispatch event to appropriate handler - dispatch_event(current_msg); - - current_msg.clear(); - } - } - - // Keep unprocessed data in buffer - buffer.erase(0, line_start); - } - - // Connection ended - connected_.store(false); - - if (!running_.load()) { break; } - - // Check for read errors - if (result.has_read_error()) { - if (on_error_) { on_error_(result.read_error()); } - } - - if (!should_reconnect(reconnect_count)) { break; } - wait_for_reconnect(); - reconnect_count++; - } - - connected_.store(false); - } - - // Dispatch event to appropriate handler - void dispatch_event(const SSEMessage &msg) { - // Check for specific event type handler first - auto it = event_handlers_.find(msg.event); - if (it != event_handlers_.end()) { - it->second(msg); - return; - } - - // Fall back to generic message handler - if (on_message_) { on_message_(msg); } - } - - // Check if we should attempt to reconnect - bool should_reconnect(int count) const { - if (!running_.load()) { return false; } - if (max_reconnect_attempts_ == 0) { return true; } // unlimited - return count < max_reconnect_attempts_; - } - - // Wait for reconnect interval - void wait_for_reconnect() { - // Use small increments to check running_ flag frequently - auto waited = 0; - while (running_.load() && waited < reconnect_interval_ms_) { - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - waited += 100; - } - } - - // Client and path - Client &client_; - std::string path_; - Headers headers_; - - // Callbacks - MessageHandler on_message_; - std::map event_handlers_; - OpenHandler on_open_; - ErrorHandler on_error_; - - // Configuration - int reconnect_interval_ms_ = 3000; - int max_reconnect_attempts_ = 0; // 0 = unlimited - - // State - std::atomic running_{false}; - std::atomic connected_{false}; - std::string last_event_id_; - - // Async support - std::thread async_thread_; -}; - -} // namespace sse - } // namespace httplib

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�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≶lT8iT9t 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%0ArdUFsCmDuqVg70dCde|flgfXsWj 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

`@a0aEUh%Nzl?VPGFRpnXX&RNjdU?qdDa%?28 z2kOxeI&*QK_XHR}d&w!cp}-L=`@khdKFG=W`P%)}4tt`(ZQ2w@X`y{9B)LF;g|32x zbSM^ucrD?FIF%ps#Tfu1Hg6haO2C_j-H99;;}?9ge2czPU z@muIG?eK_)!zXM}UHMKxb;^9zZy!H@@%Gg-?TgrY(W78 z=Oq%E0@arQY{RLjn+Mo?At2h9@+1`#e{sbZFv@J$smG>^1WWO5Z{&pqHVOi12+YBo zu+s-7KVUMHjRcOyL05+Vl-9X^8lcDZg%o0GldhPesE+Z(o1xo}H)D9S_3kO`hHQIE zjZ*vmsqd+?NW9Q%3czbR=-t?G~tV6uLt7S9ys> zoVtq(0$kYXu6B02s}VJcw;RvU%>wZPb)E>VC+q z|Ae!;DD0Q0$qeV^B{U}~bkYsr9Dk7zo!zbQFhd-7NxVrkql`qcB0!ucEL=bscug|7 zt4XC6m+Of5%7xMu;T4~ypQN}qx}26DEo0IvLav$+D=tAXt!^8IB-msJ{q*2q2or3^ zIt|bGww+eiKbMX^LX-SGbWI^xrKq9Ou0?g!8U6`~{oSR`It=Sp-(lKTEq{DwoI0qd zYSY!qo;BL9{}HS#n(Xb}I5A-@$A}tkd>o(^Rx;Uu?wYr-&Q;yB>a!ymn4eR`#UNPr z$sxUi81@}PJeW;z0+1Upk+aiX{`W9C<<~z#5y+RE1YC@6L<1z(moOxsPxhehXBst# z;KQ5X#J84a$Ga%GwvJ4=Ab*9@ihNt>fwa zw7>H3^VPK&8+^Jy+&y0T$B-^Gv;K62O3^FUV7(M?WrJk^Xk&YjEC2oBbiDG#7Z1N& z`T6Iav-OMnB)Gc7O2ao%YJ%MO!tu#Rs37u>>w?Fe%#UanPau?YrqG=A58ICx-6gDA=-h-p?s7;P0Hsmjd%ZE1N^K;~Y8ep8ru ziVO$_G41W>(`^;R)1pxYsPgdz;;W!;z7<)kxEDUo&OJWx(+5kBjFxOv? zMApQpZ~kH?$wBZC{Kb=W!?u>h%Jq#PvLo!A0u~yq8bu~&5aj^CrZ{vJ6zdJz`~q8z z`jZ~?)&2J@flIjH>NF7xEI4l9TNEqLE^Z;cj^sx2zQXh=5 z9FnPVLDD(u4wXu~2#3Y>y+*R5%y<{-!lLzx-QvQV6-`7K9M|!AS07OBUB$xn_fvF` zikH7B6(D~Uz>%krcM89nfu{D5ojG_ySS3JhOp>@xkuja`1s~~7ehh)AQdSmD zll2%rs#B)csB&e>YvWqeIcL3j_ZZiM5Yl~&FQb{c4*!#^Oi+%)f)ClS=Gt&&DAPmeq=I7eEM$=xSlXKIMKUxUikc4OE} z{Awq*HF`CRa+pW_Np-h~(wJShqOy0H7Uq9&G-I0si|m26BGt3Rj$W#1BKwQ{t%iRxX}pV_5v!6{ zUC0Wph4trIoXP=E&5rvi5gYSXi`$1Kyjc4^>s!xhAE+$!+7tkfeoLOoeM6>BV*G!U z(mH5|42*GXvuDv5)YOKUlyLhij&kUZ5^9rU1r3%5Uyn91Yp`3zw8{a2cJ;j4frvCm z*<4eGF>l=$0e^}vOwh< zk(DmR5LXinU>2m)@)m{Z%*!RO;4go$^>>5qJHTepR~o(1dPKtlzDl5WC{uuSSAk{ydHK~GEb ztVQi|2X_U!O=8=Vgh!#$sR>idP#=RdOG6UFcKHq>aZi5!nbeN-FJx01A4q?3!3{AJZN;LXtVrxo_NiaxFqm2HDlGpxn!0~IS-N-!J_B{elV?4MNbV4m;4Tb&oM~wYqMVuovJ*Mr zhzO-!fRsp8A3PUrhFKfS0{!x11A>4X8~3q%H^!p%)_Sx62svZC z8j{gD;5tg)8dhLo;o*%zrXJ$$LsmcM2%}{-O8Xc+9u_3Nzb)~X=Zt?Y$!{3l?+`VU z?`OT#0LD3f`#69$nIS%3nEK>g{|06%2)jo<_}vgeB9z_KB~MFF>{`6fxJKTb_{f_R zwqLRco$~8)aX4{1&Bfu|SS&{9@6xwQjL-=P6d1JT7@@wv4aW%Wxfr1YirCV*l5l%& z2>C=$_=I~V(yfZ6$bo-slI$0vY*H7?jledNPFL>Cj0br%ECpFf=7IrYQ5i3B9_rDy}TzKhkQ-toCU!IK2{fJB~)j(4&G%}$qmBB0< zyf*!e5+iTawl#lX^C7x0)~|pr?Ba2VKBT68l*nVKMnbJIRg@tXb5?ZoSPN}bO|fi6 zg6m{vv(36R2Gy-j(X+oH0E&_lo-(nY=`PK961c@MECK1<2b0M-VzktcTMWO@wq>E^ zT6>-Fvgmn9d$`b4%p^c9ZNW8KZS0C0FyMwZY)MaZ;s+F)wf$PNW=afNjpHqQOR>C# zFH<*{<}VdAf3}91y&J-nB}C#|V$$Ih2oT53NGhE&o72>GH-ZR1rzb)Li~csQw8U58 zXJIwzUnLtV(I@FFatPH-em}8TS7Pxk|$kfMlspg>mkeI!O2C#QZ_8R)CX22{CuC zl(9rBrJQ=D*prYN%28y-N+C(|B{;}QrkJINvSNN+Eg4c>Ioe3|a+In#he>gg{?$rr zVko5s_emj5OUj6Aa;BhVB&F54H&Z<1gz|jtf2kI=L@N~_EGh+`y7X99S!1fyKk3R$Wv zXX@5^S(g*bGj?jVs3uw|BJhYRs0ep57KH;NwN|I2V5z^V8E_~T2xm{#pG(q zYVWM5@0r>h*Gp<@r5v5(`Ldc*DPN}mT0A8J)%Y*PI<>D+iySkjYBF|0hpCp=v`~gw zmuewPjHTrGuayhQv7|Z?*NVpUSe9eWf7D7^YAi>$@Bd5Om#DXOBk8`1tef$OF(pfJ z(w(Nl==0ifVrR26Nm|jhk4Q>7ZHm+!Qn3}8^X&Jp1wdgT#p6!T?fzo%0EHbW6l%@D zG|@q^JR||)=T`&+8G8!CNd_Xnf-+ixDY_I$(>x3iRs!OqA3l-107^WTv_6;Uf1or@ zO#=3nPxWviUQG%c{nT*q(;qEnJJh4iT&PGZ`ma6Z+;6-b^5-1WdCJe3D5=}9Q%ruk zH2`3DhSOh5p+d5Qbjo@Oq*FLcAjyM54k)PsuE}fTqyQ0k;u&O=6-sc(on@FsxI(D96LA=~4{G;6l1{4D%1T2%ZwF5B3{#;y3P}Tu#`D|Asgp z(AD$oZoi_;hL5yLA>I>?7jarfP0HyMiNbUW#bVE3`81>yZ7xRgzbru8nEyQNe0ias2c_MH>&7&Mq55_Neb!;d;B zSp>Y`+H|MDju1NFeG91hWn2TmpR7S}&vWrsb z&L%6Ny?~SqaamZ?pQJs3&2m7x1@Ki88j{uVI;=)U5i8}c=u2^0Q=?Jv2k>mblkd0x z#FjoAZOp((-5{X}*)6eUhE9WeN6VK{WGT@S5i7UXqM^mBe-o6Z9zI~P#LKC6S{A4a z!wPmZ>4Xm~JtFnNx;yb!HVtfHnlJ9{H)L8<_p8Hqq;cJaK_$r$oUIobyOGifW|t8N zyULmbPe9}At_jJ4YR|?&gmc{jo6&eRVe1o=kON3e{oDEd<5#PsN<^PORU)QQMa)@ zpO$;BQ;BXjrEU+7;1!JhxN)~h=uzsft0i<8WV!^jfhR)HH14y|{c(Q~q|)>(56(ow zTE2fjUXruALxXBEnQE8J)}UU&GXY5@>-o%e7F#mvU)moput<92)7S5dmx-*`6X){` zI+q-If9n!+rgHPBhiLe|Q(g_qpCxyOFe*IipLroL-XC-=kR6eb2wOo~%dacKkuW71 zlY=}@MRXzOf(A8JHOD{x_8Fw-8Af{O4&QIH{Q(mxXj^ntrPQ)R05Wj{VpMivX>r0r zE>LB#C?2_$BNFDyY~tQ1n>|9V-b53F|MGWGm9Rl zf*!*dBjh-Zk)y$tZVxR%jN~X&Pk?dNnaB2VZb3Itr|C#MS%xg>i7h4+i ze^%=M_z1onsq}d5{%eIT`hV6pl;2cP6yvCnI@VN(#A!#Lk<&?fc*=&xXT#~2_+ip7 zEpk|O<<>NIMG4HC;~Yi|L|HRoCNBQGe-B;q5g@M#v`weC5zk%JgW$qTbeLjV9j3G7 zCQfoPf(E%RFG5h9jxMlCNbCzl4;lO;$VCW~bXGxv#dUr7oUdI^Uyk~FT{sVQPo~iq z)BRDf;zkZoGQ15mI<)$50vk`Z!={f%NSxgnb@7o7Y|x!98x^whAyFb`T-G?6e{-WY z7M^0!P_KD{VF0Fwi~OlWg#_+JsxiVF#nVDMVlpkXVtVV{0x8@SEgf0)!y|4c&q1|{ z9mN3^%8mVDuQnHR3wji>dsFu&?ZqW@)*Z!I>FV6s!&3PXY_s!A5Ch(Ai7v)mZV9)~ z^oMAnaXZedLd6R;!L4T39g97)e~S%TTq_QRYhM_vOu-))uSnmD+Ic!TVZN!X02{o_ zyRs0KTL?VrZ#m_v!@cg_kvELuKs*(h+8)5%8F5STOUe90eAJU}bHwER{mD@DKj=N}-MT z3;u9;kfImmnKXD5IEx~>V~9WFXpemM8z2Ni@tzunBUyIg7iLbjCTM`ju?|jy^RLq| z$pN*xw>7!-l27sRh5qASe-Rg9qVs6?5B$D|i)No8Psh_^n5sY@7*<~L#^rRnpg{0! z_PC4E0PB z>N4`B74%(pc2VtzL~dl+iju)o3hrnQ0%A};&-e-GyV`@jQ-+qztVy?vzH z$`hZvep{gx7^}j|N2hz(bnByj#W?d0UAE3s54oZir!&cFg6np8=T5~J1@Y|3Tit|A zaCz&^IumBfVikB-d3nL%iTB>BouJ!sE}Ll<&I1jZs;qpK6uXD(#IaIG;hqIG(d%vM z2TA4xyf8E+f2hH${2%`IpI^Y7w&&j!61y8o{mrxa{GxaF?%TI-$>;pev^l*ygW}+M zbr+x8RO0U5&hFjKFMs<_(O5T2WS*bQPqBG=_Y0qt1L6Sf!+Y7`7{hUwA1|3E=%(8I zf*ST+{nEJ6QU*91y>g>Ju;>QAPwG<=+{kXb57YPKe`;;F1V2FWoI*jONEDZnQ~qj$ ze!+(R1z6d!wfuQxG*^rtCP~mRZl?I~vfRWiB;<`hH6>MYcZzgefBk@g{nd-YYh9Bd!f zsx~WbE2l7)QDAVXa&LE4m9CJjXnH(?hMYvZcm_qlV7;u0ST}B|yo$~4ZkO@DI4Jz0 z|9Qau_fKsA{B^c06)^kNSmndTF8y&a0_euc}l$!WT=R$U4ME)bR;vkpYps&ibz-u|(DtcD^^6XLk3qUT92 z&@I6Nat7%SAYzN`XWj5~3W!zF^O{Ic2wAjC;Ib&{3c!})bhiUr&W7yTHAD8Ye{wU& z6(=7RqLpiQyz9cV=_zb)#;62s0Yt9fdHUNyO5OV!yBEU6Zi|3V-veO65 zBL~UyTWi@^VtP62ja_lR)y!TZCo|Cr;+wNwSE)o!*jodA4)PUQbiU?Th6m zyy(PiSttTGee|qqHGfpVOrYy?sF3MW@^pKGBi5EgP_ot)cWC@=11ZqtRP?k9=se2D zDf<|w?0!=nb5xCoR}Bn(_~+wlHh+9ca+7NE;}nMyX@746-3WoS~1&4}2 z82I@OC`Sfzz%OdteK5r2e}Fy;^zy8N!=Ftk#6q=~onnPNy!hrsX5%BAdD!Wpw|rf; zL?$3}TuCN)ITp&rfT-~ciUaa?bo_8!^XqE!j|+;2;@i~A4K~S$(lTy?Y}~!*iiU$N zZ-Z9bM_&^y-hTA%Al|+`2}5;x?fP*E1@(6_lD0Eyiqe$MXn{xXe~295oG0V@;u-wE zlf`0`_yVydq0Eg`Gs%|m(zYYEEcFB@_gKQ@MlRM|Tk%`>=2hg_JlP9XZ3x@cBPEvA z)RN8!HjXyL(6aC`jvHaG_EB>VYcdM#8EuKsotOo(-eM%}(Q}(%m1U=g!)F=3>6%H?*i?kjqI;EDA14YS!kH`$ewZY@%`0h{(nB{@tH``|Zxw z;qLa|s_m2e+fR<}bnZf+n^zvxj)~!oIIi-F>_(o4y~cLxe^;4wU>a9un_iwFHksGG z(0EM7iNyiz#byYGL85`Zqwd~cAlHLHZl8n}jTi1|sPu;QUNnw4L^N8->%cM8OF7*F|*MDxsG8olEKrWzj*0x{yN zhV(Y`uFIm(e^!AE)M0)5qU|ws<-$Q^j8FPzEpf()D@WJ@>Xpnr9yNGq6KNt&dBs0( zz#WP^$tIYtxHc!rU5jaGw#bw3MJ#}TxaGkp4x4DWpDTReL`2zAxCsT9T2_^xUJ#^g zJVDmi6k}!mtA}V=TQsa0o0r4B(lVmg+W@DbWT@`xe+lcVw%h=uI{>ZkmCAPH}q6M_Ok>je^ZAFd|U!Hm8~uUA0_F zB`;;*e-ovTea8RR{O^3g#J}?o>iNQv-#kTEHtl9oTO#bVoIxikz>9@=gM$9)k!4>f zA0(<`ep28J7{-9u!-PjTI6XM^`!VG+erMoW{&n>nXnXXDH zD_#mLsAv!{1Co}f0uRA`f4{9@Ty3q!lMp+Q|NK63|Ms2D-TaR zmB%pQOA1~_@GrrdiD?ODHt41JF=vJYq1?#{3b$DjqQazqZR+V;U~CqyqDD8g{t@t5HYn^fClPG+eA%G&-mVQ;UA@v(fs2y($efj!hUSUWxi zS3}~0693(})Gfal^49^LMv)eQf1|E4=@<}h6b`_h)L0^hNm}vr_BCD3^zbol1Wn+qoP<$JdIwr^8D)5{+b!BvQ~o zQmK!6A_(oEXF>BZQ(hIfboP#}ppt2OsG1%&B~^J`y}+$xxioYu%RRSUe=&0RSc)67 zNupiZ#4h{453+?;-3rAbtptjSR6|!RZ&|c};?6tyzV(Km2;!oR6|=_dsWddU9qqWH zt@n;xdRB?f5ECEi_g4tk^1~(WwB+>ycVcfK`@DK^_5GtKFR*1>(EqUPiOXhUC3RNT z_Nvsd9sx(Dqixg4w5+L?e-%qw>x76tiYSCwrA6$T={Wis)P+_t52YLJh$SgvHfXAy zXSbtQbX%enFG?g);D-2>km*o}<06Cbm_?M`8#cjF#qmXww~}Aw<;WaM_4(foE#F*3 z)=SwHmSeXR2zT!Cyy406Jk04b=k6=)2~=sqDFZBp0ON24ub{2of4n?d%%+TyM%$W9 z(WKHB;ECmugPV7JD60GnCEuBm>vHU=;zcFyL0j|_O4_c=&D^>!DP}5acN^JD=>H3~ zcOzjJKZe%isIZ3BDtV-r+gcf{R|?)X;@t2q()W`*k7DWWXopxhS0d@HXWv%jkC1`9 ze3t|2cww!|XUXW;f6I9xX7|eoCzenNYdvf(b+a7S+erJtIRF~mz8?Yl34J>I)DN;^ z7YC?)AEjJdX>n+mHfZ}+sni-XW0cFM&!(VGAA(ImeIb>++0XSHCTcLBBL_C(M)dUY zyNj(&MCSeNw~Om%i&sbfC;c7nypqr7i|r#)JiDY|E^!3lf7m&jjIRfaX>q$jsoM82 z1D<4WiRLV|&(CQN>&W7ERtyXH?Z?ZBD9p9Bx@desYCt(tTD_NvX}g)MTS~UUV9u;0 zs38ZX&|D$XK74#XBXlEa{P1ZxaPwrMk)!W!ykVFxl*8Y)YAr_fdP2_yGppq(BODTn z(nzGEiEHNDe=gX&tuw*K+RduQS~IxxH6XWJJgM=?L`6J7ayquxqvk;VW3H=r`LA zo=+Rn@S4qWZBcvpA!dcMs~P5vF4U&B?OE%q4_O4UKJ>!hcaLF~M6cIUuy>yuv-&?v z4K59Pe;@n|!w^`fUoznV@q(AQIXUt=ix!g&>8f(jl@Tu;OC#nx zx+_8-q-PKsb1biT*Fw_Qb_=11;m=pIL0y0Tnfvt>v*`zedOkm?m}9T9r|};oJOf$q zjA?Ybys@vD;et26vt%8DJ81UXPfZB^yB^M@fBl+bjVxa4dIJq1TbWZNSe%f1Be$Xa z)VL|~!8WR)`>x^KIYCR_y$;fGDAt$~>V zV{oKcd1Cf-GOT~Ehu}Q0RiMdvIR%P16Jux!WUc9HJ~){=I6M2o5O3Q_DMcOI+ks~X zfBgFw{+G7+-p;4|?>+wale{stvuuMN;*t(G>SLZYMhn5dL#~DgHkZcbg=p(KGfXxD zzkduKUdb3U^pQsVAzHie5Uf-<}) zk9`k!ySqo?qi6+FDzJRW=@1X^mm$a8T6c}HG^zf}5>_*ls!M5_UxpX$nzj0bf2zh3 z?U7$*t?(au7pXYmtgg^K`o~49%2_?P#S!>Z^>xLbdSzJF1f&p@Rk@c5paf*~5m3eI zIt_v9QxmwqmH{c*LB=RGg-*Z9Y=fZpyptT+zrSUm9y;bJ8< zf&2DF8IsdOcvdBovJkBy-G*s(9=!93c1D>=uvV*ORS4UfWV@1v*OnAAri(W4sc_-a z(5F5%1YAw@*|N~9dA=!YE&KA4Np7JWYw;{E=(25iSk-kbgoq6}e-0iB2MHXk_iUI| zqkEHvS&g$o2~so4U^UT06%J8)bb^LvF&M07n1HabmW{Y24b7>><4ke@_Z)GfYTa!MXiWUW{6O@r3j3=dtRSTkbP>*N#xB|V0P zSxXUC(rtKMW*HUY>$>z1x|ZMQS)5y!YQyV_W_TgOuFtU0rR&C9Sj4bp`XrbR6rq=p z__@JB9Q-%$KPP#JL5g3X#c%V6X*63XN5}bDcwtHM5J3w$e+7(kOswFTF_=dU&hl5s z8ICo0EqJO>n>JO*521=h&Xh$f_Q^41whlfuz~x&wedebMi6!tjJ1VI>)l#XD6_pV6 zic$feV}ducf?yuM*(H0(Y$rs)mJ0_dJw&2?mPccj!~i9->D6i6# z!`dug!fXDdfABVAWlZQuT`2=*9iUn)7+Tq9#U-FhQUsTD1M3t;a%hti;H}a}RwT*vp^aI? zBMofq5^o3$ov4Ep3OK$_DV%i5^YJPeDZEJ!QJ%8^f6sBe<_tZuPC^VL>Hs;MPxr8R z?5ALoR_*xgqj%A{j3f$R*87f=3qtliIAvw_HsE;meC~G%e#(6F3#3mcc`& zFLeX^copy1i`bGfUS4Nmz3?jqwizCp1y(7fOLR~WHY6aBA4U1;8w7$Ln?FmZ333~g z56MZAe-F`%3G6)@XmkjT$cPtG2oiy*4$14vYeoZht{Ms&$<5o@a2zUKF6la73u-o8 z3FRGIotzNN?~nt608cc6*BH#GP~OS+>mdYD^)Ofh6wL#mcuD@&W^oeG(upL~ugEi; zYf;_||3a5-1^?bY<8{@{k@^rYVzb%D?WTUKO)ps z>ZWDA0a1`FE&1=A@fXwTBJoJEUJqx!;QvAghlo&U9FVu@p_Kghb}=9-ir@6AouV4` zloi$fojv>+DD%T6k&x~G$|O=3114^Rr{en{@xTwM2R{c0yGxiWlXAllN;unU0G04# ze{3c$NXhCF`%{x9${brQ%`o$^N`<}G+RRgQA^wTel&WR?Vz1Oz9kd1i#10x{xI zqEl{C)F?o%)YmA$$7&l9v6D+VqdYHdD91l1{c%a3k~SlPmJ?F~_c_boe@i(gx3qXTkSRePnV1?Me>@3u zLm@#~OK(ngnWC^q!6AcbO{Fl#2pX*a zdUT$pd#^6f2*@8yme=$ad9htP+SLjS&Vb(K4qypHSlKt2KVQ{P~&bU|Y z<~=T&S#7$U(zM*OyL$9J)WJq%Gu>)Vh#RCO*PDJ8nyefJ|Cs)u!h#LYu*$$aT}`eAYXS{ZP*7rEA6I2f67=pr{m+M zWOPO8tK!?SMzeFwhI&hL_}AbWya~6-dSk^gH*Wd$%(oerICvG}P<9*zlvefjEvhM;vZ)7W&7inPwC80i;NTU9#y}e@=#c7EE~q9%?x` z27~>1Tg7yz)kIiyYTfOIgvH#6Y6YRJf_jA}r;u62Cf%`98fK?hHj=Vae|*v_&wg4L={6+S3Q@g* zbc4?!O4i^QcQ$I84PPpr4xhYw zK60=X6OscbGvWa<#VwQJW@5rK0o{x+1^9T?!UlIjLX*e__wtgZbM(gqaU+yIug)(h zmYe$>vPJ(VfA)GC$6;2OqQ`$ zUb(n7fBC9fsCYSZwHaL>vxs=#(;|`!DDDr~-#l>PHjQ0g0c1_Fedb!2HW#pVq_+TRcyA*vYxQQkI*~AOCh2$tT{Rbg zNz-cBy^`~GxNkbf2g=~ZsGl=wom7jr@r;C@5&gi+WU7iBngUfPd6ht`3u{u1eSx<% zl%S|@e{X=z(fe%)kb=Ml2rNhw1**ON13yq^CVZKY=WDY$yak}Ls-Lc>V(=*Y znt%SX_0je7YJNsum9}=f!Mj1{E_wcfH^wLRe>-Si;QL52?~jx9@wH zb4@fygU@yU%kxn+!_VxTau$MN=y;LdbQyw zf1eHd;{WKhdx@WLBHH}++vJG8;j{r+^m%aibpPaXB03DP;o=*dc3`)17gf`jdrg84 zjJD`5W2Yd9KdN^|qwZhpA}B@t;QT|>dW0aS-Yf2Y6y#JBd*qaaBAYs|CF8*kMo8gH z(dZ`QgbvwCgMTyHr%)o3ezlKqpIehYf5;@75x@`yOHCbsbB7=zHH8p?Gn=70T$PjE zIcQASa`XG(^+(qYq@at9kFF<+*S$#(U+^%7+Z>*Q#^bHK+gpd#_8<4R|8dm8gkl7I zXy-ryKOu0H`gp}c^e2mkkL(j(*W0&2S&*rxd~RJ+KgqVaXQ8@s`DxnE`~gBne-U7p z+*V<+HJg{r^|+V+qXA&FWymL zo-9M#L#1JHc0T+39s;}U+`D%V;cb(hXbS9y-~Dv|Rv&YI)LI6_*p6uKbh{@7JDrcK zk3rn<$Xt`y9H#x(6c!e!JR~hPe?ErZcC)pObMEgF97Uo-JDu0q!}YtDIMZ;}#Z7t- z%Z<`UCzc30p0al__Lm92H%i6PryP%))D4KP6Uuisz;BVmPX|Z+TYHA|1eMEwS-b3T zF0>^V(+>;l&p6Bg25T#e zXi7nQBm2K-vap2_E0EeMl{vt>|f$J;<&6bU*36Kbm8}|$W`6@_vmI+ z{tV?e(A@=XOXn2n4mrX;fBeSvW!Igss)SMzIO!S}QV*V(x^jE+Pr4BK2j6k@Yr*(Y zeRu{uj3x*Vn-Q#okY{ge3L{O2AJ{Eg!d}JvP!88iDEQ)s%PF}}!RBR3Z$Fe^A_wsF zH^mnPaD4`#fc)yu^BVct00_m4F-SrL0ZdX}NW$taC`r@v4z!$Of5DC4ew&+6R|N`e z-%Xb~!;)Fs*aOza(gC^3!g09mlR5tIqCt}fp0q*_Ha1F{gO%ocn?l$vT_=hp0x5h)0;| zU@q98LxRarn^Z;k65IWPD2XlLjRCO(0%rkX*0|y^cnQ~ovw94jy-9Drkkk>Xy@nVQ zJ*HUvbMLL~mhY=#+^=3ffA-^O265=lu^Q7_Tqg_ll;|5?!+#KBKL!c?8VfbfI1_k&io9+SsD zS@dh!V7$K9e@YF4u7JyAESy~O0!VTB{XTH5g8pdNFcB>IHj;KEv3pJRV8(!5iT1CS z?vY9*Z*Xh6iI1>yJKVcIzkq+N!S)G^FW++$y?UK~lfUi589M0hciwMi62r-no#@AS z)6S#1!|wPBeQDJ*rv3h;gISpAq^~s9(GlTZ_smS|e<`_MEOhIKqln$gO_FwlZ!)-y zq>F$(K!*AcWF=#=huiVo#zJ2~-~71)G4mH9x3^j)@|#>baPEP%S>rKK57s$z&w??` zIxUZl%jWOeZ7ouN@UeMXmAo*+HRI`m^2LzSqasOgBvB!VNp#!T11C4w?{tI7J%)X< zwY}G&f6auP18Ij#^vv%&a!{QV1Hsu_jRe%3iKq)3?RKRv3DXA0|1AsCG&*P9?UwG+ zEFHtI=IcigD>(ZRT;e7(bysM;3Z`xZZ60ofG+UB9L~8c_z?!;Kmy&$Kq1HK5>XIpP zc9c0evX&TW&EG|?Oj4&4)^Y;dCKXvpl5qr(e>(t(4gYg%e`{-z_U$KYKzup?)@LzP zFL7?#4ZCAV%c&e8xh=3oY(#c*f=@e|rLabgv?ALVyte*2D5V9a6 z>RFjmmxV*Ucrz}P`SH`_&1Cv^61IDCLcGEb=OTptXc3M=Y#Aa)OvpS_qD!FGAaz~g zf8zF@n4xZV3lD9lPMca)9e&4djGY-q1T<2r1|}iuep&Dy|8~y=2kk|Ka8`yb1cQ4# z3fyF?e|xlrK>qWsAB327MdQBtiVjDZH&<>M40YeZcxTM)?CpkWv$Iy7F+V9f3wxfn zyTo-pYT{MkDb)#l<(CtZ+rb-0EFpb%e;*-=;MQ>`lax`QWo1rWT5@dIR6X?~W0 zL4G^KHuJ)qot+&W43kHYsZ8~Czja*?d(ip>Lxf)SQh_?l^!vFFE*zisWS?){xf8e8 zSsc?e&;~77h7qdZe9%KP8B}l7m6wnuiz-gz7J5w=&PI6jy?Wv3HZi*-9xiRTe@S_Q z#W#0(KuZTI$uqc|8;C{@53}hk>f5&^4@85{kTGn@^SDZ{us>#o%YQoXf_E^$s>45E z&_vHobzvWvS77E7^GcTsouhauxblR1$6dgC-FM;T^e3?5DkamdN_^5!#=MX_%XkWc%K^v%dvX&ieg( zg(Iu0>0v`p0!)x^s5dby+YOcUv>1p|-9FO=oU;4;m^90p|8jScEgvR^rW(w(%o_ z!)2uEG8m79(vo?Nw)H%0e{0~eu&tW~u1+wvmSCiG6pF&87dSxs5cX6Ql=?B;91+Ua zzA@TP_gXT1sRAN}{btF5-QM;z`;+^44uYVm0M|vu665heit9qE;ayo-LaoXrkf4F~qIoCADKzT@E z@%}l{BzEJ2kd&i${k#8{q{$!Mb({BihH$|UBfqP5Ayd}W29IPgMA!+Nsu z#Yflk#h0%;y{bPGhBna`X)M#pjKpysZz3OF)P%S27p&;Pe*x`pMRESD`fh@|PExl} zngrJGzC*uJD{Y=_HpJ=Fhm#}ig=etUbbF)zlF$sdRfAY1=nZd%T^Mn9-N)$8UIzx$ zxY587E0yjXqU;Rx0&hpE3S@}K&G#omcc0K|Inf~(fB%rW3j*T^+vdRtf(-9Iz$j@PqBmX4hHR&3`^;&WhqLa~<(9e}VThQR zfP!BMgBS{RDirF>QmB)q6zcwf1ih{=9=kDth|%b&kIx0YCzZFdcE?gd9D2+byL32*{iCpxw3*V8fu_9fh8g*!_v@_p1My?wzq1CUd z$#ATIs0lfX6hlPL%GXS z;-z}ZOWd%+*)AeA@uLL9kG=;lN-;!8sFOz#tb#u0yc2#C=0)e*?E>-p9u^+^ zf9=8al6S*{DL*-8O9xCztdqF zNfSOI7-H-fK!UayA0}2?lcNYC&WN;#;2;8JQk6*TT9LmdR&ze{T+e}y7u6#A)dH_y=tWatq3PVEJJ=zZY2nxnfV z!In})g-4$P8a{H461}e0;pSc9y^=x1(Lv0#!fQq}pdfMwoCot^Ax3kOq7m(Sf2IIG zK)}EJczH=e45+u+Ew4K1UV?J_;G7DNAj0N}kb*2U6u%3df6HsbF?-ks+GH&ULnS8S z4u6(F5IH+y7c_+Qu~{9)nzLk8nt(2mND-qB>&ugP(s)^dQDLZ)dLfLl8lx9kCZ3)8 ztFM0}%{NkvGZgL#?_-;E>Ii-MzroawxNGUe`g}YT5{TW9HLBvYi=9H#2!A+r4U~zPXvwhLdRO+4ZY7?wZv+qr-gJk5&@39+2v_%C9@U z*KoZ(oxdU#U+FCHB*JiX7O$CCH|&c_`6h&W9NW3GKkN@}jf95|hAd!`iBmOSu#ZXm zXw+pLr0x*C?hU$lsZlk(VHdK3%Pu$02hy!}1^M213{1`OdWfGZHb?r2*MHJzG=x`a zuokHUv)(PR({GUy$XGi1ZJduoLRStiH6C8@b3aDJBSe5>GyhrdY$r`(c+6983OY?R z6NjqEi3l=ppcfZ~lz9`7%GL?)J%XcaBZA|5B!~OC9-_~iJthgn&jz9xLzUuq4Cb5i z{;zfF-i)q#n@?VniUpn)*?$s<@xClUqJR4GUDg?CxzMEtb0~3IS@k9K3@1y$AD%_f z56`CH5iEs5h2y5ycxUii6L=qVD&RIwXfv?sts;l+#tBd~T?NN@)xi%t zhZZz&7JIP6>?J+?etH3|1=~kXDL_5}w#(MpB^KZ*`cS%ez*@-X2!9c|U=9{d6DO5s zziz-kj#q$_iX$6eWqqJT(%@VIe+sj^6dY-#o}h#ARB%cG@@aB}@LhnSm>sZDU^P^u z7~xV2C4M5ZmBtd4@TujQu1`-%Cp(^NPAtI#XTBk)mvI4?S}Xy(+5{RYrQL);5@1E? zRT=N8C@U_jE_iwnk$>@V86G4DCLmaUT!u@JO90+^-P;T;ZPc?34orgrAR`d=1CvB# z*j>F9c09{YRA-`d9ADFgyH}pJ&V)+tX?qRcr-J@2Y?j@H+k2kV+t5|;WA%1x^Lycg z*2x{%p%&c@&ka@?C1v`FJHE!P?upZyf^WT!hO)7}y@640RDTlHfFmGbqBJ&uAz~IJ z=VQx?&2PX}@``}I`>@f9dc-6p+$8YJ3d8YlNJ#fbUrhE#ckToOG*?u+M$*?hsc)-+ zR<2(mSED``h?K60^Iat~cKdcc!=D)i3>-s~+fO^*Zz#H+{&2=Fdyzy^2XBzmHP5z~W_;gUGza6~|C3R9*ao%ezjCP2$Vt@KgxX9+$~%o z*-%82dgYd+MNRbVRrZO&X1y&z@s?cyjS_^Whh{>012aNgj$}mnBIge&?!XI--*q#X zH-F&qsyt17y)q+)kqK0kVq`K{hD_EtejH!R%msE&cVN#T1Qm1!tNeL4$qwS6?LoY$ zb=%YphpbIiZ4U2;*6WTnxYm$mF1tJQ#Mg4-2c;7aY|!?^H)5KVonBHyGN+b8%U+C5 zT_AFBywvW(LFviF&D-{zE}1nstj*1P>3`<)+h$!HMG&9i#lqVo6G?k|%)B$UeC6j2 z>i_)V7|ny}p{|d$v>-;BftmNyydFbWh}xCD zLaaqg2AMqMTArci3@_7y&FS$P1~}q|j=PuOzy&y$#@e=`c}tpX z!!O8u>izqZFXynDegFOx-+TCbf$w{eeb_Mzk$pJqUUX0J->`d%zo$nOX~0v}c3FJv zJanQFEe`9mBb&Ozy}P?z`fuC)1N8#hYdh6Dh@aSZ!f0rvlze%r%*#zA6n|y;<%xBK zplpIaQys>yHOq*Y@P&F|=|Mc}J>uAPAZ{i*vcqs{%6?zAuoIvS9I&AnvtX2T)jsNJvq* zL`#Qb4QKODV(vManhJ0BrGM8bLyr1Nhj>de-M59|@X>fRP^ZWjrGtHLfu4-3Q(wyy zn}YzTc*35#4(Ji2)VL#rQZ2+ooBaSWRAB@!CbJX?b#O6S6W%-I6?zl&7=XBk&c*NgAv$Oh67pp7Q#L0w6=e5rdymNj3?@ z{wIn~+|J=A-c`}mXo)yctF!9ZB7gAenp-w>4=AwUlJ^tG--QASs+P z@CrIo)tCL3py{MiFLndKJKRXWI{Ul0e;k$L6smdfZ|dPw=n3Oa32BfS6S>yc9!t2P z88O4US9bG5AdayRm%{19IpoWOWcGzS$qer$RIJpdzx5G&=4Rq4u;)H_RU2Ht zpRpLoskAL8>VMHvN`|g@0%&!_HKvnCY!2f17$1+YFNoxBkaR9yVMo*9x5jDM%cI*+ zD-i`cLETPo_nJ32Th60OT61xJAOlFP`~a6n{r}m*kDw2v6`(XGjY7N9i897nGRQEXZ-21)v&0`Tt{TdoAn)ShDt8W$ zzm|%BT}u3>vpBz;A+9pVn-!&;Kv~KqY<9q~bFed+6094VOd9rib#Mzj69T2sw$#C_ zIfJCXcI`@Va}Iy(gD5R&mO-<2=LfeG`!VZ*8jgnaGc*$jhjDPGx-J2ZIS{E`{;?HHs~Y5o2zn)Si=Sqc>D`p+-5!|h4y1Op9U5py_^G1 z>urwb@Z>;RZja=_WJsKpWGo2oi7eD$5zB&MW$h+|y?1^wuvsWGU`Rg7Ge5JUHh70}QKG2fK zQGZLYoIxfs*g%fEo_cbqKb}tCTwZ+3p7{t4n1D4+@qf~%aa6i1$fO}{w!ji$D3WkP zI~@}hrh~-4ng*9D-;#^euKZyeyOdLM`}QYv;kfs+dp^&}nD&cL_UA#|2K)=phs^O# zuVu&f6c;b5hrw+U%S{|IM&kZRp3fhT>VFDu-iP{y;E5CTaQfDPj;BxXRkbv&25)@1w$&D!# z(lb(DVeK;Jk>G7cZs6elNWYl=Ox?tb;fE;ed)hd#i{|9_9a z0lQO5+zpVP)YIj!FCjOwUg~hn+alhA<_Y-#Z%E&r;$su8)gYCDDkGB?#iSkfW*uZw++MV*;?iKy>wqSHSpA3t$*wo9*Ppm7L|2~*nxa!jjK`SgOi%f`vJ|9{=t2*e_;Jyz%? zmX3aV#t^KdNWv;|p0Vz^f1$d4^~lTgr3%`}Z7XEB{Ki-H4$qH}bZ8bEmFjrmpF)e5 zBnCp%F*$c;Q6_liz~)Tf?R9~u^g5ox$$vDgx@IKJcc{zwxFHan zh$Xqw0P-3z+boRH4NG~{3EEz|D_??9mlTCS40=-&;vlj%l|`)6{xytmNY9b{UiVmn z^%SnCVB&p+Wvhl)y<4!1p8WUa=#rAl9oAgX%AE) zkwCE}XXvn?pt;2`5m6=>My%PZ7`a$Dk6a9;&N!PaiGRMI&e)n?pYVRMn5_d9GTM+y z5uK)f4QC_?yp=j)zvDQ=*eYB=kjD2tLfo(D%ZUl;3G7LV0{&~HC-vc{N89~|y-*&0 z#y?S0&>561<|LUH7vn2m5u~z^IV4X)9F=ybol$ioIn`Ie@pwtSl zrKTZYw=P|Qb!cR@#&p$obiQ*rnVr=qI0dVUi+{Txy!InC1qfr{j0N>g$@GVQpu9Fzc(ls&klOC|m0QJ?su3-oGVqa!rcTYj~jKjiwGt)_lDL@Z#jTmcqpHdpi zFv?(Z194le>hqg-o8QrQKLKN!pRo8QEs9V0-S{OKLk<0dihyuOUy@8wcwNQm^p9Ma zq(TKmm|2`Sio1hPwUYQD$K?XDw2IBvbcP9K%9NCutDzeG`aPqp%*e>td~104EXi_Kh}U+tVRKd3I2H_}&Xeiq$nEvEK(AG&_= z_KFvI3=6U(s^lNFeB~gWnakLNM1Q849sP)-sEeob9Ii$_x|o!@P~VgpM@~l5Go+Uw(&=ZFkmTR35Rxp5 zgf&uV_w9~z{%sAsDF&$5+(dL!pGfY<&*W*-PbE*hQYN{RjP+{j(1gA`;(trULR585 zWm1*pSJ6P#>ZQu1sJvw*@f=8Jl4T~Awtt7#%9^MGi5F}v-vJQ@x64X96o`1?-{=Ot zpLR{4qqc(!BE-|47am8zg#|OB@JQ z{aS?Cs#bQ2wrq?BeOp@J#eb?ug-ot0TZ1LI9qTz|rjq?Mk>a6oDeN}mldxPq)t3iQ z4}t8I%3UL~n_it5-G+kz*x;pa z#O1#TXS96I3p+A!neFt~#&*3~nDf069S&4L%mXi$n!J;_aN4}XOd49-T!RamkxPsl_n53H3bk_1scK5jVrwSYRA% zCneM#VaM|?Pq${X?@xYu`lvnl>LE1^GMS=_d2YH@R1?;-=jTmpx1-DF;TS((Fj%W* zJf#tPqX8+J=!u4J%}~*^*?q6VRXazJiyq;mWB>0DC3JPF&w*zq{^bf=QC`;3o0m0V$YAT}9GL4l9fl1$}} zFS~<1XKrUW`IA?NaB?8jXMo?#i`9*2x{?|abF-oBa*>{gzm8}Z@(%68zTUEp-Z z7;;6!1%KjsD4POdZ<}Vu?#k9WcwWB|<*w!%p8aN(z3Nj=>ls_Y!kZ@kpUPgpO{|vo z!X*5_heJfQ+#VtAAddv@snm{|)*u~RozZ-3p2I-s?r*E*L#{&gGj z^U48xUh&UFl=_ zPZakKnnmWt-Tmg_&dJ_Rk(YB!W;gv=V`~1U+-S#4Y9F1fdkNuDiP3vA2iP%Ps~LUr zW`B*ntHxgWtg@%4IWcO|pLbh2mt~)Vn}#ZkrSuK(q9+c(nhXhW3aSKBGJbz_a8Z+B z>JvCeEHw#E+{m156Nc9h$iT}?mq;rPT<<`8UYthU_VUV5Fh9$%An;J)6|j0>Oybhk zk(V(ou6nqt(=`}odgrE;Xgi~3%~TNly?>2Op@gz(-;$H@T7!UA4J|(!6J#uV7tQO7 zO7g4N_q4W->b?hp<}w7IsOR4Y9aXVm8Ar$Ues~x+b9;XO(ezIBJ1ABoR_ZQ2tHpU| zt&k>@Rqhj&F{=4X>b%foi5Ac+vY>(o{LylK|GqtPReaG}YH>I(s-&ZOQY%jEJAW_k zq^ZLF{3TNP@D+h}UMU=CHn2cqQ|zi=)=7#-XN=jU-6gPsfOMvndUw)LRu!I|ryI2| zm)?*=^-GC%RJgkP%9EuRg=OqDq$!JZ4#UY!hjb1ubk-IJvURhwP0Mbj1gHZ-=sYpxjc)=Cav%7705p6gg!e5}lqsgrG-D1TD?&WT-s z2C*__!d6mwPuTjvaWHpLa324=2ZbU?S2$@hri-k9JzTV`L%03-X15@(>$H%2MyRY& zmAAfL_*T9EDuPTGl)oW!tX&+Eh)k=ERMh*=cgw%uLj=NzYt5IN)Ud z(=p@1zn2^QI}!pXOkzvG^MA6lw1o`u*3*}chftx!OD*YR>qAO#6awd&uHZ*_qJil> z+1e7#N8nzRoY6(^2I!9wKIHgLfhp@K`B?Ditg!m-$f0mM3?-f0&!W5I%MhhP5uZg1 za?YFO)yGPBlqmk>z!{qqi&|=ffm5RSUr7-d`9vyQy*YJimOA18)qn8=L5Ck+N zwFbq{j5A;a5eYVh9>>FtuXEsy=OHemFhT830|B=X;B3%@0NQfHkkALq=h1LFlbeR* z`Y4bKjjvaey*ept|6+KzAMLVva==b0~L zKc+qLC-XsEL*IAm09!?X%S$}1ZH>f#-?_k1{i-YvWCVWe)~*kPW=}O?h2o^#O(0~K z1}_r=60^#GmV|HGc>6!7YNj&GJ~f&xXTU zsvZj^E=4^?iXd<B?#F0aM>ll@D*Sv021=-sdHY#)m{givBt%8q*l4;Y6uPAton zMFzU&ly`m1gMZHpbWa{!PINAa5dmSD|1Ud(wC-OeZ`~;#x;sh2=OO>7zRC28RT+mF zxle;WLY?W~^bA)#^Y|V@C*gD#)-|^2Ra|Pf!A3&wE;nC1xMN3+3U2@>;W1W8y&xR} zO?q;r13YRx7yfCyR7L@`|I(|MCxwbaN-hOO zJLlwV&3_MH&P(90J@B3aU0@PI4DP&@nUPh@#TnFIt+f^WUXbA_x`qqiou}%%W!a}+ zS^XPqaQLvA;FcsSvIT9EiLiDaCdlyte(ea%cS4Bu`|tT@y?~{_mdqGg(MFcPdt~&8 zjq|7ncY@IVeEwL^q`?SD~&f2C`vne+|I$FTZTQ5=sM>rh1FX=UG6Vq(LJ}QEx21a<%qqekT$!^3RNgKWYbqW`0sWg zt850$;te^AgGz|c;9Sgxy==dz0Grw@${pUHZj2v!brZXzi+iW6&bj7I=XA?`t;GE_ zkE>qFawmo}q6qpD$_H{m+`8^7PUtdM!hccmHK$1wu*evoX0U$qaS3tXy@=V0F3rNH zb*arer@dU{w3o)}1>vWn%E)9XKhE}fP;C7^+7OE`sM$(gjKyoFMoKoTO<;9bxdZ$9 znxv-ZoNqj{DIB5-GANM=Y)mPumEE;Yb9=3a|GJlAnOwKBY^4zd7f%Q8oPIeM5`S*u z%R6yje>lCcryQZ#Vwbk&1OnPRJGjs;^&yqAGs#<435>h86sYj+ME2<4t-M{mKf8VC z?7YmQ;qAkw{g}Qy<>76JIIee}6dn%kVi)rw^c=fu$1uxRn}nr&mCSpY1)0l0nbI!W zjxzrl61DWi!WI(p3DrqrcgA^)ESk!2DM?Ml9Z~)zdZGtAFM@GwRSp z?=)42_?c>qf^50SaEuCM4S=Kx=45FPsH7$wmzT+Ub6Tu77$8q0w}BqeG7(GNIfQ z1mu;Sb@l`$nOe}Qq~-DZH>HH z&Dc$0&E=hS10$sWz&WVDq9?38S1WZCR+Z zCPy)IVxacbd{DfI$;yc{8LO@hx2J4Y(bI`M9@z_5q+dIA$$z(qBpoJ3X<^@5BTBTE zSZO%yVzL!haIM=kkm8+X@8IKl>FIW5GXN#iPVmB(wHgp7IwUL6NNAE8$_Ny*3b`bh z-0lCtHAZaN?g)9Xn!fQ5J|{#qPaQitDDfE{<44t zHI@18-4_2KGRhH`Gi)hY$wzS*`N!>1H~Hq{>DzC2juw3Qgb$xMq7^${X2xW%DcnF+ z?yliY%`!)>lBR1CZAH^q(3Rr#NHRfBEv!iqPBl3P8R3>&pE*I-;Ac&3i47)3a6XJ>)d> z^Uo{Ke*WKt&Ru!-i~crN-OrzYUfuZ9y4T17#klR}3-|K$-qO~q_j-Wq39Nqc$Xq8B5_wNV2k{ia9;EciM z>wjasU}XKMC3kLJ*8lwH_m3aHKRtcFzwTOJ=GfI-jN!T*ey!Q|pSl6n-6v-|$CLHb z)0oly_ML$@1->fBM$$wq9OV zP^aEdNnvpv@QSnNY#8(72=aRzjf#8woPY7Sx4P?1;>tpt;!VGFyOIf!UZyLoqjueq z=tUJH0I1QK9^FKcBr*(O+hG7ZS78sQb=bqaf%Tcg3XW3%U=iw4+t9#BzNxp>QoEDc zTIV*-pC%Dt$Y4ZHqy>za1?=Mqu%UwVmQQ2$QB<&r`%&^a5BZ#tPvVJ`Cphk;Ab(~> z&&FcR$F;4smHoAY)jMnZn9vmlTInIeeMr$e_NX0Pl%SmUdgtrM3+mKEG~VuP%fUDr z3S}L3Tzkroib%>>$q*zThe6!Nc|+XbI78b3S@H18Fo)?8eG}fD zv_m|Oov<1zqlMs_XpWG%FjaIyQ|q$HHl;u&P6COh!`g>)sb%4m z#4K_1O)K~%VVu@io_%q91bkMoW9o0(ww#KlM>nm)hf8uD(Y1 zt~+m4ygNCvN?nFce}Z<}-^#(du*{L6P1EFP2Xj?rYg{!sc{+2~8zH-)Tx+7fjio3DcQ&kb(qoAQKc6hbW6E40>tnO~^ZdZ4Y$4lBJ`>f`V~Va`@3*$APt&p4dp z8}Ag{c_1@j#2m}Mw8SBBd!f$*{kYx|p|v*WR`oNxpo z7}F)Up4lsS&QnmOFsTe_DtLc53aIx+d7X8Dd!N_YQL012*?$j}A)0jONjWvwCU$+` z4IrbW<33WEM=raX3FeQg8N)6y^`GZn7Ws5=^jr1gx`7?1Pmqz+7Bcs%ehUHy4H|uQ zOILg=%c{NdWi(Jx+W7tcdFyDpHGyVW+}K^zS$(bif_TL}AEVn6!lKAqqn(sedI3Zy6hP0TneF)peu(f5N~{ zmgs-|z`o(o&9;rJXT`@1>?HfE26mRr4Q$H)KW1zzL$8sx6+2CmIMDZ`(P{wXFGjZ`oxwK0gg?D(+m0c@q8;HE8 zAJYdfg&dj29d2qBMOr~u?RhK^vT8s;)Z)>m*-|(KG>*gq`RD~s4+`a`4?J)XG@K`g z7SIH$m%F#nJRp1O-idCUVt$U?4?o5K4l+sE#DCH~NoMmT27hqnt#I(T!F2QX%~x+yers7=%*COGYZ6C) zG38*RwJViBNmn^LnO~qQp8DR7>q?HKB*(T?L@UMLDQ11@oxCP2mUHOkoT3%4WyZnf zMd_~!jB{nw*K2)6fy8^Ij{LCJEs@tRcz!s>C9=vn3U8FO)pj)Z>x+bmICU2^?SF!m z6;FnyQ7w@9eCB1s>VlcKAOO?-SvvFNi0URY?`T104kP-bW}b;=|1&0D1})ws+Gs+` zB66tIb?(~zC~)`O-&Z>BN&szk(zQCk0{0crL9j>ZY@gV9cDC*h%{G4g* z_^fIjE5&R9zpSFaF^x24Ez2&)HM-7#SKKc>gK4-jWxPR%`Nmdu}S9{KEj#K$a2ay+^s)kBfyB{S#Wi?<7Rl>5`| zIhJHP2QQbayk<*`C+9eeka; z?nv@8*es?>8E;uD;z8J#Z-2s^#M!602&{>rpIf^TY%jNVizh4Zmc*e?Co**ddMJmx ztd>;9a+&>a{q8=)t9goUiEnoYi-^=V_@=KC--A~zMqa7y)0IDwnPOws*)aR|C|NdU z-Bxw)tDYp>1^?a+J8)UgUTnl!bDcfUju5uQR*sN2KKV@&M@hxq=YIIvw%DT7N6^=8@@J77=DM7ac|N z`yK)-<70Vm9H}>m2zlhZ+IhGe4TD3v4^nRpl*V~$fGoIzpVlcP70@55_Gw-!xO(w_;}n?<(*u_MG$3w~oL3pXnm1o?tkf|Pjs$OiZ?|z7Y&l2DrmkX z>PqATql;@BV|z==8SDZ%yZ&wI=miE9MX^@jz4dr*>x)5){|%N}sH+B}fi6b<-ni8x z*h=Pi!VstP)r-3#LGRqfRfo@m@A09vm7TQP)inh9V58`E$G+my2!jz9~Yw|*o!uPkX6nAcV2Y)5lr_Qd#t3D2zl-4A4-8rN%~tl$`n za>!vVQP37G8d9}I%CXmO&?2FNIhXFkTcceuKz~eRr98gDqa4G@e9=3OpvzhAKbF6n ze?!J#F?nDtA55|oJxTErJDn_qn?ctFu1W} znoH{9-DEaD^2!jSy!q$OM{e>tOQe`l7|A6m?M_Hujs)g1UYwCLDD}ew^6{%r5bI(A zh<~}TW1lV_7w+8uml#nhcnwd;~n z7@6M_6>(wv|E;$DqsgYpg^3BLlMgcy%R-Pj16X$^s8JF@T=G$Vtxl=O8)gN**bZm- z5F*ehT-urE*g6GLlC%i+n}(3HR0@slnSYtznKv?vm2KJ_k5cJIO$6*L;+xn0!!m^REu#~m!Zs)i5%g@EPj z_b7(N$bt(L#3sj13$lC+YnenJ{@}2dp%Xtetfg*Kj!FDmpi5O@g#*9s0gI#{0ag{M)F^kL>V9DUZbAI;lEx3)mG#dRrRI9(JetsFd?y#}<{au+yCL}8;D2DAFGGqb zmCA+{Q?@MSb-q2LPtyQa(9Os~QV+fa*QKx+L&3t+z$eHQ^w= zlfnx2lQwQi*eq98vFyU6yMHP=WTxk?u3ewbKj4*S_})uiHt84dLp~HF{)CR@b;~af zw)L|M$v{rAY72Ky`F1sT+tpS9I3G06=?X$xxdW_se2(+ibpHzBPj9e)Rg>22U!kqz z3lOf6xbEcg-D18pR@#6eu&}rD_>lhN*_Ic5R_{(;7+46La$4goYk%gPW%=?fKOnX$ zbXA|@%_Bda*R}yf?q1z}XW0(ZRyHI@X|-y8GyjkCLUwO(+m(BN+>FurN<4K!;A56Z#{UoTs9^8A& zJ5MKX*B^wI`hRh0{C49MLKWU~V>Hhh~Lv%TE z9(tgV+3JCf@8TVhvB%FHBXPrC9oxGi>*E2UwkZ#e1=KfU|4_OlR4+&3?MV(@lWjv{LLPm|wLxV`!J zY+d_%jeo(2-CJldl0B^$jQISV!3dj@|D70RphWUFD^?^n?%dFc%g8^fwi-XJZv4ZU zW&AxHP5+S~p*z3laCsGhs_tC(_)~!BtVs_4GUO}eXMIbDxvk$e{~`yupxD%TV1}vy z(w2p?kIwupp8%uM)@l{b5;P$|Y?}SU9AZ(fK7XC7Kyssij1u`c?v?dXwQL`cvWxsy zX5xS4C1EprFMYJYl%|I4=EJZl1d69aWAV5!`XIh<fX(Ki{x!;lQ-RVOd?9pGpp*eMh{9bDMB3se=ka>{xRlbB9%FPMF0P8OMaf ze}CkYu*2JvFAt9Qr-)m6;;tdA7}&n)Nr`v7dzW{f_(j$yG?4URA zWg`Ci>(ZdNA#VfThI=;HH)khX2Y={b|M9=`a1CZ_z4fk>iCGq%bH^XPSs#7a+JE>* z4`;N@R}N=3lxv6cqUUUNjIqV}Z%w9+m7_Je%vLb;#>#x{MA!QhfA{t&gf4&g_GvQk zjbp+#;uiR=h6Nwyx1R_Hjq~FAa%sy_xnFDc#J^!v$MWLJrP^96p4jyAZ@BA_%KdU* z@o(7IL%B$`yf01U@12Q1%nvTib${X?I2RxO&W)$Ihte6C0ZA{a?<(PsRl&VEh(Qc{ zT<8uzg#_r&Vt#G#8T{3k%j=3!w%U=$)A#*SP;z`xQ>#Y@^XXZ)V9)URsU0D)ao+po)CVZkWu~av1sMZ-B-p2aqcT=kYbIS!7SEt!e6SbE9ZW6`A|gp zWnslWanyF+XgSGdTU<@53xCZGbeW}vDEP@+8#7q=Gfj}_nzv#*g@21|owRH2Gk>hg z%MRKqY<}RnSMJH6iL53ZL+s57k%pu+{KV4f;`Q{1^%R+I;d+{2zSX9Tre|(}3C1PG z0#m!VS?@nqr1Z->RKNd#;+GTy)63YT>yb${y0aKEIBgoN*(+&~wJ zKkp4 zVOf#8McFzKC*;a+UacbC`#{E&1?dmNFpH75@KsRx*i4xlX|F_0_-7jBs9EDcPUb*R zq6YWUsS*`0;(ttL0FgJ?8vGmo{buL3RHt$xKG`Me61nF_>+aoVFR%ZIwT+GjrL`81 zI99{pmRm>4TvM_Gu2bh1YX?w>`!aPXR_8&@>O3$bGYb`=6_}lM@u$uji#~SNu+JT6 zsfwy$JfcT$`_K9C=>bO=5u6(XIdikmWND1mljj{Gt$(3SYAi3|AmehNb3@tj_y;!( zCA|!-ud{J*d$*P8fD%t!sUxjK2W0ma>VUGR6&;YzFFFnLzk^$_gDAboO_K&p?F^Gg z`s7y<@`)n5kWXQv+OJY^9=<*M+Vk6Be4p;t5OKm+Jg9ooASk&o_Lm zm+JUBS}?wjsuORAiHCq%I*29{PjL%YSFiZg&Vq@jCv_7q1iCoIf{_oqiHC8qCZ7LH zmgYti&%e05za+X@jEtX6n8ekdd~g0SUiNO_M~{h-xX^zq=5jK)7kS33VaNpEdzvVy zX#>^Bab9pwxoqJ_jt?%}eyq8x$UyETC@_+3vzMxK(a$MI#VLE>+YQe4{FvSiC)7A& z{z&XDJuH6uGi7EHl^DO2t!5m6mRtN62PXxm51h)Pdux%i_wPR=x$)$a{_qH48sf*X z9qXEWZ3%zNw7L2We?PN>v$fgLQt_r@^3##B^tjP!&XGXM7~KtyIR#n-6_%;7EsH3k zuZ6*xKu8M@I_W9JsX2wu2NYZ<4|mV2IqlxS-y0_Pdj4MDt3$PfTz8NuS!EoHtIzqx znRMO2!sz!=Kl5WzdJbC1{49oNpnq~c_*c?D6TyE!kP%Nmg8#XI?fI`{U;1wqQ`i>Z z{9)ZGL?J6nnS0^pzcj7$TH%H9_K8Fm7tN@AkkAn#de^){XcjlCPG|eq189Yz;3}D}^#SK^oTGqGc@1*M3 zAmlFi%E|pHUM%X;3O9MPKf``?c9#XDmR``qfjvc_|Kg6u|^6>oh?5iD_lkaT*ZGY!Tulvxe&JBS<;K?{Eea4H9 z!FLJuy?;L`Vp{S=72@64zCKJ=aF9TD3qy~E1o6YJ6Ma?$X4c6%a~W1AM}KpOua~QX zX6&%cSwyGYw9ukum@hR8waZY!@6La6XM34bpACHlrN`ga_Q~{3_zE+wh^BR<7ww4| z|M-|3tIik3+&=jeQzxjIQK+8p?(XnSVPU6pB&kQ#0IxJpajQX>d^Ct^z ztlqnKuhaW%(&_i_@bk0JR=B$LPdUJ+nYZLcU*~dD&`y?FYZc7c-7~s+C{TY*9lX4D zK;^j-XXxqtD-4WR-Z_UkGo@Ys?RW>9Db_G-jxO#Hx#Wv8MwqvzovKn_S&d{-n}%{J zWMHtgMDwOhxtEK!UO06!CBm@(9cArs*h5yGot^$5&n1V)1h_qkMULFeRJ4lxVFFXXB%Dyf13-k$ReX( z(vzY_z{m}Nc?#1n?)s9FJiHZy$m)1Bne&eg4;NwKCa-Al=(Qr`L~6TN>IMHh?FE0U zwioQ#6}|8^_1Ed5+?f7G(wGs)bO&N}1VJH!2Plmo_sn9n`DD&C@4$Z&V_|oCh~1-4 zwcD($2Oo;|7|O!|JVSYo+`0U;z;@;i+u7231Gt^TIRUM{0i07!S_9|U{uNWN9DNX! zLwh2}`R`;O(8ATC?iAub+yzZ!8l$aad)8I;Ke0sTv> zJ!fWlnkd060b@yYy4QcBEZ1mqv2R3?Tg6!xs&PKOs`iRceY~m`jZsNe8#G2~nvYP` zer&_&$l>3G6Z6O@qW_KbPi5uJeo1+=|54nBblJ*AusxogMlXRGJ0i>(e*lWBoQYFz z9d`ESZh4JC!I&+GYI^J?pnzv>W$lgplgbI^F~GZ}Jp`qq#e#o;LKHA#$ICF)W}355 zU0NsM(u298cKv}Uo~?C^YgW4|`sN8P+3~F$)l@IXcZ0d+2P?*d?;lRrg>SV_f6Vn1 z0e$Al@y?cGcGI-Xs@%Ov>FD!+KN&|KSynN7<+(&=m^!c&ocGkfVA&O67WPF+?uQNM zhX;@Rsxh;qt9O4a-o_6zTqH&u#AR(h2(rRBCD^2ns(EDI-;eH2+CCf%z2y9}ZcVfy zEFmTb_aj*p1GdnTp!jUqYyF0#L9ag=GzYCgyVW1H z$FNCTyv39S(Z!(P*qH;}CY#>UDUn-5Yj0-FCN!jdQP0B*O8iOM?tst!}?Z zCDz*G{;1dP^=PEEUZ*wa>K5K(TRf%d$Y#*$4o3J^?X}3I-I5i5zr`myoiTOmbO-%z zzuQr12K|5Gc+jWD6l^f=x7velr#a|#hkUS2#@!*c7&>vBW4r6bPfBT*GcsOnj2d&Py zJ)*ft-5vCLBWw8fsNEk?b3Qffk(Mfs$8_w7_EfP)gKmq4pthaCXx#2Grl_r|j;mj; zsX%{MjYe%-tsWH{>b23h$D0fo6|vv$Gi0eQuXHFQ1D-}?Y;^mShSIkwHN|fC2Wn{g zrP-$9?S6aEQ}6cryx$tC@fl&AHmyr_$YV6@SPqnc5BF`T+5hqVsFgbI`C5k5M?qaJ@aYj`p$0>Cwfom;e^-!9X`qdR9FG+khd z1C(x@Aa|v^SgIPcGcmkJ+R9zmmGh6bR&e|6UFNld8c_yr0^o&K~MRb zIHZrPz9WL(t@HQ)oZmXe;r4zEX|#X03xR)Ua(rw4{-4LU&Ux6sz29ixYWI^gy^&?` z%lR*QyGw$8NWlH`Usm)oyT)XAdtZMKf~CVTLt)z3Y3x$7#x_Fvdl?bz@oVFFa=t+~ z5lD6304%?I^nOOub~|ghrEhIevC9+e52swuCbPzzzxerTob&f|a@sh4-wMZ`@;0Iq zKPQ`e_eSa^U9<<`3h2Ntm1frDgDwphK8?zdq&aFHg*06FG+d==PMfD84Htht4Oc!5 zB6^%WE~HCzLG$kH}z{i}^~jwrN)Dd$I^H4hJVBzdLb zNL^rr(o<6kV9lYJz!D`W$fgFTH;T0b<`A7m@<_awv z)45reS}0Oir=qU1Sh~C@W^~9D?x5Cz&FbNQ${k%og*!^Xk{^;##Zn$`ToP6mpM*-6 za(UvCh&K{_T#bTDTeS@>tbyyinpmk~*0C5qC*d8@$@8VtG#!7-+f~pn#j4#SC2#tW zgj^AvK=;FqH!j7Kc;ksn@rIS|^KU#{6*P%1zbvmbAN)@jd4y3L9pTU?zNX&ubkz66 z>|c{fv;*vIH0Yvcr#eZ(Upbj>%5fQi@?$2kSvHG^ zPT{++(jZ<+5PYMB@fY8jwA^YHUkT@Bn{bK3j55b^6jSd}h#{sNLxh)_Vi#lNQSxp) zLuci=ltXFhxQhAh`Ls5WXWQo2IhHz9t*~iLR-UJB2YG)yJuWXDC40B9E|*si3$_{O zQrSo|>`$c?FBoA)>iY9wQAdGR&wNE}M#>vGQQ~M_emEEPq%qh9)w?q1%E@yh&)iwX=|ap}80m>zFVu7` zcT4HafS!Nlsyt-sObk^W;s7cD@0s#RUq}W*oyBJIsx^sA8iv8&K>Y{3T+Gm7<^17; z0Zv-)J*smsf5VTn%PBs0!{}6sTdZ{Y8&l~9e=gr9yN?q5QckEFN@$^2esl&OPR6-6 zk?1HCZ3IBVlI@{Eu~7v`KW)h=4)cFWqBfWUm7U76N}+P1Zmmq zc5ZRQFTLcN(&^T~I9+U)PA zoQ8jnFP_fbh%u#Pnz=hAY&e={`ox_i>_Lb`;vU#p!|r#TezT~#Q*5Mtn`GZlA0)XC z()&f`!z6QSLZUP56_LWNcBPT(2dY2*9eN1x3XJTT79}^iR@#RBbb75(vpZ;k#S8(+ zpeiIOM&og>2dn`U*8;g|165=Rx~<+AfUJK9TmqT|8q@2J$9ak|PzOj5@KHyo1eg$K z+cX6z)Oa+cC{0QNY6jHQ$xG31fqQ`=b(?@o-BA~4E-yx>*9Xo5#2Ga^<1Q6x1Eu9D zM#GlCCP2mRU;row9N5YWI_LnCwL$)x9RRKoNZPoUrvL;Rk9r_wG+b{CR@ci53N(Kv zplUb*`2pB#^Tj-eHYFbcJpx*R8UdA&ODV;;({F*|jYhNvVA!Zbee;^oM5F*uYmUdD zPvB0a1cNrErzQZbz&RTaQ*FaQ88jf@_s zU#HXK-KIteL#bP8a6rc%ZBCDXdv<>Y9Z+*Yrh@^ly>TB< zb=+#_ZPn=kueI7BgzXXNZWlB)9~WSZjGgvi+-cGXK!_tcrqteJ@IAqN49_tjF;HsW zT9l#J>9j^*xQy-b5V);e)e#vBz7sq-05b)V%@d6K9liq^4Sq2g^v9rJh0tm z;5NG*dJJr^pXb3n@L?t-qYormV05RH0>H1&I0s(u^acYyQfV+csWY&7Gz2c~49a7R z;nD#GAA^Gq$Y=<3p7+@R9CZi;$_!wH0fLqWIGwDjN^8((l2OWTX?(Me54k&3icV() znmQ`=nP6$gCl%EgVj40B@)Uo7<1{!(t;QA~95Pl*y$WnAm|u+rs;wcOr(i8o19tlY zrCWnxA5b_S8LTOM2lSq~+Uo&&GlcU5K-LtV^^GjXEg)uUTpk$AaaxpK1)uIQkV=yP zlvap7qn`zV)uqqMR+_9#J(dwP090i_vC&PGx*hy~fI@?Ea=~MYTUvkFq^_W?!M}T5 zAoxC&Db40FUuiSNNHG{P6d9wX%2IgB(rb?TtbSt#L7oHk)D-VgQ;N`GfaT5EN2S3! zgU*CuE^r#nNj|n%5C=f;0}W1=KBj)&R;~@G31#jFvHN#;P;aM$f8Jp3GxyrW&90I;}y} z$h;7&6*R_xfx&+OB2BwAz=Y58t3`w>&r z*aOP1nO3S~N6{>`u_FYG$ZJrV=qPL?5U?@Rl&vwXz`9fxw)lT-QB5X%uTP>uDG$V) zHsxdVn%p)-XIPRNX>2+{bDf$S0f2uwgF0E)9QNxVXQaL2COUMT zK6HUr$7+NQwFfl znvY$PY+NKOmEZ@$%(z&{R~DnqhZg7GrjR!%MvvoGwHVNKVUt4axk+=7!{YoGmm)cW z53ec1O&foNCS6>TK~mGjMS+7>ElO0>KKb*P{dOk|Mo=<$X!lM{oMj0C2z`G%X&j?1?m}Y~nYoVUoT5nF=|eoq zK819JNC43Ssgk99$jV1?90@6|OT5Y256!_g9Z4G_hnVLrgxJQpiJIAIag4w(NhEI} zip>hIO%dV>r!izwHu1cPSW9)lVZo6gG0?3LP~lc-~0l&BoA% zPJ(~L%8uG^bABi_l7un@TDEFrFT^Jf9i=vs+>ZDNgMl50Bkq{3qTEFEM2{VoW<-Xg z4LYrHAard@6Yt#aZtcttRzOHN^R06;1W!rywU~5jIPNu%4M^NWd%b5Wexg-BBP6s} z@pGN4_zx%Ba8yWp2n4e?ImF@;9EL#EE@6M7r!Ve!Reo{9EBlKZjtvlgN49`{@ud~r zl^R(uDej1WAe_Hcd6PCO>?WWBTwG2Lw|wlAQX1l*lH9_cK}dJ|fqg$_=kFwkD;(}%g z*J>i4)5>E4s*qap%mc+%Av8BXAIG{Az4s}hnIBDFZ@ivts$x7KK*{Fh)yAvIlZ_{n zw;OLKZ`4Sxj68D<_IP#U4Gv0?ZTRs<20OZVtH_bMcp}2AE?$Wys|!WPv5SA#B9rRk zk$9rIcxpl9*uWl^*B9VD#3v8IKGX;$@>}@DGg%h;U*IHsGXCr!t85iNwe=koKYQ2{ z*@jU0A|S-S>Wfsn_(@jh#ZLg5z=(P1*Ws5p0ALf;HGx+%AT=VU1vHvqpefjyqM8xD zEO5#MkSvhL1Y%6E!~``=@xgxr2uu*a0^2J>>dv5;P)#9TI#Y1riFxAi)Mw6recn7w7u?*oLU=6>)!o_{6S%_I}4y zL}xX!@UM)2FwbAZd9Qf!*4Z!r+_^Qq;+=S+%UhrLe<{tyF*E!s*uS?`hQvn)QFv=6RE@FG(~F)Zqv)$DYYLMWwydI1?{5;jN0VD&8u5RpYI`;jb94 zZ~415*=jsdi%bq0ulTz^*>7y}{_E+<(nX+hmf5Y4SUvYNBepvJsiVHaVf9HeUTcwr zqkl}2(OQcnU;{Bp#%e8+03O67T=^ti6-huBViK-=60U!WB)|_b30FP|S49%=iI^nn z#dTFA*%w{X@j`dDPA-nmoE=f5yE=nsceBjm(8}fbuHY&z&c#^~H(EAGF5(^EKACXTOIu@= zc7!^blkc3}zcc;=cY+2U?KQ1rN2i$Ic~g4)2RIs1AdICiLk0Jp`{j?DkFY!2oE`61 zNx#mY2rGumAO`AmtlVS{F|FklHWnu#bHd={skwjF7fq8*HM~ z72=#3ig`*APoWt$8uFPxfm4!fE;HQsV+lW{FJ{T@Ik%_JH}niXzOE;;jiYC$+7(Zq z|8jqV%l)}A*V34h?W!GT-UnF|mA)FZjq#O^%TQ|K-Cc zinHr;_|?H~>53}T8AJ`q9%$?(jH2=2Tq409`zy{hrsGCPW~o6!m6}WvFrqJ#t*mPJ zE2XQJA|Otg(U1$$ypc>uA;fOTTgcL=B6xpOY9Fx#l%x0r2)o!u^&m*_B2qqbIubI_ zDgq&LItMb27&;y`bu!`bqw@;_zNBm(>o|tZ8{&~nmvOdq_J5g5_;0P7=(aR7egBQf^Bor^KoaxtRu-XHmi1@5U1qFU(Vyvcb6BQ9Q&1{{qON-0idO`V8_P0n?)#i9Uc`9X;JLkd$4OZ_XY zC5Ky`f~cELsgyw~Q=Z!4jVEdw^#Un$wA0ywvkGtWT@{0SYI+&daj;Rrsk$1UMnG*O z#Sp#5dsu352+|0Ubr!j(^z;q7I$3`c>NJB5lPC@P3N5dO=W(k^U!#iSvnqf_i6CfF z>#WOXR9kwbt%Dn#fHt=&^DfhHE4OY_okY8EWNzwEs&1kvve2`mD~+pSsHl{Y-XV?N z;D$`Q_)bTiBke!U!Y4G~7>h{U{HFnc@t($8W(Nrf>o!|LSw;5rwEaNsEqLVv$F!noYbj<;^HpQiaXgWzmXUmL| zv9A7MR_PB}^CBOn5FJt9f1Mq@u9>QIy;?}*7~Zrgqe-H9MdlhahE1rQHNrG3G%3}D zG$&(?p``h$Vr!nM3uLCJ%Fus2LyZ;<6+5+BeP|bQwaV~0)koh#dCUo4)d6Wx8&WF1 zui>b^;LJ}as*9}pG`CvB&f$JCj%@nS9}F8C1oV<-nOaJQs{&K>x-bD71)AgPUcaEw zX*yT)NAHsrEn{;N-PY zRDQQ8G2FPLQRS8i2CJq&^`trUirR}-R1aust7v`@a;0f$(^RxoV}D~g8)ck1p-_E)FULn z`~Cf^x_i231`y>W_nd#dXLDk4FpqvzRaaNn6J$6K(L&Hj^o+lv6hT-D6j8a>h}Ic4 zY`PG_#M;1yxPq30Gd?3mtx+{CKOSeN#_7c3jX*V1c%3a+=UQ3_^1d^cr%+wsDwZp- z$WKR#7h}3&24d*i9<)5gi1eiZBVH<0139e(IEwLZQ4IW0%o=~n2SVC>w1$mwL4sPR zV$x!j0wQ=5N78!Hp5W>%aSwq>XcW5_3)R|_kA>K+xQ1Y9z!tIuN3{mzMOnMz?plQa zL9x&l4lVGA&xpgxO~RRgt$euVeJybDUNLWlp!{+=a`Q!gXeDC+9ih-sSLo)@DcxZ# zc(8na4+S8*hqQlW*yIsoKrQM)0%p<1L863*5+SRgRzAFsLQZQQDrc#Qv7^*N zQ-)KG*1~;4hmFix?TUM~HGt~yF19V>ujrJ3qqr3?$NUHU&0GWJj(92=*0{483cb%q16ViWE*tT{@sz$9OTorK-!DuR4 zM6r1vyQD}5zm0pSEV+v|6V`$zkjq<)`*SRff)UZu_&l)1!JN297&sk&j_s6CUxtH% z4@E1VO4|qLKzk;X5Hoxay5+9s4p2bn9o#9IsN6)*!2oKsq96qS9kh(XvPOOPKDJls z7SYAv`vXl^L34@vk^$2(~ZOxB>7y*w&#-r`*rC<;xmAs$0?yCSZ&%x{4Q zAo&^8jT)BNY*@ZrT?wt00C1nLO>Dt;OHkC(MdA1bm!-!QKmu_em*>Y7R(}`Rpv87& z6DOEn6Jqzmdx>ay<6&rJ!MGSJ9z1BvZEq0aqYf5Jg78h9Ep7^G zXTtpz-7c;{m$=Aj$TUmi+J7NICd=k?lPwqns$$y`q{N0CwGp7~=OgG(+qL4;ztF}5 zS>3r0WVLb2>5eUeHHKDQn>34nwey8212v;QhuYCG-e5oo=Lb^X~#fr;6un=&fE+X8f8+byk-7?S>bsFhkv0fu+FUTa}drL z1@27pCjnGF+(@TrTK&n-Gp-iMF59j03aKd9awOUqzMVu7*E+#?KsR0$OifV9Y`8~ z@~P5xV0$8m2{@^?AcSy;)l4ufK}@SKY7sa#J)J^;0X9rY?%+m7KFO0JeaKj6Cw3v| zSRysxWdhKK&Igbg3ssvc*BI{rAqyQL%FH{E1@MJQOJ3&=V3GjB@&WbQYDMr0B#^M8 z&>B&#kPGVBVMPcag9c&hP@FKvIz}dcQ-T+gr66mwt+VJrAk%_#v7k-*R&QE%5>|MR zAOP*#@IF`}p&EcdkHLmSa=GtADB|mKsD>DI)MK#$%llEDC5K&`($K@&Ln`3KLzdD$ z(P+C}{qqV(rOi5jpP)YO zpD0X{6qA;5O4hgW+OO4nzpi1DBS-1lA$qPg(|QrW`b$ujxqZ~4+T@CwvOTp7h)PIO z!seBkEWF*4D-#^~98EJCQZqIUJ2!9kwp5wv6gV54^7CxCu*ng4 zPsHNxgY9h#6Pz6EVu!MSxxTM|%lo?eOjpFJ@x&fuBSU4$1u46M?=5HCj+Nxe&B_6<$pxJPPby>E?s-`2YB^MUT6`7G7JK3SV+n3$<14s@fM zv=_15z4yl<1uX589`Kp*S#@p;++0moFTJ*! zs=>@tr`dBB$iro;2YR`GStOn)+uG|L=nu2mn+xdrhbv&Gf4BlU`bSRzoBc~YUA+y| zNBjW~y4DL|N56Fm!t4g`+Ao;~xK9)M23*YamUT#jTw0Id!ro^LBmHFrvk$ER4Igg9 zA7~I-*9F#R^(LaDqs6P*K~VKJ#aPx0}ys(4XCDKAXIv z-uH*r_&lxg^y>d`?5yVbk#c1+3QlEdvoXtz`I=XYCfV8CjF#(HCOER@RgL$ zqIE0BGU&#!u-ngnTCA9(V6=Tho-T%|IufzwVaiZiwj8`^agVw8$5bBC6VRlL5j(xb z=C<;-8eAwu1cvnr85v3XRnab5C=u`W;z93AhPS=lQx=jTSX9<}*$QtxI7HTXeKp<2 zz&AOF9d1Jvs~1a)pitr)*ugDwLy}nan`z5El!6) zzh+7_R}s(YA5Egk5?auYfdFf43q>invZsLp`lRTQX+0;V30Nof2&JbXDTsWsH9D9C zs#0!$OQ6=o=wykL2A-j@vk}Jf40^Ov(8+44Fmw|v+BsNCa`sgh2h(`jmSbfi{b#LB za@4eqzqCYu3*A_v!y=t8S){EiP<7(N4p}bZIFn)#%Om5Tx=0t-U!+k8$d+kV2_d|v za#Gh_7@jD&wlJodMVq6C8?=*$OU=wZV@wV6nb~_V&6p`sfrDl;li7ijt#oGQf@>xq z9q72lsZ91x>^`!Ry9(WGEoOt0E=fm6H+-AkE*ydWO#8ifg-LnIo~DO49o>+&TU zA~N8A#;XhDQ~5_p!sZX`f6AXJ44prHp1ndaMl>%4JGpzBV29ky8`hvobKSg&a}xLF zE%&A^_xi;>G8Y90=Zue{)mh0$KN?wgYskVD`;Q^3u7*+&h}R(pKj|E*NKVjG;R}-M z8@~7ea8jN{(%$dy+}<;}kgeXG*33bzKvBwn`s#0!1rFam!!obyLWgv_(6PcU>`=e7 z!3VQfxRq^AA0m=&eTnV>QEPK*Is{@GUros`+=_om;2g-jb2=4X?cS*6o>5Zm9(0o3 zOZZ1|;rJ&fx=?-b3n|J{JV2pvdvpl)dwtxphl`Wx0HvE={na#Z!+{Dwo(%i1$@GqY zghY#P34?1UPOD)sid;8QD27Tf6nu%7i%xtV?@+lcei2hSCXrw?w>F=sSdqJw#<`4` z3xn_h{zw+ma(tC6y=-&@7X>z;!TDuAxDSqiT5XhRBO)2+QiG6@`2P#wB)`l$Kyq#$GV|VN6=~*^57XdR(gU@$6NL z>sa6ll;D~*cl*}r=KM6VvbFp~sU%3FJr%!00d7o;6WP7HmzRVF+UfSo39FcZhbk>= zfbJ|_#2lNU!bt`R)j44}I!1XtlA$U+o!rdMK6ZN+ZpS9WZAvJWrD}^nzdwe5+>Djt zL~)yoT-A%07Aga3;NPLJ#@DdTT2>!ET;+vS%jXMDqgS)fVzHKR^AR zG?Jq^wT(hS8gJwGcOK~6GT3jTV5GuQ5e41d@D>Rcsr1C~`&32?aIB{f@KgcRQr_ya zE9?#6;brrBsc0U10$f+Y4EAk*BVvg+e}9Tw3AM(vwbP*gdA#;a+S^;%Bntk!U|$_}2pudkYX zNLd&&h`T30(t#2a*BOO)kdNX}uccZ-@aaH#zoCEWoASydg$z{z8pTn6Tywv7?XNeu zb3_JgW$ApZ#MHellA}`Ehou(@zV$S3gPkgL;RocW>8WMJo-0R+Ww&U8L$y=l>Kdu& z+EPo{%|ye&BxcnFbuqGt-Bt)vDt-kXV#n1c)PR5cI(UlsF(p}eD1xMLUerET1eLdnH@A4ez>lEB}|V*Noim(2J*K$&-ws<7uoQ)`^z)GY_ zFBO@jRoB|rOl`-q(s{NOMhpzdS6-Kn77S&+wLcJD#hre^;NX^jvGOmjaYNr3HV#H0<_Z5&+Z6`+v(D>&I+ zIv`l^=FP#@_+X%jl)=we+6==Z?W;UcC}KP1Nz2$Ip@S2JOU5md93F$4Ri5k6o`ssl zA29$e`yFhI)s1L>hK&2PH=FipX=1m|{mSU}T?4Nf+Q+KTBq}R*%Ovj{?t=hLoe0v!md_{EJS8u1C!_?e`Fyf>C z7+{8pf{Gth~frq58VIhkm4|xU^a*=rBkj9j(`46Vs+ZBEIp?z$J zcFS(u=bu;8kWr{aH@o5a-bsn>^GF|UA7CP?RveYXo1Y^*r3!JM{3)T>@?1qMr_(_* zbdHGeu(z`{yWPTq-y#DW#vg>hM<0mzJ2^?Dw`DkgvmfNJ_P0GNNw|x@QhecFxRknJp$^iBjq2$Ul3e}BA z1F9^D;i1_;diC)*Z+F^x?h&WGT9LU_}&Wox4bo^(T`{_Kb;lraq_9!yYmt4 zfRP&JNq__xw!}x0$f!D#M!lo)19NVNXFL$vqk2W@L z`yYyX>(6KUvwU#qTF=?1$yPLK=QU@3X(f|~ zpgf}ZSiXZ)w4B?X{itXCJzSbft<6|9-OF1_3UA+hZ-vmqj~}c8`sQ7h&FJ#-GyS2m z!wnHecq0Jro8h9T3K0r~Ov-XKhW;;1&zpyp8;IkWbQ1L_2DzNJ!2y}k3rQK+kx zpSirmk`>olZ{MK1Yd=n;3|?bZhNAIns?jB?ryYn0y#pHA|7;nR~P_u&#&*^@K~O(3fZQNunV03Mh&ReVPu}&1wtT2@ zI!(Y`J086mPN>nIbOOQ6R6?CP0+3br2I64>;?V8N{+@x+nF_O{hg5)<-tNfhc4H$7 z(v?3*#hWdG%)lDsPPzDp?;hLu7ByKJfPND82mTslA)JM73esx7rFz^_~RXlAAk=DDUO| z7xk7L?}$KQ!tNQO2|x#w>25%IE0nitesa3>lUja@C~P+0lRF_yww_~cwANAOpa>j*4ZD^orR_^BktKYh z`6p=sdC$dZtV3b!`K-OxRekU^xCC6bL9Bh`DFIE}m}6_L5DwU_`}#L~PL9kiJ-8?H z(q4iJqy{(viStVxo`WIdP&zaUL)JmMWN27sfHlmr4ce<|FTt&UW!QH9ZkEAneYJ%s ztnB;;Xq)#C>t_qC?3D3_y}S12tW zb|;-{tgvY)W0miJXy1%zaB{37nrUke+xGB*S3yMO< zMjcvVRBiu-*shJU(lUqPJ^KnNm4j7Gb+kXkCfTJFCJq;^;(gBgZE>{AkamQuaabnc zG6oKzssbCw@WXWauYr#>yc9UI25>YgJqRKmV}?2!5Ojinpy^baknQK6K6dYY>EJ1P zS_yV)!3wXYF0wOsXc3Ap=b7{IU`-)qM=bZX(8ih$_y7jp2RjIU+e^Yn?^pRv=2;x?SG{1K{zvpEUJ)q(NP74NqiFK=?`y>#B2&adH%zdMi$J6u4 z!f)F9j_RP|F|g+tHaC5EQqiP>rEI77#XH#~Y z#rw129GY0;NUGwNQt6yn1!pi>Wm*eE(kN#Sak7`Vkl_Iu12b{DaqbmPn7iOYd|;-uoe6^Qa$lb(4~~EEu$!udIb|Q}v&cU0w(x;<;tqGSDs~!Cu`Cxu;4--v>DJr|SAo6;+ z3roFD$mw=P$Eloc9LcSpReH6&V^jJV8a^i%;u%mv>0=`ZLKCE$JWI0;BRYOW2H>+U z_6-)hR|gPB>n=I~quaaM!~ZKv13w{<$Zx^L6NzLxSd(2R+>(#!`c^ocWj%!b2hRuy zHqP#-BWHu3moDEGPXS<;e%}=_0f(2c-xVz_{y`hT%Rk7tL^51uC0<;K)AY8nlM z=J)(&b;TQcp&2+rG_jW_;T3iQdLNgc;T0Q2bH6{B+9U3qe7QFcWa6z}y*&Zl)RBVd zkHR82vgvv&(fg@dNmDsCYglG)IQA*be?rr~xh~>ZSLJnS=8u!&5bBwKx|jdq6(j+M zmn7m9IU(1&LYO}7y&gV4KMc~#3|s$JCGpectxBs=s5HFAC*M_TUj@+wtdX>;htl*oM>g5$R0f?6% z<`p6VZkI#m6(j*OmuTh{JP?_(FibbYpqpFIjoA*}JhPXy<`ph8jwkq_L6H5?Om6wJ z+!Uq_JKdxmM`Z2q0A?x6)diuDR73URJ0U?)c=M{+w zw)d^X90(o9qAQ2f3OWCuGX8s zpY+!%S@w~Bm*t$7OS9F>h_qQtStF(*sc-3?Zo{P`j}oeBty)hhVcI0Ie%nJwQ1|7W z4gZ_m6G}vJOuXRE;qZ6_6u|+pJ&h4mBfQdi;4vMIr^kl$Vz~0EjA>Ti_eqa~N}G}a z6wD%_RY=7{?-!puX>swtf2c;+9R||Fv+$Vx6m>8b16@nf!yiNsN1fyG^sqO6Hi&Ug zlg<(JW!}f#dFSw)V8CaS#}J9%B27YwFnr2uf|lR!hlWU>Je@s1>-C3ze;hkFrDMN! z(wVEur+dInOk&QS+-2c36Ey*Q?$t02#2kqR+(e<98-R%VS8jA=dv zgBaGJ%aG|aO_Hp<#d7vk5%!9!H4qT; z<|`U5b>0IG-x*EHgkHZDW|{!Dca+i|T)@@4w-kS>1yAI3hU-12rkK)c5|fR%R0Cx` z8zkEN^-Qe)m)~KDe>|4FfA#BCm6}BK*nEAIodgtp4^8)69tE!UilQ^Hvi^MGr zaRh!%1}M~_<%)<)ymv;4blc{bQFDp+CTX{l!4h&`P8v(r!E$nGE|6C0X)KyHTIx)l zApBvSOs)tQ|Js6=G8wYB2Lhi>5MW295&eEPB@kipelvKdf8}ecLsTiK-~-#3VJ&mi zEI*xKXpnuWOV#7V`0Nej58uMckD{2*=rutwE$Z6(;Zy(YoDOF&(>fh!EZ%1i>#08G zLV6o*hU_yn9vTO%ZPf>W{lH#Si41+mMn&`$3OT+kBMX7h`VaAG<>XhS*GXTmcZ$8r zrZMbV*94L*f8GP}|1zSFCsG!vNTpC!g?l@Phtqe-RyCeZU!R|SD}iPF19Dl2bu;{7 z>*$zbDWrkXznIOp7r^C9LWvh-edot6KT=0QrSU|g>Z~C*2eGfS_Ng{#->l_WAD3r{ zsv5-mr2Y4O2Y4U4e_Gy3c$zozINXX6g|Q=V4r}G? zN9thL(U)VM@YV3v5;Vp});sGiYGWspzY~~5Mv`i8*xmL1-i(HCV_z3xv@C@S5 zhv9bZf71XsJ1u=0Q31L`Z*T%P&Ma#W0mW9xR9>60czM1!?1AutEdKlZ==6Zo-mNZ0 zUZ|6}Km5J^bcYWW(@x27@`>KNb(8-{P{%**>&cr`LZ?rDF%A{%Vr^_}hrpxhY-m#a zycS0y!O9nUs06>gW^YT0hazD+SPJmMSQK6ue?gS2f1XiSy9DUf%p(!|rxmdkyrGid zp{kNQ4!0~{RX7?vmsH6&RSG!+{V%vfW7PL>D-_Eifrh_j7z=!4$r1}s!xF26h5ZZh zoxp3;UGs$!QwMTdw&kX~brlrb2DVRr3^_DddS4 ze}n{k81(hQiQy3%=gIbXGS;;y07mQkq(Dzr_;d*7ukXNuhT#{5+}snZmzc#YHHNhv^)Im>7(vi z7@u0RXB7p^>j`RhT(}IHQx7-}B2gZKoULL}ZO<~XC5=xh?2JPode*6@Mlr}Yf2}79 zmk726j{PTrV^lDRE2{-KlLVY<*|3O@IOEdxNj`?HX16z{q2G;-aq^pqPKo`9eEjot z%wM;D5nLoa7}>?6QRhOLHoE7?a5Yz&`If&q46m4MkmI_UU@ON7!A2F>e{th_HhXYZ zunX&QvL)+@reg4tV$?d=@gsanf4`YxTYohw$=H3yE;Q)1!MWXr<$Dezyr34n`Ri;G zND=rpy~>7>leofKY}(^#Z;-@9jl$*_q_iipY_HraDhZN)96au<^)>DCvYL;W32!Pt zLF5OK^ZqSt0Y^2s%9hCt7ZS|m0&Kg74$_6$FO%-P>}=_ndNK8Z4I_f+TB19V9)D#g zKO;Z!3EDG#?>ez+C;pCeh_?N&G52g}8QxLZ6UsAJ&4)e&~bNsC#N06HPPNQv-gr=BaZ==9 zK3#=tN_4+*wsSaIQ19^B07&~KvMn_8e(S~%N&NECorH#nf3xWK;vbI4iGMUlc`%&7 zxZm{V&tod5?#QL%rsBdPjopl1O$Zig!2uZ`I$-t7iK@R9d~4ijbOg)e+<#=ljP6VE z_p^a{cSWbV#a@#W2kYR_PT96aC8~`c%h&kqeeu}?uZkY_n+lO)9&!bXThIH>J3qty z9Jg~G|IFSz+;8@H2J5Pk5u?R@szc|&$spPspO;>-Ii|dIXo)T`U z2y!t!Gm5oMYd)04b1{_h3Kd)W?MzlmHxpJIM&GuO@(<4RpMRkB>wH~!O2>ZKRP#>I z>y>@H@!)Iz?Oj#G&{2xe)9w?NuYLS=T6Rmw!*_ht(5kud zg1=!0&NqF76IQiJe|$c`W;NqP7+zz^4@Pt8E?rwT`n!P~k-#K{k%iF zhlrq-U7w0I&3|401za&66Y3joFz9Tqk1+>f5kDArIw!51#qwSg=5$`?y<_LS^ir6Q zT)@yE3*ZF4H;%BW_}=+%gOk)hrpr>N`q9x;u-6m-%tbVyh27}|TmCgQB?(AwvC@~B zA9+fuX;RM0Lqq0~P6@aV>t?)#YP{!J*K92y`k|(bM=oD35Bl-57RJJw=^SkDetN58|AhaLlU8y0 z8gO$)zo^>2#yL~$It0q>D6C}MdtaN)#zu+;(cT+_3MwJl{pRJ{5!NN5aGbGA+P|5b zvPrbE3GF=M6SgNUVHNf)=N4FNqI4^n(<)eLOn+De1%xJZB-|ly{G(_i!W;s)hPn~6*n zlz#|yYb`_;Qf7(6EnkjJM6A-|)GG^jrgf>Z31yrL<*rm{+X&?^_`v=qDX(dDD{9@k zWss=Uz4_Z@j4Iv^g-ey+Zo07%e&IxpN^+k6#sMltgKOD{X8&vc$Y8RJRMYeIPJc?- zGL$gk{R$1GzVjX9h_d?IMuFc0Djt4;Cx6NpozF=p`x)ZPyXHIBitc{i@|{JD^CC4v zb}6=~Dvh`9L60dAU+13S|41u$Yl+@ts*D(*T^ue*9vAKiKA94nAczHZ= zR;XsQy&DSRRz;9KE{T&y})Zuv0og7A%FZy+{8TE8SW5R zH7CUC?{@$1!`al!-=xT@raw=}On(|2cFcJvI-Pj}&4?@x8EjU`v!&+73!uN3R>wo-(g2_7; z|Dl*5%wlb9tr(OUj5X90A5@nSLaK+D+9g_^idM9aEG?+J&IV5N9K8S!6f?L|y7$p@qPPbVV^jLDrxYR0%IsYO}5eWf%qJfIYo4L0zAR3poI+Phe&Bg8_ez@PlR zCIj#7h8TjSKbmas^|q-`Z+}*Hl8#6#r{F_!A?<}3yz8^iDlAq;$}|`1UU<|wStUX& zZy2GclBi86#GR6LCGaVX{I`+NAMSnjIm4JOE9Pa>ui9QzUj3+@N?mFBM-X3KWFw8@j65(nA=(%(dqQn1vG?1ZA zZ7Hh|1RSD^KjHCrlkxkw!9M3m*i-y7@+c93qto+K^sWtHbSH{(gp^foBW=`$ zwnsB`E1q|2v>!zjFZ2;>fV|)-$>5}JN`*n>EN1EBO1R8`3xBeIf{PtIDjO%RM=05W z@85$lH?v~cyz5Z50C(dJF8o{4*m^vnZhAmA5i!Yco#Q>mWSj*;xL_SA1TB9sJAfIE z3fwsG7=B0?5P>HhckZu|ilsDQSof?~{ga}|Nx6qD$yX3F=bs-|C0gp0L*)G-+u6t~ zgP243+Al1v;C}*?Jk5Hznwd&=7%XUE#k8o)YDEKZps>m&LE76qSbsM->+&DYZn%tM z7m&l%x^ybA6c(4k(n!jTc=&&W~r3oC}J@X)kBFjRrGQr z_;ba8RDV>}fBoP)`UQE8pmLcpv*IjJah4F8VlLZXC^Sb~F6+uNnY4=z&FR-%EY#-bHZyo}k36VNU>R3Q!1{>!=6a2!{0-BJImg4UUq4?VL+ViR zw<8#Rx%Cc*1I&jq;?hfaCPtUPHL&ZwgP@-fe`W)RYs&cv^ixf`5x(zE-ZTJR`jZffF}J$q^d-F-u=lMi|fo z5k@Kvgbx%s{LBP!g4i{%PofG}lDHp#L{O|uN7+)PZOwEPlPGbHEfQ)u)qOR@?Px>+ zy_EcARYIzmY&?Dbw0AlhE2+HlBTvtrILsO&vqscMZq_@Kh&#HSUa2^=Hm%aV@bAzjrS_KnO!U9Ne z`%0_fB(2Bb$X4~mZHesJ`c=i4bwS;O=6Si9+sv*=e_lVC0+ zJ$E_rSV!wQ9`2$^&f$LRsuSM+6JE~6tDl!?{T1ylblf}E!CWSoAO}gcfqZCvM>txp zX4TjzKuB7!f25pD5!fK8^1c4JB|Edke+ZX^{uL_$*O##V6(0d-m(czdMFA|A7XK9~ ze`2&?FYns*qjL;4v+x5=kkyOuU%0cX{L?)Ad@PAKy$S~%ocGZgWe=GQfQT*QHS51T z`K!)sRnVeXvC>DxGbiL1j+q?elMXB^N`hd|1#!~cQZnOLNx+w zIE<`I3DdT*6V3nX&?3CuaakNFk|x*s&Zj zeLOy=r&bi#*FNUS3CC;}t>saX{8{DC+<9!T<4@Ff;*XC#Pe=Nywck}8w(_1j;rX@% z)P^&2iOQ8h>n~s4T9>@a;H>6oGL}baQnA6oirF9)l7*{IZd8%Mp_QN|D4Ih8e>8O*|FFiHts@%b{UfAS1HmOqI!P1$xI6%DgI=+BcuHucZJi@;7`KlI+h z7{M<%Dh@yvCB|xLX;&6LODJlBd#_{pc@^6W$2ax5x5pk`m_kzC+$yZz0xbDhFIci( zuj=TkQv|KHhq42V%;~)H`fvLzd*GiWk8}9(=x5ciX-)B?U81m3=i9?ze>$8~ii3mA z6ar8l&7Q9u%de8Xsof)GjtTxpfV*f|pO|3LBMfRj=T~v6HL*zVm;@g*{_f{l%Ls{w zMmSA-aDR&5FUhS}Bez+eFC~QActHwfc-^mu6CG433WC1AJ0l2{0U1G>a@>bwwC=~+ zZ2UAjNntCv9xI~6H71Gxf6J24)O`$U3Y1E1;wltNO(R!kR!$=|&4-jJ?xV3Jy9Z%G z*Gui8LRHt#>j7Y{m((M^xFVwmJ=fBCG}7V_H&DA(;$3E!L`Gg;v`TO|368>MNH;t? z1*U|cq`AbzXr47$(4&P|V17VQ?tN{QRaH!{;$V@J!Mls+ic!=#)|7VF?rS&w!O z>X%^t{0N(QWhigW@rIFg2_rO)Mqxz>%OQ=c%v1K6EDN$(Jfs3sp$9HVU?%;c69KYs z9l?6qj$&;ttI0)sf6MAZp3ZX%I*|8uu#$Xg5TQW9a7gkC%~3Me%!E4UfK~@2>eWpp zJ|0JAW{UVcFIcg2{+7|U5gyP9Wm5B##DNN*=`_KT@sZYz=!QPLeX@8^$qq7+<8f6g zRa`#GUk#z7ZG1V1Cm-O%%aVkBh!eXSYFVD8YbROy*JW6`e@1$x4>Mzy;|gXR6xmI7 zOmVCxflv`k!Pt@Kxqi>JqM3Cl+x|0L1{t%SaihuLvJDcy7p1O{K5saX>=!CT>>R~j z*@YV>mqf*pHHT&HOu0qTR(ckt*SES>n8|(AZ9FPA?ZWlHr)&abJDzmraq32|(<;qQ zP025JlgrDAe}@1kYm*I#P0vVfQHX+JZmakAHO%4@mR&!_ui zQ|THVSPop|MJvQHj?HqjAB1d)&ru9)o|v0G>jT`n)~&Dy>A_8nykjXrbLZlIsz!_O zpN`#7B08R5cNpWO6dox+$^4p z!PKy>N5I&>BBbGypkT{BSQ*qH(1+Ov7pTI*8uO3jRO9b8&+R95%gWlxRvwyYOHwf# zaY+WXe?&FVB|!*9e96i{l&EuU4U+M*rz^BuJu|YwHX>k3eS7s;rJ$F@7%JPj!yBjd zHiNX6rDM}-W|?WklavbkIy9+aXk^27U{Hmz#wv7eR?o@S)JZXC=2%r6R11J)6}a>aMAe^9AeBtCMXjXb<74+QFBCXN9qVCXN; zSI4B}udE~o5AXSN{<=(7Mib3vQ72~Lx_-b^64$FxnU4#Wiry*Y#X$eQuf7~C8ykUq zOcjX!s(Q4wGoQkqJa|7{3b0bY?Z9AcpN&9`x-M>hH^Uu+#3gm#rMS69at;|_9)A~X zf8lk&AF{aO+Ty>OIw$40vKY*k$^akkG3q8m`3r|gV|_27wPqw- zXBi`p4b^aO(NGpaBf}S#>Tut|9~17PvDM=rXJZ6s3n<|@nw+f=)ao)6LUnW-86j!U z=Q0P#rz4bXs2bc$3SA?4h%h{e$M9-PfAxu&4-`=&)A9KtyjLobc1{qYVsVRbeCmbw zWlo7RX80>;=y9D_*o# zOj!SlN^H=_@+Ml}T9QdOtWp(Qk>Bvv1N#``HaySdf$*Xp{pDHF8u9zPa_29KYY52KYb3tI|N-X7tk#}P;M zH{$)+MkKLjL*dC)#S(Mle?WYSebqvWUh&FY#qrc0dO@&je&|Qj?CZ$0uiZd&=(094 zookUTHhaH%g_C;y47Ti}#+&ese`N=wVsPm^6mwwsEJE1+>R>Q`H->>(M$ar8xs7*q z1Nr;SX3YI>5OYx4G_KWL{$19pG6u0HA1gup=uLFj_&}2_A7xFRpUG(SeWdFc{8n+J z;T7W0=?IIop?q~;>D8=O+XCIq&tVKzCcc#9!Qjc(e=q-;Dhx8x zg!>&<5u3i7rJ_H6UJpg8T*PVUdmz6yYD%?sR60AxHiiwRvJ1}k$?A1>Hbzq5BUB4b zs;YVW#BNtnPQglA=1?Lk!u{Lf0zAI{?U2umgE7q1;vY}Wl~B}25FR9ybS_Tk$A6A~ zox$C4)(M$wqSzEuBw*;De?HZTm?!mH9g<<8T~cQfqIsjdL0X(^V!tts;6QGfYTB_~ znG-)6<9)3P_UR5Mvmg|2Ds+on#2$H62l@W?T%aeZzv9*Ap@$NP0ueB8v!iE>q z1~1`NEniP3L|YBxI~RR5p&*8mo?AZb9U_;Q9ng{VsK2+{dEMW;f8BYkt2erO+TXj= zdDh>%+j-I7`>gX_fA3!BoBrPCov-?PUsT3^q*-~nRW2c-xT2?c7~{01-R-?IOkB{h7&_9G$JWM0w3of>LXW6 zy#D(+YTtC!C_IU>m#Pu2cs2I;xOdh&9F56qhoj`uw_TMG;L-Y;)vbNKMOoOV|5DFZ$sj!S`~eb1v~>iMOkhiDL9Oytwov8qXjTCizYO}f?M;~))dXYCeaHKNa?@B=b@Ni4*e_~qr|YqBWFKDMrdC`52Ea7 z<-)`S1goIVOqy}U9V@57A}nn(-lg`?t5o!5$$x!B-ADa&trWI7p%{6R_FqZR|FKS9 zFYm;$f6~n`C7o-s&PHl~7V3X~@*n12gDBuIxDsmfV6Y}O&8nj0bqy@y?KHDYE3u9> zHh%w969~tepxROKe$xn>v{SG`$I()t)DfM5sKz%t-nsN*4tmLW>Q1?P0}0emCpFf3 z^CpxNsfC^SM3D!qubF%~mak3{=D6$eziL7mfBI+n>?$vrxMr(7CeYdcZSGoo+d8i8 z=j&e~^R~I-75$J?w*_TcNaeaU5XV8RAO&p0mPpECEs=sqS{7vf_pY@c^Ez`VDougr zLoA*%uQQK5d-m+TmYsII4nV ze{duU2*88Y{oB}|-i+Vv3fa8=#v+jt_t7JWQ9H-ZB7e$V0T4h3qvSVOw@;@qU@<~s z2X`7RBSI+OFb3ew^IrEZf#Fp9yoYP|@dcE9p05B97=JD4wQaosTs-S|X&z#|{oCia z|8`ik^$VdDto;QB)%j|WeL~W9>OryXe~H^*Xt{Q!v>oaW7@BgmUPJ)x=uEXigj-z5 zU}JNaMpJ>KHRARk9tYDEqG~c9V}_I6wuAPw4re~Nd+ z;xcU&I%N=eSF6WTwgT&dEL-TmwKqT;r5DL4&3k_6<+U&aNg>k{@}9IWwC%|gPLbPI z{yeQ5v%xeq_|HUb8`>Er#YlEVGBdQV7fG{fx%}ro0W!r@<>N_`0vy~c zrP6l`b{ndq*h8}n(IcQ6a6=l-JkzsQ#~)aeX3Ukfb=RMc*`9=H3}7SxQJC;VchY_Bc>hm zqvbfsslVa71phKbl@37-6XiAHbTk2WQ5U!Avp7Y64F_VuZq*B}wYvzMa5&k;Q`w@2Ym5G)AJ7*pM-7D=j39Npd?H zTZTqZvbv8IWAK?Z;QSG|R4cc~M!{8JolGeO`FBB3FPUu?K)2A&B zON|o_OdQZKdAd+9N?{2`z!^Me;Tc+Wza!xYGR%P!^&3vH4`?^!N=5hfGL>jzAOX6o!3Gp7!y zZfN>ldBT+&nq}bP(=ZAfc0TBI4UYKdiTb!0Z~<`&qzt+G@g^^O8|U~6bf}=bA8s5i zK5_}=(}wWQ!IenC{>sWwmM_*lOH_BrH@W&?FiYhqiwT}3Lje){C`p3)fC4LaD#KdNq zf8&FX;Ek(Vu!6Whj~v3d8ja*#Xr&Uw8e8_L04TjaKZMKDyeH$zC^3P}#r5-v2L2d5EF$&L%n^OX%w{d94MX zLpsRreC+~NxT~8VF*BE&b`5mV;8X%FJ%1c}G*cWbLA$5b-K1Hw~fpBOZb+`17Z6KGw zaS!}^+wZn^!`31>h}sY^NJG`!YcYFYJTt=Q3Usu@sf^&@5B)j(-5@x+hzrWfB-%%| zhF)UuKsq|BU0!nK|TtT4Cn^M;Tt z;BWG`OJty3@+a^<|AE%%`sssk41k}eTNmG|Qa#9C4IbtFtz)ufwIBM2(MiAA{&C}5 z8(%XE9R_C6>$~t;8zUI?f9uy2)i-4`A3IVim1icui^KqS%&v>TG#JRcd59tES`z$| zz_|s&T$l-z%<~bZO9XgMUVMuen4SZjIm}I%Gc?1V{E&ZHhYS+D$CHRj6*dD18|%`G zWXSRX4RfVFC2sCga3uO1ghdy`7nPm*q*+XJr?%c4Mu|cuMMX7Ae^1{jC9*tsyeH`w zNPy4is)TJJL3~FRJW-@fcw@sD;rVZ4}5#jI|t!~YP%HbOQU011bv`w^MGet2})q;Fw z+mcPsJO>Wr{!Je|^{jQY;h-C81yJ6(c|d zQAVqZ;5-mt*$`vz0}<)bfSsT1T+$Kd#B;&A%^n2sH{Bq?bU}7!HNv9_F$9@7&8=v9OemcZW zbv=kMS1wdhe=$`wtg06iwPnGzv3N4=!ed?w`$bF;iDJWWrV!k9+E5X|?XKX=i9T@p z|IR2zp3Ec=1h#{P>VOy0_rtW`8PBS;=a}C^RU7n(HQ*jU>>+pZ7@Ib5(i)Es@%WKG zHqh71UTdbY7qQSo{2BPuusPE>W? zHD;Vw;^jw*zHH2VIOkO(73;a#%0{#Uh!%{8BU`%^N&(b(kV}|rQ zari@b$0}|nj(#J;4(k*C;Iep z_p;EZFMC%(R$oO5ykEqfRhL~EFr;xwG497*z~A$rO!sKr9+dh_UL51kpDX}H_$$(v z66TY=ok6xT`tZ4AGX^WWVpR8%W{H5}%UdmIe-fbpS~n5i{i&f#7R4aIen zq|PiSigD3iqiWNzP%wVfa(hr(wg1+gP(;+#xT18vw9Yc{`m=Q*jG5f+{zj{(H6eYQ ze>s6C4Zvc`TuwWGbK;dSU3ja2mddfh=cv6>mNF>V!IP|3w0ra-(uB#CsZBElSP!}{ zuJ{7zdzHs+y}{J^qiTmT3MTnYj~&6QNZMCMJE!jyhaoMYOr006945`LD09`)Smykr zni=!=cFyPc1$1gP`4Ny{0x#xe#{8`Ve=WC2yfm_+_biWM>1sxpAp2evK)Yynw-?)3 z4!$yMK&{vt7fh4{`Kn1g(9@M;(KhAE$^6A{n&`304){SBi-@j4I&mP(X1_#M`s}}X zDA5o9-JP#Je*n7gs)(X}EW|r`$YLU9aQ|_GkEsI`kHHDnn5i*)@HN$>?qrare~59! zF?iCFrA@;bO=3oWn1V>$AFIb{k+vCQqrD+?>>HPdfD8<2W3acTDWb`gto6DByYUEL zfb`)u=Mv#j(@UZP;#?Zvhok9ibc)k-CGM6lQl}Oqnod0Y3YRdNQ9Vs32x}0U16~FE z$m1v91`=6lN<}s8!Km=(Z6b@IoJS4aTqCV_(<{=TaFmwqq zxTGBAhC{cbFv{?|LB&Vi0JlGy&M=1GgI-W3WdoU#tc;sO;1ttxNdSD!ATBss1J)^` zo^2!6TGTaCyhS`9+6F|v6>>bIi^z?Nv! zElqf;a9^fM11WL%a`ur7JhV1Q$#35(8XDHre9GB`2eLyQVjMRX(bs5%QxU*PaQNCl zS_H+<1&(}9IP&?)Vzwb}e@l>T^e(y2a-kx@7Cy$AC;OolIs!284e1<-)sp2*RA;(87uk+jdCTXAI)w-5UB&{?D$XDnrHes;9*(!xFgC#b>;6}R4o zsl`y_#`w#vSpzy|C>&fgth9N*r8k#d$BIi(?QxFI7C~f3uz-b4E>uqtTLukhF#^GO z2zrE7Lxf-n)B{XY5Q>J#4luy^P@Xnl->LFD-u7lca6>FO+JbF{E)O=k^??M$OO&5JMA*v|Myh|* zgANQ#e~NGsbkr+m4FE5B%XhxlHp>08aDR4eCv%;(VORvx&0S3uw`Wz-+sqAIALBeV zw4-}&)Li;123?|^pSy%5E|!#$uT$BKN9PJSOr)WE?UF(GowGWau@H4&5dN6gyzLPb~bbf2f*g)(37Mju?KCJEqoWHP%8`$*?#( zI9;j#clMB~b@l{KDHlKEfL=WQ4DVEGhGoTisYeGLYrwVEgOx6T{QN(96iQ-p>0*>` zUKREf77w|v-Nt#8^^9GBW}oW{n)4840T-d~3TRyGN-GaxB6(dPUWFr}91^i4>!VSW zf5H48)YvP=k*84rs#vi;v59zhdZvrtYN%TO!nYPz6(V*QdNL$f4u2Hc_? zNuHNN2k6lSuGU02%c*Cr;y8Eme0jM*G@U3S@|p$0wBQ-?lHkq?Y%c15>$dGM$x+OX z=^z1*UaPPK*tyaD)v|DQ2rL-bahnn)e-Ux%Voxe6R^zM1oMbNRE)LU{Jy$s{LP!OA z3)$W94{UO44^b^|(Jd785(BgLQb}^;WxWKf7nSjPLG1_bi~z4ftpm7DEtkZxS%rre zpVYHyt(Kp8@?w&;HhJ|~NG`NxS1ZOpVotYCv>thQ$e_7$#)Yhfr&@Z}&g<*Lf4vz* zIkenW&e!pZS7{ewKGBL6aMTD0^W4xIC*N2AmWo=1YiW$Ov$9d8L6xKaf>%2 zJg^%?3-C`=m7LIhEalfO>Wb(p+n<0*G$UzUE6nLiKWLmTHO}aR&eoWadg&RdH z)_Eic+bc2icdtFZ=8T%U`cI=bt+@rY655K?0~wt|GCjP)!Bw>Gl%@l(I$j{tmX8+Uhcp2@MP z+rRqeo7*()%FLhZwPsb#g3svOB)MEDDBYo&yh1KDB+_nQ11&!D2DuTr z^9hmX$=G4te{!!p9md^9^wW-E2l%j0yd1jT=fCj4+(E$)m$snxA*c2sf>nkefQ%G- z*~Jy3sN8b?$t_bqe`9KyyxCwh1#dm+>Bgo!uY#MRAwjz57fvMbndhS4DaoxTN;Yia zw2Cr~r+10EYebeJL_>Mr2#QydT!Bzz=lL#<`{JOFMI9aL`^}BW9q+A86!x01)?H8` z#h1TQPWoYz44+TZdW{vzGbq2ar43tq|9p=H!#g5zBL8tZf7{zTPPL8zb9h6TkxlLx zZ1g;e6_Rxe-0`I*UdD5|f9igpiT`mm;2MJQG(~^vLv_e}!O- zL`H}h6_aLV6iNj*Wd_Mq#l-Ln3urhBz_8ZX9GhytMiLfke_GY*Z4!RIt{u*v?tVAg zi?MV4huVU)e=tU+`b`9pQlNd(eFhhrc4}c93ID);1@#O76@rJVe^wM#h|2O=?`#SK z^LRAmd<4jI{Dq!xn(Z308DGROQ~?0sm+#`sx3-svxGKJ-zcC-f-|2VP@ssaOmS?jb zP2G6xCUJIKg3gdD`L*iDiPsS+s~vf+a_BigP^z85f9q2sIT=ECnhZ`C!x7K6V13bS z3`x;TkRQnKicMA-peKy)T{VM(4Y09)77eor)Y-!Et+J0gWKd=LAV}zo&}t;5r87vT z4rHTFq}zR6<=U~bP47%wr$Y9HG7~;*C6S}|rroU$0Z48!_NWhGrR$D;)Cqru<+`vq zX^^oOf0tRE$XM!ZG;I~-j5RQtB8DrLu&=x{ZJC|61{VLACtOICx#(|}#31WkRnlv> zyr~G+TPclnjDOO56$Ke-QjG45_wL`azT&QsA3fE?4WkgUEFcZaLEe+wq||BCBW$DFHrFpG`Fcfmj$#jg-? zB-_PI;I3Il)&);u9{L|IR2%~w9YeWgYfioA?93*GjCIA2A0glMy^Z8T!c=BL4 f{)|7KJUE&Tub$p{@_;TrPw)H-3qe-vU>rdJsAx$& delta 1298737 zcmV(kK=r@=$ylGvSg`vlf876cawAN}v6)V8hRH1>xfLcuuypcnn2d<5I(aWlrjzLK zl}7~qy2X|c?$IHv!^H(ICejoiCQ|ScM7dBo*s15Y33P}?i4F@@v4Bg%L^s?kp=$;YC0~r*-h6CN$yXp;kbOn zWlHqpGirFaKr^IRJp%hjArkul5y1qLNg^wGx`u$MS8{dbAE?#XMTobW8j{iK3RY`> zfL3s}3{_@;8j-fde+dn67k7m2G)WMlBaJ9r;wcSkyZQd@AE){B4}0iD z$ldz=%?z~Z&v823eMBSVl*EsSyD2q6RO2LL!b5hWtjtTgP*7H{h|2rl!c3BB#;v`0 zl76lW##|2;6xV>zP+~QA7e%Z-r5S_Kqj1vi0v@jP`$FA;e;G1I7m8erw35RIRgGJb zDoOMY**K5#=xP?;O&?(;hXvY!7k`YKpQGj6FfGsdP-TKQQ6qz zBud$V=@Nx_$bU-IpAwZzqLl5LE>Sqq`ctC*l&D-1g_Fx15`}ZjKPBoDIYpR`Jkf8GQrnn4PR)~co$-Mbd4~SzEc08w{#m^C1OMC~ zQElpZ03(Txu?R}Wm@XmA99~2f5!D6v7CvGt;|41tx*2h?Rp4)Rn8|Uj#R-SA7)Gs; zsbYzTf5;;7#vKS11UtBd$#}7Z`sB=DCAP#BCY z3b9l9$DSNNBX&v^%LI zTQ#-mEf*(Ilwp*t!JQ#evX)S=W|phR%heOg)lrVviRA&Ea)@G-AQ@!jS$uT&jR`IB zitD%rUXhT7OF-bPqT6R|vN3#9Kn;HOKaqMdJjl*>jzr;^>CU7mCk^{$K)#}!Aqqwl ze{?Z^2*y>6GOS|anV9ty_gm47ed%W{+9BRDD(}Mu24R~gbp95;twT!)it3Dqi)1Ff zmNH#pnKA7luI!D!7{X$E#!tG@6B}nr@sSHm+Yg?qK-^r)0NiPt7z$tR82&Qqd~Ha} zlQ#d06DUzHf1SYrwbY8C-x08cEc;RpfBBwUD79-*8eXH8y+PI?`u$&2wI-qut@0pji`);$plsxT=6JNUuA&?gmtkh_{_4uaL(tanU!YRBGf* zPh6{7Poo2Gs@z$Wa>&(BMQH5S=Js^rP2bJyPk#V7XU*1IrJK|6X&*PW+JGsj3j+FQ zFK`jXbb z&AFRhxUQrsP6wFe|h(g#moci&1L%e5(8`kE5W?J7Q5+c zGMP|Vh2`S?|AD`*PIX+HMQ{wFLr=eSO*QfwakR!AdUKbdxgN(;f5j1$?wLG}%ACCg z3L$mEcUoHpkH;+`o&vovA~xWhMItT1&tAw~**J|*^Aw3E4>g2IA!2eeqV~jy7}21N z*H5vva@Ri^q*g8CZ^fz(@X(m6>AC9-#_3HKkJgE&kD&l{Jk&zFtJi72a%o8==GQe^JjHBH96MK05DDx7!9x#%=9#_X4*2S-X3V+X%>Q^EV2KHnND2ghnAXY%LQ7!?|s43KAsI32d|m&xJ1|f|^8XEn}+)J9>r?O_j4RXtv?C zYgS#M9gmw0cpnbsLhQ8l#1HLdqA}hK%elNX8$hq?ZM?$Ff7di{;|sc?F%MvejuEb@ z&A-LNnQGTGHF6WZvx%a31a*Dc*P ziafv2Pv?k?%m;MBVv#2$(#voEc*VvQZu^o&LPho8yJg80=4zQE@O(l=Sit?hElaL2 zSIhQtw`~9Se{NZFg}GX`pVl(_jf?b#Z5>x*)9P|PT#~m{_2%!|s^seOw5lF|R3og0 zEi8e(7)_?jlj-f;=23+WD%t!ch!DAcoFHpxZTI}aMiphgg^)U&^xFl=Gl+Z`VbizN zHmW1%D+#Id6agWKQ+kJl_(Z&?u(%HLlRXs}ZzycZf0A64CCBd3^`}k(_L4rMNfxZd z82Knc@xRnbzRIOmYz zjQycFp0q6=iBm@(lEt&47&+X4L_s48kc7z&?jz{pm8d|neTW|^)_;g_6n6Wu7;`o5 zKR)PpbQD;e?UMPlNV}JHOdk9cB)yD{z)w+BfOYpB*F0x zFuBOFRT3JR);2qq6xI)y_gg}N;sLce_A$*EfYb+{v8_=D|goT4k5Ia+Mf&i zRAsrg=gf``QHUr_k<$OIF`Hbxky5`sZ~l|iPlPwvntm8>$awe<<;~eIIB!To)!M>Hc?2h%WAPHemol~XRVvtOmW231e_a(>r22N+Gg7@t1R7V9D89R zC--KULX@$^BC+P(V+s9+TrS5d*X>fA>c*stx?Gl=-b%WJ>6sLVY`Gv29Xbw4J3led z>b+dEN1cy%3T2#!J3W|X^DxRha-303e^TELjKcfZfl|8>OPq+#V&PQZ*b6Xje~qT_ z0_1lO^wlryTKFt60RXBO^WVD5#gulb!b@H#WfuB%=Z?$ZE*RWV;4g~8%kd;=qjZ5v zTXkyZLsmu6{SRG<@-}2B)R4W!fhx{^Ir}=eW_L!j74}^Qc@+q^7;qWrH_#{>e@7*g zTH^L&K-qY`-5IV0)D4URM+q5;?{!6R$Tt)X9JyapjAJrM$@$D;97$s{B;?{j{bzU& zI<&wq7KrfNb1Q@hu5fHSQJBM=^AU{*;r3BbE>{ghN+6H`vb;` zp$g*#CkOJ!f72;}jP!ZkL0Rr8K62;BeZ9!OHKu)E{y7pMnRt&pMnYL z%Z2X7+1wDBVd6_vrpK-lny4qPz-U0)GUIUEwd_1`e}`}9nD-FL!__bo1(Z}W=3T=A z#?u#tE$RDcPZ!;kR$^z7)LM4E``5hJknWz@r(-0a==CN05_v zoO0A+HahR7p?dh%ee^-7VBDcIV;3iJSjKg-1 zSow=Uo}=y3Dz zRTIJGL`gBp0{QxX8fx*>KSQ?#bj}KBi?^1BIcckx?mXI&7J5UkcO`ci97ct>v1n^1 z4!9u8C0Z4NZ zY8g!fQHcnsh$F|P+;x(O8359z;w`qlTYnKAy@qiZBe6lvXrUCU)9}FHkfiiam}H>A z%k-;aC2-|I*mWS^VTTiN z$KnvX(S%`tQ}HCKErrLm{z%1`rL@uz$8=UIcDKrM>q@#b7pro^TXdey*IRCbpEj1Rx?@Q;%MrDrZ;dfU^Rxsk~bp2DMyvg98}PMGL1JsRT>g5%%7MK+(M|4ase;Qn{vAarj#wIbRP26ihCnSTG?Z zn1F9eEj+u(zl`|UbOEo6y&1&A$8(D&e>7euP6oz<#3n3W2u+5?!=M7z-iF}aQ8Xl` z*l7QAOEqTKLOZbuwP3D$SS{2sh+%ni$3L_MjF^)*0^o8PEc}ZV9i!c;-|G4!mqCV< zLLH_uJ@h0uj>ZoOoVZcU`%Em3B72inUB;5uvX9t0N~>U-)omPKszsM>#^xb+e`|}@ zrC|1if*C`pp>umzD|jEtpl0Ixp7W%tNCbB@+1{3S9Rnue0)yYu!N1Dt_|v>L2^q~@V7NtIMjGT+cnahPNkWmfx^f2%W$Y&CV&khCuSO+GRptxMnz#i@w7Db-RHCvsJt z3|+4oz)n9{+N=%X@nCl{a=gm1GP6Ie_%`E974d- z`4!>Uar({J`%I@1zB2Awj>EH9uu_+QIfbhfqcyc-GAbL{VVrZ+mh9!HWInx0B`LR7 zl)%)AZHY3fmSTldOK5Re~$T;8E2alwvVH2qLaXUmC}LP6)SSXmEMMRC9ce5^-lMB zqYhq&XEh~UtQ#dooQ#Z;;pPUHj4VrW?a3KYJ0 zYBKOj`{IeVtj36n!ZLcKiq+%z9K)F+Y?-LyUu z>rSOj%I|T@^Hb6FFh1q*;j#$Y(w{45RgsrM9#Cu4pCC>^^w=%C>g;p4jVqPPLOjc~ zU7g$OtWQW5UTO2RAFe|ycH?5%c$Wf)X3RWY%T{WrHY&$o&E*rnI{SQGDt;ffG^6QIS;dsndk4Pbj&wzvlPsQ1r+EHqL3yd}*1b z>uXde?{v_G6IP_gQ~z$yk6204&Z@B7OcpTmF*5xcyG*bTK~rDA5qPf7tpF1`jyGjk zujLDHf9|cwxC9R-Jyzd90Zm_#3XYh$K(5<^2y3yW_lQjZ^{EVX z$(2i^NTj@^4_Apq|3w2wrl+G*oO$G%B3%@9e|sYeSruT{2Ld(|F(?FGaAYVhEceLp z^$`7f$-_}O3html@v|bhu)qZSX#388_SNs+R~tWmqeibV?Zm7czRZkdhwZiflgrUC z38}&TiL$VO4!{sAV?8PG8yXY7k6ufA`W$wIo1W;waXKaO(`!jXRy4xc<@b%aq3+e^ ze`ANZZlC->dxRM#J(=9FDam3-V!%hIy6>X0t|-6VOMXrSzt1ab52<>~yV1@nKkcJd z+g7>7^H$EPj2D-(+PCHNPTNDbu%t+2qu)fSg!nIHiw_;e6cFHe=hOe1uOUs-nO57`2_FT!ePgU9e>ds1s*=( zo7x?TYvk=pkb+6M7Usq#ZvCZTl$X_#5hj<__XanhhL&nc_#zh?b7RF)(?)6Co_i>o z`INMJ{_b;QVTa|1l47i29!ig~?s)(z<9_u6+D2F&%w_Gs{y;(=hsO~w{S7d|f46hG zz&cktYL;6ya-2q(_fW&Op-y{45$pl++;@;^s79IDC^vO31#NZ|;#khboul zv(GxHx?8BWYUKtGd|Sb|RD-QwP>^+It68X5>Sc#|LG54-C~2XZa-+^5wtlG^{hOp+ zoXWtKHFujILCx3_n4xH#=o0!GarB(3#_m|Bs(~D3shV)MiW)$Ve_};Fij5i~S#OVo z4a*Ih5;H9Yf(IDM0zv*J#1IGrJFN`~B~pk^D3L;CtXWsy%_cN4{00>9(Hjns<~TT; z2M<_Z2t>H$_fSOUR&j1D{BThe(}0!;q#@Mh*8FVIMd=c+F7|icPx(577V&&i62fc0 z`>6PE@AEOy1@IjRf41NgnzeOVz9=2*qrZ>5$zXxd`W{}rLejv?Y8i!pNg?kMYM?*~ z$sO?+HHaWKb`{dMD?ewAS1|Gy!aUHs+Nc@~RDaSPZJ=y$Tr`C3xAx|t)Ml2NEXT<0 zVK;5CoTsRSq;m2cV~YyGkSNB7~xgwG*v$PM$I#Ha?$RNZM9Gk6l6-!3jL z(y%=ipRBhBA7-eWkCq$s`8l7dPP|})xt4At&v912(d@j+*e;G187^^rov}?F7hnpW zyuqB4wV57Me~R4&o#1RhQsB)D8!Z#OkFQLjN-4DIkT;7ysv0yA^C5hGiG=0Ar8g90 zU2F@9)`d40ZC!K=8P{dE5q4d8Q>oVlHx_?ga`SNz7Ts__YHeLiMKtlVKc^g67}NKdaKg+e{i|g1fDH{?haPJ`L>z~z-NVb zMt&Hz);wZG=vm=#$rb7ymwI2i+PDrdixneyM(j+Iaw|J5ym2g?j5?#`v(k4YD2bcAtc$YM;<=Nr zA!i&+wV3YWYYOkudd10CgRM?RhGF3@eB3H~Zie|1k>11`oEP1(KU%eyKBk#TfC*#n zUlfBCaEwb!zgU7(DmG_DLh&1z%~zdn?;U@Bi}J;H-eBq#-X9fzn!+h`TKvu%U3>JT ze@5ZhTYAL<+`||ZkC9V&2mD2&k^{nAU|;jXtMT;G*SMme?^fgUsl;NygIi<Nu?h)WmdMVP@EcHFGO9;BaxO!;d%P0_Bt zx6f5Hw#suEQLKV{j5L5^@41VQFb=8wpAkb`%p@evg>nN^5e$fkk7$8IwHLa$)%H}X zWV`_~?P70w=Pp5OP~yl(JSTNIJRCH_gDs`pt=|1puT=@}Vli0c+LMzK###)Ge|Rg- zh_NV zXpJ$YpAMG;uiB!q86IPb76}K)()mF7<0`F5u<|zmf80ER?R4TK`301rGTQM1} zG%NgEg=XMFl|t9)_;iUA3`b6^(xhzOMSLE=PWYTI2BMuV){e}w%~fY)M8#{iD=xWfP8>D)gsdPRqc&giGN0#004D3! zdbQk;g7mlg1^p+h!M^)Y?1%&c@z%8q>~dw8rkqsb&>Q2mH#q*Jp!=J*NB?calZC$+ zVHBF&z?&HnZZst~lIcyZe}Jr4`$aHy;gCnXyiH9%wWgym0puO?+!@`OEltacL*!N6@b>1$7&z!c5|g8gk`x}>e=C&D2DFrmhC5Q%6ij?vifg95VXmCwZJi{f-eqsVk z;2X61YGCm95O= zJY}I9;4F%yI8XZ1f8accvq*|;+;{KunVGwP=5FTU;fcCsKzNu*)R}mOz1LoQo$sxU zzw>tf?BM)-Mv{N8@OlQLHWdHyI>!8`^Zmd34*s=SANOev;Deu=I={`MUknEPZ=Es! zT6;cM3&LFB51##N9s2|ceDdypHGKat?0-Zc{_TJLakzhvDnfi1$sab*FAMYoFZp^5 zefjHm)B5)(&@Wr_A7}e-4&>+e^3^f@`O^NA*-T@9vvt1L0Q)b$Rh;A>Y|USFoByx> z>j!S&m(}paZvQstzyAF<+5i9X>&yNRi*59|B1`~ zQ}5tUD*bk=%s;E~XDGq%ivALT`Suye%K zu!Mh;Q2FOw`8>FH-LxKVJUh>)3vHZvP1rA07CE6ZktP@0;`Y zo3HnMLI3t||M+S>f4$WEH@Ec5r{L>f#_pScP~S%jzwMjf?kD(BAAw2yV;kk?1M)Li z?N7|GBpbM2=N{a2jr z53lc+cJ2?BajiI)68bz+eI4!@qhQ ze?r=S!C61|@Y~+=Wpuu7Tp$ws5rqT$)NeTU51x8|d+PI`{P}A8^7CJ($hUO(6$G0= z!0F?%#IKIo??3n_<$ZajpGNeL=kpJL0-1lYfG?2aAM@4!>jPQ-?c-MsRK|cRE0E{< zdM_^kH$Dpe^vJK->cEWrr=Z7=8uj(VUtxi7yYFum^nf<-U%&qHi;MT)tl`^{@Y5>3 zeE;99WBqP;e^%r@_&DSM}+x7 z0iWeyzAxqD&Z^&U+COgTmzVH=w5h-z`fE*H$A8w&AMZu~N<+Up0Do7^Umw(uiSd89 ztv?*qUnC8Gy%X#oB>b@h|2X9Odw#)ZWT6|98juFQi=2MOC%*swOHlOB&GhexA-@+p z`ax-54)~vhHGhQOe6usZbprl>)|g*zdHWyW-TqlsKXh>ZQdsy0<^6YJvELW>^N{Rc zhz@^W)ISRn|150%^Vj`Pr^~+(zyA)Q`=a>#VQBq|A^q1sJ^(l1Recu>{lyFW1|)q4 z5`O;f1D^s5XaxzYK&0)Xv=15uf@2?Kjt?dU`6WR2>jU2k|N0OCzDGZQXdhqsAiq5H zwT`ck07Ayc6#I9en(*bBx-Y<0ncu2GVfvS^LAL&HUw^6uMG^2N@*7p<%M-uVfFhuV zFO9&zvO$1((0`Gu{Z$kpB>hqeM*O~( zZ{L5apxA;7B0J`?ane&NA^I<6e$>jO# zZTu(5@}D&EpG@vAdG9};-2Ykw|8#W9|MUGi2LD(N`gKX(PUHT4IJ^rIk}{3z#ZE52W&2w3HxtNFna1)Bwbj(t?|X%T;3qU4t? z;@9$jzeGv=`x<_T%q{yYWe*N1zQdE(MfRM_Rkh57%Q6jc;st4{;)nj z%J|v{8c^2$`*Z(?p^twaE%**w{)-ft|2>WU85I7zCG*c4{_VMcnQHM7nEQW!o6^5{ zs(f9+-bwhDiL*s1T=;PV61W|7*k<;Fx}Zi@#&e{8HaX<_-A&-+aDbNl3p$pnhek{*})Dp&uV=m49g0N2UKj zJ{tAGs)*-*fEDzCROWw-7k_0x|31L`Y3%85Ed;Rd|M-(?57C zpY!m3ZPG8E&X*7vC@$YWdjHG7rUS^e`k){E`o;h6N0QK=2JD>WPEx7KWoH4)3^RZ5x?)=zh1zX$NmGzcYloe|GBaFVLSeX-h8`3|4$10x4*&= z{!Hov3XS)$^A<0pT3@-w6Ht0MsJ zp#C3Ukde>dq~Io{FCy^2PKvWYRSE%r`R!f*>&N$g{h=Z-n&9srj(@hA6G{Pr<0Bfqrn(?<0L9{R(sh?F>mcgSyj1%&IgJ-%_Ye?ta-TPI&umd!uD ztcf3)2EXH>{?H8hmO%5ddOzDEpFaMl&HrYk{JtAMGBLj+TK-AF;9dQ`xIZ2iUvezJ z%;ulu7k(L-pYYayyc+=m_D5p>Pg<7cpvTYOH|&!iSBZbmEB@pn{d{cyUY~v|`m>w! z!?OPKLk093T>9e-_wmA1@lv`}!BO1EvHDwudDLfx!%BWW8iL_T!I? zE-Z_G`Rjk>@$qlOWm)mdzkl|J>sYpWT8hqgslbT}KNwA-Xne+sC|g@Xg$-K84lKvB zQhjBwZ7u4hlO_@!^{5u<)AfRtM+T85yDYnbpocgHi%!{P%r}<7!dK??E+D8UGVlFj zyG6Bz+L%-5%2>xud@VI9`}}xHg)SMuTa7u&?`@ase#5RPA^Er55-++ZA;-oiX2}Py|(F@ zoqMVCUJwjJrnj>7z={{yAL_I#l$uLxjzE9T)qBOpKJAoSO2n(rZu}7OB@10hbkeah z8k90J;*LRS;>m=?yS+m7iqY3Ou_g894En9%ZVg|G&gB9b?)6Rz9Jl5^=$4Dh!C`0Y z^>tid-V*1Ey=4x%Qbdu|)zEpYoDi2IP~spquv@lxl&l;HY$n(^IP<915qB08t1^Gi z(|-#P&0fF|WPE4N>Ftc^H$6kzD3|rSb8oX$hJ*~!6`N@kze%(~T%bDG6oCh^Y3c@d z@lYiZ97s0H4+lM2JDczHtv@fV;LR8MT_6$_ka6#Jud;*hR!QdMtAM7tTHmb}_;*F( zYu#0!v{yE6aZm45={v#eaXfLadTM`k8gXk(F^luwOsF8~%$@7$2}c!rdCiPQ!euF@ zc-}(W%fzU_8g6gofs7T!(G?nU6^8D585iq`ZFt)|)*6a6Udcf03>Q@ieI*uDQL*l) zx8|{-3EZ?|DQz?S60?ew7$w7?zHkwUqD$!p*;fL3K3T(kR`A3hmKcaIKIYb?2xxryojQT@0Bt@$lUagCfjkYew`-O$f1&-tic5 z$}4Fjb~F+A=1eShAJkF}<$9H^Jd%gzRSJ+c6A-18G(3hA>*(I5h%Qxqfe?IZ#HtMx5+a!Cej`9j^UAyhvEs9#- zm`r~JJHW$uz>iJ4-70^h#`#w&xh9n`#wDO>RO_?u0?%}TOcyAjn)`(*NciEV{Y{() zDGH3X*A*d=YzfadEOSr@Z8!KRGbod8#@dxz z9)myAZB%5Hb59YGtoy`JrOPN1k=N6*KS z8PLgens?{ymDPVk%gjSoGcNY#XfrLvV=-oL=6dKjrHtgN>v9{_)%EOG-c%HkOf1%E zHBa_#me)q7&2u@#zU@JHa*qp$U<@JCPlBkSSnUt4HrdcF<&O>=LF&@U5Un|O>$ee$*D^e|1!dg9>iy30MmFK*DmP-7OWB+~T5+ z*O(cjtxjuahV|Ia!g(}YL6ldpjV9tIf_J~~NtWLR8?qgpbOb}q;__;t`!v5tR^`d# zxH)nrUJPI-yl_eA`TR7lds}Nyd-Z}#r|nUjLvnwqzsx$ig%1pdtn>{-*ex17HPY+d zQO0ZHXp}EEanG7qvWRNY^klXfw{?N0t6aV*4THS|pGv2_)~tCC)=4xSZOAH=7SW5_ zuVd=n_%-ok(mC~Z;TB~df{h^!dLV6iuak%T5E0u@2Yp}WoA@WyJ1cq-7XHn92@U)RU^EEgMA6>k)z?k-D^g$jB%+m9T931yHeZKg*%qMXFc!Y2%awP68+yoAWtF@j zE9)(w8^xi^=1oXNe_Sh95zFx@d%;n5w}%~dIyVQAC6>WD-U6)O)$-Z%1g6UgWe8-= zyZZHnxg&dC%p>ORId0E4YG22tTlLk6ZKaj3c%+waiK|pWqIGkBLk-I>#3WjgwiSQF zi;G72#bu7Okk2ZOY~7oujgL}$eHpK-&7x&P9CG_gp7aa9H12ToZY9ZEYoAaX2rpbS z?dfDx^dKCdwDQee@$IDI^)41rku8=l6(Zuu%~mkt^kF2 ze-PPA8(&4j52j-Fewy<7;Uk>W-~sBPFrt#ZYm4`sQs3oRMnqgbw(i(~ z&7KmY#OeLO2_;ILdSpAdySFCN{nJ2RfyVWoaTMwY`HlW z5=-t_jp3t(-u8R4H7{U(ho?m(=-Z}iUJ<%pmsqqg97fQbfVnx&d2@doBDXdpy_iO- zUKD0toppvKF6AEv{`Q<_w39>V)GZHeAF*VvH(7rXHopzXtFG^kGsbuJt##GWQoCUb zT#MAUG6y?1u?I^mOS`%+wrp#Ab00jU!Ip|lY!z4$p-k+XSM64KjPkQ9iSpgw*$1o2 z4tf*oEM%oYuoQ=+%ZPtcWjIJty5dl*x#mt8Lm~*#uo$w7>e^B85Fm2GE)A{AIAtvo z>`|n02e+#dyq6*zj*qy z>JH7-;Pyo(nsR~lmO;-=%qF?C(p9hLo2*zI@)pQy-R^en9=t-i<{rT%_104>QU!Dn zIW&s~w7n(9Qsa)d434GZAk%dIdd}2e!@0$Ne z+n0AFw&0&B$7g^1xE#z)7@LHmb-#G&7I#hWP1r@9sT&?6F=MYdCeg(ZdyloKIBV$H z5d_gO#w)z@dCDi^yPY3jB11ho_#%u!cP|PKQp(8 zsW&<{^VMVamq)|})pop>Sh4x&$i%W*U$Dg*mpMD^0Vd!y6`1mst*{?vi1h-8M;M5}{n=&C z!>FrgpAb2UH_A2)caG*2;0p}8#g=mAQ3AOZ3V;EghE(Tsiw6?dvY~z@O6x|-l;&QI zpwM;mVeyN#w_FG?%2DQToajotO`NAWAgYH~2tNJDEeQB7N+7WqJ7?fDi2H+R=Nt=f#0xd4127*n8FTOh$7Q|uX~Z@J9Fa~X<(~WM|jH-v2$s#L`Ut8C_4e+ci?|RaOFq? zfCdkxCfQ=RkHiAgFWU|!ALiJl;{%twzhr-1XboPyN6~|AqDnhdAy8ChOR(llzF4Ex zrz+@qkjz87Ku^nr`To)PZOu58J0j&>R1kj~w!x%*-@PjvMQEi>&^h0xGAO;s$fK($ z%TrngHFjEIhVg<9&uBoik9t31O=C6Pb4B{$*(-O^jGX2shY$9hT~#TvTA;aK4?)*6>fP6++=^=C@R$eVu%g!JrQ^a*jS|EJb+8=8G0J~Z$t(T zH(TvTlCJ)VyM^Fjj*Zufebvz#G6bu=-`_>E8tdue02IZ< zO>soa;_(#;gTLdI*If}`mUBh2?ErWQ zkks(xl{$n&xwBAM1#(hpcZSBBRT^=lCeR1jg+_@)&04(u*@Gw#Nm9 z?Q&rEHip40W8gkN)w6EIht^Q<2&{TIx3X9T(V%qf(b0SNet*_njX%38l(nP+`0d&V zuL8?vw5^|G-2~kRPe*@22ZGV)V5hPql%B>zi#xo*0HAtS)-|Y@J37hEjk2mWbJkQ& z-rW4Q_P9Rhf@_<*`Mm3>;_d}s0@Hb=G#0B&fCe_>Uc8QILxot!foC#lcTH(=PXV|& z+LWhc1FN{}o@Eh4dyAGOeha0^9r70fq2wlyPe|h4)ioyzqvwD8bG?_!UG1(O+tw~r z5rFxd=2UJknH*PY$%E_3I4DtlS$t&gwg49#)_U=)Q9*rqekz1Ls5t0%M*^zr@Ez!S`ouwO$=$l-jxbFPttH& zvwZ$?x%78i7Xe-`tI>3sWF!HGaiLf8`euwLot!LmAKHIMB2zA>BC(=z7lV7XF^el; zC$mS>YX`^!Cz&iv@hoA*EEv^F&h5laue@~{5c{_oe{)~YOO@<&N=uiU`J~S$F$LaX zi*i>ycrp;Ons@+11cf`9<2q8smA3}=Y42oO=yt;d6~AOR+7kV%+5vEoctE~{d!5d6 zL0s*Ilgxjb;oidow(!Cx&8SqLr<5!zY=zs+$y@i0lNH}Dyc__OJYWtDm+PxOZ~^{? z>?5A>+Skn{spzFs@MV(8CD*m0ie(3T0n6R1*u{E8Ve`h@*gzrLxieP|m#S<-j{wKg zYjgAgj~t7)cAgxh3s_n`!v=@5oJNrGJ0#$zqlkZjy5HrE2hikoV@_g8BD%?aTjqCu zjQYj9WW9MMMdV@bUCj_Bs=4lSN~#cIY}*Bv$HYuvYn&<3aW9^?S66T&8)(H-fXUs! zO~&5D>l~VD8HsZy7o0$Z{g5ZK*oPN6l1|F9+zYVTto?jqg0#?mY|$_4m?wnQxqBP) zxDa)a4&(!tO1?I6i@XsKc5CCRGKx67E`HRT*6 z+i_nJaey4>F+hUuk}F16j+vzK;@Zenip_t^VXkV>DZ|4kx|U3w_nWy3kb{*COcW!R z@e5PhDy0v&59!g!J@gu8hK+4l@22&NCCy3oe8TKeTJn(bu}@1bFsqy^SIO?oR7R8< zA>QN{);^dN#jk=G5#AMkEal+s@&Fe==)VoR5p@(lVV7=H9of9w!vjZ@d{YjDqVlvc z8xyX73txFTgPZQtaH~Jo7}-j=D5+;c3yx$0A@#~tO|gPo!Rqrw-r+?ERr5t+MY6O7W7< z0i3WDTaRA3#07uaff%0*`cx2Lud1cZNo$&aFaT2_?v=TYtwOp<;ha0&ZZN+TQ|ZBI zK{-^JqSM)-=PQM7A;1!>$4pL*BdLYq=c#i;;C_GN_og()w%ptKrqv*$C^KtRu%azgP!E4mZR_F{xi=*2? zuJ(w<$kd(~f%ETUc&YNSbh)!yZ8Fjv+F2m&;a(y}??M zJGSiH0Cp*264Z54EkP`4F{%M#_39fiGkV0Suhs%gs8==Nx5VOms*?gDLXfsx<0lge4W@`b_3zTDxz0GCS-s#o=*_0w5O&K*hc{N>KhJNJ!aq#Nwn%Vh`j=< zzlfc5X||29)R;plI!be#RRN5^cqPPEjiu(iZ}mJv@d@|D${96Ze52S$gDdAUFnvnt zHhoV$)neXEvQOg8L)FI2553WUd2AQBn>0lp{8R)|Clz(EB=gd@cN2%U@dW#g@LYhC z)dLqy%B%pgT+%90&PY@=S=CK40jqg!s8u z;o-=k&6Z?S5IT6NOW@h52amG~uDn*ELlBU5RrnYRm+g3vTfq@MK+9u)_4(LoIKRf( zaPdR#7x5KrP4NMy3}2D zpKy2cl`HCot)>finR{}V3V*L%>Rtx=)hTk+g`=rSg^FKOEJk`v(^GTsBLH09-dC&% z@5uWCUeUDX$Juwn9B}vb=J0AQ?M**iK!g~@XNTH~v%s%U^xA=c2=3bpICy=SX=7}# z#K_BCH;w3ECSrf?f+9w;5~xBoa{7I2M6W!>X3u)Cc;?x?s(9v{`5jCG!2?m|G4uk- z9V-xK36_fQ;F+nTR#Wy>S7~R6Qvmjw!27_3>V9{_B8{V0mZWTCXiw4;8kyrGU{@#- z7|tudB=;V=E5V`!QSYz#$aMD zt3|t=N5X@?a$DfO9p4j#Xp{=7cHL&XgJ{NensZ`m2wW@W#cx=+2g58GDz>7Bn_xra zpX#V%(%Jyz5*?kJnb=Vp*OoeTD{P)|@Kigv3Jhl27@!AqZwS| z$u2&z&J#r|Ec17;%z+98^~;&Y;-XpiGC(COPO+=FvEm@Q7b$U^rpxMEV_0K+Gn|ij_mK}(jSkU60 zT%(qX%|I%y*VGRQ0?BVJF`p7Z;De2iQ(b$cWx>A9abIB?V8?WxPj3fbc{E9^5X5tX zx%J(HO+;vV@QNK0Jx}`NNaqoHS5&1f&?_ux3$L|*Tg8R*!xz-svt{ofAXpc6Sb`WL zPbwvHXYvSORQaP(9*@4jxy=w8o)5&}y=_deWQ*RZynpBl(wPpt61Ibo!5}gHbqvy* zfVgSoqpuWT4iD5o(Wm?dA?Ftj%h?0bfeFf9__y+=>0rK!gtPle+}+Hhk~hI8@4%2Z z+ts&!RP|}f(jwU7RCqbnUM~V@e1crYi*Iu7b$tPxNJUMJx^k`swR5=8O)anBB z?2uuw9j9mcY>Mjm=%PWbz%{{a@J48Mw%Rnxn)F3_^g~rs`MjXmw91pTHd~cdc|ImufD5 z*bYS;8P%!HpKLZ5!*v?@7H3END$(PGWJ6PVjED)M9GA_0$GO`*b4DM;O-^79Y$vT7 zRV^&s30QgDUVxjVpbv?7zvEL-&o>3QL#pfMrCE2)~jEDclxq_DihJ#b&Lb$y7*?~TVppGjh8MuTD)o#72P$I zPQf%4;~cQUAx~ce5h|=^8Uun4LTqCRFhU&K@Vo;X{OhaHb6Luhj=Qt?BgVXQdWLx1 zi=8SK)ucU?%fvom$kz~}yc<~P9CGriFRn${C?gb<>8*}c_XJYC9+w2fRNLTx(YZ4S zLoJJc0xrQNx!W8QIN+r{sTLo?Nyg_;Gf5ASgKSyb0{&Dw|D9#!x{OBmyo>j2zNg&+ zx!0CIm^LwaOs3}pD|lkj0qSw@cOUK7?PMNwvG+4da6dMvCd)bCnU>h5Fo} zlO*|La^psNzzqOf`)tse0(V4zLbn2whK*itbGIM7D_vd?Gr#Y#ZxeFUK{)ofAQ~bq zBsk?^nMNYkOB$Ne<`-=R_02=r*yh^B56`1F=jUYv1fC=)S+dxN6|fEbC|pv*()G0_ zug<$RUNlkL&v8j5bBjv-g1Dh6*h^8{1wwY6ZoZ}W!_eJbGUHJ>P)>n=>4Odh-Ut7= zsx$zWo>{YkBeD-4;*=>Z_JDx{6m3ucMR@QP*#2)NkLmTvvk>ewhbZ|ux}Aep&t2>E zet=%gYha;9oJ}Ash@>XMoo-1ywOjwxQ`B2z2+^AcPI#UdE*1!>>f=>i&ZIW3+G$_9 zTscE=-m%$u0F+b=0|7RFccoFqb6badrkR`279+=9qKB`2md$j-)IM@N#e3cZgBUQBJPKG!ck);<)~8Iv889{w zPAwihM`9widp@6keWAP#VZV|RAT!k$3gfPCCJjws z)}1vlZ1M9^9~NEE$SbwsdAk93AGk?aY~$?OkVgkR-YGjz3YG~DSx|Ys(CB>B#|y*_ zG6*{1`MPb}+M%`96u|xrl>PmhS);v#z5tH;V0z0{6m9T-TRLU&c?bCdxCx>q(H6Xt zC0qHUvLZ&RUwqG|LlX($Y+#-!KS86KUp%$9cgGI!tMz`33Z~Qk@W9Z8k5Eq@2lAnc zb5)RPBMoz+s@U|B(3KcK;()hw2>_fDFE(UjEbQoLf_I%D%pJe3fyClA9@D7;iz}*6 z(VYyF0K*l3Yr`*I*{Y8XNl=YDZ(H8R1uK@0IB@anNMB;GdHAz>7xXNo5^~?VPTslu z2u?nKYfMhZz2=fMGrS?)VD>&^?`I(te2g9H1(+L~INTqa3-$vO8(t4L8b-avYqe@p zT`zYVaMM=vJ)_L?gHAy_xCoF~XosegQU^TP^aR|0V1FbS`LaG?0GAMm-j|tJX+Ry9 zajw*wB(Jn(N7COst=d~z`Q=6H#_iFnuK2IRZz_oqC^i6 zr2KRTMjC*8k~-4VjAj>TW;PtH>Y0Z-VR@$G%Lljm#Zjan!Rmr|_mx?Zw{oentT)01 z;Jtuyn*6&RIVxU#dZD}(K!?Q^Gu%S9Uj=iOA&MYbPUTjsRXzMny(Te`nv(5)OEciU#O z%BvBHpr35*;@H%r%-fgD(PZcOgu8}(o%MVSY6wEJ0J-0zd^%~lEdkffy5F~6S`Qq5 z$J-P(a3jk54r8He0Wr5rRaun>LjnLJr}l+R#P4RDpEKhak(haS!|QU$CxpMK^QvM&1G#azEZ z`gNjdeR#ob{(!X>B(lP}1L8vz*7q-91s^+o9M-|SuFP0W^Z8x}qovc6qdHuFsGZf} z4OUXHh!N+cgBjwo4|*^i9noL2NdUA!C#T9FzXBSzdrs~?gjtrwwNtcLGNQcs;4&tH zj=0PKPjhXdra7RDdM7K&Ev_{27c9ORh=_MSV_b{Dpr~e58Ac3-^o+093o-$8IUt@O zM{l|fQ|}kXo=dt9UmDy?PO6iCi#dce2S&PpQl9F88V?bZv`w~gM*%+Ao6kHf?yYEe zh}=cO-h)5}AeOTZNE^zQ;JRBULp_{OR?$$_i}k8iPURq|<<7?e*_qXn4t?lR-K3AR zSpbRiQWbBTo6!@{-)0a!t0CHzSVRMGYX1@el=i$ml@<^h0Q=-%nEnZ0w%1Q9y^|~l~EMYqgL(H2vMBp>@xj4yAfn*jQ*NYz*UWA z8>X1&-2g5~&b&EVSdL3nDvuU^clrGzj>`hq;5Etl1yI?2Q{+p3Mh^KA4ZO6WZg+wq z?ofRfpW%uMLwpw$Y<&m|OP$xd9qbFuWsmW!M?BI7a2^3Vc6NY(taENIy=h!@l@37i zGgS&e**p_9^#gEXY%KI1Nn?6|vH+PJ`N%9W>6Vu?+gHmhWCFj-d!psd!XC^rauzU} zK$xO7nkxtb0M6lmUTK`*P=IDe=QUYhjSkrDC8-MXmeS6K^mVlG@E?+x!zyFp$+^EFJ=Lu zsF}iM@n~p{s5Pn$!Uo(`q6||;@6c-tmi;|kMI=!|m0+oV^#-E#5>vbcKijL@{rSwW zE~jkZcKHDl3+UKFD1+G#^LQXih&;(!_P9D>wg!0Z=P~pbsmOF(RKi(Fp+2~m;@h-g z=h6b^a*{yH){!H32iX1PHr~9~{r=`d%QdysnA`T5*7SqAyfHyE9|Mb={e^R4DD#gy zg~S8?Sl2Lr7@s%?N46A-Yxo+8BRCTbR*ll`*$DU}5%I`;$9(EDe{s>2t*-h75Lucx zCL6*~N1fNcw(vBnPIiVP^Y@c6U-M$X9X;if1_*Bj*W`Il(vu?*t~cbe+P_z0%8}Fy z@V;Vv8{jjg_HJ_Mt<1pP2FstOTRbYrc-&Bhe0ETOb*U|kxx?Gl5JEXs$$bM*ZrL!o ze1jSEmNVRT3i{!eULflafb^;a^*Y@3AwMw+TVt8EJV3eb!mAnq+5*J6DdD7ah;@pe zJ%QPCmM0q{%eI0C;e#!@dC* zNs#t`x!OgP00c1l8WUO*>T z`Bb}PNfUJ{_vgsoFLq-Ox48pk9J~d&BCIn>S#uY5*SYvnY1Ej8M{B-Y0ChZYmH~A3 zu(zyc@bhK|v5%^|Paqz(lC3v-53s0vC06f$$j+A#RAmXS7tUMl;sYGBaAv976}41} zs!9Xc$?SqKH(#K{EhVVQE*Y~Ms0(0pOF_P#afSQ9&xG`wS(x)}7AK^Mq^mIRH)?SK zJDt4vwgPfau50gThJ3Q&-Avtw3Q&h!23);22mnte8r$N0mNS7FPfj=$CGKpqMEs_I zg4yD(_ko1q!Qz=hvA}+k9(Hc|A=n?A*lkbMKy%D%T09IykOv2RL@MN5o5zYbT4Zmw zs$hky2$H;}>0QE;hdr1?hA@`{?ltElK_#1p=XTRqV(b>lBl5l(D&_$fiE1JynZ49C zyG|%ja5xWNE%x9QKdbtQo95aP^*B+dVrLk7i z%_;c-PD%ZR4hce6)qOP_E@|l-N&o;29+?I4FavDz)3J`%F%JP}D5p*k+Idk-Gx-H# z`CS;p3hya&>*0q`7$hy1fDSHyA6J_Iv_Z(2Tx9ItrEeWpU&~7k_EVot!SS+tI72i;vUF%j50FLC z_J9REtDIIWYzh2|qlhlfJAYaFa<*urhQ4jQN_vAl74?XrxzB(Ec1^QIfwzX}G}?7B z0{Fd;VpKG;=I;UUx&)-JFULrHza07g7<&%#eUx$HMN#VILXIfWX{2MAEx|*_y1%Zi%YN zb08asl_Wq9%o1NU4Zi@&W+UYjqLw{B0J#(}D8Y*{3(v?ZM~S)OiL}~8OCVPXwq-hw zwNq~Ja}Z-(F&Gbji77xy^XIv~LL6XGxWJhK0TzgdFFr%r)WT#a|DplRXRgHs$s3Kd zMyhYSkq)OtfpVhqk#mwmJWCt-?2DkiM<5?+W{c?pl2<{*Z!V#vb!F;4D$L#Ixw@2s zSNTpR6vB!^)BsI=!m)Z_$-#PDD(igqHcka?-KeCVVk&EYz9Vw+TYSCV%No!4;U$u{PHCsz&S59%7*qYLd=6oD!AYJqjsGT<%Kp#mcNZ8R|^(ddv3S5zgyZLi!@ z;_jH~Lt|1Y?Dj*)##`S!7J%ZthGRBLQ4GSw4Y0JZWVU^AXvnBJ1~$b0MjM7D3^J() zSCB=}KWY)ATQ<-1b zqim~}nT(s~3-{MG<~EM!lFJJM39-AIQqRfbcsM|?jJcJULY?o>4nTf+$LGmCv!yqS zs7h6Tex9C3Yj?yDUF``X!MBqOrYTXgVE__K(GV(F#SrcE(MYCc4)`kw4TTk-Vk(p% zA&^ykg(u>6j-A>MtjSz%Ao=1!EAPN6Z?-?q`fE>*YpSn9-1@ev@NK{kN>lizUIG5r zi5rH{k8;$%&G+UI8-MrSg0;Ob(e}PUDue)HWTfC z^ImH9?Pj;8{q%@xqEO$cYl;c3sH!kv?nU>#D6^?D$CK>u$!j&8m`6brq&&^rcy|}- z9wzm$I`A}z7T2 z_vBfVG*!k%6fzzV!yD9#u_62A|@kLN{`RcaJSG51wce2cC< z8=#L9(s`I$QT}CmnIKq*-oXeU&IVY;uJXu7TxOCp6W^<6#Lx|dL9R$sKANe25?)b` z<(_U{*R466kwhMay=VgLXda4(U=XiQ-wA79<^bsZP-x$mW(#3gz%x4s#T?lv%Oh^O zB*bax{*ywy)uf|%pwobnbU@cu8JQM4jTOb2ztxNWRN1|H^rRV7uuuxqN8eTo_-VA7eKgGbS2APMhDcQ8L%Aot*ASN;RI zlf7Yi2IYcC+bVC4Nim{}*5w3}b^sKSY{D!j{P z%o^5Qdo%=F{*?qt@}i1RzzZQCP!CeRbpo#^vJLa)VuFab(u}zCv(ySA44zNI zqsohCa(|bP(g!qTkTjb)jk;RX^=PtPTsxKnx!~M3p@{M_jpr#Y2mnQSE)p*K-1fE* z-z>8wsmtSjQ$-M=90=L>UhG1l3F1#abc(a(BNrw$S*=ti;nB7?rg_xG;xTjdG-!|& z6}lj0`S71N_jPT5E)10S^as99GMAaGAMlnp*pBJA?x@^yd+CMLI*$+#-9k73Qps$4 zfRuCg+Mgg##dJ^)D_TFXVUQyTA}ZLJk zZ1(K9w@S1@4qVy+>#s*;kx*`(i6?-4E#J|BXXBkIFTiSljv0Xa6O0dFdvLqDMCpLt ztw%sY0T-aVnTseO7tIWk-Uy6;5+D*=%jm{;-v);%V+?>aMAC@ z+B!RZ?m*L|uEWZ8(Z~jb%ts#sLz_77OmvMdw>edrA~0@@y}Hybuz}vg6Bw&06By)W z%iJkzaEc47=|J-v16K%@lhb%DdV&Y3Rl(#*I0YgNuY<*~CXTNt<(ut|W?EhqE%6xr zaw)xknl5iZ2cyyamp3Y#DsE;Wu=n5^-K9E&xNCb`2)8xcnN<`B020a*qyzfHq-5$~ z${2{79(^vlOmfdNNF5fX+`xuv5qJwQpC|#Sv3UZQ;8<;wVM;o-FKGf)FWPoKq_)YT zI|wAPYv?{|KQ=jeJQI@D$G56u^Bef2)TpL^D_iw;uLBE$TbuegK+s{#2$+utP#Sz* zls7Ak(fe@kjZRo*2P|67GM^LaHzdZ=uzklo8IT-!rK^Qf7nvQqv$-K%QRu_Q1lb)o z(aspeNN@~9d}&#t#(uvtAm1<>0pfEE^9h+)i7N<~`0C56V8bk%(zCODb@J+3c|0WXpY*KI+9*{P& zlAtW0DuF(`3msWgx$!Rn(Csd9^ya&NOM3A*dSsCJ^}NwQ&IM@ZtP2x_cM7@~KD-&( z@_MEU*)EaM^K6TC6LlrjgtAS-jRV&LNhO=PC=79P08iat%*xF{YxWa7 z(*sC5>1mGz*`(qIl667?+oIs$*a+NQTKNWtfwHHPC)ZPIu#!o6MbtVo*G==pXwr14V5_pS;kgBoj`M zBbm|ykj(F-UEJEn4jHicWKn+ILjt6*hZhMs7fZN%mxJH0lbx3Re1T~fZ05O83|ODB4FGa!9kd)tU1MOSeC-*J#IYTbd7LlU_V1U)YIh{#L^Xqfc%LO)WV zll0)9BzAve!kIyUD8LLB_LT1j&p!%xW!Ch%%ZSZ-8L+PIHIxErXmMo74?TPq5P&FRryET_nb~Ke_gWM{T(AMv$%m z9u{rB-4D^&t_a9pg=;jIxaegNC$*{VC_^C-FS_D+Gd9yi<0$*@OkrSOU9_+-!nXR-<&=j}br3%x^1zwd9 zaPtI^z-|Ms#?!T;Xou?79mTr^ajzSY{V*_S0^Gf2zb4&7FW`G-gY;8uH{mF~nJx&6 zcK-To#6f&Rq2AwY=lae9JxH#Ua7bY>$sYnQnc%9C7P+B+pqwBz7jVz|-p5HihdGXY z0gwEVvc|bDCU}RTj3`DfLmj~lPmncGc_6vpfSC^PfLql{oDgK}alrTkx;EV#yGng* zGaAs2n1SlS3uF~C@4LMfK!j>wV_%r;7sEbKxBNf@Z%er6JY;*6-A+TCb^-B!Y9!v-rUI#Dz*W57_RyT62Q`+= zo!10$AaKPKXc?EX=auBem3&y4IRwq2HlBFfFth|hCA4;KzzqkfJ%$lEY#Yx-iflih5$(sXlWcuI&z%8!b}Y(p;qI)ps#%ebO`wm zuK8(pY4^Y{rkSExrs9lf`#IC);ns6iq<7W z+WS{PYDT)Lx(SeQqvg@WZw{+O=}G;uLbR*_yZ^6 z+#8-z(mUYT0gl~`#)9ny^qAh1lM;YI8n+b(xjw0I!oxLy@DDI>-T_f+Bda$eyT@f? z0Awd74>`E69__czVfWp=&6V{i0E4QS`XdEeH7EO2994N}t8f&Fz$YkBjwszWnK$VTXv@(33<0e%ikL;?X}v&; zd9QjJ$oKSsa#W`RAfr_^u7Z*3$I3l$^bP#3d#+mjB&<6~g(t9a4+jgE zh0{oe6JSeW(UF(19BYfNQomIdRZQ-Gi7OvFy5HgUx^a&Djfgy>I(zt|6w$LbZKfI z>3on|WZTKU36uGNgMG4|uyJ__ecA-4J&YE{( z-o*u>c{R|XIC8LnJO!c_Xx^QFfiq>hvQ~NHJKd|1p$ge-bX@My2rxy}_$0RHQ9ZL|T@E!a z%j@)fuS*6p;vQN|A@=3j=`T+wfyL<(ovM&vCMz$GYMK6xovj5OkT!sSFcZ=%qa-Ms zdl*u&ZL)banP4q%nGQ7ko-I*K-isVP9!vs0#9yZCT@Y?JKlJtpw=CO%Yyc7AradA| znlq3!xMaAM&5FRx`o$Qast$4*YC!tQs>#~rb}46&-q;JK2;FE7dLtPi3Biv6W>?Ba z(g4WnV1V>my5oqGAo?$Vy&gCYhUuh>5*h(v?gb{u0@TGtBUJq5tWy^t#4^YwtN=;XN zvi%zAq#T%^YF`V;5R<5u?wKxm|B`xUYSUv;ww;;Yn{ayP@zjf z)IJ3XT)uGKAo7A7{9+bHsjA_V;Q{IHjQMikmGa3W)Xf=HkI!+Cq# zyH9{n({$k`ASS95dY+>_neYw`#S4Vl-&ag4x0Bi*VR=9 zBFrv;)LG+iERHR|2@%gUm{TT+51%;GIL?H(A`qJJgV1J7vG-)^)a)I7Kc`%nN3?>2 zE4&ZV<+{5kTU55~3Bv%u|8@m@Ja-Qr4kS;Wkdo0aN8Q&`HxZ-baF%Cr+h5<&M*J ztYA!J9X#?v%{tttClY3{H32ExH39;-AORYG!UiE~Mj9vw!pD>u+PGZsdw>Jp96jpf z9!J^C#qat8b`!)-ZP|#MCt^6qyu7>euB73U&2k4dEHZj1;lsWNo}Cx7tFEsuw1M&| zkkA7{FCaXP3+`CjqH1z2O)PP8;`yV}&%j=tCxCU|_wx$Kl`35sFYrzsga$H7IFOHj zK%PLJq6b^M^1O+ctA`Vi8tRU|nSuvtV1Ly@){rOrl*;XKW@1jS82dr|;ej zgH58w$jP_}`bB=G@A^DIGF`WlfGgfSI3_`_jC2J_*Cz*bp%l~xIWZA&H5f`*3_ry+ z=bCFLdE_Af@*toGOx-tEERG}s=Jkbt&EPi=J$E)kCeb;7Kx78A5>=2UEffWXXe)JW zbrGb!2%mT%Ut(%mU-Acy>iLlkM^JGNYAyy;k&PsNVBVySjjYK}5M(kRfL^%)IRl`e zxV>g-gAB$L&UMNO5Ei_Z^2q=h0C6t1(o%-P+AgK`+}}8KiIF)>Ng0|_A#<4kI;fhgfB?t2_9+f!>jBux*jWJqQJe*Unoj{Xht@OnV@K7NnHUh9 zJO`kTn_*W?>3I;yK$X+xfY3xFawKL3IHQMAev1--H{CUSG4yvbKZc20idukfTG6=$ais$9W;G=0N)JHDxP zEZg%A!;jsjPqW2=W|xvEIFgykZN5^}a`kvE&Z^C{UjY zMC2DB=@})a%vYYb;tZX7`e;byCO-&wKBqOf?Zjm}0bVl4#DOw@WfI6DOk3ZLZf;nb?i-4hLh9Czz(g38OD2@vPyvrL0V!YEPKPjyg0NE6%8(ufr5A8NO zHZDd_OGcm8mY^V&(ebYnKXdiq7c$V!vbyw=Pov!C$abv-JtD^|(8oCm_9EY}d{?XQ zTMv0wrC#^ANUwy^tXhLV(E=nlG*4VkHITnzfctCSsSu%m0tjGGdn^DI$~Q9b4^omX zy_O}D6ZzzvTA*tv?m=H*@bLm!TjzRgI2jxdb_XY@muf8ww&8bRFb+DI?(EAzTMwK1 z;0%O5Kw9A40wKz$3DBeZdR`3^1LlI;rt9;4-wfOb64zL!09C_)ZQiM9b)u$=?bX~< zpsvZ@+QWi>9w(4jqIcke99bORqux&j{k~YhqL+CCU^H8ZF&Bbavy91y7WM!tK%B_Y_v%y%f<+zb3?-1bSYanAy0OCZ35#DIv480t&B@gUsMVGF+kbqX< zOKA*ZSU?XIgySY%Sv*!;jQ zNx>A`gF31^jfW4x_D{MA7TcOZ>Kr{ zCTSUBQmTcSPgoJiUIr0t=8nW7*go?cSIsQYDf2->E?~5B47xoyK=g@0KCdnjPed7i zJXta(vQh?rCwa!0!5|$1gWVU0K1|>6Ly-odumLhbQhsin{n$W{T4mRC20|$Y$bxzd z!A*|zBvTXAA5xt!xW%$Upl|G4M4*4dHPoz5u{e+SNWRB>cD)rFpx6QxHEo)7w;<7? z=)nQO11+sl+7O;73~(vZq{GKRup#1q1Sw1g!0F?GRWfn!21syIFgIQuVpoV;m8J(l z3~L9t)AcCJ19S0qYaDk^hIKK#1I?@}NV5>!1VVMY)7WsOdZ~A37-Y#?$QaRYq^eGt zd#6Xou9yWZ_80|{0XhcKnQOSLYM|x$_8V%0y?bt!ud@SEcL1>oO)k1{eFBhw$tb2e z!L9*%etQ}HxF+-^f5;KYx;Poa5fOLMfU^dYqi@6$h-)K=e%oh_9P%uI#}}_ex!FAo zIsh~)AkH`jw=nRli=uz12j#>{_8=zWulS3`Z0&hs8KQvX>?Cn_Ya1wzBFT&{36Tzr9~15Dwoqq*C!ZTy8+yw0}V6{gwtG2!{je7UDUI_S!5; z1Vp}pJz51uot^?{k4mSB7ofU)CS71E9oRTRH}{dqSKoNEU!13;0i9TXbWhuB%K^pa zxyo0K8rdtHf+SZG0zpjX0U=nNb)k+1;CnpqOF>jxgp4HYHg42Yt%Nq6_Q z!+Gj1d@pneD2XLNhAVwPJvyS0T2~*CrAc0p-5SQE8rxq6pg4%}JkVZoAiy^t9m6w~ zr1$Us2$HS=Wz``hdI%(t1m=jn;$nhhWcdB@nl-LBgXTE{I_Fw{4zrr|8*4^Yk##_d za-zfarm=KH#z4B1d?RQKWV!0aJa2^bu5<1vdaz6I&&v_@G>~*XYT(o=?z)aZD~K%Y z@+5&`hnr68>ERop108_shD8}O{{MM9vtC!#H9P;6sIIC+B6_e-DN^WcY&v5w25ur6 z)7XFw7%)Wn?-{dy(p==Cq}=34>uB$D*4}Ha>1q6Z?>olx2ngRS@rR;B|FlO_-wiH@ z_r)+0#y{iuh$|NU;Gw=3zSGlei8*Y^r#_1~oi>LlWVAKpkv=@$4fFN%-Pz-~MCFc) zAR?GD^@&7&!R9}qu!5rww^HYJBpyQZ$>huBXUlSkCD|B%UA2>QtRoTIlbf3ft8W$A zT4b_MMz=F&mRD|^E({+%vx43yE?8TokQG`K#2{^amytyGfw-q2KT~RCabFMzEfK7s zj-B-1ciP%W-OX=-D{zQHE-7V-%&deTN;knNAdW=4A||n*RtyebhZrN-heZXn$rvWL zWN;gjvvR?IESGNv;LH75tU^p56zBUn1kwC5jA_0wXfaQx1|=s^!0^N&^$&nDQ%O7$ z3rAWN@O|x&N+^3=Qi_Q&Lg@Dg<{bnIe^!>*sCJccm~1Xtr7sC`N}L%5H$BcbVms$| zy>%AQu2Tu|U#5x3Q?;!JcTIM$&+YP17<5L2!L7c3z_*C$duBe%+xS|VJc9I1{m6|2 zvTVrbF1xf2J`&l>e7qk!#iFUbG%YPED_pctNe# zNO%$Tvgd*1&NFbhw|9QOTfijGk7EJu{{$GV$#}4&oX&C-6WKQ`Nm?ivd`Vc5dul4# z-W_y*@_b`-CIwR@>SdISdcTmz-#HL;PTa~iu|oCp0JUwA1oDEMcYGES11h%iGhW_Q z8dzL$xFTtH8e)&qCAA|9tQA_qt8y$){8QG zV?!@~Jsm}`AH?jTo<*V^fJsR9)VgbM55WY({dveCCSo+hVqy5CV43Re&^# zjdwR>BKeylE>yO!1mj#7-*`Ei79kW3FBSnZWVGG4U;&wbDgtv+ zol|a`4i4yhKq94=J??-yu|zGdw!82s9e8Pf<9tyPges5E>CStYp~(m>nrUb8@MpPya>Gs2)g6W? zv>oH(zE5_wv7=6f9Sqfd4ra{PrIvL;>&$7Vr7PAT94T39+H=a_e*G(vmp25e8Oj#r;<3AyPbFyGV}S8 zBXp=)$~!|dB)u_2e!Y^geVmIEjYwYz9-+aVN)hf6|v|P&pV}WMf7@YxmAOr zPmt%$ZuP~IwL1fUy0(1@nAaxcY`|W8;q{~G?XvRy(s2q2Rje@=5csS zx5KvYtTi8cO6UD8#Gin2?^he>2p^GtOP-DMtPDG?MpWm2_z7dDJ;+_sIIlBAFs|av zX8QAeCw^TD%f{7V;lBq6lBV*cdj5fb!m^`^wa}(wa`UGgSC{v_^w|BkyN);J)u1S8 zo42hN+l>5hh1TDfll|7OlWxo}HCjNGcQ4*G60=Tvj`)C24)*gdd7xbgE_wOBct;D= zngBaM#J_o;%*U)Be-Va1jCI0YJjz>Z1Cis7G}Ex=;RZ}j=D9DmA+$N z9+k|q%T*UlKgObz6s5ZE!3Hmo!Pnfo%*~wb~WB5 zg)oac$pEz;aZ4CeGj(?3K-y9(CN+N`w&0%GCu?i`-EdLvf0?1}tuevL{Ku}*fw^W5 z9=(%)hwIL1_wVlf?T3Auu;TDp+ghlG4)cal?`@GvsgWzdnsxkN@!^cILX^8|;3Et@i)Sqo99~!T z+GdNEbQC_^f4Ohr7bfvCVGGZH>))B#AA7BMXUo~%cPE;!Pftg?9Ck8M?}Qs*UWSlj z9v}h`+OA4SumYO*&dZ48g$idy zdwvz7dHjI?iYCLb=W_1zdW)w1(}=v7#jkZrY*-I)e?}1w3@Z?359=8FQ}!9w1U`D& z;c_Uqn-2^UU?99wS; z#mW=myhq6Sx$nOB=+-!-{2}hRlDsk6m<2j1#BiN8m2Z04(Iq~v=!`kaNu~ToezxzIcR^gpw@`n2scvuZW68H5k;EI7 z;7`=Az7#$3;8kpZ#QwlqI_b{Pzt_N}r_RjSe@=DuJ5x*dTeReFaZd}=;aUFh!!TQh7@z|BwmR$m6Cc+4)vZ0F=wy zf1YIJjI$2bIjJpKWtH~H0B!roCp({>Rho5-!1%0_VxLV2t@nvg>wDzbIUT#t_)yGH z$2{sA1wDB^`tW{8Fyll=BSm4>vp??nQ(^!7E!% zPVxm}AzDg4_T{E(E}zSZ49OScf8b15RN;&v(Jq8%EMGc3#7ij7ZhI%A=*(*|I{6YxI2TQT#k+faV6(|6SfZCrrC={ zq$|ygLdNSltK;PNw%Dzd_q`Vw$L$FX1%}(6<^V?4u+#1UV+ZFd^`FYpLs_5f?-z75}Qr{Y6ae?XaAmQeQmyI7gVN)onBYUsYnVTlQ{);-aTB0 zx?V6L?GN%!C*XggY!-ZbFj~>L0ZF#`qLgLl<`w8A4V%K~8t)jgf>HGSsINVHlR>LM zo}^+w2R(b}^}*Y}e?v=1Vk7$%&S6hPiSSXTl1Ena=p)6Xy!kE3M!tT9rbZ_b9^QzB zYOhKZvTA5?I2kaZ_y}xwxvfmzKKC+U`O7<#ROf~S6h47~UAg@x-m*3luk?%V<~%*n zVI`_r=*We=uYD`}CPXp+q6wGi1$i$*a+5&TSqO5L6^0Sme@2@`WKQSXn~hM+KDc?U*|KYiD=`{R33r!5<|3 zAjpL-F7g!A*k?Han{+^cQWQ+5ZTWh_bW%o-E7Zm0wE6c*=dCivyi7dRa}}~~nstSY z2ou=ucki}qe}6gBTAojbEhB%hv&jR(>%_5m`1#r`@l-`XGepqe?JHvn_S{nYH*5@x zw+|7DK=Kzo<}XC>_)3GwcvA6FgXV~{KH|m8raJvBlhx7kkC#iraFe}ZhkNzZ+&+xw zfS-;Rp4mqa(!4-pLOe0+`I$R(u+GtmlY-}+RKL#)fA=i%&Jt5xPw!8}0`P4qVzrbU z6l!J(q)aGI`t8VNc20il?jf5+3pwO~SF<7`YUsQm%k*<;_HZpqBc9zT0y1{3O}{B! z+1GFZ&lcycPxK+Inr}l7JHR_zdmmYpn*t$NJ+y9eR&P14$hrxzeT4&RPD0(otaNdK zV{zMdfANVHx5Dity(#99%!EcAN zG4J4gygWfiXl&bUlik(ZdpfB$fAY zGwlw0oHn#uRHNI*WDoUxoJch>5*rR4>JVdv+OGi{GKatsj+PFdyu7D0U=OJm!QNQ_ zf7Hf?KTQ6o%Tt(^wf!y0Q~C30ugsf_m0QBiVy z;iP<;re4rrLbXN#_%!j>PRgS#2&XB5w79i`;`ndB;bH%qe+wZ^>Q1mh{}`s3L$gLD zFT1#Zhp#$1J{dU@Yi?7t{@BxWY~jTxPbco1ugni}H8vhdyrsYbX@4OLlmSl;f2Fwv z)fPj|J9Vc#Uk&PlhVcYl7udFO)9CF>U+v*0Tvmz69#e7nUZR^u-#<)f$TaW(wTz$h z5CV*o90=?v-HkhIN>KJ9^{x&L`^Y@h^zW|c_z)?W-&|i14{+_lVLAVU{l)8<@h_%d z^j6T~)2+uF>xm@T{+Xt24nFtqe?hOo&-(S$`WVZP2GOtgh|Hf{%;ynI3Zt7TLkJ(b zj?k~zQW$KXF#))5wN((Fldi(&I9|p+%8SjYZ_i$&hN}`|KK>9)W9l4gO88F)=V&Q> zd^U$sf8L|2t&+vX;wA@+*?`r3AP$LYdd*n7CThcTEin_ zFJ72^{NW;FZ2SgcJ$^J^e>R zNL5O7@zTBx9FtW!{MnUzfr*{BPwNR$-t@A>wm;w0>ezptyRZ1};+zQ`fp245c_;A;cN`DtC;G}V&*Tf}aj*KPULb^U z-JyHA#+T?U9rn(Z=9uM^JCx~0hjEmu*lZdZvVnbi5pT!pNt=F^{@>6j;!O55Uzxd;ax%Z zzCSJsZaL`mdQ2qLmrqf@WrF$}^_vLg6wcEzu$)yVeLZu}?ft=7?r1kgcN`?7THjYQ zKeU5Q5VRV-eX6|~1e%zSaJ+H`hNHVcQUnbe`^s3)wN{rUbM5-SiBRr z8T~Aw=$^`6zC)mW7so5leHZnMYyr2QQEP;8M!8sVmAb}Lg?$>CcJz-PPc<3(5b(YI zImBdWwttV3KP)Hxhi((50L|wMYRGSrsD?IveMEO5t-Q10LW*KaBJTCcy3!P44i9QY zjKq88SLv}>e|Xv6ld@sfyrsrMc~QHP5v&&` zC42Qcf6Xs+xR+NsB}?W47}M*|@6iK+ckMsRzWRu?P6c8YeU@7EPy`WO=^&zaad}77 zZFRus{YYGsVxoOK`CDu^+3kf+;t?o$EvZ^Bi1*Y^wM-`>J=8Rf8qZ+IIUal*BRLR{BINe<6JH?IXB0NeKfL}!nl3(7HN{H0hn+bBKnuJBD3%0bg|EuWVvd4SwV z>D^OfaUQL<{kS89msjj35)(TLofniS5Q)o^wzIv!@G@1~RN09IcYi)@xAf{P5x!2( ze@eFBE;Lj@{3(w|5A%3Lu!tX6#0o*}PbPg?kCgkdzh~6mG!BQ2*B2)qrvO_G4IUZ$ zg5*-08RGgUxlH@h){_JPp2;K%=0@f(_oFM1TO^o&03KFUPTe;<_a|zrg6N~ZE0MUq zGTlIo)Ej;KLXO#{i^*GB>esSYX0{jif8zIU!{ymEe^eKgSJd4S&-KzZj|nyRnEzz2 zXojg|{Oc|d)ZfRXk^D9`-%7Q`&0pR@?_C!EkM>&oDuD6N5f1Eo0UT{g>huLk_k z{)TJ)b=kwd1wHaG{eB4O*daJmRLqtQ+r3@3@TtiwCLa6)$~jl4ZJoD%K2YLKfACel z*r~^X-zgm^P_(VASy(dH17o-p&5{>pGZ}7t! zJ|*2~?8|pXYYOq1sldadRggQYf#Ga|o|XyWcY@4JRpk#JD<3s)F5SA|vU;dmnfyEb zyP!Vr@TEip=BAIAU3hUGXhVcpe~l@sd*;alpdLqAY@&6NH1v{TL3ee$)&ec6bom1g z;kMzG_-K_iL<_Ocw_^7x^dPkGGlv?@HdKtd2v|6jOhlD@$K7#TfEw8g0GwFd9u(QS z2lT~OQ--#~9lC9~P|@R{eQ-5^t=f4s4G$<7boT~92gSq^I8ch*9sZxsf0+gAx1!-UR&FAFYb1WY zdsHO#?C*rcKn@mb5%F@1gj3`5&0(E;p%dz~G?K@)hZ95X_rHcSf$^&pDt(y=VPL8Sp#| ztOIq&%5z(d(y3g}fYLQ01ZwsRO~V-O_tCK}4?a_asbhCz_7+K_;Ye8oH0GhL6dC58}Gf90A(f5C_+O@Y7k zD(i=E9CC#Dc3{8#p_O3Kd<)7A&BS9UGdRjbvt&#jNV^8PLETo=JVh38o4B=)$-paR zZEp9LwQ4kU<5D2y&|Yu94=Z9vRQkYO$Bk%xU$++c0welb2^mNSBBrU2FK`U9LiWx1 zx`urhTjbM%2a+&}e_|LQfVS|8FmBAODy6Bj&daqE6s7Qlat#FD?nk2`9HQ}0%t84Y zj~PrbW@X%upJ%r%I?i>XVy@c9J4L&~njjZP)igRe`A7Ta$AiATvc6c2?e$T7Z%U=1 z0T*y#G9_o;7N-b1CdH=I9ws7D>y_()>0;3XWfyw>rS1($f9!n|N=E?VEha8D+5f5I zJEoWq3ey6Glc>suZN{a|&~SHiopz5?vwh?l&+_fj=ZYcg_Lo) zpzNX(7gQ;$7dnS~2{&VvP(a>vOuF)(8*PEjoLHtXUWUl|os79}0&_bFQ+0Lo0GbK= z{X0oFAI=&~e}-Sq>u`TXs`)@r;^44AmFwvHkoUJsvCr4Ll&0^&+wSj^6QqMsg<`6Z zrRg9H%sbMI2u^`5Eppder8NZcfI9y7xO_wNIs9JA9&Yr)(gop>pf8zUdh3J%_SL5m zC=Q6BbG#b^|Bg<<^1nrrM71qmg#p8PD#MAt8OF`Cf4H})U(%Z+2a4j(w~UUadtQnU z_S4ikJF0DipiifWCJxiT;^rRX5uZovc(jj3?G9LuWOuQtcYrckl>MeJZ6%ivffw`J zwQ$Y|FWGx|&YfFo93SBeAHGfDYwmzAX#m5RdvkG0=BVo|m-oxYRi6+ozr*CbkSz{` z3gr`68LmdC0EM#crOol#?mQ2w@eYkOeIzfqnnr|bA2+!y_U-kNf8L+6i!`mB zAzy%3Vt7`Ucb?3lc`k<+TG>Ixe8DN50t(5le{WM?_n*T@0mV7S5&W1$^(n(CP1)Hp zi&+vQo&&8sPX%=RPJVgzCq{~|R(4Eor~6P^iUd);f>yl1uD_oV0`j#SNVoA+A+KLl zs3MniBhgI@N$SHyu3SkH4r%9W{XG3PYX8i660h|$SkSM;16V!LaK+%#6e48|qV%GS zf9WR*FRq6WOq(560M2F(Hy*7#LD)1 z)}M*gZ$^dw=v(H!!~3MQziY&Ne-Z0|+!J56_>9|2tt(e2oZ(4ft+aKw7q^vlCmDB1 z0L9;xOJlx7d8gbyn0DZTum$L>%HKt|e7d+ohPJPMhT#-{TOHSLowceR#`n7nlUL<2 zn0&6be$Xgqwecyfyr~bY2Q<~6i=nUzF_nuO z%Od$OL0w%Ac!>oYB6*mc?G%b5MoAtYbk%CJ`JNi2NG&?R=J_yzn>?_;8Y}FJ<@;b< zQMME%y$tKmLax?91pB&fe?b^gyTy|yp4K4urBXq|`Lyd~V6#X>Ov@ee zuZ(-X0N`pT5BjP~TlABGjzu#pP^(nEKYI6ZwC;Gf<6inYbx@5SmxB0>HVlwFquS4M0QX5}&()aEz@re>}ciXw9941E6;Q zHjc-xFP_b#zp)LWWsy#^rFO)sZp-vD#?k7!bH~$R+~%P=T&++$dmc_sc-QH|fY zzAR~f+dbxB#dRMgj(!jHw-Rk@dw$|yVeT$q+}_IZl?@=HMeV0eTcr<-0T|%DogmF7 ze^wEB8!qyAx)>Z6e=L2;Kq10e9CfKs?bbex{K=)n|2<;7FIM@ccz5p@tW{t%9|Y_B z328a@>~GnqLQda^TDemR-CZDMRuDGaD{hGG zmxJk@(T{=w$z@QHT;7;8^^p2xehW9OQTZ23o0JM7m}D6qW`d!V{O&f7Tz1PthcI&W zbXurDT|HRye<4I<+bL(STKK)?IN#KH$Jqg^Nbfh{8&GLY04k1E3WlO9T|ciSJ@T3J zlBN&$JWEE4a(#JNfrtIUdAMr6`kM}JSOmnGDRcd6LedJVo&Ag^c~zB4Jxw2o|KJ4x ze)-ggF?a6Pf}2yH^sghh$NnySXhxIxjTN?sfPFqif6kf?C`RX2mX|ZCb99bqT2I|; zpcbZ&<)6xU&!S~u3-?np{`%XCio6*X2uOg=#lH0MYo2->o~0k4f*;t+K8ChSrmxMO z-sEr!6g5kZ_VYGsp8N{&F_a{&#LFJ|lu=f}yu~V}fX}_ct`NJ*Z19)R!NEZv?QrXv0u@NuLvf%0(Gw?Pwjd~&{|&Z_FUU^z-Sj?#>W-HQ+ft!niF+%q=0}v*-w)+} zum|gx6IqKjH)+D@B-}`Ye2`9qtW9j+f7kQ`4|zraoCkX0S@^EW%)rPc#|w@>dJ57k z2v8Ut5&Xqck51g5&16BRB)C*%695@bF}qY0`7ck1jxfMBtIh~q4!ih<=_e+~;xT<1 z@{?AS!%0Fe)D9jhPoJ-F0hFH|ALXnlNjXNhjms+v)zj!`^#;?hG=H>A7Tw@4e=p@$ z!kj4c^Lfu!_l~cCrx+b^PRq@Kbs=oN{2P7eqf9o*adiNAR`NM$oE~vdQDhuM{oEJ5H^oRN2 z;$Qw7&l|s!IjQizdy+p?_waoa%b#Bx)|nZs08yyB+!>64<81~RV`hrC=KK+kIzvm2 z=Yz&4?8p4#C$`IO0B+1W@uJPoS184)6n-onfe@>zH7R0CH%P{NS5W2Hf4vW~`WQI< zLE@^Q1L0WT&wUaz@`dJH7nz#RE7k6lBtZrMHxRJ$2HqmKU3Rc+uQzX?I(Y5+fO|5( z9{dP-RCZd0!P$AOK6cVbNX(6*g-dW&*i3jzBF&$)Lp)?b3c=0=H>JLv4@qLB9b(|5 zet5?TNY_B`ozJRgvdcX_e~DFaVsA@-QreEd7R86Uvb==Da@eKn#vqN__VJ@npLc)_ zp;Ee!Ye$`5&D~30TR;`3C|he?T7PYc| zDW1$UP2_#dHF;zo5B1zn+D+LR9lwfJUUm}aO&gqGQ1Go<_`I-7yb!~S*K$;4k}u0=PZ73}8o?`(!`g)B<&Qvq;Wd9*e_V4vFunM_bi;8t#e7_r z>suUza(e#UjH~NCYf9o^F2}6JDs${lruc`&-LPFr%kv)f|MWy}JG}*cjARd29|Bc~40F$L5Tj$Pc!zJ>9O; zWv!g2C=jpK!HV4CVUgc>-zn!*^x& zhDBmUf3OX-se=0UnbPg&_KI856t98mq(yYM7TC^9vpn}ag*WiqIm2?{mfR-^Y_EF5 zqyetV`>J8<^!Z#Z6eHeO+6z44#joaSz-xudU3xHvf9Nh2Pgi?t#CW$9M177?|L&6r zXaXfo`#lJ;AsEmlo(dpfkSe8D8Ejc(@mV|h-g7#+m$ zovWjb`3@g8&zkN1W$s%2Ts7`m$@sjSUDFsV`H^J(YEmuU$?w!SrN?WEbNcHiwY469 zn{`Cte>2r?Ucq>GkwWh7&KvhFN6(7eNk`vpIMjx>h|C|!SzkHv$Fcbp)?b)tG}Jk7 z#d9vNUkl^3Pq`y#ct?gdCw14&89P7=!|6_9-Ba+$H_*VwlMB9m`D7kas)!T`o ze;F4g<~bbn)L}D`aUd+)v$!5Z@V2u=wV{UkWxRdC42&6Vl4sLjT+MiD`?kz6&C2jJ+fw+>vLh72mv*C{ zFXdY;xBHZ%k4cY<;26gcTC+Je>(~oVf091X>!J1V@Fm@;J(tEh-^RYA{L_o-*3bB4 zweL?rON!Pi_t?vce!Q9Q@1?~_{p%o-V^U0?y`VnVC3{Iv7uRZzD{!;p zvNr`O_LQArK{1<>#!||EslhCC^N^3;J1sHu^gUV;7{(YgmDTVx55t*%-Cu0qfA8_AiP>pIU8!5e+fOv#dvn#Rg(Jk5^`6DFspHi+w^> z`S2eX+lsEDk}Kg!CU~t|lO@jL;ylYw;ZojlruLdAmm*0%v(ko;L!d2h^B{^Y^s{|c zf^_c<*L|b{u$GWtslfEo?-R~te}aDKL9H((=k(yrEea0WrGw>A25mmZ3h^w;ZBg8? zUMsCZeY0xc!$QDu_kN=>Go*hvSZ+ea9M)t=5eNj0<3|OTX~hTO50=DSR9=2tw%VLWEI4m~%LYRQY6Hi=0MGB_)sJT>VvXgMe~5oiSb9;n z?4+fe)O`+C(^FfluN%w6-Q(`^nh(Qd2iSk~_4fk@$L+?ritjVwBx_t6hDya3;RyHva5$~~^nbo5M( z^-k0t?u7CzvV|^VyM$safA7OUsL+uG(~@+oE_$O?bz^W>5S{B;F|RBHZgN1=ru!AM z^|dtP+k4)I@(6_PfLypT@=0}BH)5a*9c=5(otpWG&yPb1U*Cmeh;|%qVmw}}YlRe^ zf!Rz%?>rAD1!j{(|4DxoFg95ms6*#{O1VLG<)GTJ?|Q^b z_gx?M)KE)rb*%>ze=1yMI_1u5GF;{u)M8?<7`pNI}enB*}i~gS-9QS*g7%Br3so zI91CKvI~+g{RbVJ>c$uKJ!;0s6r!uXv)sYIKvLjBKs71ZPfBU&x;vj}Yr4OHZn^rT zX}Mpylav?j?_)vf9!Td^-f+`>~vzZfHG$% zP9K;s^QAsW0ZGdw^#UT@E>F%P`5jsJpLvvTN9}xgGsMf>yz+Ib+tcC7!I6XW84%&D zl*5$ZUzDE=s-1p2enrMcbKZ>mgm(*eKfsfHXpexxuu*N^+OMFc^s$i17o>|bT=O0YBk@`duN3~t<+7LvmPIj$I^Qr zPUFyN)ffENAIiRVGbkJveO!upbFx=wyJ$G>gYrbbP;O>k)$dDKk$GhLDo?ay;()sZ zxRGR?#7MBi&V>FDEqZ+*;Lt};$+}(+FvlDYe?rbs*OXaX6u`FLSP+9kq5?9_*R61$ z!OHpAe{g+IP@*`~_k)#=@uZG{(;Oe~5LC#=x7$8!w+Yh&(f8&Khz#~F&{(|Q?D_PQ z`(gaBj?}+`4>vX5?H(aKaKAWp%3mFhVa*5ga`Rs`T}3m93N8cjd~eng{z=I^kSMz7 ze+Z~Ts`$|xQH+zLaE=R4oq9guEb{Pt&szcH392a8`aq4{SgA`2lfYs-BUATZRk<(8 zlhjfee(Eyd(u~EUovaHR;U8iDbFi2=oAOtx2|U~+yvs}4x4Cx*QBDs^$B;EUm%c6e z(b%nW+_9yRuj469c5Y8za>MAa(zcSrf4#cd`csyZ-6?Rts(GxA_|E#|{oh0N={_EZ zgDgPYxoOj#RrFD8$#<#c`|jcKyDZ~MR=B?Ir_;2vcNqg8>tX1?Sl4L|=Y;CY)M%_98FeBZ;PA}*vy`{_#s1^ikyi;C;Qj@{agKy@ux&GSVQ zk!Z+@5@du~fAz^N1xdy~kIxY~&$@S*1Vv;y*fuWnwbxPnV6P4vE}MQOu`xILK+|7{ zjvN14cW^sN+_7BxU7!C0{^3;Zj?eM$)B1rNoZ-?@5f?-xR_lJZBW>Jj2 ztB_8WE%w}ThX+F~m7uoPeNYml~rZ0ofi?8V%B2?Hp5Yx(A+N6>X{#f#PV*3Z|{L? zJ%MyW$Z98YH}{8Wocm0J&tf92!3&e`ws99i@-&Eo=?s5tav=gv+=Uq^RgjS91^R+z}xDLrVMn26L~u z-{6B-?mQ-KK63$7Jj#cVx+KadwKhL%e~8Zw#98)focm8dU2EFK6z(%YVf_5KmoDE^ za`@Dr!Lg9>9W~SAe<``ecPlkpeIJJ|L+z8WldDEt_cGU0@2>z278UDpla8R>aCP$8 zWfA2+iQ=J~;|In%>6?#7j&QXY#h&j-{1g~1&5y;LJXwdU-$&rh1xh>Ki4Wze#kS%1 zT1a(0n2wzx7aH~AyDdW5Zx5rm^=?{UY{X-8Ac2{3vL8Smf4QE+*+9})O&8Ng^KE|o zyLkT5>66c+<2t0b#@7iw-Xlv;6GI%IkEyo}?+{9R0&ZmK!Q8=Y+GfBHGJ7i^EV-G( zpfS7Ggt`r83SPC{W+6{l#ZIAZc^4|DxqGsAvr%5@;6Y3{{%m^!-?{K_1St4vb3jFf z+>wxUd>j7qe_{OJuHz88>q2pQdQA1Ca+CYq3^;`LPrBnYjkO8eTW zzQcnV$$d?E6SqB)%-f0#!5Y0N1F_5R2V%d#7w{qup=RY8NTmnshbT9h59xVBLpRy) zTT|#hf4Y9&=F`H@UZZ4;!OvZ9njk}|-h21PJ253$*1ygZdAyzelEA7Vc+GZ9gZg%rVU&eohtG5b1PZdbzf_k?`LzdQZ=2>Uvi zDKHIQNAmI9-yWAF#50=!D2U_cE2u%b2<9A;i4mfo?=y6e7jgNB#+|;E#?Rr+=M82=hCuo628jtoMWiHFpZfw|;bZ(-FPfQPEN(L$ ze?)^Fe->%iL9fLwW*JZb?TFTx`=x&Y>15y8Ys!fdH%^1I9`sIT6Eu#f%bG_ zBKcq2`+c~^u%%kgX0tSV>4_V>NW0uj&xPO$NkFg~BKEA*pnJ|3ild~SD1-qVlD4XJ#gANO6X zpW@!!eUkXOX9>L0-=6Kx9ABLbeKJ=aQj_?Qi#(oD#R`}}b2$b4{z1WX`z;JVe+~T) zY=y^*S?hw)q7n7m?|a5;nCmy?cyP(`E;*h(v-fa&K2;5O&6A1`S!uZ+%%maNaQf@^ zHQ6=c?^QU54eQ&z7IWL3oVBqkNS^v#n&##feodzLwa4+jnhd`qnyWk-r?E7Rb*Imu z?i`5x{Q<-P4I9P2|8mokAgY#Te;v`*GX{$ozwXIvY;1tqZ_cP7*l;3HI@S(wYP@K*HU>{I;J@_vS(5uf&VUNervI_bb0pe@`nc-YU*3 zKHT%KA7Yoh6t0h<6hz!M%s-X-{t@5CJ&(i$XjV?GB}tIawyB7AJB}C_xYRQS$7Hj+ zB44j@WW{Tj)0FpVR9akggfx7>TWP#aika8yS=cz$cl!7xi_{vyQ=9OZxn~WCr0lF(D`y6q9K627Dww$b+-- zBlHh*a*E=7{UnC=afg>~{PtReiLP)wPMbeg2lsoRrnWtre~1b)Q$)#RRMJ=XabKLU z`Vd`NPFJ*VoYS+qf^txDzdLacQQmE5#&{fdc`z9{et{K2+4W@Pqo z9aT{5U}S8he=82RC(CpFisHr#j0tVQ9Lgvy6ZEmq3A5(C=p+w8lJ)hI)xXrovH0ns zWPB!WuM}?28%FUqNM%pGuHsa2e? z8B0PA$J_Z??jttteee9aHD)dV#Gr03DVnT>O)GITyq!6ZLu@ zVFHQj1g;N#Wd9^d;bw1j)uR&f0ooAkjaI_B0-QV+p48A3a*jzfF734Nz5aIdPA#*6 z)P32y%gJ(oT|+-Ftg6G8CpbiZ041g0olEBSG`GU^cV{ao4H|f?bNNlnRlZ76_xI_3 zS=a>7eI1MwZTV!puR}u?F+>1i1>By zXR*1d`2co5Tmw}%+$q$dfidw?)Gaw-+|fT?X7`Vgq+`XZfF`zH+iAjpqzl6}HPJEh zLRHE4`=d|`C&sc}RH{elpW>;0f<|8L5%AWh)3F5{DQLT z$A^d$r}pJO@s*BFSN*dd>h8lF$5KRL?FTRrl`lpQ6Bfhr*p;x=RnUnRP>{F zf9%{{L2 zHPQSYJ`X?Q5dG<*X}4gUH$JDk-(2^nN=*3Dx!jw5>?G^TNcV`^$NH`+!lT+#tRbGR z&;!|Ffdvll=J_0>dz{LX!OA`A6C$4df0Xq(hX78n{4ZKi$~y;smu}9c*Bhcw6mxj* zmU{zk`>Pj2l#3B7bkEExywpaVtWQEyV8v!=>}S-O;u9}6;Z+4W;WXUR=Gu_AXDX9h zWyf|Rt6?|kM{eDB;6z&N*-&+lYxY+m$+hCe7`gXjrmR}6_`Eeq?Dytx^wHy zb=!SkFLJCdm_&{Iw?CwT2>U$Ibj46mO>SRzq_kS@_(Wam8PI~lvIVR_7{a#q6Q8GD zw;YtRu-XCJ>aE(Tjk-#)U=hph#6X3p%nZEv+>A?UF%ANyV2<_ho^U@-GQ1MnzJxBg zcA>W%*X8;mC2U)DHh7Z5M)chSf4&(aN9-MSMM<)AC~+0nABdXNM$g=q7K=cSYh|tGy8_2UWb;|cr#c%R5EG> zo+@+Cw%OZ$8_3+z8)-v`;Ssv~x0EPK>?`Dw)=$|HN8FrNtkk?ai#`*HtihV1FQY8S-Edt|>m z#=R@4dGfUxLm!NI8`o&M0n$kV%CqP~Y$4zZJ-`!d4G%;r(}&d1f5qSFKIz^a4+aX! z0F7$GXO>@f`y+p?_iv{ zZW7YdjjP!FsJ%ElS5JULe_L*!uNZ}ql)_$s1Y7ib(e6zGdpkYcWPu+cmANp?V;+&D zf1Fz@E9Pwc*@WIi1VKbq&UdY#ra%_3Zjhe;hE==&_6PWF0#S4iBD-OA=Uy91iaRpwyYmV z5YD&b4#J;=OsmS6bAH<|)*>Aq)1fyGmHM!Sv2 zP9m<0W4Qe7!8wcl4qUAfN*6-X{c0^Aq^?|1vbcPaoV?x8XyJ`1@z>M&_XD((Yo1OL zXkl`Kaov^b+*RsY!{!w#Y$Kxp$Lz}8j_klZKfzhJ!h+%d0bd;y9t_y&x zB&;KEf8Isy%f9~H&NHpal^!F~m-*#-SS;s#AY-N~?icAutqbhtE#=qxS z?;(Jg~M|O@)b@)gV3m-|~FToQZ_QTv#Ry@>nK6>{3_uzd*tZ z#Y;hO$*JW8G<*mHfy*{0`#WHO9LbGG@;B>wLbLfS4`v{h@L5Yi;=L8R_N$dV{Tj{F ze(g24kLGfdp63G=1B#pI@AtutdinYso&-#wyTiRfa9vyY#mGTi>L)42 z$ixu`3mlFI9Ez^slu*Zg_N6oG^8S>bK?8)-@K{oGV&Eq8qY~k(yYfQWiBp?Zhmoik zy9>s5K;~CQaQW1{AKjjJqYtrvid0Y0e=nbhRT}TFc!!c`X&v`C6N~``i*#r8!gJR9 zfM?YysLVQv&*FnO$Bu^%HO{{U}yiyGJCg=U?@eh_c8qXd{-`LL?c} zF5Y!-m^YyyA(=)@Toe6-W>hSm$(xj($eepGXYJ{^YKKx!b+EQ2tk`I`E(SDEfArqm znRp3=B*ZCJ!)LYt@w5D@(2Ge5M?S8S7j^sIga8G9Fr>;){dsrz*?)*Y99DfK3vYQ$ za4sB^J|^ME-*{zM1z@*ouv__C?8jO-KvGhFiEKtYGyT0Fn~p#*k>A>v{C)d6m5ro% zF+MP1oxRxTH%){x3J8psqlwMVf6nOl7iG~X4#T+?@NG-^8G3m08_w}g*OPbdtfP6g zeh1#dqCmT5W?*o;mw>f1M>$K^;l@5<0y+A6%I~$w zYi&1A;;-~?e!gji@Yt|UHt)yGv7Dehc6@C?LmyVTUOjwd6hJgLZA>H9e<>h~$u@Pn zZOKHAt~$UKtR`#NB{(1b?ojYtMmHx}Oc)kqbNR5f9#Sa<}iDU{afm_?ammJzfa)@R$S?8^YsmE1jZ8H!AZTN zL<*7+?LOtCytD?4G>TkD!kw08u zRlzS{Y0px+GTj*~Bj^=_4~?{VzQ6O20bd@Kar956sB`@r5mH}p_zEYU?43=_Wi6?9U8@i68|d(^{n_%a#}nYAeuIlY$U%70yZ;0 zsdnMQKDqP35WaG?j;|e(;4uxoR(;r%G30K|ZFYJ8+&S*99v|<6V0N5W?m6)b zu<9y@@*M;40Dr9a&I8Z9+mpJbl^^H17m-ohhvag(bMLLJ@tW&=_CE)b+de1v?393zrWB)j#g_ zHv#p`MtsuEEY#vt2@l$U_&SoAnQA<*%X59_iYSz6{N=OHBe~hyCo3EDFcZEworJFX zjHi#(eSe>38ar$`_i4$n<;G#-3ZvtzDS(`kxo@YsgVd+H+oVjV9Tf#HDF=-tVjX^W~Vo{LoZ40qC!@R-^#(_%sco zsRVMlElxrEvF}0gi1v`z9l-^S10kEzo_{%n_Z^e~@Ac`|&E5eP@=hGJj%stnjuSzO z!o?nRrcsrnWBo1 zGT)^^b3#t2_(Yo~a`FJQWvlWRAO}$>X!DO@T=eA$8|(CuF4KK@NpQ?DzI8Q@^?&N+ z2A_@;b);`iqv)&Bo{z4<7M054R(S}^?6{Jm+6|-hkl^5b!Xjfc-_(*t;LGp7lL?M2 z#p6wEZA`eI#M;?*Z)hb>{N3U#jafmNW_01YMC{QfUsxMnHIJU1S3XDD_uX)uH9}o* z&Gqnd&O-qKE<}i+B4(&MkJb!TeSd{6Z(@iTAYBD5p_i|hW_SMd-gVz{EVAIJJw=K2 z%%aTU@{M=Ob1lDbgCJu(fNZ{ew-q-iYy63^h`u}Ldv|2;QagaeEy@tu#^rf@<@q!G z)HQBl@s3;B+npVBp4>U~jZ((z*(ao5Px!*A$>W>eIP0{iXg2Eiksr8S9Y#{a@l7Hu(l6HqWy}6b4Zd)Fd_`C&H<$srchgwylz-3P2)Hts z&7+Cw{VKDopOB8p!!ZsL>HR?O_^#U9>-PGuz$ZKzr10(e^EPA;uxkeKQFVneaY*m6~sl%nZHgkqNvf| zKNSE0{W#N7BjHldKKAEwUa*_K{QQ#^y1{~i+Qa1XuE`%Zr{|~s7Qbhe&z*#w@Zm+G zEc*!bB*hj-jHm`*6zBe#)x2J5_eW+_k3;{@I;G`jw&zY)UGL)Wm4DOYT+vf*Y?j}} zkce5_iQlDtz+dkuoG(*;u;k`(lU`utz2f~chZxurl|_NTxr>NgR1Y_F)7G^UIH2b< zhCT<~_c+!pO?8hqR{KxcWwa_*-8msZs136N+axP;VZEl)rX9LBm|~_6Q~L`#L&uR` z=j~#5wwaT!i&oa!UVoKc@@%|kkeAA0ni~3;kxCd}JbbLKSQ}HTxYtx%tr2hSL(EWa zV0MTRvx_NREWRE2jFaf~1`y9s6?(kG$#-F!>^#sv3C+`+@WT?@PV*8$61?uimE8qudZRzckbHi5HWxlCGi6 zu58TZJNVq!{D1P9Ws}@Gmqqe1lQj;9`x87q>D!YA>!g301xYu5heBPx!)|K4eQO#p z7e-T_R-@EkmQ4H?2ZWZoLkTbGc}q%dKiI*Vs}pFMcZ#K-Cv=`&@2%0ApuTqRkqtZujsCqe4U3%$TDG#zhz$Sqs2k>7mt{| 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