Pertukaran data menggunakan MPI. Bekerja dengan perpustakaan MPI menggunakan contoh Perpustakaan Intel® MPI. Menghantar pelbagai jenis data. Fungsi Asas MPI

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 - Fungsi penyiapan 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. Dalam ruang alamat proses penghantaran menggunakan fungsi khas papan keratan dicipta 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 melakukan pertukaran bersama 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 menghantar data daripada buf buffer yang mengandungi elemen kiraan jenis jenis daripada proses bernombor akar kepada semua proses yang termasuk dalam komunikator comm.

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 adalah daripada jenis yang sama, MPI mempunyai keupayaan untuk digunakan penampan 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 mempunyai 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 terdapat 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 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 tersebut 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.

Kebetulan saya mempunyai pertemuan rapat dengan kajian pengkomputeran selari dan khususnya MPI. Mungkin arah ini sangat menjanjikan hari ini, jadi saya ingin menunjukkan kepada pelayar hub asas-asas proses ini.

Prinsip asas dan contoh
Pengiraan eksponen (e) akan digunakan sebagai contoh. Salah satu pilihan untuk mencarinya ialah siri Taylor:
e^x=∑((x^n)/n!), di mana penjumlahan berlaku dari n=0 hingga infiniti.

Formula ini boleh diselaraskan dengan mudah, kerana nombor yang diperlukan ialah jumlah istilah individu dan terima kasih kepada ini, setiap pemproses individu boleh mula mengira istilah individu.

Bilangan istilah yang akan dikira dalam setiap pemproses individu bergantung pada panjang selang n dan pada bilangan pemproses yang tersedia k yang boleh mengambil bahagian dalam proses pengiraan. Jadi, sebagai contoh, jika panjang selang ialah n=4, dan lima pemproses (k=5) terlibat dalam pengiraan, maka pemproses pertama hingga keempat akan menerima satu penggal setiap satu, dan yang kelima tidak akan digunakan. Jika n=10 dan k=5, setiap pemproses akan mendapat dua sebutan untuk pengiraan.

Pada mulanya, pemproses pertama, menggunakan fungsi siaran MPI_Bcast, menghantar kepada yang lain nilai pembolehubah yang ditentukan pengguna n. Secara umum, fungsi MPI_Bcast mempunyai format berikut:
int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm), dengan buffer ialah alamat buffer dengan elemen, count ialah bilangan elemen, datatype ialah jenis data yang sepadan dalam MPI, root ialah pangkat pemproses utama yang mengendalikan pemajuan, dan kom ialah nama komunikator.
Dalam kes saya, peranan pemproses utama, seperti yang telah disebutkan, akan menjadi pemproses pertama dengan kedudukan 0.

Selepas nombor n berjaya dihantar, setiap pemproses akan mula mengira termanya. Untuk melakukan ini, pada setiap langkah kitaran, nombor yang sama dengan bilangan pemproses yang mengambil bahagian dalam pengiraan akan ditambah kepada nombor i, yang pada mulanya sama dengan pangkat pemproses. Jika nombor i dalam langkah berikut melebihi nombor n yang ditentukan pengguna, pelaksanaan gelung untuk pemproses itu akan berhenti.

Semasa pelaksanaan kitaran, syarat akan ditambah kepada pembolehubah yang berasingan dan, selepas selesai, jumlah yang terhasil akan dihantar ke pemproses utama. Untuk melakukan ini, fungsi operasi pengurangan MPI_Reduce akan digunakan. Secara umum ia kelihatan seperti ini:
int MPI_Reduce(void *buf, void *result, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)

Ia menggabungkan elemen penimbal input setiap proses dalam kumpulan menggunakan operasi op dan mengembalikan nilai gabungan kepada penimbal output bagi punca nombor proses. Hasil daripada operasi sedemikian akan menjadi satu nilai, itulah sebabnya fungsi pemutus mendapat namanya.

Selepas melaksanakan program pada semua pemproses, pemproses pertama akan menerima jumlah keseluruhan istilah, yang akan menjadi nilai eksponen yang kami perlukan.

Perlu diingatkan bahawa dalam kedua-dua kaedah selari dan berjujukan untuk mengira eksponen, fungsi rekursif digunakan untuk mencari faktorial. Apabila membuat keputusan tentang cara untuk menyelaraskan tugas yang dilakukan, saya mempertimbangkan pilihan untuk mencari faktorial juga pada pemproses yang berbeza, tetapi akhirnya pilihan ini dianggap tidak rasional oleh saya.

Tugas utama masih mencari nilai eksponen, dan jika pemproses mula mengira setiap faktorial bagi setiap istilah secara berasingan, ini boleh membawa kepada kesan bertentangan yang tepat, iaitu kehilangan prestasi dan kelajuan pengiraan yang ketara.
Ini dijelaskan oleh fakta bahawa dalam kes ini akan ada beban yang sangat besar pada persekitaran komunikasi, yang sudah sering menjadi pautan yang lemah dalam sistem pengkomputeran selari. Jika faktorial dikira secara peribadi pada setiap pemproses, beban pada talian komunikasi akan menjadi minimum. Kes ini boleh dipanggil contoh yang baik tentang hakikat bahawa tugas penyejajaran juga kadang-kadang mempunyai hadnya.

Algoritma Pelaksanaan Kod
1. Nilai nombor n dipindahkan dari cangkerang visual ke program, yang kemudiannya dihantar kepada semua pemproses menggunakan fungsi penyiaran.
2. Apabila pemproses utama pertama dimulakan, pemasa bermula.
3. Setiap pemproses melaksanakan gelung, di mana nilai kenaikan ialah bilangan pemproses dalam sistem. Pada setiap lelaran gelung, satu istilah dikira dan jumlah istilah tersebut disimpan dalam pembolehubah drobSum.
4. Selepas gelung selesai, setiap pemproses menambah nilai drobSumnya pada pembolehubah Hasil menggunakan fungsi pengurangan MPI_Reduce.
5. Selepas melengkapkan pengiraan pada semua pemproses, pemproses utama pertama menghentikan pemasa dan menghantar nilai yang terhasil daripada pembolehubah Hasil ke aliran keluaran.
6. Nilai masa yang diukur oleh pemasa kami dalam milisaat juga dihantar ke aliran output.
Penyenaraian kod
Program ini ditulis dalam C++, kami akan menganggap bahawa argumen untuk pelaksanaan diluluskan dari shell luaran. Kod kelihatan seperti ini:
#termasuk "mpi.h"
#termasuk
#termasuk
menggunakan ruang nama std;

Fakta berganda(int n)
{
jika (n==0)
pulangan 1;
lain
pulangkan n*Fakta(n-1);
}

int utama(int argc, char *argv)
{
SetConsoleOutputCP(1251);
int n;
int myid;
int numprocs;
int i;
int rc;
long double drob,drobSum=0,Result, sum;
masa mula berganda = 0.0;
double endwtime;

N = atoi(argv);

jika (rc= MPI_Init(&argc, &argv))
{
cout<< "Ralat permulaan, pelaksanaan dihentikan" << endl;
MPI_Abort(MPI_COMM_WORLD, rc);
}

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);

jika (myid == 0)
{

Startwtime = MPI_Wtime();
}
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

untuk (i = myid; i<= n; i += numprocs)
{
drob = 1/Fakta(i);
drobSum += drob;
}

MPI_Reduce(&drobSum, &Result, 1, MPI_LONG_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
cout.precision(20);
jika (myid == 0)
{
cout<< Result << endl;
endwtime = MPI_Wtime();
cout<< (endwtime-startwtime)*1000 << endl;
}

MPI_Finalize();
pulangan 0;
}


* Kod sumber ini telah diserlahkan dengan Penyerlah Kod Sumber.
Kesimpulan
Oleh itu, kami menerima program mudah untuk mengira eksponen menggunakan beberapa pemproses sekaligus. Mungkin, kesesakan itu menyimpan hasil itu sendiri, kerana dengan peningkatan bilangan digit, menyimpan nilai menggunakan jenis standard tidak akan menjadi remeh dan tempat ini memerlukan perincian. Mungkin, penyelesaian yang agak rasional adalah dengan menulis hasilnya ke fail, walaupun, memandangkan fungsi pendidikan semata-mata contoh ini, tidak perlu menumpukan banyak perhatian pada perkara ini.

Nota ini menunjukkan cara memasang MPI, sambungkannya ke Visual Studio, dan kemudian gunakannya dengan parameter yang ditentukan (bilangan nod pengiraan). 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 medan perpustakaan, jika terdapat versi 32-bit, anda perlu memasukkan i386 dan bukannya amd64.

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:

Menjalankan aplikasi MPI pada kelompok pengkomputeran hanya boleh dilakukan melalui sistem pemprosesan kerja kelompok. Untuk memudahkan pelancaran dan giliran program selari, skrip mpirun khas disediakan. Contohnya, mpirun -np 20 ./first.exe akan menjalankan program selari first.exe pada 20 pemproses, i.e. pada 5 nod. (Setiap nod mempunyai 2 pemproses dwi-teras). Perlu diingat bahawa untuk melancarkan modul boleh laku yang terletak dalam direktori semasa ($pwd), anda mesti menyatakan secara eksplisit laluan "./". Sebilangan pelaksanaan MPI-1 menyediakan arahan pelancaran untuk program MPI, yang mempunyai bentuk mpirun<аргументы mpirun><программа><аргументы программы>

Mengasingkan arahan pelancaran program daripada program itu sendiri memberikan fleksibiliti, terutamanya untuk pelaksanaan rangkaian dan heterogen. Mempunyai mekanisme pelancaran standard juga memanjangkan kemudahalihan program MPI selangkah lebih jauh kepada baris arahan dan skrip yang memanipulasinya. Contohnya, skrip untuk set program pengesahan yang menjalankan ratusan program mungkin merupakan skrip mudah alih jika ia ditulis menggunakan mekanisme pelancaran standard sedemikian. Untuk tidak mengelirukan perintah ``standard'' dengan yang sedia ada dalam amalan, yang tidak standard dan tidak mudah alih dalam kalangan pelaksanaan, MPI mentakrifkan mpiexec dan bukannya mpirun.

Walaupun mekanisme pelancaran piawai meningkatkan kebolehgunaan MPI, julat persekitaran adalah sangat pelbagai (contohnya, mungkin tiada antara muka baris arahan) sehingga MPI tidak boleh mewajibkan mekanisme sedemikian. Sebaliknya, MPI mentakrifkan arahan run mpiexec dan mengesyorkan, tetapi tidak memerlukan, sebagai nasihat kepada pembangun. Walau bagaimanapun, jika pelaksanaan menyediakan arahan yang dipanggil mpiexec, ia mesti mengambil bentuk yang diterangkan di bawah: mpiexec -n <программа>

akan ada sekurang-kurangnya satu cara untuk dijalankan<программу>dengan MPI_COMM_WORLD awal yang kumpulannya mengandungi proses. Argumen lain untuk mpiexec mungkin bergantung pada pelaksanaan.

Contoh 4.1 Menjalankan 16 contoh myprog pada mesin semasa atau lalai:

mpiexec -n 16 myprog

3. Tulis program untuk pengiraan selari kamiran pasti bagi fungsi 2*(x+2*x*x/1200.0) dalam selang .

Kaedah segi empat tepat kiri

f ganda (ganda x)

(kembali 2*(x+2*x*x/1200);) // kamiran iskomyi

int utama(int argc,char **argv)

Status MPI_Status;

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&rank);

MPI_Comm_size(MPI_COMM_WORLD,&size);

int n=1000,i,d; // 1000 - uzly

terapung a=0, b=1, h=(b-a)/n,s=0,r=0; //a i b -nachalo i konec otrezka

jika (pangkat!=saiz-1) // schitaut vse processy, krome poslednego

( untuk (i=pangkat*d; i<(rank+1)*d; i++) { s=s+h*f(a+i*h); }

MPI_Send(&s,1,MPI_FLOAT,saiz-1,1,MPI_COMM_WORLD);)

( untuk (i=0; i

( MPI_Recv(&s,1,MPI_FLOAT,i,1,MPI_COMM_WORLD, &status); r+=s; ) )

MPI_Finalize();)

Surak

1. Seni bina memori yang dikongsi & diedarkan.

Memori kongsi yang diedarkan (DSM - Memori Dikongsi Teragih)

Secara tradisinya, pengkomputeran teragih adalah berdasarkan model penghantaran mesej, di mana data dihantar dari pemproses ke pemproses dalam bentuk mesej. Panggilan prosedur jauh sebenarnya adalah model yang sama (atau sangat dekat). DSM ialah ruang alamat maya yang dikongsi oleh semua nod (pemproses) sistem teragih. Program mengakses data dalam DSM dengan cara yang sama seperti mereka mengakses data dalam memori maya komputer tradisional. Dalam sistem dengan DSM, data bergerak antara ingatan tempatan komputer yang berbeza dengan cara yang sama seperti ia bergerak antara RAM dan memori luaran satu komputer. Konfigurasi memori kongsi yang diedarkan ialah varian memori yang diedarkan. Di sini, semua nod, yang terdiri daripada satu atau lebih pemproses yang disambungkan melalui skema SMP, menggunakan ruang alamat biasa. Perbezaan antara konfigurasi ini dan mesin dengan memori teragih ialah di sini mana-mana pemproses boleh mengakses mana-mana bahagian memori. Walau bagaimanapun, masa capaian untuk bahagian memori yang berbeza berbeza untuk setiap pemproses bergantung pada tempat bahagian tersebut terletak secara fizikal dalam kelompok. Atas sebab ini, konfigurasi sedemikian juga dipanggil mesin dengan akses memori tidak seragam (NUMA).

Perbezaan antara MPI dan PVM.

Sistem PVM (Mesin Maya Selari) dicipta untuk menggabungkan beberapa stesen kerja rangkaian ke dalam mesin pengkomputeran selari maya tunggal. Sistem ini adalah tambahan kepada sistem pengendalian UNIX dan digunakan pada pelbagai platform perkakasan, termasuk sistem selari secara besar-besaran. Sistem pengaturcaraan selari yang paling biasa hari ini adalah berdasarkan MPI (Antaramuka Penghuraian Mesej). Idea MPI pada mulanya mudah dan jelas. Ia melibatkan mewakili program selari sebagai satu set proses pelaksanaan selari yang berinteraksi antara satu sama lain semasa pelaksanaan pemindahan data menggunakan prosedur komunikasi. Mereka membentuk perpustakaan MPI. Walau bagaimanapun, pelaksanaan MPI yang betul untuk menyokong komunikasi antara pemproses telah terbukti agak sukar. Kerumitan ini dikaitkan dengan keperluan untuk mencapai prestasi program yang tinggi, keperluan untuk menggunakan banyak sumber berbilang komputer, dan, sebagai akibatnya, pelbagai besar dalam pelaksanaan prosedur komunikasi bergantung pada mod pemprosesan data.