OpenCL:MQL5での内部実装テスト - ページ 44

 
joo:

そうみたいですね。

私はトリッキーな構文(目で見て判断しにくい)を使わないようにしているのでよくわかりませんが、おそらくコードを高速化できるため、使わない方がよいのでしょう。

ループの繰り返しごとに変数bが再宣言されるため、コードの処理速度が遅くなるはずです。

私のコードはとにかく短くて高速です。 速度と同等性の両方をチェックできます。
"__kernel void MFractal(                                    \r\n"
"                       __global int *out                   \r\n"
"                      )                                    \r\n"
"  {                                                        \r\n"
"   int i = get_global_id(0);                               \r\n"
"   out[i]= i;                                              \r\n"
"  }                                                        \r\n"; //;-))
;-)
 
MetaDriver: 私のコードはとにかく短くて速いです。 速さと同等性の両方をチェックできます;-)
いいえ、それはフェアではありません。Andreiの コードを処理して、高速化する必要があります。
 
Mathemat:
いや、まあ......それはフェアじゃないな。あなたはAndreiのコードを処理 し、高速化する。

私は何をしたのだろう?

オプティマイザーに求められることとは?オーバーヘッドを削減しつつ、同等の結果を実現!だから、チェックしてみてください。すべて足すと1円にもなるんです。

:)

// ところで !このコードでは、#define BUF_SIZE 1024*1024*4 でもドライバが落ちません !!!

// これは画期的なことです。

;))))

 
MetaDriver:

私が何をしたのか?

オプティマイザーに求められることとは?オーバーヘッドを削減しつつ、同等の結果を実現!だから、チェックしてみてください。すべて足すと1円にもなるんです。

:)

どうやって確認したんだ?:O
 
joo:
サイズが合うか、どのように確認しましたか?:O
なんと、なんと!電卓で!8個を並列に走らせて確認したのです。
 
MetaDriver:
なんと、なんと!電卓で!8個を並列に走らせて確認しました。

電卓がウソをついている:)

サイクルは0+1+2+3+...+9999999を追加します。そして、10000ステップごとに値が0になる。

何をしたんですか?- フライナンバーを割り当てて、それで終わり。どうして私の結果があなたと同じになるのですか?

 

ちょっと調べてみて疑ったのが、この

"__kernel void MFractal(                                    \r\n"
"                       __global int *out                   \r\n"
"                      )                                    \r\n"
"  {                                                        \r\n"
"   out[get_global_id(0)]= get_global_id(0);                \r\n"
"  }                                                        \r\n";

つまり、get_global_id()は関数ではなく、超高速レジスタ操作である可能性が高いということです。

本当に必要な人、欲しい人がいたら、その結果をスタジオに報告してください。 きっと役に立ちます。
 
MetaDriver:

オプティマイザーに求められることとは?オーバーヘッドを削減しつつ、同等の結果を実現!だから、チェックしてみてください。すべて足すと1円にもなるんです。

// ところで !このコードでは、#define BUF_SIZE 1024*1024*4 でもドライバが落ちません !!!

逆に--ドライバーが落とさなければ、結果的に等価はもう不完全な んです。

くそ...なんとも残念なことです :(

 
MetaDriver: 長く吸って動揺してしまったのですね。 一方、ドライバーは落とさないので、結果的に同値性はすでに不完全 です。

なーんだ、タバコの吸い方が悪かったんだね。

1^3 + 2^3 + 3^3 + ...+ 1000000000^3 = 1000000000^2 * (1000000000 + 1)^2 / 4

左翼と右翼は同じもの、完全同値。

左の表現では、かなり長い時間石を加熱することになりますが、右の表現では、ほとんど瞬時に加熱され、プロセッサは気づかず、冷たいままです。

追伸:OpenCL 1.2にアップグレードしました(ベータ版です)。バージョン番号の後に小さく「sse2」が追加されていることにご注目ください。

2012.03.22 07:43:28     Terminal        CPU: GenuineIntel  Intel(R) Pentium(R) CPU G840 @ 2.80 GHz with OpenCL 1.2 (2 units, 2793 MHz, 7912 Mb, version 2.0 (sse2))

劇的に良くなったというわけではありませんが、いくつかのテストではスピードアップしています。例えば、Tast_Mand_で(まあ、変態ですね、アンドリューハ)-5%から10%。ほんの少しですが、良いですね。

 
joo:

電卓がウソをついている:)

ループは0+1+2+3+...+9999999を追加します。そして、10000ステップごとに値が0になる。

何をしたんですか?- フライナンバーを割り当てて、それで終わり。では、どうして私の結果があなたと同じになるのでしょうか?

正気に なるのに24時間掛かったが まだ こだわるのか?:)

見てみよう。

// Это твой код (оригинал)
"  {                                \r\n"
"   int i = get_global_id(0);       \r\n"
"   for(int u=0;u<100000000;u++)   \r\n"
"   {                           \r\n"
"    out[i]+=u;              \r\n"  
"    if(out[i]>10000)     \r\n"
"      out[i]=0;         \r\n" // после десятитысячного шага итерации этот оператор начнёт выполняться в каждом цикле.
"   }                    \r\n" // т.е. на выходе из цикла по любому будем иметь out[i] = 0;
"   out[i]+= i;          \r\n" // ecли к нулю прибавить номер мухи то получится... сам посчитай..... на калькуляторе... :)
"  }                     \r\n";// есть ещё вариант, надёжнее - распечатай результаты и сравни.  ;-)))