Rust dikenal sebagai bahasa yang aman, tapi ada satu area yang sejak lama jadi pengecualian: SIMD. Hampir semua abstraksi SIMD di ekosistem Rust penuh dengan blok unsafe. Crate fearless_simd dari Linebender merilis versi 1.0 pada 22 September 2026 dengan klaim yang sangat spesifik: mengeluarkan unsafe dari SIMD.
TL;DR
- Crate fearless_simd dari Linebender merilis versi 1.0 pada 22 September 2026 dengan klaim menghilangkan blok unsafe dari pemrograman SIMD di Rust.
- Penghilangan unsafe dicapai lewat dua komponen kecil yang diaudit: makro kernel! yang memanfaatkan target feature v1.1 compiler dan modul safe transmute yang terinspirasi crate bytemuck dan zerocopy.
- Untuk kasus perilaku yang berbeda antar platform seperti swizzle, crate menyediakan varian presisi dan varian cepat, serta mendukung ukuran vektor native dan tetap perangkat keras.
- Bersama rilis ini keluar fearless_simd_macros v0.1 dengan atribut # [simd] untuk multiversioning tanpa anotasi # [inline (always)] atau overhead per pemanggilan.
- Crate ini diklaim dipakai 30 crate secara langsung dan lebih dari seribu crate secara tidak langsung, dengan komitmen tiga tahun pembaruan keamanan dari Linebender.
Penulisnya, Shnatsel, menyebut proyek ini sebagai kelanjutan prototipe yang mulai delapan tahun lalu. Menurutnya, sekarang crate ini bisa melayani hampir semua kebutuhan, mulai dari autovectorization dan multiversioning, abstraksi SIMD portabel, sampai akses aman ke intrinsics.
Masalah yang coba diselesaikan
SIMD, atau single instruction multiple data, adalah teknik memproses beberapa nilai sekaligus dalam satu instruksi CPU. Untuk pekerjaan seperti pemrosesan gambar, kompresi, parsing, dan komputasi numerik, SIMD bisa memberi lompatan performa yang besar.
Masalahnya, hampir semua abstraksi SIMD di Rust terpaksa memakai unsafe. Argumen Shnatsel cukup tajam: kalau sumber kode abstraksi SIMD apa pun dicari dengan pola rg unsafe, hasilnya bisa mencapai beberapa ribu blok. Selama ini itu diterima sebagai konsekuensi wajar, karena bekerja dengan register vektor dan pointer mentah memang dianggap butuh kode tidak aman.
fearless_simd menolak asumsi itu. Klaim utamanya bukan cuma "lebih sedikit unsafe", melainkan tidak butuh unsafe ad hoc sama sekali.
Bagaimana unsafe dihilangkan
Ada dua bagian yang jadi kunci, dan keduanya sengaja dibuat kecil dan mandiri.
Pertama, makro kernel!. Makro ini bersandar pada target feature v1.1 di compiler untuk memanggil sebagian besar intrinsics SIMD tanpa unsafe. Dengan begitu, bagian terbesar dari masalah hilang di level compiler, bukan di level pembungkus manual.
Kedua, modul safe transmute. Makro kernel! belum menutup operasi load dan store SIMD yang bekerja pada pointer mentah. Di situlah modul transmute yang aman masuk. Modul ini terinspirasi crate seperti bytemuck dan zerocopy.
Alasan pendekatannya bisa dipertanggungjawabkan: intrinsics SIMD seperti _mm_loadu_epi32 terlihat istimewa, tapi sebenarnya hanya berujung pada load dan store biasa. Artinya fungsinya bisa direplikasi penuh dengan satu pembungkus yang bisa dipakai ulang. Karena itu, hanya dua blok kecil yang perlu diaudit. Selama keduanya memory-safe, seluruh sisa kode dijamin memory-safe juga.
Performa: klaim utamanya tidak mengorbankan kecepatan
Kritik yang paling sering dialamatkan ke abstraksi SIMD portabel adalah performanya kurang. Tim fearless_simd mengaku menaruh banyak usaha supaya crate ini tidak jadi penghambat, dan ada beberapa keputusan desain yang menarik di situ.
Salah satunya soal operasi yang perilakunya berbeda di kondisi tepi antar platform, seperti swizzle atau perhitungan nilai maksimum bilangan floating-point. Untuk kasus seperti itu, crate ini menyediakan dua varian: varian presisi yang hasilnya sama di semua platform, dan varian cepat yang hasilnya bergantung platform untuk dipakai ketika kondisi tepi diperkirakan tidak akan terjadi.
Selain itu, algoritma SIMD bisa dinyatakan dalam ukuran vektor native perangkat keras, sehingga kode selalu memanfaatkan perangkat sepenuhnya di mana pun ia berjalan. Ukuran vektor tetap juga tetap didukung untuk algoritma yang memang membutuhkannya.
Yang juga layak dicatat: tim ini mengklaim sudah menyumbang perbaikan ke hulu, baik ke Rust maupun ke LLVM, supaya implementasi operasi SIMD portabel mereka setara dengan yang terbaik. Dan kalau ada instruksi yang tidak tercakup abstraksi portabel, pengguna bisa turun ke platform intrinsics secara aman tanpa overhead, untuk bagian kode yang memang butuh. Karena akses ke intrinsics-nya aman, klaim mereka, tidak ada plafon performa.
Ergonomics: dari #[inline(always)] ke atribut #[simd]
Function multiversioning, yaitu kemampuan menyediakan beberapa implementasi fungsi untuk level instruksi CPU berbeda lalu memilih yang sesuai saat runtime, selama ini merepotkan. Solusi sebelumnya, menurut penulisnya, punya dua kelemahan: ada yang mengharuskan menambahkan anotasi #[inline(always)] plus memahami implikasinya, ada yang membebankan sedikit overhead di setiap pemanggilan fungsi.
Overhead kecil biasanya tidak masalah, tapi jadi masalah untuk fungsi yang sangat pendek, dan tetap menuntut penambahan #[inline(always)] secara manual untuk menghindarinya. Penulisnya menyebut keduanya sebagai abstraksi bocor, karena pengguna masih harus memikirkan apa yang terjadi di balik layar.
Bersamaan dengan fearless_simd v1.0, dirilis juga fearless_simd_macros v0.1 yang menyediakan atribut #[simd]. Cara pakainya sesederhana menempelkan atribut itu pada fungsi SIMD. Bentuk penandaannya kurang lebih seperti ini, dan detail lengkapnya ada di dokumentasi crate:
// multiversioning ditangani compiler, pengguna cukup menandai fungsinya
#[simd]
fn proses(data: &mut [f32]) {
// implementasi SIMD
}
Penulisnya tetap jujur soal batasnya. Masih ada sejumlah boilerplate yang terlibat, dan mereka ingin menguranginya lebih jauh, salah satunya lewat dukungan compiler melalui Struct Target Features RFC supaya anotasi #[simd] tidak perlu sama sekali. Ergonomics disebut sebagai satu-satunya area yang kemungkinan masih akan berkembang, tapi itu tidak mengorbankan jaminan stabilitas crate intinya. Kode yang ditulis hari ini, dengan atau tanpa makro #[simd], disebut akan terus berjalan tanpa batas waktu.
Adopsi: 30 crate langsung, lebih dari seribu tidak langsung
Bagian ini yang sering menentukan apakah sebuah crate layak dipakai di proyek produksi. Penulisnya sendiri menulis, tidak peduli seberapa cerdas crate-mu kalau tidak ada yang memakainya.
Angka yang disebut: fearless_simd sudah dipakai 30 crate lain sebagai dependensi langsung, dan diandalkan secara tidak langsung oleh lebih dari seribu crate. Menurut penulisnya, crate ini sudah menopang sebagian nyata dari ekosistem Rust, dan rilis 1.0 diharapkan memperluasnya lagi.
💬 Komentar (0)
Belum ada komentar. Jadilah yang pertama! 💬