]> git.somenet.org - pub/jan/parprog.git/blob - openmp/prefix/prefix.c
hillis: implemented partial prefix sums algorithm
[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         printf ("[%li", array[0]);
24         for (unsigned long i = 1; i < size; i++) {
25                 printf (", %li", array[i]);
26         }
27         printf ("]\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; //TODO: uncomment after reading file is implemented!
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. TODO */
94         size = n-1;
95         for (size = 0; size < n; size++) {
96                 numarray[size] = 10;
97         }
98         fprintf(stderr, "TODO: file read (set all = 10 for now) - ready.\n");
99
100 #ifdef DEBUG
101         /* might want to comment this out, if numarray is big */
102         array_contents(numarray, size);
103 #endif
104
105         printf("init done starting algorithm. size: %li\n", size);
106         startTime = omp_get_wtime();
107         algorithm(numarray, size, NULL);
108         endTime = omp_get_wtime();
109         printf("DONE. took %f seconds.\n", endTime-startTime);
110         printf ("result: %li\n", numarray[size-1]);
111
112 #ifdef DEBUG
113         /* might want to comment this out, if numarray is big */
114         array_contents(numarray, size);
115 #endif
116
117         return 0;
118 }