Komunikasi antar image pada model coarray terjadi melalui dua sarana, yaitu penugasan jarak jauh (remote assignment) yang memindahkan data ke salinan milik image tertentu, serta operasi kolektif yang dipanggil semua image sekaligus seperti co_sum dan co_broadcast. Topik ini membahas keduanya melalui satu program utuh yang dikompilasi dan dijalankan sungguhan dengan gfortran, ditambah penjelasan mengapa keluaran pada eksekusi satu image terlihat seperti penugasan lokal biasa. Setelah topik ini selesai dibaca, pola pertukaran data antar image beserta batasan lingkungan eksekusinya sudah jelas.
Penugasan jarak jauh antar-image#
Rujukan coarray dengan pemilih image, misalnya salinan[1], dapat berada di sisi kanan maupun di sisi kiri sebuah penugasan. Pada sisi kanan, image yang mengeksekusi membaca salinan milik image lain, sedangkan pada sisi kiri, image yang mengeksekusi menulis ke salinan milik image lain. Penulisan pada sisi kiri inilah yang disebut penugasan jarak jauh, dan sifat jarak jauhnya ditentukan oleh image yang mengeksekusi pernyataan, bukan oleh image yang menjadi tujuan penulisan.
Bentuknya dapat melibatkan sebagian atau seluruh elemen array, misalnya salinan(:)[1] = sumber yang menyalin seluruh array sumber ke salinan milik image 1. Konsep penting di sini adalah setiap image hanya melihat ruang datanya sendiri, sehingga data yang berpindah antar image selalu dinyatakan secara eksplisit melalui kurung siku. Prinsip itu membedakan coarray dari memori bersama pada OpenMP, karena pada OpenMP variabel yang sama dapat dibaca dan ditulis tanpa penanda apa pun.
Program komunikasi_coarray#
Program berikut menyalin array ke salinan milik image 1, mencetak isi salinan tersebut, lalu memanggil dua operasi kolektif. Program dikompilasi dengan -fcoarray=single dan dijalankan dari direktori topik, dan blok berjudul Keluaran di bawahnya adalah hasil asli eksekusi tersebut.
program komunikasi_coarray
implicit none
integer, parameter :: n = 8
integer :: sumber(n) = [3, 1, 4, 1, 5, 9, 2, 6]
integer :: salinan(n)[*]
integer(kind=8) :: total
character(len=20) :: pesan
salinan = 0
salinan(:)[1] = sumber
sync all
print '(A, 8I3)', 'penugasan jarak jauh ke image 1 : ', salinan(:)[1]
total = int(sum(sumber), kind=8)
call co_sum(total)
print '(A, I0)', 'co_sum atas variabel total : ', total
pesan = 'kumpulan data siap'
call co_broadcast(pesan, source_image=1)
print '(A, A)', 'co_broadcast dari image 1 : ', trim(pesan)
end program komunikasi_coarray# mengompilasi dan menjalankan program dari direktori topik
gfortran -fcoarray=single komunikasi_coarray.f90 -o komunikasi_coarray
./komunikasi_coarraypenugasan jarak jauh ke image 1 : 3 1 4 1 5 9 2 6
co_sum atas variabel total : 31
co_broadcast dari image 1 : kumpulan data siapKeluaran di atas memperlihatkan tiga hal sekaligus, yaitu nilai yang berhasil ditulis ke image 1, hasil pembacaan yang cocok, dan perilaku khusus eksekusi satu image. Penugasan salinan(:)[1] = sumber menulis isian 3 1 4 1 5 9 2 6 ke salinan milik image 1, sedangkan baris cetak berikutnya membaca salinan(:)[1] dan mengembalikan isian yang sama, sehingga penulisannya berhasil diverifikasi. Pada eksekusi satu image, satu-satunya image yang berjalan adalah image 1, sehingga penugasan jarak jauh itu bekerja seperti penugasan lokal, tetapi sintaks dan semantiknya tetap merupakan komunikasi coarray yang sah.
Operasi kolektif dengan co_sum#
Operasi kolektif adalah prosedur yang harus dipanggil oleh semua image, dan hasilnya dihitung dari sumbangan seluruh image. co_sum menjumlahkan nilai argumen dari setiap image, sehingga setelah panggilan itu kembali, variabel total pada semua image memuat jumlah gabungannya. Pada eksekusi satu image, jumlah gabungan itu sama dengan nilai image itu sendiri, yaitu 31; angka ini cocok dengan penjumlahan elemen sumber karena program mengisi total dengan sum(sumber) lebih dahulu, sebelum co_sum dipanggil.
Standar Fortran juga menyediakan co_min, co_max, dan co_reduce untuk pola penggabungan yang lain, semuanya dengan pola pemanggilan yang sama seperti co_sum. Operasi kolektif mencakup sinkronisasi internal, sehingga tidak ada image yang mendahului yang lain saat menggabungkan nilainya. Karena setiap image wajib mencapai panggilan yang sama, penempatan operasi kolektif harus seragam di seluruh cabang eksekusi agar program tidak berhenti menunggu image yang tidak pernah memanggilnya.
Menyebarkan data dengan co_broadcast#
co_broadcast menyalin satu nilai dari image sumber ke variabel yang seposisi pada semua image lain, dan argumen source_image=1 menetapkan image 1 sebagai sumbernya. Pola ini lazim dipakai untuk menyebarkan data konfigurasi, ukuran masukan, atau penanda tahap kerja yang ditetapkan satu image dan harus diketahui semua image. Pada eksekusi satu image, nilai pesan tetap kumpulan data siap karena penerima dan pemberi data adalah image yang sama.
Berbeda dengan penugasan jarak jauh yang hanya melibatkan image pengeksekusi dan image tujuan, operasi kolektif melibatkan seluruh image secara serentak. Perbedaan cakupan peserta inilah yang menentukan sarana yang tepat untuk setiap kebutuhan, yaitu co_broadcast untuk pola satu ke banyak, co_sum dan kolektif sejenis untuk pola banyak ke banyak, serta rujukan kurung siku untuk pasangan image tertentu.
Batasan eksekusi satu image#
Pada lingkungan contoh ini, seluruh komunikasi di atas dieksekusi oleh satu image, sehingga efek jarak jauhnya tidak terlihat dan keluarannya deterministik. Untuk melihat komunikasi sungguhan antar image, program perlu dijalankan dengan runtime coarray, yaitu pustaka pendukung yang mengatur komunikasi antar image ketika program berjalan, dan pilihan yang mendukung banyak image adalah OpenCoarrays beserta perintah caf dan cafrun. Runtime tersebut tidak terpasang pada sandbox contoh, sehingga perintah berikut hanya sebagai acuan dan tidak dieksekusi.
# tidak-dijalankan
# eksekusi dua image membutuhkan OpenCoarrays (caf, cafrun) yang
# tidak terpasang pada sandbox contoh
caf komunikasi_coarray.f90 -o komunikasi_coarray
cafrun -np 2 ./komunikasi_coarrayApabila perintah itu dijalankan pada lingkungan yang lengkap, co_sum menggabungkan sumbangan dua image dan co_broadcast menyalin pesan dari image 1 ke image 2, sehingga nilai total pada eksekusi dua image berubah menjadi 62. Urutan cetakan antar image juga tidak dapat dipastikan lebih dahulu, sehingga keluaran multi-image sebaiknya ditafsirkan per image, bukan sebagai satu urutan cetakan yang pasti.
Ringkasan#
- Rujukan coarray dengan pemilih image dapat berada di kedua sisi penugasan, dan penugasan jarak jauh menulis ke salinan milik image lain secara eksplisit melalui kurung siku.
co_summenggabungkan nilai dari semua image dan menyimpan hasilnya pada setiap image, sedangkanco_broadcastmenyalin satu nilai dari image sumber ke semua image.- Operasi kolektif wajib dipanggil oleh seluruh image dan menyertakan sinkronisasi internal.
- Pada gfortran dengan
-fcoarray=single, seluruh komunikasi dieksekusi satu image sehingga keluarannya deterministik, sedangkan eksekusi banyak image membutuhkan OpenCoarrays dengancafrun -np 2.
Referensi#
- Learn: tutorial resmi Fortran — fortran-lang — Kumpulan tutorial resmi komunitas Fortran yang menjadi rujukan fitur bahasa pada jalur ini.
- The GNU Fortran Compiler — GNU Project
— Manual gfortran yang merinci opsi
-fcoarrayserta prosedur kolektif yang didukung kompiler. - OpenCoarrays — Sourcery Institute
— Proyek pustaka runtime coarray yang menyediakan perintah
cafdan peluncurcafrununtuk eksekusi banyak image.