Şimdi Ara

[bedava(satmaktan vazgeçtim), github adresi içerde]: C# donanım hızlandırma için API

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
6
Cevap
0
Favori
465
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
Konunun Etiketleri
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Satışta: Bu ürün şu anda teklif verilmeye ve satın alınmaya uygun, satıcı ile iletişime geçebilirsiniz. Satın Al
    Çekirdekler API


    bu adresten yükleyip bilgisayarınızda derleyebilirsiniz:https://github.com/tugrul512bit/Cekirdekler/wiki

    Çekirdekleri API, C# ortamından string halinde verdiğiniz bir C99 kod parçasını bilgisayarınızdaki tüm ekran kartları ve işlemciler için derleyerek onlar üzerinde çalıştırır ve sanki binlerce çekirdeğiniz varmış da threadlerine bu programı eklemişsiniz gibi performans artışı sağlar. Yük dağılımını her hesapta otomatik olarak düzenleyen bir API olup, içeriğindeki OpenCL API sayesinde, eklediğiniz her ekran kartını otomatik olarak derleme için hesaba katmaktadır. Dinamik yük dengelemesi sayesinde değişken frekanslı ekran kartları ve işlemciler için de verimli bir iş bölüşümü yapabilmektedir.

    Bilgisayardaki ekran kartlarının, fpgaların, işlemcilerin veya diğer opencl uyumlu aygıtların aynı marka veya aynı model olmalarına gerek yoktur. Aralarında 20 kat performans farkı olan parçalar arasında bile verimli yük dengelemesi yapabilmektedir.(RAM hızı veya pci-e köprüsü darboğaz oluşturmadığı sürece)

    [bedava(satmaktan vazgeçtim), github adresi içerde]: C# donanım hızlandırma için API


    API Üç kısımdan oluşmaktadır; kurulum, hesaplama, silme. Her biri tek satır komuttan oluşmaktadır.

    Kurulum kısmı thread safe değildir. Hesaplama kısmı farklı adresler için threadsafe çalışmaktadır.

    Aygıt kurulumu ve kernel derleme işlemi:



    Cekirdekler.Cekirdekler sistem = new Cekirdekler.Cekirdekler("gpu cpu", @"

    __kernel void topla(__global __read_only float * a, __global __read_only float *b,__global __write_only float *c)
    {
    int threadId=get_global_id(0);
    c[threadId]=a[threadId]+b[threadId];
    }

    __kernel void carp(__global __read_only float * a, __global __read_only float *b,__global __write_only float *c)
    {
    int threadId=get_global_id(0);
    c[threadId]=a[threadId]*b[threadId];
    }

    ", new string[] { "topla","carp" }, 64);


    Kernel derlemesi için hata mesajı kontrolü:

    if(sistem.hataKodu()!=0)
    {
    Console.WriteLine(sistem.hataMesaji());
    sistem.sil();
    return;
    }



    Hesap yapma kısmı:



    float[] a = new float[4*1024 * 1024];
    float[] b = new float[4*1024 * 1024];
    float[] c = new float[4*1024 * 1024];

    //c[i]=a[i]+b[i] işlemi
    sistem.hesapla("topla", 0, "",
    new object[] { a, b, c },
    new string[] { "oku", "oku", "yaz" },
    new int[] { 1, 1, 1 },
    4*1024 * 1024,
    1);

    //c[i]=a[i]*b[i] işlemi
    sistem.hesapla("carp", 0, "",
    new object[] { a, b, c },
    new string[] { "oku", "oku", "yaz" },
    new int[] { 1, 1, 1 },
    4*1024 * 1024,
    1);




    Hangi aygıtın ne kadar sürede(saniye) hesaplamayı yaptığını öğrenmek için:


    double [] zamanlamalar = sistem.benchmarklar();



    Ayrılmış belleği serbest bırakmak için


    sistem.sil();


    Khronos sitesinin Opencl 1.2 C++ binding bölümündeki header dosyaları kullanılarak önce C++ ile temel fonksiyonlar yazılmış ve dll haline getirilmiş, sonra yük dengeleme metodları da C# ile dll olarak oluşturulmuştur.

    Üstteki örnekte 4 milyon elemanlı bir dizinin tüm elemanlarının gene 4 milyon elemanlı başka bir dizinin elemanlarıyla toplamının üçüncü bir diziye aktaran kod parçaları verilmiştir. "Çekirdekler" API, kendi içinde bu 4 milyon elemanı önce eşit olarak tüm aygıtlara paylaştırmakta, eğer aynı hesap id ("hesapla" metodunun son parametresi) ile hesap tekrarlanırsa en son yapılan hesaplamadaki kartların ve işlemcilerin performansları ile orantılı olarak yeni bir yük dengesi kurmaktadır. Örneğin bir adet 1280 çekirdekli ekran kartına bir tane de 320 çekirdekli ekran kartı eklendiğinde, 8 çekirdekli bir de işlemci hesaba katıldığında her hesaplamada denge biraz daha uygun hale gelmekte ve en sonunda 1280 çekirdekli karta 3 milyon eleman hesaplatılırken 320 çekirdekliye 750bin eleman hesaplatılmakta, işlemciye de 250bin eleman hesaplatılmaktadır. Böylece, sadece tek çekirdekte 1 saniye süren bir işlemi tüm ekran kartlarına otomatik olarak yayarak 10 milisaniyeye kadar indirebilirsiniz. (örnekteki sayılar kurgusaldır, ekran kartı sürücüsünün sürümüne, ekran kartlarının çalışma frekanslarına ve çalıştırılan kodun karmaşıklığına göre değişim göstermektedir)

    Kullanılabilecek alanlar:

    - Bellekteki 2 adet C# "List" içindeki "int id" alanına sahip nesnelerin başka bir tamsayı alanı veya eleman indis değerine göre "left join" gibi birleştirilmesi, sayımının yapılması işlemlerinin hızlanması. Hastalar tablosu 100bin kişiyi barındırıyordur, doktorlar tablosu 10000 kişiyi barındırıyordur, hastalıklar tablosunda da 1milyon kayıt vardır. Eğer bunların birleştirilme işlemi işlemciye yükleniyorsa, aynı işlem C99 kodu haline getirilip ekran kartında 2-50 kat hızlı yapılabilir.
    - Parçacıkların birbirleriyle etkileşimleri için hesap hızlandırması
    - Ray-tracing türünde işlemlerin hızlandırılması
    - Trigonometrik, seri açılım gibi yavaş fonksiyonların tek çekirdeğe göre 50-100 kat hızlandırılışı(aynı fiyattaki işlemci göre, bir veya daha fazla ekran kartı ile)
    - String içindeki bir kelimenin sayımı
    - Ayrıştırılabilir tüm fonksiyonlar (1. thread ile yapılan işlem, 2. threadin yaptığından bağımsız ise, yazacakları hedef hücre farklı ise)


    Fiyatı 500 TL dir. Pazarlık yapılabilir, İzmir'de elden flaş bellek ile satmak istiyorum. Sadece dll dosyaları(2 adet 64 bit) istenirse fiyat yarıya inecektir. C# dll dosyası .Net 3.5 uyumludur. İstenilirse küçük bir değişiklikle .Net 2.0 uyumlu hale getirilebilir. Yanında eşantiyon olarak ikinci el R7-240 verilecek(oc ile 640GFLOPS hesap potansiyeline sahip oluyor).


    Çarpma işleminde "a" dizisinin tüm elemanları 1,2,3,... diye giderken "b" dizisinin tüm elemanlarında 5 sayısı varken çarpma işlemi yapıldığında aşağıdaki şekillerde olduğu gibi her bir thread bir dizi elemanını işlemektedir:

    [bedava(satmaktan vazgeçtim), github adresi içerde]: C# donanım hızlandırma için API
    [bedava(satmaktan vazgeçtim), github adresi içerde]: C# donanım hızlandırma için API

    işlemciler aynı anda en fazla çekirdek sayısının iki katı kadar threadi çalıştırabilirken(performans kaybı olmadan), ekran kartlarında çekirdek sayısının 40 katı kadar thread aynı anda kullanılabilmektedir.


    Benchmarklar


    Resim boyutlandırma (2592x1944 ---> 512x512)
    Ekran kartının pci-e bağlantısı v2.0 x8 ve ana bellek çift kanal 1866MHz ddr3.

    [bedava(satmaktan vazgeçtim), github adresi içerde]: C# donanım hızlandırma için API


    4 milyon elemanlı diziler için c(i)=a(i)+b(i) işlemi:

    [bedava(satmaktan vazgeçtim), github adresi içerde]: C# donanım hızlandırma için API


    [bedava(satmaktan vazgeçtim), github adresi içerde]: C# donanım hızlandırma için API


    16384 elemanlı diziler için c(i)= Toplam( (c(i) - b(k)) ^2 ) işlemi:

    [bedava(satmaktan vazgeçtim), github adresi içerde]: C# donanım hızlandırma için API


    [bedava(satmaktan vazgeçtim), github adresi içerde]: C# donanım hızlandırma için API




    Sistem Notu : Bu ilan her türlü yoruma açıktır.



    < Bu mesaj bu kişi tarafından değiştirildi Tugrul_512bit -- 3 Nisan 2017; 5:4:5 >







  • İkinci el bölümünde konuyu yukarıya taşıma var burada yok niye?
  • Yeni özellik eklendi.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Yani fiziksel simülasyon yaparken böyle birşeye ihtiyacı olan hiç yok.
  • hocam elinize sağlık. bu işlere daha giriş düzeyindeyim. çözmeye çalışıyorum :)
  • quote:

    Orijinalden alıntı: ardabilal

    hocam elinize sağlık. bu işlere daha giriş düzeyindeyim. çözmeye çalışıyorum :)

    Teşekkür ederim.
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.