Packages

ExCubecl is a GPU compute runtime for Elixir powered by CubeCL via Rust NIFs. Provides GPU buffer management, kernel execution, async command submission, and pipeline orchestration. Currently includes CPU fallback implementations.

Current section

Files

Jump to
ex_cubecl guides 08_sorting.md
Raw

guides/08_sorting.md

# Sorting
ExCubecl supports sorting tensors along specified axes.
## Sort
Sort elements along an axis in ascending order.
```elixir
a = Nx.tensor([3.0, 1.0, 4.0, 1.0, 5.0, 9.0, 2.0], backend: ExCubecl.Backend)
# Sort entire tensor
Nx.sort(a)
# #Nx.Tensor<f32[7] [1.0, 1.0, 2.0, 3.0, 4.0, 5.0, 9.0]>
# Sort along axis 0 (rows)
b = Nx.tensor([[3.0, 1.0], [6.0, 4.0], [2.0, 8.0]], backend: ExCubecl.Backend)
Nx.sort(b, axis: 0)
# #Nx.Tensor<f32[3][2] [[2.0, 1.0], [3.0, 4.0], [6.0, 8.0]]
# Sort along axis 1 (columns)
Nx.sort(b, axis: 1)
# #Nx.Tensor<f32[3][2] [[1.0, 3.0], [4.0, 6.0], [2.0, 8.0]>
```
## Argsort
Return the indices that would sort the tensor.
```elixir
a = Nx.tensor([3.0, 1.0, 4.0, 1.0, 5.0], backend: ExCubecl.Backend)
Nx.argsort(a)
# #Nx.Tensor<s64[5] [1, 3, 0, 2, 4]>
# Use argsort to reorder another tensor
indices = Nx.argsort(a)
# indices tell us: element at position 1 is smallest, then position 3, etc.
```
## Top-K Pattern
Combine argsort with slice to get top-k elements.
```elixir
a = Nx.tensor([3.0, 1.0, 4.0, 1.0, 5.0, 9.0, 2.0, 6.0], backend: ExCubecl.Backend)
# Get indices of top 3 largest values
indices = Nx.argsort(a)
# [1, 3, 6, 0, 2, 4, 7, 5]
# Top 3 values (last 3 in sorted order)
top3_indices = Nx.slice(indices, [5], [3], [1])
# [7, 5] - indices of 6.0 and 9.0
```