[PVFS2-CVS] commit by robl in pvfs2-1/test/client/mpi-io: op_test.c module.mk.in

CVS commit program cvs at parl.clemson.edu
Tue Mar 2 18:59:37 EST 2004


Update of /projects/cvsroot/pvfs2-1/test/client/mpi-io
In directory acid:/tmp/cvs-serv31978

Modified Files:
	module.mk.in 
Added Files:
	op_test.c 
Log Message:
an mpi-io test to measure PVFS2 scalable io operations (create, open, resize)


--- /dev/null	Sat Mar 23 14:46:34 2002
+++ op_test.c	Tue Mar  2 18:59:37 2004
@@ -0,0 +1,207 @@
+/*
+ * Joe insley reported slow open behavior.  Let's find out what is going on
+ * when an application opens a bunch of files 
+ *
+ * This can be further extented to test open behavior across several file
+ * systems ( pvfs, pvfs2, nfs, testfs )
+ *
+ * The timing and command-line parsing were so useful that this was further
+ * extended to test resize operations
+ *
+ * usage:  -d /path/to/directory -n number_of_files [-O] [-R]
+ */
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <limits.h>
+
+#include <mpi.h>
+
+#ifndef PATH_MAX
+#define PATH_MAX FILENAME_MAX
+#endif
+
+extern char *optarg;
+int opt_nfiles;
+char opt_basedir[PATH_MAX];
+int opt_do_open=0;
+int opt_do_resize=0;
+
+void usage(char *name);
+int parse_args(int argc, char **argv);
+void handle_error(int errcode, char *str);
+int test_opens(int nfiles, char * test_dir, MPI_Info info);
+int test_resize(int rank, unsigned int seed, int iterations, 
+		char * test_dir, MPI_Info info);
+
+void usage(char *name)
+{
+	fprintf(stderr, "usage: %s -d /path/to/directory -n #_of_files [TEST}\n", name);
+	fprintf(stderr, "   where TEST is one of:\n"
+			"     -O       test file open times\n"
+			"     -R       test file resize times\n");
+
+		exit(-1);
+}
+int parse_args(int argc, char **argv)
+{
+	int c;
+	while ( (c = getopt(argc, argv, "d:n:OR")) != -1 ) {
+		switch (c) {
+			case 'd':
+				strncpy(opt_basedir, optarg, PATH_MAX);
+				break;
+			case 'n':
+				opt_nfiles = atoi(optarg);
+				break;
+			case 'O':
+				opt_do_open = 1;
+				break;
+			case 'R':
+				opt_do_resize = 1;
+				break;
+			case '?':
+			case ':':
+			default:
+				usage(argv[0]);
+		}
+	}
+	if ( (opt_do_open == 0) && (opt_do_resize == 0) ) {
+		usage(argv[0]);
+	}
+	return 0;
+}
+
+void handle_error(int errcode, char *str)
+{
+        char msg[MPI_MAX_ERROR_STRING];
+        int resultlen;
+        MPI_Error_string(errcode, msg, &resultlen);
+        fprintf(stderr, "%s: %s\n", str, msg);
+        MPI_Abort(MPI_COMM_WORLD, 1);
+}
+
+
+int main(int argc, char **argv)
+{
+	int rank, nprocs;
+	MPI_Info info;
+	double test_start, test_end;
+	double test_time, total_time;
+	pid_t	seed; 	/* for tests that need some pseudorandomness */
+
+	MPI_Init(&argc, &argv);
+	MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+	MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
+
+
+	parse_args(argc, argv);
+
+	/* provide hints if you want  */
+	info = MPI_INFO_NULL;
+
+	/* we want some semblance of randomness, yet want all processors to
+	 * have the same values.  everyone's got to seed w/ the same value */
+	if (rank == 0) 
+		seed = getpid();
+
+	MPI_Bcast(&seed, sizeof(pid_t), MPI_BYTE, 0, MPI_COMM_WORLD);
+
+	test_start = MPI_Wtime();
+	if (opt_do_open)
+		test_opens(opt_nfiles, opt_basedir, info);
+	else if (opt_do_resize)
+		test_resize(rank, seed, opt_nfiles, opt_basedir, info);
+
+	test_end = MPI_Wtime();
+	test_time = test_end - test_start;
+	MPI_Allreduce(&test_time, &total_time, 1, 
+			MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
+	MPI_Finalize();
+
+	if (rank == 0) {
+		if (opt_do_open) {
+			printf("%f seconds to open %d files: %f secs/open\n", 
+					total_time, opt_nfiles, 
+					(total_time)/opt_nfiles);
+		} else if (opt_do_resize) {
+			printf("%f seconds to perform %d resize ops: %f secs/opeeration\n", 
+					total_time, opt_nfiles, 
+					(total_time)/opt_nfiles);
+		}
+			
+	}
+	return 0;
+}
+
+/* in directory 'test_dir', open and immediately close 'nfiles' files */
+/* a possible variant: open all the files first, then close */
+/* also test MPI_File_open behavior when there are a ton of files */
+int test_opens(int nfiles, char * test_dir, MPI_Info info)
+{
+	int i;
+	char test_file[PATH_MAX];
+	MPI_File fh;
+	int errcode;
+
+	for (i=0; i<nfiles; i++) {
+		snprintf(test_file, PATH_MAX, "%s/testfile.%d", test_dir, i);
+		errcode = MPI_File_open(MPI_COMM_WORLD, test_file, 
+				MPI_MODE_CREATE|MPI_MODE_RDWR, info, &fh);
+		if (errcode != MPI_SUCCESS) {
+			handle_error(errcode, "MPI_File_open");
+		}
+		errcode = MPI_File_close(&fh);
+		if (errcode != MPI_SUCCESS) {
+			handle_error(errcode, "MPI_File_close");
+		}
+
+	}
+	/* since handle_error aborts, if we got here we are a-ok */
+	return 0;
+}
+
+/* stuff these into separate object files. have a structure that provides a
+ * test() and result() function and a .time member */
+
+/* inside directory 'test_dir', create a file and resize it to 'iterations'
+ * different sizes */
+
+/* pass in a seed for the pseudorandom number generator: not fair to add the
+ * cost of MPI_Bcast to the resize operation */
+
+int test_resize(int rank, unsigned int seed, int iterations, 
+		char * test_dir, MPI_Info info)
+{
+	int i;
+	char test_file[PATH_MAX];
+	MPI_File fh;
+	int errcode;
+	MPI_Offset size;
+
+	snprintf(test_file, PATH_MAX, "%s/testfile", test_dir);
+	errcode = MPI_File_open(MPI_COMM_WORLD, test_file, 
+			MPI_MODE_CREATE|MPI_MODE_RDWR, info, &fh);
+	if (errcode != MPI_SUCCESS) {
+		handle_error(errcode, "MPI_File_open");
+	}
+	srand(seed);
+
+	for(i=0; i<iterations; i++) {
+		size = rand();
+		printf("resizing file to %Ld bytes\n", size);
+		errcode = MPI_File_set_size(fh, size);
+		if (errcode != MPI_SUCCESS) {
+			handle_error(errcode, "MPI_File_set_size");
+		}
+	}
+
+	errcode = MPI_File_close(&fh);
+	if (errcode != MPI_SUCCESS) {
+		handle_error(errcode, "MPI_File_close");
+	}
+	return 0;
+}

Index: module.mk.in
===================================================================
RCS file: /projects/cvsroot/pvfs2-1/test/client/mpi-io/module.mk.in,v
diff -u -w -p -u -r1.2 -r1.3
--- module.mk.in	22 Sep 2003 12:20:41 -0000	1.2
+++ module.mk.in	2 Mar 2004 23:59:37 -0000	1.3
@@ -1,4 +1,5 @@
 DIR := test/client/mpi-io
 
 MPIIOTESTSRC += \
-	$(DIR)/mpi-io-test.c
+	$(DIR)/mpi-io-test.c \
+	$(DIR)/op_test.c



More information about the PVFS2-CVS mailing list