6

Linux マシンの空き RAM をランダム データで埋める方法はありますか?

私がこれを尋ねている理由: 私は、Fortran で数値プログラミングを行うグループで働いています。時々、人々は倍精度の実数を扱うのを間違えて、倍精度の結果を与えるべきプログラムが単精度しか与えないようにすることがあります。

私の理解が正しければ、そのようなプログラムでは、単精度制限の後に結果のランダムな変動が見られるでしょう。つまり、同じ入力で同じプログラムを数回実行すると、毎回ランダムに異なる結果が得られます。表示されるもの (ランダム部分) は、マシンの空き RAM のランダム値によって異なります。しかし実際には、同じマシンでプログラムを繰り返し実行すると、メモリの同じ部分が繰り返し使用される傾向があり、同じランダム データが含まれているため、毎回同じ出力が得られます。

私の考えでは、メモリをランダムなデータで上書きできれば、実際にプログラムの出力にランダムな変動が見られるでしょう。これにより、これらのバグを見つけやすくなります。

このアイデアはすごいですか、そうでない場合、どうすればメモリを埋めることができますか? /dev/random を RAM などにパイプできますか?

4

7 に答える 7

5

あなたの理解は間違っています。プログラムの実行を開始する前に、プログラムのメモリをランダムデータで埋めることはできません。また、できたとしても、問題を解決することはできません。

Fortranプログラムが単精度浮動小数点変数を宣言している場合、コンパイラは値を保持するためにメモリに32ビットセルを割り当てます。プログラムが変数から読み取るたびに、プロセッサはセルから32ビット値をフェッチします。変数に割り当てるたびに、プロセッサは32ビット値をセルに書き込みます。いかなる状況においても、セルの前後のセルからランダムビットが値に「ブリード」してはなりません。

浮動小数点演算は正確ではありませんが、ランダムでもありません。1.0 / 3.0 + 1.0 / 3.0 + 1.0 / 3.0)1000回計算する0.99999...と、毎回得られます。

2つ目のポイントは、Linuxでプログラムを実行すると、オペレーティングシステムによってすべてのデータメモリが慎重にゼロに事前初期化されることです。これは、プログラムを実行するたびに異なる動作をすることを避けるために行われます。これは悪いことです。編集:これが行われる別の理由は、あるプロセスから別のプロセスへの個人情報の漏洩を防ぐためです。

(コメント:説明を簡単にするために、私は意図的にいくつかの問題についてスケートをしたことに注意してください。)

于 2009-08-11T14:04:50.713 に答える
5

最近の (>=2.4 のように見える) glibc を使用している場合は、環境変数 MALLOC_PERTURB_ を設定して、malloc() が何らかの値に設定されたメモリを返すようにすることができます。http://udrepper.livejournal.com/11429.htmlおよび内部http://people.redhat.com/drepper/defprogramming.pdfを参照してください。

次に問題は、Fortran プログラムが glibc の malloc() を使用しているかどうかです。Fortran コンパイラに依存していると思います。

于 2009-08-11T13:55:42.677 に答える
2

あなたが達成したいことは、高潔で興味深い考えですが、ワイリーE.コヨーテがロードランナーを捕まえることを計画していることを覚えていますが、ライフルと狙撃アクションが最良の選択肢でした。

提示した問題がある場合は、コードに構造上の問題があり、プログラムの制御を失っていることを意味します。私はソフトウェアが学界やFortranでどのように開発されているかを完全に知っていますが、世界の他の地域がそうしているという理由だけで自分を崖から投げ落とすのは問題があります。

あなたがすべきことはあなたのコードの監査です。そして、彼が再びそれを台無しにした場合、いくつかの大学院生を打ち負かします。

于 2009-08-11T14:32:20.033 に答える
2

Linux は、あなた自身の喜びのために/proc/pid/mapsと を提供します。/proc/pid/memもちろん、そこに書き込むときは特に注意する必要があります。また、各プロセスで使用できる唯一のメモリ セグメントはそれ自体のものであることを覚えておいてください。そのため、必要な場所に到達するには、アタッチとコード パッチを実行する必要があります。とにかく、頑張ってください。:)

編集:コード監査よりもかなり複雑です-これは、問題の実際の原因を明らかにする可能性も高くなります.

于 2009-09-04T09:45:54.987 に答える
2

fUnitのようなものを使用して単体テストを作成し、単精度の結果が頻繁に表示される場合に倍精度の結果を必要とするいくつかのテストを作成して、倍精度の値が常に期待どおりに機能することを確認します。

例: 倍精度出力を生成するさまざまな入力で関数を呼び出すテストを作成し、これが assert() で機能することをテストします。

于 2009-08-11T14:02:39.140 に答える
1

あなたは、メモリのランダム化という問題の解決策を実装するための支援を求めてきました。ただし、解決策をデバッグするのは奇妙で、おそらく難しいと思います。

-静的コード分析ツール-特定の単体テスト-特にこの問題を対象としたコードレビューのチェックリストから、より多くのメリットが得られるように思われます。

場合によっては、解決策をさらに簡単に考えることができます。単精度演算なしで実行できる場合は、そのようなライブラリのリンクを妨げる可能性があるため、エラーはリンクエラーを表示します。開発プロセスの早い段階で。幸運を。

于 2009-08-11T14:04:54.957 に答える
1

ランダムなデータを使用すると、デバッグがはるかに難しくなると思います。メモリ内のランダムな値または計算バグによって引き起こされる回答のランダム性はありますか? 固定値と既知の値の方が良いと思います。

FORTRAN 側では、「混合精度」の数値が相互交換可能に使用されていると言っていますか? 私は実際の問題について明確ではありません。

しかし、Linux の空きメモリを何かで埋める方法がわかりません。

于 2009-08-11T13:47:36.883 に答える