ATOMIC_ADD — 원자적으로 값을 더하기

ATOMIC_ADD — 원자적으로 값을 더하기

멀티 이미지(코어레이) 코드에서 여러 이미지가 같은 변수를 동시에 갱신하면 데이터 경쟁이 생길 수 있어요. 더하기 하나만 해도 중간에 끼어들면 결과가 어긋나거든요. ATOMIC_ADD는 그런 경쟁 없이 VALUEATOM에 원자적으로 더해 주는 내장 서브루틴이에요.

출처: ATOMIC_ADD (The GNU Fortran Compiler)

본문

시그니처

CALL ATOMIC_ADD (ATOM, VALUE [, STAT])

설명

ATOMIC_ADD(ATOM, VALUE)VALUE의 값을 변수 ATOM에 원자적으로 더해요. STAT가 주어졌을 때 호출이 성공하면 STAT에 0이 저장돼요. 호출이 실패했는데 STAT가 주어졌다면 양수 값이 저장되는데, 특히 코인덱스된(coindexed) ATOM의 경우 원격 이미지가 멈췄다면 ISO_FORTRAN_ENVSTAT_STOPPED_IMAGE 값이, 원격 이미지가 실패했다면 STAT_FAILED_IMAGE 값이 저장돼요.

클래스

원자적 서브루틴(Atomic subroutine)이에요.

인자

  • ATOMATOMIC_INT_KIND kind를 가진 정수 타입의 스칼라 코레이나 코인덱스된 변수예요.
  • VALUEATOM과 같은 타입의 스칼라예요. 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에서 확인할 수 있어요.