2016-05-10 16 views
1

私は、約100個のオブジェクトに対して大規模なニューラルネットワークを使用し、進化した状態で移動し相互作用するプログラムを持っています。今は、画面を計算するたびに写真を撮りますが、時間がかかることがあります。私は、サッカーのニューラルネットワークの例や、人々がニューラルネットワークを「ライブストリーミング」できる他の例を見てきました。スクリプトを非常に高速に実行できる方法は何ですか?これは私の現在のコードとは関係がありません。これは、私が何かに適用することを望んでいるからです。おそらくビデオゲームのように多くの情報を管理することができます。 。私の研究から、多分マルチスレッドが私のソリューションかもしれないようです。大量の計算をサポートできる他のライブラリはありますか?大量の計算ではC#は悪い言語ですか?サポートしてくれてありがとう。C#ニューラルネットワークの最適化

- EDIT 1-- 遅れの原因となるボトルネックは、forループが1/10秒ごとに50,000回進むためです。毎回、わずか数バイトが計算されます。プロファイリングはこれが遅れを引き起こしていると私に伝えます。

- 編集2-- コメントに応じて、私の今後の希望はライブストリームで顔認識をすることです。

+0

あなたの質問はあまりにも広すぎます。私たちが手助けをする前に、実際のコードを見る必要があります。ボトルネックがどこにあるのかを見つけるためにコードのプロファイリングを自分で行ったのですか? – bodangly

+0

これについて質問する方法についてのヒントはありますか?数時間の研究の後、オンラインの誰も、私のターゲットコンピュータでは行えないスレッドやマルチCPUの方法以外の、本当に良い方法を知っているようです。 –

+0

マルチスレッドやSIMDを投げたり、魔法でもないものを投げたりすることで、何かが本当に速くなるようにしたい場合は、より小さなネットワークを使用するといった作業を少なくしなければなりません。 – harold

答えて

2

ボトルネックがループオーバーヘッドの場合、それを処理する方法は、1つのループで多くのことを行うことです。

プレ最適化ループ:

var ints = new int[1000]; 

for (var x = 0; x < 1000; ++x) 
{ 
    //do work on one element 
} 

ポスト最適化ループたとえば

for (var x = 0; x < 1000; x += 10) 
{ 
    //do work on x + 0 
    //do work on x + 1 
    //do work on x + 2 
    //do work on x + 3 
    //do work on x + 4 
    //do work on x + 5 
    //do work on x + 6 
    //do work on x + 7 
    //do work on x + 8 
    //do work on x + 9 
} 

同じ一度に大きなチャンクを処理することにより、ストリームを用いて行うことができます。

もしあなたが配列で作業していて、blittableで十分なほど幸運であれば、ポインタを使ってアクセス時に配列の境界チェックをバイパスすることができます。通常はループを作ることによってメモリアドレスへのインデックスの翻訳を排除しますvariableはインデックスではなくポインタです。

コードコンプリートシリーズのいずれかの最適化の章では、これ以上のことをすべて教えてくれます。