subroutine para_range2

병렬화 할때 종종
myrank -> ista~iend
이런 매칭 테이블을 만들어 줘야 하는데 이런 일을 대신 해주는게 subroutine para_range입니다.

nsta, nend, nprocs, myrank를 넣어주면 nsta, nend범위를 myrank -> ista~iend로 나눠줍니다.

예를 들어 10개의 주파수 (nsta = 1, nend=10)에 대한 문제를 풀어야하는데 nprocs = 10개가 되면..

myrank 0 -> ifreq = 1
myrank 1 -> ifreq = 2
......
myrank 9 -> ifreq = 10

이렇게 되겠군요.


nsta = 1; nend=10
CALL para_range (ista, iend, nsta, nend, nprocs, myrank)
DO ifrq = ista, iend
~~
END DO

그런데 종종 아래와 같은 상황도 만납니다.
20개의 주파수(nsta = 1, nend=20)에 대한 문제를 2개씩 건너뛰면서 nprocs=10일때 풀고 싶다면..
myrank 0 -> ifreq = 1
myrank 1 -> ifreq = 3
……
myrank 9 -> ifreq = 19
이렇게 매칭되어야하는데..

그래서 추가한 subroutine이 para_range2입니다.
20개 주파수(nsta = 1, nend = 20)에 대해 2개씩 건너뛰면서(nskip  = 2), nprocs = 10이면

nsta = 1; nend = 20; nskip = 2
call para_range2 (ista, iend, nsta, nend, nskip, nprocs, myrank)
do ifreq = ista, iend, nskip
~~
end do

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s