0

ここではニューラル ネットワークを扱っていますが、実際の問題は Objective-C のブロックを処理する必要があるため、無視しても問題ありません。これが私の問題です。ニューラル ネットワークを一度に実行できる大きなブロックに変換する方法を見つけました。ただし、ネットワークのアクティブ化に比べて、非常に遅くなります。これは少し直感に反するようです。

次のようなネストされた関数のグループを指定した場合

CGFloat answer = sin(cos(gaussian(1.5*x + 2.5*y)) + (.3*d + bias))
//or in block notation
^(CGFloat x, CGFloat y, CGFloat d, CGFloat bias) {
 return sin(cos(gaussian(1.5*x + 2.5*y)) + (.3*d + bias));
};

理論的には、その関数を複数回実行する方が、一連の接続をループしてノードをアクティブ/非アクティブに設定するよりも簡単/高速である必要があります。これらはすべて、最終的にこの同じ関数を本質的に計算します。

ただし、ブロックを作成して (スレッド:実行時に関数を作成する方法を参照)、このコードを実行すると、適度なサイズのネットワークでは非常に遅くなります。

今、私がよく理解していないのは次のとおりです。

  1. ブロックをコピーするとき、正確には何をコピーしていますか?
  2. たとえば、ブロックを copy1 と copy2 の 2 回コピーするとします。同じスレッドでcopy1 と copy2 を呼び出した場合、同じ関数が呼び出されますか? ドキュメントがブロック コピーに対して何を意味するのか正確にはわかりません: Apple Block Docs
  3. ここで、copy1 と copy2 のコピーをもう一度作成しますが、代わりにのスレッドでコピーを呼び出すと、関数はどのように動作するのでしょうか? 各スレッドが同じブロックにアクセスしようとするため、これにより何らかの速度低下が発生しますか?
4

1 に答える 1

1

ブロックをコピーするとき、正確には何をコピーしていますか?

ブロックがキャプチャした状態をコピーしています。そのブロックが状態をキャプチャしない場合 (そのブロックはそうでないように見えます)、ブロックが定数になるという点で、コピーは「フリー」である必要があります (@"" の動作と同様)。

たとえば、ブロックを copy1 と copy2 の 2 回コピーするとします。同じスレッドで copy1 と copy2 を呼び出した場合、同じ関数が呼び出されますか? ドキュメントがブロック コピーに対して何を意味するのか正確にはわかりません: Apple Block Docs

ブロックがコピーされるとき、ブロックのコードは決してコピーされません。捕獲された状態のみ。つまり、まったく同じ一連の命令を実行することになります。

ここで、copy1 と copy2 のコピーをもう一度作成しますが、代わりに別のスレッドでコピーを呼び出すと、関数はどのように動作するのでしょうか? 各スレッドが同じブロックにアクセスしようとするため、これにより何らかの速度低下が発生しますか?

ブロック内でキャプチャされたデータは、マルチスレッド アクセスから保護されていないため、速度が低下することはありません (ただし、同時実行同期の楽しさは想像できるでしょう)。

アプリをサンプリングして、CPU サイクルを消費しているものを確認しましたか? otool -TtVv binary/or/.o/fileまた、ブロック コピーが実際にどれだけコストがかかるかを判断するのに非常に役立つため、フレンドリーなローカル逆アセンブラー ( ) についてよく知っておくとよいでしょう。


ブロック自体で多くの時間をサンプリングして確認している場合、それは単に計算に多くの CPU 時間を消費していることにすぎません。コピー中にブロックが CPU を消費する場合、コピー ヘルパーで消費が表示されます。

さまざまな種類のブロックを含むソース ファイルを作成してみてください。パラメーターあり、なし、キャプチャー状態あり、なし、キャプチャー状態あり/なしのキャプチャー済みブロックありなど、それぞれで Block_copy() を呼び出す関数。

それを逆アセンブルすると、ブロックがコピーされたときに何が起こるかを深く理解できます。個人的には、ARM よりも x86_64 アセンブリの方が読みやすいと思います。(これはすべて、ブログの良いネタのように思えます -- 書き留めておかなければなりません)。

于 2011-03-28T16:49:48.293 に答える