]> git.somenet.org - pub/jan/parprog.git/blob - openmp/prefix/prefix.c
runAll now generates numlist.bin
[pub/jan/parprog.git] / openmp / prefix / prefix.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <ctype.h>
4 #include <getopt.h>
5 #include <unistd.h>
6 #include <sys/stat.h>
7 #include <omp.h>
8 #include "prefix.h"
9
10 /* This one's binary name. */
11 char* binname = "unset";
12
13
14 void usage () {
15         fprintf (stderr, "\nUsage: %s [-f <string>] [-n <number>]\n", binname);
16         fprintf (stderr, "\t -f: set the filename of the randfile. (defaults to \"numlist.bin\")\n");
17         fprintf (stderr, "\t -n: set the number count to read from randfile. (defaults to -1 = read all)\n");
18         fprintf (stderr, "\nThis application prints only TIME-INFO to stdout. Everything else goes to stderr.\n");
19         exit(1);
20 }
21
22 void array_contents(numtype array[], unsigned long size) {
23         fprintf (stderr, "[%li", array[0]);
24         for (unsigned long i = 1; i < size; i++) {
25                 fprintf (stderr, ", %li", array[i]);
26         }
27         fprintf (stderr, "]\n");
28 }
29
30
31 int main (int argc, char* argv[]) {
32         FILE *file = NULL;
33         unsigned long size;
34         numtype *numarray;
35         //unsigned int countarray[NUMBERS];
36         double startTime, endTime;
37
38         /* options */
39         unsigned long n = -1;
40         char *filename = "numlist.bin";
41
42         /* store out name for usage(); */
43         binname = argv[0];
44
45         /* getopt stuff */
46         int c;
47         opterr = 0;
48         while ((c = getopt (argc, argv, "n:f:")) != -1) switch (c){
49                 case 'n':
50                         n = strtoul (optarg,NULL,0);
51                         break;
52                 case 'f':
53                         filename = optarg;
54                         break;
55                 case '?':
56                         if (optopt == 'f' || optopt == 'n')
57                                 fprintf (stderr, "Option -%c requires an argument.\n", optopt);
58                         else if (isprint (optopt))
59                                 fprintf (stderr, "Unknown option `-%c'.\n", optopt);
60                         else
61                                 fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt);
62                         usage();
63                 default:
64                         usage();
65         }
66
67         /* sanize n. */
68         if ((file = fopen(filename, "r"))) {
69                 fclose(file);
70                 file = NULL;
71                 struct stat st;
72                 stat(filename, &st);
73                 size = st.st_size;
74                 if (n == -1 || n > size){
75                         n = size;
76                 }
77         }else{
78                 fprintf (stderr, "File %s does not exist.\n", filename);
79                 usage();
80         }
81
82         /* print info and start reading file. */
83         fprintf(stderr, "Will read %li numbers from \"%s\".\n", n, filename);
84
85         numarray = malloc(n * sizeof(numtype));
86         if(numarray == NULL) {
87                 fprintf(stderr, "malloc for numarray failed.\n");
88                 exit(2);
89         } else {
90                 fprintf(stderr, "malloc for numarray sucessful.\n");
91         }
92
93         /* read file. */
94         if ((file = fopen(filename, "r"))) {
95                 for (size = 0; size < n; size++) {
96                         numarray[size] = fgetc(file);
97                 }
98                 fclose(file);
99         }else{
100                 fprintf (stderr, "File %s could not be read.\n", filename);
101                 usage();
102         }
103
104         fprintf(stderr, "file read - ready.\n");
105
106 #ifdef DEBUG
107         /* might want to comment this out, if numarray is big */
108         array_contents(numarray, size);
109 #endif
110
111         fprintf(stderr, "init done starting algorithm. size: %li\n", size);
112         startTime = omp_get_wtime();
113         algorithm(numarray, size, NULL);
114         endTime = omp_get_wtime();
115         fprintf(stdout, "binname=%s size=%li time=%f result=%li\n", binname, size, endTime-startTime, numarray[size-1]);
116
117 #ifdef DEBUG
118         /* might want to comment this out, if numarray is big */
119         array_contents(numarray, size);
120 #endif
121
122         return 0;
123 }