C# içinde kodlarin daha hizli calişmasi için assembly kodlari çağrilabiliyor diye biliyorum. Bu alanda kaynak bir site veya örnekleriniz varsa paylaşirmisiniz
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.
Hızlandırmak istediğiniz şey bir resim dosyasındaki baytların kopyalanması gibi birşeyse unsafe kod bloğu açarak içinde pointer hesabı yaparak hiç assembly ile uğraşmadan halledebilirsiniz. Eğer işin içine hesaplama girecekse yazının devamını okuyunuz.
Birkaç farklı yöntem var ama taşınabilirlik açısından zordan kolaya sıralama yapılırsa:
C++ içinde inline assembly kullanarak parametreler ile uğraşmadan doğrudan işlemci komutlarını çalıştırabilirsiniz. Bundan daha kolay bir yöntem intrinsic denilen fonksiyonları kullanmak. Böylece tek çekirdekte bile aynı anda sekiz adet çarpma veya toplama gibi işlemleri sadece c++ fonksiyonlarını kullanarak yaptırabiliyorsunuz. Bundan daha kolayı opencl api yardımıyla c99 veya yeni haliyle c++ şeklindeki program parçalarını çok sayıda thread halinde çalıştırmak. C++ ile işiniz bitince dll halinde derleyip c# içinden çağırabilirsiniz. Hepsini denedim ve kodları tüm bilgisayarlarda uyumlu çalıştırmanın en kolay yolu opencl. İntrinsic ile başlamak daha çabuk olabilir ama her işlemci için en uygun komutları oluşturamayabiliyor. İnline assembly ise sadece sizin işlemciye özgü komutlar kullandığınızda diğer işlemcilerde çalışmayabiliyor.
Performansa göre sıralanırsa inline assembly en hızlısı olabilir. Sonra intrinsic sonra opencl. Eğer ekran kartınız varsa opencl onu da kullanabilir ve hesabın yoğunluğuna göre işlemciye 50 kat fark atabilir.
Her durumda c++ ile c# arasında bağlantı yapmanız gerekecek veya hazır yapılmışının dll dosyalarını kullanmanız gerekecek.
Mesela lineer cebir konularından matris-matris çarpımı çok kastıran bir işlemdir ve 8192 genişliğindeki iki tane kare matrisin çarpımı sadece c# ve tek çekirdek kullanarak dakikalarca sürüyorken opencl ile ekran kartında hesabı bir saniyeyi geçmiyor.
Başka bir örnek, fourier dönüşümü de kastıran bir hesaptır ve opencl kullanınca sadece işlemcide bile 15 kat hız kazandırıyor.
Bellekteki resimleri siyahbeyaz yapmak için intrinsic de yeterince hızlıdır.
Amacınız assembly öğrenmekse o zaman nasm gibi birşey kullanarak deneme yapabilirsiniz.
< Bu mesaj bu kişi tarafından değiştirildi Tugrul_512bit -- 15 Ekim 2016; 0:20:23 >
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye Ol Şimdi DeğilÜye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.
< Bu ileti mobil sürüm kullanılarak atıldı >