mlx-bun 0.5.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1449 -109
- package/THIRD_PARTY_NOTICES.md +882 -0
- package/bin/mlx-bun.convert.mjs +4 -0
- package/bin/mlx-bun.fuse.mjs +4 -0
- package/bin/mlx-bun.generate.mjs +4 -0
- package/bin/mlx-bun.lora.mjs +4 -0
- package/bin/mlx-bun.mjs +13 -21
- package/bin/mlx-bun.server.mjs +4 -0
- package/bin/mlx-bun.upload.mjs +4 -0
- package/dist/web/app.js +9584 -0
- package/package.json +50 -53
- package/src/cli/ane-install.ts +76 -0
- package/src/cli/args.ts +179 -0
- package/src/cli/engine-entry.ts +68 -0
- package/src/cli/inference.ts +214 -0
- package/src/cli/job-entry.ts +97 -0
- package/src/cli/library-host.ts +117 -0
- package/src/cli/main.ts +57 -0
- package/src/cli/memory-engine.ts +163 -0
- package/src/cli/memory.ts +36 -0
- package/src/cli/mlx-lm-aliases.ts +309 -0
- package/src/cli/model-choice.ts +33 -0
- package/src/cli/model-selection.ts +84 -0
- package/src/cli/module-host.ts +11 -0
- package/src/cli/module-verbs.ts +50 -0
- package/src/cli/numerical-policy.ts +12 -0
- package/src/cli/perplexity.ts +89 -0
- package/src/cli/serve-host.ts +423 -0
- package/src/cli/serve-isolated.ts +217 -0
- package/src/cli/serve-options.ts +106 -0
- package/src/cli/serve-state.ts +205 -0
- package/src/cli/serve.ts +500 -0
- package/src/cli/served-model-host.ts +102 -0
- package/src/cli/server-entry.ts +148 -0
- package/src/cli/serving-unit.ts +177 -0
- package/src/{tui.ts → cli/terminal.ts} +13 -8
- package/src/cli/worker-adapters.ts +34 -0
- package/src/cli/worker-entry.ts +272 -0
- package/src/cli/worker-unit.ts +179 -0
- package/src/engine/adapter-operation.ts +26 -0
- package/src/engine/cache-services.ts +114 -0
- package/src/engine/completion.ts +39 -0
- package/src/engine/generation-gateway.ts +358 -0
- package/src/engine/index.ts +59 -0
- package/src/engine/kv-budget.ts +120 -0
- package/src/engine/media-preparation.ts +232 -0
- package/src/engine/model-binding.ts +24 -0
- package/src/engine/model-host.ts +513 -0
- package/src/engine/model-serving.ts +89 -0
- package/src/{serve → engine}/preparation.ts +7 -5
- package/src/{serve → engine}/session-completion-engine.ts +6 -6
- package/src/engine/telemetry.ts +109 -0
- package/src/hub/downloads.ts +116 -0
- package/src/jobs/db.ts +16 -7
- package/src/jobs/events.ts +29 -0
- package/src/jobs/executable.ts +5 -0
- package/src/jobs/host.ts +51 -0
- package/src/jobs/in-process.ts +55 -0
- package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
- package/src/jobs/runner.ts +150 -231
- package/src/jobs/service.ts +75 -0
- package/src/jobs/sse.ts +59 -23
- package/src/jobs/worker-memory.ts +46 -0
- package/src/jobs/worker-process.ts +163 -0
- package/src/jobs/worker-supervisor.ts +258 -0
- package/src/modules.ts +58 -0
- package/src/publishing/catalog-hub.ts +18 -0
- package/src/publishing/credentials.ts +31 -0
- package/src/publishing/upload.ts +37 -0
- package/src/residency/leased-adapters.ts +21 -0
- package/src/residency/local-records.ts +16 -0
- package/src/residency/model-residency.ts +405 -0
- package/src/residency/record-index.ts +28 -0
- package/src/residency/resident-estimate.ts +50 -0
- package/src/{anthropic.ts → server/anthropic.ts} +3 -81
- package/src/server/cache-routes.ts +36 -0
- package/src/{serve → server}/chat-request.ts +10 -10
- package/src/{serve → server}/chat-stage.ts +14 -14
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +33 -41
- package/src/server/decision-body.ts +55 -0
- package/src/server/decision-routes.ts +134 -0
- package/src/server/decision-wire.ts +228 -0
- package/src/{serve → server}/discovery-routes.ts +25 -82
- package/src/{serve → server}/http.ts +25 -13
- package/src/{serve → server}/inference-request.ts +5 -5
- package/src/server/job-routes.ts +20 -0
- package/src/server/media-prompt.ts +63 -0
- package/src/server/memory-completion-client.ts +46 -0
- package/src/server/model-routes.ts +192 -0
- package/src/{serve → server}/openai-wire.ts +3 -2
- package/src/{serve → server}/pipeline.ts +1 -1
- package/src/server/prompt-builder.ts +13 -0
- package/src/server/prompt-contracts.ts +17 -0
- package/src/server/proxy-routes.ts +187 -0
- package/src/server/publishing-routes.ts +41 -0
- package/src/{serve → server}/request-plan.ts +6 -8
- package/src/{serve → server}/request-prep.ts +47 -50
- package/src/{serve → server}/responses-client.ts +30 -13
- package/src/{responses.ts → server/responses.ts} +12 -93
- package/src/server/routes.ts +205 -0
- package/src/server/start.ts +72 -0
- package/src/server/status-routes.ts +108 -0
- package/src/{serve → server}/text-completion-stage.ts +25 -4
- package/src/server/text-prompt.ts +12 -0
- package/src/{serve → server}/token-streams.ts +36 -38
- package/src/server/worker-routes.ts +311 -0
- package/src/storage/paths.ts +61 -0
- package/src/web/assets.ts +37 -0
- package/src/web/{src → browser}/api.ts +5 -23
- package/src/web/browser/chat-host.ts +17 -0
- package/src/web/browser/installed-panels.ts +6 -0
- package/src/web/browser/main.ts +55 -0
- package/src/web/browser/markdown.ts +279 -0
- package/src/web/browser/memory-panel.ts +9 -0
- package/src/web/browser/palette.ts +64 -0
- package/src/web/browser/protocol.ts +13 -0
- package/src/web/browser/shell.ts +467 -0
- package/src/web/{src → browser}/status.ts +32 -36
- package/src/web/build.ts +51 -0
- package/src/web/public/app.html +1054 -0
- package/src/web/{sw.js → public/sw.js} +4 -3
- package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
- package/src/web/{vendor → public/vendor}/hljs.js +2 -2
- package/THIRD_PARTY_LICENSES.md +0 -51
- package/docs/README.md +0 -107
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
- package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
- package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
- package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
- package/docs/archive/investigations/curve-bisector-routing.md +0 -123
- package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
- package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
- package/docs/archive/investigations/dspark-handoff.md +0 -224
- package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
- package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
- package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
- package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
- package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
- package/docs/archive/investigations/lab-build-journal.md +0 -157
- package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
- package/docs/archive/investigations/openjarvis-fit.md +0 -198
- package/docs/archive/investigations/openwiki-evaluation.md +0 -249
- package/docs/archive/investigations/optimization_plan.md +0 -346
- package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
- package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
- package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
- package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
- package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
- package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
- package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
- package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
- package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
- package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
- package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
- package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
- package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
- package/docs/archive/planning/chat-ui-vision.md +0 -50
- package/docs/archive/planning/chunk-task-roadmap.md +0 -77
- package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
- package/docs/archive/planning/journal.md +0 -316
- package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
- package/docs/archive/planning/pi-integration-review.md +0 -178
- package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
- package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
- package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
- package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
- package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
- package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
- package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
- package/docs/archive/planning/release-notes-v0.4.0.md +0 -45
- package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
- package/docs/archive/planning/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -2054
- package/docs/design/decode-speed-program.md +0 -2404
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -821
- package/docs/design/kv-cache.md +0 -993
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -2129
- package/docs/design/turboquant.md +0 -2225
- package/docs/design/unified-engine-frontier-plan.md +0 -1987
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -593
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/public-readiness-handoff.md +0 -244
- package/docs/planning/public-readiness.md +0 -149
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3587
- package/docs/reference/cli.md +0 -646
- package/docs/reference/distribution.md +0 -380
- package/docs/reference/environment.md +0 -494
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -688
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -346
- package/docs/reference/server-api.md +0 -1945
- package/docs/reference/server-config.md +0 -973
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/audiotoolbox.ts +0 -112
- package/src/audio/conformer.ts +0 -655
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/mic-capture.ts +0 -98
- package/src/audio/silero-vad.ts +0 -379
- package/src/audio/transcode.ts +0 -67
- package/src/audio/whisper-decode.ts +0 -774
- package/src/audio/whisper-fast.ts +0 -732
- package/src/audio/whisper-format.ts +0 -73
- package/src/audio/whisper-mel.ts +0 -185
- package/src/audio/whisper-timing.ts +0 -274
- package/src/audio/whisper-tokenizer.ts +0 -239
- package/src/audio/whisper-transcribe.ts +0 -410
- package/src/backends/mlx/assistant-target.ts +0 -46
- package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
- package/src/backends/mlx/autoregressive.ts +0 -129
- package/src/backends/mlx/batch-group.ts +0 -1874
- package/src/backends/mlx/cache-attachment.ts +0 -67
- package/src/backends/mlx/cache-layout.ts +0 -31
- package/src/backends/mlx/checkpoint-state.ts +0 -53
- package/src/backends/mlx/continuation-persistence.ts +0 -107
- package/src/backends/mlx/continuation-request.ts +0 -43
- package/src/backends/mlx/continuation.ts +0 -77
- package/src/backends/mlx/diffusion.ts +0 -39
- package/src/backends/mlx/draft-target.ts +0 -32
- package/src/backends/mlx/encoder-cache.ts +0 -25
- package/src/backends/mlx/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -58
- package/src/backends/mlx/fill-group.ts +0 -497
- package/src/backends/mlx/full-kv-row-append.ts +0 -32
- package/src/backends/mlx/full-kv-row-donor.ts +0 -54
- package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
- package/src/backends/mlx/gateway-binding.ts +0 -174
- package/src/backends/mlx/graph.ts +0 -38
- package/src/backends/mlx/kv-codec.ts +0 -9
- package/src/backends/mlx/kv-maintenance.ts +0 -161
- package/src/backends/mlx/kv-tensor-rows.ts +0 -212
- package/src/backends/mlx/memory-client.ts +0 -189
- package/src/backends/mlx/methods.ts +0 -90
- package/src/backends/mlx/mixed-iteration.ts +0 -62
- package/src/backends/mlx/model-prompt.ts +0 -178
- package/src/backends/mlx/model-serving.ts +0 -80
- package/src/backends/mlx/paged-cache-codec.ts +0 -27
- package/src/backends/mlx/prefill-cohort.ts +0 -100
- package/src/backends/mlx/prefill-policy.ts +0 -26
- package/src/backends/mlx/prefill-rows.ts +0 -244
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/prompt-input.ts +0 -29
- package/src/backends/mlx/qwen-prompt-input.ts +0 -40
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -54
- package/src/backends/mlx/rollback.ts +0 -92
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -251
- package/src/backends/mlx/speculative-group.ts +0 -438
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -131
- package/src/backends/mlx/state-rows.ts +0 -104
- package/src/backends/mlx/state-views.ts +0 -46
- package/src/backends/mlx/target-layout-capability.ts +0 -35
- package/src/backends/mlx/text-engine.ts +0 -73
- package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3490
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -70
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/object-cache.ts +0 -8
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -261
- package/src/contracts/prefix-cache.ts +0 -33
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -54
- package/src/contracts/tsconfig.json +0 -14
- package/src/dataset/generators.ts +0 -1087
- package/src/dataset/index.ts +0 -12
- package/src/dataset/job.ts +0 -81
- package/src/dataset/llm.ts +0 -71
- package/src/dataset/registry.ts +0 -528
- package/src/diffusion/diffusion-generate.ts +0 -507
- package/src/download.ts +0 -505
- package/src/embed.ts +0 -77
- package/src/engine/admission.ts +0 -59
- package/src/engine/cancellation.ts +0 -38
- package/src/engine/engine.ts +0 -56
- package/src/engine/execution-coordinator.ts +0 -70
- package/src/engine/execution-plan.ts +0 -64
- package/src/engine/execution-tasks.ts +0 -44
- package/src/engine/namespaced-cache.ts +0 -13
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -92
- package/src/engine/session.ts +0 -247
- package/src/eval/README.md +0 -130
- package/src/eval/ifeval.ts +0 -81
- package/src/eval/kl-prompts.ts +0 -29
- package/src/eval/kl.ts +0 -590
- package/src/eval/perplexity.ts +0 -164
- package/src/eval/quality-db.ts +0 -92
- package/src/eval/reference-logits.ts +0 -207
- package/src/eval/runner.ts +0 -124
- package/src/eval/score.ts +0 -49
- package/src/eval/tasks/bfcl.ts +0 -535
- package/src/eval/tasks/gsm8k.ts +0 -98
- package/src/eval/tasks/hashhop.ts +0 -139
- package/src/eval/tasks/humaneval.ts +0 -275
- package/src/eval/tasks/ifeval.ts +0 -525
- package/src/eval/tasks/mmlu.ts +0 -157
- package/src/eval/ultrafeedback.ts +0 -60
- package/src/evaldb.ts +0 -199
- package/src/expert-io.ts +0 -393
- package/src/expert-offload-build.ts +0 -77
- package/src/expert-offload.ts +0 -76
- package/src/expert-residency.ts +0 -1134
- package/src/expert-usage.ts +0 -415
- package/src/fill/echo-index.ts +0 -188
- package/src/fill/fill-session.ts +0 -463
- package/src/fill/proposal.ts +0 -68
- package/src/fill/schema-rows.ts +0 -506
- package/src/fill/tool-boundary.ts +0 -103
- package/src/fit.ts +0 -249
- package/src/generate.ts +0 -1352
- package/src/grammar.ts +0 -604
- package/src/harness-pi.ts +0 -184
- package/src/hf-push.ts +0 -628
- package/src/hub-rest.ts +0 -242
- package/src/index.ts +0 -63
- package/src/inference/denoising.ts +0 -17
- package/src/inference/draft-acceptance.ts +0 -41
- package/src/inference/draft-output.ts +0 -49
- package/src/inference/graph.ts +0 -33
- package/src/inference/prefill.ts +0 -45
- package/src/inference/rollback.ts +0 -7
- package/src/jobs/index.ts +0 -31
- package/src/jobs/job-entry.ts +0 -107
- package/src/jobs/task-client.ts +0 -19
- package/src/jobs/types.ts +0 -2
- package/src/kv-scheme.ts +0 -279
- package/src/kv-store.ts +0 -1135
- package/src/lab/README.md +0 -22
- package/src/lab/curve/curve-designer.html +0 -303
- package/src/lab/curve/curve-sampler.ts +0 -122
- package/src/lab/expert-trace/expert-trace.ts +0 -69
- package/src/lab/paged-kv/paged-attention.ts +0 -117
- package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
- package/src/lab/paged-kv/paged-kv.ts +0 -336
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -54
- package/src/media-fetch.ts +0 -442
- package/src/memory/article.ts +0 -558
- package/src/memory/chunk-validation.ts +0 -150
- package/src/memory/chunk.ts +0 -318
- package/src/memory/cluster.ts +0 -351
- package/src/memory/coverage.ts +0 -134
- package/src/memory/crosslink.ts +0 -0
- package/src/memory/db.ts +0 -253
- package/src/memory/entity.ts +0 -203
- package/src/memory/gate.ts +0 -187
- package/src/memory/history.ts +0 -152
- package/src/memory/ingest.ts +0 -335
- package/src/memory/model.ts +0 -183
- package/src/memory/normalize.ts +0 -671
- package/src/memory/parse.ts +0 -22
- package/src/memory/pipeline.ts +0 -275
- package/src/memory/prompts.ts +0 -65
- package/src/memory/query.ts +0 -334
- package/src/memory/reconcile.ts +0 -734
- package/src/memory/redirect.ts +0 -108
- package/src/memory/reindex.ts +0 -325
- package/src/memory/resolve.ts +0 -307
- package/src/memory/rest.ts +0 -245
- package/src/memory/route.ts +0 -272
- package/src/memory/schedule.ts +0 -165
- package/src/memory/stages.ts +0 -777
- package/src/memory/synthesize.ts +0 -1638
- package/src/memory/tools.ts +0 -749
- package/src/memory/vault.ts +0 -1194
- package/src/memory/wikify.ts +0 -1064
- package/src/mlx/array.ts +0 -425
- package/src/mlx/autograd.ts +0 -304
- package/src/mlx/checkpoint.ts +0 -149
- package/src/mlx/compile.ts +0 -168
- package/src/mlx/custom-vjp.ts +0 -188
- package/src/mlx/ffi.ts +0 -531
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/normalized-argmax.ts +0 -116
- package/src/mlx/ops.ts +0 -1108
- package/src/mlx/quantized-rows.ts +0 -36
- package/src/mlx/token-bitmask.ts +0 -52
- package/src/mlx/turboquant-kv-decode.ts +0 -82
- package/src/mlx/turboquant-kv-inverse.ts +0 -122
- package/src/mlx/turboquant-ops.ts +0 -861
- package/src/mlx/turboquant-tables.ts +0 -237
- package/src/mmap.ts +0 -90
- package/src/model/artifact-identity.ts +0 -73
- package/src/model/batched-kv.ts +0 -235
- package/src/model/batched-mask.ts +0 -279
- package/src/model/batched-quant.ts +0 -212
- package/src/model/batched-quantized-kv.ts +0 -144
- package/src/model/batched-rotating-quant.ts +0 -353
- package/src/model/batched-rotating-state.ts +0 -149
- package/src/model/batched-rotating.ts +0 -338
- package/src/model/batched-row-storage.ts +0 -179
- package/src/model/batched-ssm.ts +0 -52
- package/src/model/batched-turboquant-kv.ts +0 -94
- package/src/model/compiled-decode.ts +0 -712
- package/src/model/decoded-kv-donor.ts +0 -12
- package/src/model/delayed-quantized-kv.ts +0 -72
- package/src/model/delayed-rotating-quantized-kv.ts +0 -93
- package/src/model/delayed-turboquant-kv.ts +0 -57
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -215
- package/src/model/fingerprint.ts +0 -45
- package/src/model/flash-attention.ts +0 -694
- package/src/model/full-prefill-padding.ts +0 -56
- package/src/model/full-prefill-row.ts +0 -105
- package/src/model/gemma4-base.ts +0 -2370
- package/src/model/gemma4.ts +0 -1395
- package/src/model/generated/gemma4-12b.ts +0 -429
- package/src/model/generated/gemma4-26b.ts +0 -448
- package/src/model/generated/gemma4-e4b.ts +0 -717
- package/src/model/generated/index.ts +0 -18
- package/src/model/glm52-atlas.ts +0 -511
- package/src/model/glm52-cache.ts +0 -792
- package/src/model/glm52-config.ts +0 -262
- package/src/model/glm52-container.ts +0 -305
- package/src/model/glm52-coupling.ts +0 -388
- package/src/model/glm52-dsa.ts +0 -606
- package/src/model/glm52-expert-layout.ts +0 -253
- package/src/model/glm52-layout.ts +0 -152
- package/src/model/glm52-memory.ts +0 -500
- package/src/model/glm52-mla.ts +0 -792
- package/src/model/glm52-moe.ts +0 -223
- package/src/model/glm52-pilot.ts +0 -537
- package/src/model/glm52-reference.ts +0 -445
- package/src/model/glm52-residency.ts +0 -557
- package/src/model/glm52-resident-weights.ts +0 -135
- package/src/model/glm52-streamed-experts.ts +0 -453
- package/src/model/glm52-streamed-metal.ts +0 -610
- package/src/model/glm52-weights.ts +0 -503
- package/src/model/glm52.ts +0 -1132
- package/src/model/implementation.ts +0 -69
- package/src/model/kv-attention-view.ts +0 -70
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -468
- package/src/model/quantized-append-attention.ts +0 -31
- package/src/model/qwen-append.ts +0 -12
- package/src/model/qwen-conv.ts +0 -52
- package/src/model/qwen3-delta-state.ts +0 -74
- package/src/model/qwen3-delta.ts +0 -451
- package/src/model/qwen3-moe.ts +0 -404
- package/src/model/qwen3-mrope.ts +0 -250
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -881
- package/src/model/rotating-kv-donor.ts +0 -35
- package/src/model/rotating-kv-layout.ts +0 -262
- package/src/model/rotating-row-transaction.ts +0 -35
- package/src/model/speculative-rotating-kv.ts +0 -101
- package/src/model/ssm-prefill-padding.ts +0 -39
- package/src/model/support.ts +0 -110
- package/src/model/token-groups.ts +0 -66
- package/src/model/trellis-balanced-scatter.ts +0 -51
- package/src/model/trellis-linear.ts +0 -672
- package/src/model/trellis-shared-m.ts +0 -151
- package/src/model/trellis-shared-scatter.ts +0 -144
- package/src/model/trellis-splitk-prefill.ts +0 -158
- package/src/model/trellis-tiled-prefill.ts +0 -136
- package/src/model/trellis-vector-expand.ts +0 -62
- package/src/model/trellis-wide-prefill.ts +0 -94
- package/src/model/turboquant-codec.ts +0 -89
- package/src/model/universal/archs.ts +0 -332
- package/src/model/universal/dense.ts +0 -612
- package/src/model/universal/modules.ts +0 -170
- package/src/model/universal/rope.ts +0 -381
- package/src/model/whisper.ts +0 -435
- package/src/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native/mic_capture.swift +0 -92
- package/src/native-pack.ts +0 -163
- package/src/pi-provider.ts +0 -53
- package/src/pi-session.ts +0 -81
- package/src/pi-terminal.ts +0 -274
- package/src/pi-web.ts +0 -1940
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -682
- package/src/quantize/allocator.ts +0 -627
- package/src/quantize/atomic-output.ts +0 -38
- package/src/quantize/calibration.ts +0 -181
- package/src/quantize/config-writer.ts +0 -145
- package/src/quantize/index.ts +0 -84
- package/src/quantize/job.ts +0 -162
- package/src/quantize/quantizer.ts +0 -666
- package/src/quantize/rotate.ts +0 -603
- package/src/quantize/safetensors-writer.ts +0 -249
- package/src/quantize/sensitivity.ts +0 -216
- package/src/quantize/trellis.ts +0 -586
- package/src/quantize/weight-transform.ts +0 -292
- package/src/registry.ts +0 -602
- package/src/runtime-config.ts +0 -77
- package/src/safetensors.ts +0 -165
- package/src/sampler.ts +0 -1012
- package/src/serve/admin-routes.ts +0 -184
- package/src/serve/assets/curve-terrain.html +0 -105
- package/src/serve/assets/training-inference-map.html +0 -575
- package/src/serve/audio-routes.ts +0 -323
- package/src/serve/aux-routes.ts +0 -132
- package/src/serve/batch-scheduler.ts +0 -8
- package/src/serve/checkpoint-identity.ts +0 -64
- package/src/serve/generation-gateway.ts +0 -537
- package/src/serve/isolate.ts +0 -609
- package/src/serve/kv-budget.ts +0 -14
- package/src/serve/lab-routes.ts +0 -341
- package/src/serve/lane-registry.ts +0 -45
- package/src/serve/model-admin-routes.ts +0 -155
- package/src/serve/model-binding.ts +0 -49
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -161
- package/src/serve/response-lease.ts +0 -24
- package/src/serve/session-search.ts +0 -326
- package/src/serve/static-routes.ts +0 -101
- package/src/serve/transcription-server.ts +0 -64
- package/src/serve/transcription-service.ts +0 -502
- package/src/server.ts +0 -1282
- package/src/spec/assistant-rows.ts +0 -93
- package/src/spec/assistant-source.ts +0 -126
- package/src/spec/cache-identity.ts +0 -22
- package/src/spec/deepspec-rows.ts +0 -29
- package/src/spec/deepspec-source.ts +0 -145
- package/src/spec/dflash-source.ts +0 -149
- package/src/spec/drafter.ts +0 -304
- package/src/spec/dspark/ab-stats.ts +0 -136
- package/src/spec/dspark/calibration.ts +0 -112
- package/src/spec/dspark/data-dflash.ts +0 -156
- package/src/spec/dspark/data.ts +0 -201
- package/src/spec/dspark/deepspec-module.ts +0 -776
- package/src/spec/dspark/generate-dflash.ts +0 -245
- package/src/spec/dspark/generate.ts +0 -290
- package/src/spec/dspark/loader.ts +0 -23
- package/src/spec/dspark/loss.ts +0 -213
- package/src/spec/dspark/module-dflash.ts +0 -560
- package/src/spec/dspark/module.ts +0 -540
- package/src/spec/dspark/quantize-drafter.ts +0 -91
- package/src/spec/dspark/sample.ts +0 -112
- package/src/spec/generate.ts +0 -276
- package/src/spec/glm52-mtp-graph.ts +0 -29
- package/src/spec/glm52-mtp-rows.ts +0 -132
- package/src/spec/glm52-mtp-source.ts +0 -318
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -226
- package/src/spec/projected-draft-rows.ts +0 -73
- package/src/spec/qwen-mtp-module.ts +0 -171
- package/src/spec/qwen-mtp-rows.ts +0 -230
- package/src/spec/qwen-mtp-source.ts +0 -386
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -587
- package/src/spec/source.ts +0 -228
- package/src/spec/two-model-rows.ts +0 -62
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -431
- package/src/ssd-durability.ts +0 -209
- package/src/storage/host-buffer.ts +0 -24
- package/src/storage/kv-writer.ts +0 -83
- package/src/storage/kv-writer.worker.js +0 -264
- package/src/storage/retention-policy.ts +0 -37
- package/src/tiered-prompt-cache.ts +0 -45
- package/src/tokenizer.ts +0 -335
- package/src/tool-approvals.ts +0 -131
- package/src/tool-call.ts +0 -695
- package/src/train/dataset.ts +0 -484
- package/src/train/diffusion-lora.ts +0 -216
- package/src/train/export.ts +0 -32
- package/src/train/flash-cce.ts +0 -1234
- package/src/train/forward.ts +0 -266
- package/src/train/fuse.ts +0 -243
- package/src/train/index.ts +0 -46
- package/src/train/job.ts +0 -205
- package/src/train/lora-params.ts +0 -254
- package/src/train/loss.ts +0 -1591
- package/src/train/merge.ts +0 -195
- package/src/train/optimizer.ts +0 -183
- package/src/train/prefix-shared.ts +0 -490
- package/src/train/rank.ts +0 -137
- package/src/train/segmented.ts +0 -1828
- package/src/train/steel-qmm-header.ts +0 -1461
- package/src/train/trainer.ts +0 -1221
- package/src/train/watch.ts +0 -542
- package/src/vision/diffusion-vision.ts +0 -620
- package/src/vision/embedder.ts +0 -176
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -409
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -233
- package/src/vision/qwen3vl-tower.ts +0 -566
- package/src/vision/siglip.ts +0 -607
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2155
- package/src/web/app.js +0 -5863
- package/src/web/skills/memory/SKILL.md +0 -120
- package/src/web/skills/web-research/SKILL.md +0 -46
- package/src/web/skills.ts +0 -97
- package/src/web/src/adapters-panel.ts +0 -288
- package/src/web/src/assistant.ts +0 -451
- package/src/web/src/chat.ts +0 -1060
- package/src/web/src/composer.ts +0 -962
- package/src/web/src/dataset.ts +0 -132
- package/src/web/src/finetune.ts +0 -267
- package/src/web/src/hub.ts +0 -428
- package/src/web/src/main.ts +0 -98
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +0 -572
- package/src/web/src/model-picker.ts +0 -159
- package/src/web/src/palette.ts +0 -346
- package/src/web/src/protocol.ts +0 -26
- package/src/web/src/quantize.ts +0 -167
- package/src/web/src/rag.ts +0 -274
- package/src/web/src/sessions.ts +0 -469
- package/src/web/src/shell.ts +0 -804
- package/src/web/src/ui-catalog.ts +0 -78
- package/src/web/src/voice.ts +0 -141
- package/src/web/vendor/README.md +0 -61
- package/src/web-assets.ts +0 -47
- package/src/web-tools.ts +0 -478
- package/src/weights.ts +0 -255
- /package/src/{serve → server}/completion-sink.ts +0 -0
- /package/src/{serve → server}/generated-token-history.ts +0 -0
- /package/src/web/{icon.svg → public/icon.svg} +0 -0
- /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
- /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
|
@@ -1,1461 +0,0 @@
|
|
|
1
|
-
/* eslint-disable */
|
|
2
|
-
// AUTO-PORTED VERBATIM from MLX quantized.h + steel/* (github.com/ml-explore/mlx).
|
|
3
|
-
export const STEEL_QMM_HEADER = String.raw`// mlx metal_kernel preamble provides METAL_FUNC + using namespace metal; we add
|
|
4
|
-
// the steel macros, type_traits + integral_constant (each self-manages its own
|
|
5
|
-
// #pragma METAL internals enable/disable), then the GEMM-specific structs.
|
|
6
|
-
#define STEEL_CONST static constant constexpr const
|
|
7
|
-
#define STEEL_PRAGMA_UNROLL _Pragma("clang loop unroll(full)")
|
|
8
|
-
#define STEEL_PRAGMA_NO_UNROLL _Pragma("clang loop unroll(disable)")
|
|
9
|
-
#define MLX_MTL_CONST static constant constexpr const
|
|
10
|
-
MLX_MTL_CONST int SIMD_SIZE = 32;
|
|
11
|
-
// ===== type_traits.h (self-managed internals pragma) =====
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
#pragma METAL internals : enable
|
|
16
|
-
|
|
17
|
-
namespace metal {
|
|
18
|
-
|
|
19
|
-
template <typename T>
|
|
20
|
-
struct is_empty : metal::bool_constant<__is_empty(T)> {};
|
|
21
|
-
|
|
22
|
-
#ifdef __cpp_variable_templates
|
|
23
|
-
template <typename T>
|
|
24
|
-
constexpr constant bool is_empty_v = is_empty<T>::value;
|
|
25
|
-
#endif
|
|
26
|
-
|
|
27
|
-
template <typename... Ts>
|
|
28
|
-
struct make_void {
|
|
29
|
-
typedef void type;
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
template <typename... Ts>
|
|
33
|
-
using void_t = typename make_void<Ts...>::type;
|
|
34
|
-
|
|
35
|
-
template <class T>
|
|
36
|
-
struct is_static : metal::bool_constant<is_empty<remove_cv_t<T>>::value> {};
|
|
37
|
-
|
|
38
|
-
template <typename T>
|
|
39
|
-
struct pointer_element {};
|
|
40
|
-
|
|
41
|
-
template <typename T>
|
|
42
|
-
struct pointer_element<thread T*> {
|
|
43
|
-
using type = remove_cv_t<T>;
|
|
44
|
-
};
|
|
45
|
-
template <typename T>
|
|
46
|
-
struct pointer_element<device T*> {
|
|
47
|
-
using type = remove_cv_t<T>;
|
|
48
|
-
};
|
|
49
|
-
template <typename T>
|
|
50
|
-
struct pointer_element<constant T*> {
|
|
51
|
-
using type = remove_cv_t<T>;
|
|
52
|
-
};
|
|
53
|
-
template <typename T>
|
|
54
|
-
struct pointer_element<threadgroup T*> {
|
|
55
|
-
using type = remove_cv_t<T>;
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
template <typename T>
|
|
59
|
-
using pointer_element_t = typename pointer_element<remove_cv_t<T>>::type;
|
|
60
|
-
|
|
61
|
-
} // namespace metal
|
|
62
|
-
|
|
63
|
-
#pragma METAL internals : disable// ===== integral_constant.h (self-managed internals pragma) =====
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
#pragma METAL internals : enable
|
|
68
|
-
|
|
69
|
-
namespace mlx {
|
|
70
|
-
namespace steel {
|
|
71
|
-
|
|
72
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
73
|
-
// Integral constant with casting
|
|
74
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
75
|
-
|
|
76
|
-
template <typename T, T v>
|
|
77
|
-
struct integral_constant {
|
|
78
|
-
static constexpr constant T value = v;
|
|
79
|
-
using value_type = T;
|
|
80
|
-
using type = integral_constant;
|
|
81
|
-
|
|
82
|
-
METAL_FUNC constexpr operator value_type() const noexcept {
|
|
83
|
-
return value;
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
template <bool B>
|
|
88
|
-
using bool_constant = integral_constant<bool, B>;
|
|
89
|
-
using true_type = bool_constant<true>;
|
|
90
|
-
using false_type = bool_constant<false>;
|
|
91
|
-
|
|
92
|
-
template <class T>
|
|
93
|
-
struct is_integral : bool_constant<metal::is_integral<T>::value> {};
|
|
94
|
-
|
|
95
|
-
template <class T, T v>
|
|
96
|
-
struct is_integral<integral_constant<T, v>>
|
|
97
|
-
: bool_constant<metal::is_integral<T>::value> {};
|
|
98
|
-
|
|
99
|
-
template <typename T>
|
|
100
|
-
constexpr constant bool is_integral_v = is_integral<T>::value;
|
|
101
|
-
|
|
102
|
-
template <int val>
|
|
103
|
-
using Int = integral_constant<int, val>;
|
|
104
|
-
|
|
105
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
106
|
-
// Binary Operators on Integral constants
|
|
107
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
108
|
-
|
|
109
|
-
#define integral_const_binop(__op__, __operator__) \
|
|
110
|
-
template <typename T, T tv, typename U, U uv> \
|
|
111
|
-
METAL_FUNC constexpr auto __operator__( \
|
|
112
|
-
integral_constant<T, tv>, integral_constant<U, uv>) { \
|
|
113
|
-
constexpr auto res = tv __op__ uv; \
|
|
114
|
-
return integral_constant<decltype(res), res>{}; \
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
integral_const_binop(+, operator+);
|
|
118
|
-
integral_const_binop(-, operator-);
|
|
119
|
-
integral_const_binop(*, operator*);
|
|
120
|
-
integral_const_binop(/, operator/);
|
|
121
|
-
|
|
122
|
-
integral_const_binop(==, operator==);
|
|
123
|
-
integral_const_binop(!=, operator!=);
|
|
124
|
-
integral_const_binop(<, operator<);
|
|
125
|
-
integral_const_binop(>, operator>);
|
|
126
|
-
integral_const_binop(<=, operator<=);
|
|
127
|
-
integral_const_binop(>=, operator>=);
|
|
128
|
-
|
|
129
|
-
integral_const_binop(&&, operator&&);
|
|
130
|
-
integral_const_binop(||, operator||);
|
|
131
|
-
|
|
132
|
-
template <typename T, typename = metal::enable_if_t<!is_integral_v<T>>>
|
|
133
|
-
METAL_FUNC constexpr auto operator||(true_type, T) {
|
|
134
|
-
return true_type{};
|
|
135
|
-
}
|
|
136
|
-
template <typename T, typename = metal::enable_if_t<!is_integral_v<T>>>
|
|
137
|
-
METAL_FUNC constexpr auto operator||(T, true_type) {
|
|
138
|
-
return true_type{};
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
template <typename T, typename = metal::enable_if_t<!is_integral_v<T>>>
|
|
142
|
-
METAL_FUNC constexpr auto operator&&(false_type, T) {
|
|
143
|
-
return false_type{};
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
template <typename T, typename = metal::enable_if_t<!is_integral_v<T>>>
|
|
147
|
-
METAL_FUNC constexpr auto operator&&(T, false_type) {
|
|
148
|
-
return false_type{};
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Dispatch utilities
|
|
152
|
-
template <typename F>
|
|
153
|
-
void dispatch_bool(bool v, F f) {
|
|
154
|
-
if (v) {
|
|
155
|
-
f(true_type{});
|
|
156
|
-
} else {
|
|
157
|
-
f(false_type{});
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
template <int start, int stop, int step, typename F>
|
|
162
|
-
constexpr void const_for_loop(F f) {
|
|
163
|
-
if constexpr (start < stop) {
|
|
164
|
-
constexpr auto idx = Int<start>{};
|
|
165
|
-
f(idx);
|
|
166
|
-
const_for_loop<start + step, stop, step, F>(f);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
#undef integral_const_binop
|
|
171
|
-
|
|
172
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
173
|
-
// Reduction operators
|
|
174
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
175
|
-
|
|
176
|
-
template <typename T>
|
|
177
|
-
METAL_FUNC constexpr T sum(T x) {
|
|
178
|
-
return x;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
template <typename T, typename... Us>
|
|
182
|
-
METAL_FUNC constexpr auto sum(T x, Us... us) {
|
|
183
|
-
return x + sum(us...);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
} // namespace steel
|
|
187
|
-
} // namespace mlx
|
|
188
|
-
|
|
189
|
-
#pragma METAL internals : disable
|
|
190
|
-
// ===== transforms.h =====
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
195
|
-
// Transforms and Epilogues
|
|
196
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
197
|
-
|
|
198
|
-
namespace mlx {
|
|
199
|
-
namespace steel {
|
|
200
|
-
|
|
201
|
-
template <typename OutT, typename InT>
|
|
202
|
-
struct TransformNone {
|
|
203
|
-
static METAL_FUNC OutT apply(InT x) {
|
|
204
|
-
return static_cast<OutT>(x);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
static METAL_FUNC OutT apply(InT x, OutT) {
|
|
208
|
-
return static_cast<OutT>(x);
|
|
209
|
-
}
|
|
210
|
-
};
|
|
211
|
-
|
|
212
|
-
template <typename OutT, typename InT>
|
|
213
|
-
struct TransformAdd {
|
|
214
|
-
TransformAdd(const float, const float) {}
|
|
215
|
-
|
|
216
|
-
static METAL_FUNC OutT apply(InT x) {
|
|
217
|
-
return static_cast<OutT>(x);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
static METAL_FUNC OutT apply(InT x, OutT c) {
|
|
221
|
-
return static_cast<OutT>(x) + c;
|
|
222
|
-
}
|
|
223
|
-
};
|
|
224
|
-
|
|
225
|
-
template <typename OutT, typename InT>
|
|
226
|
-
struct TransformAxpby {
|
|
227
|
-
const float alpha;
|
|
228
|
-
const float beta;
|
|
229
|
-
|
|
230
|
-
TransformAxpby(const float alpha_, const float beta_)
|
|
231
|
-
: alpha(alpha_), beta(beta_) {}
|
|
232
|
-
|
|
233
|
-
static METAL_FUNC OutT apply(InT x) {
|
|
234
|
-
return static_cast<OutT>(x);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
METAL_FUNC OutT apply(InT x, OutT c) const {
|
|
238
|
-
return static_cast<OutT>(
|
|
239
|
-
x * static_cast<InT>(alpha) + (static_cast<OutT>(beta) * c));
|
|
240
|
-
}
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
template <typename T>
|
|
244
|
-
struct AccumHelper {
|
|
245
|
-
typedef float accum_type;
|
|
246
|
-
};
|
|
247
|
-
|
|
248
|
-
struct BlockSwizzle {
|
|
249
|
-
static METAL_FUNC int2
|
|
250
|
-
swizzle(uint3 tid [[threadgroup_position_in_grid]], const int swizzle_log) {
|
|
251
|
-
const int tid_x = (tid.x) >> swizzle_log;
|
|
252
|
-
const int tid_y =
|
|
253
|
-
((tid.y) << swizzle_log) + ((tid.x) & ((1 << swizzle_log) - 1));
|
|
254
|
-
return int2(tid_x, tid_y);
|
|
255
|
-
}
|
|
256
|
-
};
|
|
257
|
-
|
|
258
|
-
} // namespace steel
|
|
259
|
-
} // namespace mlx// ===== quantized helpers =====
|
|
260
|
-
template <int bits, int wsize = 8>
|
|
261
|
-
inline constexpr short get_pack_factor() {
|
|
262
|
-
return (bits == 3 || bits == 5) ? 8 : (bits == 6 ? 4 : wsize / bits);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
template <int bits, int wsize = 8>
|
|
266
|
-
inline constexpr short get_bytes_per_pack() {
|
|
267
|
-
constexpr int power_of_2_bits = (bits & (bits - 1)) == 0;
|
|
268
|
-
return power_of_2_bits ? (wsize / 8) : (bits == 5 ? 5 : 3);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// ===== dequantize =====
|
|
272
|
-
template <typename U, int N, int bits>
|
|
273
|
-
inline void
|
|
274
|
-
dequantize(const device uint8_t* w, U scale, U bias, threadgroup U* w_local) {
|
|
275
|
-
static_assert(
|
|
276
|
-
bits == 2 || bits == 3 || bits == 4 || bits == 5 || bits == 6 ||
|
|
277
|
-
bits == 8,
|
|
278
|
-
"Template undefined for bits not in {2, 3, 4, 5, 6, 8}");
|
|
279
|
-
|
|
280
|
-
if (bits == 2) {
|
|
281
|
-
U s[4] = {
|
|
282
|
-
scale,
|
|
283
|
-
scale / static_cast<U>(4.0f),
|
|
284
|
-
scale / static_cast<U>(16.0f),
|
|
285
|
-
scale / static_cast<U>(64.0f)};
|
|
286
|
-
for (int i = 0; i < (N / 4); i++) {
|
|
287
|
-
w_local[4 * i] = s[0] * (w[i] & 0x03) + bias;
|
|
288
|
-
w_local[4 * i + 1] = s[1] * (w[i] & 0x0c) + bias;
|
|
289
|
-
w_local[4 * i + 2] = s[2] * (w[i] & 0x30) + bias;
|
|
290
|
-
w_local[4 * i + 3] = s[3] * (w[i] & 0xc0) + bias;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
else if (bits == 3) {
|
|
295
|
-
for (int i = 0; i < (N / 8); i++) {
|
|
296
|
-
w_local += 8 * i;
|
|
297
|
-
w += 3 * i;
|
|
298
|
-
|
|
299
|
-
w_local[0] = (w[0] & 0x7) * scale + bias;
|
|
300
|
-
w_local[1] = ((w[0] & 0x38) >> 3) * scale + bias;
|
|
301
|
-
w_local[2] = (((w[0] & 0xc0) >> 6) + ((w[1] & 0x1) << 2)) * scale + bias;
|
|
302
|
-
w_local[3] = ((w[1] & 0xe) >> 1) * scale + bias;
|
|
303
|
-
w_local[4] = ((w[1] & 0x70) >> 4) * scale + bias;
|
|
304
|
-
w_local[5] = (((w[1] & 0x80) >> 7) + ((w[2] & 0x3) << 1)) * scale + bias;
|
|
305
|
-
w_local[6] = ((w[2] & 0x1c) >> 2) * scale + bias;
|
|
306
|
-
w_local[7] = ((w[2] & 0xe0) >> 5) * scale + bias;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
else if (bits == 4) {
|
|
311
|
-
U s[2] = {scale, scale / static_cast<U>(16.0f)};
|
|
312
|
-
for (int i = 0; i < (N / 2); i++) {
|
|
313
|
-
w_local[2 * i] = s[0] * (w[i] & 0x0f) + bias;
|
|
314
|
-
w_local[2 * i + 1] = s[1] * (w[i] & 0xf0) + bias;
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
else if (bits == 5) {
|
|
319
|
-
for (int i = 0; i < (N / 8); i++) {
|
|
320
|
-
w_local += 8 * i;
|
|
321
|
-
w += 5 * i;
|
|
322
|
-
|
|
323
|
-
w_local[0] = (w[0] & 0x1f) * scale + bias;
|
|
324
|
-
w_local[1] = (((w[0] & 0xe0) >> 5) + ((w[1] & 0x3) << 3)) * scale + bias;
|
|
325
|
-
w_local[2] = ((w[1] & 0x7c) >> 2) * scale + bias;
|
|
326
|
-
w_local[3] = (((w[1] & 0x80) >> 7) + ((w[2] & 0xf) << 1)) * scale + bias;
|
|
327
|
-
w_local[4] = (((w[2] & 0xf0) >> 4) + ((w[3] & 0x1) << 4)) * scale + bias;
|
|
328
|
-
w_local[5] = ((w[3] & 0x3e) >> 1) * scale + bias;
|
|
329
|
-
w_local[6] = (((w[3] & 0xc0) >> 6) + ((w[4] & 0x7) << 2)) * scale + bias;
|
|
330
|
-
w_local[7] = ((w[4] & 0xf8) >> 3) * scale + bias;
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
else if (bits == 6) {
|
|
335
|
-
for (int i = 0; i < (N / 4); i++) {
|
|
336
|
-
w_local += 4 * i;
|
|
337
|
-
w += 3 * i;
|
|
338
|
-
w_local[0] = (w[0] & 0x3f) * scale + bias;
|
|
339
|
-
w_local[1] = (((w[0] >> 6) & 0x03) + ((w[1] & 0x0f) << 2)) * scale + bias;
|
|
340
|
-
w_local[2] = (((w[1] >> 4) & 0x0f) + ((w[2] & 0x03) << 4)) * scale + bias;
|
|
341
|
-
w_local[3] = ((w[2] >> 2) & 0x3f) * scale + bias;
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
else if (bits == 8) {
|
|
346
|
-
for (int i = 0; i < N; i++) {
|
|
347
|
-
w_local[i] = scale * w[i] + bias;
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
// ===== QuantizedBlockLoader =====
|
|
353
|
-
template <
|
|
354
|
-
typename T,
|
|
355
|
-
short BROWS,
|
|
356
|
-
short BCOLS,
|
|
357
|
-
short dst_ld,
|
|
358
|
-
short reduction_dim,
|
|
359
|
-
short tgp_size,
|
|
360
|
-
short group_size,
|
|
361
|
-
short bits>
|
|
362
|
-
struct QuantizedBlockLoader {
|
|
363
|
-
static_assert(
|
|
364
|
-
BCOLS <= group_size,
|
|
365
|
-
"The group size should be larger than the columns");
|
|
366
|
-
static_assert(
|
|
367
|
-
group_size % BCOLS == 0,
|
|
368
|
-
"The group size should be divisible by the columns");
|
|
369
|
-
static_assert(
|
|
370
|
-
bits == 2 || bits == 3 || bits == 4 || bits == 5 || bits == 6 ||
|
|
371
|
-
bits == 8,
|
|
372
|
-
"Template undefined for bits not in {2, 3, 4, 5, 6, 8}");
|
|
373
|
-
|
|
374
|
-
MLX_MTL_CONST short pack_factor = get_pack_factor<bits, 8>();
|
|
375
|
-
MLX_MTL_CONST short bytes_per_pack = get_bytes_per_pack<bits>();
|
|
376
|
-
MLX_MTL_CONST short BCOLS_PACKED = BCOLS / pack_factor;
|
|
377
|
-
MLX_MTL_CONST short n_reads =
|
|
378
|
-
(BCOLS_PACKED * BROWS < tgp_size) ? 1 : (BCOLS_PACKED * BROWS) / tgp_size;
|
|
379
|
-
MLX_MTL_CONST short group_steps = group_size / BCOLS;
|
|
380
|
-
|
|
381
|
-
const int src_ld;
|
|
382
|
-
const int tile_stride;
|
|
383
|
-
short group_step_cnt;
|
|
384
|
-
const int group_stride;
|
|
385
|
-
|
|
386
|
-
const short thread_idx;
|
|
387
|
-
const short bi;
|
|
388
|
-
const short bj;
|
|
389
|
-
|
|
390
|
-
threadgroup T* dst;
|
|
391
|
-
const device uint8_t* src;
|
|
392
|
-
const device T* scales;
|
|
393
|
-
const device T* biases;
|
|
394
|
-
|
|
395
|
-
QuantizedBlockLoader(
|
|
396
|
-
const device uint8_t* src_,
|
|
397
|
-
const device T* scales_,
|
|
398
|
-
const device T* biases_,
|
|
399
|
-
const int src_ld_,
|
|
400
|
-
threadgroup T* dst_,
|
|
401
|
-
ushort simd_group_id [[simdgroup_index_in_threadgroup]],
|
|
402
|
-
ushort simd_lane_id [[thread_index_in_simdgroup]])
|
|
403
|
-
: src_ld(src_ld_),
|
|
404
|
-
tile_stride(
|
|
405
|
-
reduction_dim ? BCOLS_PACKED * bytes_per_pack
|
|
406
|
-
: BROWS * src_ld * bytes_per_pack / pack_factor),
|
|
407
|
-
group_step_cnt(0),
|
|
408
|
-
group_stride(BROWS * src_ld / group_size),
|
|
409
|
-
thread_idx(simd_group_id * 32 + simd_lane_id),
|
|
410
|
-
bi(n_reads * thread_idx / BCOLS_PACKED),
|
|
411
|
-
bj((n_reads * thread_idx) % BCOLS_PACKED),
|
|
412
|
-
dst(dst_ + bi * dst_ld + bj * pack_factor),
|
|
413
|
-
src(src_ + bi * src_ld * bytes_per_pack / pack_factor +
|
|
414
|
-
bj * bytes_per_pack),
|
|
415
|
-
scales(scales_ + bi * src_ld / group_size),
|
|
416
|
-
biases(biases_ + bi * src_ld / group_size) {}
|
|
417
|
-
|
|
418
|
-
void load_unsafe() const {
|
|
419
|
-
if (BCOLS_PACKED * BROWS < tgp_size && bi >= BROWS) {
|
|
420
|
-
return;
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
T scale = *scales;
|
|
424
|
-
T bias = *biases;
|
|
425
|
-
for (int i = 0; i < n_reads; i++) {
|
|
426
|
-
dequantize<T, pack_factor, bits>(
|
|
427
|
-
src + i * bytes_per_pack, scale, bias, dst + i * pack_factor);
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
void load_safe(short2 src_tile_dim) const {
|
|
432
|
-
if (BCOLS_PACKED * BROWS < tgp_size && bi >= BROWS) {
|
|
433
|
-
return;
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
if (reduction_dim == 1 && bi >= src_tile_dim.x) {
|
|
437
|
-
for (int i = 0; i < n_reads * pack_factor; i++) {
|
|
438
|
-
dst[i] = T(0);
|
|
439
|
-
}
|
|
440
|
-
return;
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
if (reduction_dim == 0 && bi >= src_tile_dim.y) {
|
|
444
|
-
for (int i = 0; i < n_reads * pack_factor; i++) {
|
|
445
|
-
dst[i] = T(0);
|
|
446
|
-
}
|
|
447
|
-
return;
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
T scale = *scales;
|
|
451
|
-
T bias = *biases;
|
|
452
|
-
for (int i = 0; i < n_reads; i++) {
|
|
453
|
-
dequantize<T, pack_factor, bits>(
|
|
454
|
-
(device uint8_t*)(src + i * bytes_per_pack),
|
|
455
|
-
scale,
|
|
456
|
-
bias,
|
|
457
|
-
dst + i * pack_factor);
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
void next() {
|
|
462
|
-
src += tile_stride;
|
|
463
|
-
if (reduction_dim == 1) {
|
|
464
|
-
if (group_steps > 1) {
|
|
465
|
-
group_step_cnt++;
|
|
466
|
-
if (group_step_cnt == group_steps) {
|
|
467
|
-
group_step_cnt = 0;
|
|
468
|
-
scales++;
|
|
469
|
-
biases++;
|
|
470
|
-
}
|
|
471
|
-
} else {
|
|
472
|
-
scales++;
|
|
473
|
-
biases++;
|
|
474
|
-
}
|
|
475
|
-
} else {
|
|
476
|
-
scales += group_stride;
|
|
477
|
-
biases += group_stride;
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
};
|
|
481
|
-
// ===== BlockLoader (loader.h) =====
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
486
|
-
// Loading helper
|
|
487
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
488
|
-
|
|
489
|
-
namespace mlx {
|
|
490
|
-
namespace steel {
|
|
491
|
-
|
|
492
|
-
template <
|
|
493
|
-
typename T,
|
|
494
|
-
short BROWS,
|
|
495
|
-
short BCOLS,
|
|
496
|
-
short dst_ld,
|
|
497
|
-
short reduction_dim,
|
|
498
|
-
short tgp_size,
|
|
499
|
-
short alignment = 1,
|
|
500
|
-
short n_reads = (BCOLS * BROWS) / (tgp_size),
|
|
501
|
-
short TCOLS = BCOLS / n_reads,
|
|
502
|
-
short TROWS = tgp_size / TCOLS>
|
|
503
|
-
struct BlockLoader {
|
|
504
|
-
STEEL_CONST short n_rows = (BROWS + TROWS - 1) / TROWS;
|
|
505
|
-
STEEL_CONST short vec_size = n_reads;
|
|
506
|
-
|
|
507
|
-
// Leading dimension for src
|
|
508
|
-
const int src_ld;
|
|
509
|
-
const int tile_stride;
|
|
510
|
-
|
|
511
|
-
// Thread location indices
|
|
512
|
-
const short thread_idx;
|
|
513
|
-
const short bi;
|
|
514
|
-
const short bj;
|
|
515
|
-
|
|
516
|
-
// threadgroup and device memory
|
|
517
|
-
threadgroup T* dst;
|
|
518
|
-
const device T* src;
|
|
519
|
-
|
|
520
|
-
struct alignas(alignment * sizeof(T)) ReadVector {
|
|
521
|
-
uint8_t v[sizeof(T) * vec_size];
|
|
522
|
-
};
|
|
523
|
-
|
|
524
|
-
/* Constructor */
|
|
525
|
-
METAL_FUNC BlockLoader(
|
|
526
|
-
const device T* src_,
|
|
527
|
-
const int src_ld_,
|
|
528
|
-
threadgroup T* dst_,
|
|
529
|
-
ushort simd_group_id [[simdgroup_index_in_threadgroup]],
|
|
530
|
-
ushort simd_lane_id [[thread_index_in_simdgroup]])
|
|
531
|
-
: src_ld(src_ld_),
|
|
532
|
-
tile_stride(reduction_dim ? BCOLS : BROWS * src_ld),
|
|
533
|
-
thread_idx(simd_group_id * 32 + simd_lane_id),
|
|
534
|
-
bi(thread_idx / TCOLS),
|
|
535
|
-
bj(vec_size * (thread_idx % TCOLS)),
|
|
536
|
-
dst(dst_ + bi * dst_ld + bj),
|
|
537
|
-
src(src_ + bi * src_ld + bj) {}
|
|
538
|
-
|
|
539
|
-
/* Apply operation to threadgroup without bound checking */
|
|
540
|
-
template <typename UnaryOp>
|
|
541
|
-
METAL_FUNC void apply_inplace_op(thread const UnaryOp& op) const {
|
|
542
|
-
STEEL_PRAGMA_UNROLL
|
|
543
|
-
for (short i = 0; i < BROWS; i += TROWS) {
|
|
544
|
-
STEEL_PRAGMA_UNROLL
|
|
545
|
-
for (short j = 0; j < vec_size; j++) {
|
|
546
|
-
dst[i * dst_ld + j] = op.apply(dst[i * dst_ld + j]);
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
/* Load from device memory into threadgroup memory - without bound checking */
|
|
552
|
-
METAL_FUNC void load_unsafe() const {
|
|
553
|
-
STEEL_PRAGMA_UNROLL
|
|
554
|
-
for (short i = 0; i < BROWS; i += TROWS) {
|
|
555
|
-
*((threadgroup ReadVector*)(&dst[i * dst_ld])) =
|
|
556
|
-
*((const device ReadVector*)(&src[i * src_ld]));
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
/* Load from device memory into threadgroup memory - with bound checking */
|
|
561
|
-
METAL_FUNC void load_safe(short2 src_tile_dim) const {
|
|
562
|
-
src_tile_dim = src_tile_dim - short2(bj, bi);
|
|
563
|
-
|
|
564
|
-
// Skip loading if thread has no valid reads
|
|
565
|
-
if (src_tile_dim.x <= 0 || src_tile_dim.y <= 0) {
|
|
566
|
-
STEEL_PRAGMA_UNROLL
|
|
567
|
-
for (short i = 0; i < BROWS; i += TROWS) {
|
|
568
|
-
STEEL_PRAGMA_UNROLL
|
|
569
|
-
for (short j = 0; j < vec_size; j++) {
|
|
570
|
-
dst[i * dst_ld + j] = T(0);
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
return;
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
// Use fast thread memory for bound checks
|
|
577
|
-
bool tmp_idx[vec_size];
|
|
578
|
-
T tmp_val[vec_size];
|
|
579
|
-
|
|
580
|
-
STEEL_PRAGMA_UNROLL
|
|
581
|
-
for (short i = 0; i < BROWS; i += TROWS) {
|
|
582
|
-
// Make sure tmp_idx only contains valid indices
|
|
583
|
-
STEEL_PRAGMA_UNROLL
|
|
584
|
-
for (short j = 0; j < vec_size; j++) {
|
|
585
|
-
tmp_idx[j] = (i < src_tile_dim.y) && (j < src_tile_dim.x);
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
// Read valid indices into tmp_val
|
|
589
|
-
STEEL_PRAGMA_UNROLL
|
|
590
|
-
for (short j = 0; j < vec_size; j++) {
|
|
591
|
-
tmp_val[j] = src[(tmp_idx[j] ? i * src_ld + j : 0)];
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
// Zero out unneeded values
|
|
595
|
-
STEEL_PRAGMA_UNROLL
|
|
596
|
-
for (short j = 0; j < vec_size; j++) {
|
|
597
|
-
tmp_val[j] = tmp_idx[j] ? tmp_val[j] : T(0);
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
// Copy values to threadgroup memory
|
|
601
|
-
STEEL_PRAGMA_UNROLL
|
|
602
|
-
for (short j = 0; j < vec_size; j++) {
|
|
603
|
-
dst[i * dst_ld + j] = tmp_val[j];
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
/* Iteration helper */
|
|
609
|
-
METAL_FUNC void next() {
|
|
610
|
-
src += tile_stride;
|
|
611
|
-
}
|
|
612
|
-
};
|
|
613
|
-
|
|
614
|
-
} // namespace steel
|
|
615
|
-
} // namespace mlx
|
|
616
|
-
// ===== mma.h (BaseMMAFrag/MMATile/tile_matmad) =====
|
|
617
|
-
namespace mlx {
|
|
618
|
-
namespace steel {
|
|
619
|
-
|
|
620
|
-
template <typename T, int kFragRows_, int kFragCols_>
|
|
621
|
-
struct BaseMMAFrag {
|
|
622
|
-
static_assert(
|
|
623
|
-
kFragRows_ == 8,
|
|
624
|
-
"Only 8 x 8 fragment matrices are currently supported");
|
|
625
|
-
static_assert(
|
|
626
|
-
kFragCols_ == 8,
|
|
627
|
-
"Only 8 x 8 fragment matrices are currently supported");
|
|
628
|
-
};
|
|
629
|
-
|
|
630
|
-
template <typename T>
|
|
631
|
-
struct BaseMMAFrag<T, 8, 8> {
|
|
632
|
-
STEEL_CONST int kFragRows = 8;
|
|
633
|
-
STEEL_CONST int kFragCols = 8;
|
|
634
|
-
|
|
635
|
-
STEEL_CONST int kElemsPerFrag = (kFragRows * kFragCols) / 32;
|
|
636
|
-
|
|
637
|
-
STEEL_CONST int kElemRows = 1;
|
|
638
|
-
STEEL_CONST int kElemCols = 2;
|
|
639
|
-
|
|
640
|
-
static_assert(
|
|
641
|
-
kElemRows * kElemCols == kElemsPerFrag,
|
|
642
|
-
"MMAFrag shape is not consistent with MMAFrag size");
|
|
643
|
-
|
|
644
|
-
typedef metal::simdgroup_matrix<T, kFragRows, kFragCols> mat_type;
|
|
645
|
-
typedef metal::vec<T, kElemsPerFrag> frag_type;
|
|
646
|
-
|
|
647
|
-
METAL_FUNC static constexpr short2 get_coord(
|
|
648
|
-
ushort simd_lane_id [[thread_index_in_simdgroup]]) {
|
|
649
|
-
const short qid = simd_lane_id / 4;
|
|
650
|
-
const short fm = (qid & 4) + ((simd_lane_id / 2) % 4);
|
|
651
|
-
const short fn = (qid & 2) * 2 + (simd_lane_id % 2) * 2;
|
|
652
|
-
return short2{fn, fm};
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
template <typename SrcPtrType, typename StrX, typename StrY>
|
|
656
|
-
METAL_FUNC static constexpr void
|
|
657
|
-
load(thread frag_type& dst, SrcPtrType src, StrX str_x, StrY str_y) {
|
|
658
|
-
STEEL_PRAGMA_UNROLL
|
|
659
|
-
for (short i = 0; i < kElemRows; i++) {
|
|
660
|
-
STEEL_PRAGMA_UNROLL
|
|
661
|
-
for (short j = 0; j < kElemCols; j++) {
|
|
662
|
-
dst[i * kElemCols + j] = static_cast<T>(src[i * str_x + j * str_y]);
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
template <
|
|
668
|
-
typename SrcPtrType,
|
|
669
|
-
typename StrX,
|
|
670
|
-
typename StrY,
|
|
671
|
-
typename LimX,
|
|
672
|
-
typename LimY,
|
|
673
|
-
typename OffX,
|
|
674
|
-
typename OffY>
|
|
675
|
-
METAL_FUNC static constexpr void load_safe(
|
|
676
|
-
thread frag_type& dst,
|
|
677
|
-
SrcPtrType src,
|
|
678
|
-
StrX str_x,
|
|
679
|
-
StrY str_y,
|
|
680
|
-
LimX lim_x,
|
|
681
|
-
LimY lim_y,
|
|
682
|
-
OffX off_x = Int<0>{},
|
|
683
|
-
OffY off_y = Int<0>{}) {
|
|
684
|
-
STEEL_PRAGMA_UNROLL
|
|
685
|
-
for (short i = 0; i < kElemRows; i++) {
|
|
686
|
-
STEEL_PRAGMA_UNROLL
|
|
687
|
-
for (short j = 0; j < kElemCols; j++) {
|
|
688
|
-
if ((off_x + i) < lim_x && (off_y + j) < lim_y) {
|
|
689
|
-
dst[i * kElemCols + j] =
|
|
690
|
-
static_cast<T>(src[(off_x + i) * str_x + (off_y + j) * str_y]);
|
|
691
|
-
} else {
|
|
692
|
-
dst[i * kElemCols + j] = T(0);
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
template <typename DstPtrType, typename StrX, typename StrY>
|
|
699
|
-
METAL_FUNC static constexpr void
|
|
700
|
-
store(const thread frag_type& src, DstPtrType dst, StrX str_x, StrY str_y) {
|
|
701
|
-
using U = pointer_element_t<DstPtrType>;
|
|
702
|
-
|
|
703
|
-
STEEL_PRAGMA_UNROLL
|
|
704
|
-
for (short i = 0; i < kElemRows; i++) {
|
|
705
|
-
STEEL_PRAGMA_UNROLL
|
|
706
|
-
for (short j = 0; j < kElemCols; j++) {
|
|
707
|
-
dst[i * str_x + j * str_y] = static_cast<U>(src[i * kElemCols + j]);
|
|
708
|
-
}
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
|
|
712
|
-
template <
|
|
713
|
-
typename DstPtrType,
|
|
714
|
-
typename StrX,
|
|
715
|
-
typename StrY,
|
|
716
|
-
typename LimX,
|
|
717
|
-
typename LimY,
|
|
718
|
-
typename OffX,
|
|
719
|
-
typename OffY>
|
|
720
|
-
METAL_FUNC static constexpr void store_safe(
|
|
721
|
-
const thread frag_type& src,
|
|
722
|
-
DstPtrType dst,
|
|
723
|
-
StrX str_x,
|
|
724
|
-
StrY str_y,
|
|
725
|
-
LimX lim_x,
|
|
726
|
-
LimY lim_y,
|
|
727
|
-
OffX off_x = Int<0>{},
|
|
728
|
-
OffY off_y = Int<0>{}) {
|
|
729
|
-
using U = pointer_element_t<DstPtrType>;
|
|
730
|
-
|
|
731
|
-
STEEL_PRAGMA_UNROLL
|
|
732
|
-
for (short i = 0; i < kElemRows; i++) {
|
|
733
|
-
STEEL_PRAGMA_UNROLL
|
|
734
|
-
for (short j = 0; j < kElemCols; j++) {
|
|
735
|
-
if ((off_x + i) < lim_x && (off_y + j) < lim_y) {
|
|
736
|
-
dst[(off_x + i) * str_x + (off_y + j) * str_y] =
|
|
737
|
-
static_cast<U>(src[i * kElemCols + j]);
|
|
738
|
-
}
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
|
|
743
|
-
template <
|
|
744
|
-
typename DstPtrType,
|
|
745
|
-
typename StrX,
|
|
746
|
-
typename StrY,
|
|
747
|
-
typename StartX,
|
|
748
|
-
typename StopX,
|
|
749
|
-
typename StartY,
|
|
750
|
-
typename StopY,
|
|
751
|
-
typename OffX,
|
|
752
|
-
typename OffY>
|
|
753
|
-
METAL_FUNC static constexpr void store_slice(
|
|
754
|
-
const thread frag_type& src,
|
|
755
|
-
DstPtrType dst,
|
|
756
|
-
StrX str_x,
|
|
757
|
-
StrY str_y,
|
|
758
|
-
StartX start_x,
|
|
759
|
-
StopX stop_x,
|
|
760
|
-
StartY start_y,
|
|
761
|
-
StopY stop_y,
|
|
762
|
-
OffX off_x = Int<0>{},
|
|
763
|
-
OffY off_y = Int<0>{}) {
|
|
764
|
-
using U = pointer_element_t<DstPtrType>;
|
|
765
|
-
|
|
766
|
-
STEEL_PRAGMA_UNROLL
|
|
767
|
-
for (short i = 0; i < kElemRows; i++) {
|
|
768
|
-
STEEL_PRAGMA_UNROLL
|
|
769
|
-
for (short j = 0; j < kElemCols; j++) {
|
|
770
|
-
if ((off_x + i) < stop_x && (off_x + i) >= start_x &&
|
|
771
|
-
(off_y + j) < stop_y && (off_y + j) >= start_y) {
|
|
772
|
-
dst[(off_x + i) * str_x + (off_y + j) * str_y] =
|
|
773
|
-
static_cast<U>(src[i * kElemCols + j]);
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
|
|
779
|
-
METAL_FUNC static constexpr void mma(
|
|
780
|
-
thread frag_type& D,
|
|
781
|
-
thread frag_type& A,
|
|
782
|
-
thread frag_type& B,
|
|
783
|
-
thread frag_type& C) {
|
|
784
|
-
mat_type D_mat;
|
|
785
|
-
mat_type A_mat;
|
|
786
|
-
mat_type B_mat;
|
|
787
|
-
mat_type C_mat;
|
|
788
|
-
|
|
789
|
-
reinterpret_cast<thread frag_type&>(A_mat.thread_elements()) = A;
|
|
790
|
-
reinterpret_cast<thread frag_type&>(B_mat.thread_elements()) = B;
|
|
791
|
-
reinterpret_cast<thread frag_type&>(C_mat.thread_elements()) = C;
|
|
792
|
-
|
|
793
|
-
mma(D_mat, A_mat, B_mat, C_mat);
|
|
794
|
-
|
|
795
|
-
D = reinterpret_cast<thread frag_type&>(D_mat.thread_elements());
|
|
796
|
-
}
|
|
797
|
-
|
|
798
|
-
METAL_FUNC static constexpr void mma(
|
|
799
|
-
thread mat_type& D,
|
|
800
|
-
thread mat_type& A,
|
|
801
|
-
thread mat_type& B,
|
|
802
|
-
thread mat_type& C) {
|
|
803
|
-
simdgroup_multiply_accumulate(D, A, B, C);
|
|
804
|
-
}
|
|
805
|
-
};
|
|
806
|
-
|
|
807
|
-
template <
|
|
808
|
-
typename T,
|
|
809
|
-
int kTileRows_,
|
|
810
|
-
int kTileCols_,
|
|
811
|
-
class MMAFrag_ = BaseMMAFrag<T, 8, 8>>
|
|
812
|
-
struct MMATile {
|
|
813
|
-
using MMAFrag_t = MMAFrag_;
|
|
814
|
-
using elem_type = T;
|
|
815
|
-
STEEL_CONST int kFragRows = MMAFrag_t::kFragRows;
|
|
816
|
-
STEEL_CONST int kFragCols = MMAFrag_t::kFragCols;
|
|
817
|
-
STEEL_CONST int kElemsPerFrag = MMAFrag_t::kElemsPerFrag;
|
|
818
|
-
|
|
819
|
-
STEEL_CONST int kTileRows = kTileRows_;
|
|
820
|
-
STEEL_CONST int kTileCols = kTileCols_;
|
|
821
|
-
|
|
822
|
-
STEEL_CONST int kRows = kTileRows * kFragRows;
|
|
823
|
-
STEEL_CONST int kCols = kTileCols * kFragCols;
|
|
824
|
-
|
|
825
|
-
STEEL_CONST int kNumFrags = kTileRows * kTileCols;
|
|
826
|
-
STEEL_CONST int kElemsPerTile = kNumFrags * kElemsPerFrag;
|
|
827
|
-
|
|
828
|
-
typedef typename MMAFrag_t::mat_type mat_type;
|
|
829
|
-
typedef typename MMAFrag_t::frag_type frag_type;
|
|
830
|
-
|
|
831
|
-
frag_type val_frags[kNumFrags] = {frag_type(0)};
|
|
832
|
-
|
|
833
|
-
METAL_FUNC MMATile() thread {}
|
|
834
|
-
|
|
835
|
-
METAL_FUNC constexpr void clear() {
|
|
836
|
-
STEEL_PRAGMA_UNROLL
|
|
837
|
-
for (short i = 0; i < kNumFrags; ++i) {
|
|
838
|
-
val_frags[i] = frag_type(0);
|
|
839
|
-
}
|
|
840
|
-
}
|
|
841
|
-
|
|
842
|
-
METAL_FUNC constexpr thread frag_type& frag_at(const short i, const short j) {
|
|
843
|
-
return val_frags[i * kTileCols + j];
|
|
844
|
-
}
|
|
845
|
-
|
|
846
|
-
METAL_FUNC constexpr const thread frag_type& frag_at(
|
|
847
|
-
const short i,
|
|
848
|
-
const short j) const {
|
|
849
|
-
return val_frags[i * kTileCols + j];
|
|
850
|
-
}
|
|
851
|
-
|
|
852
|
-
METAL_FUNC mat_type mat_at(const short i, const short j) {
|
|
853
|
-
mat_type val_mat;
|
|
854
|
-
STEEL_PRAGMA_UNROLL
|
|
855
|
-
for (short ii = 0; ii < kElemsPerFrag; ++ii) {
|
|
856
|
-
val_mat.thread_elements()[ii] = frag_at(i, j)[ii];
|
|
857
|
-
}
|
|
858
|
-
return val_mat;
|
|
859
|
-
}
|
|
860
|
-
|
|
861
|
-
METAL_FUNC thread elem_type* elems() {
|
|
862
|
-
return reinterpret_cast<thread elem_type*>(val_frags);
|
|
863
|
-
}
|
|
864
|
-
|
|
865
|
-
METAL_FUNC const thread elem_type* elems() const {
|
|
866
|
-
return reinterpret_cast<const thread elem_type*>(val_frags);
|
|
867
|
-
}
|
|
868
|
-
|
|
869
|
-
template <typename U, int w_x, int w_y, int str_x, int str_y>
|
|
870
|
-
METAL_FUNC void load(const threadgroup U* src) {
|
|
871
|
-
STEEL_PRAGMA_UNROLL
|
|
872
|
-
for (short i = 0; i < kTileRows; ++i) {
|
|
873
|
-
STEEL_PRAGMA_UNROLL
|
|
874
|
-
for (short j = 0; j < kTileCols; ++j) {
|
|
875
|
-
MMAFrag_t::load(
|
|
876
|
-
frag_at(i, j),
|
|
877
|
-
&(
|
|
878
|
-
src[(i * kFragRows) * w_x * str_x +
|
|
879
|
-
(j * kFragCols) * w_y * str_y]),
|
|
880
|
-
Int<str_x>{},
|
|
881
|
-
Int<str_y>{});
|
|
882
|
-
}
|
|
883
|
-
}
|
|
884
|
-
}
|
|
885
|
-
|
|
886
|
-
template <typename U, int w_x, int w_y, int str_x, int str_y>
|
|
887
|
-
METAL_FUNC void store(threadgroup U* dst) const {
|
|
888
|
-
STEEL_PRAGMA_UNROLL
|
|
889
|
-
for (short i = 0; i < kTileRows; ++i) {
|
|
890
|
-
STEEL_PRAGMA_UNROLL
|
|
891
|
-
for (short j = 0; j < kTileCols; ++j) {
|
|
892
|
-
MMAFrag_t::store(
|
|
893
|
-
frag_at(i, j),
|
|
894
|
-
&(
|
|
895
|
-
dst[(i * kFragRows) * w_x * str_x +
|
|
896
|
-
(j * kFragCols) * w_y * str_y]),
|
|
897
|
-
Int<str_x>{},
|
|
898
|
-
Int<str_y>{});
|
|
899
|
-
}
|
|
900
|
-
}
|
|
901
|
-
}
|
|
902
|
-
|
|
903
|
-
template <typename U, int w_x, int w_y>
|
|
904
|
-
METAL_FUNC void load(const device U* src, const int ld) {
|
|
905
|
-
STEEL_PRAGMA_UNROLL
|
|
906
|
-
for (short i = 0; i < kTileRows; ++i) {
|
|
907
|
-
STEEL_PRAGMA_UNROLL
|
|
908
|
-
for (short j = 0; j < kTileCols; ++j) {
|
|
909
|
-
MMAFrag_t::load(
|
|
910
|
-
frag_at(i, j),
|
|
911
|
-
&(src[(i * kFragRows) * w_x * ld + (j * kFragCols) * w_y]),
|
|
912
|
-
ld,
|
|
913
|
-
Int<1>{});
|
|
914
|
-
}
|
|
915
|
-
}
|
|
916
|
-
}
|
|
917
|
-
|
|
918
|
-
template <typename U, int w_x, int w_y>
|
|
919
|
-
METAL_FUNC void store(device U* dst, const int ld) const {
|
|
920
|
-
STEEL_PRAGMA_UNROLL
|
|
921
|
-
for (short i = 0; i < kTileRows; ++i) {
|
|
922
|
-
STEEL_PRAGMA_UNROLL
|
|
923
|
-
for (short j = 0; j < kTileCols; ++j) {
|
|
924
|
-
MMAFrag_t::store(
|
|
925
|
-
frag_at(i, j),
|
|
926
|
-
&(dst[(i * kFragRows) * w_x * ld + (j * kFragCols) * w_y]),
|
|
927
|
-
ld,
|
|
928
|
-
Int<1>{});
|
|
929
|
-
}
|
|
930
|
-
}
|
|
931
|
-
}
|
|
932
|
-
|
|
933
|
-
template <typename U, int w_x, int w_y>
|
|
934
|
-
METAL_FUNC void
|
|
935
|
-
load_safe(const device U* src, const int ld, const short2 src_tile_dims) {
|
|
936
|
-
STEEL_PRAGMA_UNROLL
|
|
937
|
-
for (int i = 0; i < kTileRows; ++i) {
|
|
938
|
-
STEEL_PRAGMA_UNROLL
|
|
939
|
-
for (int j = 0; j < kTileCols; ++j) {
|
|
940
|
-
MMAFrag_t::load_safe(
|
|
941
|
-
frag_at(i, j),
|
|
942
|
-
src,
|
|
943
|
-
ld,
|
|
944
|
-
Int<1>{},
|
|
945
|
-
src_tile_dims.y,
|
|
946
|
-
src_tile_dims.x,
|
|
947
|
-
(i * kFragRows) * w_x,
|
|
948
|
-
(j * kFragCols) * w_y);
|
|
949
|
-
}
|
|
950
|
-
}
|
|
951
|
-
}
|
|
952
|
-
|
|
953
|
-
template <typename U, int w_x, int w_y>
|
|
954
|
-
METAL_FUNC void
|
|
955
|
-
store_safe(device U* dst, const int ld, const short2 dst_tile_dims) const {
|
|
956
|
-
STEEL_PRAGMA_UNROLL
|
|
957
|
-
for (int i = 0; i < kTileRows; ++i) {
|
|
958
|
-
STEEL_PRAGMA_UNROLL
|
|
959
|
-
for (int j = 0; j < kTileCols; ++j) {
|
|
960
|
-
MMAFrag_t::store_safe(
|
|
961
|
-
frag_at(i, j),
|
|
962
|
-
dst,
|
|
963
|
-
ld,
|
|
964
|
-
Int<1>{},
|
|
965
|
-
dst_tile_dims.y,
|
|
966
|
-
dst_tile_dims.x,
|
|
967
|
-
(i * kFragRows) * w_x,
|
|
968
|
-
(j * kFragCols) * w_y);
|
|
969
|
-
}
|
|
970
|
-
}
|
|
971
|
-
}
|
|
972
|
-
|
|
973
|
-
template <typename U, int w_x, int w_y>
|
|
974
|
-
METAL_FUNC void store_slice(
|
|
975
|
-
device U* dst,
|
|
976
|
-
const int ld,
|
|
977
|
-
const short2 start,
|
|
978
|
-
const short2 stop) const {
|
|
979
|
-
STEEL_PRAGMA_UNROLL
|
|
980
|
-
for (int i = 0; i < kTileRows; ++i) {
|
|
981
|
-
STEEL_PRAGMA_UNROLL
|
|
982
|
-
for (int j = 0; j < kTileCols; ++j) {
|
|
983
|
-
MMAFrag_t::store_slice(
|
|
984
|
-
frag_at(i, j),
|
|
985
|
-
dst,
|
|
986
|
-
ld,
|
|
987
|
-
Int<1>{},
|
|
988
|
-
start.y,
|
|
989
|
-
stop.y,
|
|
990
|
-
start.x,
|
|
991
|
-
stop.x,
|
|
992
|
-
(i * kFragRows) * w_x,
|
|
993
|
-
(j * kFragCols) * w_y);
|
|
994
|
-
}
|
|
995
|
-
}
|
|
996
|
-
}
|
|
997
|
-
};
|
|
998
|
-
|
|
999
|
-
template <typename T, typename U, int M, int N, int K>
|
|
1000
|
-
METAL_FUNC void tile_matmad(
|
|
1001
|
-
thread MMATile<T, M, N>& D,
|
|
1002
|
-
thread MMATile<U, M, K>& A,
|
|
1003
|
-
thread MMATile<U, K, N>& B,
|
|
1004
|
-
thread MMATile<T, M, N>& C) {
|
|
1005
|
-
STEEL_PRAGMA_UNROLL
|
|
1006
|
-
for (short m = 0; m < M; ++m) {
|
|
1007
|
-
STEEL_PRAGMA_UNROLL
|
|
1008
|
-
for (short n = 0; n < N; ++n) {
|
|
1009
|
-
short n_serp = (m % 2) ? (N - 1 - n) : n;
|
|
1010
|
-
STEEL_PRAGMA_UNROLL
|
|
1011
|
-
for (short k = 0; k < K; ++k) {
|
|
1012
|
-
MMATile<T, M, N>::MMAFrag_t::mma(
|
|
1013
|
-
D.frag_at(m, n_serp),
|
|
1014
|
-
A.frag_at(m, k),
|
|
1015
|
-
B.frag_at(k, n_serp),
|
|
1016
|
-
C.frag_at(m, n_serp));
|
|
1017
|
-
}
|
|
1018
|
-
}
|
|
1019
|
-
}
|
|
1020
|
-
}
|
|
1021
|
-
// ===== mma.h (BlockMMA non-complex) =====
|
|
1022
|
-
template <
|
|
1023
|
-
typename T,
|
|
1024
|
-
typename U,
|
|
1025
|
-
int BM,
|
|
1026
|
-
int BN,
|
|
1027
|
-
int BK,
|
|
1028
|
-
int WM,
|
|
1029
|
-
int WN,
|
|
1030
|
-
bool transpose_a,
|
|
1031
|
-
bool transpose_b,
|
|
1032
|
-
short lda_tgp,
|
|
1033
|
-
short ldb_tgp,
|
|
1034
|
-
typename AccumType = float,
|
|
1035
|
-
typename Epilogue = TransformNone<U, AccumType>>
|
|
1036
|
-
struct BlockMMA {
|
|
1037
|
-
// MMAFrag size
|
|
1038
|
-
STEEL_CONST short kFragSize = 8;
|
|
1039
|
-
using MMAFrag_acc_t = BaseMMAFrag<AccumType, kFragSize, kFragSize>;
|
|
1040
|
-
|
|
1041
|
-
// Warp tile simdgroup matrix strides along M
|
|
1042
|
-
STEEL_CONST short TM_stride = kFragSize * WM;
|
|
1043
|
-
// Warp tile simdgroup matrix strides along M
|
|
1044
|
-
STEEL_CONST short TN_stride = kFragSize * WN;
|
|
1045
|
-
|
|
1046
|
-
// Warp tile size along M
|
|
1047
|
-
STEEL_CONST short TM = BM / (kFragSize * WM);
|
|
1048
|
-
// Warp tile size along N
|
|
1049
|
-
STEEL_CONST short TN = BN / (kFragSize * WN);
|
|
1050
|
-
|
|
1051
|
-
// Threadgroup A strides
|
|
1052
|
-
STEEL_CONST short A_str_m = transpose_a ? 1 : lda_tgp; // M
|
|
1053
|
-
STEEL_CONST short A_str_k = transpose_a ? lda_tgp : 1; // K
|
|
1054
|
-
|
|
1055
|
-
// Threadgroup B strides
|
|
1056
|
-
STEEL_CONST short B_str_k = transpose_b ? 1 : ldb_tgp; // K
|
|
1057
|
-
STEEL_CONST short B_str_n = transpose_b ? ldb_tgp : 1; // N
|
|
1058
|
-
|
|
1059
|
-
// Threadgroup strides along K
|
|
1060
|
-
STEEL_CONST short tile_stride_a = kFragSize * A_str_k;
|
|
1061
|
-
STEEL_CONST short tile_stride_b = kFragSize * B_str_k;
|
|
1062
|
-
|
|
1063
|
-
// Simdgroup matrices
|
|
1064
|
-
MMATile<AccumType, TM, 1, MMAFrag_acc_t> Atile;
|
|
1065
|
-
MMATile<AccumType, 1, TN, MMAFrag_acc_t> Btile;
|
|
1066
|
-
MMATile<AccumType, TM, TN, MMAFrag_acc_t> Ctile;
|
|
1067
|
-
|
|
1068
|
-
// Offsets within threadgroup
|
|
1069
|
-
short sm;
|
|
1070
|
-
short sn;
|
|
1071
|
-
|
|
1072
|
-
short As_offset;
|
|
1073
|
-
short Bs_offset;
|
|
1074
|
-
|
|
1075
|
-
/* Constructor */
|
|
1076
|
-
METAL_FUNC BlockMMA(
|
|
1077
|
-
ushort simd_group_id [[simdgroup_index_in_threadgroup]],
|
|
1078
|
-
ushort simd_lane_id [[thread_index_in_simdgroup]]) {
|
|
1079
|
-
// Determine thread position in simdgroup matrix
|
|
1080
|
-
short tm = kFragSize * (simd_group_id / WN);
|
|
1081
|
-
short tn = kFragSize * (simd_group_id % WN);
|
|
1082
|
-
|
|
1083
|
-
short2 simd_coord = MMAFrag_acc_t::get_coord(simd_lane_id);
|
|
1084
|
-
sm = simd_coord.y;
|
|
1085
|
-
sn = simd_coord.x;
|
|
1086
|
-
|
|
1087
|
-
// Determine thread and simdgroup offset
|
|
1088
|
-
As_offset = (tm + sm) * A_str_m + (sn)*A_str_k; // M, K
|
|
1089
|
-
Bs_offset = (sm)*B_str_k + (tn + sn) * B_str_n; // K, N
|
|
1090
|
-
|
|
1091
|
-
sm += tm;
|
|
1092
|
-
sn += tn;
|
|
1093
|
-
}
|
|
1094
|
-
|
|
1095
|
-
/* (BM, BK) X (BK, BN) multiply accumulate function */
|
|
1096
|
-
METAL_FUNC void mma(const threadgroup T* As, const threadgroup T* Bs) {
|
|
1097
|
-
// Adjust for simdgroup and thread location
|
|
1098
|
-
As += As_offset;
|
|
1099
|
-
Bs += Bs_offset;
|
|
1100
|
-
|
|
1101
|
-
// Iterate over BK in blocks of kFragSize
|
|
1102
|
-
STEEL_PRAGMA_UNROLL
|
|
1103
|
-
for (short kk = 0; kk < BK; kk += kFragSize) {
|
|
1104
|
-
simdgroup_barrier(mem_flags::mem_none);
|
|
1105
|
-
|
|
1106
|
-
Atile.template load<T, WM, 1, A_str_m, A_str_k>(As);
|
|
1107
|
-
|
|
1108
|
-
simdgroup_barrier(mem_flags::mem_none);
|
|
1109
|
-
|
|
1110
|
-
Btile.template load<T, 1, WN, B_str_k, B_str_n>(Bs);
|
|
1111
|
-
|
|
1112
|
-
simdgroup_barrier(mem_flags::mem_none);
|
|
1113
|
-
|
|
1114
|
-
tile_matmad(Ctile, Atile, Btile, Ctile);
|
|
1115
|
-
|
|
1116
|
-
// Progress to next simdgroup tile
|
|
1117
|
-
As += tile_stride_a;
|
|
1118
|
-
Bs += tile_stride_b;
|
|
1119
|
-
}
|
|
1120
|
-
}
|
|
1121
|
-
|
|
1122
|
-
/* Store results from simdgroup_matrix results into device memory */
|
|
1123
|
-
METAL_FUNC void store_result(device U* D, const int ldd) {
|
|
1124
|
-
// Apply epilogue
|
|
1125
|
-
STEEL_PRAGMA_UNROLL
|
|
1126
|
-
for (short i = 0; i < decltype(Ctile)::kElemsPerTile; i++) {
|
|
1127
|
-
Ctile.elems()[i] = Epilogue::apply(Ctile.elems()[i]);
|
|
1128
|
-
}
|
|
1129
|
-
|
|
1130
|
-
// Adjust for simdgroup and thread location
|
|
1131
|
-
D += sm * ldd + sn;
|
|
1132
|
-
|
|
1133
|
-
Ctile.template store<U, WM, WN>(D, ldd);
|
|
1134
|
-
}
|
|
1135
|
-
|
|
1136
|
-
METAL_FUNC void
|
|
1137
|
-
store_result_slice(device U* D, const int ldd, short2 start, short2 stop) {
|
|
1138
|
-
// Apply epilogue
|
|
1139
|
-
STEEL_PRAGMA_UNROLL
|
|
1140
|
-
for (short i = 0; i < decltype(Ctile)::kElemsPerTile; i++) {
|
|
1141
|
-
Ctile.elems()[i] = Epilogue::apply(Ctile.elems()[i]);
|
|
1142
|
-
}
|
|
1143
|
-
|
|
1144
|
-
D += sm * ldd + sn;
|
|
1145
|
-
start -= short2(sn, sm);
|
|
1146
|
-
stop -= short2(sn, sm);
|
|
1147
|
-
|
|
1148
|
-
// TODO: Check the start as well
|
|
1149
|
-
if (stop.y <= 0 || stop.x <= 0) {
|
|
1150
|
-
return;
|
|
1151
|
-
}
|
|
1152
|
-
|
|
1153
|
-
Ctile.template store_slice<U, WM, WN>(D, ldd, start, stop);
|
|
1154
|
-
}
|
|
1155
|
-
|
|
1156
|
-
METAL_FUNC void
|
|
1157
|
-
store_result_safe(device U* D, const int ldd, short2 dst_tile_dims) {
|
|
1158
|
-
// Apply epilogue
|
|
1159
|
-
STEEL_PRAGMA_UNROLL
|
|
1160
|
-
for (short i = 0; i < decltype(Ctile)::kElemsPerTile; i++) {
|
|
1161
|
-
Ctile.elems()[i] = Epilogue::apply(Ctile.elems()[i]);
|
|
1162
|
-
}
|
|
1163
|
-
|
|
1164
|
-
// Adjust for simdgroup and thread location
|
|
1165
|
-
D += sm * ldd + sn;
|
|
1166
|
-
dst_tile_dims -= short2(sn, sm);
|
|
1167
|
-
|
|
1168
|
-
if (dst_tile_dims.x <= 0 || dst_tile_dims.y <= 0)
|
|
1169
|
-
return;
|
|
1170
|
-
|
|
1171
|
-
Ctile.template store_safe<U, WM, WN>(D, ldd, dst_tile_dims);
|
|
1172
|
-
}
|
|
1173
|
-
|
|
1174
|
-
/* Apply epilogue */
|
|
1175
|
-
template <typename UnaryEpilogue>
|
|
1176
|
-
METAL_FUNC void apply_epilogue(thread const UnaryEpilogue& epilogue_op) {
|
|
1177
|
-
// Loop over all simdgroup tiles
|
|
1178
|
-
STEEL_PRAGMA_UNROLL
|
|
1179
|
-
for (short i = 0; i < decltype(Ctile)::kElemsPerTile; i++) {
|
|
1180
|
-
Ctile.elems()[i] = epilogue_op.apply(Ctile.elems()[i]);
|
|
1181
|
-
}
|
|
1182
|
-
}
|
|
1183
|
-
|
|
1184
|
-
/* Apply epilogue */
|
|
1185
|
-
template <typename BinaryEpilogue>
|
|
1186
|
-
METAL_FUNC void apply_epilogue(
|
|
1187
|
-
const device U* C,
|
|
1188
|
-
const int ldc,
|
|
1189
|
-
const int fdc,
|
|
1190
|
-
thread const BinaryEpilogue& epilogue_op) {
|
|
1191
|
-
// Adjust for simdgroup and thread location
|
|
1192
|
-
C += (sm)*ldc + (sn)*fdc;
|
|
1193
|
-
|
|
1194
|
-
// Loop over all simdgroup tiles
|
|
1195
|
-
STEEL_PRAGMA_UNROLL
|
|
1196
|
-
for (short i = 0; i < TM; i++) {
|
|
1197
|
-
STEEL_PRAGMA_UNROLL
|
|
1198
|
-
for (short j = 0; j < TN; j++) {
|
|
1199
|
-
// Get accumulated result and associated offset in C
|
|
1200
|
-
thread auto& accum = Ctile.frag_at(i, j);
|
|
1201
|
-
int offset_c = (i * TM_stride) * ldc + (j * TN_stride) * fdc;
|
|
1202
|
-
|
|
1203
|
-
// Apply epilogue
|
|
1204
|
-
STEEL_PRAGMA_UNROLL
|
|
1205
|
-
for (short k = 0; k < decltype(Ctile)::kElemsPerFrag; k++) {
|
|
1206
|
-
accum[k] = epilogue_op.apply(accum[k], C[offset_c + k * fdc]);
|
|
1207
|
-
}
|
|
1208
|
-
}
|
|
1209
|
-
}
|
|
1210
|
-
}
|
|
1211
|
-
|
|
1212
|
-
/* Apply epilogue */
|
|
1213
|
-
template <typename BinaryEpilogue>
|
|
1214
|
-
METAL_FUNC void apply_epilogue_safe(
|
|
1215
|
-
const device U* C,
|
|
1216
|
-
const int ldc,
|
|
1217
|
-
const int fdc,
|
|
1218
|
-
short2 dst_tile_dims,
|
|
1219
|
-
thread const BinaryEpilogue& epilogue_op) {
|
|
1220
|
-
// Adjust for simdgroup and thread location
|
|
1221
|
-
C += (sm)*ldc + (sn)*fdc;
|
|
1222
|
-
dst_tile_dims -= short2(sn, sm);
|
|
1223
|
-
|
|
1224
|
-
if (dst_tile_dims.x <= 0 || dst_tile_dims.y <= 0)
|
|
1225
|
-
return;
|
|
1226
|
-
|
|
1227
|
-
// Loop over all simdgroup tiles
|
|
1228
|
-
STEEL_PRAGMA_UNROLL
|
|
1229
|
-
for (short i = 0; i < TM; i++) {
|
|
1230
|
-
STEEL_PRAGMA_UNROLL
|
|
1231
|
-
for (short j = 0; j < TN; j++) {
|
|
1232
|
-
// Get accumulated result and associated offset in C
|
|
1233
|
-
thread auto& accum = Ctile.frag_at(i, j);
|
|
1234
|
-
int offset_c = (i * TM_stride) * ldc + (j * TN_stride) * fdc;
|
|
1235
|
-
|
|
1236
|
-
constexpr short kelems = decltype(Ctile)::kElemsPerFrag;
|
|
1237
|
-
|
|
1238
|
-
// Read C
|
|
1239
|
-
U c_elems[kelems] = {0};
|
|
1240
|
-
|
|
1241
|
-
STEEL_PRAGMA_UNROLL
|
|
1242
|
-
for (short k = 0; k < kelems; k++) {
|
|
1243
|
-
if ((j * TN_stride + k) < dst_tile_dims.x) {
|
|
1244
|
-
c_elems[k] = C[offset_c + k * fdc];
|
|
1245
|
-
}
|
|
1246
|
-
}
|
|
1247
|
-
|
|
1248
|
-
// Apply epilogue
|
|
1249
|
-
STEEL_PRAGMA_UNROLL
|
|
1250
|
-
for (short k = 0; k < kelems; k++) {
|
|
1251
|
-
accum[k] = epilogue_op.apply(accum[k], c_elems[k]);
|
|
1252
|
-
}
|
|
1253
|
-
}
|
|
1254
|
-
}
|
|
1255
|
-
}
|
|
1256
|
-
|
|
1257
|
-
/* Store results from simdgroup_matrix results into device memory */
|
|
1258
|
-
METAL_FUNC void store_result(
|
|
1259
|
-
device U* D,
|
|
1260
|
-
const int ldd,
|
|
1261
|
-
const device U* C,
|
|
1262
|
-
const int ldc,
|
|
1263
|
-
const int fdc,
|
|
1264
|
-
thread const Epilogue& epilogue_op) const {
|
|
1265
|
-
// Adjust for simdgroup and thread location
|
|
1266
|
-
C += (sm)*ldc + (sn)*fdc;
|
|
1267
|
-
D += (sm)*ldd + sn;
|
|
1268
|
-
|
|
1269
|
-
constexpr short kelems = decltype(Ctile)::kElemsPerFrag;
|
|
1270
|
-
|
|
1271
|
-
// Loop over all simdgroup tiles
|
|
1272
|
-
STEEL_PRAGMA_UNROLL
|
|
1273
|
-
for (short i = 0; i < TM; i++) {
|
|
1274
|
-
STEEL_PRAGMA_UNROLL
|
|
1275
|
-
for (short j = 0; j < TN; j++) {
|
|
1276
|
-
// Get accumulated result and associated offset in C
|
|
1277
|
-
thread const auto& accum = Ctile.frag_at(i, j);
|
|
1278
|
-
int offset_c = (i * TM_stride) * ldc + (j * TN_stride) * fdc;
|
|
1279
|
-
int offset_d = (i * TM_stride) * ldd + (j * TN_stride);
|
|
1280
|
-
|
|
1281
|
-
// Apply epilogue
|
|
1282
|
-
STEEL_PRAGMA_UNROLL
|
|
1283
|
-
for (short k = 0; k < kelems; k++) {
|
|
1284
|
-
D[offset_d + k] = epilogue_op.apply(accum[k], C[offset_c + k * fdc]);
|
|
1285
|
-
}
|
|
1286
|
-
}
|
|
1287
|
-
}
|
|
1288
|
-
}
|
|
1289
|
-
|
|
1290
|
-
METAL_FUNC void store_result_safe(
|
|
1291
|
-
device U* D,
|
|
1292
|
-
const int ldd,
|
|
1293
|
-
const device U* C,
|
|
1294
|
-
const int ldc,
|
|
1295
|
-
const int fdc,
|
|
1296
|
-
short2 dst_tile_dims,
|
|
1297
|
-
thread const Epilogue& epilogue_op) const {
|
|
1298
|
-
// Adjust for simdgroup and thread location
|
|
1299
|
-
C += (sm)*ldc + (sn)*fdc;
|
|
1300
|
-
D += (sm)*ldd + sn;
|
|
1301
|
-
dst_tile_dims -= short2(sn, sm);
|
|
1302
|
-
|
|
1303
|
-
if (dst_tile_dims.x <= 0 || dst_tile_dims.y <= 0)
|
|
1304
|
-
return;
|
|
1305
|
-
|
|
1306
|
-
constexpr short kelems = decltype(Ctile)::kElemsPerFrag;
|
|
1307
|
-
|
|
1308
|
-
STEEL_PRAGMA_UNROLL
|
|
1309
|
-
for (int i = 0; i < TM; i++) {
|
|
1310
|
-
if (i * TM_stride < dst_tile_dims.y) {
|
|
1311
|
-
STEEL_PRAGMA_UNROLL
|
|
1312
|
-
for (int j = 0; j < TN; j++) {
|
|
1313
|
-
// Get accumulated result and associated offset in C
|
|
1314
|
-
thread const auto& accum = Ctile.frag_at(i, j);
|
|
1315
|
-
int offset_c = (i * TM_stride) * ldc + (j * TN_stride) * fdc;
|
|
1316
|
-
int offset_d = (i * TM_stride) * ldd + (j * TN_stride);
|
|
1317
|
-
|
|
1318
|
-
// Apply epilogue
|
|
1319
|
-
STEEL_PRAGMA_UNROLL
|
|
1320
|
-
for (short k = 0; k < kelems; k++) {
|
|
1321
|
-
if ((j * TN_stride + k) < dst_tile_dims.x) {
|
|
1322
|
-
D[offset_d + k] =
|
|
1323
|
-
epilogue_op.apply(accum[k], C[offset_c + k * fdc]);
|
|
1324
|
-
}
|
|
1325
|
-
}
|
|
1326
|
-
}
|
|
1327
|
-
}
|
|
1328
|
-
}
|
|
1329
|
-
}
|
|
1330
|
-
};
|
|
1331
|
-
} // namespace steel
|
|
1332
|
-
} // namespace mlx
|
|
1333
|
-
// ===== qmm_t_impl =====
|
|
1334
|
-
template <
|
|
1335
|
-
typename T,
|
|
1336
|
-
const int group_size,
|
|
1337
|
-
const int bits,
|
|
1338
|
-
const bool aligned_N,
|
|
1339
|
-
const int BM = 32,
|
|
1340
|
-
const int BK = 32,
|
|
1341
|
-
const int BN = 32>
|
|
1342
|
-
METAL_FUNC void qmm_t_impl(
|
|
1343
|
-
const device uint32_t* w,
|
|
1344
|
-
const device T* scales,
|
|
1345
|
-
const device T* biases,
|
|
1346
|
-
const device T* x,
|
|
1347
|
-
device T* y,
|
|
1348
|
-
threadgroup T* Xs,
|
|
1349
|
-
threadgroup T* Ws,
|
|
1350
|
-
const constant int& K,
|
|
1351
|
-
const constant int& N,
|
|
1352
|
-
const constant int& M,
|
|
1353
|
-
const constant int& K_eff,
|
|
1354
|
-
uint3 tid [[threadgroup_position_in_grid]],
|
|
1355
|
-
uint lid [[thread_index_in_threadgroup]],
|
|
1356
|
-
uint simd_gid [[simdgroup_index_in_threadgroup]],
|
|
1357
|
-
uint simd_lid [[thread_index_in_simdgroup]]) {
|
|
1358
|
-
static_assert(BK >= SIMD_SIZE, "BK should be larger than SIMD_SIZE");
|
|
1359
|
-
static_assert(BK % SIMD_SIZE == 0, "BK should be divisible by SIMD_SIZE");
|
|
1360
|
-
|
|
1361
|
-
(void)lid;
|
|
1362
|
-
|
|
1363
|
-
constexpr int WM = 2;
|
|
1364
|
-
constexpr int WN = 2;
|
|
1365
|
-
constexpr int pack_factor = get_pack_factor<bits, 8>();
|
|
1366
|
-
constexpr int bytes_per_pack = get_bytes_per_pack<bits>();
|
|
1367
|
-
|
|
1368
|
-
constexpr int BK_padded = (BK + 16 / sizeof(T));
|
|
1369
|
-
|
|
1370
|
-
// Instantiate the appropriate BlockMMA and Loader
|
|
1371
|
-
using mma_t = mlx::steel::
|
|
1372
|
-
BlockMMA<T, T, BM, BN, BK, WM, WN, false, true, BK_padded, BK_padded>;
|
|
1373
|
-
using loader_x_t =
|
|
1374
|
-
mlx::steel::BlockLoader<T, BM, BK, BK_padded, 1, WM * WN * SIMD_SIZE>;
|
|
1375
|
-
using loader_w_t = QuantizedBlockLoader<
|
|
1376
|
-
T,
|
|
1377
|
-
BN,
|
|
1378
|
-
BK,
|
|
1379
|
-
BK_padded,
|
|
1380
|
-
1,
|
|
1381
|
-
WM * WN * SIMD_SIZE,
|
|
1382
|
-
group_size,
|
|
1383
|
-
bits>;
|
|
1384
|
-
|
|
1385
|
-
// Set the block
|
|
1386
|
-
const int K_w = K * bytes_per_pack / pack_factor;
|
|
1387
|
-
const int K_g = K / group_size;
|
|
1388
|
-
const int y_row = tid.y * BM;
|
|
1389
|
-
const int y_col = tid.x * BN;
|
|
1390
|
-
|
|
1391
|
-
auto wl = (const device uint8_t*)w;
|
|
1392
|
-
|
|
1393
|
-
x += y_row * static_cast<int64_t>(K);
|
|
1394
|
-
wl += y_col * K_w;
|
|
1395
|
-
scales += y_col * K_g;
|
|
1396
|
-
biases += y_col * K_g;
|
|
1397
|
-
y += y_row * static_cast<int64_t>(N) + y_col;
|
|
1398
|
-
|
|
1399
|
-
// Make the x loader and mma operation
|
|
1400
|
-
const short num_els = min(BM, M - y_row);
|
|
1401
|
-
const short num_outs = min(BN, N - y_col);
|
|
1402
|
-
loader_x_t loader_x(x, K, Xs, simd_gid, simd_lid);
|
|
1403
|
-
loader_w_t loader_w(wl, scales, biases, K, Ws, simd_gid, simd_lid);
|
|
1404
|
-
mma_t mma_op(simd_gid, simd_lid);
|
|
1405
|
-
|
|
1406
|
-
if (num_els < BM) {
|
|
1407
|
-
if (!aligned_N && num_outs < BN) {
|
|
1408
|
-
for (int k = 0; k < K_eff; k += BK) {
|
|
1409
|
-
threadgroup_barrier(mem_flags::mem_threadgroup);
|
|
1410
|
-
loader_x.load_safe(short2(BK, num_els));
|
|
1411
|
-
loader_w.load_safe(short2(BK, num_outs));
|
|
1412
|
-
threadgroup_barrier(mem_flags::mem_threadgroup);
|
|
1413
|
-
mma_op.mma(Xs, Ws);
|
|
1414
|
-
loader_x.next();
|
|
1415
|
-
loader_w.next();
|
|
1416
|
-
}
|
|
1417
|
-
} else {
|
|
1418
|
-
for (int k = 0; k < K_eff; k += BK) {
|
|
1419
|
-
threadgroup_barrier(mem_flags::mem_threadgroup);
|
|
1420
|
-
loader_x.load_safe(short2(BK, num_els));
|
|
1421
|
-
loader_w.load_unsafe();
|
|
1422
|
-
threadgroup_barrier(mem_flags::mem_threadgroup);
|
|
1423
|
-
mma_op.mma(Xs, Ws);
|
|
1424
|
-
loader_x.next();
|
|
1425
|
-
loader_w.next();
|
|
1426
|
-
}
|
|
1427
|
-
}
|
|
1428
|
-
} else {
|
|
1429
|
-
if (!aligned_N && num_outs < BN) {
|
|
1430
|
-
for (int k = 0; k < K_eff; k += BK) {
|
|
1431
|
-
threadgroup_barrier(mem_flags::mem_threadgroup);
|
|
1432
|
-
loader_x.load_unsafe();
|
|
1433
|
-
loader_w.load_safe(short2(BK, num_outs));
|
|
1434
|
-
threadgroup_barrier(mem_flags::mem_threadgroup);
|
|
1435
|
-
mma_op.mma(Xs, Ws);
|
|
1436
|
-
loader_x.next();
|
|
1437
|
-
loader_w.next();
|
|
1438
|
-
}
|
|
1439
|
-
} else {
|
|
1440
|
-
for (int k = 0; k < K_eff; k += BK) {
|
|
1441
|
-
threadgroup_barrier(mem_flags::mem_threadgroup);
|
|
1442
|
-
loader_x.load_unsafe();
|
|
1443
|
-
loader_w.load_unsafe();
|
|
1444
|
-
threadgroup_barrier(mem_flags::mem_threadgroup);
|
|
1445
|
-
|
|
1446
|
-
mma_op.mma(Xs, Ws);
|
|
1447
|
-
loader_x.next();
|
|
1448
|
-
loader_w.next();
|
|
1449
|
-
}
|
|
1450
|
-
}
|
|
1451
|
-
}
|
|
1452
|
-
|
|
1453
|
-
// Store results to device memory
|
|
1454
|
-
threadgroup_barrier(mem_flags::mem_threadgroup);
|
|
1455
|
-
if (num_els < BM || num_outs < BN) {
|
|
1456
|
-
mma_op.store_result_safe(y, N, short2(num_outs, num_els));
|
|
1457
|
-
} else {
|
|
1458
|
-
mma_op.store_result(y, N);
|
|
1459
|
-
}
|
|
1460
|
-
}
|
|
1461
|
-
`;
|