0

私はopenmpを少しリフレッシュしていて、この奇妙な状況に陥りました。束を削り取って、私は問題を示すこの最小限の些細なケースを作成しました

program ex2
    implicit none
    integer, parameter :: n=10000000
    integer :: i
    real :: x(n)

    do i=1,n
        x(i) = 0.0d0
    enddo

end program

フラグが指定されていない場合、Mac(10.6)上のgfortran 4.3.4がコンパイルされ、プログラムは正しく実行されます。

ただし、-fopenmpを使用してopenmpを有効にすると、プログラムはセグメンテーション違反で終了します。すぐにクラッシュするため、コードは実行されないようです。ご覧のとおり、コードでopenmpを使用して何かを並列化することはありません。スタックサイズを変更しようとしましたが、両方ともulimit -fmax-stack-var-sizeを使用しましたが、いずれの場合も、1000万の実数は大きな配列を定義するものではありません。

私は何を間違っているのですか?

4

3 に答える 3

4

はい、openmpは通常、メモリの割り当て方法を変更します。前の議論:FortranのOpenMP

Webで検索すると、http://homepage.mac.com/eric.c/hpc/contents/documentation/How%20to%20increase%20the%20stack%20size%20on%20Mac%20OS%20X.pdfが見つかりました

gfortran-mp-4.3 -fopenmp ex2.f90 -Wl、-stack_size、0x40000000、-stack_addr、0xf0000000 -o ex2.exe

Macの問題を修正しました。

于 2010-06-18T20:41:57.090 に答える
2

MSBに同意します。これは一般的なスタックサイズの問題です。ヒープにxフィールドを割り当てることをお勧めします。また、スタックに割り当てられた配列の使用を完全に回避しようとしています(あなたの場合のように、スタックごとの割り当てはすべてのローカル変数に対して行われます)。これにより、特定の問題サイズでサブルーチンが誤動作し始めたり、別のマシンでスタックサイズが異なる問題が発生したりするなど、いくつかの厄介なバグを防ぐことができます。また、私の経験から、ヒープでの割り当てと割り当て解除は、実行時の大きなオーバーヘッドを引き起こしません。

于 2010-07-07T12:47:17.417 に答える
0

これが答えの薄暗い試みです:openmpフラグは配列をスタックからヒープに移動しますか?もしそうなら、それはどのような影響を与える可能性がありますか?

于 2010-06-18T17:29:59.320 に答える