2 poin oleh GN⁺ 2025-02-23 | 1 komentar | Bagikan ke WhatsApp

Pengenalan

  • Selamat datang di pelajaran bahasa assembly FFmpeg. Pelajaran ini memberikan dasar tentang bagaimana bahasa assembly ditulis di FFmpeg.

Pengetahuan yang Dibutuhkan

  • Diperlukan pengetahuan tentang bahasa C, terutama pointer.
  • Diperlukan pengetahuan matematika tingkat sekolah menengah atas (skalar dan vektor, penjumlahan, perkalian, dan sebagainya).

Apa itu bahasa assembly?

  • Bahasa assembly adalah bahasa pemrograman untuk menulis kode yang secara langsung berkorespondensi dengan instruksi yang diproses CPU.
  • Sebagian besar kode assembly FFmpeg adalah SIMD (Single Instruction Multiple Data), yang juga disebut pemrograman vektor.
  • SIMD cocok untuk memproses banyak data yang disimpan secara berurutan di memori, seperti gambar, video, dan audio.

Mengapa menulis dalam bahasa assembly?

  • Untuk mempercepat pemrosesan multimedia. Dengan menulis dalam kode assembly, peningkatan kecepatan lebih dari 10 kali bisa diperoleh.
  • Di FFmpeg, kode assembly ditulis langsung tanpa menggunakan intrinsic. Intrinsic biasanya 10-15% lebih lambat daripada assembly yang ditulis manual.

Jenis bahasa assembly

  • Pelajaran ini berfokus pada bahasa assembly x86 64-bit. Ini juga dikenal sebagai amd64 dan juga berjalan pada CPU Intel.
  • Ada dua sintaks assembly x86, yaitu AT&T dan Intel, dan yang akan digunakan adalah sintaks Intel.

Materi pendukung

  • Pemrograman assembly FFmpeg berfokus pada pemrosesan gambar berperforma tinggi dan memiliki pendekatan yang unik.
  • Diagram dari buku "The Art of 64-bit assembly" bisa membantu.

Register

  • Register adalah area di CPU tempat data diproses. CPU tidak memanipulasi memori secara langsung; data dimuat ke register untuk diproses lalu ditulis kembali ke memori.

Register tujuan umum

  • Register tujuan umum (GPR) dapat berisi data atau alamat memori. Dalam kode assembly FFmpeg, GPR terutama berperan sebagai pijakan.

Register vektor

  • Register vektor (SIMD) berisi beberapa elemen data. Ada berbagai jenis register vektor.
  • Sebagian besar perhitungan kompresi dan dekompresi video berbasis bilangan bulat.

Menyertakan x86inc.asm

  • x86inc.asm adalah lapisan abstraksi ringan yang digunakan di FFmpeg, x264, dan dav1d untuk memudahkan pekerjaan programmer assembly.

Kode assembly skalar sederhana

  • Menjelaskan bagaimana kode assembly skalar bekerja melalui contoh kode.

Memahami fungsi vektor dasar

  • Melalui contoh fungsi SIMD pertama, dijelaskan arti setiap baris.
  • Operasi vektor dilakukan menggunakan instruksi seperti movu, paddb.
  • Fungsi memodifikasi data argumen dan tidak mengembalikan nilai.

1 komentar

 
GN⁺ 2025-02-23
Komentar Hacker News
  • Ada materi lain untuk topik yang sama, yaitu kasus FFmpeg dan dav1d

    • FFmpeg sering digunakan sehingga bisa dianggap sebagai contoh penggunaan yang jelas
    • dav1d digunakan di browser utama dan sistem operasi Android, dan faktor besar keberhasilannya adalah SIMD yang ditulis tangan
    • Sebagian kode dav1d dieksekusi triliunan kali per hari sehingga harus berjalan secepat mungkin
    • Perbedaan performa antara SIMD yang ditulis tangan dan SIMD yang dihasilkan kompiler bisa mencapai 50%
    • Untuk mempertahankan keterampilan semacam ini, sumber daya seperti sekolah bahasa assembly FFmpeg itu penting
  • Saya pikir menggunakan intrinsic lebih bernilai daripada menulis assembly, tetapi membacanya sangat berguna

    • Menggunakan Compiler Explorer untuk memahami optimasi yang dilakukan kompiler demi mengoptimalkan performa
  • Saya rasa panduan ini sangat luar biasa

    • Saat dulu tertarik pada hal-hal low-level, saya berharap punya panduan ini
  • Saya penasaran apakah ada "kesenangan" dalam belajar atau mengimplementasikan assembly

    • Apakah ada kesenangan seperti pada LISP atau RISC-V, atau apakah ini seperti COBOL yang dipelajari untuk bekerja dengan sistem tertentu dan tugas tertentu
    • Saya tidak punya alasan memakai assembly dalam pekerjaan sehari-hari, tetapi penasaran apakah layak menginvestasikan waktu untuk itu sebagai hobi
  • Sufiks "q" menunjukkan ukuran pointer, dan pada sistem 64-bit nilainya 8

    • Kalimatnya terasa membingungkan
    • "i.e" seharusnya ditulis "i.e.," dan "(" seharusnya berupa tanda kurung buka
    • "sizeof" tidak mengembalikan pointer
  • Pujian untuk referensi K&R

    • Itu buku pertama yang saya beli untuk belajar C dan pemrograman
    • Awalnya saya belajar C++, tetapi terlalu abstrak sehingga sulit dipahami
  • Kekurangan penggunaan assembly adalah kodenya bergantung pada arsitektur

    • Harus menulis kode yang berbeda untuk x86, arm, dan x86_64
    • Tidak ada cara yang benar-benar baik untuk menulis kode portabel untuk SIMD
    • Rust sedang menstabilkan API SIMD portabel, dan Zig menyediakan dukungan SIMD, tetapi FFmpeg mungkin masih tidak puas dengan kecepatannya
  • Penolakan terhadap inline assembly terasa membingungkan

    • Inline assembly tampaknya akan lebih efisien daripada pemanggilan fungsi assembly
  • Materi ini sempurna

    • Saya mengenal assembly x86 era 386, tetapi prosesor yang lebih canggih terlalu rumit
    • Saya ingin mempelajari lebih lanjut tentang SIMD pada CPU modern
  • Saya penasaran apakah pernyataan bahwa assembly 10 kali lebih cepat daripada C masih benar

    • Apakah kompiler sudah stagnan sampai-sampai tidak bisa mendekati assembly yang ditulis tangan