15

以前に作成したmatlabコードをベクトル化してきましたが、このプロセス中に、セグメンテーション違反が原因でmatlabがクラッシュし始めました。問題を単一のタイプの計算、つまり複数の構造体プロパティへの割り当てに絞り込みました。

たとえば、このフォームの自己割り当てでさえ、数千回実行されると、最終的にセグメンテーション違反が発生します。

[my_class_instance.my_struct_vector.my_property] = my_class_instance.my_struct_vector.my_property;

私は当初、これはある種のメモリリークであると考えていたので、反復ごとにJavaの空きメモリを出力してみましたが、これはかなり一定のままでした。

そうそう、なぜこれが壊れるのかについて今は完全に途方に暮れています:-/

更新:次の変更により、セグメントの障害が修正されます。

temp = [my_class_instance.my_struct_vector];

[temp.my_property] = temp.my_property;

[my_class_instance.my_struct_vector] = temp;

問題は、なぜこれで何かが修正されるのかということです。おそらく構造体リストではなく、ハンドルクラスに繰り返しアクセスすることについて何か?

更新2:プロットの厚さ

私はついに問題を再現し、ここに投稿するのに十分簡単なダミープログラムを使用して回避策を示しました。

単純なクラス:

classdef test_class
    properties
        test_prop
    end
end

そして、クラスで一連のベクトル割り当てを行い、常にクラッシュするプログラム。

test_instance = test_class();
test_instance.test_prop = struct('test_field',{1 1});
for i=1:10000

    [test_instance.test_prop.test_field] = test_instance.test_prop.test_field;
end

更新3:プロットの薄さ

バグを見つけました。Matlabのテクニカルサポートによると、クラスプロパティの繰り返しのベクトル割り当ては、R2011a(およびおそらく以前のバージョン)では機能しません。彼は、R2012aで​​正常に機能すると言った後、私が発見したのと同じ回避策、つまり一時変数を使用することについて言及しました。

そうそう...

この質問はそのサポートチケットで終わることは間違いありませんが、大胆な個人がこのバグが存在する理由についてショットを撮りたい場合は、私は間違いなくそのような答えに興味があります。(学習は楽しいです!)

4

1 に答える 1

3

最も可能性の高い原因は、操作が内部で自己変更コードを使用していることです。これに伴う問題は、最近のプロセッサにはCPUキャッシュがあるため、メモリ内のコードを変更しても、コードがすでにキャッシュにコミットされている場合、セグメンテーション違反が発生することです。

ランダムである理由は、変更時に変更されたコードがキャッシュにあるかどうかなどに依存するためです。

これを回避するには、プログラマーは自己変更を行う前に、コードでキャッシュをフラッシュする必要があります。

于 2012-09-18T19:36:49.513 に答える