Memulakan dan menghentikan program MPI. Fungsi asas MPI. Operasi pemindahan data

Nota ini menunjukkan cara memasang MPI, sambungkannya ke Studio Visual dan kemudian gunakan dengan parameter yang diberikan(bilangan nod pengkomputeran). Artikel ini menggunakan Visual Studio 2015, kerana... Ini adalah masalah yang pelajar saya hadapi (nota ini ditulis oleh pelajar untuk pelajar), tetapi arahan itu mungkin akan berfungsi untuk versi lain juga.

Langkah 1:
Anda mesti memasang HPC Pack 2008 SDK SP2 (dalam kes anda mungkin sudah ada versi yang berbeza), tersedia di tapak web rasmi Microsoft. Kapasiti bit pakej dan sistem mesti sepadan.

Langkah 2:
Anda perlu mengkonfigurasi laluan; untuk melakukan ini, pergi ke Debug - tab Properties:

"C:\Program Files\Microsoft HPC Pack 2008 SDK\Include"

Dalam medan Direktori Perpustakaan:

"C:\Program Files\Microsoft HPC Pack 2008 SDK\Lib\amd64"

Dalam bidang dengan perpustakaan, jika ia berharga 32 versi sedikit, bukannya amd64 anda perlu mendaftar i386.

Msmpi.lib

:

Langkah 3:

Untuk mengkonfigurasi pelancaran, anda perlu pergi ke tab Nyahpepijat dan dalam medan Perintah tentukan:

"C:\Program Files\Microsoft HPC Pack 2008 SDK\Bin\mpiexec.exe"

Dalam medan Argumen Perintah, nyatakan, sebagai contoh,

N 4 $(TargetPath)

Nombor 4 menunjukkan bilangan proses.

Untuk menjalankan program, anda perlu menyambungkan perpustakaan

Laluan ke projek tidak boleh mengandungi Cyrillic. Jika ralat berlaku, anda boleh menggunakan Microsoft MPI, tersedia di tapak web Microsoft.

Untuk melakukan ini, selepas pemasangan, hanya masukkan laluan dalam medan Perintah pada tab Nyahpepijat:

"C:\Program Files\Microsoft MPI\Bin\mpiexec.exe"

Juga, sebelum menjalankan program, jangan lupa untuk menunjukkan kedalaman bitnya:

Contoh menjalankan program dengan MPI:

#termasuk #termasuk menggunakan ruang nama std; int main(int argc, char **argv) ( int rank, size; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); cout<< "The number of processes: " << size << " my number is " << rank << endl; MPI_Finalize(); return 0; }

Menjalankan program pada 2 nod:

Fungsi MPI

Jenis Terbitan, Operasi, Jenis Data

Bhantar Penampan_lampirkan Dapatkan_kira ANY_SOURCE Sendrecv_ganti ANY_TAG Probe

Allgetherv Alltoall Alltoallv Kurangkan Rduce_scatter Scan

Jenis terbitan dibina daripada jenis MPI yang dipratentukan dan jenis terbitan yang ditakrifkan sebelum ini menggunakan fungsi pembina khas

MPI_Type_contiguous, MPI_Type_vector, MPI_Type_hvector, MPI_Type_indexed, MPI_Type_hindexed, MPI_Type_struct.

Jenis terbitan baharu didaftarkan dengan memanggil fungsi MPI_Type_commit. Hanya selepas pendaftaran jenis terbitan baharu boleh digunakan dalam rutin komunikasi dan dalam pembinaan jenis lain. Jenis MPI pratakrif dianggap berdaftar.

Apabila jenis terbitan tidak lagi diperlukan, ia dimusnahkan dengan fungsi MPI_Type_free.

1) MPI_Init - fungsi permulaan. Hasil daripada melaksanakan fungsi ini, kumpulan proses dibuat di mana semua proses aplikasi diletakkan, dan kawasan komunikasi dicipta, diterangkan oleh komunikator pratakrif MPI_COMM_WORLD.

MPI_Type_commit - pendaftaran jenis, MPI_Type_free - jenis kemusnahan

int MPI_Init(int *argc, char ***argv);

2) MPI_Finalize - Berfungsi untuk melengkapkan program MPI. Fungsi ini menutup semua proses MPI dan menghapuskan semua kawasan komunikasi.

int MPI_Finalize(void);

3) Berfungsi untuk menentukan bilangan proses dalam kawasan komunikasi MPI_Comm_size . Fungsi mengembalikan bilangan proses dalam kawasan komunikasi komunikator com.

int MPI_Comm_size(MPI_Comm comm, int *size);

4) Fungsi pengesanan nombor proses MPI_Comm_rank . Fungsi mengembalikan nombor proses yang dipanggil fungsi ini. Nombor proses berada dalam julat 0..saiz-1.

int MPI_Comm_rank(MPI_Comm comm, int *rank);

5) Fungsi mesej MPI_Send. Fungsi ini menghantar elemen kiraan jenis data mesej dengan tag pengecam untuk memproses tujuan dalam kawasan komunikasi komunikasi komunikator.

int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm);

6) Fungsi penerimaan mesej MPI_Recv. Fungsi ini menerima elemen kiraan jenis data mesej dengan tag pengecam daripada proses sumber dalam kawasan komunikasi komunikasi komunikator.

int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)

7) Fungsi pemasaan (pemasa) MPI_Wtime. Fungsi ini mengembalikan masa astronomi dalam beberapa saat yang telah berlalu sejak beberapa titik pada masa lalu (titik rujukan).

berganda MPI_Wtime(kosong)

Fungsi untuk menghantar mesej antara proses dibahagikan kepada:

Awalan S (segerak)

bermaksud mod pemindahan data segerak. Operasi penghantaran data tamat hanya apabila penerimaan data tamat. Fungsinya bukan tempatan.

Awalan B (ditimbal)

bermaksud mod pemindahan data buffer. Papan keratan dicipta dalam ruang alamat proses penghantaran menggunakan fungsi khas, yang digunakan dalam operasi pertukaran. Operasi hantar tamat apabila data diletakkan dalam penimbal ini. Fungsinya bersifat tempatan.

Awalan R (sedia)

mod penghantaran data yang dipersetujui atau disediakan. Operasi pemindahan data bermula hanya apabila pemproses penerima telah menetapkan tanda kesediaan untuk menerima data, memulakan operasi terima. Fungsinya bukan tempatan.

Awalan I (segera)

merujuk kepada operasi tidak menyekat.

MPI_Status struktur

Selepas membaca mesej, beberapa parameter mungkin tidak diketahui, seperti bilangan item yang dibaca, ID mesej dan alamat pengirim. Maklumat ini boleh diperoleh menggunakan parameter status. Pembolehubah status mesti diisytiharkan secara eksplisit dalam program MPI. Dalam bahasa C, status ialah struktur jenis MPI_Status dengan tiga medan MPI_SOURCE, MPI_TAG, MPI_ERROR.

8) Untuk menentukan bilangan elemen mesej yang sebenarnya diterima, anda mesti menggunakan fungsi khas MPI_Get_count .

int MPI_Get_count (MPI_Status *status, MPI_Datatype datatype, int *count);

9) Anda boleh menentukan parameter mesej yang diterima tanpa membacanya menggunakan fungsi MPI_Probe. int MPI_Probe (int source, int tag, MPI_Comm comm, MPI_Status *status);

10) Dalam situasi di mana anda perlu menukar data antara proses, adalah lebih selamat untuk menggunakan operasi gabungan MPI_Sendrecv . Dalam operasi ini, data yang dihantar daripada tatasusunan buf digantikan dengan data yang diterima.

int MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, MPI_Datatype recvtag, MPI_Comm comm, MPI_Status *status);

11) Fungsi untuk menyemak penyiapan operasi tidak menyekat MPI_Test.

int MPI_Test(MPI_Request *permintaan, int *bendera, MPI_Status *status);

Ini adalah operasi tanpa sekatan tempatan. Jika operasi yang dikaitkan dengan permintaan telah selesai, flag = true dikembalikan, dan status mengandungi maklumat tentang operasi yang telah selesai. Jika operasi yang diperiksa belum selesai, flag = false dikembalikan, dan nilai status tidak ditentukan dalam kes ini.

12) Fungsi untuk membatalkan permintaan tanpa menunggu selesainya operasi tidak menyekat MPI_Request_free.

int MPI_Request_free(MPI_Request *request);

Parameter permintaan ditetapkan kepada MPI_REQUEST_NULL.

13) Mencapai pelaksanaan cekap operasi pemindahan data daripada satu proses kepada semua proses program (penyiaran data) boleh dicapai menggunakan fungsi MPI:

int MPI_Bcast(void *buf,int count,MPI_Datatype type,int root,MPI_Comm comm)

Fungsi MPI_Bcast menyiarkan data daripada penimbal yang mengandungi elemen kiraan jenis jenis daripada punca bernombor proses kepada semua proses yang disertakan dalam komunikator komunikasi.

14) Jika anda perlu menerima mesej daripada sesiapa sahaja proses penghantaran boleh mempunyai nilai MPI_ANY_SOURCE yang ditentukan untuk parameter sumber

15) Jika perlu untuk menerima mesej dengan sebarang teg, nilai boleh ditentukan untuk parameter teg MPI_ANY_TAG

16) Parameter status membolehkan anda menentukan beberapa ciri mesej yang diterima:

- status.MPI_SOURCE – pangkat proses penghantaran mesej yang diterima,

- status.MPI_TAG - tag mesej yang diterima.

17) Fungsi

MPI_Get_count t(MPI_Status *status, MPI_Datatype type, int *count)

mengembalikan dalam pembolehubah kiraan bilangan elemen jenis jenis dalam mesej yang diterima.

18) Operasi yang memindahkan data daripada semua proses kepada satu proses. Dalam operasi ini pada yang dikumpul

nilai menjalankan satu atau lain pemprosesan data (untuk menekankan perkara terakhir, operasi ini juga dipanggil operasi pengurangan data)

int MPI_Reduce (void *sendbuf, void *recvbuf,int count,MPI_Datatype type, MPI_Op op,int root,MPI_Comm comm)

19) Penyegerakan proses, i.e. pencapaian serentak oleh proses titik tertentu proses pengiraan dipastikan menggunakan fungsi MPI: int MPI_Barrier(MPI_Comm comm); Fungsi MPI_Barrier mentakrifkan operasi kolektif dan, oleh itu, apabila digunakan, mesti dipanggil oleh semua proses komunikator yang digunakan. Apabila memanggil fungsi MPI_Barrier

pelaksanaan proses disekat; pengiraan proses akan diteruskan hanya selepas semua proses komunikator memanggil fungsi MPI_Barrier.

20) Untuk menggunakan mod pemindahan buffer, penimbal memori MPI mesti dibuat dan dipindahkan

untuk menampan mesej - fungsi yang digunakan untuk ini kelihatan seperti: int MPI_Buffer_attach (void *buf, saiz int),

- penimbal memori buf untuk menimbal mesej,

- saiz – saiz penimbal.

21) Selepas selesai bekerja dengan penimbal, ia mesti diputuskan dari MPI menggunakan fungsi:

int MPI_Buffer_detach (kosong *buf, int *saiz).

22) Mencapai pelaksanaan serentak yang cekap dan terjamin bagi operasi penghantaran dan penerimaan data boleh dicapai menggunakan fungsi MPI:

int MPI_Sendrecv (void *sbuf,int scount,MPI_Datatype stype,int dest, int stag, void *rbuf,int rcount,MPI_Datatype

rtype,int source,int rtag, MPI_Comm comm, MPI_Status *status)

23) Apabila mesej daripada jenis yang sama, MPI mempunyai keupayaan untuk menggunakan penimbal tunggal: intMPI_Sendrecv_replace (void *buf, int count, MPI_Datatype type, int dest,

int stag, int source, int rtag, MPI_Comm comm, status MPI_Status*)

24) Operasi umum penghantaran data daripada satu proses kepada semua proses (pengedaran data) berbeza daripada penyiaran kerana proses menghantar data yang berbeza kepada proses (lihat Rajah 4.4). Operasi ini boleh dicapai menggunakan fungsi:

int MPI_Scatter (void *sbuf,int scount,MPI_Datatype stype,

25) Operasi pemindahan data umum daripada semua pemproses kepada satu proses (pengumpulan data) adalah kebalikan prosedur pengedaran data (lihat Rajah 4.5). Untuk melaksanakan operasi ini dalam MPI terdapat fungsi:

int MPI_Gather (kosong *sbuf,int scount,MPI_Datatype stype,

batal *rbuf,int rcount,MPI_Datatype rtype, int root, MPI_Comm comm)

26) Perlu diingat bahawa apabila menggunakan fungsi MPI_Gather, pengumpulan data dijalankan sahaja

pada satu proses. Untuk mendapatkan semua data yang dikumpul pada setiap proses komunikator

anda perlu menggunakan fungsi pengumpulan dan pengedaran:

int MPI_Allgather (kosong *sbuf, int scount, MPI_Datatype stype, void *rbuf, int rcount, MPI_Datatype rtype, MPI_Comm comm)

27) Memindahkan data daripada semua proses kepada semua proses ialah operasi pemindahan data yang paling biasa (lihat Rajah 4.6). Operasi ini boleh dicapai menggunakan fungsi:

int MPI_Alltoall (kosong *sbuf,int scount,MPI_Datatype stype, void *rbuf,int rcount,MPI_Datatype rtype,MPI_Comm comm)

28) Fungsi MPI_Reduce menyediakan hasil pengurangan data

hanya pada satu proses. Untuk mendapatkan hasil pengurangan data pada setiap proses komunikator, anda mesti menggunakan fungsi pengurangan dan pengedaran:

int MPI_Allreduce (void *sendbuf, void *recvbuf,int count,MPI_Datatype type, MPI_Op op,MPI_Comm comm).

29) Dan satu lagi versi operasi pengumpulan dan pemprosesan data, yang memastikan semua hasil pengurangan separa diperoleh, boleh diperoleh menggunakan fungsi:

int MPI_Scan (void *sendbuf, void *recvbuf,int count,MPI_Datatype type, MPI_Op op,MPI_Comm comm).

Gambar rajah pelaksanaan umum bagi fungsi MPI_Scan ditunjukkan dalam Rajah. 4.7. Elemen mesej yang diterima mewakili hasil pemprosesan elemen sepadan mesej yang dihantar oleh proses, dan untuk mendapatkan hasil pada proses dengan pangkat i, 0≤i

30) Nilai awal pembolehubah bufpos mesti dibentuk sebelum pembungkusan bermula dan kemudian ditetapkan oleh fungsi MPI_Pack. Fungsi MPI_Pack dipanggil secara berurutan untuk membungkus semua data yang diperlukan.

int MPI_Pack_size (int count, MPI_Datatype type, MPI_Comm comm, int *size)

31) Selepas membungkus semua data yang diperlukan, penimbal yang disediakan boleh digunakan dalam fungsi pemindahan data dengan jenis MPI_PACKED yang ditentukan.

Selepas menerima mesej dengan jenis MPI_PACKED, data boleh dibongkar menggunakan fungsi:

int MPI_Unpack (void *buf, int bufsize, int *bufpos, void *data, int count, MPI_Datatype type, MPI_Comm comm)

Komputer Set Arahan Kompleks

CISC (Pengkomputeran set arahan Kompleks Bahasa Inggeris, atau komputer set arahan kompleks Bahasa Inggeris -

komputer dengan set arahan penuh) ialah konsep reka bentuk pemproses yang dicirikan oleh set sifat berikut:

sebilangan kecil daftar tujuan umum;

· sejumlah besar arahan mesin, beberapa daripadanya dimuatkan secara semantik serupa dengan pengendali bahasa pengaturcaraan peringkat tinggi dan dilaksanakan dalam banyak kitaran jam;

· sebilangan besar kaedah menangani;

· sebilangan besar format arahan pelbagai saiz bit;

· penguasaan format arahan dua alamat;

· kehadiran perintah pemprosesan jenis daftar-memori.

Kelemahan:

kos perkakasan yang tinggi; kesukaran dengan penyelarasan pengiraan.

Teknik pembinaan sistem arahan CISC adalah bertentangan dengan teknik lain - RISC. Perbezaan antara konsep ini terletak pada kaedah pengaturcaraan, bukan pada seni bina pemproses sebenar. Hampir semua pemproses moden meniru set arahan jenis RISC dan CISC.

Arahan Dikurangkan Set Komputer

Ia berdasarkan prinsip seni bina RISC: format arahan tetap, operasi daftar, pelaksanaan satu kitaran arahan, kaedah pengalamatan mudah, dan fail daftar yang besar. Pada masa yang sama, terdapat beberapa ciri penting yang membezakan seni bina ini daripada seni bina pemproses RISC yang lain. Ini termasuk: satu set daftar bebas untuk setiap penggerak; kemasukan arahan seperti CISC individu ke dalam sistem; kekurangan mekanisme "peralihan tertunda"; cara asal untuk melaksanakan lompatan bersyarat. Aplikasi utama seni bina mikropemproses ialah pelayan berprestasi tinggi dan superkomputer.

Komputer sedemikian adalah berdasarkan seni bina yang memisahkan arahan pemprosesan daripada arahan memori dan menekankan saluran paip yang cekap. Sistem arahan direka bentuk sedemikian rupa sehingga pelaksanaan mana-mana arahan mengambil sebilangan kecil kitaran mesin (sebaik-baiknya satu kitaran mesin). Logik itu sendiri untuk melaksanakan arahan untuk meningkatkan prestasi tertumpu pada perkakasan dan bukannya pelaksanaan perisian tegar. Untuk memudahkan logik penyahkodan perintah, arahan panjang tetap telah digunakan

Dan format tetap.

DALAM Apakah gunanya teknologi penimbal alamat sasaran peralihan?

DALAM Pemproses menyediakan mekanisme untuk meramalkan arah peralihan secara dinamik. Dengan ini

Sasaran pada cip ialah memori cache kecil yang dipanggil penimbal sasaran cawangan (BTB), dan dua pasangan bebas penampan prefetch arahan (dua penimbal 32-bit setiap saluran paip). Penimbal alamat sasaran cawangan menyimpan alamat arahan yang ada dalam penimbal praambil. Pengendalian penimbal prefetch diatur sedemikian rupa sehingga pada bila-bila masa, arahan diambil hanya ke dalam salah satu penimbal pasangan yang sepadan. Apabila operasi cawangan dikesan dalam aliran arahan, alamat cawangan yang dikira dibandingkan dengan alamat yang disimpan dalam BTB. Jika terdapat padanan, cawangan itu diramalkan akan berlaku dan penimbal prefetch lain didayakan dan mula mengeluarkan arahan kepada saluran paip yang sepadan untuk dilaksanakan. Jika terdapat ketidakpadanan, adalah diandaikan bahawa cawangan tidak akan dilaksanakan dan penimbal prefetch tidak ditukar, meneruskan perintah biasa yang mengeluarkan perintah. Ini mengelakkan masa henti penghantar

Konflik struktur dan cara untuk meminimumkannya

Mod gabungan pelaksanaan perintah secara amnya memerlukan saluran paip unit berfungsi dan pertindihan sumber untuk menyelesaikan semua kemungkinan gabungan arahan dalam saluran paip. Jika mana-mana gabungan arahan gagal

diterima kerana konflik sumber, maka mesin itu dikatakan mempunyai konflik struktur. Contoh mesin yang paling tipikal di mana konflik struktur mungkin timbul ialah mesin dengan peranti berfungsi yang tidak dihantar sepenuhnya.

Pengurangan: Saluran paip menjeda pelaksanaan salah satu arahan sehingga peranti yang diperlukan tersedia.

Konflik data, saluran paip berhenti dan pelaksanaan mekanisme pintasan

Salah satu faktor yang mempunyai kesan yang signifikan terhadap prestasi sistem penghantar ialah kebergantungan logik antara arahan. Konflik data timbul apabila penggunaan pemprosesan saluran paip boleh mengubah susunan panggilan operan supaya susunan ini berbeza daripada susunan yang diperhatikan apabila arahan dilaksanakan secara berurutan pada mesin yang tidak disalurkan. Masalah yang ditimbulkan dalam contoh ini boleh diselesaikan menggunakan teknik perkakasan yang agak mudah dipanggil pemajuan data, memintas data, atau kadang-kadang litar pintas.

Konflik data menyebabkan saluran paip dijeda

Sebaliknya, kami memerlukan perkakasan tambahan, dipanggil perkakasan interlook saluran paip, untuk memastikan contoh berjalan dengan betul. Secara umum, peralatan jenis ini mengesan konflik dan menjeda saluran paip selagi konflik wujud. Dalam kes ini, perkakasan ini menjeda saluran paip bermula dengan arahan yang ingin menggunakan data manakala arahan sebelumnya, yang hasilnya adalah operan kepada kami, menghasilkan keputusan tersebut. Peralatan ini menyebabkan barisan pengeluaran terhenti atau "gelembung" muncul dengan cara yang sama seperti dalam kes konflik struktur.

Penampan ramalan cawangan bersyarat

Penimbal ramalan cawangan bersyarat ialah memori kecil yang boleh dialamatkan oleh bit paling kurang penting bagi alamat arahan cawangan. Setiap sel memori ini mengandungi satu bit, yang menunjukkan sama ada cawangan sebelumnya telah dilaksanakan atau tidak. Ini adalah jenis penimbal yang paling mudah seperti ini. Ia tidak mempunyai teg dan hanya berguna untuk mengurangkan kependaman cawangan sekiranya kelewatan lebih lama daripada masa yang diperlukan untuk mengira nilai alamat sasaran cawangan. Penampan ramalan cawangan boleh dilaksanakan sebagai cache khusus kecil yang diakses oleh alamat arahan semasa peringkat pengambilan arahan saluran paip (IF), atau sebagai sepasang bit yang dikaitkan dengan setiap blok cache arahan dan diambil dengan setiap arahan.

Keselarian dalam bahasa C
Contoh 3b. Keselarian di Fortran
Contoh 4a. Menentukan ciri pemasa sistem dalam bahasa C
Contoh 4b. Menentukan ciri pemasa sistem dalam Fortran

1.4. Menghantar dan menerima mesej antara proses yang berasingan

1.4.1. Operasi titik ke titik

1.4.2. Menghantar dan menerima mesej dengan menyekat

Contoh 5a. Pertukaran mesej antara dua proses dalam bahasa C
Contoh 5b. Pertukaran mesej antara dua proses dalam Fortran
Contoh 6a. Pertukaran mesej antara proses genap dan ganjil dalam C
Contoh 6b. Pertukaran mesej antara proses genap dan ganjil dalam Fortran
Contoh 7a. Mengirim semula kepada proses yang tidak wujud dalam C
Contoh 7b. Mengirim semula kepada proses yang tidak wujud di Fortran
Contoh 8a. Penghantaran data buffer dalam bahasa C
Contoh 8b. Penghantaran data buffer dalam bahasa Fortran
Contoh 9a. Mendapatkan maklumat tentang atribut mesej dalam bahasa C
Contoh 9b. Mendapatkan maklumat tentang atribut mesej dalam Fortran
Contoh 10a. Definisi kependaman dan daya pemprosesan dalam bahasa C
Contoh 10b. Menentukan kependaman dan daya pengeluaran dalam Fortran

1.4.3. Menghantar dan menerima mesej tanpa menyekat

Contoh 11a. Bertukar atas topologi cincin menggunakan operasi tidak menyekat dalam C
Contoh 11b. Bertukar melalui topologi cincin menggunakan operasi tidak menyekat dalam Fortran
Contoh 12a. Skim komunikasi "tuan - pekerja" dalam bahasa C
Contoh 12b. Gambar rajah komunikasi "tuan - pekerja" dalam bahasa Fortran
Contoh 13a. Transposisi matriks dalam bahasa C
Contoh 13b. Memindahkan matriks dalam Fortran

1.4.4. Permintaan interaksi belum selesai

Contoh 14a. Skim kaedah berulang dengan pertukaran sepanjang topologi cincin menggunakan pertanyaan tertunda dalam bahasa C
Contoh 14b. Skim kaedah berulang dengan pertukaran atas topologi cincin menggunakan pertanyaan tertunda dalam Fortran

1.4.5. Situasi buntu

Contoh 15a. Bertukar melalui topologi cincin menggunakan prosedur MPI_Sendrecv dalam bahasa C
Contoh 15b. Bertukar melalui topologi cincin menggunakan prosedur MPI_SENDRECV dalam Fortran

1.5. Interaksi proses kolektif

1.5.1. Peruntukan am

1.5.2. Penghalang

Contoh 16a. Memodelkan penyegerakan halangan dalam bahasa C
Contoh 16b. Memodelkan penyegerakan halangan dalam Fortran

1.5.3. Operasi pemindahan data kolektif

1.5.4. Operasi Global

Contoh 17a. Memodelkan penjumlahan global menggunakan skema penggandaan dan operasi kolektif MPI_Reduce dalam bahasa C
Contoh 17b. Memodelkan penjumlahan global menggunakan skema penggandaan dan operasi kolektif MPI_Reduce dalam Fortran

1.5.5. Operasi Global Tersuai

Contoh 18a. Fungsi global tersuai dalam bahasa C
Contoh 18b. Fungsi global tersuai dalam Fortran

1.6. Kumpulan dan komunikator

1.6.1. Peruntukan am

1.6.2. Operasi dengan kumpulan proses

Contoh 19a. Bekerja dengan kumpulan dalam bahasa C
Contoh 19b. Bekerja dengan kumpulan di Fortran

1.6.3. Operasi dengan komunikator

Contoh 20a. Memecahkan komunikator dalam C
Contoh 20b. Membahagikan komunikator di Fortran
Contoh 21a. Proses pennomboran semula dalam bahasa C
Contoh 21b. Proses pennomboran semula di Fortran

1.6.4. Interkomunikator

Contoh 22a. Skim master-pekerja menggunakan interkomunikator dalam bahasa C
Contoh 22b. Litar master-pekerja menggunakan interkomunikator di Fortran

1.6.5. Atribut

1.7. Topologi maya

1.7.1. Peruntukan am

1.7.2. Topologi kartesian

1.7.3. Topologi graf

Contoh 23a. Gambar rajah master-worker menggunakan topologi graf dalam bahasa C
Contoh 23b. Skim master-pekerja menggunakan topologi graf dalam Fortran

1.8. Menghantar pelbagai jenis data

1.8.1. Peruntukan am

1.8.2. Jenis data terbitan

Contoh 24a. Menyusun semula lajur matriks dalam susunan terbalik dalam bahasa C
Contoh 24b. Menyusun semula lajur matriks dalam susunan terbalik dalam Fortran

1.8.3. Pembungkusan Data

Contoh 25a. Menghantar data yang dibungkus dalam bahasa C
Contoh 25b. Menghantar Data Pek dalam Fortran

1.9. objek maklumat

1.9.1. Peruntukan am

1.9.2. Bekerja dengan objek maklumat

1.10. Kawalan Proses Dinamik

1.10.1. Peruntukan am

1.10.2.Penciptaan proses

tuan.c
hamba.c
Contoh 26a. Skim master-worker menggunakan pemijahan proses dalam bahasa C
tuan.f
hamba.f
Contoh 26b. Skim master-pekerja menggunakan proses pemijahan di Fortran

1.10.3. Komunikasi pelanggan-pelayan

pelayan.c
klien.c
Contoh 27a. Pertukaran data antara pelayan dan klien menggunakan nama awam dalam bahasa C
pelayan.f
klien.f
Contoh 27b. Pertukaran data antara pelayan dan klien menggunakan nama awam dalam bahasa Fortran

1.10.4. Mengalih keluar perkaitan proses

1.10.5. Komunikasi Soket

1.11. Komunikasi sehala

1.11.1. Peruntukan am

1.11.2. Bekerja dengan tingkap

1.11.3. Pemindahan data

1.11.4. Penyegerakan

Contoh 28a
Contoh 28b
Contoh 29a. Bertukar melalui topologi cincin menggunakan komunikasi sehala dalam C
Contoh 29b. Bertukar melalui topologi cincin menggunakan komunikasi sehala di Fortran
Contoh 30a. Bertukar melalui topologi cincin menggunakan komunikasi sehala dalam C
Contoh 30b. Bertukar melalui topologi cincin menggunakan komunikasi sehala di Fortran

1.12. Antara muka luaran

1.12.1. Pertanyaan umum

1.12.2. Maklumat daripada status

1.12.3. Benang

1.13. I/O selari

1.13.1. Definisi

1.13.2. Bekerja dengan fail

1.13.3. Capaian data

Contoh 31a. Pembacaan penimbal daripada fail dalam bahasa C
Contoh 31b. Bacaan penimbal daripada fail dalam Fortran
Contoh 32a. Pembacaan kolektif daripada fail dalam bahasa C
Contoh 32b. Pembacaan kolektif daripada fail dalam Fortran

1.14. Ralat pemprosesan

1.14.1. Peruntukan am

1.14.2. Pengendali ralat yang dikaitkan dengan komunikator

1.14.3. Pengendali ralat berkaitan tetingkap

1.14.4. Pengendali ralat berkaitan fail

1.14.5. Prosedur tambahan

1.14.6. Kod ralat dan kelas

1.14.7. Memanggil Pengendali Ralat

Contoh 33a. Ralat pengendalian dalam bahasa C
Contoh 33b. Pengendalian Ralat dalam Fortran

Bab 2 Teknologi Pengaturcaraan Selari OpenMP

2.1. pengenalan

2.2. Konsep asas

2.2.1. Menyusun program

Contoh 34a. Kompilasi bersyarat dalam C
Contoh 34b
Contoh 34c. Kompilasi bersyarat dalam Fortran

2.2.2. Model program selari

2.2.3. Arahan dan prosedur

2.2.4. Pelaksanaan Program

2.2.5. Masa

Contoh 35a. Bekerja dengan pemasa sistem dalam C
Contoh 35b. Bekerja dengan pemasa sistem di Fortran

2.3. Kawasan selari dan bersiri

2.3.1. arahan selari

Contoh 36a. Rantau selari dalam bahasa C
Contoh 36b. Kawasan selari di Fortran
Contoh 37a. Pilihan pengurangan dalam bahasa C
Contoh 37b. Pilihan pengurangan dalam Fortran

2.3.2. Notasi ringkas

2.3.3. Pembolehubah Persekitaran dan Prosedur Pembantu

Contoh 38a. Prosedur Omp_set_num_threads dan pilihan num_threads dalam bahasa C
Contoh 38b. Prosedur omp_set_num_threads dan option num_threads dalam bahasa Fortran
Contoh 39a. Prosedur omp_set_dynamic dan omp_get_dynamic dalam bahasa C
Contoh 39b. Prosedur omp_set_dynamic dan omp_get_dynamic dalam Fortran
Contoh 40a. Kawasan Selari Bersarang di C
Contoh 40b. Kawasan Selari Bersarang di Fortran
Contoh 41a. Fungsi Omp_in_parallel dalam bahasa C
Contoh 41b. Fungsi omp_in_parallel dalam bahasa Fortran

2.3.4. arahan tunggal

Contoh 42a. Arahan tunggal dan pilihan nowait dalam bahasa C
Contoh 42b. Arahan tunggal dan pilihan tunggu di Fortran
Contoh 43a. Pilihan copyprivate dalam bahasa C
Contoh 43b. pilihan copyprivate dalam Fortran

2.3.5. arahan induk

Contoh 44a. Arahan induk dalam bahasa C
Contoh 44b. arahan induk di Fortran

2.4. Model data

Contoh 45a. Pilihan peribadi dalam bahasa C
Contoh 45b. Pilihan peribadi di Fortran
Contoh 46a. Pilihan dikongsi dalam bahasa C
Contoh 46b. Pilihan yang dikongsi dalam Fortran
Contoh 47a. pilihan peribadi pertama dalam bahasa C
Contoh 47b. pilihan peribadi pertama di Fortran
Contoh 48a. arahan threadprivate dalam bahasa C
Contoh 48b. arahan threadprivate dalam Fortran
Contoh 49a. Pilihan salin dalam bahasa C
Contoh 49b. pilihan salin dalam Fortran

2.5. Pengagihan kerja

2.5.1. Keselarian peringkat rendah

Contoh 50a. Prosedur omp_get_num_threads dan omp_get_thread_num dalam bahasa C
Contoh 50b. Prosedur omp_get_num_threads dan omp_get_thread_num dalam Fortran

2.5.2. Gelung selari

Contoh 51a. untuk arahan dalam bahasa C
Contoh 51b. Arahan do di Fortran
Contoh 52a. Pilihan jadual dalam bahasa C
Contoh 52b. pilihan jadual di Fortran
Contoh 53a. Pilihan jadual dalam bahasa C

Fungsi Asas MPI

Teknologi pengaturcaraan yang paling biasa untuk sistem selari dengan memori teragih pada masa ini ialah MPI (Antara Muka Mesej Mesej). Cara utama proses selari berinteraksi antara satu sama lain dalam sistem tersebut ialah Message Passing. Pada asasnya, MPI ialah perpustakaan dan persekitaran pelaksanaan untuk program selari dalam C atau Fortran. Tutorial ini akan menerangkan contoh program dalam bahasa C.

Pada mulanya, MPI membenarkan penggunaan model pengaturcaraan MIMD (Multiple Instruction Multiple Data) - banyak aliran arahan dan data, i.e. menggabungkan program yang berbeza dengan data yang berbeza. Tetapi pengaturcaraan untuk model sedemikian dalam amalan ternyata terlalu kompleks, jadi model SIMD (Single Program Multiple Data) biasanya digunakan - satu program dan banyak aliran data. Di sini, atur cara selari ditulis sedemikian rupa sehingga bahagian-bahagiannya yang berlainan boleh melaksanakan bahagian tugasnya secara serentak, sekali gus mencapai keselarian. Memandangkan semua fungsi MPI terkandung dalam perpustakaan, apabila menyusun atur cara selari adalah perlu untuk memautkan modul yang sepadan.

Dalam MPI, program selari ditakrifkan sebagai satu set proses melaksanakan serentak. Proses boleh dilaksanakan pada pemproses yang berbeza, tetapi beberapa proses juga boleh diletakkan pada pemproses yang sama (dalam kes ini, ia dilaksanakan dalam mod perkongsian masa). Apabila menjalankan program MPI pada kluster, setiap nodnya akan menjalankan salinan programnya sendiri, melaksanakan bahagian tugasnya sendiri, ia mengikuti bahawa program selari ialah satu set proses berinteraksi, setiap satunya berfungsi dengan sendiri. ruang alamat. Dalam kes yang melampau, satu pemproses boleh digunakan untuk melaksanakan program selari - sebagai peraturan, kaedah ini digunakan untuk memeriksa ketepatan program selari pada mulanya.

Bilangan proses dan bilangan pemproses yang digunakan ditentukan pada masa program selari dilancarkan menggunakan persekitaran pelaksanaan program MPI dan tidak boleh berubah semasa pengiraan. Semua proses program dinomborkan secara berurutan dari 0 hingga np-1, di mana np ialah jumlah bilangan proses. Nombor proses dipanggil peringkat proses.

Proses selari berinteraksi antara satu sama lain dengan menghantar mesej. Terdapat dua jenis kaedah penghantaran (ia dipanggil komunikasi) - kolektif dan point-to-point. Dengan komunikasi kolektif, proses menghantar maklumat yang diperlukan secara serentak kepada keseluruhan kumpulan proses; terdapat juga kes yang lebih umum apabila, dalam kumpulan proses, maklumat dipindahkan dari setiap proses kepada setiap proses. Komunikasi yang lebih mudah ialah komunikasi point-to-point, di mana satu proses menghantar maklumat kepada yang lain atau kedua-duanya bertukar maklumat. Fungsi komunikasi adalah fungsi utama perpustakaan MPI. Selain itu, fungsi yang diperlukan ialah fungsi permulaan dan penamatan MPI – MPI_Init dan MPI_Finalize. MPI_Init harus dipanggil pada awal program, dan MPI_Finalize pada penghujungnya. Semua fungsi MPI lain mesti dipanggil antara kedua-dua fungsi ini.

Bagaimanakah proses mengetahui bahagian pengiraan yang harus dilakukannya? Setiap proses yang berjalan pada kluster mempunyai nombor uniknya sendiri - pangkat. Sebaik sahaja proses mengetahui kedudukannya dan jumlah bilangan proses, ia boleh menentukan bahagian kerjanya. Untuk tujuan ini, terdapat fungsi khas dalam MPI - MPI_Comm_rank dan MPI_Comm_size. MPI_Comm_rank mengembalikan kedudukan integer bagi proses yang memanggilnya, dan MPI_Comm_size mengembalikan jumlah bilangan proses yang berjalan.

Proses program pengguna selari yang dinyahpepijat digabungkan ke dalam kumpulan. Dalam MPI, komunikator difahami sebagai objek perkhidmatan yang dicipta khas yang menggabungkan sekumpulan proses dan beberapa parameter tambahan (konteks) yang digunakan semasa melakukan operasi pemindahan data. Komunikator yang dicipta secara automatik apabila program bermula dan merangkumi semua proses pada kluster dipanggil MPI_COMM_WORLD. Semasa pengiraan, kumpulan proses dan komunikator baharu boleh dibuat dan kumpulan proses dan komunikator sedia ada boleh dipadamkan. Proses yang sama boleh dimiliki oleh kumpulan dan komunikator yang berbeza. Operasi kolektif digunakan secara serentak untuk semua proses komunikator, jadi bagi mereka salah satu parameter akan sentiasa menjadi komunikator.

Apabila melakukan operasi menghantar mesej dalam fungsi MPI, adalah perlu untuk menentukan jenis data yang dihantar. MPI mengandungi set besar jenis data asas berdasarkan jenis data standard bahasa C. Selain itu, pengaturcara boleh membina jenis datanya sendiri menggunakan fungsi MPI khas. Di bawah ialah jadual pemetaan untuk jenis data asas.

Pemalar MPI Jenis data bahasa C
MPI_INT ditandatangani int
MPI_UNSIGNED int yang tidak ditandatangani
MPI_SHORT ditandatangani int
MPI_LONG ditandatangani int panjang
MPI_UNSIGNED_SHORT int yang tidak ditandatangani
MPI_UNSIGNED_LONG int panjang yang tidak ditandatangani
MPI_FLOAT terapung
MPI_DOUBLE berganda
MPI_LONG_DOUBLE berganda panjang
MPI_UNSIGNED_CHAR char yang tidak ditandatangani
MPI_CHAR char yang ditandatangani

Contoh pelancaran perpustakaan MPI: pelajar log masuk, kata laluan s304.

#termasuk

#termasuk

int utama (int argc, char *argv)

/* Permulaan MPI */

MPI_Init(&argc, &argv);

/* mendapat peringkat proses */

MPI_Comm_rank (MPI_COMM_WORLD, &rank);

/* dapatkan jumlah proses */

MPI_Comm_size (MPI_COMM_WORLD, &size);

printf("Hello dunia daripada proses %d daripada %d\n", pangkat, saiz);

/* MPI lengkap */

Pengkompil dan penghubung digunakan untuk penyusunan. Barisan arahan mpicc. (lihat mpicc….- bantuan)

Setiap proses yang dijalankan harus memaparkan kedudukannya dan jumlah bilangan proses. Mari cuba menyusun dan menjalankan program ini.

$ mpicc hello.c –o hello.o

$ mpicc hello.o –o hello

Fail hello akan menjadi contoh fail boleh laku. Anda boleh menjalankannya pada satu mesin dan melihat bahawa bilangan pemproses akan sama dengan 1, dan peringkat proses ialah 0:

$./hello

Hello dunia daripada proses 0 daripada 1

Apabila bekerja pada pelayan, arahan digunakan untuk memulakan mpirun . Ia mempunyai dua hujah utama - nama fail yang mengandungi alamat nod dan bilangan nod di mana program akan dijalankan.

$ mpirun n0-6 –v menjadi tuan rumah hello

Hello dunia daripada proses 0 daripada 7

Hello dunia daripada proses 3 daripada 7

Hello dunia daripada proses 5 daripada 7

Hello dunia daripada proses 4 daripada 7

Hello dunia daripada proses 2 daripada 7

Hello dunia daripada proses 6 daripada 7

Hello dunia daripada proses 1 daripada 7

Program ini akan dijalankan pada 7 nod (termasuk pelayan), dan alamat nod ini berada dalam fail hos. Mencetak ke skrin telah dilakukan oleh proses yang tidak mengikut urutan kedudukan mereka. Ini kerana perjalanan proses tidak disegerakkan, tetapi MPI mempunyai fungsi khas untuk menyegerakkan proses.

Program paling mudah tidak mengandungi fungsi pemindahan mesej. Dalam masalah sebenar, proses perlu berinteraksi antara satu sama lain. Sememangnya, masa dibelanjakan untuk menghantar mesej, yang mengurangkan pekali selari tugas. Semakin tinggi kelajuan antara muka pemindahan mesej (contohnya, 10Mb/sec Ethernet dan Gigabit Ethernet), semakin rendah kos pemindahan data. Kerana masa untuk pertukaran data antara proses adalah banyak (mengikut urutan magnitud) lebih lama daripada masa capaian ke ingatannya sendiri, pengagihan kerja antara proses haruslah 'berbutir kasar', dan pemindahan data yang tidak perlu harus dielakkan.

Di antara masalah analisis berangka, terdapat banyak masalah yang keselariannya jelas. Sebagai contoh, integrasi berangka sebenarnya datang kepada (berbilang) pengiraan fungsi integrand (yang secara semula jadi diamanahkan kepada proses individu), manakala proses utama mengawal proses pengiraan (menentukan strategi untuk mengagihkan titik integrasi antara proses dan mengumpul jumlah separa) . Masalah mencari dan mengisih dalam senarai linear, mencari punca fungsi secara numerik, mencari ekstrem bagi fungsi banyak pembolehubah, mengira siri, dan lain-lain mempunyai keselarian yang serupa. Dalam makmal ini kita akan melihat dua algoritma selari untuk mengira π.

Pengiraan nombor π dengan kaedah pengamiran berangka

Adalah diketahui bahawa

Menggantikan pengiraan kamiran dengan penjumlahan terhingga, kita ada , dengan n ialah bilangan bahagian penjumlahan semasa penyepaduan berangka. Luas setiap bahagian dikira sebagai hasil darab lebar 'jalur' dan nilai fungsi di tengah 'jalur', kemudian kawasan itu dijumlahkan dengan proses utama (grid seragam ialah digunakan).

Jelas sekali, penyelarasan masalah ini mudah dilakukan jika setiap proses mengira jumlah separanya dan kemudian menghantar hasil pengiraan ke proses utama. Bagaimanakah saya boleh mengelakkan pengiraan berulang di sini? Proses mesti mengetahui kedudukannya, jumlah proses dan bilangan selang di mana segmen akan dibahagikan (semakin banyak selang, semakin tinggi ketepatannya). Kemudian, dalam kitaran dari 1 hingga bilangan selang, proses akan mengira luas jalur pada selang ke-i, dan kemudian beralih bukan ke selang i+1 seterusnya, tetapi ke selang i+m , dengan m ialah bilangan proses. Seperti yang kita sedia maklum, terdapat fungsi untuk mendapatkan pangkat dan jumlah proses MPI_Comm_rank Dan MPI_Comm_size . Sebelum memulakan pengiraan, proses utama mesti menghantar bilangan selang kepada orang lain, dan selepas pengiraan, kumpulkan jumlah separa yang diterima daripada mereka dan jumlahnya; dalam MPI ini dilaksanakan dengan menghantar mesej. Ia adalah mudah untuk menggunakan fungsi interaksi kolektif di sini untuk menghantar mesej MPI_Bcast , yang menghantar data yang sama dari satu proses kepada semua yang lain. Untuk mengumpul amaun separa terdapat 2 pilihan - anda boleh gunakan MPI_Berkumpul , yang mengumpul data daripada semua proses dan memberikannya kepada satu (susunan m elemen diperolehi, dengan m ialah bilangan proses) atau MPI_Kurangkan . MPI_Kurangkan bertindak serupa MPI_Berkumpul – mengumpul data daripada semua proses dan memberikannya kepada satu, tetapi bukan dalam bentuk tatasusunan, tetapi mula-mula melakukan operasi tertentu antara elemen tatasusunan, contohnya, penjumlahan, dan kemudian memberikan satu elemen. Untuk tugasan ini nampaknya lebih senang digunakan MPI_Kurangkan . Teks program diberikan di bawah

#include "mpi.h"

#termasuk

#termasuk

double f(double a)

pulangan (4.0 / (1.0 + a*a));

int utama(int argc, char *argv)

int n, myid, nuprocs, i;

PI25DT berganda = 3.141592653589793238462643;

mypi ganda, pi, h, jumlah, x;

double startwtime, endwtime;

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

startwtime = MPI_Wtime();

MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

h = 1.0 / (berganda) n;

untuk (i = myid + 1; i<= n; i += numprocs)

x = h * ((berganda)i - 0.5);

MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

printf("pi ialah lebih kurang %.16f, Ralat ialah %.16f\n",

pi, fabs(pi - PI25DT));

endwtime = MPI_Wtime();

printf("masa jam dinding = %f\n",

endwtime-startwtime);

Mari kita lihat lebih dekat pada panggilan fungsi MPI_Bcast Dan MPI_Kurangkan :

MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD) – kandungan pembolehubah n dan satu elemen jenis MPI_INT daripada proses dengan kedudukan 0 dihantar ke semua proses lain (MPI_COMM_WORLD – semua proses dalam komunikator) ke dalam pembolehubah yang sama n . Selepas panggilan ini, setiap proses akan mengetahui jumlah bilangan selang. Pada penghujung pengiraan, MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD) menjumlahkan (parameter MPI_SUM) nilai daripada pembolehubah mypi jenis MPI_DOUBLE setiap proses dan menulis hasilnya kepada proses pi pembolehubah dengan pangkat 0. Untuk mengukur masa pengiraan, proses utama menggunakan fungsi MPI_Wtime.

berganda MPI_Wtime();

MPI_Wtime mengembalikan bilangan saat dalam format titik terapung, mewakili masa yang telah berlalu sejak program bermula.

Mengira nombor π menggunakan kaedah Monte Carlo

Untuk mengira nilai π, anda boleh menggunakan kaedah 'menembak'. Apabila digunakan pada kes ini, kaedah ini terdiri daripada menjana mata yang diagihkan secara seragam pada kawasan dua dimensi dan menentukan .

Nilai π yang dikira dengan cara ini adalah anggaran, secara amnya, ketepatan pengiraan nilai yang diingini meningkat dengan bilangan 'tembakan' dan kualiti penjana nombor rawak; Kaedah yang sama digunakan apabila sukar untuk membuat anggaran berangka yang tepat.

Algoritma selari untuk mengira nombor π menggunakan kaedah ini dalam banyak cara serupa dengan algoritma sebelumnya yang kami pertimbangkan. Untuk menjana nombor rawak, anda perlu menggunakan fungsi srand, yang menetapkan pangkat proses sebagai hujah (benih jujukan), supaya setiap proses akan mempunyai urutannya sendiri.

#termasuk

void srand(benih tidak bertanda);

Fungsi srand() menetapkan nombor benih untuk jujukan yang dihasilkan oleh fungsi rand().

#termasuk

int rand(kosong);

Fungsi rand() menjana urutan nombor pseudorandom. Setiap kali fungsi dipanggil, integer antara sifar dan nilai RAND_MAX dikembalikan.

Untuk mengumpul hasil di sini, ia juga mudah untuk menggunakan MPI_Reduce dengan operasi penjumlahan (MPI_SUM), kemudian bahagikan jumlah yang terhasil dengan bilangan pemproses, mendapatkan purata aritmetik.

int MPI_Reduce(void* sendbuf, void* recvbuf, int count,

MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm);

Pilihan:

alamat sendbuf penimbal penghantaran

alamat recvbuf bagi penimbal penerima

operasi pengurangan op

komunikator kom

int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root,

MPI_Comm comm);

Pilihan:

alamat penimbal bagi penimbal menghantar/menerima

kira bilangan elemen dalam penimbal hantar (integer)

jenis data jenis data menghantar elemen penimbal

nombor proses utama akar (integer)

komunikator kom

Senaman: mengikut nombor pilihan, susun dan jalankan atur cara selari yang mengira nombor π menggunakan algoritma yang diberikan.

Jalankan tugas pada satu nod dan dari kluster pada bilangan nod yang ditentukan. Menilai masa pengiraan, ketepatan dan pekali selari Amdahl dengan mengambil kira kelewatan rangkaian secara teori dan berdasarkan hasil kerja.

Pilihan tugas

Pilihan No. Algoritma Bilangan pemproses Bilangan lelaran pada setiap pemproses
Penyepaduan berangka
Monte Carlo
Penyepaduan berangka
Monte Carlo
Penyepaduan berangka
Monte Carlo
Penyepaduan berangka
Monte Carlo
Penyepaduan berangka
Monte Carlo
Penyepaduan berangka
Monte Carlo
Penyepaduan berangka
Monte Carlo
Penyepaduan berangka
Monte Carlo
Penyepaduan berangka
Monte Carlo
Penyepaduan berangka
Monte Carlo

· Pernyataan masalah, pilihan.

· Teks program selari dalam bahasa C mengikut tugasan.

· Keputusan menjalankan program pada satu nod, masa pelaksanaan t i , hasil pengiraan, ralat.

· Keputusan menjalankan program pada pelayan, masa pelaksanaan, keputusan pengiraan, ralat.

· Terangkan algoritma selari, aliran maklumat semasa pelaksanaan program dan pemuatan memori cache nod. Kira pekali Amdahl - K j berdasarkan keputusan program.

· Mengambil kira hasil kerja sekumpulan pelajar, bina histogram pergantungan K j , t i pada bilangan pemproses yang mengambil bahagian dalam pengiraan.

Anotasi: Kuliah ini ditumpukan kepada pertimbangan teknologi MPI sebagai piawaian pengaturcaraan selari untuk sistem ingatan teragih. Mod utama penghantaran data dipertimbangkan. Konsep seperti kumpulan proses dan komunikator diperkenalkan. Meliputi jenis data asas, operasi titik ke titik, operasi kolektif, operasi penyegerakan dan pengukuran masa.

Tujuan kuliah: Kuliah ini bertujuan untuk mengkaji metodologi umum untuk membangunkan algoritma selari.

Rakaman video kuliah - (volume - 134 MB).

5.1. MPI: konsep asas dan definisi

Mari kita pertimbangkan beberapa konsep dan definisi yang asas kepada piawaian MPI.

5.1.1. Konsep program selari

Di bawah program selari dalam rangka kerja MPI, kami memahami satu set yang dilaksanakan serentak proses. Proses boleh dilaksanakan pada pemproses yang berbeza, tetapi beberapa proses juga boleh diletakkan pada pemproses yang sama (dalam kes ini, ia dilaksanakan dalam mod perkongsian masa). Dalam kes yang melampau, satu pemproses boleh digunakan untuk melaksanakan program selari - sebagai peraturan, kaedah ini digunakan untuk memeriksa ketepatan program selari pada mulanya.

Setiap proses atur cara selari dihasilkan daripada salinan kod atur cara yang sama ( model SPMP). Kod program ini, yang dibentangkan dalam bentuk program boleh laku, mesti tersedia pada masa program selari dilancarkan pada semua pemproses yang digunakan. Kod sumber untuk program boleh laku dibangunkan dalam bahasa algoritma C atau Fortran menggunakan satu atau satu lagi pelaksanaan perpustakaan MPI.

Bilangan proses dan bilangan pemproses yang digunakan ditentukan pada masa program selari dilancarkan menggunakan persekitaran pelaksanaan program MPI dan tidak boleh berubah semasa pengiraan (standard MPI-2 memperuntukkan kemungkinan menukar bilangan proses secara dinamik). Semua proses program dinomborkan secara berurutan dari 0 hingga p-1, Di mana hlm ialah jumlah keseluruhan proses. Nombor proses dipanggil pangkat proses.

5.1.2. Operasi pemindahan data

MPI adalah berdasarkan operasi menghantar mesej. Antara fungsi yang disediakan sebagai sebahagian daripada MPI, ada yang berbeza berganda (titik ke titik) operasi antara dua proses dan kolektif (kolektif) tindakan komunikasi untuk interaksi serentak beberapa proses.

Untuk melaksanakan operasi berpasangan, mod penghantaran yang berbeza boleh digunakan, termasuk segerak, menyekat, dll. - pertimbangan penuh kemungkinan mod penghantaran akan dilaksanakan dalam subseksyen 5.3.

Seperti yang dinyatakan sebelum ini, piawaian MPI memperuntukkan keperluan untuk melaksanakan kebanyakan operasi pemindahan data kolektif asas - lihat subseksyen 5.2 dan 5.4.

5.1.3. Konsep komunikator

Proses program selari digabungkan menjadi kumpulan. Di bawah komunikator MPI merujuk kepada objek perkhidmatan yang dicipta khas yang menggabungkan sekumpulan proses dan beberapa parameter tambahan ( konteks) digunakan semasa menjalankan operasi pemindahan data.

Biasanya, operasi pemindahan data berpasangan dilakukan untuk proses yang dimiliki oleh komunikator yang sama. Operasi kolektif digunakan secara serentak untuk semua proses komunikator. Akibatnya, menentukan komunikator untuk digunakan adalah wajib untuk operasi pemindahan data dalam MPI.

Semasa pengiraan, kumpulan proses dan komunikator baharu boleh dibuat dan kumpulan proses dan komunikator sedia ada boleh dipadamkan. Proses yang sama boleh dimiliki oleh kumpulan dan komunikator yang berbeza. Semua proses yang terdapat dalam program selari disertakan dalam komunikator yang dibuat secara lalai dengan pengecam MPI_COMM_WORLD.

Sekiranya perlu untuk memindahkan data antara proses dari kumpulan yang berbeza, adalah perlu untuk mewujudkan komunikator global ( interkomunikator).

Perbincangan terperinci tentang keupayaan MPI untuk bekerja dengan kumpulan dan komunikator akan dilakukan dalam subseksyen 5.6.

5.1.4. Jenis data

Apabila melakukan operasi menghantar mesej, anda mesti menentukan data yang akan dihantar atau diterima dalam fungsi MPI. menaip data yang dihantar. MPI mengandungi set besar jenis asas data yang sebahagian besarnya bertepatan dengan jenis data dalam bahasa algoritma C dan Fortran. Di samping itu, MPI mempunyai keupayaan untuk mencipta baharu jenis terbitan data untuk penerangan yang lebih tepat dan padat tentang kandungan mesej yang dimajukan.

Perbincangan terperinci tentang keupayaan MPI untuk bekerja dengan jenis data terbitan akan dilakukan dalam subseksyen 5.5.

5.1.5. Topologi maya

Seperti yang dinyatakan sebelum ini, operasi pemindahan data berpasangan boleh dilakukan antara mana-mana proses komunikator yang sama, dan semua proses komunikator mengambil bahagian dalam operasi kolektif. Dalam hal ini, topologi logik talian komunikasi antara proses mempunyai struktur graf yang lengkap (tanpa mengira kehadiran saluran komunikasi fizikal sebenar antara pemproses).

Pada masa yang sama (dan ini telah dinyatakan dalam Bahagian 3), untuk pembentangan dan analisis seterusnya beberapa algoritma selari, adalah dinasihatkan untuk mempunyai perwakilan logik rangkaian komunikasi sedia ada dalam bentuk topologi tertentu.

MPI mempunyai keupayaan untuk mewakili pelbagai proses dalam bentuk jeriji dimensi sewenang-wenangnya (lihat subseksyen 5.7). Dalam kes ini, proses sempadan kekisi boleh diisytiharkan berjiran dan, dengan itu, berdasarkan kekisi, struktur jenis torus.

Selain itu, MPI mempunyai alat untuk menjana topologi logik (maya) dari sebarang jenis yang diperlukan. Perbincangan terperinci tentang keupayaan MPI untuk bekerja dengan topologi akan dilakukan dalam subseksyen 5.7.

Dan akhirnya, satu set nota terakhir sebelum mula melihat MPI:

  • Penerangan mengenai fungsi dan semua contoh program yang disediakan akan dibentangkan dalam bahasa algoritma C; ciri menggunakan MPI untuk bahasa algoritma Fortran akan diberikan dalam bahagian 5.8.1,
  • Penerangan ringkas tentang pelaksanaan perpustakaan MPI yang tersedia dan penerangan umum tentang persekitaran pelaksanaan program MPI akan dibincangkan dalam bahagian 5.8.2.
  • Persembahan utama keupayaan MPI akan ditumpukan pada standard versi 1.2 ( MPI-1); sifat tambahan standard versi 2.0 akan dibentangkan dalam klausa 5.8.3.

Apabila mula mengkaji MPI, boleh diperhatikan bahawa, dalam satu tangan, MPI agak kompleks - piawaian MPI menyediakan kehadiran lebih daripada 125 fungsi. Sebaliknya, struktur MPI difikirkan dengan teliti - pembangunan program selari boleh bermula selepas mempertimbangkan hanya 6 fungsi MPI. Semua ciri tambahan MPI boleh dikuasai apabila kerumitan algoritma dan program yang dibangunkan meningkat. Dalam gaya ini - daripada mudah kepada kompleks - semua bahan pendidikan tentang MPI akan dipersembahkan dengan lebih lanjut.

5.2. Pengenalan kepada pembangunan program selari menggunakan MPI

5.2.1. Asas MPI

Marilah kita membentangkan set fungsi MPI minimum yang diperlukan, mencukupi untuk pembangunan program selari yang agak mudah.

5.2.1.1 Permulaan dan penamatan program MPI

Fungsi pertama dipanggil MPI sepatutnya menjadi fungsi:

int MPI_Init (int *agrc, char ***argv);

untuk memulakan persekitaran pelaksanaan program MPI. Parameter fungsi ialah bilangan argumen pada baris arahan dan teks baris arahan itu sendiri.

Fungsi terakhir dipanggil MPI mestilah fungsi:

int MPI_Finalize(void);

Akibatnya, boleh diperhatikan bahawa struktur program selari yang dibangunkan menggunakan MPI harus mempunyai bentuk berikut:

#include "mpi.h" int main (int argc, char *argv) (<программный код без использования MPI функций>MPI_Init(&agrc, &argv);<программный код с использованием MPI функций>MPI_Finalize();<программный код без использования MPI функций>pulangan 0; )

Perlu diperhatikan:

  1. Fail mpi.h mengandungi definisi pemalar bernama, prototaip fungsi dan jenis data perpustakaan MPI,
  2. Fungsi MPI_Init Dan MPI_Finalize adalah wajib dan mesti dilaksanakan (dan hanya sekali) oleh setiap proses program selari,
  3. Sebelum panggilan MPI_Init fungsi boleh digunakan MPI_Initialized untuk menentukan sama ada panggilan telah dibuat sebelum ini MPI_Init.

Contoh-contoh fungsi yang dibincangkan di atas memberi gambaran tentang sintaks untuk menamakan fungsi dalam MPI. Nama fungsi didahului oleh awalan MPI, diikuti dengan satu atau lebih perkataan nama, perkataan pertama nama fungsi bermula dengan huruf besar, dan perkataan dipisahkan dengan garis bawah. Nama-nama fungsi MPI, sebagai peraturan, menerangkan tujuan tindakan yang dilakukan oleh fungsi tersebut.

Perlu diperhatikan:

  • Komunikator MPI_COMM_WORLD, seperti yang dinyatakan sebelum ini, dicipta secara lalai dan mewakili semua proses program selari yang sedang dilaksanakan,
  • Kedudukan yang diperoleh menggunakan fungsi MPI_Comm_rank, ialah pangkat proses yang membuat panggilan ke fungsi ini, i.e. pembolehubah ProcRank akan mengambil nilai yang berbeza dalam proses yang berbeza.