gecgelenus.com

Vulkan API nedir ?

October 25, 2024 | by gcgln.62@gmail.com

Vulkan-logo

Vulkan, sözlük tanımıyla; düşük seviye grafik ve hesaplama API’ıdır. Khronos group tarafından geliştirilen ve AMD’nin Mantle API’nın ruhani devamıdır. Ayrıca yine Khronos group’un geliştirmiş olduğu OpenGL’in yeni nesli olarak görülmektedir.

Peki sözlük tanımını verdiğimize göre, gerçek tanımını verelim. Vulkan; çooook düşük seviye, GPU ile ilgili işlerinizi halledebileceğiniz bir API’dır. Burda dikkat edin grafik API’ı demiyorum, yerine GPU ile ilgili şeyler diyorum. Bunun sebebi, Vulkan’ın aslında gerçekten bir grafikten ziyade, GPU’ya odaklanmasındandır. Daha önceden OpenGL veya DirectX9-11 geliştirmiş olan kişiler için bir örnek vermek gerekirse, diğer API’lar gerçekten grafik için varken, Vulkan bu saydıklarımın yanında sürücü seviyesinde kalıyor. Hatta bunu özetlemek için kullanılan yaygın bir cümle var; “Grafikten ziyade, GPU”(Less about graphics, more about GPU).

Vulkan, eski API’ların aksine, önceden sürücü geliştiricilerinin sorumluluğu olan işleri geliştiriciye yükler. Artık hafıza yönetimi, senkronizasyon, grafik boru hattı(pipeline) gibi aslında çok düşük seviye olan işler, artık geliştiricinin sorunudur. Bu yöntem, ne kadar yazılan kodun(daha çok başlangıçta yazılan kodlar, belirli bir seviyeden sonra diğer API’lardan çok da zor olmuyor) çok uzun ve detaylı olmasına yol açsa da, bize çok büyük avantajlar sağlıyor;

  • Hafıza yönetimi ve senkronizasyonları özenle seçerek GPU’nun tüm gücünü kullanabiliriz.
  • Artık düşük seviye donanım yönetimi elimizde olduğundan, yeni çıkan özellikleri kullanmak çok karmaşık uzantılar gerektirmeyecek(OpenGL kullandıysanız bilirsiniz)
  • Yapacağımız işlemleri önceden belirlediğimiz için sürücünün yapılan işlemleri optimize etmesi kolaylaşıyor.
  • Yaptığımız işlemleri özellikle aşama aşama belirttiğimiz için karşılaşabileceğimiz hataları önceden bilebilir ve çok daha stabil programlar yazabiliriz.

Ayrıca Vulkan düşük seviyeye inerek bize bu özellikleri sağlamak ile kalmıyor, ayrıca bambaşka bir bakış açısı getiriyor. Tasarım olarak Vulkan 0 senkronizasyon ile tasarlanmıştır. Çalıştırdığınız en basit komutlardan en karmaşık olanlarına kadar tüm senkronizasyon sizin sorumluluğunuz. Bunun sebebi Vulkan tasarlanırken günümüzün büyük sorunlarından biri olan CPU-GPU iletişimini azaltmak ve çoklu çekirdekli işlemciler üzerinde rahat bir geliştirme ortamı sağlaması hedef alınarak tasarlanmasıdır. Bu yüzden eğer akıllıca bir tasarım yaparsanız, sadece GPU’nun değil, aynı zamanda çok çekirdekli CPU’nun tüm gücünü de kullanabilirsiniz. Nasıl mı ? Çalıştırdığınız komutların bir ilişkileri yok ise, bu komutları ayrı thread’lerden GPU’ya gönderebilirsiniz. Çünkü siz sağlamadığınız sürece herhangi bir senkronizasyon yapılmaz ve aslında bu istenilen bir şeydir. Ayrıca işlemler CPU’dan GPU’ya taşınarak CPU’nun yükü hafifletilir.

Örneğin ekranda nesnelerin çizilmesi için kullandığımız komutları düşünelim(Yazının basit olması için çok terim kullanmak istemediğimden biraz genelleme yaptım). Ekranda 1000 nesnemiz olsun. Her bir nesne için ayrı çizim komutu kullanalım. İlk olarak şu lambayı, sonra şu evi, sonra şu arabayı çiz vs. Daha sonra ekrandaki özek efektler için de komutlar kullanalım. Mesela ışıklandırma için özel bir geçiş daha yaptığımızı düşünürsek 1000 nesne için 1000 tane komut daha göndereceğiz. Ayrıca bunu her ekranda çizilen kare(frame) başına tekrar yapacağız. Eğer 144 FPS alıyor isek, bu komutları 144 kere göndermemiz gerekiyor. Yani saniyede (1000+1000) X 144 tane komutu GPU’ya gönderiyoruz. Asıl korkutucu kısım ise şimdi başlıyor; ekranda nesnelerin çizilmesi için kullandığımız fonksiyon ve protokolleri genel olarak(kabaca örnek verirsek) Grafik Boru Hattı(Graphic Pipeline) olarak adlandırıyoruz. Ve bu boru hattına yapacağımız işlemlerden önce, işlemek istediğimiz verileri ve ekran kartında çalışan kodumuza (shader) göndermek istediğimiz parametreleri bağlamamız (binding) gerekiyor. Eğer nesnelerin özellikleri birbirinden farklı ise, biri saydam diğeri opak gibi, boru hattına gönderdiğimiz parametreleri değiştirmemiz gerekiyor ya da bu işi gören başka bir boru hattını kullanmamız gerekiyor. Bu işlemler, GPU’da bir takım düzenlemelere karşılık geldiği ve bu komutların gönderilmeden önce CPU’da bir takım işlemlerden geçtikten sonra gönderilebildiğini düşünürseniz, demek istediğimi anlayabilirsiniz.

Vulkan ise bu sorunu çözmek için şöyle bir yöntem sunuyor; Yapacağımız işlemler GPU’ya kaydediliyor. Yani 1000 tane nesne örneği üzerinden devam edersek, 1000 tane nesneyi çizmek için kullanacağımız komutları öncelikle GPU’da bir hafızaya kaydederiz. Daha sonra bu komutları çalıştırmak için sadece komutların olduğu belleği GPU’ya referans veririz. Böylece hem her kare başına aynı komutları göndermekten kurtuluruz, hem de bu işlemlerin herhangi bir ilişkisi ve ya sıralaması olmadığı için (Embarrassingly Parallel) GPU bu işlemleri çok daha hızlı işlenecek bir şekilde sıraya koyabilir. Böylece iş yükümüz sadece her kare başına komut göndermek yerine bir komut belleği oluşturarak onu referans vermeye kadar düşer, sayılar ile gösterirsek; 144 X (1000 + 1000) –> 1(tam olarak bir değil ama 1 gibi).

Şimdi ise çoğunlukla yanlış anlaşılan bir konuya değinmek istiyorum. Biz bu iyileştirmeleri yaparak aslında CPU’nun işlem gönderme hızını, GPU’nun işlem yapma hızına yetiştirmeye çalışıyoruz. Ne kadar güçlü GPU’lara sahip olursak olalım, onları %100 dolduracak kadar işlem gönderebilen bir CPU’ya sahip değil isek bu gücün bir anlamı kalmıyor. Fakat, belirli bir noktadan sonra, yani GPU’daki tüm işlem birimlerini meşgul tuttuğumuz noktada, alabileceğimiz maksimum performansa ulaşırız. Artık donanımın limitlerindeyizdir ve var olan donanımı daha fazla hızlandırmanın bir yolu yoktur. Bu yüzden beklentilerinizi tekrar gözden geçirin; Vulkan size CPU’nun GPU’ya yetişmesini sağlar, var olan GPU’nuzun performansını sihirbazlık gösterisi gibi kat ve kat arttırmaz.

Buraya kadar okumaya zahmet ettiyseniz, büyük ihtimal bilgisayar oyunları oynayan kişilersiniz ve bir noktada oynamaya çalıştığınız oyunun, çalıştırdığınız bilgisayarda çok daha hızlı çalışmasının gerektiğini düşündünüz. Tercih ettiğiniz performans izleme programını açtınız ve GPU CPU kullanımı gibi değerleri incelemeye başladınız. Ardından anlam veremediğiniz bir şey gördünüz; ne CPU, ne de GPU kullanımı %100, fakat performansınız düşük. Bunun sebebi size yukarıda saydığım olaylardan dolayıdır. Yazılan grafik motoru modern işlem birimlerine uygun yazılmamıştır ve işlemcinin çoklu çekirdekli mimarisini kullanamamaktadır. Bu yüzden gönderilen komutlar tek çekirdekten gönderilir ve bu komutlar GPU’yu meşgul tutmaya yetmez. İşlemci sonraki komutu hazırlayana kadar GPU görevini bitirir ve boşta bekler. Bu yüzden ne CPU ne de GPU sahip olduğu potansiyeli kullanamaz. Vulkan ise bu durumda sizin CPU’nuzun tüm çekirdeklerini kullandırmak ile kalmaz, GPU’ya gönderilen komutları azaltarak CPU-GPU iletişimini azaltır. Tek bir komut ile çok daha fazla işlem GPU’ya gönderilir. CPU hem gönderilecek işlemlerin sayısını azaltmış olur, hem de hazırlaması gereken işlemleri tüm çekirdeklerini kullanarak hazırladığından, GPU daha verilen işlemi bitiremeden tekrar yeni işlem gönderir. Böylece GPU sürekli meşgul tutulur ve istenilen %100 GPU kullanımı elde edilir. Bu noktadan sonra Vulkan size CPU-GPU iletişimi ile bir performans sağlamaz(Fakat senkronizasyon ve hafıza yönetimi ile daha çok seçenekleriniz var).

Peki Vulkan’ı öğrenmeli miyim ?

Vulkan, OpenGL’in devamı olarak görüldüğü için grafik alanında kullanılacak bir API olarak görülmektedir, ki aksini iddia edemem.

  • Eğer GPU’nun nasıl çalıştığını anlamak ve hatta onu düşük bir seviyede programlamak istiyorsanız
  • Yeni nesil mobil cihazlarda çalışacak grafik motorları yazmak istiyorsanız
  • Çok yüksek iş gücü gereken işleri daha tutarlı senkronizasyon ile gerçekleştirerek hız kazanmak istiyorsanız
  • Arka planda ne dönüp bittiğini merak edecek kadar meraklı (paranoyak) iseniz
  • Yeni nesil teknolojileri kullanmak istiyorsanız (Ray tracing, sparse binding, VR için multiview rendering gibi)
  • Yazacağınız kodun her yerde çalışmasını istiyorsanız
  • Yazacağım her kodun ve harcadığım emeğin karşılığını görmek istiyorum diyorsanız
  • Birden fazla GPU’yu aynı anda kullanabilecek kadar çılgınım diyorsanız

Vulkan’ı öğrenebilirsiniz. Ayrıca Vulkan’ın genel hesaplama işlemleri için (GPGPU) kullanılabildiğini hatırlatmak isterim. Eğer yapay zeka eğitmek ve ya özel algoritmaları GPU’da çalıştırmak isterseniz ve bunu kendi sisteminiz ile tasarlamak istiyorsanız Vulkan’ı kullanabilirsiniz.

Fakat;

  • Sıfırdan yapacağınız grafik motoruyla GTA 8 yapmak istiyorsanız
  • Ekran kartının kapasitesinden fazla performans elde etmek istiyorsanız
  • Sabırsız iseniz
  • Belirli bir bilgi birikiminiz yok ise
  • Dökülecek saçlarınız yok ise

Vulkan öğrenmenizi tavsiye etmem. Özellikle grafik programlamadan ziyade oyunla ilgili olan kişilerin var olan oyun motorlarına yönelmesini tavsiye ederim.

Öğrenmek istersem önceden hangi bilgilere sahip olmam gerekir?

Yapacağımız işlemler çok düşük bir seviyede olduğundan, belirli bir bilgi birikiminiz olması gerekir. Bunlar;

  • Orta seviye C/C++
  • Belirli bir seviyede GPU mimarisine hakim olmak
  • Grafik Boru Hattı (Graphic Pipeline) ile ilgili göz aşinalığı
  • CPU’nun nasıl çalıştığı ile ilgili yüzeysel bir araştırma yapmak
  • Hafıza yönetimi ile ilgili biraz deneyim (Memory mapping, caching vs.)
  • Ve özellikle sabırlı olmak

One response to “Vulkan API nedir ?”

  1. Mert Avatar

    Congratsss!!

Leave a Reply

Your email address will not be published. Required fields are marked *

RELATED POSTS

View all

view all