4 poin oleh GN⁺ 2024-10-19 | 1 komentar | Bagikan ke WhatsApp

Memanfaatkan konkurensi dan paralelisme di Go

  • Pengantar tentang proyek yang bertujuan meningkatkan kemampuan komputasi numerik dengan memanfaatkan konkurensi dan paralelisme di Go.
  • Dengan menggunakan instruksi SIMD (Same Instruction Multiple Data), komputasi paralel dapat dijalankan pada level perangkat keras.
  • Compiler Go tidak memanfaatkan SIMD, dan karena tidak menemukan paket SIMD serbaguna yang sesuai, penulis memutuskan untuk mengembangkan paketnya sendiri.

Bahasa assembly Plan9

  • Go menggunakan bahasa assembly miliknya sendiri bernama Plan9, yang memakai instruksi dan register platform tertentu dengan sedikit modifikasi.
  • Plan9 untuk x86 dan Plan9 untuk ARM berbeda satu sama lain.
  • Melalui contoh sederhana Plan9, artikel ini menjelaskan cara penggunaan dasarnya.

Contoh Plan9

  • Melalui file AddInts_amd64.s dan main.go, artikel ini menjelaskan deklarasi fungsi dasar di Plan9 dan cara menggunakannya.
  • Dijelaskan juga cara menyimpan argumen fungsi dan nilai kembalian ke stack sesuai calling convention Go.

Rencana desain paket

  • Dirancang sebuah paket yang menyediakan lapisan abstraksi tipis untuk operasi SIMD aritmetika dan bit.
  • Dibuat paket internal yang mencakup implementasi Plan9 per arsitektur, lalu dikonfigurasi melalui fungsi inisialisasi.

Contoh SIMD

  • Cara menggunakan SIMD dijelaskan melalui contoh fungsi Plan9 SIMD untuk x86.
  • Melalui file Supported_amd64.s dan AddFloat32_amd64.s, ditunjukkan cara memeriksa dukungan SSE dan menjalankan operasi penjumlahan float32.

Performa dan masa depan

  • Melalui grafik yang menunjukkan perbedaan performa antara implementasi perangkat lunak Go dan implementasi Plan9 SIMD, terlihat peningkatan kecepatan sekitar 200–450%.
  • Penulis berharap memo ini dapat menginspirasi proyek yang menggunakan Plan9 dan SIMD.

# Ringkasan GN⁺

  • Artikel ini memperkenalkan cara memaksimalkan performa dengan memanfaatkan konkurensi dan paralelisme di Go.
  • Dijelaskan bagaimana menggunakan bahasa assembly Plan9 dan instruksi SIMD untuk menjalankan komputasi paralel pada level perangkat keras.
  • Artikel ini menunjukkan kemungkinan pemanfaatan Plan9 dan SIMD bagi para pengembang Go, dan dapat berguna untuk mengeksplorasi pendekatan baru dalam peningkatan performa.
  • Untuk proyek dengan fungsi serupa, direkomendasikan pustaka dukungan SIMD di Rust atau pustaka terkait SIMD di C++.

1 komentar

 
GN⁺ 2024-10-19
Komentar Hacker News
  • Penjelasan tentang NOSPLIT: ini adalah sintaks unik dalam assembly Go yang menjelaskan ukuran frame dan ukuran argumen

    • Ukuran frame dan ukuran argumen dipisahkan dengan -, dan ini bukan pengurangan matematis
    • Alat go vet memeriksa apakah ukuran argumen sudah benar
  • Pendapat tentang interpretasi LLM (model bahasa besar): mungkin ada kesalahpahaman dalam interpretasi kode

    • Ada pendapat bahwa akan membantu pembelajaran jika penulis mengakuinya secara jujur
  • Penyebutan bahasa assembly internal Go, Plan9: Go menggunakan bahasa assembly buatannya sendiri

    • Pada amd64, int adalah 64-bit, dan jika menggunakan int32, nilainya akan disejajarkan per word dalam daftar argumen
    • NOSPLIT didefinisikan di textflag.h dan hanya berlaku di runtime
  • Penjelasan Rob Pike tentang desain assembly Go: membuat bahasa assembly umum agar bisa berkomunikasi dengan mesin tanpa harus mempelajari sintaks baru

    • Assembler dapat dibuat secara otomatis dengan menggunakan manual arsitektur baru sebagai input
  • Pendapat tentang penggunaan fungsi untuk operasi SIMD: diperlukan fungsi yang dapat melakukan operasi SIMD pada slice

    • Saat menjumlahkan dua slice, SIMD bisa digunakan untuk memprosesnya secara paralel alih-alih memakai loop for
  • Filosofi desain compiler Go: mengutamakan compiler yang sederhana dan cepat daripada compiler yang kompleks

    • Dukungan x64 dasar mencakup SSE dan SSE2, dengan fokus pada kesederhanaan dibanding performa
  • Pendapat tentang penggunaan GPU untuk operasi SIMD: GPU mungkin lebih cocok untuk operasi SIMD karena unggul dalam pemrosesan paralel dan operasi matriks

    • Namun, di Go hal ini mungkin kurang cocok karena paket GPU dan komunitasnya masih terbatas