From 4f8f23d0ae0840d4432873be0c9e70e10ef50d3a Mon Sep 17 00:00:00 2001
From: TomatenMarc <marc.feger@uni-duesseldorf.de>
Date: Wed, 23 May 2018 22:13:20 +0200
Subject: [PATCH] Add Priority Example

---
 Priority/main       | Bin 0 -> 13664 bytes
 Priority/matrix.c   |  22 +++++++++++++
 Priority/matrix.h   |   3 ++
 Priority/maximum.c  |  78 ++++++++++++++++++++++++++++++++++++++++++++
 Priority/priority.c |  72 ++++++++++++++++++++++++++++++++++++++++
 5 files changed, 175 insertions(+)
 create mode 100755 Priority/main
 create mode 100644 Priority/matrix.c
 create mode 100644 Priority/matrix.h
 create mode 100644 Priority/maximum.c
 create mode 100644 Priority/priority.c

diff --git a/Priority/main b/Priority/main
new file mode 100755
index 0000000000000000000000000000000000000000..8a379b43b98d21c11e78b9a4e3ef06de39ede524
GIT binary patch
literal 13664
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
MmS(6&lSH>408IcHh5!Hn

literal 0
HcmV?d00001

diff --git a/Priority/matrix.c b/Priority/matrix.c
new file mode 100644
index 0000000..cd6561a
--- /dev/null
+++ b/Priority/matrix.c
@@ -0,0 +1,22 @@
+#include <stdlib.h>
+
+#define getAddress(matrix_pointer, current_row, current_column, columns) (matrix_pointer + current_row * columns + current_column)
+
+
+void initializeMatrix(long long* matrix, int rows, int cols) {
+	for (int i = 0; i < rows; i++) {
+		for (int j = 0; j < cols; j++) {
+			*getAddress(matrix, i, j, cols) = rand() % 100;
+		}
+	}
+}
+
+void multiplyMatrices(long long* matrixA, long long* matrixB, long long* matrixC, int rowsA, int colsA, int colsB) {
+	for (int i = 0; i < rowsA; i++) {
+		for(int j = 0; j < colsB; j++) {
+			for (int k = 0; k < colsA; k++) {
+				*getAddress(matrixC, i, j, colsB) += *getAddress(matrixA, i, k, colsA) * *getAddress(matrixB, k, j, colsB);
+			}
+		}
+    }
+}
\ No newline at end of file
diff --git a/Priority/matrix.h b/Priority/matrix.h
new file mode 100644
index 0000000..b8e5b02
--- /dev/null
+++ b/Priority/matrix.h
@@ -0,0 +1,3 @@
+void initializeMatrix(long long* matrix, int rows, int cols);
+
+void multiplyMatrices(long long* matrixA, long long* matrixB, long long* matrixC, int rowsA, int colsA, int colsB);
diff --git a/Priority/maximum.c b/Priority/maximum.c
new file mode 100644
index 0000000..a6c04e4
--- /dev/null
+++ b/Priority/maximum.c
@@ -0,0 +1,78 @@
+#include "matrix.h"
+#include <limits.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+
+typedef struct parameters {
+    long long* arr;
+    int index;
+
+} param_t;
+
+
+int get_maximum(int* arr, int length) {
+    int max = 0;
+
+   for (int i = 0; i < length; i++) {
+        int value = *(arr + i);
+        if (value > max) {
+            max = value;
+        }
+    }
+
+    return max;
+}
+
+void* get_maximum_parallel(void* data) {
+    param_t *arr = ((param_t*) data);
+    
+    printf("%d\n", arr->index);
+
+    return NULL;
+}
+
+
+int main (int argc, const char* argv[]) {
+    if (argc != 4) {
+        printf("Usage: maximum <array length> <number of threads>\n");
+        exit(EXIT_FAILURE);
+    }
+
+    long threads = strtol(argv[1], NULL, 10);
+    long ROWS = strtol(argv[2], NULL, 10);
+    long COLS = strtol(argv[3], NULL, 10);
+
+
+    printf("Initializing...\n");
+    srand(time(NULL));
+    printf("Starting...\n");
+    struct timespec start, end;
+    clock_gettime(CLOCK_MONOTONIC, &start);
+
+    pthread_t pthreads[threads];
+    for (int i = 0; i < threads; i++) {
+        
+        param_t* data = (param_t*) malloc(sizeof(param_t));
+        data->arr = malloc(threads*sizeof(long long));
+        data->index = i;
+        if (pthread_create(&pthreads[i], NULL, get_maximum_parallel, data) != 0) {
+            printf("Could not create threads\n");
+            exit(EXIT_FAILURE);
+        }
+    }
+
+    for (int i = 0; i < threads; i++) {
+        pthread_join(pthreads[i], NULL);
+    }
+
+    clock_gettime(CLOCK_MONOTONIC, &end);
+
+    //printf("Maximum: %d; determined in %ld ms\n", get_maximum(results, threads),
+    //    (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000 / 1000);
+
+    //free(arr);
+    //free(results);
+}
diff --git a/Priority/priority.c b/Priority/priority.c
new file mode 100644
index 0000000..a796fd7
--- /dev/null
+++ b/Priority/priority.c
@@ -0,0 +1,72 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <time.h>
+#include "matrix.h"
+
+
+#define THREADS 10
+#define DIMENSION 1000
+
+struct param{
+    long long *matrixA;
+    long long *matrixB;
+    long long *matrixC;
+};
+
+typedef struct param param_t; 
+
+void *worker(void *param){
+    param_t *args = (param_t*)param;
+
+    struct timespec start, end;
+    clock_gettime(CLOCK_MONOTONIC, &start);
+    
+    multiplyMatrices(args->matrixA, args->matrixB, args->matrixC, DIMENSION, DIMENSION, DIMENSION);
+    clock_gettime(CLOCK_MONOTONIC, &end);
+
+    long long *time = malloc(sizeof(long long));
+    *time = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000 / 1000;
+    return (void*) time;
+}
+
+
+int main(void){
+
+    pthread_t threads[THREADS];
+    param_t *parameters = malloc(sizeof(param_t));
+
+	parameters->matrixA = (long long*)malloc(DIMENSION * DIMENSION * sizeof(long long));
+    parameters->matrixB = (long long*)malloc(DIMENSION * DIMENSION * sizeof(long long));
+	parameters->matrixC = (long long*)malloc(DIMENSION * DIMENSION * sizeof(long long));
+
+    initializeMatrix(parameters->matrixA, DIMENSION, DIMENSION);
+	initializeMatrix(parameters->matrixB, DIMENSION, DIMENSION);
+    
+    for(int i = 0; i  < THREADS; i++){
+        if(pthread_create(&threads[i], NULL, worker, (void**)parameters) != 0){
+            perror("create error");
+            return -1;
+        }
+        if(i == 0){
+            struct sched_param param;
+            param.sched_priority = 99;
+            if(pthread_setschedparam(threads[i], SCHED_FIFO, &param)!=0){
+                perror("set prio fail");
+                return -1;
+            }
+        }
+    }
+    void *ret;
+    for(int i = 0; i < THREADS; i++){
+        if(pthread_join(threads[i], (void*)&ret) != 0){
+            perror("join error");
+            return -1;
+        }
+        long long *result = (long long*)ret;
+        printf("Thread %d: %lld ms\n", i,*result);
+    }
+
+    return 0;
+}
-- 
GitLab