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

📄 alltoall.c

📁 mpi并行计算的c++代码 可用vc或gcc编译通过 可以用来搭建并行计算试验环境
💻 C
字号:
#include <mpi.h>#include <pthread.h>#include <unistd.h>#include <stdio.h>#ifdef DO_DEBUG#define DEBUG(_a){ _a ;fflush(stdout);}#else#define DEBUG(_a)#endifconst int REQ_TAG = 111;const int ANS_TAG = 222;/* MPI environment description */int rank, size, provided;/*    LISTENER THREAD   it waits for communication from any source (including calling thread)   messages which it receives have tag REQ_TAG   thread runs infinite loop which will stop only if every node in the   MPI_COMM_WORLD send request containing -1 */void* listener(void*extra) {    int req;    int source;    MPI_Status stat;    int no_fins = 0; /* this must be equal to size to break loop below */    while (1) {	/* wait for request */	MPI_Recv(&req, 1, MPI_INT, 	 	 MPI_ANY_SOURCE, REQ_TAG, MPI_COMM_WORLD, &stat);	/* get request source */	source = stat.MPI_SOURCE;	DEBUG(printf( "node %d got request %d from %d\n", rank, req, source ));	if (req == -1) ++no_fins; /* one more node finished requesting */		/* no more requests can arrive */	if (no_fins == size) break;    }    DEBUG(printf( "node %d has stopped listener\n", rank ));    pthread_cancel(0);} int main(int argc, char* argv[]) {    pthread_t thr;    pthread_attr_t attr;    int host = 0;    int buf = 0;    int key = getpid();    long int i;    const long int N = 1;        MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);    if (provided != MPI_THREAD_MULTIPLE) {	printf( "This test requires MPI_THREAD_MULTIPLE\n" );	MPI_Abort( MPI_COMM_WORLD, 1 );    }    MPI_Comm_rank(MPI_COMM_WORLD, &rank);    MPI_Comm_size(MPI_COMM_WORLD, &size);#ifdef USE_BARRIER    MPI_Barrier( MPI_COMM_WORLD );#endif        /* create listener thread */    pthread_attr_init(&attr);    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);    pthread_create(&thr, &attr, listener, 0);    pthread_attr_destroy(&attr);    /* no more requests to send       inform other in the group that we have finished */    buf = -1;    for (i = 0; i < size; ++i) {	MPI_Send(&buf, 1, MPI_INT, i, REQ_TAG, MPI_COMM_WORLD);    }    /* and wait for others to do the same */    pthread_join(thr, 0);    MPI_Finalize();    /* This program works if it gets here */    if (rank == 0) {	printf( " No Errors\n" );    }    return 0;} 

⌨️ 快捷键说明

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