
Go 1.27 platformdan asılı olmayan eksperimental SIMD interfeysi əlavə edib
Go komandası prosessor arxitekturaları arasındakı fərqləri gizlədən eksperimental simd paketini təqdim edib. Bir dəfə yazılan vektor kodu artıq hər yerdə işləyir, SIMD dəstəyi olmayan platformalarda isə əməliyyatlar emulyasiya ilə icra olunur.
Go 1.27 müxtəlif prosessor arxitekturalarında eyni cür davranan eksperimental SIMD interfeysi təqdim edib. Bu barədə Go komandasından David Çeys və Cunyan Şao 24 sentyabr 2026-cı ildə dərc olunan bloq yazısında məlumat verib. İndiyədək SIMD üçün assembly kodu yazmaq ya da Go 1.26 və 1.27-də əlavə edilən arxitekturadan asılı API-lərlə kifayətlənmək lazım idi.
SIMD bir təlimatın bütöv bir dəyər vektoru üzərində işləməsinə imkan verir, məsələn səkkiz cüt float64 ədədini eyni anda toplayır. O, kriptoqrafiyanı və məlumat emalını sürətləndirir; Go-nun Green Tea zibil toplayıcısı da yaddaşı canlı obyektlər üçün skan edərkən SIMD-dən istifadə edir.
archsimd üzərində portativ qat
Go 1.26 amd64 üçün SIMD API-si gətirdi, Go 1.27 isə arm64 (NEON) və wasm API-lərini əlavə etdi. Onlar arxitekturadan asılı olan archsimd paketində yaşayır: platformalar həm əməliyyatlarla, həm də vektorların təqdimatı ilə fərqlənir, ölçü isə bəzi platformalarda 128-512 bit aralığında sabit, digərlərində yalnız proqram başlayanda bilinir.
C++ üçün Highway-dən qismən ilhamlanan yeni simd paketi sabit ölçülü vektorları tip sistemindən çıxarır, yalnız bütün platformalarda olan əməliyyatları saxlayır və boşluqları emulyasiya ilə doldurur. Vektor tipləri böyük hərflə başlayan, cəm şəkilli primitivlərdir, məsələn simd.Uint8s; müqayisələr elementin eninə bağlı maskalar qaytarır (Int8s üçün Mask8s). ToArch() metodu vektoru platformaya xas tipə çevirir, hamısını isə GOEXPERIMENT=simd işə salır.
Platformalar niyə fərqlənir
wasm, PowerPC və s390x bir sabit vektor ölçüsünə malikdir (128 bit), amd64 üç, loong64 isə iki ölçü təklif edir. RISC-V-də uzunluq yığılma anında məlum deyil, arm64 sabit NEON-u dəyişkən enli SVE ilə birləşdirir, maskalama isə müxtəlif yollarla həyata keçirilir.
Emulyasiya və dispetçerlik
Bir çox boşluq cəmi iki-üç təlimatla bağlanır: skalyar sürüşmələr vektor sürüşmələri ilə emulyasiya olunur, çatışmayan işarəsiz müqayisələr isə işarəli müqayisə və sabitlə iki XOR-a çevrilir. Kriptoqrafiya və CRC yoxlama cəmləri üçün vacib olan carryless multiply sabit zamanda emulyasiya edilir, aparat SIMD dəstəyi olmayan platformalarda isə bütün əməliyyatlar emulyasiya olunur, ona görə kod yenə də işləyir.
GODEBUG parametrləri konkret aparat profillərinə qarşı test etməyə imkan verir: simd=0 emulyasiyanı məcbur edir, simd=128, 256 və 512 vektor enini seçir və xüsusiyyətlər yoxdursa panika yaradır, +128, +256 və +512 formaları isə çatışmayan imkanlara dözür, məsələn Raspberry Pi-də (PMULL olmadan NEON). Kompilyatorun ön hissəsində AST-nin yenidən yazılması simd tiplərini qeyd edən funksiyaları xüsusiləşdirir, qalanlarını isə başlanğıcda aşkarlanan SIMD səviyyəsinə görə keçid edən wrapper-lərə çevirir, beləliklə hər əməliyyat üzrə dispetçerlik xərci yaranmır.
Sırada nə var
Go 1.28-də OnesCount, maska, reduksiya və vektor qarışdırma əməliyyatlarının, archsimd və inşallah simd üçün SVE dəstəyinin, həmçinin yalnız bir-iki təlimatı çatışmayan maşınlarda tam emulyasiyaya düşməyin qarşısını alan feature variant dəsti əlavə ediləcək. Cari API-nin tələb etdiyi əl ilə toplama dövrəsini əvəzləyəcək ReduceSum da gələcək.
SiTech — AI ilə gücləndirilmiş veb hazırlanması
Sürətli və müasir saytlar qurur, AI-ı real biznes proseslərinə gətiririk. Layihəniz və ya sualınız var? Kömək etməyə hazırıq.