DirectX - ページ 2

 
Rorschach:

https://www.mql5.com/ru/forum/227736

シェーダーに転送される。最初の15秒はcpuでソースコードが動作し、その後gpu版が動作します。

"コンパイル前にCanvas.mqhファイル内の配列m_pixels[]をprotected:からpublic:に移動する必要がある"

うーん、面白い。同じ速度で判明する。おそらく、3D化されていないからでしょう。

このコードで試して みる必要がある。


ZSYはこのデザインを採用しているので、オリジナルのライブラリを修正する必要はありません

#define protected public
#include <Canvas\Canvas.mqh>
#undef protected

SZY

やばい!すみません - コードにミスがあったため、CPU部分が全く動いていないことに気がつきませんでした。修正しました。
結果 - GPUで2.5倍高速化。

とても嬉しいことです。今回の実装、本当にありがとうございました。ただ、少し手を加えただけです。

ファイル:
 
Rorschach:

https://www.mql5.com/ru/forum/227736

シェーダーに転送される。最初の15秒間はcpu上でソースコードを実行し、その後gpu上でバージョンを実行します。

このコードで同じことをやって、計算の複雑さ(重心位置の増加)によって性能向上がどう変わるかを見るのは興味深いことです。

このコードでは、スピードアップのために正弦の配列を使用せず、ただ正弦を計算して います。また、回転する重心の数を変更することも可能です。

ファイル:
Swirl2.mq5  5 kb
 
Nikolai Semko:

このコードで試して みる必要がある。

指標計算を完全にGpuで行いたいので、そのようなデータ量の転送方法を考えなければなりません。

ニコライ・セムコ

その結果、GPU経由では2.5倍の高速化を実現しました。

ニコライ・セムコ

このコードでは、高速化のために正弦配列を使用せず、単に正弦を計算して います。

XRGB(uchar(128+127*sin(d*45)),uchar(128+127*sin(d*70)),uchar(128+127*sin(d*25)));

ちなみに、私のシェーダーではこの数式を使用しているので、スピードアップは〜10倍です。

ニコライ・セムコ

このコードで同じことをして、計算の複雑さ(重心位置の増加)によって性能向上がどのように変わるかを見るのは興味深いことです。

そうするようにします。

 
Rorschach:

指標計算を完全にgpuで行いたいので、このような大容量のデータをどのように転送するか考えなければなりません。

ちなみに、この数式をシェーダーで使っているので、加速度は〜10倍です。

作ってみますね。

その結果、感動を与えることができると思います。

そうですね、本当にMQL5にはとてもクールな機能が追加されていますね。MQチームの皆さん、ありがとうございました。

このリソースをプログラムに組み込むだけで、ビデオカードのリソースを利用した数学計算の パフォーマンスを何倍にも高めることができます。これにより、CPU自体の負荷が軽減されます。つまり、市場にとってのスーパーオプションです。

また、OpenCLがユーザー側で何らかのアクションを起こしてソフトウェアをインストールする必要があるとすれば、DirectXはすでにWindowsにデフォルトでインストールされています。そして、一番驚いたのは、DirectXを使ったときにex5のファイルがどれだけ増えるかを調べたのですが、全く増えなかったことです。とてもかっこいい!!!勉強して使ってみよう。

 
Nikolai Semko:

その結果、感動を与えることができるはずだと思います。

そうですね、本当にMQL5にはとてもクールな機能が追加されていますね。MQチームの皆さん、ありがとうございました。

このリソースをプログラムに組み込むだけで、ビデオカードのリソースを利用した数学計算の パフォーマンスを何倍にも高めることができます。これにより、CPU自体の負荷が軽減されます。つまり、市場にとってのスーパーオプションです。

また、OpenCLがユーザー側で何らかのアクションを起こしてソフトウェアをインストールする必要があるとすれば、DirectXはすでにWindowsにデフォルトでインストールされています。そして、一番驚いたのは、DirectXを使ったときにex5のファイルがどれだけ増えるかを調べたのですが、全く増えなかったことです。とてもかっこいい!!!勉強して使ってみよう。

ちなみに、そうですね、OCLよりもDXの方が汎用性が高いです。同じ能力+3D。CPUモードがあり、そのためにCPUにドライバを載せる必要はありません。

 
Rorschach:

ちなみに、この数式をシェーダーで使っているので、加速度は〜10倍です。

まだ2.5倍を数える必要があります。CPUは最適化の影響を受けたが、gpuは受けなかった。

ニコライ・セムコ

このコードで同じことをやって、計算の複雑さ(重心位置の増加)によって性能向上がどう変わるかを見るのは面白いですね。

このコードでは、スピードアップのために正弦の配列を使用せず、ただ正弦を計算して います。また、回転する重心の数を変更することも可能です。

最適化を有効にした。コードを3サイクルに整理し、転送しやすくしました。512センターが限度です。デフォルトでは、gpu上で直接実行されます。

ファイル:
pixel.zip  1 kb
 
Rorschach:

やはり2.5倍は数えなければならない。CPUは最適化の影響を受けたが、GPUは受けなかった。

最適化を有効にした。移植しやすいように、コードを3サイクルに書き直しました。このコードには512センターという制限があります。デフォルトでは、GPU上で直接実行されます。

ありがとうございました。
単純計算で2.5倍というのも、非常に良い結果だと思います。3Dでは、さらに急峻な結果になると思います。

 
Rorschach:

やはり2.5倍は数えなければならない。CPUは最適化の影響を受けたが、GPUは受けなかった。

最適化を有効にした。移植しやすいように、コードを3つのループに並べ替えました。512センターに限定しています。デフォルトでは、GPU上で直接実行されます。

OpenClの実装について質問されました。何かが判明した。コードをきれいにする時間がなくて、失礼しました。要は、「動く」ということです。

__kernel void Func(int N, __global double *XP, __global double *YP, __global uchar *h, __global uint *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 = fast_length(p);
      S2+=D;
      if(w<N/2)
         S1+=D;
   }   
   //
   double d=S1/S2;
   buf[Y*Width+X] = upsample(upsample((uchar)0xFF,(uchar)h[(int)(d*11520)]),upsample((uchar)h[(int)(d*17920)],(uchar)h[(int)(d*6400)]));
}
ファイル:
Swirl2_OCL.mq5  14 kb
test_002.zip  1 kb
 
Serhii Shevchuk:

OpenClの実装が欲しいということでしたね。何かあるブラッシュアップする時間がなく、コードで失礼しました。要は、「動く」ということです。

ワオッ!いやぁ~、正直言って予想外でしたね。私の控えめなビデオカードで10倍以上のゲインです。
ありがとうございました。

 
Serhii Shevchuk:

OpenClの実装が欲しいということでしたね。何かあるブラッシュアップする時間がなく、コードで失礼しました。要は、「動く」ということです。

ありがとうございました。

計算がダブルになっていませんか?それから、特に印象的なのはその結果です。