Solusi: Implementasi Thread Pada Perhitungan Matriks (Sistem Operasi)

28 May

Tujuan
• Mahasiswa memahami konsep pembuatan thread pada lingkungan UNIX
• Mahasiswa mampu memanfaatkan API Posix Thread untuk membuat dan mengatur thread
• Meningkatkan kemampuan pemrograman bahasa C

Deskripsi
Thread adalah unit terkecil dari proses yang dapat dieksekusi oleh CPU. Satu proses dapat terdiri dari beberapa
thread. Pada lingkungan UNIX, thread dapat dibuat dan diatur dengan menggunakan API Posix Thread. Pada
tugas kedua ini Anda diminta untuk membuat program perkalian matriks yang ada pada buku Operating Systems
Concepts 8th Edition, halaman 178 atau buku Operating Systems Concepts Essential, halaman 170. Program yang
dibuat adalah dengan menggunakan bahasa C dan API Posix Thread.

Solusi dalam C


#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define M 3
#define K 2
#define N 3

void *runner (void *param);

int A [M][K] = { {1,4}, {2,5}, {3,6} }; // Array ukuran M*K (3 baris 2 kolom)
int B [K][N] = { {8,7,6}, {5,4,3} }; // Array ukuran K*N (2 baris 3 kolom)
int C [M][N]; // Array ukuran M*N (3 baris 3 kolom)

/* Structure untuk mem-passing data ke thread */
struct v
{
 int i; // Menunjukkan baris
 int j; // Menunjukkan kolom
};

int main()
{
 pthread_t tid [M*N]; // Array of thread bernama tid dengan size M*N = 3*3 = 9
 int i; // Menunjukkan baris
 int j; // Menunjukkan kolom
 int indeks; // Menunjukkan indeks pada array of thread

 for (i = 0; i < M; i++)
 {
 for (j = 0; j < N; j++)
 {
 struct v *data = (struct v*) malloc (sizeof (struct v)); // Membuat objek structure v bernama data
 // dengan mengalokasikan memori sebesar size dari structure v
 data -> i = i; // Mengeset nilai i pada objek structure v bernama data dengan nilai i
 data -> j = j; // Mengeset nilai j pada objek structure v bernama data dengan nilai j
 pthread_create (&tid[indeks++], NULL, runner, (void *) data); // Membuat thread pada array of thread tid pada indeks ke-indeks
 // dengan memanggil fungsi runner dengan parameter data
 }
 }

 for (indeks = 0; indeks < M*N; indeks++)
 {
 pthread_join (tid[indeks], NULL); // Menggabungkan thread-thread yang ada
 }

 /* Mencetak hasil perkalian 2 Matriks */
 printf ("Hasil:\n");
 for (i = 0; i < M; i++)
 {
 for (j = 0; j < N; j++)
 {
 printf ("%d", C[i][j]); // Output matriks C baris i kolom j
 }
 printf ("\n");
 }
}

/* Fungsi untuk melakukan perkalian 2 matriks */
void *runner (void *param)
{
 struct v *par = (struct v*) param; // Mengeset objek structure v bernama par dengan param
 int h; // Variabel looping
 int i = par -> i; // Mengeset nilai i dengan nilai i pada par
 int j = par -> j; // Mengeset nilai j dengan nilai j pada par
 int hasil = 0; // Menunjukkan hasil perhitungan matriks

 for (h = 0; h < K; h++)
 {
 hasil += A[i][h] * B[h][j]; // Hasil didefiniskan dengan menambahkan semua hasil perkalian baris i kolom h dengan baris h kolom j
 C[i][j] = hasil; // Mengeset nilai matriks C pada baris i dan kolom j dengan hasil
 }
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: