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

📄 segtest.c

📁 mpi并行计算的c++代码 可用vc或gcc编译通过 可以用来搭建并行计算试验环境
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include "mpi.h"#include "mpiimpl.h"#include <stdio.h>/*  * Simple segment test, including timing code *//*  * Build datatype structures * * Contiguous *     n = 1, 4, 16, 64, 128, 512, 2048, 8196 ints * Vector *     blocksize = 1, 4, 64 ints *     stride    = 1, 64, 127 * Block Indexed *     blocksize = 1, 4 ints *     offsets   = i*24 for i = 0 to n, n = 0, 64, 512 * Indexed *     blocksizes = 1, 2, 4, 3, 7, 5, 6 *     offsets    = i*24 for i = 0 to n, n = 0, 4, 7, 64, 512  *     (Wrap blocksizes to match offsets) * * Also need a few nested datatypes, such as vector of vectors * Do the versions in Using MPI *  *//* * Routines to create dataloops for basic dataloops *//* *  Contig */MPID_Dataloop *MPID_Dataloop_init_contig( int count ){    MPID_Dataloop *ct;        ct = (MPID_Dataloop *)MPIU_Malloc( sizeof(MPID_Dataloop ) );    ct->kind                     = MPID_DTYPE_CONTIG | DATALOOP_FINAL_MASK;    ct->loop_params.c_t.count    = count;    ct->loop_params.c_t.dataloop = 0;    ct->extent                   = count;    ct->handle                       = 0;    return ct;}/* * Vector */MPID_Dataloop *MPID_Dataloop_init_vector( int count, int blocksize, 					  int stride ){    MPID_Dataloop *v;    v = (MPID_Dataloop *)MPIU_Malloc( sizeof(MPID_Dataloop) );    v->kind                      = MPID_DTYPE_VECTOR | DATALOOP_FINAL_MASK;    v->loop_params.v_t.count     = count;    v->loop_params.v_t.blocksize = blocksize;    v->loop_params.v_t.stride    = stride;    v->loop_params.v_t.dataloop  = 0;    v->extent                    = (count-1)*stride + blocksize;    v->handle                        = 0;    return v;}/*  * Block indexed */MPID_Dataloop *MPID_Dataloop_init_blockindexed( int count, int blocksize, 						MPI_Aint *offset ){    MPID_Dataloop *bi;    MPI_Aint      extent;    int           i;    bi = (MPID_Dataloop *)MPIU_Malloc( sizeof(MPID_Dataloop) );    bi->kind                       = MPID_DTYPE_BLOCKINDEXED | DATALOOP_FINAL_MASK;    bi->loop_params.bi_t.count     = count;    bi->loop_params.bi_t.blocksize = blocksize;    bi->loop_params.bi_t.offset    = 	(MPI_Aint *)MPIU_Malloc( sizeof(MPI_Aint) * count );    for (i=0; i<count; i++) {	bi->loop_params.bi_t.offset[i] = offset[i];	if (offset[i] + blocksize > extent) 	    extent = offset[i] + blocksize;    }    bi->loop_params.bi_t.dataloop  = 0;    bi->extent                     = extent;    bi->handle                         = 0;    return bi;}/* * Indexed  */MPID_Dataloop *MPID_Dataloop_init_indexed( int count, int *blocksize, 					   MPI_Aint *offset ){    MPID_Dataloop *it;    MPI_Aint      extent = 0;    int           i;    it = (MPID_Dataloop *)MPIU_Malloc( sizeof(MPID_Dataloop) );    it->kind                      = MPID_DTYPE_INDEXED | DATALOOP_FINAL_MASK;    it->loop_params.i_t.count     = count;    it->loop_params.i_t.blocksize = (int *)MPIU_Malloc( sizeof(int) * count );    it->loop_params.i_t.offset    = 	(MPI_Aint *)MPIU_Malloc( sizeof(MPI_Aint) * count );    for (i=0; i<count; i++) {	it->loop_params.i_t.offset[i]    = offset[i];	it->loop_params.i_t.blocksize[i] = blocksize[i];	if (offset[i] + blocksize[i] > extent) 	    extent = offset[i] + blocksize[i];    }    it->loop_params.i_t.dataloop  = 0;    it->extent                    = extent;    it->handle                        = 0;    return it;}int main( int argc, char **argv ){    /* MPID_Dataloop *vecloop; */    MPI_Datatype vectype;    int count=200, blocksize=4, stride = 7*4;    char *src_buf, *dest_buf;    int  i,j,k;    double r1, r2;    MPI_Init( &argc, &argv );    /*    vecloop = MPID_Dataloop_init_vector( count, blocksize, stride ); */    MPI_Type_vector( count, 1, 7, MPI_INT, &vectype );    /* Initialize the data */    src_buf = (char *)MPIU_Malloc( (count - 1) * stride + blocksize );    for (i=0; i<(count-1)*stride+blocksize; i++) 	src_buf[i] = -i;    for (i=0; i<count; i++) {	for (j=0; j<blocksize; j++) 	    src_buf[i*stride+j] = i*blocksize + j;    }    dest_buf = (char *)MPIU_Malloc( count*blocksize );    for (i=0; i<count*blocksize; i++) {	dest_buf[i] = -i;    }    r1 = MPI_Wtime();    for (i=0; i<100; i++) {	int position = 0;	/*MPID_Segment_pack( vecloop, src_buf, dest_buf );*/	MPI_Pack( src_buf, count, vectype, dest_buf, count*blocksize, 		  &position, MPI_COMM_WORLD );    }    r2 = MPI_Wtime();    printf( "Timer for vector pack is %e\n", (r2-r1)/100 );    for (i=0; i<count*blocksize; i++) {	if (dest_buf[i] != (char)i) { 	    printf( "Error at location %d\n", i );	}    }    r1 = MPI_Wtime();    for (k=0; k<100; k++) {	char *dest=dest_buf, *src=src_buf;	for (i=0; i<count; i++) {	    for (j=0; j<blocksize; j++) 		*dest++ = src[j];	    src+= stride;	}    }    r2 = MPI_Wtime();    printf( "Timer for hand vector pack is %e\n", (r2-r1)/100 );    r1 = MPI_Wtime();    for (k=0; k<100; k++) {	int *dest=(int*)dest_buf, *src=(int*)src_buf;	int bsize = blocksize >> 2;	int istride = stride >> 2;	if (bsize == 1) { 	    for (i=0; i<count; i++) {		*dest++ = *src;		src+= istride;	    }	}	else {	    for (i=0; i<count; i++) {		for (j=0; j<bsize; j++) 		    *dest++ = src[j];		src+= istride;	    }	}    }    r2 = MPI_Wtime();    printf( "Timer for hand vector pack (int) is %e\n", (r2-r1)/100 );        MPI_Finalize();    return 0;}/* * Nested vector. *   The y-z subface is *   Type_vector( ey-sy+1, 1, nx, MPI_DOUBLE, &newx1 ); *   Type_hvector( ez-sz+1, 1, nx*ny_sizeof(double), newx1, &newx ); * This gives the a(i,sy:ey,sz:ez) of a(nx,ny,nz) (in Fortran notation) */

⌨️ 快捷键说明

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