Friday, July 3, 2015

Bioinformatika

TUGAS KELOMPOK SOFTSKILL PENGANTAR KOMPUTASI MODERN

NAMA KELOMPOK :
BAYU YONAR (51411449)
DIMAS IBRAHIM (52411116)
FERINA CAESSARI W. (52411832)
JANU PRIHARTINI (53411785)
KINTAN YULANDA (54411005)
RIANDA ZULHAMJANI (56411103)
RIKO ARFIAN (56411212)
YOEL ELBIN S. (57411515)

Pengertian Bioinformatika
Bioinformatika ialah ilmu yang mempelajari penerapan teknik komputasi untuk mengelola dan menganalisis informasi hayati. Bidang ini mencakup penerapan metode-metode matematika,statistika, dan informatika untuk memecahkan masalah-masalah biologi, terutama yang terkait dengan penggunaan sekuens DNA dan asam amino. Contoh topik utama bidang ini meliputi pangkalan data untuk mengelola informasi hayati, penyejajaran sekuens (sequence alignment), prediksi struktur untuk meramalkan struktur protein atau pun struktur sekunder RNA, analisis filogenetik, dan analisis ekspresi gen.

Sejarah Bioinformatika
Bioinformatika, sesuai dengan asal katanya yaitu “bio” dan “informatika” adalah gabungan antara ilmu biologi dan ilmu teknik informasi (TI). Pada umumnya, Bioinformatika didefinisikan sebagai aplikasi dari alat komputasi dan analisa untuk menangkap dan menginterpretasikan data-data biologi. Ilmu ini merupakan ilmu baru yang yang merangkup berbagai disiplin ilmu termasuk ilmu komputer, matematika dan fisika, biologi, dan ilmu kedokteran, dimana kesemuanya saling menunjang dan saling bermanfaat satu sama lainnya.
Istilah bioinformatika mulai dikemukakan pada pertengahan era 1980-an untuk mengacu pada penerapan komputer dalam biologi. Namun demikian, penerapan bidang-bidang dalam bioinformatika (seperti pembuatan basis data dan pengembangan algoritma untuk analisis sekuens biologis) sudah dilakukan sejak tahun 1960-an.

Kemajuan teknik biologi molekular dalam mengungkap sekuens biologis dari protein (sejak awal 1950-an) dan asam nukleat (sejak 1960-an) mengawali perkembangan basis data dan teknik analisis sekuens biologis. Basis data sekuens protein mulai dikembangkan pada tahun 1960-an di Amerika Serikat, sementara basis data sekuens DNA dikembangkan pada akhir 1970-an di Amerika Serikat dan Jerman (pada European Molecular Biology Laboratory, Laboratorium Biologi Molekular Eropa). Penemuan teknik sekuensing DNA yang lebih cepat pada pertengahan 1970-an menjadi landasan terjadinya ledakan jumlah sekuens DNA yang berhasil diungkapkan pada 1980-an dan 1990-an, menjadi salah satu pembuka jalan bagi proyek-proyek pengungkapan genom, meningkatkan kebutuhan akan pengelolaan dan analisis sekuens, dan pada akhirnya menyebabkan lahirnya bioinformatika. Perkembangan internet juga mendukung berkembangnya bioinformatika.

Basis data bioinformatika yang terhubung melalui internet memudahkan ilmuwan mengumpulkan hasil sekuensing ke dalam basis data tersebut maupun memperoleh sekuens biologis sebagai bahan analisis, Perkembangan teknologi DNA rekombinan memainkan peranan penting dalam lahirnya bioinformatika. Teknologi DNA rekombinan memunculkan suatu pengetahuan baru dalam rekayasa genetika organisme yang dikenala bioteknologi. Perkembangan bioteknologi dari bioteknologi tradisional ke bioteknologi modren salah satunya ditandainya dengan kemampuan manusia dalam melakukan analisis DNA organisme, sekuensing DNA dan manipulasi DNA. Sekuensing DNA satu organisme, misalnya suatu virus memiliki kurang lebih 5.000 nukleotida atau molekul DNA atau sekitar 11 gen, yang telah berhasil dibaca secara menyeluruh pada tahun 1977. Kemudia Sekuen seluruh DNA manusia terdiri dari 3 milyar nukleotida yang menyusun 100.000 gen dapat dipetakan dalam waktu 3 tahun, walaupun semua ini belum terlalu lengkap. Saat ini terdapat milyaran data nukleotida yang tersimpan dalam database DNA, GenBank di AS yang didirikan tahun 1982. Selain itu, penyebaran program-program aplikasi bioinformatika melalui internet memudahkan ilmuwan mengakses program-program tersebut dan kemudian memudahkan pengembangannya.

Bioinformatika dalam Bidang Klinis
Bioinformatika dalam bidang klinis sering disebut sebagai informatika klinis( clinical informatics ). Aplikasi dari informatika klinis ini berbentuk manajemen data-dataklinis dari pasien melalui Electrical Medical Record  (EMR) yang dikembangkan olehClement J. McDonald dari Indiana University School of Medicine pada tahun 1972.McDonald pertama kali mengaplikasikan EMR pada 33 orang pasien penyakit gula(diabetes). Sekarang EMR ini telah diaplikasikan pada berbagai penyakit. Data yangdisimpan meliputi data analisa diagnosa laboratorium, hasil konsultasi dan saran, fotorontgen, ukuran detak jantung, dan lain lain. Dengan data ini dokter akan bisa menentukan obat yang sesuai dengan kondisi pasien tertentu dan lebih jauh lagi, dengandibacanya genom manusia, akan memungkinkan untuk mengetahui penyakit genetik seseorang, sehingga penanganan terhadap pasien menjadi lebih akurat menentukan obat yang sesuai dengan kondisi pasien tertentu dan lebih jauh lagi, dengan dibacanya genom manusia, akan memungkinkan untuk mengetahui penyakit genetik seseorang, sehingga penanganan terhadap pasien menjadi lebih akurat.

Bioinformatika untuk Identifikasi Agent  Penyakit Baru
Bioinformatika juga menyediakan tool yang sangat penting untuk identifikasi agent penyakit yang belum dikenal penyebabnya. Banyak sekali penyakit baru yangmuncul dalam dekade ini, dan diantaranya yang masih hangat adalah SARS (SevereAcute Respiratory Syndrome).Pada awalnya, penyakit ini diperkirakan disebabkan oleh virus influenza karenagejalanya mirip dengan gejala pengidap influenza. Akan tetapi ternyata dugaan ini salahkarena virus influenza tidak terisolasi dari pasien. Perkirakan lain penyakit ini disebabkanoleh bakteri Candida karena bakteri ini terisolasi dari beberapa pasien. Tapi perkiraan ini juga salah. Akhirnya ditemukan bahwa dari sebagian besar pasien SARS terisolasi virus Corona jika dilihat dari morfologinya. Sekuen genom virus ini kemudian dibaca dan darihasil analisa dikonfirmasikan bahwa penyebab SARS adalah virus Corona yang telah berubah (mutasi) dari virus Corona yang ada selama ini. Dalam rentetan proses ini, Bioinformatika memegang peranan penting. Pertama pada proses pembacaan genom virus Corona. Karena didatabase seperti GenBank,EMBL (European Molecular Biology Laboratory), dan DDBJ (DNA Data Bank of Japan) sudah tersedia data sekuen beberapa virus Corona, yang bisa digunakan untuk mendisain primer yang digunakan untuk amplifikasi DNA virus SARS ini. Software untuk mendisain primer juga tersedia, baik yang gratis maupun yang komersial. Untuk yang komersial ada Primer Disainer  yang dikembangkan oleh Scientific & Education Software, dan software-software untuk analisa DNA lainnya seperti Sequencher  (GeneCodes Corp.), SeqMan II (DNA STAR Inc.), Genetyx (GENETYX Corp.), DNASIS  (HITACHI Software), dan lain lain.

Kedua pada proses mencari kemiripan sekuen ( homology alignment ) virus yang didapatkan dengan virus lainnya. Dari hasil analisa virus SARS diketahui bahwa genomvirus Corona penyebab SARS berbeda dengan virus Corona lainnya. Perbedaan ini diketahui dengan menggunakan homology alignment  dari sekuen virus  SARS. Selanjutnya, Bioinformatika juga berfungsi untuk analisa posisi sejauh mana suatu virus berbeda dengan virus lainnya.

Bioinformatika untuk Diagnosa Penyakit Baru
Untuk menangani penyakit baru diperlukan diagnosa yang akurat sehingga dapat dibedakan dengan penyakit lain. Diagnosa yang akurat ini sangat diperlukan untuk  pemberian obat dan perawatan yang tepat bagi pasien.
Ada beberapa cara untuk mendiagnosa suatu penyakit, antara lain: isolasi agent penyebab penyakit tersebut dan analisa morfologinya, deteksi antibodi yang dihasilkan dari infeksi dengan teknik  enzyme - linked immunosorbent assay (ELISA), dan deteksi gendari agent pembawa penyakit tersebut dengan Polymerase Chain Reaction (PCR). Teknik yang banyak dan lazim dipakai saat ini adalah teknik PCR. Teknik ini sederhana, praktis dan cepat. Yang penting dalam teknik PCR adalah didesign primer untuk amplifikasi DNA, yang memerlukan data sekuen dari genom agent yang bersangkutan dan software seperti yang telah diuraikan di atas. Disinilah  Bioinformatika memainkan peranannya. Untuk agent  yang mempunyai genom RNA, harus dilakukan reversetran scription (proses sintesa DNA dari RNA) terlebih dahulu dengan menggunakan enzim reverse transcriptase. Setelah DNA diperoleh baru dilakukan PCR. Reversetranscription dan PCR ini bisa dilakukan sekaligus dan biasanya dinamakan RT-PCR.Teknik PCR ini bersifat kualitatif, oleh sebab itu sejak  beberapa tahun yang lalu dikembangkan teknik lain, yaitu Real Time PCR yang bersifat kuantitatif.
Dari hasil Real Time PCR ini bisa ditentukan  kuantitas suatu agent di dalam tubuh seseorang, sehingga bisa dievaluasi tingkat emergensinya. Pada Real Time PCR ini selain primer diperlukan probe yang harus didisain sesuai dengan sekuen agent  yang bersangkutan. Di sini jugadiperlukan software atau program Bioinformatika.

Bioinformatika untuk Penemuan Obat
Cara untuk menemukan obat biasanya dilakukan dengan menemukan zat/senyawayang dapat menekan perkembangbiakan suatu agent  penyebab penyakit. Karena perkembangbiakan agent  tersebut dipengaruhi oleh banyak faktor, maka faktor-faktor inilah yang dijadikan target. Diantaranya adalah enzim-enzim yang diperlukan untuk  perkembangbiakan suatu agent
Mula-mula yang harus dilakukan adalah analisa struktur dan fungsi enzim-enzim tersebut. Kemudian mencari atau mensintesa zat/senyawa yangdapat menekan fungsi dari enzim-enzim tersebut.Analisa struktur dan fungsi enzim ini dilakukan dengan cara mengganti asamamino tertentu dan menguji efeknya. Analisa penggantian asam amino ini dahulu dilakukan secara random sehingga memerlukan waktu yang lama. Setelah Bioinformatika berkembang, data-data protein yang sudah dianalisa bebas diakses oleh siapapun, baik data sekuen asam amino-nya seperti yang ada di SWISS-PROT(http://www.ebi.ac.uk/swissprot/) maupun struktur 3D-nya yang tersedia di Protein DataBank (PDB)(http://www.rcsb.org/pdb/).
Dengan database yang tersedia ini, enzim yang baru ditemukan dapat dibandingkan sekuen asam amino-nya, sehingga bisa diperkirakanasam amino yang berperan untuk aktivitas (active site) dan kestabilan enzim tersebut.Setelah asam amino yang berperan sebagai active site dan kestabilan enzimtersebut ditemukan, kemudian dicari atau disintesa senyawa yang dapat berinteraksidengan asam amino tersebut. Dengan data yang ada di PDB, maka dapat dilihat struktur 3D suatu enzim termasuk active site-nya, sehingga bisa diperkirakan bentuk senyawayang akan berinteraksi dengan active site tersebut. Dengan demikian, kita cukupmensintesa senyawa yang diperkirakan akan berinteraksi, sehingga obat terhadap suatu penyakit akan jauh lebih cepat ditemukan. Cara ini dinamakan “docking” dan telah banyak digunakan oleh perusahaan farmasi untuk penemuan obat baru.Meskipun dengan Bioinformatika ini dapat diperkirakan senyawa yang berinteraksi dan menekan fungsi suatu enzim, namun hasilnya harus dikonfirmasi dahulumelalui eksperimen di laboratorium. Akan tetapi dengan Bioinformatika, semua prosesini bisa dilakukan lebih cepat sehingga lebih efisien baik dari segi waktu maupun finansial.

Tahun 1997, Ian Wilmut dari Roslin Institute dan PPL Therapeutics Ltd,Edinburgh, Skotlandia, berhasil mengklon gen manusia yang menghasilkan faktor IX(faktor pembekuan darah), dan memasukkan ke kromosom biri-biri. Diharapkan biri-biriyang selnya mengandung gen manusia faktor IX akan menghasilkan susu yangmengandung faktor pembekuan darah. Jika berhasil diproduksi dalam jumlah banyak maka faktor IX yang diisolasi dari susu harganya bisa lebih murah untuk membantu para penderita hemofilia.

Di bawah ini bidang-bidang yang terkait dengan bioinformatika :
1. Biophysics
Merupakan sebuah bidang interdisiplier yang mengaplikasikan teknik-teknik dari ilmu fisika untuk memahami struktur dan ilmu biologi. Ilmu ini terkait dengan bioinformatika karena untuk mengenal teknik-teknik dari ilmu fisika untuk memahami struktur tersebut membutuhkan penggunaan TI.

2.  Computational Biology
Bidang ini merupakan bagian dari bioinformatika yang paling dekat dengan bidang Biologi umum klasik. Fokus dari Computational Biology adalah gerak evolusi, populasi, dan biologi teoritis daripada biomedis dalam molekul dan sel. Pada penerapan bidang ini model-model statistika untuk fenomena biologi lebih di pakai dibandingkan dengan model sebenarnya.

3. Medical Informatics
Merupakan sebuah disiplin ilmu yang baru yang didefinisikan sebagai pembelajaran, penemuan, dan implementasi dari struktur dan algoritma untuk meningkatkan komunikasi, pengertian, dan manajemen informasi medis. Disiplin ilmu ini, berkaitan dengan data-data yang didapatkan pada level biologi yang lebih “rumit”, dimana sebagian besar bioinformatika lebih memperhatikan informasi dari sistem dan struktur biomolekul dan seluler.

4. Proteomics
Pertama kali digunakan utnuk menggambarkan himpunan dari protein-protein yang tersusun olehgenom. Mengkarakterisasi banyaknya puluhan ribu protein yang dinyatakan dalam sebuah tipe sel yang diberikan pada waktu tertentu melibatkan tempat penyimpanan dan perbandingan dari data yang memiliki jumlah yang sangat besar, tak terhindarkan lagi akan memerlukan bioinformatika.

5. Genomics
Adalah bidang ilmu yang ada sebelum selesainya sekuen genom, kecuali dalam bentuk yang paling kasar. Genomics adalah setiap usaha untuk menganalisa atau membandingakna seluruh komplemen genetik dari satu spesies atau lebih.


Sumber          : 
http://csbioinformatika.blogspot.com/2012/10/cabang-cabang-terkait-dengan.html
http://rzbeuty.blogspot.com/2012/03/artikel-bioinformatika.html

Thursday, May 21, 2015

Contoh pemograman pararel

TUGAS KELOMPOK SOFTSKILL PENGANTAR KOMPUTASI MODERN

NAMA KELOMPOK :
  1. BAYU YONAR (51411449)
  2. DIMAS IBRAHIM (52411116)
  3. FERINA CAESSARI W. (52411832)
  4. JANU PRIHARTINI (53411785)
  5. KINTAN YULANDA (54411005)
  6. RIANDA ZULHAMJANI (56411103)
  7. RIKO ARFIAN (56411212)
  8. YOEL ELBIN S. (57411515)
  • PENDAHULUAN

Komputasi Paralel adalah salah satu teknik melakukan komputasi secara bersamaan dengan memanfaatkan beberapa komputer independent secara bersamaan. Pada umumnya diperlukan saat kapasitas yang diperlukan sangat besar, baik karena harus mengolah data dalam jumlah besar ataupun karena tuntutan proses komputasi yang banyak. Kasus kedua umumnya ditemui di kalkulasi numerik untuk menyelesaikan persamaan matematis dibidang fisika, kimia dll.
Tujuan utama dari pemrograman paralel adalah untuk meningkatkan performa komputasi. Semakin banyak hal yang bisa dilakukan secara bersamaan, semakin banyak pekerjaan yang bisa diselesaikan. Analagi yang paling gampang adalah bila anda dapat merebus air sambil memotong-motong bawang saat anda akan memasak, waktu yang anda butuhkan akan lebih sedikit dibandingkan bila saat anda mengerjakan hal tersebut secara berurutan. 



    • Contoh pemrograman paralel dengan 4 metode


    1.      MPI (Message Passing Interface)
    MPI atau Mesage Passing Interface adalah spesifikasi yang perlu diterapkan pengembang dan pengguna pemrograman parallel. Sedangkan pustaka yang mengimplementasi spesifikasi tersebut dapat kita peroleh misalnya dari bahasa C/C++. Untuk menggunakan pustaka tersebut kita hanya tinggal mendeklarasinya di awal program seperti berikut ini.
    #include "mpi.h"
    Secara umum, pemrograman parallel menggunakan spesifikasi MPI membutuhkan tiga tahapan. Hal ini terlepas dari kebutuhan lain terkait eksekusi seperti mem-boot layanan ini. Ketiganya adalah:
    1. Inisialisasi
    2. Dekomposisi, distribusi dan pengambilan kembali sub pekerjaan
    3. De-inisialisasi
    Bagaimana ketiganya diterapkan dalam C/C++, berikut adalah contoh prrogram sederhana.

    Program berikut ini hanya bertugas menampilkan karakter/informasi ke layar oleh masing-masing node yang terlibat dalam komunkasi MPI. Kode sumber pertama dibuat dalam C.
    #include <stdio.h>
    #include "mpi.h"

    int main(int argc, char ** argv) {
            int p;
            int id;
            double wtime;

            //Inisialisasi MPI
            MPI_Init(&argc,&argv);

            //Mendapatkan id dan jumlah proses
            MPI_Comm_size(MPI_COMM_WORLD,&p);
            MPI_Comm_rank(MPI_COMM_WORLD,&id);

            wtime=MPI_Wtime();

            //Mendistribusi pekerjaan
            if(id==0) {
                   printf("MPI Hello - Master Process\n");
                   printf(" C / MPI version\n");
                   printf(" An example program\n\n");
                   printf(" The number of process = %d\n",p);
            }
            else {
                   printf("Process %d says 'Hello World!'\n",id);
            }

            if(id==0) {
                   printf("\n");
                   printf("Hello MPI - Master Process:\n");
                   printf(" Normal end of execution: 'Goodbye World!'\n\n");
                   wtime=MPI_Wtime() - wtime;
                   printf("Elapsed wall clock time = %g seconds\n", wtime);
            }

            //De-inisialisasi
            MPI_Finalize();
            return 0;
    }


    2.      openMP
    OpenMP (Open Multi-Processing) adalah sebuah API (application programming interface) yang mendukung multi-platform memori bersama pemrograman multiprocessing dalam C, C + +, dan Fortran, pada arsitektur prosesor paling dan sistem operasi, termasuk Linux, Unix, AIX, Solaris, Mac OS X, dan Microsoft Windows platform. Ini terdiri dari satu set arahan kompiler, rutinitas perpustakaan, dan variabel lingkungan yang mempengaruhi perilaku saat run-time

    Contoh model program parallel openMP

    #include <omp.h>
    #include <sdl.h>

    #include <windows.h>
    #include <math.h>



    void __putpixel(SDL_Surface* buffer, int x, int y, Uint32 color)

    {
        int bpp = buffer->format->BytesPerPixel;

        /* Here p is the address to the pixel we want to set */
        Uint8 *p = (Uint8 *)buffer->pixels + y * buffer->pitch + x * bpp;


        switch(bpp) {

        case 1:
            *p = color;

            break;



        case 2:
            *(Uint16 *)p = color;

            break;



        case 3:
            if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {

                p[0] = (color >> 16) & 0xff;
                p[1] = (color >> 8 ) & 0xff;

                p[2] = color & 0xff;
            } else {


                p[0] = color & 0xff;
                p[1] = (color >> 8 ) & 0xff;

                p[2] = (color >> 16) & 0xff;
            }


            break;



        case 4:
            *(Uint32 *)p = color;

            break;
        }


    }



    Uint32 __getpixel(SDL_Surface* buffer, int x, int y)
    {


        int bpp = buffer->format->BytesPerPixel;
        /* Here p is the address to the pixel we want to retrieve */

        Uint8 *p = (Uint8 *)buffer->pixels + y * buffer->pitch + x * bpp;



        switch(bpp) {
        case 1:


            return *p;



        case 2:
            return *(Uint16 *)p;


        case 3:

            if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
                return p[0] << 16 | p[1] << 8 | p[2];

            else
                return p[0] | p[1] << 8 | p[2] << 16;


        case 4:

            return *(Uint32 *)p;



        default:
            return 0;       /* shouldn't happen, but avoids warnings */

        }
    }



    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, intnShowCmd)

    {
        SDL_Surface *tmp, *screen;

         
        int i, j, w, h;

        int nThread, tid;
        Uint32 starttick;

        SDL_Event evt;
        int done = 0;


        FILE *deb = fopen("debug.txt", "w");
         


        fprintf(deb, "start \n");
        SDL_Init(SDL_INIT_VIDEO);

        atexit(SDL_Quit);
        tmp = SDL_LoadBMP("alfa256.bmp");

        w = tmp->w;
        h = tmp->h;

        screen = SDL_SetVideoMode(w, h, tmp->format->BitsPerPixel, SDL_SWSURFACE|SDL_ANYFORMAT);
        SDL_BlitSurface(tmp, NULL, screen, NULL);


        SDL_FreeSurface(tmp);
        tmp = screen;


         
        if ( SDL_MUSTLOCK(tmp) ) {

            if ( SDL_LockSurface(tmp) < 0 ) {
                fprintf(stderr, "Can't lock screen: %s\n", SDL_GetError());

                return;
            }


        }
         


        fprintf(deb, "starting block \n");
        starttick = SDL_GetTicks();


        #pragma omp parallel shared(tmp, w, h)
        {


            Uint8 r, g, b, a, tmpi;
            int i,j;


             
            #pragma omp for schedule(dynamic) nowait

            for (j=0; j<h; ++j){
                for (i=0; i<w; ++i){

                    SDL_GetRGBA(__getpixel(tmp, i, j), tmp->format, &r, &g, &b, &a);
                    tmpi = (Uint8)round(0.299 * r + 0.587 * g + 0.114 * b);


                    tmpi = (tmpi>128)?255:0;
                    __putpixel(tmp, i, j, SDL_MapRGBA(tmp->format, tmpi, tmpi, tmpi, a));

                }
                 


                SDL_UpdateRect(screen, 0, 0, 0, 0);
            }


        }
         


        SDL_UpdateRect(screen, 0, 0, 0, 0);
        fprintf(deb, "end block %d\n", SDL_GetTicks()-starttick);

         
        if ( SDL_MUSTLOCK(tmp) ) {

            SDL_UnlockSurface(tmp);
        }


         
        while(!done){

            while(SDL_PollEvent(&evt)){
                switch(evt.type){


                    case SDL_QUIT:
                        done = 1;


                    break;
                }


            }
        }


         
         

        fclose(deb);
        SDL_SaveBMP(tmp, "alfagrey.bmp");


        return 0;

    }


    3.       POSIX thread
    POSIX Thread, biasanya disebut sebagai pthreads, adalah standar POSIX untuk thread. Standar, POSIX.1c, Thread ekstensi (IEEE Std 1003.1c-1995), mendefinisikan sebuah API untuk menciptakan dan memanipulasi thread.
    Implementasi dari API yang tersedia pada banyak Unix-seperti POSIX-konforman sistem operasi  seperti FreeBSD, NetBSD, OpenBSD, GNU / Linux, Mac OS X dan Solaris. DR-DOS dan Microsoft   Windows implementasi juga ada: dalam subsistem SFU / SUA yang menyediakan implementasi asli dari sejumlah POSIX API, dan juga di dalam paket pihak ketiga seperti pthreads-W32,  yang mengimplementasikan pthreads di atas ada Windows API.

    Contoh Posix thread

    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/time.h>
    #include <pthread.h>
    #include <time.h>

    #define MAX_THREAD 16                         /* maximum number of threads */
    #define NDIM 1024                             /* number of NDIMs */
    double          a[NDIM][NDIM];
    double          b[NDIM][NDIM];
    double          c[NDIM][NDIM];
    struct timeval tvstart, tvstop;

    typedef struct
    {
        int             id;                       /* identification */
        int             noproc;                   /* process */
        int             dim;                      /* number of threads */
        double     (*a)[NDIM][NDIM],(*b)[NDIM][NDIM],(*c)[NDIM][NDIM];
    } parm;

    void mm(int me_no, int noproc, int n, double a[NDIM][NDIM], double b[NDIM][NDIM], double c[NDIM][NDIM])
    {
        int i,j,k;
        double sum;
        i=me_no;
        while (i<n) {
           for (j = 0; j < n; j++) {
              sum = 0.0;
              for (k = 0; k < n; k++) {
                 sum = sum + a[i][k] * b[k][j];
              }
              c[i][j] = sum;
           }
           i+=noproc;
        }
    }
    void * worker(void *arg)
    {
         parm           *p = (parm *) arg;
         mm(p->id, p->noproc, p->dim, *(p->a), *(p->b), *(p->c));
    }


    int main(int argc, char *argv[])
    {
       int             j, k, noproc, me_no;
       double          sum;
       double          t1, t2;
       pthread_t      *threads;
       parm           *arg;
       int             n, i;
       for (i = 0; i < NDIM; i++)
         for (j = 0; j < NDIM; j++) {
            a[i][j] = i + j;
            b[i][j] = i + j;
         }
       if (argc < 2) {
         n = MAX_THREAD;
       }
       else {
          n = atoi(argv[1]);
       }

       // start the bechmark timer
       gettimeofday(&tvstart, NULL);
       threads = (pthread_t *) malloc(n * sizeof(pthread_t));
       arg=(parm *)malloc(sizeof(parm)*n);

       for (i = 0; i < n; i++) {
            arg[i].id = i;
            arg[i].noproc = n;
            arg[i].dim = NDIM;
            arg[i].a = &a;
            arg[i].b = &b;
            arg[i].c = &c;
            pthread_create(&threads[i], NULL, worker, (void *)(arg+i));
        }

        for (i = 0; i < n; i++) {
            pthread_join(threads[i], NULL);
        }

        gettimeofday(&tvstop, NULL);

        double t = (tvstop.tv_sec - tvstart.tv_sec) * 1000 +
                   (tvstop.tv_usec - tvstart.tv_usec) * 1e-3;

        printf("Pthread: %d : Dim: %d : Time: %f\n", n, NDIM, t);

        free(arg);
        return 0;
    }



    Sumber :
    http://chachados.blogspot.com/2013/07/parallel-computation.html
    http://cerita-punyaryan.blogspot.com/2012/01/contoh-pemrograman-paralel-dengan-4.html