⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpid_nem_mpich2_rma.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 2 页
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2006 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include "mpid_nem_impl.h"#include "mpid_nem_nets.h"#include <string.h>#include <errno.h>#define FNAME_TEMPLATE "/tmp/SHAR_TMPXXXXXX"#undef FUNCNAME#define FUNCNAME MPID_nem_mpich2_alloc_win#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_mpich2_alloc_win (void **buf, int len, MPID_nem_mpich2_win_t **win){    int mpi_errno = MPI_SUCCESS;    MPIU_CHKPMEM_DECL(1);    MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_MPICH2_ALLOC_WIN);    MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_MPICH2_ALLOC_WIN);    MPIU_CHKPMEM_MALLOC (*win, MPID_nem_mpich2_win_t *, sizeof (MPID_nem_mpich2_win_t), mpi_errno, "rma win object");    mpi_errno = MPID_nem_allocate_shared_memory ((char **)buf, len, &(*win)->handle);    if (mpi_errno) MPIU_ERR_POP (mpi_errno);    (*win)->proc = MPID_nem_mem_region.rank;    (*win)->home_address = *buf;    (*win)->len = len;    (*win)->local_address = *buf;    MPIU_CHKPMEM_COMMIT(); fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_MPICH2_ALLOC_WIN);    return mpi_errno; fn_fail:    MPIU_CHKPMEM_REAP();    goto fn_exit;}#undef FUNCNAME#define FUNCNAME MPID_nem_mpich2_free_win#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_mpich2_free_win (MPID_nem_mpich2_win_t *win){    int mpi_errno = MPI_SUCCESS;    MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_MPICH2_FREE_WIN);    MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_MPICH2_FREE_WIN);    MPIU_Assert (win->proc == MPID_nem_mem_region.rank);    mpi_errno = MPID_nem_remove_shared_memory (win->handle);    if (mpi_errno) MPIU_ERR_POP (mpi_errno);    mpi_errno = MPID_nem_detach_shared_memory (win->home_address, win->len);    if (mpi_errno) MPIU_ERR_POP (mpi_errno);    MPIU_Free (win->handle);    MPIU_Free (win); fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_MPICH2_FREE_WIN);    return mpi_errno; fn_fail:    goto fn_exit;}#undef FUNCNAME#define FUNCNAME MPID_nem_mpich2_attach_win#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_mpich2_attach_win (void **buf, MPID_nem_mpich2_win_t *remote_win){    int mpi_errno = MPI_SUCCESS;    MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_MPICH2_ATTACH_WIN);    MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_MPICH2_ATTACH_WIN);    if (remote_win->proc == MPID_nem_mem_region.rank)    {        /* don't actually attach if the window is local */	*buf = remote_win->home_address;    }    else    {        mpi_errno = MPID_nem_attach_shared_memory ((char **)buf, remote_win->len, remote_win->handle);        if (mpi_errno) MPIU_ERR_POP (mpi_errno);    }    remote_win->local_address = *buf; fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_MPICH2_ATTACH_WIN);    return mpi_errno; fn_fail:    goto fn_exit;}#undef FUNCNAME#define FUNCNAME MPID_nem_mpich2_detach_win#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_mpich2_detach_win (MPID_nem_mpich2_win_t *remote_win){    int mpi_errno = MPI_SUCCESS;    MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_MPICH2_DETACH_WIN);    MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_MPICH2_DETACH_WIN);    if (remote_win->proc != MPID_nem_mem_region.rank)    {        /* we didn't actually attach if the "remote window" is local */        mpi_errno = MPID_nem_detach_shared_memory (remote_win->local_address, remote_win->len);        if (mpi_errno) MPIU_ERR_POP (mpi_errno);    } fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_MPICH2_DETACH_WIN);    return mpi_errno; fn_fail:    goto fn_exit;}#undef FUNCNAME#define FUNCNAME MPID_nem_mpich2_win_put#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_mpich2_win_put (void *s_buf, void *d_buf, int len, MPID_nem_mpich2_win_t *remote_win){    int mpi_errno = MPI_SUCCESS;    char *_d_buf = d_buf;    MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_MPICH2_WIN_PUT);    MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_MPICH2_WIN_PUT);    _d_buf += (char *)remote_win->local_address - (char *)remote_win->home_address;    if (_d_buf < (char *)remote_win->local_address || _d_buf + len > (char *)remote_win->local_address + remote_win->len)        MPIU_ERR_SETANDJUMP (mpi_errno, MPI_ERR_OTHER, "**winput_oob");    MPID_NEM_MEMCPY (_d_buf, s_buf, len); fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_MPICH2_WIN_PUT);    return mpi_errno; fn_fail:    goto fn_exit;}#undef FUNCNAME#define FUNCNAME MPID_nem_mpich2_win_putv#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_mpich2_win_putv (struct iovec **s_iov, int *s_niov, struct iovec **d_iov, int *d_niov, MPID_nem_mpich2_win_t *remote_win){    int mpi_errno = MPI_SUCCESS;    size_t diff;    int len;    MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_MPICH2_WIN_PUTV);    MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_MPICH2_WIN_PUTV);    diff = (char *)remote_win->local_address - (char *)remote_win->home_address;    if ((char *)(*d_iov)->iov_base + diff < (char *)remote_win->local_address ||	(char *)(*d_iov)->iov_base + diff + (*d_iov)->iov_len > (char *)remote_win->local_address + remote_win->len)        MPIU_ERR_SETANDJUMP (mpi_errno, MPI_ERR_OTHER, "**winput_oob");    while (*s_niov && *d_niov)    {	if ((*s_iov)->iov_len > (*d_iov)->iov_len)	{	    len = (*d_iov)->iov_len;	    MPID_NEM_MEMCPY ((char*)((*d_iov)->iov_base) + diff, (*s_iov)->iov_base, len);	    (*s_iov)->iov_base = (char *)(*s_iov)->iov_base + len;	    (*s_iov)->iov_len =- len;	    ++(*d_iov);	    --(*d_niov);	    if ((char *)(*d_iov)->iov_base + diff < (char *)remote_win->local_address ||		(char *)(*d_iov)->iov_base + diff + (*d_iov)->iov_len > (char *)remote_win->local_address + remote_win->len)                MPIU_ERR_SETANDJUMP (mpi_errno, MPI_ERR_OTHER, "**winput_oob");	}	else if ((*s_iov)->iov_len > (*d_iov)->iov_len)	{	    len = (*s_iov)->iov_len;	    MPID_NEM_MEMCPY ((char*)((*d_iov)->iov_base) + diff, (*s_iov)->iov_base, len);	    ++(*s_iov);	    --(*s_niov);	    (*d_iov)->iov_base = (char *)(*d_iov)->iov_base + len;	    (*d_iov)->iov_len =- len;	}	else	{	    len = (*s_iov)->iov_len;	    MPID_NEM_MEMCPY ((char*)((*d_iov)->iov_base) + diff, (*s_iov)->iov_base, len);	    ++(*s_iov);	    --(*s_niov);	    ++(*d_iov);	    --(*d_niov);	    if ((char *)(*d_iov)->iov_base + diff < (char *)remote_win->local_address ||		(char *)(*d_iov)->iov_base + diff + (*d_iov)->iov_len > (char *)remote_win->local_address + remote_win->len)                MPIU_ERR_SETANDJUMP (mpi_errno, MPI_ERR_OTHER, "**winput_oob");	}    } fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_MPICH2_WIN_PUTV);    return mpi_errno; fn_fail:    goto fn_exit;}#undef FUNCNAME#define FUNCNAME MPID_nem_mpich2_win_get#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_mpich2_win_get (void *s_buf, void *d_buf, int len, MPID_nem_mpich2_win_t *remote_win){    int mpi_errno = MPI_SUCCESS;    char *_s_buf = s_buf;    MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_MPICH2_WIN_GET);    MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_MPICH2_WIN_GET);    _s_buf += (char *)remote_win->local_address - (char *)remote_win->home_address;    if (_s_buf < (char *)remote_win->local_address || _s_buf + len > (char *)remote_win->local_address + remote_win->len)        MPIU_ERR_SETANDJUMP (mpi_errno, MPI_ERR_OTHER, "**winget_oob");    MPID_NEM_MEMCPY (d_buf, _s_buf, len); fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_MPICH2_WIN_GET);    return mpi_errno; fn_fail:    goto fn_exit;}#undef FUNCNAME#define FUNCNAME MPID_nem_mpich2_win_getv#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_mpich2_win_getv (struct iovec **s_iov, int *s_niov, struct iovec **d_iov, int *d_niov, MPID_nem_mpich2_win_t *remote_win){    int mpi_errno = MPI_SUCCESS;    size_t diff;    int len;    MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_MPICH2_WIN_GETV);    MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_MPICH2_WIN_GETV);    diff = (char *)remote_win->local_address - (char *)remote_win->home_address;    if ((char *)(*s_iov)->iov_base + diff < (char *)remote_win->local_address ||	(char *)(*s_iov)->iov_base + diff + (*s_iov)->iov_len > (char *)remote_win->local_address + remote_win->len)        MPIU_ERR_SETANDJUMP (mpi_errno, MPI_ERR_OTHER, "**winget_oob");    while (*s_niov && *d_niov)    {	if ((*d_iov)->iov_len > (*s_iov)->iov_len)	{	    len = (*s_iov)->iov_len;	    MPID_NEM_MEMCPY ((char*)((*d_iov)->iov_base) + diff, (*s_iov)->iov_base, len);	    (*d_iov)->iov_base = (char *)(*d_iov)->iov_base + len;	    (*d_iov)->iov_len =- len;	    ++(*s_iov);	    --(*s_niov);	    if ((char *)(*s_iov)->iov_base + diff < (char *)remote_win->local_address ||		(char *)(*s_iov)->iov_base + diff + (*s_iov)->iov_len > (char *)remote_win->local_address + remote_win->len)	        MPIU_ERR_SETANDJUMP (mpi_errno, MPI_ERR_OTHER, "**winget_oob");	}	else if ((*d_iov)->iov_len > (*s_iov)->iov_len)	{	    len = (*d_iov)->iov_len;	    MPID_NEM_MEMCPY ((char*)((*d_iov)->iov_base) + diff, (*s_iov)->iov_base, len);	    ++(*d_iov);	    --(*d_niov);	    (*s_iov)->iov_base = (char *)(*s_iov)->iov_base + len;	    (*s_iov)->iov_len =- len;	}	else	{	    len = (*d_iov)->iov_len;	    MPID_NEM_MEMCPY ((char*)((*d_iov)->iov_base) + diff, (*s_iov)->iov_base, len);	    ++(*d_iov);	    --(*d_niov);	    ++(*s_iov);	    --(*s_niov);	    if ((char *)(*s_iov)->iov_base + diff < (char *)remote_win->local_address ||		(char *)(*s_iov)->iov_base + diff + (*s_iov)->iov_len > (char *)remote_win->local_address + remote_win->len)                MPIU_ERR_SETANDJUMP (mpi_errno, MPI_ERR_OTHER, "**winget_oob");	}    } fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_MPICH2_WIN_GETV);    return mpi_errno; fn_fail:    goto fn_exit;}#define WIN_HANLEN_KEY     "hanlen"#define WIN_HANDLE_KEY     "handle"#define WIN_PROC_KEY       "proc"#define WIN_HOME_ADDR_KEY  "homeaddr"#define WIN_LEN_KEY        "len"#define WIN_LOCAL_ADDR_KEY "localaddr"#undef FUNCNAME#define FUNCNAME MPID_nem_mpich2_serialize_win#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_mpich2_serialize_win (void *buf, int buf_len, MPID_nem_mpich2_win_t *win, int *len){    int mpi_errno = MPI_SUCCESS;    int str_errno;    int bl = buf_len;    char *b = (char *)buf;    int handle_len;    MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_MPICH2_SERIALIZE_WIN);    MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_MPICH2_SERIALIZE_WIN);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -