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
Komentar Hacker News
Penjelasan tentang
NOSPLIT: ini adalah sintaks unik dalam assembly Go yang menjelaskan ukuran frame dan ukuran argumen-, dan ini bukan pengurangan matematisgo vetmemeriksa apakah ukuran argumen sudah benarPendapat tentang interpretasi LLM (model bahasa besar): mungkin ada kesalahpahaman dalam interpretasi kode
Penyebutan bahasa assembly internal Go,
Plan9: Go menggunakan bahasa assembly buatannya sendiriintadalah 64-bit, dan jika menggunakanint32, nilainya akan disejajarkan per word dalam daftar argumenNOSPLITdidefinisikan ditextflag.hdan hanya berlaku di runtimePenjelasan Rob Pike tentang desain assembly Go: membuat bahasa assembly umum agar bisa berkomunikasi dengan mesin tanpa harus mempelajari sintaks baru
Pendapat tentang penggunaan fungsi untuk operasi SIMD: diperlukan fungsi yang dapat melakukan operasi SIMD pada slice
forFilosofi desain compiler Go: mengutamakan compiler yang sederhana dan cepat daripada compiler yang kompleks
Pendapat tentang penggunaan GPU untuk operasi SIMD: GPU mungkin lebih cocok untuk operasi SIMD karena unggul dalam pemrosesan paralel dan operasi matriks