• ベストアンサー

ほかのプルグラムが書き出したメモリを参照するプログラム。

モンテカルロ計算をしています。 乱数の発生確率が単純にガウス型でないのと高速化のためにプログラムの始めにルックアップテーブルを作成しています。 この場合、プログラムのちょっとした変更でもルックアップテーブルの再計算が必要で時間がかかります。 ルックアップテーブルの計算だけプログラムを分けてメモリに書き出して、モンテカルロ計算のプログラムはメモリを参照するようにしたいのですが、どのようにすればよいのでしょうか? この場合、先のプログラムは終了していてもかまいません。 使用環境、MacG5,UNIXです。

質問者が選んだベストアンサー

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.3

こんにちわ。 > 具体的なやり方を書いてある本ってご存知ですか? こんなページはどうでしょう? http://www.h7.dion.ne.jp/~matsu/feature/c-language/ipc/shared-memory.html サンプルでは共用メモリのキーとして、1111 を指定していますが、 実際に使用する場合は、ftok を使ってOS からユニークなキーを取得する 事をお奨めします。 使う関数/システムコールは、 ftok : IPC キーをOS から取得 shmget : 共用メモリセグメントの取得 shmat : 共用メモリのアタッチ shmdt : 共用メモリのデタッチ shmctl : 共用メモリセグメントの操作 (削除等) になると思いますので、あとはman コマンドで調べてみて下さい。

t0103
質問者

お礼

ありがとうございます。 まだ、充分に調べていないのですが、共有メモリは容量に制限がありますね。ネットでmmapという方法を見つけたのですが、こちらは容量の制限がゆるいようです。mmapと共有メモリを両方調べて見ます。

その他の回答 (2)

  • togino
  • ベストアンサー率75% (97/129)
回答No.2

もしプログラムを分けてもかまわないのであれば ルックアップテーブルを作成して、それをファイルに 書き出し、もう片方はファイルから読み込むって 方法もあります。こっちの方は実装簡単だと思いますよ。 ■ ルックアップテーブル作成 double lookup_table[1000]; // 乱数によるテーブル作成 FILE* fp = fopen("/tmp/lookup.data", "wb"); fwrite(lookup_table, sizeof(double), sizeof(lookup_table)/sizeof(double), fp); fclose(fp); ■ モンテカルロ計算 int table_size; double lookup_table[1000]; FILE* fp = fopen("/tmp/lookup.data", "rb"); table_size = fwrite(lookup_table, sizeof(double), sizeof(lookup_table)/sizeof(double), fp); fclose(fp) ----- テーブルサイズを固定にしましたが、実際は malloc を 使って動的に変えたりすると思いますから、上のプログラムは 手抜きプログラムです・・・(^^;) 雰囲気はつかんでいただけたでしょうか?

t0103
質問者

お礼

ありがとうございます。 この方法はハードディスクの読み取りに時間がかかりますね。メモリ上にファイルを構築できればよいのですが。

回答No.1

シェアードメモリに書き出すか、その他のプロセス間通信を実装して参照できるようにしてあげたらいいでしょう。

t0103
質問者

お礼

ありがとうございます。 速さの点でシェアードメモリに書き出す方法がよさそうですね。この方法で調べてみます。 具体的なやり方を書いてある本ってご存知ですか?

関連するQ&A