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

📄 ch3_shm_memory.c

📁 mpi并行计算的c++代码 可用vc或gcc编译通过 可以用来搭建并行计算试验环境
💻 C
📖 第 1 页 / 共 2 页
字号:
#error No shared memory subsystem defined#endif    pOutput->size = size;    pOutput->error = MPI_SUCCESS;    MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED);    return MPI_SUCCESS;}/*@   MPIDI_CH3I_SHM_Attach_to_mem - attach to an existing shmem queue   Parameters:+  MPIDI_CH3I_Shmem_block_request_result* pInput - input-  MPIDI_CH3I_Shmem_block_request_result* pOutput - output   Notes:   The shared memory segment is unlinked after attaching so only one process can call this function.@*/#undef FUNCNAME#define FUNCNAME MPIDI_CH3I_SHM_Attach_to_mem#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_CH3I_SHM_Attach_to_mem(MPIDI_CH3I_Shmem_block_request_result *pInput, MPIDI_CH3I_Shmem_block_request_result *pOutput){    int mpi_errno;    MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_TO_MEM);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_TO_MEM);    /* Create the shared memory object */#ifdef USE_POSIX_SHM    pOutput->id = shm_open(pInput->key, O_RDWR, 0600);    if (pOutput->id == -1)    {	pOutput->error = errno;	/* printf("shm_open(%s) failed, error %d\n", pInput->key, errno); */	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**shm_open", "**shm_open %s %d", pInput->key, errno);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_TO_MEM);	return mpi_errno;    }    /*ftruncate(pOutput->id, size);*/ /* The sender/creator set the size */#elif defined (USE_SYSV_SHM)    pOutput->id = shmget(pInput->key, pInput->size, SHM_R | SHM_W);    if (pOutput->id == -1)    {	pOutput->error = errno;	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**shmget", "**shmget %d", pOutput->error); /*"Error in shmget, %d", pOutput->error);*/	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_TO_MEM);	return mpi_errno;    }#elif defined (USE_WINDOWS_SHM)    MPIU_DBG_PRINTF(("MPIDI_CH3I_SHM_Attach_to_mem: Creating file mapping of size %d named %s\n", pInput->size, pInput->key));    pOutput->id = CreateFileMapping(	INVALID_HANDLE_VALUE,	NULL,	PAGE_READWRITE,	0, 	pInput->size,	pInput->key);    if (pOutput->id == NULL)     {	pOutput->error = GetLastError();	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**CreateFileMapping", "**CreateFileMapping %d", pOutput->error); /*"Error in CreateFileMapping, %d", pOutput->error);*/	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_TO_MEM);	return mpi_errno;    }#else#error No shared memory subsystem defined#endif    pOutput->addr = NULL;#ifdef USE_POSIX_SHM    pOutput->addr = mmap(NULL, pInput->size, PROT_READ | PROT_WRITE, MAP_SHARED /* | MAP_NORESERVE*/, pOutput->id, 0);    if (pOutput->addr == MAP_FAILED)    {	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**mmap", "**mmap %d", errno);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_TO_MEM);	return mpi_errno;    }    shm_unlink(pInput->key);#elif defined (USE_SYSV_SHM)    pOutput->addr = shmat(pOutput->id, NULL, SHM_RND);    if (pOutput->addr == (void*)-1)    {	pOutput->error = errno;	pOutput->addr = NULL;	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**shmat", "**shmat %d", pOutput->error); /*"Error from shmat %d", pOutput->error);*/	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_TO_MEM);	return mpi_errno;    }    shmctl(pOutput->id, IPC_RMID, NULL);#elif defined(USE_WINDOWS_SHM)    pOutput->addr = MapViewOfFileEx(	pOutput->id,	FILE_MAP_WRITE,	0, 0,	pInput->size,	NULL	);    if (pOutput->addr == NULL)    {	pOutput->error = GetLastError();	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**MapViewOfFileEx", "**MapViewOfFileEx %d", pOutput->error);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_TO_MEM);	return mpi_errno;    }#else#error No shared memory subsystem defined#endif    pOutput->error = MPI_SUCCESS;    MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_TO_MEM);    return MPI_SUCCESS;}/*@   MPIDI_CH3I_SHM_Unlink_mem -    Notes:@*/#undef FUNCNAME#define FUNCNAME MPIDI_CH3I_SHM_Unlink_mem#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_CH3I_SHM_Unlink_mem(MPIDI_CH3I_Shmem_block_request_result *p){#if defined(USE_POSIX_SHM) || defined(USE_SYSV_SHM)    int ret_val;#endif    int mpi_errno = MPI_SUCCESS;    MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SHM_UNLINK_MEM);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SHM_UNLINK_MEM);#ifdef USE_POSIX_SHM    /* printf("[%d] unlinking '%s'\n", MPIR_Process.comm_world->rank, p->name); */    ret_val = shm_unlink(p->name);    if (ret_val == -1)    {#ifdef ENOENT	if (errno != ENOENT)#endif	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**shm_unlink", "**shm_unlink %s %d", p->key, ret_val);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_UNLINK_MEM);	return mpi_errno;    }#elif defined (USE_SYSV_SHM)    ret_val = shmctl(p->id, IPC_RMID, NULL);    if (ret_val == -1)    {#ifdef EIDRM	if (errno != EIDRM)#endif	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**shmctl", "**shmctl %d %d", p->id, ret_val);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_UNLINK_MEM);	return mpi_errno;    }#elif defined (USE_WINDOWS_SHM)#else#error No shared memory subsystem defined#endif    MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_UNLINK_MEM);    return mpi_errno;}/*@   MPIDI_CH3I_SHM_Release_mem -    Notes:@*/#undef FUNCNAME#define FUNCNAME MPIDI_CH3I_SHM_Release_mem#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_CH3I_SHM_Release_mem(MPIDI_CH3I_Shmem_block_request_result *p){    MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SHM_RELEASE_MEM);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SHM_RELEASE_MEM);#ifdef USE_POSIX_SHM    close(p->id);#elif defined (USE_SYSV_SHM)    shmdt(p->addr);#elif defined (USE_WINDOWS_SHM)    UnmapViewOfFile(p->addr);    CloseHandle(p->id);#else#error No shared memory subsystem defined#endif    MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_RELEASE_MEM);    return MPI_SUCCESS;}/*@   MPIDI_CH3I_SHM_Unlink_and_detach_mem -    Notes: This function unlinks and detaches a shared memory segment. It is called in          MPIDI_CH3I_Free_mem (for rma).         brad : it is also called in MIPDI_CH3_Finalize and MPIDI_CH3_Win_free @*/#undef FUNCNAME#define FUNCNAME MPIDI_CH3I_SHM_Unlink_and_detach_mem#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_CH3I_SHM_Unlink_and_detach_mem(MPIDI_CH3I_Shmem_block_request_result *p){    int mpi_errno=MPI_SUCCESS;    MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SHM_UNLINK_AND_DETACH_MEM);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SHM_UNLINK_AND_DETACH_MEM);    mpi_errno = MPIDI_CH3I_SHM_Unlink_mem(p);    if (mpi_errno != MPI_SUCCESS) goto fn_exit;    mpi_errno = MPIDI_CH3I_SHM_Release_mem(p); fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_UNLINK_AND_DETACH_MEM);    return mpi_errno;}/*@   MPIDI_CH3I_SHM_Attach - attach to an existing shared memory without calling unlink   Parameters:+  MPIDI_CH3I_Shmem_block_request_result* pInput - input   Notes: It is used in MPID_CH3I_Win_create@*/#undef FUNCNAME#define FUNCNAME MPIDI_CH3I_SHM_Attach_notunlink_mem#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_CH3I_SHM_Attach_notunlink_mem(MPIDI_CH3I_Shmem_block_request_result *pInput){    int mpi_errno;    MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_NOTUNLINK_MEM);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_NOTUNLINK_MEM);    /* Create the shared memory object */#ifdef USE_POSIX_SHM    pInput->id = shm_open(pInput->key, O_RDWR, 0600);    if (pInput->id == -1)    {	pInput->error = errno;	/* printf("shm_open(%s) failed, error %d\n", pInput->key, errno); */	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**shm_open", "**shm_open %s %d", pInput->key, errno);        goto fn_exit;    }    /*ftruncate(pOutput->id, size);*/ /* The sender/creator set the size */#elif defined (USE_SYSV_SHM)    pInput->id = shmget(pInput->key, pInput->size, SHM_R | SHM_W);    if (pInput->id == -1)    {	pInput->error = errno;	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**shmget", "**shmget %d", pInput->error); /*"Error in shmget, %d", pOutput->error);*/        goto fn_exit;    }#elif defined (USE_WINDOWS_SHM)    MPIU_DBG_PRINTF(("MPIDI_CH3I_SHM_Attach: Creating file mapping of size %d named %s\n", pInput->size, pInput->key));    pInput->id = CreateFileMapping(	INVALID_HANDLE_VALUE,	NULL,	PAGE_READWRITE,	0, 	pInput->size,	pInput->key);    if (pInput->id == NULL)     {	pInput->error = GetLastError();	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**CreateFileMapping", "**CreateFileMapping %d", pInput->error); /*"Error in CreateFileMapping, %d", pOutput->error);*/        goto fn_exit;    }#else#error No shared memory subsystem defined#endif    pInput->addr = NULL;#ifdef USE_POSIX_SHM    pInput->addr = mmap(NULL, pInput->size, PROT_READ | PROT_WRITE, MAP_SHARED /* | MAP_NORESERVE*/, pInput->id, 0);    if (pInput->addr == MAP_FAILED)    {	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**mmap", "**mmap %d", errno);        goto fn_exit;    }#elif defined (USE_SYSV_SHM)    pInput->addr = shmat(pInput->id, NULL, SHM_RND);    if (pInput->addr == (void*)-1)    {	pInput->error = errno;	pInput->addr = NULL;	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**shmat", "**shmat %d", pInput->error); /*"Error from shmat %d", pOutput->error);*/        goto fn_exit;    }#elif defined(USE_WINDOWS_SHM)    pInput->addr = MapViewOfFileEx(	pInput->id,	FILE_MAP_WRITE,	0, 0,	pInput->size,	NULL	);    if (pInput->addr == NULL)    {	pInput->error = GetLastError();	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**MapViewOfFileEx", "**MapViewOfFileEx %d", pInput->error);        goto fn_exit;    }#else#error No shared memory subsystem defined#endif    pInput->error = MPI_SUCCESS; fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_NOTUNLINK_MEM);    return MPI_SUCCESS;}

⌨️ 快捷键说明

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