<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/platform-independent-simd-in-go-ymat2hnb8" -->

---
title: Platform-independent SIMD in Go | daily.dev
description: Go 1.26 and 1.27 introduce experimental SIMD APIs, with Go 1.26 shipping an architecture-dependent archsimd package for amd64 and Go 1.27 extending it to arm64...
canonical: https://daily.dev/posts/platform-independent-simd-in-go-ymat2hnb8
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Platform-independent SIMD in Go | daily.dev
og:description: Go 1.26 and 1.27 introduce experimental SIMD APIs, with Go 1.26 shipping an architecture-dependent archsimd package for amd64 and Go 1.27 extending it to arm64...
og:url: https://daily.dev/posts/platform-independent-simd-in-go-ymat2hnb8
og:image: https://api.daily.dev/og/posts/ymaT2HNb8.png
og:image:alt: Platform-independent SIMD in Go
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Platform-independent SIMD in Go

**[Go](https://daily.dev/sources/golang)** · 17 min read · 12 upvotes · 0 comments

## Summary

Go 1.26 and 1.27 introduce experimental SIMD APIs, with Go 1.26 shipping an architecture-dependent archsimd package for amd64 and Go 1.27 extending it to arm64 (NEON) and wasm. Go 1.27 also debuts a fully portable, platform- and size-agnostic simd package modeled loosely on Google's Highway C++ library, which hides vector-size and instruction differences across amd64 (AVX/AVX2/AVX512), NEON, and wasm SIMD, emulating unsupported operations so code always runs. The post details the API's design goals, supported operations, how to transition between portable and architecture-specific code via ToArch()/FromArch(), GODEBUG flags for testing different hardware configurations, and compiler internals behind the AST rewriting that specializes code per vector width. Future plans include ReduceSum, OnesCount, SVE support, and additional feature variants in Go 1.28.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://go.dev/blog/simd-experiment>

## Questions this post answers

### What SIMD support does Go 1.27 add compared to Go 1.26?

Go 1.27 extends Go's SIMD support by adding architecture-dependent archsimd APIs for arm64 (NEON) and wasm, building on Go 1.26 which introduced archsimd only for amd64. Go 1.27 also introduces the new experimental, fully portable simd package supporting AVX, AVX2, AVX512 on amd64, NEON on arm64, and wasm's SIMD instructions, requiring GOEXPERIMENT=simd to enable.

_Developers evaluating Go's new SIMD capabilities can follow language changes like this on daily.dev._

### How do I enable Go's experimental simd package and what does GODEBUG=simd control?

Enable it by setting GOEXPERIMENT=simd when building. At runtime, GODEBUG=simd controls vector width selection: simd=0 forces emulation, simd=128/256/512 selects a vector width and panics if unsupported, and simd=+128/+256/+512 use that width even if some specific instructions are missing, panicking only if an unsupported instruction is actually invoked (e.g., Raspberry Pi's NEON lacking PMULL, or Apple Silicon's amd64 emulation lacking VPCLMULQDQ).

_Anyone tuning cross-platform SIMD builds can track these Go runtime flags on daily.dev._

### How does Go's portable simd package handle operations that aren't available on every SIMD architecture?

The simd package restricts itself to operations supported across all target platforms and fills gaps in that intersection with efficient emulation implemented on top of other SIMD instructions. Simple gaps, like missing unsigned comparisons or per-lane shift distances, are emulated with a few extra instructions (e.g., signed comparison plus XORs), while harder cases like carryless multiply get constant-time emulation so it stays safe for cryptographic use.

_Engineers designing cross-architecture vector code can dig into these emulation trade-offs on daily.dev._

## Similar posts on daily.dev

- [proposal: simd: architecture-specific SIMD intrinsics under a GOEXPERIMENT · Issue \#73787 · golang/go](https://daily.dev/posts/proposal-simd-architecture-specific-simd-intrinsics-under-a-goexperiment-issue-73787-golang-g-6jeykph0h) · Lobsters · 3 upvotes · 0 comments

---

Tags: [#performance](https://daily.dev/tags/performance), [#hardware](https://daily.dev/tags/hardware), [#golang](https://daily.dev/tags/golang)

[View this post on daily.dev](https://daily.dev/posts/platform-independent-simd-in-go-ymat2hnb8)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Platform-independent SIMD in Go","url":"https://daily.dev/posts/platform-independent-simd-in-go-ymat2hnb8","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/platform-independent-simd-in-go-ymat2hnb8"},"datePublished":"2026-09-24T20:42:02.848Z","dateModified":"2026-09-24T20:42:29.196Z","description":"Go 1.26 and 1.27 introduce experimental SIMD APIs, with Go 1.26 shipping an architecture-dependent archsimd package for amd64 and Go 1.27 extending it to arm64...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/39b837b91d435ac673a1daa7b32a05fa?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/39b837b91d435ac673a1daa7b32a05fa?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Go","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Go","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/f416aeab0a1f4b9faa22d93768c97905","url":"https://daily.dev/sources/golang"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/platform-independent-simd-in-go-ymat2hnb8","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":12},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"performance,hardware,golang","timeRequired":"PT17M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Go","item":"https://daily.dev/sources/golang"},{"@type":"ListItem","position":3,"name":"Platform-independent SIMD in Go"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/platform-independent-simd-in-go-ymat2hnb8#faq","mainEntity":[{"@type":"Question","name":"What SIMD support does Go 1.27 add compared to Go 1.26?","acceptedAnswer":{"@type":"Answer","text":"Go 1.27 extends Go's SIMD support by adding architecture-dependent archsimd APIs for arm64 (NEON) and wasm, building on Go 1.26 which introduced archsimd only for amd64. Go 1.27 also introduces the new experimental, fully portable simd package supporting AVX, AVX2, AVX512 on amd64, NEON on arm64, and wasm's SIMD instructions, requiring GOEXPERIMENT=simd to enable. Developers evaluating Go's new SIMD capabilities can follow language changes like this on daily.dev."}},{"@type":"Question","name":"How do I enable Go's experimental simd package and what does GODEBUG=simd control?","acceptedAnswer":{"@type":"Answer","text":"Enable it by setting GOEXPERIMENT=simd when building. At runtime, GODEBUG=simd controls vector width selection: simd=0 forces emulation, simd=128/256/512 selects a vector width and panics if unsupported, and simd=+128/+256/+512 use that width even if some specific instructions are missing, panicking only if an unsupported instruction is actually invoked (e.g., Raspberry Pi's NEON lacking PMULL, or Apple Silicon's amd64 emulation lacking VPCLMULQDQ). Anyone tuning cross-platform SIMD builds can track these Go runtime flags on daily.dev."}},{"@type":"Question","name":"How does Go's portable simd package handle operations that aren't available on every SIMD architecture?","acceptedAnswer":{"@type":"Answer","text":"The simd package restricts itself to operations supported across all target platforms and fills gaps in that intersection with efficient emulation implemented on top of other SIMD instructions. Simple gaps, like missing unsigned comparisons or per-lane shift distances, are emulated with a few extra instructions (e.g., signed comparison plus XORs), while harder cases like carryless multiply get constant-time emulation so it stays safe for cryptographic use. Engineers designing cross-architecture vector code can dig into these emulation trade-offs on daily.dev."}}]}
```

