DirectX - sayfa 3

 
Rorschach :

Çok teşekkürler!

İkili hesaplamalarınız var mı? O zaman sonuç özellikle etkileyici.

Kısmi not. Gerçekten de, bir yerde double yerine bir şamandıra vardı:

D = fast_length(p);

Çift olmak için düzeltmeniz gerekir

D = length(p);

Ayrıca *buf argümanı için uint yerine uchar4 kullanarak son satırdan (XRGB makrosuna benzer) kurtulabilirsiniz. Şu şekilde deneyin:

__kernel void Func( int N, __global double *XP, __global double *YP, __global uchar *h, __global uchar4 *buf)
{
   size_t X = get_global_id( 0 );
   size_t Width = get_global_size( 0 );
   size_t Y = get_global_id( 1 );
   
   float2 p;
   double D= 0 ,S1= 0 ,S2= 0 ;
   
   for ( int w= 0 ;w<N;w++){ 
      p.x = XP[w]-X;
      p.y = YP[w]-Y;
      D = length(p);
      S2+=D;
       if (w<N/ 2 )
         S1+=D;
   }   
   //
   double d=S1/S2;
   buf[Y*Width+X] = (uchar4)( 0xFF ,h[( int )(d* 11520 )],h[( int )(d* 17920 )],h[( int )(d* 6400 )]);
}
 
Serhii Shevchuk :

Gerçekten etkileyici! Fps, gölgelendiricilerden 1,5 kat daha yüksektir.

Teşekkürler, kod çalışıyor, performans düşmedi, sadece son satırda alfa kanalı sonuna taşındı:

buf[Y*Width+X] = (uchar4)(h[( int )(d* 11520 )],h[( int )(d* 17920 )],h[( int )(d* 6400 )], 0xFF );
 
Rorschach :

Gerçekten etkileyici! Fps, gölgelendiricilerden 1,5 kat daha yüksektir.

Teşekkürler, kod çalışıyor, performans düşmedi, sadece son satırda alfa kanalı sonuna taşındı:

Bu uygulamada, performans büyük ölçüde merkez sayısına (N) bağlıdır. İyi bir şekilde çekirdekteki döngüden kurtulmalıyız, ancak daha sonra S1 ve S2'nin tamsayı yapılması gerekecek. Değerlerinin yayılmasının ne kadar büyük olduğunu görmelisin, belki çok günahsız bir şeyle çarpılır. Ve sonra döngüyü, teorik olarak büyük N değerleri için bir performans artışı sağlayacak olan üçüncü boyuta çevirebilirsiniz.

N=128'de full hd monitörde HD 7950'de 80-90 fps alıyorum.

 
Serhii Shevchuk :

Bu uygulamada, performans büyük ölçüde merkez sayısına (N) bağlıdır. İyi bir şekilde, çekirdekteki döngüden kurtulmak gerekli olacaktır, ancak daha sonra S1 ve S2'nin tamsayı yapılması gerekecektir. Değerlerinin yayılmasının ne kadar büyük olduğunu görmek gerekir, çok günahsız bir şeyle çarpılabilir. Ve sonra döngüyü, teorik olarak büyük N değerleri için bir performans artışı sağlayacak olan üçüncü boyuta çevirebilirsiniz.

N=128'de full hd monitörde HD 7950'de 80-90 fps alıyorum.

750ti 11 fps'imde. Kart özelliklerini buldum:

GPU
FP32 GFLOPS
FP64 GFLOPS Oran
Radeon HD7950 2867 717 FP64 = 1/4 FP32
GeForce GTX 750 Ti 1388 43 FP64 = 1/32 FP32

Mantıksal olarak, float'a geçmek fps'yi amd'de 4 kat, nvidia'da 32 kat artırabilir.

 

OCL sürümünün bir kopyasını yaptı. Sonuç karşısında şok oldum. 1600 merkezde videonun %85'inden fazlasını yükleyemedim.

h ön hesaplama ile optimizasyonun hiçbir etkisi yoktur, ancak onunla bırakılır. Tüm hesaplamalar yüzer durumda, double kullanmak için bir neden göremiyorum, çünkü tüm işlevler hala şamandıra döndürür.

Dosyalar:
pixel.zip  1 kb
 

Bazı sonuçlar.

1) Ön hesaplama h etkilemedi.

2) If'den kurtulurken farkı fark etmedim

S1+=D*(i< 0.5 f*N);
//if (i<N* 0.5 f) S1+=D;

3) Çok daha yavaş

 for ( int i= 0 ;i<N;i++)
  {XP[i]= ( 1 .f- sin (j/iArr[ 2 *i  ].w))*wh.x* 0.5 f;
   YP[i]= ( 1 .f- cos (j/iArr[ 2 *i+ 1 ].w))*wh.y* 0.5 f;
  }
float S1= 0 .f,S2= 0 .f;
for ( int i= 0 ;i<N;i++)
  {float2 p;
   p.x=XP[i]-Pos.x;
   p.y=YP[i]-Pos.y;
   ...
  }

bundan sonra

 float S1= 0 .f,S2= 0 .f;
for ( int i= 0 ;i<N;i++)
  {float2 p;
   p.x=( 1 .f- sin (j/iArr[ 2 *i  ].w))*wh.x* 0.5 f-Pos.x;
   p.y=( 1 .f- cos (j/iArr[ 2 *i+ 1 ].w))*wh.y* 0.5 f-Pos.y;
   ...
  }

görünüşe göre...

4) Yüzdeler, yani scalping siparişleri vb. kaldırılamıyor. unutabilirsin.

 
Rorschach :

Bazı sonuçlar.

1) Ön hesaplama h etkilemedi.

2) If'den kurtulurken farkı fark etmedim

3) Çok daha yavaş

bundan sonra

görünüşe göre...

4) Yüzdeler, yani scalping siparişleri vb. kaldırılamıyor. unutabilirsin.

MT5'te, ölçekleme sipariş defterleri, OCL olmadan ve işlemciyi aşırı yüklemeden tek bir iş parçacığında kolayca çalışabilir. Tabii ki, bu gerekli olmadığı anlamına gelmez. Sadece bir not.

Bir cam oluştururken CCanvas sınıfını kullanırsanız, iş yükü cam alanıyla orantılı olacaktır. Onlar. - cam pencere ne kadar büyük olursa, yük o kadar yüksek olur, çünkü TÜM tuval yeniden çizilir ve değiştirilen parçalar ayrı değildir. Bununla birlikte, sipariş defteri hücrelerini bağımsız öğelere dönüştürerek, tuval alanının geri kalanından bağımsız olarak güncellenebilirler ve yeniden çizim süresini ve bunun neden olduğu işlemci üzerindeki yükü önemli ölçüde azaltırlar.

 
Реter Konow :

MT5'te, ölçekleme sipariş defterleri, OCL olmadan ve işlemciyi aşırı yüklemeden tek bir iş parçacığında kolayca çalışabilir. Tabii ki, bu gerekli olmadığı anlamına gelmez. Sadece bir not.

Bir cam oluştururken CCanvas sınıfını kullanırsanız, iş yükü cam alanıyla orantılı olacaktır. Onlar. - cam pencere ne kadar büyük olursa, yük o kadar yüksek olur, çünkü TÜM tuval yeniden çizilir ve değiştirilen parçalar ayrı değildir. Bununla birlikte, sipariş defteri hücrelerini bağımsız öğelere dönüştürerek, tuval alanının geri kalanından bağımsız olarak güncellenebilirler ve yeniden çizim süresini ve bunun neden olduğu işlemci üzerindeki yükü önemli ölçüde azaltırlar.

4. madde şüpheli. Remnant3D örneğinde, yüzde neredeyse yüklenmez.

 
Rorschach :

4. madde şüpheli. Remnant3D örneğinde, yüzde neredeyse yüklenmez.

Doğrulandı. Değerin değiştiği tek tek hücreleri yeniden çizerseniz, sipariş defterinin olağan dinamikleri ile MT5'teki yüzde neredeyse yüklenmez.

Aksine, her gelen değerin üzerine tuvalin tüm alanı çizilirse, işlemci çok stresli olacaktır.

Fark, piksel dizisindeki yeniden başlatılan değerlerin sayısındadır. Bireysel alanların seçici bir güncellemesine ihtiyacınız var ve yük ile ilgili herhangi bir sorun olmayacak.

 
Реter Konow :

Doğrulandı. Değerin değiştiği tek tek hücreleri yeniden çizerseniz, sipariş defterinin olağan dinamikleri ile MT5'teki yüzde neredeyse yüklenmez.

Aksine, her gelen değerin üzerine tuvalin tüm alanı çizilirse, işlemci çok stresli olacaktır.

Fark, piksel dizisindeki yeniden başlatılan değerlerin sayısındadır. Bireysel alanların seçici bir güncellemesine ihtiyacınız var ve yük ile ilgili herhangi bir sorun olmayacak.

İşin şakası bu, Remnant3D'de tuval tam ekran ve yüzde yüklenmiyor.