Go'da eşzamanlılık ve paralelliğin kullanımı
- Sayı hesaplama yeteneğini artırmak için Go'nun eşzamanlılık ve paralellik özelliklerinden yararlanmayı amaçlayan bir projenin tanıtımı.
- SIMD (Same Instruction Multiple Data) komutları kullanılarak donanım düzeyinde paralel hesaplama yapılabilir.
- Go derleyicisi SIMD'den yararlanmadığı için ve uygun genel amaçlı bir SIMD paketi bulunamadığından, paketi doğrudan geliştirmeye karar verildi.
Plan9 assembly dili
- Go, Plan9 adlı kendi assembly dilini kullanır; bu dil, belirli platformların komutlarını ve register'larını biraz değiştirerek kullanır.
- x86 Plan9 ile ARM Plan9 birbirinden farklıdır.
- Plan9'ın basit bir örneği üzerinden temel kullanım açıklanır.
Plan9 örneği
AddInts_amd64.s dosyası ve main.go dosyası üzerinden Plan9'da temel fonksiyon bildirimi ve kullanım biçimi açıklanır.
- Go'nun çağrı kurallarına göre fonksiyon argümanlarının ve dönüş değerlerinin stack'te nasıl saklandığı anlatılır.
Paket tasarım planı
- Aritmetik ve bit işlemleri için SIMD işlerine yönelik ince bir soyutlama katmanı sağlayan bir paket tasarlanır.
- Mimariye özel Plan9 implementasyonlarını içeren bir iç paket oluşturulur ve bu yapı başlatma fonksiyonu üzerinden ayarlanır.
SIMD örneği
- x86 SIMD Plan9 fonksiyon örnekleriyle SIMD'in kullanım biçimi açıklanır.
Supported_amd64.s ve AddFloat32_amd64.s dosyaları üzerinden SSE desteğinin nasıl kontrol edildiği ve float32 toplama işleminin nasıl yapıldığı gösterilir.
Performans ve gelecek
- Go'nun yazılım implementasyonu ile Plan9 SIMD implementasyonu arasındaki performans farkını gösteren grafik üzerinden yaklaşık %200-450 hız artışı görüldüğü belirtilir.
- Bu notların, Plan9 ve SIMD kullanan projeler için ilham vermesi umulur.
# GN⁺ özeti
- Bu yazı, Go'nun eşzamanlılık ve paralellik özelliklerini kullanarak performansı en üst düzeye çıkarmanın yollarını tanıtır.
- Plan9 assembly dili ve SIMD komutlarıyla donanım düzeyinde paralel hesaplamanın nasıl yapılabileceğini açıklar.
- Go geliştiricileri için Plan9 ve SIMD'in kullanım potansiyelini gösterir ve performans artışı için yeni yaklaşımları keşfetmede faydalı olabilir.
- Benzer işlevlere sahip projeler olarak Rust'un SIMD destek kütüphaneleri veya C++'taki SIMD ile ilgili kütüphaneler önerilir.
1 yorum
Hacker News yorumları
NOSPLITaçıklaması: Go assembly'sinde frame boyutu ve argüman boyutunu anlatan kendine özgü bir sözdizimi-ile ayrılır; bu matematiksel bir çıkarma işlemi değildirgo vetaracı, argüman boyutunun doğru olup olmadığını denetlerLLM'lerin (büyük dil modelleri) yorumlanmasına dair görüş: Kod yorumlama konusunda yanlış anlamalar olabilir
Go'nun dahili assembly dili
Plan9a değiniliyor: Go kendi assembly dilini kullanırint64 bittir veint32kullanılırsa argüman listesinde word hizalaması yapılırNOSPLIT,textflag.hiçinde tanımlıdır ve yalnızca runtime'da geçerlidirRob Pike'ın Go assembly tasarımına dair açıklaması: Yeni bir sözdizimi öğrenmeden makinelerle iletişim kurulabilmesi için ortak bir assembly dili oluşturuldu
SIMD işlemleri için fonksiyon kullanımına dair görüş: Slice'lar üzerinde SIMD işlemleri yapabilen fonksiyonlara ihtiyaç var
fordöngüsü yerine SIMD kullanılarak paralel işleme yapılabilirGo derleyicisinin tasarım felsefesi: Karmaşık derleyiciler yerine basit ve hızlı derleyiciler hedeflenir
SIMD işlemlerinde GPU kullanımına dair görüş: GPU'lar paralel işleme ve matris işlemlerinde güçlü olduğu için SIMD için daha uygun olabilir