Skip to content
Snippets Groups Projects
Commit 9144457d authored by dimasaditiap's avatar dimasaditiap
Browse files

initial commit

parent 0695876f
No related merge requests found
# Announcement
Beberapa file yang harus ada dalam repositori tersebut diantaranya:
* Direktori src yang berisi source code yang anda buat.
* File output yang berisi hasil uji dijkstra algorithm pada data uji.
* Makefile. Buatlah sehingga kompilasi program dapat dilakukan hanya dengan pemanggilan command ’make’ saja.
* File README.md yang berisi:
* Petunjuk penggunaan program.
* Pembagian tugas. Sampaikan dalam list pengerjaan untuk setiap mahasiswa. Sebagai contoh: XXXX mengerjakan fungsi YYYY, ZZZZ, dan YYZZ.
* Laporan pengerjaan, dengan struktur laporan sesuai dengan deskripsi pada bagian sebelumnya.
### PARALLEL RADIX SORT CUDA IF3230
## Petunjuk penggunaan program
1. Buka terminal
2. Pada terminal, ketik "make"
3. Lalu untuk melakukan run, ketik "./radix_sort"
Keterangan:
Nilai N yang diuji diubah pada konstanta N_uji yang terdapat pada program
## Pembagian tugas:
13516150 - Mengerjakan tugas bersama-sama
13516153 - Mengerjakan tugas bersama-sama
## Pengujian:
### Deskripsi solusi paralel. Berikan ilustrasi jika perlu.
Solusi paralel yang dibuat adalah dengan membagi pekerjaan sekuensial ke dalam beberapa proses untuk dilakukan secara paralel.
Untuk melakukan eksekusi pada <i>device</i> (GPU), data array pada <i>host</i> (CPU) harus disalin menggunakan <i>cudaMemcpy</i>.
Pekerjaan yang dibagi adalah:
1. Pembangkitan nilai acak pada array menggunakan <i>cudaRand</i>.
2. Pencarian nilai maksimum untuk menentukan digit terbesar diantara elemen array. Pencarian dilakukan dengan pararel yang direduksi, menggunakan <i>CUDA threads</i>.
3. Perhitungan kemunculan angka pada setiap digit. Pembagian dilakukan dengan mengelompokkan masing-masing elemen array kepada digit tertentu menggunakan <i>CUDA threads</i>, kemudian masing-masing thread menggabungkan hasil perhitungan ke dalam sebuah <i>bucket</i> global (yang menyimpan seluruh kemunculan digit) dengan memanfaatkan <i>atomicAdd</i> sebagai implementasi dari <i>critical section</i>.
Setelah perhitungan kemunculan angka telah digabung, array pada <i>device</i> disalin ke array pada <i>host</i> untuk dilakukan pemetaan elemen array berdasarkan kemunculan angka pada digit yang sedang diperiksa.
Lalu pengulangan dilakukan dari digit terkecil hingga digit terbesar.
### Analisis solusi yang anda berikan. Apakah mungkin terdapat solusi yang memberikan kinerja lebih baik?
Solusi yang dibuat dapat mempercepat kinerja dengan membagi pekerjaan. Ilustrasinya apabila terdapat 50 elemen array, maka sebanyak 25 <i>CUDA thread</i> digunakan untuk melakukan 1 kali perbandingan elemen, berbeda dengan eksekusi di <i>host</i> yang harus melakukan perbandingan sebanyak 100 kali menggunakan 1 CPU thread. Waktu perhitungan kemunculan angka pada setiap digit juga tereduksi karena setiap <i>CUDA thread</i> melakukan pengelompokkan digit untuk setiap elemen pada array.
Mungkin saja terdapat solusi lain yang lebih cepat. Untuk pemetaan elemen array yang dilakukan oleh proses utama, mungkin saja dapat diparallelkan, tetapi algoritma yang telah dibuat tidak menerapkannya.
Tetapi tentu saja tidak menutup kemungkinan terdapat solusi lain yang lebih cepat. Untuk pemetaan elemen array yang dilakukan oleh proses utama, mungkin saja dapat diparalelkan, tetapi algoritma yang telah dibuat tidak menerapkannya.
### Jelaskan pemetaan thread ke komputasi, dan jumlah thread per block yang digunakan. Kenapa anda memilih angka tersebut?
Thread yang digunakan untuk menentukan nilai maksimum pada array adalah sebanyak <i>N/2</i>, dengan <i>N</i> adalah banyak elemen array. Hal ini dilakukan karena dengan algoritma yang digunakan, setiap thread melakukan perbandingan satu elemen array dengan satu elemen lainnya.
Thread yang digunakan untuk melakukan sorting pada array adalah sebanyak <i>N</i>. Setiap thread bertugas untuk mengelompokkan setiap elemen array pada <i>bucket</i> digit yang ada.
### Pengukuran kinerja untuk tiap kasus uji (jumlah N pada array) dibandingkan dengan radix sort serial.
Untuk pengujian setiap N, perlu pengubahan nilai konstanta N_uji pada program.
#### N = 5000
Serial : Waktu eksekusi: 1825 microseconds
Parallel : Waktu eksekusi: 2575 microseconds
#### N = 50000
Serial : Waktu eksekusi: 17423 microseconds
Parallel : Waktu eksekusi: 17622 microseconds
#### N = 100000
Serial : Waktu eksekusi: 22458 microseconds
Parallel : Waktu eksekusi: 22133 microseconds
#### N = 200000
Serial : Waktu eksekusi: 42411 microseconds
Parallel : Waktu eksekusi: 37665 microseconds
#### N = 400000
Serial : Waktu eksekusi: 79963 microseconds
Parallel : Waktu eksekusi: 62689 microseconds
#### Analisis perbandingan kinerja serial dan paralel. Analisis yang diharapkan adalah analisis yang minimal dapat menjelaskan setiap hasil pengukuran kinerja sebelumnya.
Untuk parameter <b>N</b> yang kecil (pada kasus ini 5000 dan 50000), waktu eksekusi paralel lebih lama dibandingkan dengan waktu eksekusi serial. Ini berarti program perlu dioptimasi dengan mengubah algoritma dalam memetakan array setelah perhitungan kemunculan angka tiap digit. Dan juga perlu dianalisis lebih lanjut mengenai <i>stride</i> pada algoritma untuk dapat memanfaatkan pengaksesan memori yang lebih efisien.
\ No newline at end of file
File added
CP = djikstra.cu
EXE = djikstra
SRC_DIR = src
LDLIBS += -lcurand
build:
nvcc -o $(EXE) $(SRC_DIR)/$(CP) $(LDLIBS)
//General includes
#include <stdio.h> //I/O
#include <stdlib.h>
#include <time.h> //for code timing purposes
#include <math.h>
//Parameters; modify as needed
#define VERTICES 16384 //number of vertices
#define DENSITY 16 //minimum number of edges per vertex. DO NOT SET TO >= VERTICES
#define MAX_WEIGHT 1000000 //max edge length + 1
#define INF_DIST 1000000000 //"infinity" initial value of each node
#define CPU_IMP 1 //number of Dijkstra implementations (non-GPU)
#define GPU_IMP 1 //number of Dijkstra implementations (GPU)
#define THREADS 2 //number of OMP threads
#define RAND_SEED 1234 //random seed
#define THREADS_BLOCK 512
typedef float data_t; //data type
//CPU parameters for serial implementation
#define CPG 2.53
#define GIG 1000000000
\ No newline at end of file
This diff is collapsed.
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment