From 86f4131144bc92af64048cc071ff251714bddf8a Mon Sep 17 00:00:00 2001
From: "enzo.decarvalhobittencourt" <ezdecarvalho@gmail.com>
Date: Mon, 11 Dec 2023 14:46:18 +0100
Subject: [PATCH] First simple omp optimization (slower on small tests)

---
 Projet/CODE/apm/Makefile       |   8 ++-
 Projet/CODE/apm/src/.apm.c.swp | Bin 16384 -> 0 bytes
 Projet/CODE/apm/src/apm_omp.c  | 127 +++++++++++++++------------------
 3 files changed, 64 insertions(+), 71 deletions(-)
 delete mode 100644 Projet/CODE/apm/src/.apm.c.swp

diff --git a/Projet/CODE/apm/Makefile b/Projet/CODE/apm/Makefile
index ecb8e18..5e1a686 100644
--- a/Projet/CODE/apm/Makefile
+++ b/Projet/CODE/apm/Makefile
@@ -1,7 +1,8 @@
-ICLUDED=include
+INCLUDED=include
 
 CC=gcc
 CFLAGS=-O3 -I $(INCLUDED) -pg -g
+CFLAGS_OMP= -fopenmp -DUSE_OMP $(CFLAGS)
 LDFLAGS=
 
 OBJ=obj/apm.o
@@ -12,6 +13,9 @@ all: dir apm apm_omp #apm_gpu
 dir:
 	mkdir -p obj
 
+obj/apm_omp.o : src/apm_omp.c
+	$(CC) $(CFLAGS_OMP) -c -o $@ $^
+
 obj/%.o: src/%.c
 	$(CC) $(CFLAGS) -c -o $@ $^
 
@@ -19,7 +23,7 @@ apm: obj/apm.o
 	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^
 
 apm_omp: obj/apm_omp.o
-	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^
+	$(CC) $(CFLAGS_OMP) $(LDFLAGS) -o $@ $^
 
 apm_gpu:
 	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^
diff --git a/Projet/CODE/apm/src/.apm.c.swp b/Projet/CODE/apm/src/.apm.c.swp
deleted file mode 100644
index 28e989bebdb020ae307b90cfb0a208c9ff1045df..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 16384
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
F?7!h%*zN!T

diff --git a/Projet/CODE/apm/src/apm_omp.c b/Projet/CODE/apm/src/apm_omp.c
index f5db3e5..d40a9cd 100644
--- a/Projet/CODE/apm/src/apm_omp.c
+++ b/Projet/CODE/apm/src/apm_omp.c
@@ -1,6 +1,7 @@
 /**
  * APPROXIMATE PATTERN MATCHING
  *
+ * INF560 X2016
  */
 #include <string.h>
 #include <stdio.h>
@@ -9,12 +10,13 @@
 #include <unistd.h>
 #include <sys/time.h>
 
+#include "omp.h"
+
 #define APM_DEBUG 0
 
-char *
-read_input_file(char *filename, int *size)
+char * read_input_file(char * filename, int * size)
 {
-    char *buf;
+    char * buf;
     off_t fsize;
     int fd = 0;
     int n_bytes = 1;
@@ -30,7 +32,6 @@ read_input_file(char *filename, int *size)
     /* Get the number of characters in the textfile */
     fsize = lseek(fd, 0, SEEK_END);
     lseek(fd, 0, SEEK_SET);
-
     /* TODO check return of lseek */
 
 #if APM_DEBUG
@@ -38,11 +39,11 @@ read_input_file(char *filename, int *size)
 #endif
 
     /* Allocate data to copy the target text */
-    buf = (char *) malloc(fsize * sizeof (char));
+    buf = (char *)malloc(fsize * sizeof (char));
     if (buf == NULL)
     {
         fprintf(stderr, "Unable to allocate %lld byte(s) for main array\n",
-                fsize);
+                 fsize);
         return NULL;
     }
 
@@ -50,8 +51,8 @@ read_input_file(char *filename, int *size)
     if (n_bytes != fsize)
     {
         fprintf(stderr,
-                "Unable to copy %lld byte(s) from text file (%d byte(s) copied)\n",
-                fsize, n_bytes);
+          "Unable to copy %lld byte(s) from text file (%d byte(s) copied)\n",
+          fsize, n_bytes);
         return NULL;
     }
 
@@ -60,18 +61,13 @@ read_input_file(char *filename, int *size)
 #endif
 
     *size = n_bytes;
-
     close(fd);
-
     return buf;
 }
 
+#define MIN3(a, b, c) ((a)<(b) ? ((a)<(c) ? (a) : (c)) : ((b)<(c) ? (b) : (c)))
 
-#define MIN3(a, b, c)\
-	((a) < (b) ? ((a) < (c) ? (a) : (c)) : ((b) < (c) ? (b) : (c)))
-
-int
-levenshtein(char *s1, char *s2, int len, int * column)
+int levenshtein(char *s1, char *s2, int len, int * column)
 {
     unsigned int x, y, lastdiag, olddiag;
 
@@ -82,15 +78,13 @@ levenshtein(char *s1, char *s2, int len, int * column)
     for (x = 1; x <= len; x++)
     {
         column[0] = x;
-        lastdiag = x-1 ;
+        lastdiag = x-1;
         for (y = 1; y <= len; y++)
         {
             olddiag = column[y];
-            column[y] = MIN3(
-                            column[y] + 1,
+            column[y] = MIN3(column[y] + 1,
                             column[y-1] + 1,
-                            lastdiag + (s1[y-1] == s2[x-1] ? 0 : 1)
-                        );
+                            lastdiag + (s1[y-1] == s2[x-1] ? 0 : 1));
             lastdiag = olddiag;
         }
     }
@@ -98,87 +92,79 @@ levenshtein(char *s1, char *s2, int len, int * column)
 }
 
 
-int
-main(int argc, char **argv)
+int main(int argc, char ** argv)
 {
-    char **pattern;
-    char *filename;
+    char ** pattern;
+    char * filename;
     int approx_factor = 0;
     int nb_patterns = 0;
     int i, j;
-    char *buf;
+    char * buf;
     struct timeval t1, t2;
     double duration;
     int n_bytes;
-    int *n_matches;
+    int * n_matches;
 
     /* Check number of arguments */
     if (argc < 4)
     {
         printf("Usage: %s approximation_factor "
-               "dna_database pattern1 pattern2 ...\n",
-               argv[0]);
+                "dna_database pattern1 pattern2 ...\n",
+                argv[0]);
         return 1;
     }
 
-    /* Get the distance factor */
-    approx_factor = atoi(argv[1]);
-
-    /* Grab the filename containing the target text */
-    filename = argv[2];
-
-    /* Get the number of patterns that the user wants to search for */
-    nb_patterns = argc - 3;
-
-    /* Fill the pattern array */
-    pattern = (char **)malloc(nb_patterns * sizeof(char *));
-    if (pattern == NULL)
+    approx_factor = atoi(argv[1]);/* Get the distance factor */
+    filename = argv[2];/* Grab the filename containing the target text */
+    nb_patterns = argc - 3;/* Get the number of patterns to search for */
+    
+		pattern = (char **)malloc(nb_patterns * sizeof(char*));    
+		if (pattern == NULL)/*Fill the pattern*/
     {
         fprintf(stderr,
-                "Unable to allocate array of pattern of size %d\n",
-                nb_patterns );
+                 "Unable to allocate array of pattern of size %d\n",
+                 nb_patterns);
         return 1;
     }
 
-    /* Grab the patterns */
-    for (i = 0; i < nb_patterns; i++)
+    for (i=0; i < nb_patterns; i++) /* Grab the patterns */
     {
         int l;
-
         l = strlen(argv[i+3]);
-        if (l <= 0)
+    
+				if (l <= 0)
         {
-            fprintf(stderr, "Error while parsing argument %d\n", i + 3);
+            fprintf(stderr, "Error while parsing argument %d\n", i+3);
             return 1;
         }
-
-        pattern[i] = (char *) malloc((l+1) * sizeof(char));
+        
+				pattern[i] = (char *)malloc((l+1) * sizeof(char));
         if (pattern[i] == NULL)
         {
             fprintf(stderr, "Unable to allocate string of size %d\n", l);
             return 1;
         }
 
-        strncpy(pattern[i], argv[i + 3], (l + 1));
+        strncpy(pattern[i], argv[i+3], (l+1));
     }
 
 
     printf("Approximate Pattern Mathing: "
-           "looking for %d pattern(s) in file %s w/ distance of %d\n",
-           nb_patterns, filename, approx_factor);
+            "looking for %d pattern(s) in file %s w/ distance of %d\n",
+            nb_patterns, filename, approx_factor);
 
     buf = read_input_file(filename, &n_bytes);
     if (buf == NULL)
     {
+				fprintf(stderr, "Error: NULL pointer from reading input file.");
         return 1;
     }
 
-    /* Allocate the array of matches */
-    n_matches = (int *) malloc(nb_patterns * sizeof(int));
+    n_matches = (int *)malloc(nb_patterns * sizeof(int));/*Alloc the matches*/
     if (n_matches == NULL)
     {
         fprintf(stderr, "Error: unable to allocate memory for %ldB\n",
-                nb_patterns * sizeof(int));
+                 nb_patterns * sizeof(int));
         return 1;
     }
 
@@ -191,26 +177,25 @@ main(int argc, char **argv)
 
     for (i = 0; i < nb_patterns; i++)
     {
-
         int size_pattern = strlen(pattern[i]);
-
         int * column;
+				int distance = 0;
 
         n_matches[i] = 0;
 
-        column = (int *) malloc((size_pattern + 1) * sizeof(int));
+        column = (int *)malloc((size_pattern+1) * n_bytes * sizeof(int));
         if (column == NULL)
         {
-            fprintf(stderr, "Error: unable to allocate memory for column "
-                    "(%ldB)\n",
-                    (size_pattern + 1) * sizeof(int));
+            fprintf(stderr, 
+								"Error: unable to allocate memory for column (%ldB)\n",
+                (size_pattern+1) * sizeof(int));
             return 1;
         }
 
+				int matches = 0;
+				#pragma omp parallel for reduction(+:matches) private(distance)
         for (j = 0; j < n_bytes; j++)
         {
-            int distance = 0;
-            int size;
 
 #if APM_DEBUG
             if (j % 100 == 0)
@@ -219,27 +204,31 @@ main(int argc, char **argv)
             }
 #endif
 
-            size = size_pattern;
+            size_pattern;
             if (n_bytes - j < size_pattern)
             {
-                size = n_bytes - j;
+                //size = n_bytes - j; 
+								//NO ! we do not want to match substring of our input, wth
+								continue;
             }
 
-            distance = levenshtein(pattern[i], &buf[j], size, column);
+            distance = levenshtein(pattern[i], &buf[j], size_pattern, 
+								column+(j*(size_pattern+1)));
 
             if (distance <= approx_factor)
             {
-                n_matches[i]++;
+                matches++;
             }
         }
 
+				n_matches[i] = matches; 
         free(column);
     }
 
     /* Timer stop */
     gettimeofday(&t2, NULL);
 
-    duration = (t2.tv_sec - t1.tv_sec) + ((t2.tv_usec - t1.tv_usec) / 1e6);
+    duration = (t2.tv_sec -t1.tv_sec)+((t2.tv_usec-t1.tv_usec)/1e6);
 
     printf("APM done in %lf s\n", duration);
 
@@ -250,7 +239,7 @@ main(int argc, char **argv)
     for (i = 0; i < nb_patterns; i++)
     {
         printf("Number of matches for pattern <%s>: %d\n",
-               pattern[i], n_matches[i]);
+                pattern[i], n_matches[i]);
     }
 
     return 0;
-- 
GitLab