Delphi & GPU (OpenCL)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Re: Delphi & GPU (OpenCL)

Mesaj gönderen Opt2000 »

Merhaba,

Bu konuda ya benim kafam çok karışık, ya da burada bir şeyler karışmış. GPU'yu kullanmakla, DirectX/OpenGL/OpenCL/WPF kullanmak aynı şey değil. GPU'yu kullanmak sizin yazdığınız bir işlemin (örneğin A[x] := B[X] + C[X] gibi) GPU'da çalışması demektir. Yani herşeye siz karar veriyorsunuz. Oysa DirectX benzeri kütüphanelerde bu işlem mümkün değil. Elbette orada da GPU kullanılıyordur, ama bizim istediğimiz (ya da bu konuda istendiği gibi) değil.
anonymousdelphicoder yazdı:Bu aciklayici bilgi icin tesekkur ederim merak ettigim nokta win API ler neden gpu uzerinden calismazlar birde gpu uzerinden yazdigimiz kod her pc de calisabilir mi? Ondalikli sayilarin cpu yu neden bukadar yordugunu da pek anlayamadim:)

Saygilarla
Windows API'leri elbette GPU'da çalışmaz, çünkü ortada GPU yokken de Windows API'leri vardı :) Bu işin basit kısmı, ama daha detaylısı şu: GPU programcılığı çok hassas donanım bağımlılığı getiriyor. Windows ise her tür donanımı desteklemek zorunda. Zaten bunun için sürücü modelleri vs var. Ayrıca Windows bazı işlemlerde donanımı kullanıyor (örneğin pencere animasyonları, aero, blending işlemleri vs). Bir de GPU'yu ne için kullanacak? İşletim sisteminin çalışma mantığına (Round Robin) ve GPU programcılığının hedefine bakacak olursanız işletim sisteminin GPU kullanmasının çok da mümkün olmadığını göreceksiniz.

GPU kullanacaksanız donanımı direkt kullanacaksınız demektir. O kadar ki ekran kartı üreticisinin kütüphanesini kullanacaksınız. Dolayısıyla donanım desteklemiyorsa program ya çalışmaz, ya da yazılım desteği ile çalışır. Yazılım desteği ile çalıştığı zaman da normalden çok daha yavaş çalışır.

CPU'lar ondalık sayıları yavaş yapar diye bir şey yok. Bu çok bilinen bir "yanlış/eksik" bilgi. Eğer tam sayılarla kıyaslayacak olursak ölçülemeyecek kadar düşük bir performans farkı olabilir (ki INT64 ile double arasında hız farkı olduğunu hiç sanmıyorum), ama asıl sorun bir programcı olarak sizin farkında olmadan yaptığınız veri tipi değişikliği. Kısaca CPU sürekli veri tipi değiştirmek zorunda kalırsa işler yavaşlıyor. Basit bir örnek vereyim:

Kodları kontrol etmeden yazıyorum, compile etmezse şaşırmayın :)

Kod: Tümünü seç

var
  A: Integer;
  B: Double;
begin
  A := 10;
  B := A;
end;
Buradaki kod çok masum görünebilir, ama aslında değil. B := 10 demekle, B := A demek arasında farkında olmadan yapılan bir tip değişimi var. İlkinde compiler 10 değerini compile time sırasında double alıyor (umarım Delphi compiler'ini yazan arkadaşlar bunu düşünmüştür :D ), ama ikincisinde farkında olmadan yapılan bir tip değişimi var: Integer -> Double. İşte bu tip değişimi işlemi çok yavaşlatıyor. Zaten veri tipi değişimi olmasın diye bütün 3D (veya gelişmiş 2D) grafik kütüphanelerinde R, G ve B değerleri Byte (veya INT) değil 0-1 aralığında bir float (double) olarak tanımlanıyor. Burada amaç tip değişimlerini mümkün olduğu kadar en aza indirmek.

GPU ile CPU'nun çalışma mantığı aynı değil. Ayrıca görevleri de aynı değil. Biz Windows (veya başka bir OS'da) işlem yaparken CPU sadece bizim programımızla değil koca bir işletim sistemi ile meşgul. Oysa GPU sadece kendisine söylenenle ilgileniyor. Yani aslında GPU tek işlem ile ilgileniyor. Oysa CPU (daha doğrusu işletim sistemi), Round Robin'de de anlatıldığı gibi çok zahmetli işlemlerle ilgileniyor.

Benim kişisel görüşüme göre standart bir programcının GPU programcılığına ihtiyacı pek yok. Standart programcılıkta asıl vakit alan veri işlemleri değil, görsel işlemler. Vakit alan veri işlemleri de açıkçası GPU programcılığı ile uğraşacak kadar çok vakit almıyor :) Ve hatta bence Render Farm benzeri paralel computing sistemlerini yazmak GPU programcılığından daha basit, güvenli ve önü açık (müşteriye maliyetli, ama o kadar da olsun).

İyi çalışmalar
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: Delphi & GPU (OpenCL)

Mesaj gönderen anonymousdelphicoder »

Tika basa doymasakta migde esigine gelmis doygunluk hissi kivaminda olan bu bilgi icin cok tesekkur ederim :) elde ettigim ip uclarini arastirmaya devam edecegim :)
engerex
Üye
Mesajlar: 21
Kayıt: 19 Kas 2010 02:53

Re: Delphi & GPU (OpenCL)

Mesaj gönderen engerex »

"Delphi CUDA" veya "Delphi OpenCL" aratırsan çıkması lazım. Hatta GLScene ile bir şeyler yapılıyor olması lazım.
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Delphi & GPU (OpenCL)

Mesaj gönderen mkysoft »

@Opti2000 CPU ilk çıktığında virgüllü sayılar ile yavaş çalıştığından dolayı matematik işlemci denen bir parça ekstradan satılırdı. Zamanla bu parçanın işlevini CPU içine aldılar ancak hiçbir zaman aynı performansı üretemedi. Aşağıdaki performans testinden de görülebileceği gibi GPU'lar hala CPU'ların önünde:
http://wccftech.com/ultimate-cpu-gpu-fl ... amd-intel/

Burada GPU'nun nasıl çalıştığını önem kazanıyor. DirectX yada OpenGL sadece bazı grafik işlemlerini otomatikleştiren komut setleridir, photosop'daki filtreler gibi düşünülebilir. Ancak sonuçta bu komutlar matematiksel işlemler sayesinde görsel hale gelir. Bu görselleştirmede de genellikle en küçük karaler yöntemi kullanılır. Nesneleri bölebildiğiniz kadar küçük üçgenlere bölerek hesaplama yaparsınız. Buda çok fazla virgüllü sayı demektir. Üçgenler arası renk geçişleri görsellik oluştururken, birbirlerine yaptıkları baskıların hesaplanması fizik motoru olarak karşımıza çıkar.

@Opti2000'nin dediği gibi GPU özelleştirilmiş bir birimdir, CPU'nun bir çok farklı işlevi mevcuttur. CPU'nun kullanım yerine göre üreticiler özellikleri dengelemektedir.

CPU'nun çalışma mantığı için ASM kitaplarına göz atabilirsiniz. Aslında sizin için kolay görünen @Opti2000'nin paylaştığı örnek işlemci için 100'lerce komut anlamına gelebilir.
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Re: Delphi & GPU (OpenCL)

Mesaj gönderen Opt2000 »

@Opti2000 CPU ilk çıktığında virgüllü sayılar ile yavaş çalıştığından dolayı matematik işlemci denen bir parça ekstradan satılırdı. Zamanla bu parçanın işlevini CPU içine aldılar ancak hiçbir zaman aynı performansı üretemedi.
Burada FPU ile GPU karışmış. Bahsettiğiniz ek parça FPU idi, Floating-point Unit. Modern işlemciler, FPU'lardan çok daha hızlı ve performanslı floating point işlemleri yapıyor. GPU'lar FPU değil (ya da FPU'ların modern/gelişmiş hali değil) ve işlevleri farklı.
Aşağıdaki performans testinden de görülebileceği gibi GPU'lar hala CPU'ların önünde

Linkteki testlere göre ben hem biraz yanılmışım, hem de biraz yanlış anlatmışım :) Benim asıl gelmek istediğim performansı asıl etkileyenin tip değişimi olduğuydu. Hala bu düşüncemin arkasındayım, ama noktalı değerler ile tam sayılar arasındaki hız farkı benim düşündüğümden daha fazlaymış. Gerçi okuduğum testlerde saniyede milyonlarca işlemlerden bahsediliyor ve performansın testlerdeki gibi basit kriterlere bağlı olmadığı belirtiliyor, ama yine de benim tahminimden biraz daha fazla çıktı fark. Ama tekrar söylüyorum, "noktalı sayılarda bilgisayarlar çok yavaş çalışır" önermesi FPU'ların olduğu dönemlerden kalan bir önermedir ve o günler için çok geçerlidir. Günümüzde ise şöyle bir önerme geçerli olabilir: "Noktalı sayılarda bilgisayarlar hızlıdır, ama tam sayılarda daha hızlıdır".

GPU'ların hızları ile ilgili aşağıdaki linklerde güzel (ve kısa) bilgiler var.
http://www.deskeng.com/de/gpu-vs-cpu-computing/
http://allegroviva.com/gpu-computing/di ... u-and-cpu/
Nesneleri bölebildiğiniz kadar küçük üçgenlere bölerek hesaplama yaparsınız. Buda çok fazla virgüllü sayı demektir. Üçgenler arası renk geçişleri görsellik oluştururken, birbirlerine yaptıkları baskıların hesaplanması fizik motoru olarak karşımıza çıkar.
Bu kısmı ben yanlış anladım sanırım. Virgüllü sayı kullanılmasını sebebi küçük üçgenlere bölmek değil. Aslında mantık çok basit: Sizin X, Y ve Z eksenlerinden oluşan bir koordinat sisteminiz var. Bu sistem içinde bir model tanımlıyorsunuz (küp gibi basit bir model). Daha sonra kameranızı bir yere yerleştiriyorsunuz ve açınızı belirliyorsunuz. İşte burada ister istemez noktalı sayılar devreye giriyor. Kamerayı biraz çevirin ve hesap yapın. Ya da modeli 37 derece herhangi bir eksende çevirin. Matematik bilimi sizi noktalı sayılara zorluyor :) O yüzden "yanlış anladım sanırım" diyorum :)

Bu arada fizik motoru biraz fazla kabaca tanımlanmış. Elbette fizik motoru aynı zamanda görünmez kuvvetleri hesaplamak için de kullanılıyor (yer çekimi, rüzgar vs). Ve hatta belki daha fazlası. Ne yazık ki o kadar bilgi sahibi değilim, ama görünce de yazmadan edemedim :)

İyi çalışmalar
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: Delphi & GPU (OpenCL)

Mesaj gönderen anonymousdelphicoder »

Sayın opt2000,mkysoft ve engerex cevabinizi yeni gordum sizlere cok tesekkur ediyorum :)
Cevapla