Pada pelatihan “An introduction to shared memory parallel programming using OpenMP” di Lund University, Swedia (29-30 Mei 2018), saya mendengar diskusi tentang pola pemrograman paralel. Sebagai programmer paralel, saya tertarik dengan apa yang orang katakan tentang pola pemrograman paralel, bagaimana perkembangannya, dan bagaimana pengaruhnya pada programmer paralel di masa depan. Diskusi berubah menjadi apakah pola pemrograman paralel akan mempengaruhi bahasa pemrograman secara langsung, atau tetap menjadi sesuatu yang dibangun dari pernyataan bahasa.
Bagi orang yang sudah memprogram komputer sejak Michael Jackson masih hidup, coba pikirkan kembali menulis program dengan bahasa assembly. Sebagian besar instruksi adalah Load, Store, Add, Compare, Jump, ditambah beberapa variasinya dan instruksi lain-lain. Untuk menerapkan looping pencacahan, programmer akan menggunakan cara sebagai berikut:
Inisialisasi counter
LOOP: tes kondisi akhir, ke EXIT jika selesai Tubuh loop Naikkan counter Ke LOOP EXIT: pernyataan berikutnya |
Di atas adalah pola pemrograman. Dengan instruksi pengujian kondisional yang tepat dan instruksi lompat dalam bahasa pemrograman, pola di atas dapat diimplementasikan dalam bahasa imperatif apa pun.
Berhubung pola di atas terbukti sangat berguna dan pervasif dalam komputasi yang sedang dilakukan, perancang bahasa pemrograman menambahkan sintak untuk “mengotomatiskan” langkah-langkah di atas. Sebagai contoh, looping “for” dalam bahasa C.
for (i = 0; i < N; ++i)
{ Tubuh Loop } |
Setelah programmer memiliki thread dan pustaka pendukung untuk membuat dan mengelola thread, maka pemrograman paralel dalam shared memory menjadi mudah, tetapi pada level yang cukup kasar karena programmer harus memastikan bahwa program menangani semuanya secara eksplisit. Sebagai contoh, membagi iterasi loop antara thread dapat dilakukan dengan cara setiap thread mengeksekusi kode seperti berikut ini:
start = (N/num_threads) * (myid)
end = (N/num_threads) * (myid + 1) if (myid == LAST) end = N for (i = start; i < end; ++i) { Tubuh Loop } |
Pola pemrograman paralel akan menjadi abstraksi yang dapat diimplementasikan dalam bahasa dan pustaka paralel saat ini, seperti pseudocode di atas. Bahasa baru akan membuat pola pemrograman paralel menjadi lebih mudah dan mengurangi kesalahan. Dari contoh di atas, OpenMP memiliki sintak untuk melakukan itu, tetapi hanya membutuhkan satu baris yang ditambahkan ke kode serial:
#pragma omp for
for (i = 0; i < N; ++i) { Tubuh Loop } |
Dari bukti di atas, saya pikir masa depan bahasa pemrograman paralel atau ekstensi bahasa yang mendukung paralelisme akan dipengaruhi oleh pola pemrograman paralel yang didefinisikan dan digunakan saat ini, dan tidak ada yang tetap statis.
Untuk jawaban atas pertanyaan yang diajukan pada judul di atas, bermuara pada paradoks lama yaitu ayam dan telur. Terdapat algoritme untuk melakukan komputasi sebelum adanya komputer; sebelum itu, algoritme tersebut adalah modifikasi dari algoritme sebelumnya yang dipengaruhi oleh peralatan yang tersedia. Generasi selanjutnya bahasa pemrograman paralel atau pustaka atau ekstensi bahasa serial akan dipengaruhi oleh pola yang digunakan sekarang untuk menentukan komputasi paralel.