2 puan yazan GN⁺ 2025-02-23 | 1 yorum | WhatsApp'ta paylaş

Giriş

  • FFmpeg’in assembly dili dersine hoş geldiniz. Bu ders, assembly dilinin FFmpeg’de nasıl yazıldığına dair temel bilgileri sunar.

Gerekli bilgi

  • C dili, özellikle de pointer’lar hakkında bilgi gereklidir.
  • Lise düzeyinde matematik bilgisi (skaler ve vektör, toplama, çarpma vb.) gereklidir.

Assembly dili nedir?

  • Assembly dili, CPU’nun işlediği komutlara doğrudan karşılık gelen kodun yazıldığı bir programlama dilidir.
  • FFmpeg’deki assembly kodlarının çoğu SIMD’dir (Single Instruction Multiple Data); buna vektör programlama da denir.
  • SIMD, görüntü, video ve ses gibi bellekte sıralı olarak depolanan çok sayıdaki veriyi işlemek için uygundur.

Neden assembly diliyle yazılır?

  • Multimedya işleme hızını artırmak içindir. Assembly koduyla yazıldığında 10 katın üzerinde hız artışı elde edilebilir.
  • FFmpeg’de intrinsics kullanılmaz, bunun yerine doğrudan assembly kodu yazılır. Intrinsics genellikle elle yazılmış assembly’den %10-15 daha yavaştır.

Assembly dili türleri

  • Bu ders x86 64-bit assembly diline odaklanır. Bu mimari amd64 olarak da bilinir ve Intel CPU’larda da çalışır.
  • x86 assembly söz diziminde AT&T ve Intel olmak üzere iki tür vardır; bu derste Intel söz dizimi kullanılacaktır.

Destekleyici kaynaklar

  • FFmpeg assembly programlama, yüksek performanslı görüntü işlemeye odaklanır ve kendine özgü bir yaklaşım benimser.
  • "The Art of 64-bit assembly" kitabındaki diyagramlar faydalı olabilir.

Register’lar

  • Register’lar, CPU içinde verinin işlendiği alanlardır. CPU belleği doğrudan işlemez; veriyi register’lara yükleyip işledikten sonra tekrar belleğe yazar.

Genel amaçlı register’lar

  • Genel amaçlı register’lar (GPR), veri veya bellek adresi içerebilir. FFmpeg’in assembly kodunda GPR’ler çoğunlukla birer dayanak noktası görevi görür.

Vektör register’lar

  • Vektör (SIMD) register’ları birden fazla veri öğesi içerir. Farklı türlerde vektör register’ları vardır.
  • Video sıkıştırma ve açma hesaplamalarının çoğu tamsayı tabanlıdır.

x86inc.asm dahil etme

  • x86inc.asm, FFmpeg, x264 ve dav1d’de assembly programcılarının işini kolaylaştırmak için kullanılan hafif bir soyutlama katmanıdır.

Basit skaler assembly kodu

  • Örnek kod üzerinden skaler assembly kodunun nasıl çalıştığı açıklanır.

Temel vektör fonksiyonlarını anlamak

  • İlk SIMD fonksiyonu örneği üzerinden her satırın ne anlama geldiği açıklanır.
  • movu, paddb gibi komutlar kullanılarak vektör işlemleri yapılır.
  • Fonksiyon, argüman verisini değiştirir ve bir değer döndürmez.

1 yorum

 
GN⁺ 2025-02-23
Hacker News görüşü
  • Aynı konuya dair bir başka kaynak olarak FFmpeg ve dav1d örnekleri var

    • FFmpeg sık kullanıldığı için açık bir kullanım örneği olarak görülebilir
    • dav1d, başlıca tarayıcılarda ve Android işletim sisteminde kullanılıyor; başarısındaki büyük etkenlerden biri elle yazılmış SIMD
    • dav1d içindeki bazı kodlar günde trilyonlarca kez çalıştırıldığı için mümkün olan en yüksek hızda çalışmaları gerekiyor
    • Elle yazılmış SIMD ile derleyicinin ürettiği SIMD arasındaki performans farkı %50'ye kadar çıkabiliyor
    • Bu tür teknikleri sürdürmek için FFmpeg assembly language school gibi kaynaklar önemli
  • Assembly yazmaktan ziyade intrinsic kullanmanın daha değerli olduğunu düşünüyorum, ama okumak çok faydalıydı

    • Compiler Explorer kullanarak derleyicinin performans optimizasyonu için yaptığı iyileştirmeleri anladım
  • Bu rehberin çok harika olduğunu düşünüyorum

    • Düşük seviyeye ilgi duyduğum dönemde keşke bu rehber elimde olsaydı
  • Assembly öğrenmenin ya da uygulamanın bir "eğlencesi" olup olmadığını merak ediyorum

    • LISP ya da RISC-V gibi eğlenceli mi, yoksa COBOL gibi belirli sistemlerle ve işler için mi öğreniliyor, merak ediyorum
    • Günlük işimde assembly kullanmak için bir nedenim yok ama sırf eğlence için zaman yatırmaya değer mi diye merak ediyorum
  • q soneki pointer boyutunu gösteriyor ve 64 bit sistemlerde bu 8

    • Cümle kafa karıştırıcı geliyor
    • i.e ifadesi i.e., olmalı ve *(* bir açılış parantezi olmalı
    • sizeof pointer döndürmez
  • K&R referansına övgü

    • C ve programlamayı öğrenmek için satın aldığım ilk kitaptı
    • İlk başta C++ öğrenmiştim ama fazla soyut olduğu için anlaması zordu
  • Assembly kullanmanın dezavantajı, kodun mimariye bağımlı olması

    • x86, arm ve x86_64 için ayrı ayrı farklı kod yazmak gerekiyor
    • SIMD için taşınabilir kod yazmanın iyi bir yolu yok
    • Rust taşınabilir SIMD API'sini stabilize ediyor ve Zig SIMD desteği sunuyor, ama FFmpeg hâlâ hızdan memnun olmayabilir
  • Inline assembly'ye karşı çıkılmasını anlamıyorum

    • Inline assembly, assembly fonksiyonu çağırmaktan daha verimli gibi görünüyor
  • Bu kaynak mükemmel

    • 386 döneminin x86 assembly'sini biliyordum ama daha gelişmiş işlemciler çok karmaşıktı
    • Modern CPU'ların SIMD özellikleri hakkında daha fazla şey öğrenmek istiyorum
  • Assembly'nin C'den 10 kat daha hızlı olduğu iddiasının hâlâ doğru olup olmadığını merak ediyorum

    • Derleyicilerin, elle yazılmış assembly'ye yaklaşamayacak kadar duraklayıp duraklamadığını merak ediyorum