LAPI_Xfer 서브루틴

용도

LAPI 데이터 전송 함수를 위한 래퍼 함수 역할을 합니다.

라이브러리

가용성 라이브러리 (liblapi_r.a)

C 구문

#include <lapi.h>
 
int LAPI_Xfer(hndl, xfer_cmd)
lapi_handle_t hndl;
lapi_xfer_t *xfer_cmd;
 

typedef struct {
    uint            src;          /* Target task ID    */
    uint            reason;       /* LAPI return codes */
    ulong           reserve[6];   /* Reserved          */
} lapi_sh_info_t;


typedef void (scompl_hndlr_t)(lapi_handle_t *hndl, void *completion_param,
                              lapi_sh_info_t *info);
 

FORTRAN 구문

include 'lapif.h'
 
LAPI_XFER(hndl, xfer_cmd, ierror)
INTEGER hndl
TYPE (fortran_xfer_type) :: xfer_cmd
INTEGER ierror

설명

Type of call: 지점 간 통신(비차단)

' LAPI_Xfer 서브루틴은 이러한 서브루틴의 기능의 상위 집합을 제공합니다: LAPI_Amsend, ' LAPI_Amsendv' , ' LAPI_Put' , ' LAPI_Putv' , ' LAPI_Get' , ' LAPI_Getv' , ' LAPI_Rmw' . 또한 ' LAPI_Xfer '은 데이터 수집/분산 프로그램(DGSP) 메시지 전송 기능을 제공합니다.

C에서 ' LAPI_Xfer ' 명령은 유니온에 대한 포인터를 전달합니다. 조합의 첫 번째 구성원인 ' Xfer_type'을 검사하여 전송 유형을 결정하고 통과된 조합원을 결정합니다. LAPI_Xfer 식별된 조합원의 모든 필드가 설정될 것으로 예상합니다. 식별된 조합원 외부의 메모리를 검사하거나 수정하지 않습니다. LAPI_Xfer 모든 유니온 멤버(' status 제외)를 읽기 전용 데이터로 취급합니다.

이 서브루틴은 다음과 같은 기능을 제공합니다:
  • 원격 주소 필드는 64비트 주소에 충분한 길이인 ' lapi_long_t' 유형으로 확장됩니다. 이를 통해 32비트 작업에서 64비트 주소로 데이터를 전송할 수 있으며, 이는 클라이언트/서버 프로그램에서 중요할 수 있습니다.
  • LAPI_Xfer 을 사용하면 발신 카운터를 전송 완료 콜백으로 대체할 수 있습니다.
  • LAPI_Xfer '은 LAPI의 데이터 수집/분산 프로그램(DGSP) 인터페이스를 사용하여 데이터를 전송하는 데 사용됩니다.
' lapi_xfer_t ' 구조는 다음과 같이 정의됩니다:
typedef union {
        lapi_xfer_type_t   Xfer_type;
        lapi_get_t         Get;
        lapi_am_t          Am;
        lapi_rmw_t         Rmw;
        lapi_put_t         Put;
        lapi_getv_t        Getv;
        lapi_putv_t        Putv; 
        lapi_amv_t         Amv;
        lapi_amdgsp_t      Dgsp;
} lapi_xfer_t;
' lapi_xfer_t 구조는 ' LAPI_Xfer'의 C 버전에만 적용되지만, 다음 표에는 C 데이터 타입의 FORTRAN 등가물이 포함되어 있습니다.
표 1에는 C의 경우 ' lapi_xfer_type_t ' 구조의 값과 FORTRAN의 경우 명시적 Xfer_type 값이 나열되어 있습니다.
표 1. LAPI_Xfer 구조 유형
Xfer_type (C 또는 FORTRAN)의 값 LAPI_Xfer (C)가 해석한 조합원 Fortran_xfer_type (FORTRAN)의 값
LAPI_AM_XFER lapi_am_t LAPI_AM_T
LAPI_AMV_XFER lapi_amv_t LAPI_AMV_T
LAPI_DGSP_XFER lapi_amdgsp_t LAPI_AMDGSP_T
LAPI_GET_XFER lapi_get_t LAPI_GET_T
LAPI_GETV_XFER lapi_getv_t LAPI_GETV_T
LAPI_PUT_XFER lapi_put_t LAPI_PUT_T
LAPI_PUTV_XFER lapi_putv_t LAPI_PUTV_T
LAPI_RMW_XFER lapi_rmw_t LAPI_RMW_T

lAPI_AM_T 세부 정보

표 2는 ' LAPI_Amsend 서브루틴의 매개변수, C ' lapi_am_t ' 구조의 필드 및 해당 데이터 타입, 그리고 이에 상응하는 FORTRAN 데이터 타입 간의 대응을 보여줍니다. ' lapi_am_t 필드는 ' lapi_xfer_t ' 구조에서 발생하는 순서대로 표 2에 나열되어 있습니다.
표 2. LAPI_Amsend 및 lapi_am_t 등가물
lAPI_AM_T 필드 이름(C) lAPI_AM_T 필드 유형(C) 동등한 FORTRAN 데이터 유형 동등한 LAPI_Amsend 매개변수
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) c에 내재된

fORTRAN의 LAPI_Xfer 값: ' LAPI_AM_XFER'

flags int INTEGER(KIND = 4) 없음

fORTRAN의 LAPI_Xfer 매개 변수: 플래그

tgt uint INTEGER(KIND = 4) tgt
없음 없음 INTEGER(KIND = 4) fORTRAN의 LAPI_Xfer 매개 변수: 패드
hdr_hdl lapi_long_t INTEGER(KIND = 8) hdr_hdl
uhdr_len uint INTEGER(KIND = 4) uhdr_len
없음 없음 INTEGER(KIND = 4) fORTRAN(64비트)의 LAPI_Xfer 매개변수: pad2
uhdr void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
uhdr
udata void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
udata
udata_len ulong
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
udata_len
shdlr scompl_hndlr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
없음

fORTRAN의 LAPI_Xfer 매개 변수: shdlr

sinfo void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
없음

fORTRAN의 LAPI_Xfer 매개 변수: sinfo

tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
org_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
org_cntr
cmpl_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
cmpl_cntr
When the origin data buffer is free to be used, the pointer to the send completion handler (shdlr) is called with the send completion data (sinfo) if shdlr is not a NULL pointer (in C) or LAPI_ADDR_NULL (in FORTRAN). 그렇지 않으면 동작은 ' LAPI_Amsend'의 동작과 동일합니다.

lAPI_AMV_T 세부 정보

표 3은 ' LAPI_Amsendv 서브루틴의 파라미터, C ' lapi_amv_t ' 구조의 필드와 해당 데이터 타입, 그리고 이에 상응하는 FORTRAN 데이터 타입 간의 대응을 보여줍니다. ' lapi_amv_t 필드는 ' lapi_xfer_t ' 구조에서 발생하는 순서대로 표 3에 나열되어 있습니다.
표 3. LAPI_Amsendv 및 lapi_amv_t 등가물
lAPI_AMV_T 필드 이름(C) lAPI_AMV_T 필드 유형(C) 동등한 FORTRAN 데이터 유형 동등한 LAPI_Amsendv 매개변수
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) c에 내재된

fORTRAN의 LAPI_Xfer 값: ' LAPI_AMV_XFER'

flags int INTEGER(KIND = 4) 없음

fORTRAN의 LAPI_Xfer 매개 변수: 플래그

tgt uint INTEGER(KIND = 4) tgt
없음 없음 INTEGER(KIND = 4) fORTRAN의 LAPI_Xfer 매개 변수: 패드
hdr_hdl lapi_long_t INTEGER(KIND = 8) hdr_hdl
uhdr_len uint INTEGER(KIND = 4) uhdr_len
없음 없음 INTEGER(KIND = 4) fORTRAN(64비트)의 LAPI_Xfer 매개변수: pad2
uhdr void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
uhdr
shdlr scompl_hndlr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
없음

fORTRAN의 LAPI_Xfer 매개 변수: shdlr

sinfo void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
없음

fORTRAN의 LAPI_Xfer 매개 변수: sinfo

org_vec lAPI_VEC_T *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
org_vec
없음 없음 INTEGER(KIND = 4) fORTRAN(32비트)의 LAPI_Xfer 매개변수: pad2
tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
org_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
org_cntr
cmpl_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
cmpl_cntr

lAPI_AMDGSS_T 세부 정보

표 4는 C ' lapi_amdgsp_t 구조의 필드와 해당 데이터 유형 간의 대응, ' LAPI_Xfer'에서 사용되는 방식, 그리고 이에 상응하는 FORTRAN 데이터 유형을 보여줍니다. ' lapi_amdgsp_t 필드는 ' lapi_xfer_t ' 구조에서 발생하는 순서대로 표 4에 나열되어 있습니다.
표 4. Lapi_amdgsp_t 필드
lAPI_AMDGSS_T 필드 이름(C) lAPI_AMDSP_T 필드 유형(C) 동등한 FORTRAN 데이터 유형 LAPI_Xfer 사용법
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) LAPI_DGSP_XFER
flags int INTEGER(KIND = 4) 이 필드에서 사용자는 LAPI에 대한 지시문이나 힌트를 지정할 수 있습니다. 지시어나 힌트를 사용하지 않으려면 이 필드를 ' 0'로 설정해야 합니다. 자세한 내용은 lapi_amdgsp_t 플래그 필드를 참조하세요.
tgt uint INTEGER(KIND = 4) 대상 작업
없음 없음 INTEGER(KIND = 4) 패드 (포트란 전용 패딩 정렬)
hdr_hdl lapi_long_t INTEGER(KIND = 8) 대상에서 호출할 헤더 핸들러
uhdr_len uint INTEGER(KIND = 4) 사용자 헤더 길이(프로세서 더블워드 크기의 배수)
없음 없음 INTEGER(KIND = 4) pad2 (64비트 FORTRAN 전용 패딩 정렬)
uhdr void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
사용자 헤더에 대한 포인터
udata void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
사용자 데이터에 대한 포인터
udata_len ulong
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
사용자 데이터 길이
shdlr scompl_hndlr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
보내기 완료 핸들러(선택 사항)
sinfo void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
전송 완료 핸들러에 전달할 데이터 포인터(선택 사항)
tgt_cntr lapi_long_t INTEGER(KIND = 8) 타겟 카운터(선택 사항)
org_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
출발지 카운터(선택 사항)
cmpl_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
완료 카운터(선택 사항)
dgsp lapi_dg_handle_t
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
등록된 DGSP의 핸들
상태 lapi_status_t
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
반환할 상태(향후 사용)
없음 없음 INTEGER(KIND = 4) pad3 (64비트 FORTRAN 전용 패딩 정렬)

원본 데이터 버퍼를 자유롭게 수정할 수 있는 경우, 전송 완료 핸들러(shdlr)가 전송 완료 데이터(sinfo)와 함께 호출됩니다( shdlr이 NULL 포인터(C의 경우) 또는 ' LAPI_ADDR_NULL '(FORTRAN의 경우)이 아닌 경우).

자세한 내용은 분산 측 DGSP 처리를 위한 lapi_am_dgsp_t 사용을 참조하세요.

Lapi_amdgsp_t 플래그 필드

' | '(비트 또는) 연산자를 사용하여 하나 이상의 플래그를 설정할 수 있습니다. 사용자 지시어는 항상 준수해야 하며 잘못 사용하면 잘못된 결과를 초래할 수 있습니다. 적절한 힌트를 제공하면 성능이 향상될 수 있지만 LAPI에서 무시될 수 있습니다. 부적절한 힌트는 성능을 저하시킬 수 있지만 잘못된 결과를 초래하지는 않습니다.

다음 지시어 플래그가 정의되어 있습니다:
Use_tgt_vec_type
LAPI가 대상 벡터의 벡터 유형(tgt_vec)을 사용하도록 지시합니다. 즉, tgt_vec은 ' lapi_vec_t 유형으로 해석되어야 하며, 그렇지 않으면 ' lapi_lvec_t' 유형으로 해석됩니다. ' lapi_lvec_t ' 유형은 ' lapi_long_t 를 사용합니다. ' lapi_vec_t 유형은 ' void * ' 또는 ' long'을 사용합니다. 한 유형을 다른 유형 대신 사용하면 잘못된 결과가 발생합니다.
Buffer_both_contiguous
전송할 모든 데이터를 연속된 데이터로 처리하여 성능을 개선할 수 있도록 LAPI에 지시합니다. 비연속 데이터가 전송될 때 이 플래그를 설정하면 데이터가 손상될 가능성이 높습니다.
다음과 같은 힌트 플래그가 정의되어 있습니다:
LAPI_NOT_USE_BULK_XER
작업에 대한 현재 설정과 관계없이 LAPI가 대량 전송을 사용하지 않도록 지시합니다.
LAPI_USE_BULK_XER
작업에 대한 현재 설정과 관계없이 LAPI가 대량 전송을 사용하도록 지시합니다.
이 힌트 플래그 중 어느 것도 설정되어 있지 않으면 LAPI는 작업에 대해 정의된 동작을 사용합니다. 이 두 힌트 플래그가 모두 설정되어 있으면 ' LAPI_NOT_USE_BULK_XFER '이 우선합니다.

이러한 힌트는 커뮤니케이션 라이브러리에 의해 반영될 수도 있고 반영되지 않을 수도 있습니다.

분산 측 DGSP 처리를 위해 lapi_am_dgsp_t 사용

LAPI는 ' lapi_return_info_t 데이터 유형을 사용하여 헤더 핸들러에서 추가 정보를 반환할 수 있습니다. ' lapi_return_info_t'에 대한 자세한 내용은 AIX 5L용 RSCT: LAPI 프로그래밍 가이드를 참조하세요. 전송 유형이 ' lapi_am_dgsp_t'인 경우, 이 메커니즘을 사용하여 수신 측에 데이터를 분산하기 위해 사용자 DGSP를 실행하도록 LAPI에 지시할 수 있습니다.

이 메커니즘을 사용하려면 사용자 헤더 핸들러의 msg_len 멤버를 통해 ' lapi_return_info_t * 포인터를 LAPI에 다시 전달하세요. 전달된 구조체의 dgsp_handle 멤버는 수신 측에 등록된 DGSP 설명을 가리켜야 합니다. DGSP 빌드 및 등록에 대한 자세한 내용은 ' LAPI_Util ' 및 AIX 5L용 RSCT: LAPI 프로그래밍 가이드를 참조하세요.

lAPI_GET_T 세부 정보

표 5는 ' LAPI_Get 서브루틴의 파라미터, C ' lapi_get_t ' 구조의 필드 및 해당 데이터 타입, 그리고 이에 상응하는 FORTRAN 데이터 타입 간의 대응을 보여줍니다. ' lapi_get_t 필드는 ' lapi_xfer_t ' 구조에서 발생하는 순서대로 표 5에 나열되어 있습니다.
표 5. LAPI_Get 및 lapi_get_t 등가물
lapi_get_t 필드 이름(C) lapi_get_t 필드 유형(C) 동등한 FORTRAN 데이터 유형 동등한 LAPI_Get 매개변수
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) c에 내재된

fORTRAN의 LAPI_Xfer 값: ' LAPI_GET_XFER'

flags int INTEGER(KIND = 4) 없음

fORTRAN의 LAPI_Xfer 매개 변수: 플래그

tgt uint INTEGER(KIND = 4) tgt
없음 없음 INTEGER(KIND = 4) fORTRAN의 LAPI_Xfer 매개 변수: 패드
tgt_addr lapi_long_t INTEGER(KIND = 8) tgt_addr
org_addr void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
org_addr
len ulong
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
len
tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
org_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
org_cntr
chndlr compl_hndlr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
없음

fORTRAN의 LAPI_Xfer 매개 변수: chndlr

cinfo void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
없음

fORTRAN의 LAPI_Xfer 매개변수: cinfo

원본 데이터 버퍼가 완전히 도착하면 완료 핸들러(chndlr)에 대한 포인터가 완료 데이터(cinfo)와 함께 호출됩니다( chndlr이 NULL 포인터(C의 경우) 또는 ' LAPI_ADDR_NULL '(FORTRAN의 경우)이 아닌 경우). 그렇지 않으면 동작은 ' LAPI_Get'의 동작과 동일합니다.

lAPI_GETV_T 세부 정보

표 6은 ' LAPI_Getv 서브루틴의 파라미터, C ' lapi_getv_t ' 구조의 필드와 해당 데이터 타입, 그리고 이에 상응하는 FORTRAN 데이터 타입 간의 대응을 보여줍니다. ' lapi_getv_t 필드는 ' lapi_xfer_t ' 구조에서 발생하는 순서대로 표 5에 나열되어 있습니다.
표 6. LAPI_Getv 및 lapi_getv_t 등가물
lapi_getv_t 필드 이름(C) lapi_getv_t 필드 유형(C) 동등한 FORTRAN 데이터 유형 동등한 LAPI_Getv 매개변수
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) c에 내재된

fORTRAN의 LAPI_Xfer 값: ' LAPI_GETV_XFER'

flags int INTEGER(KIND = 4) 없음

fORTRAN의 LAPI_Xfer 매개 변수: 플래그

tgt uint INTEGER(KIND = 4) tgt
없음 없음 INTEGER(KIND = 4) fORTRAN(64비트)의 LAPI_Xfer 매개변수: pad
org_vec lapi_vec_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
org_vec
tgt_vec void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
tgt_vec
없음 없음 INTEGER(KIND = 4) fORTRAN(32비트)의 LAPI_Xfer 매개변수: pad
tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
org_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
org_cntr
chndlr compl_hndlr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
없음

fORTRAN의 LAPI_Xfer 매개 변수: chndlr

cinfo void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
없음

fORTRAN의 LAPI_Xfer 매개변수: cinfo

없음 없음 INTEGER(KIND = 4) fORTRAN(32비트)의 LAPI_Xfer 매개변수: pad2
' flags 필드는 ' tgt_vec '을 ' lapi_vec_t' 유형으로 해석해야 함을 나타내는 ' USE_TGT_VEC_TYPE '( lapi_amdgsp_t 플래그 필드 참조)를 허용하며, 그렇지 않으면 ' lapi_lvec_t' 유형으로 해석됩니다. ' LAPI_Getv 호출에서 해당 필드는 ' lapi_vec_t '입니다.

원본 데이터 버퍼가 완전히 도착하면 완료 핸들러에 대한 포인터(chndlr)가 ' chndlr '(C의 경우)나 ' LAPI_ADDR_NULL '(FORTRAN의 경우)가 NULL 포인터가 아닌 경우 완료 데이터(cinfo' )와 함께 호출됩니다. 그렇지 않으면 동작은 ' LAPI_Getv'의 동작과 동일합니다.

lAPI_PUT_T 세부 정보

표 7은 ' LAPI_Put 서브루틴의 파라미터, C ' lapi_put_t ' 구조의 필드와 해당 데이터 타입, 그리고 이에 상응하는 FORTRAN 데이터 타입 간의 대응을 보여줍니다. ' lapi_put_t 필드는 ' lapi_xfer_t ' 구조에서 발생하는 순서대로 표 7에 나열되어 있습니다.
표 7. LAPI_Put 및 lapi_put_t 등가물
lapi_put_t 필드 이름(C) lapi_put_t 필드 유형(C) 동등한 FORTRAN 데이터 유형 동등한 LAPI_Put 매개변수
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) c에 내재된

fORTRAN의 LAPI_Xfer 값: ' LAPI_PUT_XFER'

flags int INTEGER(KIND = 4) 없음

fORTRAN의 LAPI_Xfer 매개 변수: 플래그

tgt uint INTEGER(KIND = 4) tgt
없음 없음 INTEGER(KIND = 4) fORTRAN의 LAPI_Xfer 매개 변수: 패드
tgt_addr lapi_long_t INTEGER(KIND = 8) tgt_addr
org_addr void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
org_addr
len ulong
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
len
shdlr scompl_hndlr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
없음

fORTRAN의 LAPI_Xfer 매개 변수: shdlr

sinfo void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
없음

fORTRAN의 LAPI_Xfer 매개 변수: sinfo

tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
org_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
org_cntr
cmpl_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
cmpl_cntr
원본 데이터 버퍼를 사용할 수 있는 여유가 있는 경우, 전송 완료 핸들러(shdlr)에 대한 포인터가 전송 완료 데이터(sinfo)와 함께 호출됩니다( shdlr이 NULL 포인터(C의 경우) 또는 ' LAPI_ADDR_NULL '(FORTRAN의 경우)이 아닌 경우). 그렇지 않으면 동작은 ' LAPI_Put'의 동작과 동일합니다.

lAPI_PTV_T 세부 정보

표 8은 ' LAPI_Putv 서브루틴의 파라미터, C ' lapi_putv_t ' 구조의 필드와 해당 데이터 타입, 그리고 이에 상응하는 FORTRAN 데이터 타입 간의 대응을 보여줍니다. ' lapi_putv_t 필드는 ' lapi_xfer_t ' 구조에서 발생하는 순서대로 표 7에 나열되어 있습니다.
표 8. LAPI_Putv 및 lapi_putv_t 등가물
lapi_putv_t 필드 이름(C) lapi_putv_t 필드 유형(C) 동등한 FORTRAN 데이터 유형 동등한 LAPI_Putv 매개변수
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) c에 내재된

fORTRAN의 LAPI_Xfer 값: ' LAPI_PUT_XFER'

flags int INTEGER(KIND = 4) 없음

fORTRAN의 LAPI_Xfer 매개 변수: 플래그

tgt uint INTEGER(KIND = 4) tgt
없음 없음 INTEGER(KIND = 4) fORTRAN(64비트)의 LAPI_Xfer 매개변수: pad
shdlr scompl_hndlr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
없음

fORTRAN의 LAPI_Xfer 매개 변수: shdlr

sinfo void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
없음

fORTRAN의 LAPI_Xfer 매개 변수: sinfo

org_vec lapi_vec_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
org_vec
tgt_vec void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
tgt_vec
없음 없음 INTEGER(KIND = 4) fORTRAN(32비트)의 LAPI_Xfer 매개변수: pad
tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
org_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
org_cntr
cmpl_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
cmpl_cntr
' flags 필드는 ' tgt_vec '을 ' lapi_vec_t'로 해석할 것을 나타내는 ' USE_TGT_VEC_TYPE '( lapi_amdgsp_t 플래그 필드 참조)를 허용하며, 그렇지 않으면 ' lapi_lvec_t'로 해석됩니다. ' LAPI_Putv 호출에서 해당 필드는 ' lapi_vec_t '입니다.

원본 데이터 버퍼를 자유롭게 수정할 수 있는 경우, 전송 완료 처리기에 대한 포인터(shdlr)가 전송 완료 데이터(sinfo' )와 함께 호출되며, ' shdlr '이 NULL 포인터(C의 경우) 또는 ' LAPI_ADDR_NULL '(FORTRAN의 경우)가 아닌 경우 전송 완료 처리기에 대한 포인터가 호출됩니다. 그렇지 않으면 동작은 ' LAPI_Putv'의 동작과 동일합니다.

lAPI_RMW_T 세부 정보

표 9는 ' LAPI_Rmw 서브루틴의 파라미터, C ' lapi_rmw_t ' 구조의 필드와 해당 데이터 타입, 그리고 이에 상응하는 FORTRAN 데이터 타입 간의 대응을 보여줍니다. ' lapi_rmw_t 필드는 ' lapi_xfer_t ' 구조에서 발생하는 순서대로 표 7에 나열되어 있습니다.
표 9. LAPI_Rmw 및 lapi_rmw_t 등가물
lAPI_RMW_T 필드 이름(C) lAPI_RMW_T 필드 유형(C) 동등한 FORTRAN 데이터 유형 동등한 LAPI_Rmw 매개변수
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) c에 내재된

fORTRAN의 LAPI_Xfer 값: ' LAPI_RMW_XFER'

op Rmw_ops_t INTEGER(KIND = 4) op
tgt uint INTEGER(KIND = 4) tgt
크기 uint INTEGER(KIND = 4) c에 내재된

fORTRAN의 LAPI_Xfer 매개변수: 크기 (' 32 ' 또는 ' 64'여야 함)

tgt_var lapi_long_t INTEGER(KIND = 8) tgt_var
in_val void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
in_val
prev_tgt_val void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
prev_tgt_val
org_cntr lapi_cntr t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
org_cntr
shdlr scompl_hndlr_t *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
없음

fORTRAN의 LAPI_Xfer 매개 변수: shdlr

sinfo void *
INTEGER(KIND = 4) (32비트)
' INTEGER(KIND = 8) '(64비트)
없음

fORTRAN의 LAPI_Xfer 매개 변수: shdlr

없음 없음 INTEGER(KIND = 4) fORTRAN(32비트)의 LAPI_Xfer 매개변수: pad
원본 데이터 버퍼를 사용할 수 있는 여유가 있는 경우, 전송 완료 핸들러(shdlr)에 대한 포인터가 전송 완료 데이터(sinfo)와 함께 호출됩니다( shdlr이 NULL 포인터(C의 경우) 또는 ' LAPI_ADDR_NULL '(FORTRAN의 경우)이 아닌 경우). 크기 값은 ' 32 ' 또는 ' 64'여야 하며, 이는 in_valprev_tgt_val 필드가 각각 32비트 또는 64비트 수량을 가리키도록 할지를 나타냅니다. 그렇지 않으면 동작은 ' LAPI_Rmw'의 동작과 동일합니다.

매개변수

입력
hndl
LAPI 핸들을 지정합니다.
xfer_cmd
데이터 전송 함수의 이름과 매개변수를 지정합니다.
OUTPUT
ierror
FORTRAN 반환 코드를 지정합니다. 이 매개변수는 항상 마지막 매개변수입니다.

리턴 값

LAPI_SUCCESS
함수 호출이 성공적으로 완료되었음을 나타냅니다.
LAPI_ERR_DATA_LEN
Udata_len 또는 len의 값이 LAPI 상수 ' LAPI_MAX_MSG_SZ'의 값보다 크다는 것을 나타냅니다.
LAPI_ERR_DGSP
전달된 DGSP가 NULL(C에서는) 또는 ' LAPI_ADDR_NULL '(FORTRAN에서는)이거나 등록된 DGSP가 아님을 나타냅니다.
LAPI_ERR_DGSP_ATOM
DGSP에 ' 0 '보다 작거나 MAX_ATOM_SIZE보다atom_size가 있음을 나타냅니다.
LAPI_ERR_DGSP_Branch
DGSP가 코드 배열을 벗어난 브랜치를 시도했음을 나타냅니다.
LAPI_ERR_DGSP_CTL
유효하지 않은 컨텍스트(예: 수집 시 원자 크기가 ' 0 '인 수집 측 제어 또는 분산 측 제어)에서 DGSP 제어 명령이 발생했음을 나타냅니다.
LAPI_ERR_DGSP_OPC
DGSP 연산 코드가 유효하지 않음을 나타냅니다.
LAPI_ERR_DGSP_STACK
DGSP가 할당된 스택 지원보다 더 큰 GOSUB 깊이를 가짐을 나타냅니다. 스택 할당은 dgsp->depth 멤버에 의해 지정됩니다.
LAPI_ERR_HDR_HNDLR_NULL
전달된 hdr_hdl이 NULL(C에서는) 또는 ' LAPI_ADDR_NULL '(FORTRAN에서는)임을 나타냅니다.
LAPI_ERR_HNDL_INVALID
전달된 hndl이 유효하지 않음을 나타냅니다(초기화되지 않았거나 종료된 상태).
LAPI_ERR_IN_VAL_NULL
In_val 포인터가 NULL(C에서는) 또는 ' LAPI_ADDR_NULL '(FORTRAN에서는)임을 나타냅니다.
LAPI_ERR_MEMORY_EXPIRED
LAPI가 시스템에서 메모리를 가져올 수 없습니다.
LAPI_ERR_OP_SZ
' lapi_rmw_t 크기 필드가 ' 32 ' 또는 ' 64'으로 설정되지 않았음을 나타냅니다.
LAPI_ERR_ORG_ADDR_NULL
전달된 udata 파라미터가 NULL(C에서는) 또는 ' LAPI_ADDR_NULL '(FORTRAN에서는)이고 udata_len이 ' 0 보다 크거나, 전달된 org_addr이 NULL(C에서는) 또는 ' LAPI_ADDR_NULL '(FORTRAN에서는)이고 len이 ' 0' 보다 크다는 것을 나타냅니다.

Note: '이 ' Xfer_type '=' LAPI_DGSP_XFER인 경우, ' udata '가 NULL(C) 또는 ' LAPI_ADDR_NULL '(FORTRAN)이고 ' udata_len '이 ' 0 '보다 큰 경우는 유효하므로 오류가 반환되지 않습니다.

LAPI_ERR_ORG_EXTENT
Org_vec의 범위(보폭 * num_vecs)가 LAPI 상수 ' LAPI_MAX_MSG_SZ의 값보다 크다는 것을 나타냅니다.
LAPI_ERR_ORG_STRIDE
Org_vec 보폭이 블록보다 작음을 나타냅니다.
LAPI_ERR_ORG_VEC_ADDR
' org_vec->정보[i] '가 NULL(C에서는) 또는 ' LAPI_ADDR_NULL '(FORTRAN에서는)이지만 그 길이(org_vec->len[i]' )가 ' 0'이 아닌 것을 나타냅니다.
LAPI_ERR_ORG_VEC_LEN
Org_vec->len의 합이 LAPI 상수 ' LAPI_MAX_MSG_SZ'의 값보다 크다는 것을 나타냅니다.
LAPI_ERR_ORG_VEC_NULL
Org_vec 값이 NULL(C의 경우) 또는 ' LAPI_ADDR_NULL '(FORTRAN의 경우)임을 나타냅니다.
LAPI_ERR_ORG_VEC_TYPE
' org_vec->vec_type '가 유효하지 않음을 나타냅니다.
LAPI_ERR_RMW_OP
연산이 유효하지 않음을 나타냅니다.
LAPI_ERR_STRIDE_ORG_VEC_ADDR_NULL
스트라이딩 벡터 주소 ' org_vec' ->정보[0]이 NULL(C에서는) 또는 ' LAPI_ADDR_NULL '(FORTRAN에서는)임을 나타냅니다.
LAPI_ERR_STRIDE_TGT_VEC_ADDR_NULL
스트라이딩 벡터 주소 ' tgt_vec' ->정보[0]이 NULL(C에서는) 또는 ' LAPI_ADDR_NULL '(FORTRAN에서는)임을 나타냅니다.
LAPI_ERR_TGT
전달된 tgt가 작업에 정의된 작업 범위를 벗어났음을 나타냅니다.
LAPI_ERR_TGT_ADDR_NULL
Ret_addr이 NULL(C의 경우) 또는 ' LAPI_ADDR_NULL '(FORTRAN의 경우)임을 나타냅니다.
LAPI_ERR_TGT_EXTENT
Tgt_vec의 범위(보폭 * num_vecs)가 LAPI 상수 ' LAPI_MAX_MSG_SZ의 값보다 크다는 것을 나타냅니다.
LAPI_ERR_TGT_PURGED
' LAPI_Purge_totask() '이 호출되어 서브루틴이 일찍 반환되었음을 나타냅니다.
LAPI_ERR_TGT_STRIDE
Tgt_vec 보폭이 블록보다 작음을 나타냅니다.
LAPI_ERR_TGT_VAR_NULL
Tgt_var 주소가 NULL(C에서는)이거나 tgt_var 값이 ' LAPI_ADDR_NULL '(FORTRAN에서는)임을 나타냅니다.
LAPI_ERR_TGT_VEC_ADDR
' tgt_vec' ->정보' [i]가 NULL(C에서는) 또는 ' LAPI_ADDR_NULL '(FORTRAN에서는)이지만 그 길이(tgt_vec->len[i])가 ' 0'이 아님을 나타냅니다.
LAPI_ERR_TGT_VEC_LEN
' tgt_vec->len '의 합이 LAPI 상수 ' LAPI_MAX_MSG_SZ'의 값보다 크다는 것을 나타냅니다.
LAPI_ERR_TGT_VEC_NULL
Tgt_vec이 NULL(C의 경우) 또는 ' LAPI_ADDR_NULL '(FORTRAN의 경우)임을 나타냅니다.
LAPI_ERR_TGT_VEC_TYPE
' tgt_vec->vec_type '가 유효하지 않음을 나타냅니다.
LAPI_ERR_UHDR_LEN
전달된 uhdr_len 값이 MAX_UHDR_SZ보다 크거나 프로세서 더블워드 크기의 배수가 아님을 나타냅니다.
LAPI_ERR_UHDR_NULL
전달된 uhdr이 NULL(C에서는) 또는 ' LAPI_ADDR_NULL '(FORTRAN에서는)이지만 uhdr_len이 ' 0'가 아님을 나타냅니다.
LAPI_ERR_VEC_LEN_DIFF
Org_vec과 tgt_vec의 길이가 다르다는 것을 나타냅니다(len[ ]).
LAPI_ERR_VEC_NUM_DIFF
Org_vec과 tgt_vec의 num_vec이 다르다는 것을 나타냅니다.
LAPI_ERR_VEC_TYPE_DIFF
Org_vec과 tgt_vec이 서로 다른 벡터 유형(vec_type)을 가짐을 나타냅니다.
LAPI_ERR_XER_CMD
Xfer_cmd가 유효하지 않음을 나타냅니다.

C 예제

  1. ' LAPI_Xfer ' 인터페이스를 사용하여 ' LAPI_Get '에 표시된 샘플 코드를 실행합니다:
    {
    
          lapi_xfer_t xfer_struct;
    
          /* initialize the table buffer for the data addresses */
       
          /* get remote data buffer addresses */
          LAPI_Address_init(hndl,(void *)data_buffer,data_buffer_list);
          .    
          . 
          .
          /* retrieve data_len bytes from address data_buffer_list[tgt] on */
          /* task tgt. write the data starting at address data_buffer.     */
          /* tgt_cntr and org_cntr can be NULL.                            */ 
    
          xfer_struct.Get.Xfer_type = LAPI_GET_XFER;
          xfer_struct.Get.flags = 0;
          xfer_struct.Get.tgt = tgt;
          xfer_struct.Get.tgt_addr = data_buffer_list[tgt];
          xfer_struct.Get.org_addr = data_buffer;
          xfer_struct.Get.len = data_len;
          xfer_struct.Get.tgt_cntr = tgt_cntr;
          xfer_struct.Get.org_cntr = org_cntr;
        
          LAPI_Xfer(hndl, &xfer_struct);  
    
    }
  2. ' LAPI_Xfer ' 인터페이스를 사용하여 ' LAPI_Amsendv '에서 ' LAPI_STRIDED_VECTOR ' 예제를 구현합니다:
    
    {
        lapi_xfer_t   xfer_struct;                        /* info for LAPI_Xfer call */
        lapi_vec_t    vec;                                /* data for data transfer  */
        .
        .
        .
        vec->num_vecs = NUM_VECS;        /* NUM_VECS = number of vectors to transfer */ 
                                         /* must match that of the target vector     */
        vec->vec_type = LAPI_GEN_STRIDED_XFER;              /* same as target vector */
    
       
        vec->info[0]  = buffer_address;    /* starting address for data copy         */
        vec->info[1]  = block_size;        /* bytes of data to copy                  */
        vec->info[2]  = stride;            /* distance from copy block to copy block */
        /* data will be copied as follows:                                           */
        /* block_size bytes will be copied from buffer_address                       */
        /* block_size bytes will be copied from buffer_address+stride                */
        /* block_size bytes will be copied from buffer_address+(2*stride)            */
        /* block_size bytes will be copied from buffer_address+(3*stride)            */
        .
        .
        .
        /* block_size bytes will be copied from buffer_address+((NUM_VECS-1)*stride) */
        .
        .
        .
        xfer_struct.Amv.Xfer_type = LAPI_AMV_XFER;
        xfer_struct.Amv.flags     = 0;
        xfer_struct.Amv.tgt       = tgt;
        xfer_struct.Amv.hdr_hdl   = hdr_hdl_list[tgt];
        xfer_struct.Amv.uhdr_len  = uhdr_len;  /* user header length */
        xfer_struct.Amv.uhdr      = uhdr;
    
    
        /* LAPI_AMV_XFER allows the use of a send completion handler */
        /* If non-null, the shdlr function is invoked at the point   */
        /* the origin counter would increment.  Note that both the   */
        /* org_cntr and shdlr can be used.                           */
        /* The user's shdlr must be of type scompl_hndlr_t *.        */
        /* scompl_hndlr_t is defined in /usr/include/lapi.h          */
        xfer_struct.shdlr = shdlr; 
    
        /* Use sinfo to pass user-defined data into the send         */
        /* completion handler, if desired.                           */
        xfer_struct.sinfo     = sinfo;       /* send completion data */
        
        xfer_struct.org_vec   = vec;
        xfer_struct.tgt_cntr  = tgt_cntr;
        xfer_struct.org_cntr  = org_cntr;
        xfer_struct.cmpl_cntr = cmpl_cntr;
    
    
        LAPI_Xfer(hndl, &xfer_struct);
        .
        .
        .
    }
    
헤더 핸들러 정의에 대한 자세한 내용은 ' LAPI_Amsendv 하위 루틴을 참조하세요.

위치

/usr/lib/liblapi_r.a