OpenCL ve Java

Konu performans olduğunda hesaplanabilir performansı bize paralel hesaplama makineleri sunuyor. Bunun için bir süredir FPGA ve Verilog ıle ilgiliyim. FPGAlar her ne kadar kendı CPUmuzu dahi ortaya koyma konusunda yardımcı olsalar da iş onları bilgisayar ile haberleştirmeye geldiğinde USB gibi basit teknolojiler ile karşılaşıyoruzç Oysa hepimizin bilgisayarlarında   olan ekran kartları hesaplama birimi olarak kullanılabiliyor.

Piyasada bildiğiniz gibi iki ana marka var AMD ve NVIDIA. Cuda NVidia tarafındaki sistem dili olmasına karşın platform bağımsız olan OpenCL ile her ekran kartını kullanabiliyoruz.

Gelelim işin mantığına. Aslında bu olay oyunların sagladığı hesaplama sistematiği ile aynı. Bir GPU programı şunları yapar.

1- Texture gibi verileri Ekran kartı belleğine taşı.

2. Hesaplama yap.

3- Ekrana görüntü bas.

 

Biz de aynı şeyi yapıyoruz. Sadece 3ncü aşama yok. Hesaplanacak veriyi ekran kartına yollayacağız. Ama öncesınde  değinilece 2-3 konu var.

GPU üzerinde  markasına göre bir sürü işlem birimi vardır. Bu işlem birimleri C benzeri olan OpenCL ile programlanabilir. Yazılmış olan bu koda kernel denir. Kernel çalıştırma komutu aldığında tüm işlem birimleri aynı anda aynı işlemi yapar. Bu sebeple paralellik esası ile işlem olduğundan döngüler kurmak mantığa aykırıdır. If blokları ıse mantıksal olarak 3 birim kullanacaği için hesaplama süreçlerine if yazmak efektif değildir.

GPU belleği bir tam float olarak adresler. Bu nedenle maksimum verim float hesaplama ile mümkündür. Double yerine float kullanmak akıllıcadır.

Her bir işlem kuyruk yapısı ile GPU kontrolcüsünde listelenir. İşlem sıra kendisine gelince yürütülür.

İşlem birimi sayısından daha fazla işlem yürütülmek isteniyorsa bir işlem için kaynak sayısının işlem birimi oranınca kere tekrarlı kuyruğa GPU kontrolcüsü tarafından çevrilir. Bu nedenle en fazla işlem birimi olan kart aynı anda daha çok işlem yapabileceğinden uzun vektör işlemlerini daha hızlı bitirir.

Java dünyasında birkaç kütüphane alternatifimiz ulunmakta. Bunlar: LWJGL,JOCL,JAVACL olarak sayılabilir. Bu yazımdaki örneği JavaCL ile yaptım. Bunun sebepleri söyle.

  • LWJGL basit bir framework değil. Her ne kadar Minecraft gibi popüler bir referansı olsa da birçok sabit tanımlamak gerekiyor. Bunlar C gibi sabitler ve ben aklımda tutamıyorum. Karşımızdaki kütüphane bana Javadaymışım hissi vermedi.
  • JOCL güzel bir alternatif. İşi objeler ile yönetiyor. Fakat bu obje bolluğu kafa karıştırıyor. Göya nesnel programladığım bir ortamda CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR şeklinde bir bellek tanımlama mantığı çok saçma geliyor. Bunlar en azından Enum olsalardı.
  • JavaCL. Referans döküman her ne kadar yetersiz olsa da herşey context ile yaratılabiliyor. Karşımızda bir factory class olunca daha rahat yazacağımızı buluyoruz. 10 dakika sitesinde gezmek yetiyor.

Gelelim basit kodumuza.. Bir nevi hello word.

 

 

Hibernate Util ve XML

Hibernate 4 sonrasi icil Util class ornegi soyle yazilabilir..

 

Tabi bir de hibernate.cfg.xml lazim bize

Uzun suredir yazi yazmamam

Arkadaşlar merak etmeyin uzun süredir tek satır bile yazmış olmamamın sebebi siz değilsiniz benim yazacak vaktımın olmaması

Clojure Kitabı

Clojure Kitabı adında bir proje başlattım. Daha önceden yazdığım notları da derleyerek düzenli bir clojure kitabına ulaşmak istiyorum. Takip ederseniz zaman içerisinde dolduğunu görebilirsiniz.

X++ Excel Oku Ürün Maliyetini Bul

Şirkette sık sık sayım oluyor ve bu sayım sonuçlarını bir şekilde ax’a gfirmek gerekli..

Excelden verileri okuyan sonra en son ay kapama verileri kullanarak sayımları sisteme günlük olarak giren bir kod yazdım..

Journal yaratmayı da görebilirsiniz excelden satır okumayı da diolog objelerini kullanmayı da :)

X++ Forupdate

Sıkıldığım bir anda yazılmış x++ for update metodu

CLOJURE VE FONKSİYONLAR (20)

Daha önce de bahsettiğimiz gibi clojure fonksiyonel bir programlama dilidir. Clojure ile iki şekilde fonksiyon tanımlanabilir.

diğer tanımlama ise defn makrosu ile olur.

Fonksiyonlar defn ile tanımlanırken içerik açıklaması eklenebilir.

bu açıklama satırını okumak için doc metodunu kullanırız

dilersek yukarıdaki toplam fonksiyonunun parametrelerine de sınırlama getirebiliriz.

bu program (toplam 3 4) gibi bir çıktıya hata verir. kontrol yapısı bir map olmalıdır ve iki anahtar kelimesi vardır. :pre anahtar kelimesi girdileri :post anahtar kelimesi ise çıktıları kontrol eder.

Clojure ortamında bir fonksiyona birden çok parametre mimarisi verilerek fonksiyonlar aşırı yüklenebilir.

Clojure fonksiyonlarına birden çok oge alan parametreler geçilebilir.

Buradaki & işareti birden çok parametreyi ifade eder lines bu durumda bir vektör olur.

Clojure ortamında pek çok fonksiyon yapısı gereği özyinelemelidir.

fakat clojure yukarıdaki gibi bir özyinelemede stack kullanır. Stack kullanmadan tail recurisive yaratmak için recur yapısı kullanılmalıdır.

eğer birbirini sıra ile şağıran yinelemeler varsa

yapısı kullanılabilir. trampoline özyinelemelerin bellek çıkmazını çözer.

Clojure ortamında bir fonksiyon iki şekilde cağrılabilir. Bunlar

veya

şeklinde olur.

CLOJURE SEKANSLAR (19)

Pek çok lisp lehçesinde dilin yapısını listeler oluşturmaktadır. Clojure bu kavramı geliştirmiş listeler, hash tabloları, vektorler ve kümeler için sekans demiştir. Sekanslarda üç fonksiyon kullanılır.

ilk öge first ile alınır. Geri kalan ögeler rest ile çekilebilir.

iki seknas tek sekansa cons ile birleşir.

cons işlemini tersten conj ile de yapabiliriz.

LİSTELER

Listeler kısaca şöyle tanımlanır

Listelerin özel bir yeri vardır temel veri tipi listedir.

VEKTÖRLER

şeklinde veya

şeklinde tanımlanır. vektorden veri çekmek hayli kolaydır.

MAP

Hashmap vektörün gelişmişidir ikili veri tutar

map için diğer metot hash-map ile tanımlanabilir.

map’a öge eklemek istersek

öge çokartmak için

CLOJURE VERİ TİPLERİ (18)

Clojure dört grupta incelenebilecek şekilde veri yapıları ortaya koyar bu kısımda 3 çeşidini görecepiz.

Nil Null ve T

Clojure hava gibi true ve false terimlerini destekler fakat nil adında lispten gelen bir veri de vardır. Clojure ortamında nil boş sekans anlamına gelmez.

Clojure ortamında t true ifadesini karşılar. Boş sekanlar ise null olarak geçer.

Char String ve Number

Karakterler tek harf barındırır. \a bir karakterdir. Karakterler bir araya gelerek stringleri meydana getirir. “elma ye” bir stringtir.

Clojure ortamında string fonksiyonlara . ifadesi ile ulaşılabilinir.

Clojure ortamı diger lisplerde de olduğu gibi sayı türlerini tutabilir. 3/5 gibi kesirli 3,14 gibi kayar noktalı sayılar olabilir.

Sembol ve Keyword

Clojure ortamı da temel veri tip olarak sekanlarda semboleri kullanır A veya isim birer semboldür. Keywordler ise :isim şeklinde yazılır. Clojure ortamında bir keyword aynı zamanda özel bir get – set fonksiyonudur.

CLOJURE FOR (17)

For yapısı ilk sekanstaki her eleman ile ikinci sekanstaki her aleman arasında ilişki kurup bir fonksiyonu çalıstıran özel bir makrodur.