Segmentierungsfehler mit openmp im Fortran 90-Programm [Duplikat]

1
HotDogCannon 2019-11-23 19:38.

Ich schreibe ein kleines Programm, um Fortran 90 und openmp zu üben . Der folgende Beispielcode gibt einen Segmentierungsfehler zurück, wenn ich ihn kompiliere gfortran -fopenmp heat.f90 -o heat, läuft aber einwandfrei, wenn er ohne die -fopenmpOption kompiliert wird . Kann mir jemand helfen zu verstehen, warum dies geschieht?

Ich setze export OMP_NUM_THREADS=4in meiner Shell (Bash unter Ubuntu unter Windows 10)

program heat

    use omp_lib
    implicit none

    integer, parameter :: nx = 1000
    integer, parameter :: ny = 800
    real, parameter :: H = 1.
    real, parameter :: alpha = 1.e-4
    real, parameter :: dt = 0.001
    real, parameter :: physical_time = 50.

    real aspect, L, dx, dy
    real, dimension(nx,ny) :: T

    aspect = real(nx)/real(ny)
    L = H*aspect
    dx = L/real(nx)
    dy = H/real(ny)

    T = initialize_T()
    call evolve_field()

    contains

        function initialize_T() result(T)
            implicit none
            real, parameter :: sigma = 0.2
            integer i, j
            real x, y
            real, dimension(nx,ny) :: T
            do i=1, nx
                do j=1, ny
                    x = real(i)/real(nx)*L
                    y = real(j)/real(ny)*H
                    T(i,j) = 10. + &
                             2.* ( &
                                   1./(2.*3.14*sigma**2.) * &
                                   exp(-1. * ( (x-L/2.)**2. + (y-H/2.)**2. ) / (2.*sigma**2.)) &
                                 )
                enddo
            enddo
        end function initialize_T

        subroutine heat_eqn()
            implicit none
            real, dimension(nx,ny) :: Tn
            real d2Tdx2, d2Tdy2
            integer i, j

            Tn(:,:) = T(:,:)

            !$omp parallel shared(T) private(i,j,d2Tdx2,d2Tdy2) !$omp do
            do i=2, nx-1
                do j=2, ny-1            
                    d2Tdx2 = ( Tn(i+1,j) - 2.*Tn(i,j) + Tn(i-1,j) ) / dx**2.
                    d2Tdy2 = ( Tn(i,j+1) - 2.*Tn(i,j) + Tn(i,j-1) ) / dy**2.
                    T(i,j) =  Tn(i,j) + dt*(alpha*(d2Tdx2 + d2Tdy2))
                end do
            end do
            !$omp end do !$omp end parallel

            T(:, 1)  = T(:, 2)
            T(:, ny) = T(:, ny-1)
            T(1, :)  = T(2, :)
            T(nx, :) = T(nx-1, :)

        end subroutine heat_eqn

        subroutine evolve_field()
            implicit none
            integer ts, total_ts, frames_total, output_period_ts, pic_counter
            real progress_pct
            character(len=16) :: pic_counter_str

            total_ts = ceiling(physical_time/dt)
            frames_total = 30*20
            output_period_ts = int(total_ts/frames_total)

            pic_counter = 0

            do ts = 0, total_ts

                if (mod(ts,output_period_ts) .eq. 0) then

                    progress_pct = 100.*real(ts)/real(total_ts)
                    print '(I8, F7.2, A)', ts, progress_pct, "%"

                    !! -- for plotting

                    !open(3, file="T.dat", access="stream")
                    !write(3) T(:,:)
                    !close(3)

                    !write (pic_counter_str,'(I5.5)') pic_counter
                    !call system('gnuplot -c plot3d.gnu '//trim(pic_counter_str))
                    !pic_counter = pic_counter + 1

                end if

                ! -----

                call heat_eqn()

                ! -----

            end do

        end subroutine evolve_field

end program heat

1 answers

4
jacob 2019-11-24 06:37.

Wie von evets in den Kommentaren vorgeschlagen, stürzt das Programm aufgrund des Stack-Speichermangels ab. Das heißt, Sie haben zu viele zu große automatische (vom Stapel zugewiesene) Arrays erstellt. Als Hinweis können Sie das Programm in Valgrind ausführen

> gfortran -fopenmp heat.f90
> valgrind ./a.out

Bevor viele "ungültige Schreibfehler" gedruckt werden, wird so etwas wie ausgegeben

==31723== Warning: client switching stacks?  SP change: 0x1ffefffbc0 --> 0x1ffecf2740
==31723==          to suppress, use: --max-stackframe=3200128 or greater

Die Warnung "Client-Switching-Stacks" wird häufig angezeigt, wenn der Stack-Speicher knapp wird.

In einem realen Programm würden Sie allocatableArrays verwenden, die nicht künstlich beschränkt sind. In diesem einfachen Fall hatte ich jedoch Erfolg mit dem Flag -fno-automatic, das die Verwendung automatischer (stapelzugeordneter) Arrays vermeidet und sie stattdessen in eine andere Art von Speicher legt:

> gfortran -fno-automatic -fopenmp heat.f90
> ./a.out
       0   0.00%
     500   0.17%
    1000   0.33%
    1500   0.50%
...

Details zu dieser Option finden Sie in der Manpage.

Hinweis: Ich habe das Programm in einer anderen Linux-Distribution getestet (nicht in Windows).

Related questions

MORE COOL STUFF

Cate Blanchett schlief nach 3 gemeinsamen Tagen mit ihrem Ehemann und ist 25 Jahre später immer noch mit ihm verheiratet

Cate Blanchett schlief nach 3 gemeinsamen Tagen mit ihrem Ehemann und ist 25 Jahre später immer noch mit ihm verheiratet

Cate Blanchett widersetzte sich typischen Dating-Ratschlägen, als sie ihren Ehemann traf.

Warum Michael Sheen ein gemeinnütziger Schauspieler ist

Warum Michael Sheen ein gemeinnütziger Schauspieler ist

Michael Sheen ist ein gemeinnütziger Schauspieler, aber was genau bedeutet das?

Hallmark-Star Colin Egglesfield sorgt für spannende Fan-Begegnungen bei RomaDrama Live! [Exklusiv]

Hallmark-Star Colin Egglesfield sorgt für spannende Fan-Begegnungen bei RomaDrama Live! [Exklusiv]

Hallmark-Star Colin Egglesfield sprach über spannende Fan-Begegnungen bei RomaDrama Live! plus sein INSPIRE-Programm auf der Convention.

Warum Sie „Northern Exposure“ nicht online streamen können

Warum Sie „Northern Exposure“ nicht online streamen können

Sie müssen einen Blu-ray- oder DVD-Player abstauben, um zu sehen, warum Northern Exposure zu einer der beliebtesten Shows der 90er Jahre wurde.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

Werfen Sie diese Pappröhren nicht weg! 10 Möglichkeiten, sie wiederzuverwenden

Werfen Sie diese Pappröhren nicht weg! 10 Möglichkeiten, sie wiederzuverwenden

Werfen Sie Ihr Papierhandtuch, Toilettenpapier und Geschenkpapierrollen nicht in den Müll. Geben Sie ihnen stattdessen mit einem dieser 10 Hacks ein zweites Leben.

Schlafen Fische?

Schlafen Fische?

Es ist schwer vorstellbar, dass Nemo im Great Barrier Reef ein paar Zs fängt. Aber Fische brauchen Ruhe. Schlafen sie so wie wir?

Spenden Sie Ihr Haar, um unser Wasser sauber zu halten

Spenden Sie Ihr Haar, um unser Wasser sauber zu halten

Haarteile aus Salons und persönliche Spenden können als Matten wiederverwendet werden, die Ölverschmutzungen aufsaugen und zum Schutz der Umwelt beitragen.

Welche Utility-Apps installieren Sie auf jedem neuen Computer?

Welche Utility-Apps installieren Sie auf jedem neuen Computer?

Foto von Ade Olu Eletu /nappy Es gibt ein paar Programme, die jeder kennt, um sie einem neuen Computer hinzuzufügen: Chrome, Spotify, Dropbox, einige Arbeits-Apps wie Excel oder Photoshop. Aber viele von uns haben auch unsere bevorzugten Hilfs-Apps und Dienstprogramme, um unseren Workflow anzupassen.

Jugend-Hockey-Trainer gefeuert für völlig verdammte Bonkers Pregame Rant

Jugend-Hockey-Trainer gefeuert für völlig verdammte Bonkers Pregame Rant

Bild über Spittin 'Chiclets / Facebook Die Littleton Hockey Association hat einen Trainer aus ihrem Bantam-Reiseteam entfernt, nachdem in den sozialen Medien ein Video aufgetaucht ist, das nur als eines der unglaublichsten und ungehindertesten Motivations-Rants vor dem Spiel in der Geschichte des Jugendhockeys bezeichnet werden kann. Hockey und in der Tat Sport: „Du wirst sie drei schlagen - keine! Ich will sehen, wie du deine Hände in die Ärsche dieser Jungs steckst und sie wie eine verdammte Marionette arbeitest! “ Ein Tippgeber leitete eine E-Mail von Brian TenEyck, Director of Hockey Operations bei Littleton Youth Hockey, an die Eltern weiter und erläuterte die offizielle Antwort auf das Video: Ich kann nur davon ausgehen, dass die Littleton Hawks dieses Spiel mit 998-0 gewonnen haben.

Ihre lächerlich tollen Porsche 911 und Aston Martin DB11 Wallpaper sind da

Ihre lächerlich tollen Porsche 911 und Aston Martin DB11 Wallpaper sind da

Wir freuen uns, wenn Ihre Leser uns Ihre Weekend Wallpaper-Beiträge senden. Aber Sie haben uns in letzter Zeit zu viele verdammte BMWs geschickt! Hör zu, Freund, ich bin super froh, dass du deinen M4 genießt.

So erstellen Sie einen Globus von Grund auf neu

So erstellen Sie einen Globus von Grund auf neu

Zeit, Geduld, Zeit, Engagement und Zeit sind nur einige der Dinge, die Peter Bellerby brauchte, um Bellerby & Co. Globemakers zu gründen und anschließend zu betreiben, eines der wenigen Unternehmen auf der Erde, das noch Globen von Hand herstellt.

Tudor Dixon gewinnt Michigan GOP Primary und trifft nun auf die amtierende Demokratin Gretchen Whitmer

Tudor Dixon gewinnt Michigan GOP Primary und trifft nun auf die amtierende Demokratin Gretchen Whitmer

Tudor Dixon hat am Dienstag die Vorwahlen von Michigan zum Gouverneur gewonnen, nachdem er eine späte Bestätigung des ehemaligen Präsidenten Donald Trump erhalten hatte

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton verbringt einen Tag am Wasser in London, plus Jennifer Lopez, Julianne Hough und mehr

Kate Middleton verbringt einen Tag am Wasser in London, plus Jennifer Lopez, Julianne Hough und mehr

Kate Middleton verbringt einen Tag am Wasser in London, plus Jennifer Lopez, Julianne Hough und mehr. Von Hollywood bis New York und überall dazwischen, sehen Sie, was Ihre Lieblingsstars vorhaben!

17-Jähriger erstochen, während 4 weitere bei einem Messerangriff am Wisconsin River verwundet wurden

17-Jähriger erstochen, während 4 weitere bei einem Messerangriff am Wisconsin River verwundet wurden

Die Ermittler prüfen, ob sich die Gruppe und der Verdächtige vor dem Angriff kannten

-11 聯軍 國 聯軍 - 台灣 還沒 能 有 太陽

-11 聯軍 國 聯軍 - 台灣 還沒 能 有 太陽

2 練習 part2- 沒 沒 的 台灣 x 日本 x 德國 x 奧地利.

Start- und Landebahnen

Start- und Landebahnen

Spätsommer und Herbst sind nostalgische Jahreszeiten. Straßenlaternen werfen ihr Licht über regennasse Straßen, und die Blätter unter den Füßen – gedämpft rot-orange im Schatten der Dämmerung – erinnern an vergangene Tage.

Stellen Sie sich vor, Sie erstellen eine Inhaltsstrategie, die tatsächlich KONVERTIERT. Es ist möglich.

Stellen Sie sich vor, Sie erstellen eine Inhaltsstrategie, die tatsächlich KONVERTIERT. Es ist möglich.

Im Jahr 2021 ermutige ich Sie, alles zu überdenken, was Sie über die Kunden, die Sie bedienen, und die Geschichten, die Sie ihnen erzählen, wissen. Zurücktreten.

Ein Mammutverlust öffnete mein Herz für die Liebe

Ein Mammutverlust öffnete mein Herz für die Liebe

Am Tag des 9. Geburtstags von Felix The Cat erinnere ich mich an einen der größten Verluste meines Erwachsenenlebens – meine Sophie im Jahr 2013. Ich habe diesen Essay geschrieben und ihn kurz im Jahr 2013 auf dieser Plattform geteilt.

Language