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 ierror
32비트 버전의 ' 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_T
64비트 버전의 ' 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 예제

LAPI_GEN_IOVECTOR를 넣으려면:
{
      
      /* 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