5

特定のコードでボトルネックをどのように処理できるかを知りたいです。

%% Points is an Nx3 matrix having the coordinates of N points where N ~ 10^6
Z = points(:,3)
listZ = (Z >= a & Z < b); % Bottleneck
np = sum(listZ); % For later usage
slice = points(listZ,:);

現在N ~ 10^6np ~ 1000number of calls to this part of code = 1000のボトルネック ステートメントには合計で約 10 秒かかっています。これは、コードの残りの部分に比べてかなりの時間です。

プロファイリング結果

@EitanT によって要求されたインデックス作成ステートメントのみのサンプル コードのスクリーンショット

サンプルコードのプロファイリング サンプルコードのプロファイリング

4

3 に答える 3

8

片側の等式が重要でない場合は、それを片側比較に再定式化すると、1 桁速くなります。

Z = rand(1e6,3);
a=0.5; b=0.6;
c=(a+b)/2;
d=abs(a-b)/2;
tic
for k=1:100,
    listZ1 = (Z >= a & Z < b); % Bottleneck
end
toc

tic
for k=1:100,
    listZ2 = (abs(Z-c)<d);
end
toc

isequal(listZ1, listZ2)

戻り値

Elapsed time is 5.567460 seconds.
Elapsed time is 0.625646 seconds.

ans =

     1
于 2013-06-20T16:25:02.477 に答える
3

最悪のケースを想定すると:

  • 要素ごと&に内部で短絡されていません
  • 比較はシングルスレッドです

2*1e6*1e3 = 2e910 秒以内に比較を行っています。これは、1 秒あたり最大 2 億回の比較 (最大 200 MFLOPS) です。

単一のコアで 1.7 GFLopsを実行できることを考えると、これは実際にはかなり低いようです。

Windows 7 を実行していますか? その場合、電源設定を確認しましたか? あなたはモバイル プロセッサを使用しているため、デフォルトで低消費電力スキームが有効になっていると思います。これにより、ウィンドウの処理速度が低下するため、... チェックしてください。

それ以外は……まったくわかりません。

于 2013-06-20T16:11:50.870 に答える