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
Hacker News görüşü
Aynı konuya dair bir başka kaynak olarak FFmpeg ve dav1d örnekleri var
Assembly yazmaktan ziyade intrinsic kullanmanın daha değerli olduğunu düşünüyorum, ama okumak çok faydalıydı
Bu rehberin çok harika olduğunu düşünüyorum
Assembly öğrenmenin ya da uygulamanın bir "eğlencesi" olup olmadığını merak ediyorum
qsoneki pointer boyutunu gösteriyor ve 64 bit sistemlerde bu 8i.eifadesii.e.,olmalı ve*(*bir açılış parantezi olmalısizeofpointer döndürmezK&R referansına övgü
Assembly kullanmanın dezavantajı, kodun mimariye bağımlı olması
Inline assembly'ye karşı çıkılmasını anlamıyorum
Bu kaynak mükemmel
Assembly'nin C'den 10 kat daha hızlı olduğu iddiasının hâlâ doğru olup olmadığını merak ediyorum