CO_REDUCE — 현재 팀 이미지 집합에서의 리덕션

CO_REDUCE — 현재 팀 이미지 집합에서의 리덕션

단순한 합·최솟값만 모으는 게 아니라, 직접 정의한 연산으로 여러 이미지의 값을 결합하고 싶을 때가 있어요. CO_REDUCE는 현재 팀의 모든 이미지에서 A의 값을 사용자가 준 순수 함수로 쌍(pairwise) 리덕션하는 집합적 서브루틴이에요.

출처: gfortran 공식 문서 - CO_REDUCE

본문

CALL CO_REDUCE(A, OPERATION, [, RESULT_IMAGE, STAT, ERRMSG])

설명(Description)

CO_REDUCE는 현재 팀의 모든 이미지에서 A의 값을 원소별로 리덕션해요. OPERATION으로 넘긴 순수 함수가 서로 다른 이미지의 A 값을(또는 그 리덕션 결과 값을) 인자로 받아 쌍으로 줄이는 데 사용돼요. A가 배열이면 리덕션은 원소별로 이뤄져요. RESULT_IMAGE가 주어지면 결과 값은 지정된 이미지의 A에만 돌아가고, 다른 이미지의 A 값은 정의되지 않은 상태가 돼요. RESULT_IMAGE가 없으면 모든 이미지에 값이 돌아가요. 실행이 성공하고 STAT가 있으면 0이 할당되고, 실패하면 0이 아닌 값이 할당되며 ERRMSG가 있으면 발생한 오류를 설명하는 값이 할당돼요.

분류(Class)

집합적 서브루틴(Collective subroutine)

인자(Arguments)

  • AINTENT(INOUT) 인자이며 비다형(nonpolymorphic)이어야 해요. 할당 가능(allocatable)이면 할당돼 있어야 하고, 포인터면 연관(associated)돼 있어야 해요. 팀의 모든 이미지에서 같은 타입·타입 파라미터를 가져야 하며, 배열이면 모든 이미지에서 같은 형상(shape)을 가져야 해요.
  • OPERATION — 두 개의 스칼라 비할당 인자를 받는 순수 함수예요. 인자는 비다형이어야 하고 A와 같은 타입·타입 파라미터를 가져야 해요. 함수는 A와 같은 타입·타입 파라미터의 비할당 스칼라를 반환해야 해요. 모든 이미지에서 같은 함수여야 하며, 인자에 관해 수학적으로 교환·결합 법칙이 성립해야 해요. 내장 함수가 아니라면 원소별(elemental) 함수일 수 없어요.
  • RESULT_IMAGE — (선택) 스칼라 정수 표현식이에요. 주어지면 모든 이미지에서 같은 값을 가져야 하고 현재 팀의 이미지를 가리켜야 해요.
  • STAT — (선택) 스칼라 정수 변수예요.
  • ERRMSG — (선택) 스칼라 문자 변수예요.

예제

program test
  integer :: val
  val = this_image ()
  call co_reduce (val, result_image=1, operation=myprod)
  if (this_image() == 1) then
    write(*,*) "Product value", val  ! prints num_images() factorial
  end if
contains
  pure function myprod(a, b)
    integer, value :: a, b
    integer :: myprod
    myprod = a * b
  end function myprod
end program test

곱셈 함수 myprod를 넘겼으므로 1번 이미지에는 1 × 2 × ... × n = n! 값이 담겨요.

참고(Notes)

규칙상 원칙적으로 내장 함수도 허용되지만, 표준의 내장 함수 중에서 같은 타입의 인자 두 개를 받아 그 타입을 결과로 돌려주는 특정 함수의 조건을 만족하는 것은 없어요.

표준(Standard)

Technical Specification (TS) 18508 이상

같이 보기

CO_MIN — 현재 이미지 집합에서의 최솟값, CO_MAX — 현재 이미지 집합에서의 최댓값, CO_SUM — 현재 이미지 집합에서의 합, CO_BROADCAST — 값을 현재 이미지 집합 전체로 복사