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

📄 ch3_shm_memory.c

📁 mpi并行计算的c++代码 可用vc或gcc编译通过 可以用来搭建并行计算试验环境
💻 C
📖 第 1 页 / 共 2 页
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. *//* We use the proper autoconf test for mmap, so we let the coding style   checker know *//* style: allow:mmap:3 sig:0 */#include "mpidi_ch3_impl.h"#if defined(USE_POSIX_SHM) || defined(USE_WINDOWS_SHM)static void generate_shm_string(char *str){#ifdef USE_WINDOWS_SHM    UUID guid;    UuidCreate(&guid);    MPIU_Snprintf(str, 40, "%08lX-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X",	guid.Data1, guid.Data2, guid.Data3,	guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],	guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);    MPIU_DBG_PRINTF(("GUID = %s\n", str));#elif defined (USE_POSIX_SHM)    MPIU_Snprintf(str, 40, "/mpich_shm_%d", rand());#else#error No shared memory subsystem defined#endif}#endif#if 0/* Here's a clip of the SHARED_PROCESS_READ code *//* allocation */#ifdef HAVE_WINDOWS_H            pSharedProcessHandles[i] =                OpenProcess(STANDARD_RIGHTS_REQUIRED | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION,                             FALSE, pSharedProcess[i].nPid);            if (pSharedProcessHandles[i] == NULL)            {                int err = GetLastError();                mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**OpenProcess", "**OpenProcess %d %d", i, err); /*"unable to open process %d, error %d", i, err);*/            }#else            MPIU_Snprintf(filename, 256, "/proc/%d/mem", pSharedProcess[i].nPid);            pSharedProcessIDs[i] = pSharedProcess[i].nPid;            pSharedProcessFileDescriptors[i] = open(filename, O_RDONLY);            if (pSharedProcessFileDescriptors[i] == -1)	    {                mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**open", "**open %s %d %d", filename, pSharedProcess[i].nPid, errno); /*"failed to open mem file, '%s', for process %d", filename, pSharedProcess[i].nPid);*/	    }#endif/* deallocation */#ifdef HAVE_SHARED_PROCESS_READ#ifdef HAVE_WINDOWS_H	for (i=0; i<pg->size; i++)	    CloseHandle(pg->pSharedProcessHandles[i]);	MPIU_Free(pg->pSharedProcessHandles);	pg->pSharedProcessHandles = NULL;#else	for (i=0; i<pg->size; i++)	    close(pg->pSharedProcessFileDescriptors[i]);	MPIU_Free(pg->pSharedProcessFileDescriptors);	MPIU_Free(pg->pSharedProcessIDs);	pg->pSharedProcessFileDescriptors = NULL;	pg->pSharedProcessIDs = NULL;#endif#endif#endif/*@   MPIDI_CH3I_SHM_Get_mem - allocate and get the address and size of a shared memory block   Parameters:+  int size - size-  MPIDI_CH3I_Shmem_block_request_result* pOutput - output   Notes:@*/#undef FUNCNAME#define FUNCNAME MPIDI_CH3I_SHM_Get_mem#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_CH3I_SHM_Get_mem(int size, MPIDI_CH3I_Shmem_block_request_result *pOutput){    int mpi_errno = MPI_SUCCESS;#if defined (USE_POSIX_SHM) || defined (USE_SYSV_SHM)    int i;#endif    MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM);    if (size == 0 || size > MPIDU_MAX_SHM_BLOCK_SIZE )    {	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**arg", 0);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM);	return mpi_errno;    }    /* Create the shared memory object */#ifdef USE_POSIX_SHM    for (i=0; i<10; i++)    {	generate_shm_string(pOutput->key);	pOutput->id = shm_open(pOutput->key, O_EXCL | O_RDWR | O_CREAT, 0600);	if (pOutput->id != -1)	    break;    }    if (pOutput->id == -1)    {	pOutput->error = errno;	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**shm_open", "**shm_open %s %d", pOutput->key, pOutput->error);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM);	return mpi_errno;    }    MPIU_Strncpy(pOutput->name, pOutput->key, MPIDI_MAX_SHM_NAME_LENGTH);    if (ftruncate(pOutput->id, size) == -1)    {	pOutput->error = errno;	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**ftruncate", "**ftruncate %s %d %d", pOutput->key, size, pOutput->error);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM);	return mpi_errno;    }#elif defined (USE_SYSV_SHM)    for (i=0; i<10; i++)    {	pOutput->key = rand();	pOutput->id = shmget(pOutput->key, size, IPC_EXCL | IPC_CREAT | SHM_R | SHM_W);	if (pOutput->id != -1)	    break;    }    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_GET_MEM);	return mpi_errno;    }#elif defined (USE_WINDOWS_SHM)    generate_shm_string(pOutput->key);    pOutput->id = CreateFileMapping(	INVALID_HANDLE_VALUE,	NULL,	PAGE_READWRITE,	0, 	size,	pOutput->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_GET_MEM);	return mpi_errno;    }#else#error No shared memory subsystem defined#endif    pOutput->addr = NULL;#ifdef USE_POSIX_SHM    pOutput->addr = mmap(NULL, 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);	pOutput->addr = NULL;	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM);	return mpi_errno;    }#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_GET_MEM);	return mpi_errno;    }#elif defined(USE_WINDOWS_SHM)    pOutput->addr = MapViewOfFileEx(	pOutput->id,	FILE_MAP_WRITE,	0, 0,	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_GET_MEM);	return mpi_errno;    }#else#error No shared memory subsystem defined#endif    pOutput->size = size;    pOutput->error = MPI_SUCCESS;    MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM);    return MPI_SUCCESS;}/*@   MPIDI_CH3I_SHM_Get_mem - allocate and get the address and size of a shared memory block   Parameters:+  int size - size-  MPIDI_CH3I_Shmem_block_request_result* pOutput - output   Notes:@*/#undef FUNCNAME#define FUNCNAME MPIDI_CH3I_SHM_Get_mem_named#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_CH3I_SHM_Get_mem_named(int size, MPIDI_CH3I_Shmem_block_request_result *pOutput){    int mpi_errno = MPI_SUCCESS;#ifdef USE_SYSV_SHM    FILE *fout;#endif    MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED);    if (size == 0 || size > MPIDU_MAX_SHM_BLOCK_SIZE )    {	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**arg", 0);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED);	return mpi_errno;    }    /* Create the shared memory object */#ifdef USE_POSIX_SHM    /*printf("[%d] creating a named shm object: '%s'\n", MPIR_Process.comm_world->rank, pOutput->name);*/    pOutput->id = shm_open(pOutput->name, O_RDWR | O_CREAT, 0600);    if (pOutput->id == -1)    {	pOutput->error = errno;	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**shm_open", "**shm_open %s %d", pOutput->name, pOutput->error);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED);	return mpi_errno;    }    if (ftruncate(pOutput->id, size) == -1)    {	pOutput->error = errno;	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**ftruncate", "**ftruncate %s %d %d", pOutput->name, size, pOutput->error);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED);	return mpi_errno;    }#elif defined (USE_SYSV_SHM)    /* Insert code here to convert the name into a key */    fout = fopen(pOutput->name, "a+");    pOutput->key = ftok(pOutput->name, 12345);    fclose(fout);    if (pOutput->key == -1)    {	pOutput->error = errno;	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**ftok", "**ftok %s %d %d", pOutput->name, 12345, pOutput->error);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED);	return mpi_errno;    }    pOutput->id = shmget(pOutput->key, size, IPC_CREAT | 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);	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED);	return mpi_errno;    }#elif defined (USE_WINDOWS_SHM)    pOutput->id = CreateFileMapping(	INVALID_HANDLE_VALUE,	NULL,	PAGE_READWRITE,	0, 	size,	pOutput->name);    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_GET_MEM_NAMED);	return mpi_errno;    }#else#error No shared memory subsystem defined#endif    /*printf("[%d] mmapping the shared memory object\n", MPIR_Process.comm_world->rank);fflush(stdout);*/    pOutput->addr = NULL;#ifdef USE_POSIX_SHM    pOutput->addr = mmap(NULL, 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);	pOutput->addr = NULL;	MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED);	return mpi_errno;    }#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_GET_MEM_NAMED);	return mpi_errno;    }#elif defined(USE_WINDOWS_SHM)    pOutput->addr = MapViewOfFileEx(	pOutput->id,	FILE_MAP_WRITE,	0, 0,	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_GET_MEM_NAMED);	return mpi_errno;    }#else

⌨️ 快捷键说明

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