ATOMIC_ADD — 원자적으로 값을 더하기
ATOMIC_ADD — 원자적으로 값을 더하기
멀티 이미지(코어레이) 코드에서 여러 이미지가 같은 변수를 동시에 갱신하면 데이터 경쟁이 생길 수 있어요. 더하기 하나만 해도 중간에 끼어들면 결과가 어긋나거든요. ATOMIC_ADD는 그런 경쟁 없이 VALUE를 ATOM에 원자적으로 더해 주는 내장 서브루틴이에요.
본문
시그니처
CALL ATOMIC_ADD (ATOM, VALUE [, STAT])
설명
ATOMIC_ADD(ATOM, VALUE)는 VALUE의 값을 변수 ATOM에 원자적으로 더해요. STAT가 주어졌을 때 호출이 성공하면 STAT에 0이 저장돼요. 호출이 실패했는데 STAT가 주어졌다면 양수 값이 저장되는데, 특히 코인덱스된(coindexed) ATOM의 경우 원격 이미지가 멈췄다면 ISO_FORTRAN_ENV의 STAT_STOPPED_IMAGE 값이, 원격 이미지가 실패했다면 STAT_FAILED_IMAGE 값이 저장돼요.
클래스
원자적 서브루틴(Atomic subroutine)이에요.
인자
- ATOM —
ATOMIC_INT_KINDkind를 가진 정수 타입의 스칼라 코레이나 코인덱스된 변수예요. - VALUE —
ATOM과 같은 타입의 스칼라예요. kind가 다르면ATOM의 kind로 변환돼요. - STAT (선택) — 기본 kind의 스칼라 정수 변수예요.
예제
program atomic
use iso_fortran_env
integer(atomic_int_kind) :: atom[*]
call atomic_add (atom[1], this_image())
end program atomic
각 이미지가 자신의 이미지 번호를 이미지 1의 atom에 더해서, 실행이 끝나면 전체 이미지 수의 합이 저장돼요.
표준
TS 18508 또는 그 이후예요.
더 알아보기
- 변수를 원자적으로 설정하려면
ATOMIC_DEFINE을, 값을 읽어오려면ATOMIC_REF를 써요. - 원자적 연산 계열에는
ATOMIC_FETCH_ADD,ATOMIC_AND,ATOMIC_OR,ATOMIC_XOR도 있어요.ISO_FORTRAN_ENV모듈의 상수와 함께 쓰는 방식이 같아요. - GNU Fortran 내장 프로시저 전체 목록은 Intrinsic Procedures에서 확인할 수 있어요.