Skip to content

webgpu : fix handling of infinity values during ARGSORT and TOP_K - #27538

Merged
ggerganov merged 3 commits into
ggml-org:masterfrom
fairydreaming:webgpu-argsort-infinity
Aug 25, 2026
Merged

webgpu : fix handling of infinity values during ARGSORT and TOP_K#27538
ggerganov merged 3 commits into
ggml-org:masterfrom
fairydreaming:webgpu-argsort-infinity

Conversation

@fairydreaming

Copy link
Copy Markdown
Contributor

Overview

This PR replaces EXTREME_VALUE-based logic in WebGPU ARGSORT shader with more complex condition that compares indices to avoid improper handling of ±infinity values during TOP_K and ARGSORT.

Performance of fixed shader is slightly lower (~5% on my rig).

Requirements

  • I have read and agree with the contributing guidelines
  • AI usage disclosure: YES, but got frustrated testing proposed AI solutions and wrote the final solution myself based on CUDA ARGSORT kernel.

@fairydreaming
fairydreaming requested a review from a team as a code owner August 22, 2026 11:41
@github-actions github-actions Bot added ggml changes relating to the ggml tensor library for machine learning WebGPU labels Aug 22, 2026
@fairydreaming

fairydreaming commented Aug 22, 2026

Copy link
Copy Markdown
Contributor Author

I noticed that WebGPU CI fails due to:

/home/ggml/actions-runner/_work/llama.cpp/llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu.cpp:4098: ggml_webgpu: Device error! Reason: 2, Message: Error while parsing WGSL: :40:16 error: unresolved value 'V'
    let word = V[byte_offset / 4u];

error (unrelated to this PR), so I tried to fix it in #27545

@fairydreaming

Copy link
Copy Markdown
Contributor Author

Testing: apply the patch below

diff --git a/tests/test-backend-ops.cpp b/tests/test-backend-ops.cpp
index 8e3b273a1..dfa4a631f 100644
--- a/tests/test-backend-ops.cpp
+++ b/tests/test-backend-ops.cpp
@@ -6092,6 +6092,10 @@ struct test_argsort : public test_case {
                     for (int i = 0; i < t->ne[0]; i++) {
                         data[i] = i;
                     }
+                    if(t->ne[0] >= 2) {
+                        data[0] = -INFINITY;
+                        data[t->ne[0]-1] = INFINITY;
+                    }
                     std::shuffle(data.begin(), data.end(), rng);
                     ggml_backend_tensor_set(t, data.data(), r * t->nb[1], t->ne[0] * sizeof(float));
                 }

in master:

$ ./bin/test-backend-ops -o "ARGSORT"
Warning: maxDynamicUniformBuffersPerPipelineLayout artificially reduced from 1000000 to 16 to fit dynamic offset allocation limit.
Warning: maxDynamicStorageBuffersPerPipelineLayout artificially reduced from 1000000 to 16 to fit dynamic offset allocation limit.
register_backend: registered backend WebGPU (1 devices)
ggml_webgpu: adapter_info: vendor_id: 4318 | vendor: nvidia | architecture: blackwell | device_id: 11188 | name: NVIDIA RTX PRO 6000 Blackwell Max-Q Workstation Edition | device_desc: NVIDIA: 580.95.05 580.95.5.0
register_device: registered device WebGPU (WebGPU)
register_backend: registered backend CPU (1 devices)
register_device: registered device CPU (AMD EPYC 9374F 32-Core Processor)
load_backend: failed to find ggml_backend_init in /home/phm/projects/llama.cpp/build-webgpu/bin/libggml-cpu.so
Testing 2 devices

Backend 1/2: WebGPU
  Device description: WebGPU
  Device memory: 1048576 MB (1048576 MB free)

[ARGSORT] ERR = 0.307692308 > 0.000000100   ARGSORT(type=f32,ne=[3,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.533333333 > 0.000000100   ARGSORT(type=f32,ne=[4,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.350000000 > 0.000000100   ARGSORT(type=f32,ne=[7,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.313725490 > 0.000000100   ARGSORT(type=f32,ne=[8,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.181451613 > 0.000000100   ARGSORT(type=f32,ne=[15,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.011834320 > 0.000000100   ARGSORT(type=f32,ne=[16,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.042749128 > 0.000000100   ARGSORT(type=f32,ne=[31,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.015254084 > 0.000000100   ARGSORT(type=f32,ne=[32,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.000438516 > 0.000000100   ARGSORT(type=f32,ne=[63,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.017125486 > 0.000000100   ARGSORT(type=f32,ne=[64,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.006531545 > 0.000000100   ARGSORT(type=f32,ne=[127,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.000005785 > 0.000000100   ARGSORT(type=f32,ne=[128,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.000006548 > 0.000000100   ARGSORT(type=f32,ne=[255,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.001291107 > 0.000000100   ARGSORT(type=f32,ne=[256,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.004580317 > 0.000000100   ARGSORT(type=f32,ne=[511,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.000300938 > 0.000000100   ARGSORT(type=f32,ne=[512,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.002301912 > 0.000000100   ARGSORT(type=f32,ne=[1023,1,1,1],order=0): FAIL
  ARGSORT(type=f32,ne=[1024,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[2047,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[2048,1,1,1],order=0): OK
[ARGSORT] ERR = 0.000572322 > 0.000000100   ARGSORT(type=f32,ne=[4095,1,1,1],order=0): FAIL
  ARGSORT(type=f32,ne=[4096,1,1,1],order=0): OK
[ARGSORT] ERR = 0.000533376 > 0.000000100   ARGSORT(type=f32,ne=[8191,1,1,1],order=0): FAIL
  ARGSORT(type=f32,ne=[8192,1,1,1],order=0): OK
[ARGSORT] ERR = 0.000856351 > 0.000000100   ARGSORT(type=f32,ne=[16383,1,1,1],order=0): FAIL
  ARGSORT(type=f32,ne=[16384,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[32767,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[32768,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[65535,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[65536,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[131071,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[131072,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[262143,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[262144,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[524287,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[524288,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[1048575,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[1048576,1,1,1],order=0): OK
[ARGSORT] ERR = 0.064565210 > 0.000000100   ARGSORT(type=f32,ne=[16,10,10,10],order=0): FAIL
[ARGSORT] ERR = 0.017276060 > 0.000000100   ARGSORT(type=f32,ne=[60,10,10,10],order=0): FAIL
[ARGSORT] ERR = 0.000965277 > 0.000000100   ARGSORT(type=f32,ne=[1023,2,1,3],order=0): FAIL
  ARGSORT(type=f32,ne=[1024,2,1,3],order=0): OK
  ARGSORT(type=f32,ne=[1025,2,1,3],order=0): OK
  ARGSORT(type=f32,ne=[1025,256,1,1],order=0): OK
[ARGSORT] ERR = 0.000231610 > 0.000000100   ARGSORT(type=f32,ne=[2047,2,1,3],order=0): FAIL
  ARGSORT(type=f32,ne=[2048,2,1,3],order=0): OK
  ARGSORT(type=f32,ne=[2049,2,1,3],order=0): OK
[ARGSORT] ERR = 0.555464376 > 0.000000100   ARGSORT(type=f32,ne=[2,8,8192,1],order=0): FAIL
  ARGSORT(type=f32,ne=[2048,512,1,1],order=0): OK
[ARGSORT] ERR = 0.307692308 > 0.000000100   ARGSORT(type=f32,ne=[3,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.047619048 > 0.000000100   ARGSORT(type=f32,ne=[4,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.122137405 > 0.000000100   ARGSORT(type=f32,ne=[7,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.006451613 > 0.000000100   ARGSORT(type=f32,ne=[8,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.082304527 > 0.000000100   ARGSORT(type=f32,ne=[15,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.000786782 > 0.000000100   ARGSORT(type=f32,ne=[16,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.070096154 > 0.000000100   ARGSORT(type=f32,ne=[31,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.042680776 > 0.000000100   ARGSORT(type=f32,ne=[32,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.000304952 > 0.000000100   ARGSORT(type=f32,ne=[63,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.023744333 > 0.000000100   ARGSORT(type=f32,ne=[64,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.000005924 > 0.000000100   ARGSORT(type=f32,ne=[127,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.009305657 > 0.000000100   ARGSORT(type=f32,ne=[128,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.008239656 > 0.000000100   ARGSORT(type=f32,ne=[255,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.000121314 > 0.000000100   ARGSORT(type=f32,ne=[256,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.002340637 > 0.000000100   ARGSORT(type=f32,ne=[511,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.000029030 > 0.000000100   ARGSORT(type=f32,ne=[512,1,1,1],order=0): FAIL
[ARGSORT] ERR = 0.000025849 > 0.000000100   ARGSORT(type=f32,ne=[1023,1,1,1],order=0): FAIL
  ARGSORT(type=f32,ne=[1024,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[2047,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[2048,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[4095,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[4096,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[8191,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[8192,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[16383,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[16384,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[32767,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[32768,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[65535,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[65536,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[131071,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[131072,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[262143,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[262144,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[524287,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[524288,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[1048575,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[1048576,1,1,1],order=0): OK
[ARGSORT] ERR = 0.065614581 > 0.000000100   ARGSORT(type=f32,ne=[16,10,10,10],order=1): FAIL
[ARGSORT] ERR = 0.017371609 > 0.000000100   ARGSORT(type=f32,ne=[60,10,10,10],order=1): FAIL
[ARGSORT] ERR = 0.001084984 > 0.000000100   ARGSORT(type=f32,ne=[1023,2,1,3],order=1): FAIL
  ARGSORT(type=f32,ne=[1024,2,1,3],order=1): OK
  ARGSORT(type=f32,ne=[1025,2,1,3],order=1): OK
  ARGSORT(type=f32,ne=[1025,256,1,1],order=1): OK
[ARGSORT] ERR = 0.000189224 > 0.000000100   ARGSORT(type=f32,ne=[2047,2,1,3],order=1): FAIL
  ARGSORT(type=f32,ne=[2048,2,1,3],order=1): OK
  ARGSORT(type=f32,ne=[2049,2,1,3],order=1): OK
[ARGSORT] ERR = 0.556110774 > 0.000000100   ARGSORT(type=f32,ne=[2,8,8192,1],order=1): FAIL
  ARGSORT(type=f32,ne=[2048,512,1,1],order=1): OK
  51/98 tests passed

Failing tests:
  ARGSORT(type=f32,ne=[3,1,1,1],order=0)
  ARGSORT(type=f32,ne=[4,1,1,1],order=0)
  ARGSORT(type=f32,ne=[7,1,1,1],order=0)
  ARGSORT(type=f32,ne=[8,1,1,1],order=0)
  ARGSORT(type=f32,ne=[15,1,1,1],order=0)
  ARGSORT(type=f32,ne=[16,1,1,1],order=0)
  ARGSORT(type=f32,ne=[31,1,1,1],order=0)
  ARGSORT(type=f32,ne=[32,1,1,1],order=0)
  ARGSORT(type=f32,ne=[63,1,1,1],order=0)
  ARGSORT(type=f32,ne=[64,1,1,1],order=0)
  ARGSORT(type=f32,ne=[127,1,1,1],order=0)
  ARGSORT(type=f32,ne=[128,1,1,1],order=0)
  ARGSORT(type=f32,ne=[255,1,1,1],order=0)
  ARGSORT(type=f32,ne=[256,1,1,1],order=0)
  ARGSORT(type=f32,ne=[511,1,1,1],order=0)
  ARGSORT(type=f32,ne=[512,1,1,1],order=0)
  ARGSORT(type=f32,ne=[1023,1,1,1],order=0)
  ARGSORT(type=f32,ne=[4095,1,1,1],order=0)
  ARGSORT(type=f32,ne=[8191,1,1,1],order=0)
  ARGSORT(type=f32,ne=[16383,1,1,1],order=0)
  ARGSORT(type=f32,ne=[16,10,10,10],order=0)
  ARGSORT(type=f32,ne=[60,10,10,10],order=0)
  ARGSORT(type=f32,ne=[1023,2,1,3],order=0)
  ARGSORT(type=f32,ne=[2047,2,1,3],order=0)
  ARGSORT(type=f32,ne=[2,8,8192,1],order=0)
  ARGSORT(type=f32,ne=[3,1,1,1],order=0)
  ARGSORT(type=f32,ne=[4,1,1,1],order=0)
  ARGSORT(type=f32,ne=[7,1,1,1],order=0)
  ARGSORT(type=f32,ne=[8,1,1,1],order=0)
  ARGSORT(type=f32,ne=[15,1,1,1],order=0)
  ARGSORT(type=f32,ne=[16,1,1,1],order=0)
  ARGSORT(type=f32,ne=[31,1,1,1],order=0)
  ARGSORT(type=f32,ne=[32,1,1,1],order=0)
  ARGSORT(type=f32,ne=[63,1,1,1],order=0)
  ARGSORT(type=f32,ne=[64,1,1,1],order=0)
  ARGSORT(type=f32,ne=[127,1,1,1],order=0)
  ARGSORT(type=f32,ne=[128,1,1,1],order=0)
  ARGSORT(type=f32,ne=[255,1,1,1],order=0)
  ARGSORT(type=f32,ne=[256,1,1,1],order=0)
  ARGSORT(type=f32,ne=[511,1,1,1],order=0)
  ARGSORT(type=f32,ne=[512,1,1,1],order=0)
  ARGSORT(type=f32,ne=[1023,1,1,1],order=0)
  ARGSORT(type=f32,ne=[16,10,10,10],order=1)
  ARGSORT(type=f32,ne=[60,10,10,10],order=1)
  ARGSORT(type=f32,ne=[1023,2,1,3],order=1)
  ARGSORT(type=f32,ne=[2047,2,1,3],order=1)
  ARGSORT(type=f32,ne=[2,8,8192,1],order=1)
  Backend WebGPU: WebGPU: FAIL
Backend 2/2: CPU
  Skipping CPU backend
1/2 backends passed
FAIL

with this PR:

$ ./bin/test-backend-ops -o ARGSORT
Warning: maxDynamicUniformBuffersPerPipelineLayout artificially reduced from 1000000 to 16 to fit dynamic offset allocation limit.
Warning: maxDynamicStorageBuffersPerPipelineLayout artificially reduced from 1000000 to 16 to fit dynamic offset allocation limit.
ggml_webgpu: adapter_info: vendor_id: 4318 | vendor: nvidia | architecture: blackwell | device_id: 11188 | name: NVIDIA RTX PRO 6000 Blackwell Max-Q Workstation Edition | device_desc: NVIDIA: 580.95.05 580.95.5.0
Testing 2 devices

Backend 1/2: WebGPU
  Device description: WebGPU
  Device memory: 1048576 MB (1048576 MB free)

  ARGSORT(type=f32,ne=[3,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[4,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[7,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[8,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[15,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[16,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[31,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[32,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[63,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[64,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[127,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[128,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[255,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[256,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[511,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[512,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[1023,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[1024,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[2047,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[2048,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[4095,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[4096,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[8191,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[8192,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[16383,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[16384,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[32767,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[32768,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[65535,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[65536,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[131071,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[131072,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[262143,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[262144,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[524287,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[524288,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[1048575,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[1048576,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[16,10,10,10],order=0): OK
  ARGSORT(type=f32,ne=[60,10,10,10],order=0): OK
  ARGSORT(type=f32,ne=[1023,2,1,3],order=0): OK
  ARGSORT(type=f32,ne=[1024,2,1,3],order=0): OK
  ARGSORT(type=f32,ne=[1025,2,1,3],order=0): OK
  ARGSORT(type=f32,ne=[1025,256,1,1],order=0): OK
  ARGSORT(type=f32,ne=[2047,2,1,3],order=0): OK
  ARGSORT(type=f32,ne=[2048,2,1,3],order=0): OK
  ARGSORT(type=f32,ne=[2049,2,1,3],order=0): OK
  ARGSORT(type=f32,ne=[2,8,8192,1],order=0): OK
  ARGSORT(type=f32,ne=[2048,512,1,1],order=0): OK
  ARGSORT(type=f32,ne=[3,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[4,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[7,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[8,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[15,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[16,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[31,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[32,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[63,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[64,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[127,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[128,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[255,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[256,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[511,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[512,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[1023,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[1024,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[2047,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[2048,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[4095,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[4096,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[8191,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[8192,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[16383,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[16384,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[32767,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[32768,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[65535,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[65536,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[131071,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[131072,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[262143,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[262144,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[524287,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[524288,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[1048575,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[1048576,1,1,1],order=0): OK
  ARGSORT(type=f32,ne=[16,10,10,10],order=1): OK
  ARGSORT(type=f32,ne=[60,10,10,10],order=1): OK
  ARGSORT(type=f32,ne=[1023,2,1,3],order=1): OK
  ARGSORT(type=f32,ne=[1024,2,1,3],order=1): OK
  ARGSORT(type=f32,ne=[1025,2,1,3],order=1): OK
  ARGSORT(type=f32,ne=[1025,256,1,1],order=1): OK
  ARGSORT(type=f32,ne=[2047,2,1,3],order=1): OK
  ARGSORT(type=f32,ne=[2048,2,1,3],order=1): OK
  ARGSORT(type=f32,ne=[2049,2,1,3],order=1): OK
  ARGSORT(type=f32,ne=[2,8,8192,1],order=1): OK
  ARGSORT(type=f32,ne=[2048,512,1,1],order=1): OK
  98/98 tests passed
  Backend WebGPU: WebGPU: OK
Backend 2/2: CPU
  Skipping CPU backend
2/2 backends passed
OK

@ggerganov

Copy link
Copy Markdown
Member

@ggml-org/ggml-webgpu I'll fast-track this PR since I would like to stabilize the CI - there are 4 webgpus jobs currently failing.

@ggerganov
ggerganov merged commit 5ea87dd into ggml-org:master Aug 25, 2026
19 of 21 checks passed
thecodacus pushed a commit to thecodacus/llama.cpp that referenced this pull request Sep 7, 2026
…ml-org#27538)

Co-authored-by: Stanisław Szymczyk <sszymczy@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ggml changes relating to the ggml tensor library for machine learning WebGPU

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants