# How to iterate over a \`List\` using \`SIMD\` in Mojo

**URL:** <https://forum.modular.com/t/how-to-iterate-over-a-list-using-simd-in-mojo/98>\
**Category:** Mojo\
**Tags:** docs\
**Created:** [December 9, 2024, 7:26pm UTC](https://forum.modular.com/t/how-to-iterate-over-a-list-using-simd-in-mojo/98 "2024-12-09T19:26:18Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![martinvuyk](https://sea1.discourse-cdn.com/flex001/user_avatar/forum.modular.com/martinvuyk/32/48_2.png) [@martinvuyk](https://forum.modular.com/u/martinvuyk)\
**Post date:** [December 9, 2024, 7:26pm UTC](https://forum.modular.com/t/how-to-iterate-over-a-list-using-simd-in-mojo/98/1 "2024-12-09T19:26:18Z")

</div>

```mojo
from sys.info import simdwidthof

fn main():
    values = List[UInt8](1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    length = len(values) # 10

    for element in values:
        _ = element # iterates per element

    ptr = values.unsafe_ptr()

    for i in range(length // 4): # 2
        var vec = (ptr + i * 4).load[width=4]()
        _ = vec # it's a SIMD[DTYpe.uint8, 4]

    alias width = simdwidthof[UInt8]()

    for i in range(length // width): # depends on the CPU
        var vec = (ptr + i * width).load[width=width]()
        _ = vec # it's a SIMD[DTYpe.uint8, width]

    # the rest of the data i.e. length % width can be processed sequentially

```

---

<div class="post-metadata">

**Author:** ![owenhilyard](https://sea1.discourse-cdn.com/flex001/user_avatar/forum.modular.com/owenhilyard/32/41_2.png) [@owenhilyard](https://forum.modular.com/u/owenhilyard)\
**Post date:** [December 9, 2024, 8:29pm UTC](https://forum.modular.com/t/how-to-iterate-over-a-list-using-simd-in-mojo/98/2 "2024-12-09T20:29:00Z")

</div>

Does it make sense to try to make an API for this which produces a SIMD list iterator, leaving the drain loop to the user? I’m not sure if we want to keep using unsafe for this.

---

<div class="post-metadata">

**Author:** ![martinvuyk](https://sea1.discourse-cdn.com/flex001/user_avatar/forum.modular.com/martinvuyk/32/48_2.png) [@martinvuyk](https://forum.modular.com/u/martinvuyk)\
**Post date:** [December 9, 2024, 8:36pm UTC](https://forum.modular.com/t/how-to-iterate-over-a-list-using-simd-in-mojo/98/3 "2024-12-09T20:36:32Z")

</div>

I think this will be better handled by adding `map`, `filter`, `sum`, `reduce`, etc. It feels weird to give an incomplete iterator, but maybe we can if they aren’t achievable with those APIs we could offer a helper function that does that 🤷‍♂️ (I wouldn’t want to add it to the type’s public API though)

---

<div class="post-metadata">

**Author:** ![lesoup-mxd](https://sea1.discourse-cdn.com/flex001/user_avatar/forum.modular.com/lesoup-mxd/32/585_2.png) [@lesoup-mxd](https://forum.modular.com/u/lesoup-mxd)\
**Post date:** [December 9, 2024, 8:39pm UTC](https://forum.modular.com/t/how-to-iterate-over-a-list-using-simd-in-mojo/98/4 "2024-12-09T20:39:38Z")

</div>

You’re right) Less room for mistakes this way)

---

<div class="post-metadata">

**Author:** ![owenhilyard](https://sea1.discourse-cdn.com/flex001/user_avatar/forum.modular.com/owenhilyard/32/41_2.png) [@owenhilyard](https://forum.modular.com/u/owenhilyard)\
**Post date:** [December 9, 2024, 8:43pm UTC](https://forum.modular.com/t/how-to-iterate-over-a-list-using-simd-in-mojo/98/5 "2024-12-09T20:43:45Z")

</div>

For iterators, would we want a SIMDIterator which takes a tuple of functions and implement something which takes a width parameter on top of that? I’m thinking of masked processing (like SVE), letting you process a variable number of elements and do the drain loop in a single iteration with different intrinsics in some cases.

---

<div class="post-metadata">

**Author:** ![martinvuyk](https://sea1.discourse-cdn.com/flex001/user_avatar/forum.modular.com/martinvuyk/32/48_2.png) [@martinvuyk](https://forum.modular.com/u/martinvuyk)\
**Post date:** [December 9, 2024, 8:55pm UTC](https://forum.modular.com/t/how-to-iterate-over-a-list-using-simd-in-mojo/98/6 "2024-12-09T20:55:00Z")

</div>

That feels like a very powerful abstraction, many types can yield `SIMD` vectors. I’m thinking we could simply make `SpanIterator` do that (for now, or maybe permanently).

```mojo
iterator = iter(span)
for v in iterator.vectors():
    _ = v # SIMD[DType.?, simdwidthof[DType.?]()]
for s in iterator.scalars():
    _ = s # Scalar[DType.?]

```

---

<div class="post-metadata">

**Author:** ![owenhilyard](https://sea1.discourse-cdn.com/flex001/user_avatar/forum.modular.com/owenhilyard/32/41_2.png) [@owenhilyard](https://forum.modular.com/u/owenhilyard)\
**Post date:** [December 9, 2024, 9:10pm UTC](https://forum.modular.com/t/how-to-iterate-over-a-list-using-simd-in-mojo/98/7 "2024-12-09T21:10:32Z")

</div>

The reason I’m leaning towards asking for multiple functions is to handle drain loops inline, or deal with platforms that natively have masks and will let you write one function for all of it like SVE.

---

<div class="post-metadata">

**Author:** ![martinvuyk](https://sea1.discourse-cdn.com/flex001/user_avatar/forum.modular.com/martinvuyk/32/48_2.png) [@martinvuyk](https://forum.modular.com/u/martinvuyk)\
**Post date:** [December 9, 2024, 9:21pm UTC](https://forum.modular.com/t/how-to-iterate-over-a-list-using-simd-in-mojo/98/9 "2024-12-09T21:21:34Z")

</div>

wouldn’t that be a low-level optimization that we could bake into `Span.map()`'s implementation ?

---

<div class="post-metadata">

**Author:** ![owenhilyard](https://sea1.discourse-cdn.com/flex001/user_avatar/forum.modular.com/owenhilyard/32/41_2.png) [@owenhilyard](https://forum.modular.com/u/owenhilyard)\
**Post date:** [December 9, 2024, 9:30pm UTC](https://forum.modular.com/t/how-to-iterate-over-a-list-using-simd-in-mojo/98/10 "2024-12-09T21:30:35Z")

</div>

We can have a version which takes a scalar and drops it into `algorithm.functional.vectorize`, but part of Mojo’s appeal is letting people use those low-level optimizations. If we don’t expose it in some way, we violate the zero-overhead principle because someone could write a better one themselves. From the “tuple/comptime list of functions” version, we can implement more friendly and easier to use ones, like handling one which is generic over width or taking a single vector and a scalar, or just a scalar.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex001/uploads/modular/original/1X/2751e0fbdc595a99718b216730957e9db4448cfd.jpeg) [@system](https://forum.modular.com/u/system)\
**Post date:** [June 7, 2025, 9:31pm UTC](https://forum.modular.com/t/how-to-iterate-over-a-list-using-simd-in-mojo/98/11 "2025-06-07T21:31:16Z")

</div>

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.
