
Go 1.27, platformdan bağımsız deneysel SIMD arayüzünü ekledi
Go ekibi, işlemci mimarileri arasındaki farkları gizleyen deneysel simd paketini tanıttı. Bir kez yazılan vektör kodu artık her yerde çalışıyor; donanım desteği olmayan platformlarda işlemler emülasyonla yürütülüyor.
Go 1.27, farklı işlemci mimarilerinde aynı şekilde davranan deneysel bir SIMD arayüzü getiriyor. Go ekibinden David Chase ve Junyang Shao bunu 24 Eylül 2026'da yayımlanan blog yazısında anlattı. Bugüne kadar SIMD kullanmak isteyen geliştiriciler assembly yazmak ya da mimariye bağımlı API'lerle yetinmek zorundaydı.
SIMD, tek bir komutun bir değer vektörü üzerinde çalışmasını sağlar; örneğin sekiz çift float64 sayısını aynı anda toplar. Kriptografiyi, veri işlemeyi ve AI iş yüklerini hızlandırır; Go'nun Green Tea çöp toplayıcısı da belleği canlı nesneler için tararken SIMD'den yararlanıyor.
archsimd üzerinde taşınabilir katman
Go 1.26 amd64 için bir SIMD API'si getirdi; Go 1.27 ise arm64 (NEON) ve wasm API'lerini ekledi. Bu API'ler, mimariye bağımlı archsimd paketinde yaşıyor; çünkü platformlar hem sundukları işlemlerde hem de vektörlerin temsilinde farklılaşıyor: bazılarında boyut 128 ile 512 bit arasında sabit, bazılarında ise ancak program başlarken öğreniliyor.
C++ için Highway'den kısmen esinlenen yeni simd paketi, sabit boyutlu vektörleri tip sisteminden çıkarıyor ve yalnızca tüm platformlarda bulunan işlemleri destekliyor, boşlukları emülasyonla dolduruyor. Vektör tipleri, simd.Uint8s veya simd.Float32s gibi büyük harfle başlayan, çoğul ilkel tipler. Karşılaştırmalar, öğe genişliğine bağlı maskeler döndürüyor; Int8s karşılaştırması Mask8s üretiyor. ToArch() yöntemi vektörü platforma özgü bir tipe çeviriyor ve her şey GOEXPERIMENT=simd ile etkinleştiriliyor.
Platformlar neden farklı
wasm, PowerPC ve s390x tek bir sabit vektör boyutuna sahip (128 bit), amd64 üç, loong64 ise iki boyut sunuyor. RISC-V'de vektör uzunluğu derleme anında bilinmiyor, arm64 sabit NEON'u değişken genişlikli SVE ile birleştiriyor ve maskeleme de farklı çalışıyor.
Emülasyon ve dağıtım
Birçok boşluk iki üç komutla kapanıyor: skaler kaydırmalar vektör kaydırmalarıyla emüle ediliyor, eksik işaretsiz karşılaştırmalar ise işaretli karşılaştırma ve bir sabitle iki XOR'a dönüşüyor. Kriptografi ve CRC için önemli olan carryless multiply sabit zamanda emüle ediliyor; donanım SIMD desteği olmayan makinelerde tüm işlemler emüle edildiği için kod yine de çalışıyor.
GODEBUG ayarları belirli donanım profillerine karşı test yapmayı sağlıyor: simd=0 emülasyonu zorluyor, simd=128, 256 ve 512 vektör genişliğini seçiyor ve özellikler yoksa panik yaratıyor; +128, +256 ve +512 biçimleri ise eksik özelliklere katlanıyor. Ekip örnek olarak Raspberry Pi'yi (PMULL olmadan NEON) gösteriyor. Derleyicinin ön ucundaki AST yeniden yazımı, simd tiplerinden söz eden fonksiyonları özelleştirip diğerlerini, başlangıçta saptanan SIMD düzeyine göre dallanan sarmalayıcılara çeviriyor; böylece her işlemde dağıtım maliyeti oluşmuyor.
Sırada ne var
Go 1.28'de OnesCount, maske, indirgeme ve vektör karıştırma işlemlerinin, archsimd ve umarız simd için SVE desteğinin yanı sıra yalnızca bir iki komutu eksik makinelerde tam emülasyona düşmeyi önleyen küçük bir özellik varyantı kümesinin eklenmesi planlanıyor. Mevcut API'nin gerektirdiği elle toplama döngüsünü değiştirecek ReduceSum da gelecek.
SiTech — AI destekli web geliştirme
Hızlı ve modern web siteleri kuruyor, AI'yı gerçek iş akışlarına taşıyoruz. Projeniz veya sorunuz mu var? Yardımcı olmaktan mutluluk duyarız.