4 puan yazan GN⁺ 2024-10-19 | 1 yorum | WhatsApp'ta paylaş

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

 
GN⁺ 2024-10-19
Hacker News yorumları
  • NOSPLIT açıklaması: Go assembly'sinde frame boyutu ve argüman boyutunu anlatan kendine özgü bir sözdizimi

    • Frame boyutu ve argüman boyutu - ile ayrılır; bu matematiksel bir çıkarma işlemi değildir
    • go vet aracı, argüman boyutunun doğru olup olmadığını denetler
  • LLM'lerin (büyük dil modelleri) yorumlanmasına dair görüş: Kod yorumlama konusunda yanlış anlamalar olabilir

    • Yazarın bunu dürüstçe kabul etmesinin öğrenmeye yardımcı olacağı görüşü
  • Go'nun dahili assembly dili Plan9a değiniliyor: Go kendi assembly dilini kullanır

    • amd64'te int 64 bittir ve int32 kullanılırsa argüman listesinde word hizalaması yapılır
    • NOSPLIT, textflag.h içinde tanımlıdır ve yalnızca runtime'da geçerlidir
  • Rob 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

    • Yeni mimarilere ait açıklama belgeleri girdi olarak kullanılarak assembler otomatik üretilebilir
  • SIMD işlemleri için fonksiyon kullanımına dair görüş: Slice'lar üzerinde SIMD işlemleri yapabilen fonksiyonlara ihtiyaç var

    • İki slice'ı toplarken for döngüsü yerine SIMD kullanılarak paralel işleme yapılabilir
  • Go derleyicisinin tasarım felsefesi: Karmaşık derleyiciler yerine basit ve hızlı derleyiciler hedeflenir

    • Varsayılan x64 desteğine SSE ve SSE2 dahildir; performanstan çok sadelik önemsenir
  • 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

    • Ancak Go'da GPU paketleri ve topluluğu yetersiz olduğundan uygun olmayabilir