Subrotina LAPI_Xfer

Propósito

Serve como uma função de wrapper para funções de transferência de dados LAPI.

Biblioteca

Biblioteca de Disponibilidade (liblapi_r.a)

Sintaxe 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);
 

Sintaxe FORTRAN

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

Descrição

Type of call: comunicação ponto-a-ponto (sem bloqueio)

O subroutine LAPI_Xfer fornece um superconjunto da funcionalidade dessas subroutines: LAPI_Amsend, LAPI_Amsendv, LAPI_Put, LAPI_Putv, LAPI_Get, LAPI_Getve LAPI_Rmw. Além disso, LAPI_Xfer fornece transferência de mensagens de coleta de dados / programa de dispersão de dados (DGSP).

Em C, o comando LAPI_Xfer é passado um ponteiro para um sindicato. Ele examina o primeiro membro do sindicato, Xfer_type, para determinar o tipo de transferência, e para determinar qual membro do sindicato foi passado. LAPI_Xfer espera que cada campo do membro do sindicato identificado seja configurado. Ele não examia ou modifica qualquer memória fora do membro do sindicato identificado. LAPI_Xfer trata todos os membros do sindicato (exceto status) como dados de leitura.

Esta subroutine fornece as seguintes funções:
  • Os campos de endereço remoto são expandidos para serem do tipo lapi_long_t, o que é longo o suficiente para um endereço de 64-bit bits. Isso permite que uma tarefa de 32-bit envie dados para 64-bit endereços, o que pode ser importante em programas cliente / servidor.
  • LAPI_Xfer permite que o contador de origem seja substituído por um callback de conclusão de envio.
  • LAPI_Xfer é usado para transferir dados usando a interface de coleta / dispersão de dados da LAPI (DGSP).
A estrutura lapi_xfer_t é definida como:
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;
Apesar de a estrutura lapi_xfer_t se aplicar apenas à versão C de LAPI_Xfer, as tabelas a seguir incluem os equivalentes FORTRAN dos datatipos C.
Tabela 1 listar os valores da estrutura lapi_xfer_type_t para C e os valores explícitos Xfer_type para FORTRAN.
Tabela 1. Tipos de estrutura LAPI_Xfer
Valor de Xfer_type (C ou FORTRAN) Membro do sindicato como interpretado por LAPI_Xfer (C) Valor de 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

detalhes lapi_am_t

Tabela 2 mostra a correspondência entre os parâmetros da subroutina LAPI_Amsend , os campos da estrutura C lapi_am_t e seus datatipos, e os datatipos FORTRAN equivalentes. Os campos lapi_am_t estão listados em Tabela 2 na ordem em que eles ocorrem na estrutura lapi_xfer_t .
Tabela 2. Equivalências LAPI_Amsend e lapi_am_t
nome do campo lapi_am_t (C) tipo de campo lapi_am_t (C) Tipo de datatipo FORTRAN equivalente Parâmetro LAPI_Amsend equivalente
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) implícito em C

LAPI_Xfer valor no FORTRAN: LAPI_AM_XFER

bandeiras int INTEGER(KIND = 4) Nenhum

LAPI_Xfer parâmetro em FORTRAN: flags

tgt uint INTEGER(KIND = 4) tgt
Nenhum Nenhum INTEGER(KIND = 4) LAPI_Xfer parâmetro no FORTRAN: pad
hdr_hdl lapi_long_t INTEGER(KIND = 8) hdr_hdl
uhdr_len uint INTEGER(KIND = 4) uhdr_len
Nenhum Nenhum INTEGER(KIND = 4) LAPI_Xfer parâmetro em FORTRAN (64-bit): pad2
uhdr void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
uhdr
udata void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
udata
udata_len ulong
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
udata_len
shdlr scompl_hndlr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Nenhum

LAPI_Xfer parâmetro em FORTRAN: shdlr

sinfo void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Nenhum

LAPI_Xfer parâmetro em FORTRAN: sinfo

tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
org_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
org_cntr
cmpl_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
cmpl_cntr
Quando o buffer de dados de origem estiver livre para ser usado, o ponteiro para o manipulador de conclusão de envio (shdlr) é chamado com os dados de conclusão de envio (sinfo) se shdlr não for um ponteiro NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN). Caso contrário, o comportamento é idêntico ao de LAPI_Amsend.

detalhes lapi_amv_t

Tabela 3 mostra a correspondência entre os parâmetros da subroutina LAPI_Amsendv , os campos da estrutura C lapi_amv_t e seus datatipos, e os datatipos FORTRAN equivalentes. Os campos lapi_amv_t estão listados em Tabela 3 na ordem em que eles ocorrem na estrutura lapi_xfer_t .
Tabela 3. Equivalentes LAPI_Amsendv e lapi_amv_t
nome do campo lapi_amv_t (C) lapi_amv_t tipo de campo (C) Tipo de datatipo FORTRAN equivalente Parâmetro LAPI_Amsendv equivalente
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) implícito em C

LAPI_Xfer valor no FORTRAN: LAPI_AMV_XFER

bandeiras int INTEGER(KIND = 4) Nenhum

LAPI_Xfer parâmetro em FORTRAN: flags

tgt uint INTEGER(KIND = 4) tgt
Nenhum Nenhum INTEGER(KIND = 4) LAPI_Xfer parâmetro no FORTRAN: pad
hdr_hdl lapi_long_t INTEGER(KIND = 8) hdr_hdl
uhdr_len uint INTEGER(KIND = 4) uhdr_len
Nenhum Nenhum INTEGER(KIND = 4) LAPI_Xfer parâmetro em FORTRAN (64-bit): pad2
uhdr void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
uhdr
shdlr scompl_hndlr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Nenhum

LAPI_Xfer parâmetro em FORTRAN: shdlr

sinfo void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Nenhum

LAPI_Xfer parâmetro em FORTRAN: sinfo

org_vec lapi_vec_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
org_vec
Nenhum Nenhum INTEGER(KIND = 4) LAPI_Xfer parâmetro em FORTRAN (32-bit): pad2
tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
org_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
org_cntr
cmpl_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
cmpl_cntr

detalhes lapi_amdgsp_t

Tabela 4 mostra a correspondência entre os campos da estrutura C lapi_amdgsp_t e seus datatipos, como eles são usados em LAPI_Xfer, e os datatipos FORTRAN equivalentes. Os campos lapi_amdgsp_t estão listados em Tabela 4 na ordem em que eles ocorrem na estrutura lapi_xfer_t .
Tabela 4. Os campos lapi_amdgsp_t
nome do campo lapi_amdgsp_t (C) lapi_amdgsp_t tipo de campo (C) Tipo de datatipo FORTRAN equivalente Uso LAPI_Xfer
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) LAPI_DGSP_XFER
bandeiras int INTEGER(KIND = 4) Este campo permite que os usuários especificam diretivas ou sugestões ao LAPI. Se você não quiser usar nenhuma diretiva ou hints, você deve configurar este campo para 0. Veja O campo de bandeiras lapi_amdgsp_t para obter mais informações.
tgt uint INTEGER(KIND = 4) tarefa de destino
Nenhum Nenhum INTEGER(KIND = 4) pad (alinhamento de preenchimento apenas para FORTRAN)
hdr_hdl lapi_long_t INTEGER(KIND = 8) manipulador de cabeçalho para chamar no destino
uhdr_len uint INTEGER(KIND = 4) comprimento do cabeçalho do usuário (múltiplo do tamanho do doubleword do processador)
Nenhum Nenhum INTEGER(KIND = 4) pad2 (alinhamento de preenchimento para 64-bit apenas FORTRAN)
uhdr void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
ponteiro para cabeçalho do usuário
udata void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
ponteiro para dados do usuário
udata_len ulong
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Comprimento dos Dados de Usuár
shdlr scompl_hndlr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
manipulador de conclusão de envio (opcional)
sinfo void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
ponteiro de dados para passar para o manipulador de conclusão de envio (opcional)
tgt_cntr lapi_long_t INTEGER(KIND = 8) contador de destino (opcional)
org_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
contador de origem (opcional)
cmpl_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
contador de conclusão (opcional)
dgsp lapi_dg_handle_t
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Manejo de um DGSP registrado
status lapi_status_t
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Status para retornar (uso futuro)
Nenhum Nenhum INTEGER(KIND = 4) pad3 (alinhamento de preenchimento para 64-bit apenas FORTRAN)

Quando o buffer de dados de origem é livre para ser modificado, o manipulador de conclusão de envio (shdlr) é chamado com os dados de conclusão de envio (sinfo), se shdlr não for um ponteiro NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN).

Veja Usando lapi_am_dgsp_t para processamento de DGSP de lado de dispersão para obter mais informações.

O campo de bandeiras lapi_amdgsp_t

Uma ou mais bandeiras podem ser definidas usando o operador | (bitwise ou). As diretivas do usuário são sempre seguidas e poderiam resultar em resultados incorretos se usados impropriamente. As sugestões apropriadas podem melhorar o desempenho, mas podem ser ignoradas pelo LAPI. As sugestões inadequadas podem degradar o desempenho, mas não causarão resultados incorretos.

São definidas as seguintes bandeiras de diretiva:
USE_TGT_VEC_TYPE
Instrui LAPI a utilizar o tipo de vetor do vetor de destino (tgt_vec). Em outras palavras, tgt_vec deve ser interpretado como tipo lapi_vec_t; caso contrário, ele é interpretado como tipo lapi_lvec_t. O tipo lapi_lvec_t usa lapi_long_t. O tipo lapi_vec_t usa void * ou long. Resultados incorretos ocorrerão se um tipo for usado no lugar do outro.
BUFFER_BOTH_CONTIGUOUS
Instrui LAPI a tratar todos os dados a serem transferidos como contiguosos, o que pode melhorar o desempenho. Se esta sinalização for definida quando dados não contíguos são enviados, provavelmente os dados serão corrompidos.
São definidas as seguintes bandeiras de sugestão:
LAPI_NOT_USE_BULK_XFER
Instrui LAPI a não utilizar transferência a granel, independente da configuração atual para a tarefa.
LAPI_USE_BULK_XFER
Instrui LAPI a utilizar transferência a granel, independente da configuração atual para a tarefa.
Se nenhuma dessas bandeiras de hint for definida, LAPI usará o comportamento definido para a tarefa. Se ambas as bandeiras de hint estiverem definidas, LAPI_NOT_USE_BULK_XFER terá precedência.

Essas dicas podem ou não ser honradas pela biblioteca de comunicação.

Usando lapi_am_dgsp_t para processamento de DGSP de lado de dispersão

O LAPI permite que informações adicionais sejam retornadas do manipulador de cabeçalho através do uso do datatype lapi_return_info_t . Veja RSCT para AIX 5L: Guia de Programação LAPI para obter mais informações sobre lapi_return_info_t. No caso do tipo de transferência lapi_am_dgsp_t, este mecanismo pode ser usado para instruir LAPI a executar um DGSP de usuário para espalhar dados no lado de recebimento.

Para usar este mecanismo, passe um ponteiro lapi_return_info_t * de volta para LAPI por meio do membro msg_len do manipulador de cabeçalho do usuário. O membro dgsp_handle da estrutura passada deve apontar para uma descrição do DGSP que foi registrada no lado do recebimento. Veja LAPI_Util e RSCT para AIX 5L: Guia de Programação LAPI para obter detalhes sobre construção e registro de DGSPs.

detalhes lapi_get_t

Tabela 5 mostra a correspondência entre os parâmetros da subroutina LAPI_Get , os campos da estrutura C lapi_get_t e seus datatipos, e os datatipos FORTRAN equivalentes. Os campos lapi_get_t estão listados em Tabela 5 na ordem em que eles ocorrem na estrutura lapi_xfer_t .
Tabela 5. Equivalências LAPI_Get e lapi_get_t
lapi_get_t nome do campo (C) lapi_get_t tipo de campo (C) Tipo de datatipo FORTRAN equivalente Parâmetro LAPI_Get equivalente
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) implícito em C

LAPI_Xfer valor no FORTRAN: LAPI_GET_XFER

bandeiras int INTEGER(KIND = 4) Nenhum

LAPI_Xfer parâmetro em FORTRAN: flags

tgt uint INTEGER(KIND = 4) tgt
Nenhum Nenhum INTEGER(KIND = 4) LAPI_Xfer parâmetro no FORTRAN: pad
tgt_addr lapi_long_t INTEGER(KIND = 8) tgt_addr
endereço orgânico void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
endereço orgânico
len ulong
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
len
tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
org_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
org_cntr
chndlr compl_hndlr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Nenhum

LAPI_Xfer parâmetro no FORTRAN: chndlr

cinfo void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Nenhum

LAPI_Xfer parâmetro no FORTRAN: cinfo

Quando o buffer de dados de origem tiver chegado completamente, o ponteiro para o manipulador de conclusão (chndlr) é chamado com os dados de conclusão (cinfo), se chndlr não for um ponteiro NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN). Caso contrário, o comportamento é idêntico ao de LAPI_Get.

detalhes lapi_getv_t

Tabela 6 mostra a correspondência entre os parâmetros da subroutina LAPI_Getv , os campos da estrutura C lapi_getv_t e seus datatipos, e os datatipos FORTRAN equivalentes. Os campos lapi_getv_t estão listados em Tabela 5 na ordem em que eles ocorrem na estrutura lapi_xfer_t .
Tabela 6. Equivalências LAPI_Getv e lapi_getv_t
lapi_getv_t nome do campo (C) lapi_getv_t tipo de campo (C) Tipo de datatipo FORTRAN equivalente Parâmetro LAPI_Getv equivalente
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) implícito em C

LAPI_Xfer valor no FORTRAN: LAPI_GETV_XFER

bandeiras int INTEGER(KIND = 4) Nenhum

LAPI_Xfer parâmetro em FORTRAN: flags

tgt uint INTEGER(KIND = 4) tgt
Nenhum Nenhum INTEGER(KIND = 4) LAPI_Xfer parâmetro em FORTRAN (64-bit): pad
org_vec lapi_vec_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
org_vec
tgt_vec void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
tgt_vec
Nenhum Nenhum INTEGER(KIND = 4) LAPI_Xfer parâmetro em FORTRAN (32-bit): pad
tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
org_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
org_cntr
chndlr compl_hndlr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Nenhum

LAPI_Xfer parâmetro no FORTRAN: chndlr

cinfo void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Nenhum

LAPI_Xfer parâmetro no FORTRAN: cinfo

Nenhum Nenhum INTEGER(KIND = 4) LAPI_Xfer parâmetro em FORTRAN (32-bit): pad2
O campo flags aceita USE_TGT_VEC_TYPE (ver campo de bandeiras lapi_amdgsp_t) para indicar que tgt_vec deve ser interpretado como tipo lapi_vec_t; caso contrário, ele é interpretado como tipo lapi_lvec_t. Observe que o campo correspondente é lapi_vec_t na chamada LAPI_Getv .

Quando o buffer de dados de origem tiver chegado completamente, o ponteiro para o manipulador de conclusão (chndlr) é chamado com os dados de conclusão (cinfo) se chndlr não for um ponteiro NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN). Caso contrário, o comportamento é idêntico ao de LAPI_Getv.

detalhes lapi_put_t

Tabela 7 mostra a correspondência entre os parâmetros da subroutina LAPI_Put , os campos da estrutura C lapi_put_t e seus datatipos, e os datatipos FORTRAN equivalentes. Os campos lapi_put_t estão listados em Tabela 7 na ordem em que eles ocorrem na estrutura lapi_xfer_t .
Tabela 7. Equivalentes LAPI_Put e lapi_put_t
nome do campo lapi_put_t (C) tipo de campo lapi_put_t (C) Tipo de datatipo FORTRAN equivalente Parâmetro LAPI_Put equivalente
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) implícito em C

LAPI_Xfer valor no FORTRAN: LAPI_PUT_XFER

bandeiras int INTEGER(KIND = 4) Nenhum

LAPI_Xfer parâmetro em FORTRAN: flags

tgt uint INTEGER(KIND = 4) tgt
Nenhum Nenhum INTEGER(KIND = 4) LAPI_Xfer parâmetro no FORTRAN: pad
tgt_addr lapi_long_t INTEGER(KIND = 8) tgt_addr
endereço orgânico void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
endereço orgânico
len ulong
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
len
shdlr scompl_hndlr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Nenhum

LAPI_Xfer parâmetro em FORTRAN: shdlr

sinfo void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Nenhum

LAPI_Xfer parâmetro em FORTRAN: sinfo

tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
org_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
org_cntr
cmpl_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
cmpl_cntr
Quando o buffer de dados de origem estiver livre para ser usado, o ponteiro para o manipulador de conclusão de envio (shdlr) é chamado com os dados de conclusão de envio (sinfo), se shdlr não for um ponteiro NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN). Caso contrário, o comportamento é idêntico ao de LAPI_Put.

detalhes lapi_putv_t

Tabela 8 mostra a correspondência entre os parâmetros da subroutina LAPI_Putv , os campos da estrutura C lapi_putv_t e seus datatipos, e os datatipos FORTRAN equivalentes. Os campos lapi_putv_t estão listados em Tabela 7 na ordem em que eles ocorrem na estrutura lapi_xfer_t .
Tabela 8. Equivalências LAPI_Putv e lapi_putv_t
lapi_putv_t nome do campo (C) lapi_putv_t tipo de campo (C) Tipo de datatipo FORTRAN equivalente Parâmetro LAPI_Putv equivalente
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) implícito em C

LAPI_Xfer valor no FORTRAN: LAPI_PUT_XFER

bandeiras int INTEGER(KIND = 4) Nenhum

LAPI_Xfer parâmetro em FORTRAN: flags

tgt uint INTEGER(KIND = 4) tgt
Nenhum Nenhum INTEGER(KIND = 4) LAPI_Xfer parâmetro em FORTRAN (64-bit): pad
shdlr scompl_hndlr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Nenhum

LAPI_Xfer parâmetro em FORTRAN: shdlr

sinfo void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Nenhum

LAPI_Xfer parâmetro em FORTRAN: sinfo

org_vec lapi_vec_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
org_vec
tgt_vec void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
tgt_vec
Nenhum Nenhum INTEGER(KIND = 4) LAPI_Xfer parâmetro em FORTRAN (32-bit): pad
tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
org_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
org_cntr
cmpl_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
cmpl_cntr
O campo flags aceita USE_TGT_VEC_TYPE (ver campo de bandeiras lapi_amdgsp_t) para indicar que tgt_vec deve ser interpretado como lapi_vec_t; caso contrário, ele é interpretado como um lapi_lvec_t. Observe que o campo correspondente é lapi_vec_t na chamada LAPI_Putv .

Quando o buffer de dados de origem estiver livre para ser modificado, o ponteiro para o manipulador de conclusão de envio (shdlr) é chamado com os dados de conclusão de envio (sinfo), se shdlr não for um ponteiro NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN). Caso contrário, o comportamento é idêntico ao de LAPI_Putv.

detalhes lapi_rmw_t

Tabela 9 mostra a correspondência entre os parâmetros da subroutina LAPI_Rmw , os campos da estrutura C lapi_rmw_t e seus datatipos, e os datatipos FORTRAN equivalentes. Os campos lapi_rmw_t estão listados em Tabela 7 na ordem em que eles ocorrem na estrutura lapi_xfer_t .
Tabela 9. Equivalências LAPI_Rmw e lapi_rmw_t
lapi_rmw_t nome do campo (C) lapi_rmw_t tipo de campo (C) Tipo de datatipo FORTRAN equivalente Parâmetro LAPI_Rmw equivalente
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) implícito em C

LAPI_Xfer valor no FORTRAN: LAPI_RMW_XFER

op Rmw_ops_t INTEGER(KIND = 4) op
tgt uint INTEGER(KIND = 4) tgt
tamanho uint INTEGER(KIND = 4) implícito em C

LAPI_Xfer parâmetro em FORTRAN: size (deve ser 32 ou 64)

tgt_var lapi_long_t INTEGER(KIND = 8) tgt_var
in_val void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
in_val
valor_prev_tgt void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
valor_prev_tgt
org_cntr lapi_cntr t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
org_cntr
shdlr scompl_hndlr_t *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Nenhum

LAPI_Xfer parâmetro em FORTRAN: shdlr

sinfo void *
INTEGER(KIND = 4) (32 bits)
INTEGER(KIND = 8) (64 bits)
Nenhum

LAPI_Xfer parâmetro em FORTRAN: shdlr

Nenhum Nenhum INTEGER(KIND = 4) LAPI_Xfer parâmetro em FORTRAN (32-bit): pad
Quando o buffer de dados de origem estiver livre para ser usado, o ponteiro para o manipulador de conclusão de envio (shdlr) é chamado com os dados de conclusão de envio (sinfo), se shdlr não for um ponteiro NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN). O valor size deve ser 32 ou 64, indicando se deseja-se os campos in_val e prev_tgt_val para apontar para uma quantidade de 32-bit ou 64-bit, respectivamente. Caso contrário, o comportamento é idêntico ao de LAPI_Rmw.

Parâmetros

INPUT
hndl
Especifica a alça LAPI.
xfer_cmd
Especifica o nome e os parâmetros da função de transferência de dados.
SAÍDA
ierro
Especifica um código de retorno FORTRAN. Este é sempre o último parâmetro.

Valores De Retorno

LAPI_SUCESSO
Indica que a chamada de função foi concluída com sucesso.
LAPI_ERR_DATA_LEN
Indica que o valor de udata_len ou len é maior do que o valor da constante LAPI LAPI_MAX_MSG_SZ.
LAPI_ERR_DGSP
Indica que o DGSP que foi passado em é NULL (em C) ou LAPI_ADDR_NULL (no FORTRAN) ou não é um DGSP registrado.
LAPI_ERR_DGSP_ATOM
Indica que o DGSP tem um atom_size que é menor que 0 ou maior do que MAX_ATOM_SIZE.
LAPI_ERR_DGSP_BRANCH
Indica que a DGSP tentou um ramo que caiu fora da matriz de código.
LAPI_ERR_ERR_DGSP_CTL
Indica que uma instrução de controle do DGSP foi encontrada em um contexto não válido (como um controle de lado de reúna ou controle de lado de dispersão com um tamanho de átomo de 0 em reunir, por exemplo).
LAPI_ERR_DGSP_OPC
Indica que o código DGSP op-code não é válido.
LAPI_ERR_DGSP_STACK
Indica que o DGSP possui maior profundidade GOSUB do que os suportes de pilha alocados. Alocação de pilha é especificada pelo membro dgsp->profundidade.
LAPI_ERR_HDR_HNDLR_NULL
Indica que o hdr_hdl passado em é NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN).
LAPI_ERR_HNDL_INVÁLIDA
Indica que o hndl passado em não é válido (não inicializado ou em estado finalizado).
LAPI_ERR_IN_VAL_NULL
Indica que o ponteiro in_val é NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN).
LAPI_ERR_MEMORY_ESGOTADO
LAPI é incapaz de obter memória do sistema.
LAPI_ERR_OP_SZ
Indica que o campo lapi_rmw_t size não está configurado como 32 ou 64.
LAPI_ERR_ORG_ADDR_NULL
Indica ou que o parâmetro udata passado em é NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN) e udata_len é maior que 0, ou que o org_addr passado em é NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN) e len é maior que 0.

Note: se Xfer_type = LAPI_DGSP_XFER, o caso em que udata é NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN) e udata_len é maior que 0 é válido, portanto, um erro não é retornado.

LAPI_ERR_ORG_EXTENSÃO
Indica que a extensão org_vec(stride * num_vecs) é maior do que o valor da constante LAPI LAPI_MAX_MSG_SZ.
LAPI_ERR_ORG_STRIDE
Indica que o stride org_vec é menor do que bloco.
LAPI_ERR_ORG_VEC_ADDR
Indica que o org_vec->info [i] é NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN), mas o seu comprimento (org_vec->len [i]) não é 0.
LAPI_ERR_ORG_VEC_LEN
Indica que a soma de org_vec-> len é maior do que o valor da constante LAPI LAPI_MAX_MSG_SZ.
LAPI_ERR_ORG_VEC_NULL
Indica que o valor org_vec é NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN).
LAPI_ERR_ORG_VEC_TYPE
Indica que o org_vec->vec_type não é válido.
LAPI_ERR_RMW_OP
Indica que a op não é válida.
LAPI_ERR_STRIDE_ORG_VEC_ADDR_NULL
Indica que o vetor de vetor de stridado org_vec->info[0] é NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN).
LAPI_ERR_STRIDE_TGT_VEC_ADDR_NULL
Indica que o endereço vetorial stridado tgt_vec->info[0] é NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN).
LAPI_ERR_TGT
Indica que o tgt passado em está fora do intervalo de tarefas definidas no job.
LAPI_ERR_TGT_ADDR_NULL
Indica que ret_addr é NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN).
LAPI_ERR_TGT_EXTENSÃO
Indica que a extensão tgt_vec(stride * num_vecs) é maior do que o valor da constante LAPI LAPI_MAX_MSG_SZ.
LAPI_ERR_TGT_PURGED
Indica que a subroutine retornou mais cedo porque LAPI_Purge_totask() foi chamada.
LAPI_ERR_TGT_STRIDE
Indica que o stride tgt_vec é menor do que bloco.
LAPI_ERR_TGT_VAR_NULL
Indica que o endereço tgt_var é NULL (em C) ou que o valor de tgt_var é LAPI_ADDR_NULL (em FORTRAN).
LAPI_ERR_TGT_VEC_ADDR
Indica que o tgt_vec->info[i] é NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN), mas o seu comprimento (tgt_vec->len[i]) não é 0.
LAPI_ERR_TGT_VEC_LEN
Indica que a soma de tgt_vec->len é maior do que o valor de constante LAPI LAPI_MAX_MSG_SZ.
LAPI_ERR_TGT_VEC_NULL
Indica que tgt_vec é NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN).
LAPI_ERR_TGT_VEC_TYPE
Indica que o tgt_vec->vec_type não é válido.
LAPI_ERR_UHDR_LEN
Indica que o valor uhdr_len passado em é maior que MAX_UHDR_SZ ou não é um múltiplo do tamanho do doubleword do processador.
LAPI_ERR_UHDR_NULL
Indica que o uhdr passado em é NULL (em C) ou LAPI_ADDR_NULL (em FORTRAN), mas uhdr_len não é 0.
LAPI_ERR_VEC_LEN_DIFF
Indica que org_vec e tgt_vec têm tamanhos diferentes (len []).
LAPI_ERR_VEC_NUM_DIFF
Indica que org_vec e tgt_vec têm diferentes num_vecs.
LAPI_ERR_VEC_TYPE_DIFF
Indica que org_vec e tgt_vec possuem tipos de vetores diferentes (vec_type).
LAPI_ERR_XFER_CMD
Indica que o Xfer_cmd não é válido.

Exemplos de C

  1. Para executar o código de amostra mostrado em LAPI_Get usando a interface LAPI_Xfer :
    {
    
          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. Para implementar o exemplo LAPI_STRIDED_VECTOR a partir de LAPI_Amsendv usando a interface LAPI_Xfer :
    
    {
        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);
        .
        .
        .
    }
    
Veja a subroutine LAPI_Amsendv para obter mais informações sobre a definição do manipulador de cabeçalho.

Localização

/usr/lib/liblapi_r.a