Ini adalah decode semu dari presentasi saya di !! Con 2019 .Sebagian besar arsitektur prosesor yang digunakan saat ini memiliki instruksi yang disebut
popcount
, kependekan dari 'jumlah penduduk'. Dia melakukan yang berikut: menghitung jumlah bit yang diatur dalam kata mesin. Misalnya (mari kita ambil kata 8-bit untuk kesederhanaan),
popcount(00100110)
adalah 3, dan
popcount(01100000)
adalah 2.
Ini mungkin akan sangat mengejutkan Anda, sama seperti saya, tetapi hanya itu yang dia lakukan! Sepertinya tidak terlalu membantu, bukan?
Saya pikir ini adalah beberapa tambahan baru untuk beberapa kasus penggunaan khusus, tetapi sebenarnya sudah ada di arsitektur prosesor sejak setidaknya 1961:
Jadi apa yang sedang terjadi?
Instruksi NSA
popcount
juga dikenal sebagai "instruksi NSA", dan
utas yang sangat menarik tentang comp.arch membahas penggunaannya dalam kriptografi. Rumor mengatakan bahwa itu awalnya ditambahkan ke set instruksi CPU atas permintaan NSA. Sebagaimana dinyatakan dalam
utas arsip yang diarsipkan ini :
Hampir merupakan tradisi untuk mengirim satu dari setiap batch mobil CDC yang lebih cepat ke "klien yang baik" - sebuah truk tak dikenal tiba dan tidak pernah terdengar lagi.
Legenda yang hebat, tetapi mengapa mereka menggunakannya?
Salah satu ukuran konten adalah
bobot Hamming , yang merupakan jumlah karakter bukan nol dalam sebuah string. Untuk string biner, ini adalah
popcount
!
Seperti yang
dijelaskan di sini , NSA memerlukan cryptanalysis dari pesan yang dicegat, dan karena CDC 6000 bekerja dengan kata-kata 60-bit, satu kata sudah cukup untuk menyimpan sebagian besar huruf yang menarik mereka. Mereka mampu:
- Membagi pesan menjadi beberapa baris
- Tetapkan sedikit untuk setiap karakter unik dalam string
- Gunakan
popcount
untuk menghitung jumlah karakter yang berbeda
- Gunakan penghitung sebagai hash untuk kriptanalisis lebih lanjut
Anehnya,
popcount
tampaknya telah menghilang dari set instruksi antara pertengahan 1970-an dan pertengahan 2000-an, sehingga pengembalian harus dijelaskan oleh sesuatu selain aplikasi kriptografi. Apa lagi yang bisa digunakan untuk itu?
Perbaikan bug
Konsep berat Hamming terkait dengan
jarak Hamming , yang merupakan jumlah posisi yang berbeda antara dua garis dengan panjang yang sama. Untuk dua string biner
x
dan
y
, ini hanya
popcount
setelah XOR. Sebagai contoh:
00100110
01100000 ^
--------
01000110
popcount (01000110) = 3
Dalam aplikasi telekomunikasi, ini membantu untuk menghitung jarak sinyal, di mana kata yang dikenal dikirim sepanjang kabel dan jumlah bit yang diubah dihitung untuk memperkirakan kesalahan transmisi.
Kemudian kita dapat merancang
kode koreksi kesalahan yang sesuai. Misalnya, jika suatu transmisi harus tahan hingga dua bit yang dimodifikasi, maka kata-kata kode harus berbeda setidaknya 5 dalam jarak Hamming.
Jaringan saraf convolutional biner
Dan sekarang sesuatu yang sama sekali berbeda: jaringan saraf konvolusional biner! Tapi pertama-tama, apa itu?
- Biner berarti bahwa kita hanya menggunakan matriks dari nilai +1 (disandikan sebagai 1) dan -1 (disandikan sebagai 0), berbeda dengan nilai titik apung 32-bit.
- Apakah konvolusi berarti perkalian matriks?
- Jaringan saraf adalah sistem yang terinspirasi oleh otak hewan (di sini saya sedikit berenang).
Jadi, kita harus melakukan penggandaan matriks biner. Tetapi apa yang spesial dari matriks biner?
Penggandaan matriks konvensional dengan nilai 32-bit sangat cocok untuk komputer desktop dengan CPU dan GPU yang kuat, tetapi semakin kami ingin melakukan pekerjaan yang bermanfaat pada perangkat kecil dan sederhana seperti smartphone, router, jam tangan pintar, dll. Kita dapat menguraikan ini matriks yang lebih kompleks untuk lapisan matriks biner, dan lebih mudah untuk bekerja dengannya dan menyimpannya sehingga kami mendapat manfaatnya meskipun ada peningkatan jumlah lapisan.
Di
popcount
berperan. Ini digunakan untuk menghitung produk skalar dari dua matriks biner:
a = xnor (x, y)
b = popcount (a)
c = len (a)
titik (x, y) = 2 × b - c
Lihat di
sini dan di
sini untuk perincian lebih lanjut.
Pemrograman catur
Banyak program catur menyimpan data dalam representasi
bitboard , yang cocok dengan kata 64-bit. Operasi
Population Count
digunakan untuk operasi yang berarti dengan pandangan ini, seperti menghitung
mobilitas suatu gambar.
Sidik jari molekuler
Ini juga terkait dengan jarak Hamming: molekul-molekul itu entah bagaimana di hash dan dibandingkan (menggunakan
popcount
) untuk menentukan seberapa miripnya mereka. Lihat di
sini untuk detail lebih lanjut.
Mencoba memetakan array Hash (HAMT)
Di sinilah saya pertama kali belajar tentang
popcount
! HAMT adalah struktur data (
pertama kali dibuat oleh Phil Bagwell ) yang dapat menyimpan sejumlah besar nilai (biasanya 32 atau 64) dalam sebuah array pada setiap node trie. Namun, mengalokasikan memori untuk array elemen 32 atau 64 dapat menjadi sangat boros setiap kali, terutama jika array hanya mengandung beberapa elemen. Solusinya adalah dengan menambahkan bitmask di mana jumlah bit yang ditetapkan sesuai dengan jumlah elemen dalam array, yang memungkinkan array untuk tumbuh dan berkontraksi sesuai kebutuhan. Perhitungan indeks untuk elemen yang diberikan dapat secara efektif dilakukan menggunakan
popcount
. Dalam
posting blog saya tentang penerapan struktur HAMT, Anda dapat mempelajari lebih lanjut tentang cara kerjanya.
Struktur Data Terkompresi
Ini adalah bidang penelitian baru yang menarik yang berfokus pada cara menyimpan data dalam ruang minimal tanpa membongkar untuk melakukan pekerjaan yang bermanfaat. Salah satu metode adalah berpikir dalam hal array bit (vektor bit) yang dapat diminta dalam dua operasi:
rank(i)
menghitung jumlah bit yang diberikan hingga indeks ke-i dalam vektor bit
select(i)
menemukan indeks di mana bit ke-i diatur
Untuk membuat operasi ini efisien pada vektor bit besar, Anda perlu membuat indeks dan menggunakannya secara efektif, dalam kedua kasus yang melibatkan
popcount
. Berikut ini adalah ikhtisar yang baik dari indeks RRR. Dan, sejauh yang saya tahu, pendekatan modern paling maju dijelaskan dalam artikel
Space-Efficient, Peringkat Berkinerja Tinggi & Struktur Pilihan pada Sekuen Bit Terkompresi .
Optimalisasi kompiler
popcount
telah menjadi begitu luas sehingga
GCC dan
Clang dapat mendeteksi dan menggantinya dengan instruksi
popcount
. Bayangkan ini Clippy: "Oh, saya melihat bahwa Anda mencoba menerapkan
popcount
, biarkan saya keluar dan memperbaikinya untuk Anda!" Kode LLVM yang sesuai ada di
sini . Daniel Lemyr mengutipnya sebagai contoh pikiran luar biasa dari kompiler modern.
Kesimpulan
Terselubung dalam misteri di awal sejarahnya, instruksi
popcount
digunakan di mana-mana, meskipun tetap sedikit instruksi CPU yang tidak biasa. Saya suka cara menghubungkan berbagai bidang ilmu komputer, dan saya bertanya-tanya berapa banyak instruksi aneh lainnya yang ada. Jika Anda memiliki favorit sendiri, saya ingin mendengar tentang dia!