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

📄 subarray-pack.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 2 页
字号:
 */int subarray_4d_c_test1(void){    MPI_Datatype subarray;    int array[] = {	-1111, -1112, -1113, -1114, -1115, -1116,	-1121, -1122, -1123, -1124, -1125, -1126,	-1131, -1132, -1133, -1134, -1135, -1136,	-1211, -1212, -1213, -1214, -1215, -1216,	-1221, -1222, -1223, -1224, -1225, -1226,	-1231, -1232, -1233, -1234, -1235, -1236,	-2111, -2112, -2113, -2114,     1, -2116,	-2121, -2122, -2123, -2124,     2, -2126,	-2131, -2132, -2133, -2134,     3, -2136,	-2211, -2212, -2213, -2214,     4, -2216,	-2221, -2222, -2223, -2224,     5, -2226,	-2231, -2232, -2233, -2234,     6, -2236    };        int array_size[4] = {2, 2, 3, 6};    int array_subsize[4] = {1, 2, 3, 1};    int array_start[4] = {1, 0, 0, 4};    int i, err, errs = 0, sizeoftype;    /* set up type */    err = MPI_Type_create_subarray(4, /* dims */				   array_size,				   array_subsize,				   array_start,				   MPI_ORDER_C,				   MPI_INT,				   &subarray);    if (err != MPI_SUCCESS) {	errs++;	if (verbose) {	    fprintf(stderr,		    "error in MPI_Type_create_subarray call; aborting after %d errors\n",		    errs);	}	return errs;    }    MPI_Type_commit(&subarray);    MPI_Type_size(subarray, &sizeoftype);    if (sizeoftype != 6*sizeof(int)) {	errs++;	if (verbose) fprintf(stderr, "size of type = %d; should be %d\n",			     sizeoftype, (int) (6*sizeof(int)));	return errs;    }    err = pack_and_unpack((char *) array, 1, subarray, 72*sizeof(int));    for (i=0; i < 72; i++) {	int goodval;	switch (i) {	    case 40:		goodval = 1;		break;	    case 46:		goodval = 2;		break;	    case 52:		goodval = 3;		break;	    case 58:		goodval = 4;		break;	    case 64:		goodval = 5;		break;	    case 70:		goodval = 6;		break;	    default:		goodval = 0;		break;	}	if (array[i] != goodval) {	    errs++;	    if (verbose) fprintf(stderr, "array[%d] = %d; should be %d\n",				 i, array[i], goodval);	}    }    MPI_Type_free(&subarray);    return errs;}/* subarray_4d_fortran_test1() * * Returns the number of errors encountered. */int subarray_4d_fortran_test1(void){    MPI_Datatype subarray;    int array[] = {	-1111, -1112, -1113, -1114, -1115, -1116,	-1121, -1122, -1123, -1124, -1125, -1126,	-1131, -1132, -1133, -1134, -1135, -1136,	-1211, -1212, -1213, -1214, -1215, -1216,	-1221, -1222, -1223, -1224, -1225, -1226,	-1231, -1232, -1233, -1234, -1235, -1236,	-2111, -2112, -2113, -2114,     1, -2116,	-2121, -2122, -2123, -2124,     2, -2126,	-2131, -2132, -2133, -2134,     3, -2136,	-2211, -2212, -2213, -2214,     4, -2216,	-2221, -2222, -2223, -2224,     5, -2226,	-2231, -2232, -2233, -2234,     6, -2236    };        int array_size[4] = {6, 3, 2, 2};    int array_subsize[4] = {1, 3, 2, 1};    int array_start[4] = {4, 0, 0, 1};    int i, err, errs = 0, sizeoftype;    /* set up type */    err = MPI_Type_create_subarray(4, /* dims */				   array_size,				   array_subsize,				   array_start,				   MPI_ORDER_FORTRAN,				   MPI_INT,				   &subarray);    if (err != MPI_SUCCESS) {	errs++;	if (verbose) {	    fprintf(stderr,		    "error in MPI_Type_create_subarray call; aborting after %d errors\n",		    errs);	}	return errs;    }    MPI_Type_commit(&subarray);    MPI_Type_size(subarray, &sizeoftype);    if (sizeoftype != 6*sizeof(int)) {	errs++;	if (verbose) fprintf(stderr, "size of type = %d; should be %d\n",			     sizeoftype, (int) (6*sizeof(int)));	return errs;    }    err = pack_and_unpack((char *) array, 1, subarray, 72*sizeof(int));    for (i=0; i < 72; i++) {	int goodval;	switch (i) {	    case 40:		goodval = 1;		break;	    case 46:		goodval = 2;		break;	    case 52:		goodval = 3;		break;	    case 58:		goodval = 4;		break;	    case 64:		goodval = 5;		break;	    case 70:		goodval = 6;		break;	    default:		goodval = 0;		break;	}	if (array[i] != goodval) {	    errs++;	    if (verbose) fprintf(stderr, "array[%d] = %d; should be %d\n",				 i, array[i], goodval);	}    }    MPI_Type_free(&subarray);    return errs;}/* subarray_2d_fortran_test1() * * Returns the number of errors encountered. */int subarray_2d_fortran_test1(void){    MPI_Datatype subarray;    int array[12] = { -1, -2, -3, -4,  1,   2,		      -5, -6, -7, -8, -9, -10 };    int array_size[2] = {6, 2};    int array_subsize[2] = {2, 1};    int array_start[2] = {4, 0};    int i, err, errs = 0, sizeoftype;    /* set up type */    err = MPI_Type_create_subarray(2, /* dims */				   array_size,				   array_subsize,				   array_start,				   MPI_ORDER_FORTRAN,				   MPI_INT,				   &subarray);    if (err != MPI_SUCCESS) {	errs++;	if (verbose) {	    fprintf(stderr,		    "error in MPI_Type_create_subarray call; aborting after %d errors\n",		    errs);	}	return errs;    }    MPI_Type_commit(&subarray);    MPI_Type_size(subarray, &sizeoftype);    if (sizeoftype != 2*sizeof(int)) {	errs++;	if (verbose) fprintf(stderr, "size of type = %d; should be %d\n",			     sizeoftype, (int) (2*sizeof(int)));	return errs;    }    err = pack_and_unpack((char *) array, 1, subarray, 12*sizeof(int));    for (i=0; i < 12; i++) {	int goodval;	switch (i) {	    case 4:		goodval = 1;		break;	    case 5:		goodval = 2;		break;	    default:		goodval = 0;		break;	}	if (array[i] != goodval) {	    errs++;	    if (verbose) fprintf(stderr, "array[%d] = %d; should be %d\n",				 i, array[i], goodval);	}    }    MPI_Type_free(&subarray);    return errs;}/******************************************************************//* pack_and_unpack() * * Perform packing and unpacking of a buffer for the purposes of checking * to see if we are processing a type correctly.  Zeros the buffer between * these two operations, so the data described by the type should be in * place upon return but all other regions of the buffer should be zero. * * Parameters: * typebuf - pointer to buffer described by datatype and count that *           will be packed and then unpacked into * count, datatype - description of typebuf * typebufsz - size of typebuf; used specifically to zero the buffer *             between the pack and unpack steps * */static int pack_and_unpack(char *typebuf,			   int count,			   MPI_Datatype datatype,			   int typebufsz){    char *packbuf;    int err, errs = 0, pack_size, type_size, position;    err = MPI_Type_size(datatype, &type_size);    if (err != MPI_SUCCESS) {	errs++;	if (verbose) {	    fprintf(stderr,		    "error in MPI_Type_size call; aborting after %d errors\n",		    errs);	}	return errs;    }    type_size *= count;    err = MPI_Pack_size(count, datatype, MPI_COMM_SELF, &pack_size);    if (err != MPI_SUCCESS) {	errs++;	if (verbose) {	    fprintf(stderr,		    "error in MPI_Pack_size call; aborting after %d errors\n",		    errs);	}	return errs;    }    packbuf = (char *) malloc(pack_size);    if (packbuf == NULL) {	errs++;	if (verbose) {	    fprintf(stderr,		    "error in malloc call; aborting after %d errors\n",		    errs);	}	return errs;    }    position = 0;    err = MPI_Pack(typebuf,		   count,		   datatype,		   packbuf,		   type_size,		   &position,		   MPI_COMM_SELF);    if (position != type_size) {	errs++;	if (verbose) fprintf(stderr, "position = %d; should be %d (pack)\n",			     position, type_size);    }    memset(typebuf, 0, typebufsz);    position = 0;    err = MPI_Unpack(packbuf,		     type_size,		     &position,		     typebuf,		     count,		     datatype,		     MPI_COMM_SELF);    if (err != MPI_SUCCESS) {	errs++;	if (verbose) {	    fprintf(stderr,		    "error in MPI_Unpack call; aborting after %d errors\n",		    errs);	}	return errs;    }    free(packbuf);    if (position != type_size) {	errs++;	if (verbose) fprintf(stderr, "position = %d; should be %d (unpack)\n",			     position, type_size);    }    return errs;}static int parse_args(int argc, char **argv){    /*    int ret;    while ((ret = getopt(argc, argv, "v")) >= 0)    {	switch (ret) {	    case 'v':		verbose = 1;		break;	}    }    */    if (argc > 1 && strcmp(argv[1], "-v") == 0)	verbose = 1;    return 0;}

⌨️ 快捷键说明

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