LAPI_Putv 서브루틴
용도
로컬 작업에서 원격 작업으로 데이터 벡터를 전송합니다.
라이브러리
가용성 라이브러리 (liblapi_r.a)
C 구문
#include <lapi.h>
int LAPI_Putv(hndl, tgt, tgt_vec, org_vec, tgt_cntr, org_cntr, cmpl_cntr)
lapi_handle_t hndl;
uint tgt;
lapi_vec_t *tgt_vec;
lapi_vec_t *org_vec;
lapi_cntr_t *tgt_cntr;
lapi_cntr_t *org_cntr;
lapi_cntr_t *cmpl_cntr;
typedef struct {
lapi_vectype_t vec_type; /* operation code */
uint num_vecs; /* number of vectors */
void **info; /* vector of information */
ulong *len; /* vector of lengths */
} lapi_vec_t;FORTRAN 구문
include 'lapif.h'
LAPI_PUTV(hndl, tgt, tgt_vec, org_vec, tgt_cntr, org_cntr , cmpl_cntr, ierror)
INTEGER hndl
INTEGER tgt
INTEGER (KIND=LAPI_ADDR_TYPE) :: tgt_vec
TYPE (LAPI_VEC_T) :: org_vec
INTEGER (KIND=LAPI_ADDR_TYPE) :: tgt_cntr
TYPE (LAPI_CNTR_T) :: org_cntr
TYPE (LAPI_CNTR_T) :: cmpl_cntr
INTEGER ierror32비트 버전의 ' LAPI_VEC_T ' 유형은 다음과 같이 정의됩니다:TYPE LAPI_VEC_T
SEQUENCE
INTEGER(KIND = 4) :: vec_type
INTEGER(KIND = 4) :: num_vecs
INTEGER(KIND = 4) :: info
INTEGER(KIND = 4) :: len
END TYPE LAPI_VEC_T64비트 버전의 ' LAPI_VEC_T ' 유형은 다음과 같이 정의됩니다:TYPE LAPI_VEC_T
SEQUENCE
INTEGER(KIND = 4) :: vec_type
INTEGER(KIND = 4) :: num_vecs
INTEGER(KIND = 8) :: info
INTEGER(KIND = 8) :: len
END TYPE LAPI_VEC_T설명
Type of call: 지점 간 통신(비차단)
LAPI_Putv '은 ' LAPI_Put ' 호출의 벡터 버전입니다. 이 서브루틴을 사용하여 원본 작업에서 대상 작업으로 데이터 벡터를 전송합니다. 원본 벡터 설명과 대상 벡터 설명은 원본 작업의 주소 공간에 있습니다. 그러나 대상 벡터의 정보 배열에 지정된 값은 대상 작업의 주소 공간에 있는 주소여야 합니다.
호출 프로그램은 원본 버퍼가 변경될 수 있거나 대상 작업의 대상 버퍼의 내용이 함수 반환 시 사용할 준비가 되었다고 가정할 수 없습니다. 오리진 카운터(org_cntr)가 증가하면 오리진 작업으로 오리진 버퍼를 수정할 수 있습니다. 타겟 카운터(tgt_cntr)가 증가하면 타겟 작업에 의해 타겟 버퍼를 수정할 수 있습니다. 완료 카운터(cmpl_cntr)를 제공하면 목표 카운터(tgt_cntr)가 목표에서 증분된 후 원점에서 카운터가 증분됩니다. 카운터 또는 카운터 주소의 값이 NULL(C) 또는 ' LAPI_ADDR_NULL '(FORTRAN)인 경우 데이터 전송은 발생하지만 해당 카운터 증분은 발생하지 않습니다.
보폭 벡터를 전송하는 경우 각 블록의 크기는 바이트 단위의 보폭 크기보다 크지 않아야 합니다.
Org_vec이 가리키는 모든 벡터의 길이는 tgt_vec이 가리키는 해당 벡터의 길이와 같아야 합니다.
LAPI는 오리진 또는 타겟에서 벡터 간에 겹치는 영역이 있는지 확인하지 않습니다. 대상 측에 겹치는 영역이 있는 경우, 작업 후 대상 버퍼의 내용이 정의되지 않습니다.
다양한 벡터 유형 사용에 대한 자세한 내용은 ' LAPI_Amsendv '을 참조하세요. (LAPI_Putv '는 ' LAPI_GEN_GENERIC 유형을 지원하지 않습니다.)
매개변수
- 입력
- hndl
- LAPI 핸들을 지정합니다.
- tgt
- 대상 작업의 작업 ID를 지정합니다. 이 매개변수의 값은 0 <= tgt < NUM_TASKS 범위에 있어야 합니다.
- tgt_vec
- 대상 벡터 설명을 가리킵니다.
- org_vec
- 원점 벡터 설명을 가리킵니다.
- 입/출력
- tgt_cntr
- 대상 카운터 주소를 지정합니다. 메시지 완료 시 대상 카운터가 증가합니다. 이 매개변수가 NULL(C의 경우) 또는 ' LAPI_ADDR_NULL '(FORTRAN의 경우)이면 대상 카운터가 업데이트되지 않습니다.
- org_cntr
- 원본 카운터 주소(C) 또는 원본 카운터(FORTRAN)를 지정합니다. 원본 카운터는 버퍼 가용성에 따라 증가합니다. 이 매개변수가 NULL(C의 경우) 또는 ' LAPI_ADDR_NULL '(FORTRAN의 경우)이면 원점 카운터가 업데이트되지 않습니다.
- cmpl_cntr
- 완료 카운터 주소(C) 또는 완료 카운터(FORTRAN)를 반영하는 완료 카운터( tgt_cntr)를 지정합니다. 완료 카운터는 tgt_cntr이 증가된 후 원점에서 증가됩니다. 이 매개변수가 NULL(C의 경우) 또는 ' LAPI_ADDR_NULL '(FORTRAN의 경우)이면 완료 카운터가 업데이트되지 않습니다.
- OUTPUT
- ierror
- FORTRAN 반환 코드를 지정합니다. 이 매개변수는 항상 마지막 매개변수입니다.
C 예제
{
/* retrieve a remote data buffer address for data to transfer, */
/* such as through LAPI_Address_init */
/* task that calls LAPI_Putv sets up both org_vec and tgt_vec */
org_vec->num_vecs = NUM_VECS;
org_vec->vec_type = LAPI_GEN_IOVECTOR;
org_vec->len = (unsigned long *)
malloc(NUM_VECS*sizeof(unsigned long));
org_vec->info = (void **) malloc(NUM_VECS*sizeof(void *));
/* each org_vec->info[i] gets a base address on the origin task */
/* each org_vec->len[i] gets the number of bytes to transfer */
/* from org_vec->info[i] */
tgt_vec->num_vecs = NUM_VECS;
tgt_vec->vec_type = LAPI_GEN_IOVECTOR;
tgt_vec->len = (unsigned long *)
malloc(NUM_VECS*sizeof(unsigned long));
tgt_vec->info = (void **) malloc(NUM_VECS*sizeof(void *));
/* each tgt_vec->info[i] gets a base address on the target task */
/* each tgt_vec->len[i] gets the number of bytes to write to vec->info[i] */
/* For LAPI_GEN_IOVECTOR, num_vecs, vec_type, and len must be the same */
LAPI_Putv(hndl, tgt, tgt_vec, org_vec, tgt_cntr, org_cntr, compl_cntr);
/* tgt_cntr, org_cntr and compl_cntr can all be NULL */
/* data will be transferred as follows: */
/* org_vec->len[0] bytes will be retrieved from */
/* org_vec->info[0] and written to tgt_vec->info[0] */
/* org_vec->len[1] bytes will be retrieved from */
/* org_vec->info[1] and written to tgt_vec->info[1] */
.
.
.
/* org_vec->len[NUM_VECS-1] bytes will be retrieved */
/* from org_vec->info[NUM_VECS-1] and written to */
/* tgt_vec->info[NUM_VECS-1] */
}
다른 벡터 유형에 대한 정보는 ' LAPI_Amsendv '의 예시를 참조하세요.리턴 값
- LAPI_SUCCESS
- 함수 호출이 성공적으로 완료되었음을 나타냅니다.
- LAPI_ERR_HNDL_INVALID
- 전달된 hndl이 유효하지 않음을 나타냅니다(초기화되지 않았거나 종료된 상태).
- 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_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_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_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_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)을 가짐을 나타냅니다.
위치
- /usr/lib/liblapi_r.a