diff --git a/100k_1.txt b/100k_1.txt new file mode 100644 index 0000000000000000000000000000000000000000..ae17c5af22b5630c2de6c906d9989d662dae1f04 --- /dev/null +++ b/100k_1.txt @@ -0,0 +1,2 @@ +1 +Program berjalan selama: 36.305078 detik diff --git a/100k_128.txt b/100k_128.txt new file mode 100644 index 0000000000000000000000000000000000000000..235772391ab84a9b461dfd48dc9123eb2244a54c --- /dev/null +++ b/100k_128.txt @@ -0,0 +1,2 @@ +128 +Program berjalan selama: 0.040036 detik diff --git a/100k_16.txt b/100k_16.txt new file mode 100644 index 0000000000000000000000000000000000000000..7afb2a921712b7c0994c052f37b1eddece85f7c6 --- /dev/null +++ b/100k_16.txt @@ -0,0 +1,2 @@ +16 +Program berjalan selama: 0.711111 detik diff --git a/100k_32.txt b/100k_32.txt new file mode 100644 index 0000000000000000000000000000000000000000..d8cba89e0403d27e0fa1e63e7c861e1836c213ad --- /dev/null +++ b/100k_32.txt @@ -0,0 +1,2 @@ +32 +Program berjalan selama: 0.317029 detik diff --git a/100k_64.txt b/100k_64.txt new file mode 100644 index 0000000000000000000000000000000000000000..1c796b3c277b4bfec4e567fdbafc9a24cc15a9c7 --- /dev/null +++ b/100k_64.txt @@ -0,0 +1,2 @@ +64 +Program berjalan selama: 0.145469 detik diff --git a/100k_8.txt b/100k_8.txt new file mode 100644 index 0000000000000000000000000000000000000000..304716f58c9879564fabd747b9410cac0fdda7eb --- /dev/null +++ b/100k_8.txt @@ -0,0 +1,2 @@ +8 +Program berjalan selama: 2.554976 detik diff --git a/200k_1.txt b/200k_1.txt new file mode 100644 index 0000000000000000000000000000000000000000..2d55d4f0e0c203e92a1e6e0173fa38b899731af7 --- /dev/null +++ b/200k_1.txt @@ -0,0 +1,2 @@ +1 +Program berjalan selama: 153.797887 detik diff --git a/200k_128.txt b/200k_128.txt new file mode 100644 index 0000000000000000000000000000000000000000..7813671fbd77ae897a256052150c2de8cd6d71d6 --- /dev/null +++ b/200k_128.txt @@ -0,0 +1,2 @@ +128 +Program berjalan selama: 0.226761 detik diff --git a/200k_16.txt b/200k_16.txt new file mode 100644 index 0000000000000000000000000000000000000000..c09dee24647f17582ae864267ee358b54a6907af --- /dev/null +++ b/200k_16.txt @@ -0,0 +1,2 @@ +16 +Program berjalan selama: 3.273830 detik diff --git a/200k_32.txt b/200k_32.txt new file mode 100644 index 0000000000000000000000000000000000000000..8df671d6c7f5e021f32b3728d9892229ff85adcc --- /dev/null +++ b/200k_32.txt @@ -0,0 +1,2 @@ +32 +Program berjalan selama: 0.864381 detik diff --git a/200k_64.txt b/200k_64.txt new file mode 100644 index 0000000000000000000000000000000000000000..4cc16bfb9fb0c5adc54bcba5418cf02cd51c34f7 --- /dev/null +++ b/200k_64.txt @@ -0,0 +1,2 @@ +64 +Program berjalan selama: 0.314616 detik diff --git a/200k_8.txt b/200k_8.txt new file mode 100644 index 0000000000000000000000000000000000000000..d7de60cf3d35282cf32158ad374529f067c0b1cd --- /dev/null +++ b/200k_8.txt @@ -0,0 +1,2 @@ +8 +Program berjalan selama: 8.510434 detik diff --git a/400k_1.txt b/400k_1.txt new file mode 100644 index 0000000000000000000000000000000000000000..7a64e5bbc4f2c6c91b88f1e389898c13af6be6b1 --- /dev/null +++ b/400k_1.txt @@ -0,0 +1,2 @@ +1 +Program berjalan selama: 585.409667 detik diff --git a/400k_128.txt b/400k_128.txt new file mode 100644 index 0000000000000000000000000000000000000000..72ceee7628474c66d867c5ad54ab5ec542a92ba8 --- /dev/null +++ b/400k_128.txt @@ -0,0 +1,2 @@ +128 +Program berjalan selama: 0.421921 detik diff --git a/400k_16.txt b/400k_16.txt new file mode 100644 index 0000000000000000000000000000000000000000..9df0a762a9f960567c3edf4a9174bc1f8193482b --- /dev/null +++ b/400k_16.txt @@ -0,0 +1,2 @@ +16 +Program berjalan selama: 11.473965 detik diff --git a/400k_32.txt b/400k_32.txt new file mode 100644 index 0000000000000000000000000000000000000000..4f5c8ba52a252fb457c42e09895517e28cec517a --- /dev/null +++ b/400k_32.txt @@ -0,0 +1,2 @@ +32 +Program berjalan selama: 3.016893 detik diff --git a/400k_64.txt b/400k_64.txt new file mode 100644 index 0000000000000000000000000000000000000000..002473f4125626771d01040b0955007ca5df9a96 --- /dev/null +++ b/400k_64.txt @@ -0,0 +1,2 @@ +64 +Program berjalan selama: 1.123938 detik diff --git a/400k_8.txt b/400k_8.txt new file mode 100644 index 0000000000000000000000000000000000000000..cec87e01db4bd7ad0590ed4ac45b833a00967c41 --- /dev/null +++ b/400k_8.txt @@ -0,0 +1,2 @@ +8 +Program berjalan selama: 27.223174 detik diff --git a/50k_1.txt b/50k_1.txt new file mode 100644 index 0000000000000000000000000000000000000000..1d89f1d67da90eb40bb75cbc8b626b4bb1968625 --- /dev/null +++ b/50k_1.txt @@ -0,0 +1,2 @@ +1 +Program berjalan selama: 9.709172 detik diff --git a/50k_128.txt b/50k_128.txt new file mode 100644 index 0000000000000000000000000000000000000000..ef5333980b68c665dd0a27496dc52e188469c285 --- /dev/null +++ b/50k_128.txt @@ -0,0 +1,2 @@ +128 +Program berjalan selama: 0.015114 detik diff --git a/50k_16.txt b/50k_16.txt new file mode 100644 index 0000000000000000000000000000000000000000..4a78c39d25bd3520c25e6d07d29f3e694f760848 --- /dev/null +++ b/50k_16.txt @@ -0,0 +1,2 @@ +16 +Program berjalan selama: 0.200435 detik diff --git a/50k_32.txt b/50k_32.txt new file mode 100644 index 0000000000000000000000000000000000000000..3e91554307a98c1e79971b739963a4bfbf85be41 --- /dev/null +++ b/50k_32.txt @@ -0,0 +1,2 @@ +32 +Program berjalan selama: 0.094263 detik diff --git a/50k_64.txt b/50k_64.txt new file mode 100644 index 0000000000000000000000000000000000000000..76bfdb55952c9453c4cf076fec6dff611b1a2d1b --- /dev/null +++ b/50k_64.txt @@ -0,0 +1,2 @@ +64 +Program berjalan selama: 0.065497 detik diff --git a/50k_8.txt b/50k_8.txt new file mode 100644 index 0000000000000000000000000000000000000000..db51c05b6b7c9947bad65acdf323bc7a69ca9742 --- /dev/null +++ b/50k_8.txt @@ -0,0 +1,2 @@ +8 +Program berjalan selama: 0.512097 detik diff --git a/omp_bucket b/omp_bucket new file mode 100755 index 0000000000000000000000000000000000000000..bdbb6bb31688df265fd09efa8b44c0baca813131 Binary files /dev/null and b/omp_bucket differ diff --git a/omp_bucket.c b/omp_bucket.c new file mode 100644 index 0000000000000000000000000000000000000000..3b26ed30d1d1f163d83e0c7a7da54d82e00fab89 --- /dev/null +++ b/omp_bucket.c @@ -0,0 +1,104 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <omp.h> + +int *arr_gen(int size) { + int *arr = malloc(size * sizeof(int)); + for (int i = 0; i < size; ++i) { + arr[i] = rand() % (size + 1); + } + return arr; +} +int main(int argc, char **argv) { + srand(time(NULL)); + int arr_size; + if (argc == 3) { + arr_size = atoi(argv[1]); + } + else { + printf("Harus ada argumen jumlah array"); + } + + int num_threads = atoi(argv[2]); + printf("%d\n", num_threads); + + int *array = arr_gen(arr_size); + +#ifdef DEBUG + printf("Original Array:\n"); + for (int i = 0; i < arr_size; ++i) { + if (i) printf(" "); + printf("%d", array[i]); + } + printf("\n"); +#endif + + int max_val = arr_size; + int range = max_val/num_threads+1; + int **bucket = malloc(num_threads * sizeof(int*)); + + struct timespec start_time, end_time; + clock_gettime(CLOCK_MONOTONIC, &start_time); + + int *q = malloc(num_threads * sizeof(int)); + int *head = malloc(num_threads * sizeof(int)); + int i; + for (i = 0; i < num_threads; ++i) { + q[i] = 0; + head[i] = 0; + } + for (i = 0; i < arr_size; ++i) { + int index = array[i] / range; + q[index]++; + } + for (i = 0; i < num_threads; ++i) { + bucket[i] = malloc(q[i] * sizeof(int)); + } + for (i = 0; i < arr_size; ++i) { + int index = array[i] / range; + bucket[index][head[index]] = array[i]; + head[index]++; + } + + int thread_rank = omp_get_thread_num(); +#pragma omp parallel num_threads(num_threads) + { + int i, j; + int n = q[thread_rank]; + int *local_bucket = bucket[thread_rank]; + for (i = 0; i < n; ++i) { + for (j = i+1; j < n; ++j) { + if (local_bucket[i] > local_bucket[j]) { + int c = local_bucket[j]; + local_bucket[j] = local_bucket[i]; + local_bucket[i] = c; + } + } + } + } + + int j; + int p = 0; + for (i = 0; i < num_threads; ++i) { + for (j = 0; j < q[i]; ++j) { + array[p++] = bucket[i][j]; + } + } + + clock_gettime(CLOCK_MONOTONIC, &end_time); + +#ifdef DEBUG + printf("Hasil sorting:\n"); + for (i = 0; i < arr_size; ++i) { + if (i) printf(" "); + printf("%d", array[i]); + } + printf("\n"); +#endif + + double diff = (end_time.tv_sec - start_time.tv_sec) + (double)(end_time.tv_nsec - start_time.tv_nsec) / 1000000000.0; + printf("Program berjalan selama: %lf detik\n", diff); + + return 0; +} diff --git a/out.txt b/out.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391