- 締切済み
WindowsとLinuxのOpenMPコンパイル
fortranを用いたプログラムをOpenMPを用いて並列化した際のトラブルについてです。 Fortranを使ってプログラムを作成しています。 Windows上でフリーコンパイラGFortranを用いて,OpenMPで記述したCPU並列化プログラムをコンパイルし,実行したところ問題なく並列計算が動作しました。 しかし,プログラム中で用いる配列や変数が多いため,Windowsでのメモリ使用制限2GBを超えてしまい,Linuxでの開発を余儀なくされました。 そのため,初心者ながらUbuntuを導入し,GFortranをインストールして同じく並列化を指示しコンパイルしたところ,2GBの制限を超えないようにしたWindowsと全く同じプログラムでも数値がおかしくなってしまいました。 Ubuntuでも,並列化の指示をせずに逐次計算を行えばWindows上と同じようにプログラムを回すことができ,正しい値が算出されています。 つまり,UbuntuではWindowsと全く同じプログラムでも並列化がうまくできていません。 なぜこのようなことが起きるのでしょうか,対処法があればお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- hue2011
- ベストアンサー率38% (2801/7249)
Fortranが問題なのです。 Fortranが作業メモリを確保するときにやることはメモリ領域にプレーンにスペーシングを始めるのです。パソコン的にいうとヒープ領域です。 これは一応超古代言語であってもともと汎用機のものなので仕方がないのですが、当然巨大な二次元配列なんかを宣言した瞬間に落ちます。構造的なものです。C以後の開発言語とかオブジェクト指向をしている言語だと、ダイナミックにメモリを取得し捨てますから、スタックの上に確保できるんですね。そして仮想メモリとしてディスクをつかったりしますから原則メモリは無限大に取ることができるのです。 一応なぜ起きるか、というのはそこにあります。 対処法。開発がどういうことになっているのか、メンバーがどういう柔軟さを持っているかによりますけど、単純に開発言語をPythonに切り替えたらいいんじゃないかと考えます。
- f272
- ベストアンサー率46% (8477/18146)
これだけじゃよくわからん。もともとWindowsでもおかしな書き方をしていたんじゃないの?とか疑ってしまいます。 とにかくどこで計算がおかしくなっていくのか場所を特定してください。 それから,並列化とは関係ないが,もしかしてwindowsは32bitOSなんですか?64bitOSにすることはできないのですか? そのうえで「プログラム中で用いる配列や変数が多い」のなら配列の領域確保は静的にではなく動的に行ってください。そうすると変なメモリの制限にはかからなくなります。物理的に存在するメモリサイズまでは快適に動くようになりますよ。
お礼
アドバイスありがとうございます。 最初からやればよかったのですが,簡単なFortranプログラムで行ったところ問題なく並列化できたので,Windows側で問題なく回せていましたが,恥かしながらやはり私のプログラムに問題があると思います。 落ち着いておかしくなっている部分を見つけていきたいと思います。
お礼
アドバイスありがとうございます。 開発言語を変更することはできませんが,勉強しながらもう少し詳細に詰めていきたいと思います。